cdh集成sentry

安装sentry服务

在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高可用

设置第二个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的权限模型

  • object:object指不同的数据库对象,如server,database,table,column等
  • role:role具有很多操作规则,每个操作规则是指对特定object的privilege
  • privilege:privilege被赋给某个role,允许该role具有操作某个object的特定权限,privilege包括:READ, WRITE, ALL。
  • user:从authentication系统产生。我们是从kerberos服务中产生的
  • group:是user的集合,从linux系统的用户的group映射而来。所有的role都只能被赋给group,而不能直接赋给user

在hive中使用sentry授权

sentry常与hive、impala、hue等组件一起使用,下面是与hive一起使用时使用Hive SQL的语法来管理权限的常用操作。

角色操作

  • 创建角色:CREATE ROLE [role_name];
  • 删除角色:DROP ROLE [role_name];
  • 查看所有角色:SHOW ROLES;
  • 查看当前用户所具有的角色:SHOW CURRENT ROLES;

角色与权限

向角色授权

GRANT    
     [,  ]    
    ON      
    TO ROLE  [,ROLE ]
 
  

撤销角色的权限

REVOKE    
     [,  ]    
    ON      
    FROM ROLE  [,ROLE ]
 
  

查看角色具有的权限

SHOW GRANT ROLE ;

查看角色对某个对象的权限

SHOW GRANT ROLE  on  ;
 
  

将角色关联到group以及撤销group的角色

将角色关联到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权限。

你可能感兴趣的:(hadoop生态圈)