在cloudera manager web页面上选中集群下的action按钮,然后点击add service,在列表中选择sentry服务,并按照向导操作即可。sentry的运行需要使用mysql,在安装cdh的那篇文章中的步骤已经包含了创建sentry服务的步骤,所以,直接就有一个sentry数据库,直接使用即可,用户名和密码是sentry/sentry_password。
关于安装sentry服务,请参考官方文档 https://www.cloudera.com/documentation/enterprise/latest/topics/sg_sentry_service_install.html
设置第二个sentry server,可以提高sentry的高可用性。在cloudera manager web页面上的集群列表中点击sentry,进入sentry服务的页面,然后打开instance
标签页,点击Add Role Instances,根据弹出的向导选择第二个sentry server即可。
关于sentry高可用,请参考官方文档
https://www.cloudera.com/documentation/enterprise/latest/topics/sg_sentry_ha.html
sentry常与hive、impala、hue等组件一起使用,下面是与hive一起使用时使用Hive SQL的语法来管理权限的常用操作。
CREATE ROLE [role_name];
DROP ROLE [role_name];
SHOW ROLES;
SHOW CURRENT ROLES;
向角色授权
GRANT
[, ]
ON
撤销角色的权限
REVOKE
[, ]
ON
查看角色具有的权限
SHOW GRANT ROLE ;
查看角色对某个对象的权限
SHOW GRANT ROLE on
将角色关联到group
GRANT ROLE role_name [, role_name]
TO GROUP [,GROUP ]
撤销group的角色
REVOKE ROLE role_name [, role_name]
FROM GROUP [,GROUP ]
查看group具有哪些角色
SHOW ROLE GRANT GROUP ;
关于在hive中使用sentry授权的更多问题,可以参考官方文档
https://www.cloudera.com/documentation/enterprise/latest/topics/sg_hive_sql.html
下面的示例将帮助你理解上面的命令。假设有两个用户组分别是manager和analyst,我希望db1manager组内的用户对db1数据库中的所有表具有所有权限,而db1analyst组内的所有用户对db1数据库的table1具有查询权限,下面将演示这个过程
首先使用kinit
命令激活hive用户的kerveros tgt,然后使用beeline
命令进入beeline的shell中,并使用下面的命令连接上对用的hive
beeline> !connect jdbc:hive2://cdhtest-0:10000/default;principal=hive/[email protected]
根据需求,我们创建两个角色,分别是manager角色和analyst角色
create role manager;
create role analyst;
查看角色信息
show roles;
+----------+--+
| role |
+----------+--+
| analyst |
| manager |
+----------+--+
两个角色已经创建好了。接下来分别向两个角色授予不同的权限,先向manager角色授予db1数据库的所有权限
grant all on database db1 to role manager;
grant select on table table1 to role analyst;
查看manager的权限
show grant role manager;
+-----------+--------+------------+---------+-----------------+-----------------+------------+---------------+-------------------+----------+--+
| database | table | partition | column | principal_name | principal_type | privilege | grant_option | grant_time | grantor |
+-----------+--------+------------+---------+-----------------+-----------------+------------+---------------+-------------------+----------+--+
| db1 | | | | manager | ROLE | * | false | 1521797782036000 | -- |
+-----------+--------+------------+---------+-----------------+-----------------+------------+---------------+-------------------+----------+--+
可以看出manager角色对db1具有*权限。下面查看analyst角色的权限
show grant role analyst;
+-----------+---------+------------+---------+-----------------+-----------------+------------+---------------+-------------------+----------+--+
| database | table | partition | column | principal_name | principal_type | privilege | grant_option | grant_time | grantor |
+-----------+---------+------------+---------+-----------------+-----------------+------------+---------------+-------------------+----------+--+
| default | | | | analyst | ROLE | select | false | 1521773777266000 | -- |
| db1 | table1 | | | analyst | ROLE | select | false | 1521797965506000 | -- |
+-----------+---------+------------+---------+-----------------+-----------------+------------+---------------+-------------------+----------+--+
可以看出analyst角色对db1和table1都具有select权限。
权限已经分配给角色了,接下来将角色和用户组做一下关联
grant role manager to group db1manager;
grant role analyst to group db1analyst;
查看db1manager组所具有的角色
show role grant group db1manager;
+----------+---------------+-------------+----------+--+
| role | grant_option | grant_time | grantor |
+----------+---------------+-------------+----------+--+
| manager | false | NULL | -- |
+----------+---------------+-------------+----------+--+
查看db1analyst组所具有的角色
show role grant group db1analyst;
+----------+---------------+-------------+----------+--+
| role | grant_option | grant_time | grantor |
+----------+---------------+-------------+----------+--+
| analyst | false | NULL | -- |
+----------+---------------+-------------+----------+--+
授权完毕。
此时cdh集群上有db1manager和db1analyst两个用户组。此时正好有两个用户和两个用户组,名字分别都是db1manager和db1analyst。
$ groups db1manager
db1manager : db1manager
$ groups db1analyst
db1analyst : db1analyst
再打开一个terminal并使用db1manager用户登录,先拿到kerberos的tgt
kinit db1manager
Password for [email protected]:
此处输入db1manager用户的kerberos密码。
然后使用beeline
命令进入beeline的shell,并使用下面的命令连接到hive
beeline> !connect jdbc:hive2://cdhtest-0:10000/default;principal=hive/[email protected]
需要注意的是,此处的principal参数仍然是hive/[email protected],而不是[email protected]。
然后查看自己的角色
show current roles;
+----------+--+
| role |
+----------+--+
| manager |
+----------+--+
可以看出db1manager用户具有manager角色。接下来执行两个简单的sql命令来测试一下权限
insert into table1 values (1,1);
insert into table1 values (2,2);
select * from table1;
+--------------+--------------+--+
| table1.col1 | table1.col2 |
+--------------+--------------+--+
| 1 | 1 |
| 2 | 2 |
+--------------+--------------+--+
以同样的方法再切换到db1analyst用户,并查看角色
show current roles;
+----------+--+
| role |
+----------+--+
| analyst |
+----------+--+
执行一个select
select * from table1;
+--------------+--------------+--+
| table1.col1 | table1.col2 |
+--------------+--------------+--+
| 1 | 1 |
| 2 | 2 |
+--------------+--------------+--+
查询成功。再执行一个insert
insert into table1 values (3,3);
Error: Error while compiling statement: FAILED: SemanticException No valid privileges
User db1analyst does not have privileges for QUERY
The required privileges: Server=server1->Db=db1->Table=table1->action=insert; (state=42000,code=40000)
报错了,权限不足,因为analyst角色没有WRITE权限。