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

2018-07-11 16:29:40 浏览数 (1)

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

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服务

代码语言:javascript复制
./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

(可左右滑动)

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

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

3.Hive表授权测试


1.使用Beeline连接Spark ThriftServer

代码语言:javascript复制
[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();

(可左右滑动)

执行SQL操作

代码语言:javascript复制
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;

(可左右滑动)

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

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

代码语言:javascript复制
[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();

(可左右滑动)

执行SQL操作

代码语言:javascript复制
spark-sql> select * from test;
spark-sql> select name from test;
spark-sql> select * t1;
spark-sql> select count(*) from t1;
spark-sql> select * from p1_text;

(可左右滑动)

上述测试可以得出,在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的参数

代码语言:javascript复制
./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服务

5.修改后权限测试


1.使用Beeline连接Spark ThriftServer

代码语言:javascript复制
[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();

(可左右滑动)

执行SQL操作

查询授权的t1表

查询只授权test.name列的表

查看授权以外的表p1_text

通过上述测试可以看到增加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干货,欢迎转发和分享。

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

0 人点赞