Apache Sentry是由Cloudera贡献给Hadoop开源社区的组件,它提供了细粒度级、基于角色的授权以及多租户的管理模式。Sentry当前可以和Hive/Hcatalog、Apache Solr 、Apache Kafka以及Cloudera Impala等集成。
通过引进Sentry,Hadoop目前可在以下方面满足企业和政府用户的RBAC(Role-Based Access Control)需求:
Sentry架构图
Sentry授权包括以下几种角色:
本文将主要介绍如何使用Sentry为包含特殊字符的用户组授权。
测试环境:
操作系统为Redhat 7.2
CM、CDH版本为5.11.2
文章目录结构:
1. 文档编写目的
2. 配置Hive与Sentry集成
3. 使用Sentry授权
3.1 创建测试用户
3.2 创建超级用户
4. 为测试用户授权
4.1 问题复现
4.2 解决办法
4.3 权限验证
5. 总结
1、Sentry服务勾选“Sentry”,点击保存更改
保存更改后,会出现如下告警信息,红色告警是因为HiveServer2默认启用了模拟功能,启用Sentry后需要关闭改功能,黄色告警是因为集群未启用Kerberos,用户可能可以绕过Sentry授权直接访问数据。
2、关闭HiveServer2模拟功能
3、启用Sentry测试模式
4、配置更改完成后,重启集群。
1、运行脚本创建包含特殊字符的测试用户
2、验证所有节点是否已成功创建包含特殊字符的测试用户
1、使用beeline连接HiveServer2并用hive用户登录
2、执行“show databases”命令,只有default库,这里就用default数据库作为案例。
3、执行“create role admin;”语句,创建admin角色
4、执行“grant all on server server1 to role admin;”语句,为admin角色赋予超级权限
5、执行“grant role admin to group hive;”语句,将admin角色授予hive用户组
6、执行“create table test1 (s1 string,s2 string) row format delimited fields terminated by ',';”语句,创建测试表
7、执行“insert into test1 values('a','b'),('1','2');”语句,向测试表写入测试数据
8、执行“select * from test1;”语句,查看测试数据
1、执行“create role test_select;”语句,创建“test_select”角色
2、执行“GRANT SELECT ON DATABASE default TO ROLE test_select;”语句,将default数据库的SELECT权限授予“test_select”角色
3、执行“GRANT ROLE test_select TO GROUP luo-kang;”语句,将“test_select”角色授予“luo-kang”用户组,出现如下异常。
4、经过分析,出现上述异常是正常的,因为“luo-kang”用户组比“hive”用户组更“特殊”,带了特殊字符“-”,所以会出现异常。
1、修改用户组名
使用groupmod工具更改用户组名,执行如下命令:groupmod -n <newGroupName> <oldGroupName>,将“luo-kang”用户组改为不含特殊字符的用户组名
2、将“luo-kang”用户组放在反引号(`)中
执行“GRANT ROLE test_select TO GROUP `luo-kang`;”语句,将“test_select”角色授予“luo-kang”用户组,可以发现,授权语句成功执行。
1、使用hive用户执行“show role grant group `luo-kang`;”语句,可以看到“test_select”已经授予给了“luo-kang”用户组
2、退出hive用户,使用beeline连接HiveServer2并用“luo-kang”用户登录
3、执行“select * from test1;”语句,查看测试表的内容
4、执行“insert into test1 values('a','b'),('1','2');”语句,向测试表写入测试数据,发现无法向测试表插入数据,与预期结果相符。
1、Sentry对用户组授权,要求用户组名由字母数字或者下划线“_”组成。如果用户组名必须要包含非下划线的非字母数字字符,则必须将用户组名放在反引号(`)中以执行该命令。除此之外,建议用户组名的字母全部为小写,虽然Sentry不区分用户组名的大小写,但是Sentry进行授权时,会将大写字母全部改为小写,例如,Sentry会将TestGroup更改为testgroup。目前无法禁用此规范化,所以建议用户组包含的字母全部由小写字母组成。
2、启用Sentry后,必须给用户组授权相应权限才能执行对应操作,比如我只给“luo-kang”用户组授予了default库的SELECT权限,那么“luo-kang”用户可以查看default库内所有表的内容,但是不能向表写入数据,除非授予INSERT或者ALL权限。
参考文章:
https://www.cloudera.com/documentation/enterprise/latest/topics/sg_hive_sql.html
http://blog.javachen.com/2015/04/29/apache-sentry-architecture.html