Zeppelin连接Spark实现SQLStdBasedAuthorization权限验证

1、zeppelin简介
zeppelin是基于Web的可视化交互应用,以notebook为抽象提供服务,支持jdbc、spark、python、md、shell等解析器,其可视化功能非常强大,且提供定时任务和文档共享,非常方便数据分析使用。因为zeppelin先天对spark有很好的支持,故生产上采用它来作为使用spark计算引擎的接口,可是zeppelin的权限功能尚不完善,尤其与spark sql对接使用时不能提供完善的权限验证功能,故需要一些改造。

2、业务背景
当前spark的ThriftServer默认是cli模式(参考Hive的三种权限认证模型),设计上仅支持Storage based Authorization标准的权限验证,不能像hive的HiveServer2一样提供很好的鉴权服务;通过调研,为了让zeppelin通过jdbc连接spark实现SQL based Authorization标准权限验证,本文采用对zeppelin、spark和hive三端进行源代码改造的方式实现更完善的权限验证功能。

3、实现的功能
最终我们实现zeppelin多租户使用,不同用户提交的query对应到不同的yarn的队列上,同时对用户提交的query实现表级鉴权,增强访问安全性。后期还打算对zeppelin使用编码模式提交的SQL进行鉴权,达到全面开放zeppelin的spark应用。

整个验证流程如下图: 


1、client提交查询query给zeppelin 
2、zeppelin端将语句发送给hive的认证服务进行鉴定 
3、得到权限鉴定返回码 
4、鉴定失败则返回错误结果,鉴定成功则把语句提交给spark thriftserver执行 
5、返回结果

1)Spark端改造
spark ThriftServer模块添加自定义的验证类,实现jdbc用户名密码的登入验证。 
对spark的conf目录下hive-site.xml配置hive.server2.authentication为CUSTOM,自定义实现jdbc账号密码登入验证功能。
同时把hive.security.authorization.enabled设置为false,关闭Hive Client访问验证。
因为上述登入验证需要连接mysql,则复制mysql-connector-java-5.1.31.jar到spark项目jars中。
2)Hive端改造
在hive端,把表权限验证的功能以RESTFul接口风格暴露出来给其他服务调用,所有query查询都需要先经过这个服务进行权限验证。这里仅提供思路,具体实现因人而异。

为了实现用户create表后有对表的select权限(spark这边默认没有),需要配置参数如:

<name>hive.security.authorization.createtable.user.grants</name>
<value>datapm,dw:select,update,delete,insert</value>
1
2
同时在hiveserver端对获取的参数进行过滤处理(改代码),达到只有执行sql的用户才拥有对表的所有权限。

3)Zeppelin端改造
为了实现权限验证,zeppelin通过jdbc访问spark的ThriftServer,故需要在执行query语句之前,对用户角色和语句进行权限验证,用http连接Hive提供的RESTful接口auth服务,提供用户role和cmd来进行权限验证,验证通过后才把query语句提交给spark的ThriftServer进行处理。

zeppelin-jdbc连接依jar赖包
hive-jdbc-0.14.0.jar、hive-service-0.14.0.jar、mysql-connector-java-5.1.31.jar、hadoop-common-2.6.0.jar、hive-common-0.14.0.jar、libthrift-0.9.0.jar

对于这个设计方案,本人尝试过在Spark ThriftServer端进行表验证,但是没有成功实现,故转而采取在hive端暴露表验证接口,这样做会有时间开销,但能解决当前需求,也是一种选择,后期继续

原文:https://blog.csdn.net/xwc35047/article/details/54385083 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值