0
点赞
收藏
分享

微信扫一扫

如何在Kerberos的CDH使用Sentry实现Spark SQL的权限控制

small_Sun 2022-09-21 阅读 156

温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。


Fayson的github:

​​https://github.com/fayson/cdhproject​​


提示:代码块部分可以左右滑动查看噢


1.文档编写目的



在前面的文章Fayson介绍了《​​如何在Kerberos环境下的CDH集群部署Spark1.6 Thrift及spark-sql客户端​​》。本文主要介绍当集群启用Kerberos和Sentry后,如何实现Spark SQL的权限管理。因为社区版Spark SQL并未做任何权限控制。


  • 内容概述

1.测试环境说明

2.Hive表授权测试

3.权限分析及解决

4.修改后权限测试

5.总结


  • 测试环境

1.CM和CDH版本为5.12.1

2.使用root用户操作


  • 前置条件

1.集群已启用Kerberos

2.集群已启用Sentry


2.环境说明



在前面的文章Fayson介绍了如何部署Spark1.6的ThriftServer服务,在部署节点上启动Spark ThriftServer服务。


1.启动Spark ThriftServer服务

./start-thriftserver.sh --hiveconf hive.server2.authentication.kerberos.principal=hive/cdh04.fayson.com@FAYSON.COM \
--hiveconf hive.server2.authentication.kerberos.keytab=hive.keytab \
--principal hive/cdh04.fayson.com@FAYSON.COM --keytab hive.keytab \
--hiveconf hive.server2.thrift.port=10001 \
--hiveconf hive.server2.thrift.bind.host=0.0.0.0

(可左右滑动)


如何在Kerberos的CDH使用Sentry实现Spark SQL的权限控制_sql


2.通过Hue为fayson用户组授权default.t1表的所有权限以及default.test.name列的查询权限


如何在Kerberos的CDH使用Sentry实现Spark SQL的权限控制_hive_02


使用fayson用户登录Hue查看授权成功


如何在Kerberos的CDH使用Sentry实现Spark SQL的权限控制_sql_03


3.Hive表授权测试



1.使用Beeline连接Spark ThriftServer


[root@cdh01 ~]# kinit fayson 
[root@cdh01 ~]# klist
[root@cdh01 ~]# beeline
beeline> !connect jdbc:hive2://cdh04.fayson.com:10001/;principal=hive/cdh04.fayson.com@FAYSON.COM
0: jdbc:hive2://cdh04.fayson.com:10001/> select current_user();

(可左右滑动)


如何在Kerberos的CDH使用Sentry实现Spark SQL的权限控制_spark_04


执行SQL操作


0: jdbc:hive2://cdh04.fayson.com:10001/> select * from t1;
0: jdbc:hive2://cdh04.fayson.com:10001/> select count(*) from t1;
0: jdbc:hive2://cdh04.fayson.com:10001/> select * from test;
0: jdbc:hive2://cdh04.fayson.com:10001/> select count(*) from test;

(可左右滑动)


如何在Kerberos的CDH使用Sentry实现Spark SQL的权限控制_sql_05


上述测试可以得出在使用fayson@FAYSON.COM账号kinit后,通过Beeline访问Spark ThriftServer,查看当前的登录用于依然为hive并不是我们指定的fayson用户,进行SQL操作的时候可以查询除授权表default.t1和default.test.name,这里依然可以查询test表的所有列。


2.使用spark-sql客户端测试


[root@cdh03 ~]# kinit fayson
Password for fayson@FAYSON.COM:
[root@cdh03 ~]# /opt/cloudera/parcels/CDH/lib/spark/bin/spark-sql
spark-sql> select current_user();

(可左右滑动)


如何在Kerberos的CDH使用Sentry实现Spark SQL的权限控制_hive_06


执行SQL操作


spark-sql> select * from test;
spark-sql> select name from test;
spark-sql> select * t1;
spark-sql> select count(*) from;
spark-sql> select * from p1_text;

(可左右滑动)


如何在Kerberos的CDH使用Sentry实现Spark SQL的权限控制_hive_07

如何在Kerberos的CDH使用Sentry实现Spark SQL的权限控制_sql_08

如何在Kerberos的CDH使用Sentry实现Spark SQL的权限控制_hive_09


上述测试可以得出,在kinit了fayson@FAYSON.COM账号后,通过spark-sql客户端访问Spark ThriftServer服务,获取到的当前用户为fayson而不是hive用户,由于我们Sentry只为fayson授予default.test.name和t1表的所有权限,而其他表则没有权限,对于只授权列权限的表,通过Spark-sql客户查询也会有权限问题。


4.权限分析及解决



由于CDH集群启用了Kerberos和Sentry,Fayson在前面的文章《​​如何在CDH启用Kerberos的情况下安装及使用Sentry(一)​​​》和《​​如何在CDH启用Kerberos的情况下安装及使用Sentry(二)​​》介绍了,在Kerberos环境下的CDH启用Sentry时会禁用Hive的用户模拟功能,同时启用HDFS的ACL。在上一章节的测试中可以看到使用Beeline连接Spark ThriftServer时并未模拟本地指定的fayson用户访问Hive数据库。而spark-sql与HiveCLI访问Hive模式一样,都是跳过HiveServer2服务直接访问的HiveMetastore,所以通过spark-sql可以正确获取到kinit的用户。


1.在 Spark ThriftServer的启动命令中增加Hive的参数


./start-thriftserver.sh --hiveconf hive.server2.authentication.kerberos.principal=hive/cdh04.fayson.com@FAYSON.COM \
--hiveconf hive.server2.authentication.kerberos.keytab=hive.keytab \
--principal hive/cdh04.fayson.com@FAYSON.COM --keytab hive.keytab \
--hiveconf hive.server2.thrift.port=10001 \
--hiveconf hive.server2.thrift.bind.host=0.0.0.0 \
--hiveconf hive.server2.enable.doAs=true

(可左右滑动)


在启动参数中增加hive.server2.enable.doAs参数并设置为true,参数说明:

该参数true则表示以登录ThriftServer的用户身份执行查询,如果为fasle在表示以启动ThriftServer的用户身份执行查询。

增加启动参数后重启SparkThriftServer服务


如何在Kerberos的CDH使用Sentry实现Spark SQL的权限控制_sql_10


5.修改后权限测试



1.使用Beeline连接Spark ThriftServer


[root@cdh01 ~]# kinit fayson 
[root@cdh01 ~]# klist
[root@cdh01 ~]# beeline
beeline> !connect jdbc:hive2://cdh04.fayson.com:10001/;principal=hive/cdh04.fayson.com@FAYSON.COM
0: jdbc:hive2://cdh04.fayson.com:10001/> select current_user();

(可左右滑动)


如何在Kerberos的CDH使用Sentry实现Spark SQL的权限控制_hive_11


执行SQL操作

查询授权的t1表


如何在Kerberos的CDH使用Sentry实现Spark SQL的权限控制_hive_12


查询只授权test.name列的表


如何在Kerberos的CDH使用Sentry实现Spark SQL的权限控制_hive_13

如何在Kerberos的CDH使用Sentry实现Spark SQL的权限控制_sql_14


查看授权以外的表p1_text


如何在Kerberos的CDH使用Sentry实现Spark SQL的权限控制_spark_15


通过上述测试可以看到增加hive.server2.enable.doAs后,在kinit了fayson@FAYSON.COM账号后,使用Beeline连接Spark ThriftServer可以正常的获取当前初始的fayson用户,用户可以访问拥有权限的t1表,但是无法访问拥有test.name列权限的test表以及授权外的p1_text表。


6.总结



1.集群启用了Kerberos和Sentry后,在启动Spark ThriftServer服务时需要增加hive.server2.enable.doAs=true参数,才可以获取到当前kinit的用户,否则获取到的是ThriftServer的启动用户(即启动参数中的--principal的值)。


2.由于Spark无法与Sentry集成,所以Spark ThriftServer并不能完全做到Hive表的权限控制,只能使用Sentry授权后通过HDFS ACL权限同步确保授权用户组有访问数据的权限,无法实现列的授权。


3.spark-sql客户端访问Hive的模式与HiveCLI的方式一样,跳过HiveServer2直接访问的HiveMetastore,因此在使用spark-sql测试时获取到的登录用户即为当前kinit用户,即不受Hive模拟用户参数的影响。因为Spark SQL CLI可以直接获取到正确的kinit用户,所以Spark SQL命令行的表权限一样可以通过HDFS的文件权限来控制。Fayson在上面省略的测试部分。



提示:代码块部分可以左右滑动查看噢


为天地立心,为生民立命,为往圣继绝学,为万世开太平。

温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。



推荐关注Hadoop实操,第一时间,分享更多Hadoop干货,欢迎转发和分享。

如何在Kerberos的CDH使用Sentry实现Spark SQL的权限控制_sql_16

原创文章,欢迎转载,转载请注明:转载自微信公众号Hadoop实操


举报

相关推荐

0 条评论