在cdh中配置和使用sentry服务
- 在cdh中配置和使用sentry服务
- 在beeline中使用sentry
- Hive SQL Syntax for Use with Sentry
- 创建和删除角色
- 角色的授权和撤销
- 权限的授予和撤销
- 查看角色/组权限
Apache Sentry 是Cloudera公司发布的一个Hadoop开源组件,它提供了细粒度级、基于角色的授权以及多租户的管理模式。Sentry当前可以和Hive/Hcatalog、Apache Solr 和Cloudera Impala集成,提供权限管理,保护数据安全。
了解更多sentry,请浏览 http://blog.javachen.com/2015/04/29/apache-sentry-architecture.html
在cdh中提供了比较方便快捷的sentry配置服务。
首先在cdh中添加sentry服务
安装完成后,需要在cdh中进行相关配置:
- 在Hue的配置中找到sentry服务项,选择snetry。
- 在Hive配置中找到Impersonation项,取消下面选项。
- 在sentry-site.xml 的 Hive 服务高级配置代码段
sudo vim /opt/cloudera/parcels/CDH/etc/sentry/conf.dist/sentry-site.xml
添加内容
</property> <name>sentry.hive.testing.mode</name> <value>true</value> <property>
保存退出。
- 在cdh中sentry服务进行配置,找到配置中的*管理员组*项和*允许的连接用户*项,添加root用户。
- 登陆hue,发现多出一个Security选项,可以通过Sentry表来管理,选项下面直接管理hive表。
- 用户管理界面下,添加root用户和root组,作为超级管理员,提供授权等功能
- 通过root登陆hue,在用户管理员下添加test1用户、test1用户组,并在Security下给test1组授权
groupadd test1 && useradd -g test1 test1
- root用户登录hue, 在security项选择roles,创建test1_role
我们发现,test1用户只能够对default数据库中的表进行操作。
编辑
在beeline中使用sentry
首先使用beeline登录hive,使用hive用户.
beeline> !connect jdbc:hive2://kafka003:10000 hive hive0: jdbc:hive2://kafka003:10000> show roles;INFO : OK+---------------+--+| role |+---------------+--+| admin_role || analyst_role || test1_role |+---------------+--+0: jdbc:hive2://kafka003:10000> SHOW GRANT ROLE test1_role;INFO : OK+-----------+--------+------------+---------+-----------------+-----------------+------------+---------------+-------------------+----------+--+| database | table | partition | column | principal_name | principal_type | privilege | grant_option | grant_time | grantor |+-----------+--------+------------+---------+-----------------+-----------------+------------+---------------+-------------------+----------+--+| default | | | | test1_role | ROLE | all | false | 1504146822564000 | -- |+-----------+--------+------------+---------+-----------------+-----------------+------------+---------------+-------------------+----------+--+1 row selected (0.101 seconds)0: jdbc:hive2://kafka003:10000> SHOW GRANT ROLE admin_role;INFO : OK+-----------+--------+------------+---------+-----------------+-----------------+------------+---------------+-------------------+----------+--+| database | table | partition | column | principal_name | principal_type | privilege | grant_option | grant_time | grantor |+-----------+--------+------------+---------+-----------------+-----------------+------------+---------------+-------------------+----------+--+| * | | | | admin_role | ROLE | * | false | 1504082920034000 | -- || * | | | | admin_role | ROLE | * | false | 1504061331385000 | -- |+-----------+--------+------------+---------+-----------------+-----------------+------------+---------------+-------------------+----------+--+2 rows selected (0.093 seconds)0: jdbc:hive2://kafka003:10000> use filtered;INFO : OKNo rows affected (0.123 seconds)0: jdbc:hive2://kafka003:10000> show tables;INFO : OK+----------------+--+| tab_name |+----------------+--+| events || events_usonly |+----------------+--+2 rows selected (0.184 seconds)0: jdbc:hive2://kafka003:10000> select * from events_usonly;INFO : OK+-------------------+------------------------+-----------------------+-----------------------+--+| events_usonly.ip | events_usonly.country | events_usonly.client | events_usonly.action |+-------------------+------------------------+-----------------------+-----------------------+--+| 10.1.2.3 | US | android | createNote || 10.1.2.3 | US | android | updateNote || 10.1.4.5 | US | windows | updateTag |+-------------------+------------------------+-----------------------+-----------------------+--+3 rows selected (30.115 seconds)
可以看到,hive用户可以对filtered数据库进行操作。
退出beeline,以test1重新用beeline登录到hive中
beeline> !connect jdbc:hive2://kafka003:10000 test1 test1
在hive中查询数据库并操作
0: jdbc:hive2://kafka003:10000> show databases;INFO : OK+----------------+--+| database_name |+----------------+--+| default |+----------------+--+0: jdbc:hive2://kafka003:10000> show tables;INFO : OK+-----------+--+| tab_name |+-----------+--+| events |+-----------+--+1 row selected (0.191 seconds)0: jdbc:hive2://kafka003:10000> select * from events;INFO : OK+---------------+-----------------+----------------+----------------+--+| events.ip | events.country | events.client | events.action |+---------------+-----------------+----------------+----------------+--+| 10.1.2.3 | US | android | createNote || 10.200.88.99 | FR | windows | updateNote || 10.1.2.3 | US | android | updateNote || 10.200.88.77 | FR | ios | createNote || 10.1.4.5 | US | windows | updateTag |+---------------+-----------------+----------------+----------------+--+5 rows selected (0.265 seconds)
发现test1用户只能对default数据库进行操作。
编辑
附练习中用到的数据,数据库和表
$ cat /tmp/events.csv10.1.2.3,US,android,createNote10.200.88.99,FR,windows,updateNote10.1.2.3,US,android,updateNote10.200.88.77,FR,ios,createNote10.1.4.5,US,windows,updateTagcreate table default.events ( ip STRING, country STRING, client STRING, action STRING ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';load data local inpath '/tmp/events.csv' overwrite into table default.events;create database filtered;create view filtered.events as select country, client, action from default.events;create view filtered.events_usonly as select * from filtered.events where country = 'US';
编辑
Hive SQL Syntax for Use with Sentry
编辑
创建和删除角色
1. 创建角色: create role ROLE_NAME
2. 删除角色: droop role ROLE_NAME
例如如下语句:
CREATE ROLE admin_role; 创建角色admin_roledroop role admin_role; 删除角色admin_role
编辑
角色的授权和撤销
角色的授权(GRANT)就是给角色授予创建表、查询表等操作,撤销(REVOKE)反之。语法如下:
GRANT ROLE role_name [, role_name] TO GROUP <groupName> [,GROUP <groupName>] REVOKE ROLE role_name [, role_name] FROM GROUP <groupName> [,GROUP <groupName>] GRANT ROLE admin_role TO GROUP `admin`; GRANT ROLE admin_role TO GROUP hive; 授权给 admin 和 hive 组(对应操作系统上的组) 把role_test1角色授权给test组: grant role role_test1 to group test 查看test组被授权的角色: show role grant group test 取消test组的role_test1角色: revoke role role_test1 from group test REVOKE ROLE admin_role from group hive; 撤销hive的admin_role权限
编辑
权限的授予和撤销
GRANT <PRIVILEGE> [, <PRIVILEGE> ] ON <OBJECT> <object_name> TO ROLE <roleName> [,ROLE <roleName>] REVOKE <PRIVILEGE> [, <PRIVILEGE> ] ON <OBJECT> <object_name> FROM ROLE <roleName> [,ROLE <roleName>] GRANT ALL ON DATABASE analyst1 TO ROLE analyst_role; GRANT ALL ON DATABASE jranalyst1 TO ROLE analyst_role; GRANT SELECT ON DATABASE jranalyst1 TO ROLE analyst_role; 将数据库analyst1,jranalyst1 的所有权限给analyst_role角色 analyst_role角色只能读写analyst1,jranalyst1 数据库。
编辑
查看角色/组权限
SHOW ROLES; 查看有多少个role SHOW CURRENT ROLES; 查看当前登录的是用户属于哪个role SHOW ROLE GRANT GROUP <groupName>; 查看group所属的role SHOW GRANT ROLE <roleName>; 查看role所拥有的权限
用户可以通过*HiveServer2 SQL命令行(JDBC)*,*Beeline客户端*使用设置。Sentry只允许用户通过这两种方式来对hive中的数据进行访问。 Sentry并不推荐使用Hive客户端的方式访问数据。
在beeline里设置的role是可以同步到hue中的role,但是group, user均不能同步,所以如果需要设置的话在hue和linux系统中均要设置group和user。
例子:
• Grant privileges to analyst_role:1 CREATE ROLE analyst_role;2 GRANT ALL ON DATABASE analyst1 TO ROLE analyst_role; analust_role拥有对数据库analyst1的所有权限3 GRANT SELECT ON DATABASE jranalyst1 TO ROLE analyst_role; analyst_role只拥有对数据库jranalyst1的查询操作权限4 GRANT ALL ON URI 'hdfs://ha-nn-uri/landing/analyst1' TO ROLE analyst_role; • Grant privileges to junior_analyst_role:1 CREATE ROLE junior_analyst_role;2 GRANT ALL ON DATABASE jranalyst1 TO ROLE junior_analyst_role; junior_analust_role拥有对数据库jranalyst1的所有权限3 GRANT ALL ON URI 'hdfs://ha-nn-uri/landing/jranalyst1' TO ROLE junior_analyst_role;• Grant privileges to admin_role:1 CREATE ROLE admin_role2 GRANT ALL ON SERVER server TO ROLE admin_role; 将服务器server1上的所有权限给admin_role角色 GRANT all on DATABASE test to role admin_role with grant option;• Grant roles to groups:1 GRANT ROLE admin_role TO GROUP admin; admin用户组将拥有角色admin_role的权限 2 GRANT ROLE analyst_role TO GROUP analyst;3 GRANT ROLE jranalyst_role TO GROUP jranalyst;