CDH版本的Hadoop在对数据安全上的处理通常采用Kerberos+Sentry的结构。其中,Kerberos主要负责平台用户的权限管理,Sentry则负责数据的权限管理。同时,可以集成LDAP,用于管理账号。这里着重探讨Sentry的原理,使用及存在的问题。
一.Sentry概述
1.Sentry 介绍
Apache Sentry是Cloudera公司发布的一个Hadoop开源组件,它提供了细粒度级、基于角色的授权以及多租户的管理模式。Sentry当前可以与ApacheHive,HiveMetastore / HCatalog,Apache Solr,Impala和HDFS(仅限于Hive表数据)一起使用。
Sentry旨在成为Hadoop组件的可插拔授权引擎。它允许自定义授权规则以验证用户或应用程序对Hadoop资源的访问请求。Sentry是高度模块化的,可以支持Hadoop中各种数据模型的授权。
2.Sentry 特性
安全授权
:Sentry可以控制数据访问,并对已通过验证的用户提供数据访问特权。细粒度访问控制
:Sentry支持细粒度的Hadoop数据和元数据访问控制。在Hive和Impala中Sentry的最初发行版本中,Sentry在服务器、数据库、表和视图范围提供了不同特权级别的访问控制,包括查找、插入等,允许管理员使用视图限制对行或列的访问。管理员也可以通过Sentry和带选择语句的视图或UDF,根据需要在文件内屏蔽数据。基于角色的管理
:Sentry通过基于角色的授权简化了管理,你可以轻易将访问同一数据集的不同特权级别授予多个组。多租户管理
:Sentry允许为委派给不同管理员的不同数据集设置权限。在Hive/Impala的情况下,Sentry可以在数据库/schema级别进行权限管理。-
统一平台
:Sentry为确保数据安全,提供了一个统一平台,使用现有的Hadoop Kerberos实现安全认证。同时,通过Hive或Impala访问数据时可以使用同样的Sentry协议。未来,Sentry协议会被扩展到其它组件。Sentry工作原理
3.Sentry工作原理
Apache Sentry的目标是实现授权管理,它是一个策略引擎,被数据处理工具用来验证访问权限。它也是一个高度扩展的模块,可以支持任何的数据模型。当前,它支持Apache Hive和Cloudera Impala的关系数据模型,以及Apache中的有继承关系的数据模型。
Sentry提供了定义和持久化访问资源的策略的方法。目前,这些策略可以存储在文件里或者是能使用RPC服务访问的数据库后端存储里。数据访问工具,例如Hive,以一定的模式辨认用户访问数据的请求,例如从一个表读一行数据或者删除一个表。这个工具请求Sentry验证访问是否合理。Sentry构建请求用户被允许的权限的映射并判断给定的请求是否允许访问。请求工具这时候根据Sentry的判断结果来允许或者禁止用户的访问请求。
Sentry授权包括以下几种角色:
资源
。可能是Server、Database、Table、或者URL(例如:HDFS或者本地路径)。Sentry1.5中支持对列进行授权。权限
。授权访问某一个资源的规则。角色
。角色是一系列权限的集合。用户和组
。一个组是一系列用户的集合。Sentry 的组映射是可以扩展的。默认情况下,sentry使用Hadoop的组映射(可以是操作系统组或者LDAP中的组`)。Sentry允许你将用户和组进行关联,你可以将一系列的用户放入到一个组中。Sentry不能直接给一个用户或组授权,需要将权限授权给角色,角色可以授权给一个组而不是一个用户。
Sentry架构如下:
Sentry的体系结构中有三个重要的组件:一是Binding;二是Policy Engine;三是Policy Provider。
Binding
Binding实现了对不同的查询引擎授权,Sentry将自己的Hook函数插入到各SQL引擎的编译、执行的不同阶段。这些Hook函数起两大作用:
一是起过滤器的作用,只放行具有相应数据对象访问权限的SQL查询;
-
二是起授权接管的作用,使用了Sentry之后,grant/revoke管理的权限完全被Sentry接管,grant/revoke的执行也完全在Sentry中实现;
对于所有引擎的授权信息也存储在由Sentry设定的统一的数据库中。这样所有引擎的权限就实现了集中管理。
Policy Engine
这是Sentry授权的核心组件。Policy Engine判定从binding层获取的输入的权限要求与服务提供层已保存的权限描述是否匹配。
Policy Provider
Policy Provider负责从文件或者数据库中读取出原先设定的访问权限。Policy Engine以及Policy Provider其实对于任何授权体系来说都是必须的,因此是公共模块,后续还可服务于别的查询引擎。
二.Sentry安装使用
在CDH未启用认证(Kerberos/LDAP)的情况下,安装、配置及使用Sentry. 在实际生产环境中,如果启用授权(Sentry),必须先启用认证。但在CDH平台给出了一种测试模式,即不启用认证而只启用Sentry授权。但强烈不建议在生产系统中这样使用,因为如果没有用户认证,授权没有任何意义形同虚设,用户可以随意使用任何超级用户登录HiveServer2或者Impala,并不会做密码校验。
1.测试环境
操作系统为CentOS7.2
CDH版本5.7.4
采用root用户操作
集群未启用认证服务(如Kerberos或LDAP)
Sentry版本1.5.0
2.安装说明
1.在MySQL中创建sentry数据库
建表语句:
create database sentry default character set utf8;
CREATE USER 'sentry'@'%' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON sentry. * TO 'sentry'@'%';
FLUSH PRIVILEGES;
2.进入Cloudera Manager控制台点击“添加服务”
3.进入服务添加界面,选择Sentry服务,点击“继续”
4.选择Sentry Server及Gateway的安装节点,点击“继续“,注意需提前在MySQL中建立好相关用户和数据库
6.输入Sentry服务的数据库信息,点击测试,测试通过,点击“继续”
7.等待服务安装成功,点击“继续”
8.点击“完成”,Sentry服务到此安装完成。
3.配置说明
3.1 Hive配置
1.配置Hive使用Sentry服务
2.关闭Hive的用户模拟功能
3.集群未启用安全认证环境下,需要配置以下参数
3.2 HUE配置
配置Hue与Sentry集成
3.3 HDFS配置
配置HDFS开启ACLs与Sentry权限同步
完成以上配置后,回到Cloudera Manager主页,重启Hive,Hdfs,Hue等相关服务。
4.使用说明
1)使用超级用户登录Hue,创建hive用户,并赋予超级用户权限。
2)使用beeline登录hive用户,创建一个test表,并插入测试数据。
create table test (s1 string, s2 string) row format delimited fields terminated by ',';
insert into test values('a','b'),('1','2')
3)创建测试角色并授权给用户组
在Hive集群所在的各个节点创建角色:
[root@hadoop1]# useradd reader_cmd
[root@hadoop1~]# passwd reader_cmd
[root@hadoop1]# useradd writer_cmd
[root@hadoop1]# passwd writer_cmd
4)用Sentry管理员用户hive通过beeline客户端连接HiveServer2
[root@hadoop1 /opt/cloudera/parcels/CDH-5.7.4-1.cdh5.7.4.p0.2/lib/hive/bin]# ./beeline
beeline> !connect jdbc:hive2://hadoop1:10000
scan complete in 2ms
Connecting to jdbc:hive2://hadoop1:10000
Enter username for jdbc:hive2://hadoop1:10000: hive
Enter password for jdbc:hive2://hadoop1:10000:
Connected to: Apache Hive (version 1.1.0-cdh5.7.4)
Driver: Hive JDBC (version 1.1.0-cdh5.7.4)
Transaction isolation: TRANSACTION_REPEATABLE_READ
0: jdbc:hive2://hadoop1:10000> show roles;
5)使用hive用户创建创建read和write角色,并授权read角色对test表select权限,write角色对test表insert权限
create role read;
grant select on table test to role read;
create role write;
grant insert on table test to role write;
6)为reader用户组授权read角色,为writer用户组授权write角色
grant role read to group reader;
grant role write to group writer;
7)beeline验证
使用reader用户登录beeline验证,只可查询test表数据,但不可插入数据,或更改表结构等。
使用writer用户登录beeline验证,只可插入数据到test表中,但不可查询表数据。
同时也可对hdfs文件进行读写测试,这里仅针对test表数据文件权限有效。
上述测试过程中,writer写入数据过程中报无查询权限异常,尚未确定问题所在。
三.总结
1.建议线上环境,配置Kerberos认证之后,再添加数据权限管理Sentry。
2.Sentry可以实现数仓表及数据的安全管理。针对不同用户组,赋予不同权限角色。
参考文档:
Sentry官网:http://sentry.apache.org/
CM官网:https://docs.cloudera.com/documentation/enterprise/5-7-x/topics/sg_sentry_service_install.html
测试使用案例:https://cloud.tencent.com/developer/article/1077868