原理内容来自https://developer.aliyun.com/article/25491
Sentry简介:
Apache Sentry是Cloudera公司发布的一个Hadoop开源组件,截止目前还是Apache的孵化项目,它提供了细粒度级、基于角色的授权以及多租户的管理模式。Sentry当前可以和Hive/Hcatalog、Apache Solr 和Cloudera Impala集成,未来会扩展到其他的Hadoop组件,例如HDFS和HBase。
- 安全授权:Sentry可以控制数据访问,并对已通过验证的用户提供数据访问特权。
- 细粒度访问控制:Sentry支持细粒度的Hadoop数据和元数据访问控制。在Hive和Impala中Sentry的最初发行版本中,Sentry在服务器、数据库、表和视图范围提供了不同特权级别的访问控制,包括查找、插入等,允许管理员使用视图限制对行或列的访问。管理员也可以通过Sentry和带选择语句的视图或UDF,根据需要在文件内屏蔽数据。
- 基于角色的管理:Sentry通过基于角色的授权简化了管理,你可以轻易将访问同一数据集的不同特权级别授予多个组。
- 多租户管理:Sentry允许为委派给不同管理员的不同数据集设置权限。在Hive/Impala的情况下,Sentry可以在数据库/schema级别进行权限管理。
- 统一平台:Sentry为确保数据安全,提供了一个统一平台,使用现有的Hadoop Kerberos实现安全认证。同时,通过Hive或Impala访问数据时可以使用同样的Sentry协议。未来,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策略存储和服务将角色和权限以及组合角色的映射持久化到一个关系数据库并提供编程的API接口方便创建、查询、更新和删除。这允许Sentry的客户端并行和安全地获取和修改权限。
![CDH6 开启kerberos Hive的Sentry 用户权限分配](https://i-blog.csdnimg.cn/blog_migrate/d49757a4db5398405538a6f211f57733.png)
Sentry策略存储可以使用很多后端的数据库,例如MySQL、Postgres等等,它使用ORM库DataNucleus来完成持久化操作。Sentry支持kerberos认证,也可以扩展代码支持其他认证方式。
安装Sentry服务:
基于CDH 6.3.2
1.点击添加服务
![CDH6 开启kerberos Hive的Sentry 用户权限分配](https://i-blog.csdnimg.cn/blog_migrate/a03fae27e1b2a72872f312c24c218247.png)
2.选择sentry,点击继续
![CDH6 开启kerberos Hive的Sentry 用户权限分配](https://i-blog.csdnimg.cn/blog_migrate/80a0248b24eef700a9d57b2195e1c9bc.png)
3.选择HDFS,点击继续
![CDH6 开启kerberos Hive的Sentry 用户权限分配](https://i-blog.csdnimg.cn/blog_migrate/62046a6abb5d07da4c37b1cda08afb74.png)
4.选择主机,点击继续
![CDH6 开启kerberos Hive的Sentry 用户权限分配](https://i-blog.csdnimg.cn/blog_migrate/c4a46558fd9ad1917cf74b4e06987bd8.png)
5.选择数据库,点击测试,之后点击继续,一路下一步直至最后一步(这个操作一定要在添加服务之前操作)
![CDH6 开启kerberos Hive的Sentry 用户权限分配](https://i-blog.csdnimg.cn/blog_migrate/f65ce22ba8e28aa11d408ed9d2867354.png)
6.返回主页查看已添加的服务
![CDH6 开启kerberos Hive的Sentry 用户权限分配](https://i-blog.csdnimg.cn/blog_migrate/1b658f12bdb286a1ac1b9c7cbbe53f9b.png)
7.hive中开启sentry服务
![CDH6 开启kerberos Hive的Sentry 用户权限分配](https://i-blog.csdnimg.cn/blog_migrate/ad965ec7e8f82cbb7beb4f2c9236d1b2.png)
勾选Hive Metastore Server Default Group
![CDH6 开启kerberos Hive的Sentry 用户权限分配](https://i-blog.csdnimg.cn/blog_migrate/3d864f84a1ad6209923e6e00dbc09e94.png)
取消hiveserver2,否则会有配置错误的报错
![CDH6 开启kerberos Hive的Sentry 用户权限分配](https://i-blog.csdnimg.cn/blog_migrate/54bbc7cb13208ba1325044a04961fd6b.png)
- impala开启sentry服务
CDH6创建相关用户权限:
1.在Hive集群所有节点创建两个组reader、writer,并分别在对应的组下创建reader、writer用户
登陆cdh所在的服务器创建以下用户
useradd reader -s /sbin/nologin
useradd writer -s /sbin/nologin
- 使用Sentry管理员用户hive通过beeline客户端连接HiveServer2
在这之前一定要安装krb5 client和配置hive环境变量,并将cdh6的hive和 sentry的最新客户端配置文件下载下来,替换调hive conf中的配置
kinit -kt /opt/all.keytab hive/cdh6-krb5.senses-ai.com@CDH6.COM
beeline -u "jdbc:hive2://cdh6-krb5.senses-ai.com:10000/default;principal=hive/cdh6-krb5.senses-ai.com@CDH6.COM"
3.创建sentry admin role 授权,这样就可以通过hive用户管理sentry权限
create role admin_role;
grant all on server server1 to role admin_role;
grant role admin_role to group hive;
之后可以show databases; 进行验证查看数据库
4.创建Role(sunwenbo_writer_role,sunwenbo_reader_role)
CREATE ROLE sunwenbo_writer_role;
CREATE ROLE sunwenbo_reader_role;
销毁Role
DROP ROLE sunwenbo_reader_role;
5.为role赋予权限
GRANT select ON DATABASE sunwenbo TO ROLE sunwenbo_reader_role;
GRANT all ON DATABASE sunwenbo TO ROLE sunwenbo_writer_role;
如果权限赋予要精确到表,那么可以用以下方式
GRANT insert ON TABLE swb123.spark021109 to role sunwenbo_writer_role;
撤销权限(结合GRANT可实现权限修改操作)
REVOKE insert ON DATABASE sunwenbo FROM ROLE sunwenbo_writer_role;
REVOKE insert ON TABLE swb123.spark021109 FROM ROLE sunwenbo_writer_role;
6.将role授予用户组
GRANT ROLE sunwenbo_reader_role TO GROUP reader;
GRANT ROLE sunwenbo_writer_role TO GROUP writer;
查看组授权角色
SHOW ROLE GRANT GROUP reader;
SHOW ROLE GRANT GROUP writer;
查看所有role(管理员)
SHOW ROLES;
查看指定用户组的role
SHOW ROLE GRANT GROUP reader;
查看当前认证用户的role
SHOW CURRENT ROLES;
查看指定ROLE的具体权限
SHOW GRANT ROLE admin_role;
Kerberos新增principal:
1.为reader、writer创建Kerberos主体、登陆192.168.10.181
kadmin.local -q "addprinc reader/reader"
Authenticating as principal root/admin@HADOOP.COM with password.
WARNING: no policy specified for reader/reader@HADOOP.COM; defaulting to no policy
Enter password for principal "reader/reader@HADOOP.COM": (输入密码)
Re-enter password for principal "reader/reader@HADOOP.COM": (输入密码)
Principal "writer/writer@HADOOP.COM" created.
kadmin.local -q "addprinc writer/writer"
Authenticating as principal root/admin@HADOOP.COM with password.
WARNING: no policy specified for writer/writer@HADOOP.COM; defaulting to no policy
Enter password for principal "reader/reader@HADOOP.COM": (输入密码)
Re-enter password for principal "writer/writer@HADOOP.COM": (输入密码)
Principal "writer/writer@HADOOP.COM" created.
2.将keytab文件生成到指定目录/root/all.keytab
kadmin.local -q "xst -k /root/all.keytab writer/writer@CDH6.COM reader/reader@CDH6.COM"
3.使用reader登录HiveServer2,查询sunwenbo库下的任意一张表
kinit -kt /opt/all.keytab reader/reader@CDH6.COM
beeline -u "jdbc:hive2://cdh6-krb5.senses-ai.com:10000/default;principal=hive/cdh6-krb5.senses-ai.com@CDH6.COM"
4.使用writer登录HiveServer2,查询sunwenbo库下的任意一张表及swb123库下的spark021109表
kinit -kt /opt/all.keytab reader/reader@CDH6.COM
beeline -u "jdbc:hive2://cdh6-krb5.senses-ai.com:10000/default;principal=hive/cdh6-krb5.senses-ai.com@CDH6.COM"
5.sentry hive权限控制相关命令
#权限分为 SELECT ,INSERT ,ALL
#查看所有role
show roles;
#创建role
create role role_name;
#删除role
drop role role_name;
#将某个数据库读权限授予给某个role
GRANT SELECT ON DATABASE db_name TO ROLE role_name;
#将test 表的 S1 列的读权限授权给role_name (TABLE也可以不写)
GRANT SELECT(s1) ON TABLE test TO ROLE role_name;
#查看role_name 在数据库db_name中权限
SHOW GRANT ROLE role_name ON DATABASE db_name;
#查看role_name 在表test中的权限
SHOW GRANT ROLE role_name ON TABLE test;
#将role_name 权限给予user_name用户
GRANT ROLE role_name TO USER user_name;
#将role_name 权限给予user_group用户组
GRANT ROLE role_name TO GROUP user_group;
#查看某个用户下所有赋予的role权限
SHOW ROLE GRANT USER user_name;
#查看某个用户组下所有赋予的role权限
SHOW ROLE GRANT GROUP user_group;
#查看某个role下的权限信息
SHOW GRANT ROLE role_name;
#回收role_name对数据库db_name的SELECT 权限
REVOKE SELECT ON DATABASE db_name FROM ROLE role_name;
#回收role_name对表test的SELECT 权限
revoke select on [table] test from role role_name;
#回收某个group下role权限
REVOKE ROLE role_name [, role_name] FROM GROUP (groupName) [,GROUP (groupName)]