前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何在Kerberos的CDH使用Sentry实现Spark SQL的权限控制

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

作者头像
Fayson
发布2018-07-11 16:29:40
3.1K0
发布2018-07-11 16:29:40
举报
文章被收录于专栏:Hadoop实操Hadoop实操

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

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实操

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-05-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Hadoop实操 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
专用宿主机
专用宿主机(CVM Dedicated Host,CDH)提供用户独享的物理服务器资源,满足您资源独享、资源物理隔离、安全、合规需求。专用宿主机搭载了腾讯云虚拟化系统,购买之后,您可在其上灵活创建、管理多个自定义规格的云服务器实例,自主规划物理资源的使用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档