如何使用Sentry为包含特殊字符的用户组授权

1文档编写目的

Apache Sentry是由Cloudera贡献给Hadoop开源社区的组件,它提供了细粒度级、基于角色的授权以及多租户的管理模式。Sentry当前可以和Hive/Hcatalog、Apache Solr 、Apache Kafka以及Cloudera Impala等集成。

通过引进Sentry,Hadoop目前可在以下方面满足企业和政府用户的RBAC(Role-Based Access Control)需求:

安全授权:Sentry可以控制数据访问,并对已通过验证的用户提供数据访问特权。

细粒度访问控制:Sentry支持细粒度的Hadoop数据和元数据访问控制。Sentry在服务器、数据库、表和视图范围提供了不同特权级别的访问控制,包括查找、插入等——允许Admin用户通过视图的方式限制普通用户对行或列的访问,或者对数据进行脱敏处理。

基于角色的管理:Sentry通过基于角色的授权的方式,让你可以轻易将访问同一数据集的不同权限级别授予多个用户组。例如,对于某特定数据集,你可以分配给反欺诈小组查看所有列的特权,给分析师查看非敏感或非PII(personally identifiable information)列的权限,给数据接收流插入新数据到HDFS的权限。

多租户管理:Sentry允许给不同管理员的不同数据集设置权限。在Hive/Impala的情况下,Sentry可以在数据库/schema级别进行权限管理。

统一平台:Sentry为确保数据安全,提供了一个统一平台,使用现有的Hadoop Kerberos实现安全认证。同时,通过Hive或Impala访问数据时可以使用同样的Sentry协议。未来,Sentry协议会被扩展到其它组件。

Sentry架构图

Sentry授权包括以下几种角色:

资源:可以是Server、Database、Table或者URL(例如:HDFS或者本地路径)。Sentry1.5中支持对表的列(Column)进行授权。

权限:授权访问某一个资源的规则,比如SELECT,INSERT,ALL。

角色:角色是一系列权限的集合,可以简单的理解为权限的实例化。

用户和组:一个组是一系列用户的集合。Sentry的授权是针对用户组的,组映射是可以扩展的。默认情况下,Sentry使用Hadoop的组映射(可以是操作系统组或者LDAP中的组)。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.总结

2配置Hive与Sentry集成

1、Sentry服务勾选“Sentry”,点击保存更改

保存更改后,会出现如下告警信息,红色告警是因为HiveServer2默认启用了模拟功能,启用Sentry后需要关闭改功能,黄色告警是因为集群未启用Kerberos,用户可能可以绕过Sentry授权直接访问数据。

2、关闭HiveServer2模拟功能

3、启用Sentry测试模式

4、配置更改完成后,重启集群。

3使用Sentry授权

3.1创建测试用户

1、运行脚本创建包含特殊字符的测试用户

2、验证所有节点是否已成功创建包含特殊字符的测试用户

3.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;”语句,查看测试数据

4为测试用户授权

4.1问题复现

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”用户组更“特殊”,带了特殊字符“-”,所以会出现异常。

4.2解决办法

1、修改用户组名

使用groupmod工具更改用户组名,执行如下命令:groupmod -n ,将“luo-kang”用户组改为不含特殊字符的用户组名

2、将“luo-kang”用户组放在反引号(`)中

执行“GRANT ROLE test_select TO GROUP `luo-kang`;”语句,将“test_select”角色授予“luo-kang”用户组,可以发现,授权语句成功执行。

4.3权限验证

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');”语句,向测试表写入测试数据,发现无法向测试表插入数据,与预期结果相符。

5总结

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

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180703G18SL800?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券