1、安装 Sentry
1.1、在MariaDB 中创建数据库
mysql -uroot -p123456
create database sentry default character set utf8;
CREATE USER 'sentry'@'%' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON sentry. * TO 'sentry'@'%';
FLUSH PRIVILEGES;
1.2、添加 Sentry 服务
- 在 CM 中 Cluster1 点击添加服务
- 点击下一步,开始添加 Sentry 服务
- 选择添加角色,点击继续
- 测试数据库连接成功,点击下一步
- 等待程序执行完毕点击【继续】
- 完成添加
2、配置 Sentry
2.1、配置Hive
- 在 Hive 配置页面,搜索 Sentry,配置 Hive 使用 Sentry 服务。
- 在Hive配置页面,搜索HiveServer2取消勾选HiveServer2的用户模拟功能,【保存更改】
2.2、Impala 配置
- 在 Impala 配置页面搜索 Sentry,配置 Impala 使用 Sentry,保存更改
2.3、Hue 配置
- 在 Hue 配置页面搜索 sentry,配置 hue 使用 sentry,保存更改
2.4、HDFS 配置
- 在 HDFS 配置页面搜索 acl 配置 ACLs 与 Sentry 权限同步,保存更改
- 完成这些配置后,部署客户端并重启过期配置。配置完成
3、Sentry验证
3.1、Hive验证
3.1.1、创建Hive超级用户
- 使用Hive用户登录kerberos
cd /var/run/cloudera-scm-agent/process
kinit hive/cdh1.macro.com@MACRO.COM -kt hive.keytab
Beeline 连接 Hive
beeline
!connect jdbc:hive2://localhost:10000/;principal=hive/cdh1.macro.com@MACRO.COM
3.1.2、创建 admin 角色 并授权
create role admin;
为 admin 角色赋予管理员权限
grant all on server server1 to role admin;
将 admin 角色授权给 hive 用户组
grant role admin to group hive;
上面操作创建了一个具有管理员权限的角色 admin,具有读写所有数据库的权限,并授权给了 hive 组3.1.3、创建 testhive 表,并插入数据
create table testhive (s1 string,s2 string) row format delimited fields terminated by '\t';
insert into testhive values('color' ,'red');
3.1.4、创建测试角色并将角色授权给用户组
- 创建两个角色:
- read:只能读 default 库 testhive 表,并授权给 user_r 用户组
- write:只能写 default 库 testhive 表,并授权给 user_w 用户组
- 在 LDAP 添加 user_r 和 user_w 用户和组
- 创建用户组文件 vi group_user.ldif ```sql vi group_user.ldif
dn: cn=user_r,ou=Group,dc=macro,dc=com objectClass: posixGroup objectClass: top cn: user_r userPassword: {crypt}x gidNumber: 1004
dn: cn=user_w,ou=Group,dc=macro,dc=com objectClass: posixGroup objectClass: top cn: user_w userPassword: {crypt}x gidNumber: 1005
![image.png](https://cdn.nlark.com/yuque/0/2020/png/2680099/1606569119183-11da8bd0-b5c4-4cfb-82da-74ce3d91911e.png#align=left&display=inline&height=117&margin=%5Bobject%20Object%5D&name=image.png&originHeight=233&originWidth=1004&size=17105&status=done&style=none&width=502)
2. 创建用户文件 vi user_user.ldif
```sql
vi user_user.ldif
-----------------------------------
dn: uid=user_r,ou=People,dc=macro,dc=com
uid: user_r
cn: user_r
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
userPassword: 123456
shadowLastChange: 18594
shadowMin: 0
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 1004
gidNumber: 1004
homeDirectory: /home/user_r
dn: uid=user_w,ou=People,dc=macro,dc=com
uid: user_w
cn: user_w
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
userPassword: 123456
shadowLastChange: 18594
shadowMin: 0
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 1005
gidNumber: 1005
homeDirectory: /home/user_w
添加用户
ldapadd -x -D "cn=Manager,dc=macro,dc=com" -W -f group_user.ldif
ldapadd -x -D "cn=Manager,dc=macro,dc=com" -W -f user_user.ldif
查询用户是否存在
- 使用hive(没有用户下创建)用户创建read和write角色,并授权read角色对testhive表的读权限,write角色对 testhive 表的写权限
- 登录hive用户
beeline登录hive。创建read和write角色,并授权read角色对testhive表的读权限,write角色对 testhive 表的写权限
beeline
!connect jdbc:hive2://localhost:10000/;principal=hive/cdh1.macro.com@MCARO.COM
create role read;
create role write;
grant select on table testhive to role read;
grant insert on table testhive to role write;
grant role read to group user_r;
grant role write to group user_w;
3.1.5、授权成功,使用 kadmin 创建 user_r 和 user_w 用户
3.1.6、验证权限是否生效
使用 user_r 用户登录 kerberos
beeline 连接 hive 进行读和写测试
beeline
!connect jdbc:hive2://localhost:10000:user_r
user_r读可以,写报错
- 切换user_w用户
- beeline 连接 hive 进行读和写测试
(这里权限给错了,user_w插入数据可以,读取数据不行。)
3.3、HDFS验证
- 首先用 user_r 登录 kerberos,然后在 HDFS 的目录/user/hive/warehouse/testhive/下执行ls ,cat,put 操作 。
- 再用 user_w 登录 kerberos,然后在 HDFS 的目录/user/hive/warehouse/testhive/下执行 cat,put,ls 操作。
![~N4S0HDML6AL][@T7SZK(R.JPG](https://cdn.nlark.com/yuque/0/2020/jpeg/2680099/1606571371840-1a0c1b9b-8fa3-46c2-9f48-84cb06857b40.jpeg#align=left&display=inline&height=357&margin=%5Bobject%20Object%5D&name=~N4S0HDML6AL%5D%5B%40T7SZK%28R.JPG&originHeight=357&originWidth=1074&size=53532&status=done&style=none&width=1074)
- 再切换到 user_r 登录 kerberos,确认刚才上传的文件成功
4、hive权限管控常用语句
4.2、create rele语句
4.2.1、语法:
CREATE [ OR REPLACE ] ROLE {
[ WITH ADMIN [ ONLY ]
4.2.2、参数:
- role_name 除非使用 OR REPLACE 子句,否则
不能已存在于数据库中。 - OR REPLACE
必须已存在于数据库中。如果 尚不存在,将创建一个新的用户定义角色。当前所有管理员将由 子句中指定的管理员所替换,具体如下所述: - 所有被授予 WITH ADMIN OPTION 而未包含在新角色管理员列表中的现有角色管理员将成为没有角色管理权限的角色的成员。
- 所有被授予 WITH ADMIN ONLY OPTION 而未包含在新角色管理员列表中的现有角色管理员将作为角色的成员被移除。
- 使用 OR REPLACE 子句时,如果新角色管理员列表中包含的某个现有角色管理员的原始管理权限高于替换权限,则保留其原始管理权限。例如,用户 A 是一个现有角色管理员,最初被授予对角色的 WITH ADMIN 权限。新角色管理员被授予 WITH ADMIN ONLY 权限。如果该列表中包含用户 A,则用户 A 将保留较高的 WITH ADMIN 权限。
- FOR USER 使用 FOR USER 子句而不使用 OR REPLACE 时,
必须是当前无法用作角色的现有用户的名称。 - admin_name 要指定为角色管理员的用户的列表。
- WITH ADMIN 除了所有基础系统特权外,指定的每个
还被授予对角色的管理特权。列表中包含 SYS_MANAGE_ROLES_ROLE 时,WITH ADMIN 子句无效。 - WITH ADMIN ONLY 指定的每个
仅被授予对角色的管理特权,而不是基础系统特权。 SYS_MANAGE_ROLES_ROLE 允许全局角色管理员管理角色。可结合 WITH ADMIN ONLY 子句进行指定。
4.2.3、示例:
示例 1 创建角色 Sales。只有全局角色管理员可以管理此角色。
CREATE ROLE Sales
- 示例 2 扩展现有用户 Jane 以用作角色。
CREATE OR REPLACE ROLE FOR USER Jane
- 示例 3 创建角色 Finance,并使 Mary 和 Jeff 成为具有角色管理权限的角色管理员。全局角色管理员无法管理此角色。
CREATE ROLE Finance
WITH ADMIN Mary, Jeff
- 示例 3 创建角色 Marketing,并使 Mary 和 Jeff 成为角色管理员。全局角色管理员也可以管理此角色。
CREATE ROLE Finance
WITH ADMIN ONLY Mary, Jeff, SYS_MANAGE_ROLES_ROLE
- 示例 4 Finance 是一个现有角色,Harry 和 Susan 是具有管理权限的角色管理员。您希望 Susan 保留管理员角色,替换 Harry 并添加全局角色管理员。新角色管理员将仅具有管理权限。此语句保留 Susan 的管理员角色,但 Susan 保留对角色的管理权限,因为授予的原始管理权限较高。Harry 由仅具有管理权限的 Bob 和 Sarah 替换,系统向该角色添加全局角色管理员。Harry 仍是角色成员,但不具有管理权限。
CREATE OR REPLACE ROLE Finance
WITH ADMIN ONLY Susan, Bob, Sarah, SYS_MANAGE_ROLE_ROLE
create role read; -- 创建角色
grant select on table testhive to role read; -- 授予select权限,在testhive表上。授予给角色read
grant role read to group user_r; -- 向组 user_r 授予角色 read
回收权限:
REVOKE ROLE
FROM GROUP
例子:
REVOKE ROLE write FROM group user_r;
回收role中的权限:
REVOKE SELECT ON DATABASE coffee_database FROM ROLE write;
例子:
1/ 当把所有权限赋予了一个角色,需要收回.
grant all on server server1 to role write;
drop role write;
改动权限:
dev1原来对db_test1的users1只读,改为可写可读
dev2原来对db_test1的users1可写,改为只读
create role read_write_1;
grant select,insert on table db_test1.users1 to role read_write_1;
REVOKE ROLE read FROM group dev1;
grant role read_write_1 to group dev1;
REVOKE ROLE write FROM group dev2;
grant role read to group dev2;
alter的授权:
- 无 -默认。在Sentry中禁用对象所有权。新主人的特权不能分配和创建对象并没有得到所有者权限的用户。但是,选择此选项不会影响现有的OWNER特权。
- 具有GRANT的ALL特权 -对象所有者对对象拥有ALL特权,并且可以在对象上转移OWNER特权,还可以授予和撤消对对象的其他特权。OWNER特权被授予创建对象的用户或使用ALTER DATABASE SET OWNER或ALTER TABLE SET OWNER操作的用户。
- ALL特权 -对象所有者对对象拥有ALL特权,但不能将所有者特权转移给另一个用户或角色。OWNER特权被授予创建对象的用户或使用ALTER DATABASE SET OWNER或ALTER TABLE SET OWNER操作的用户。
测试:
CREATE DATABASE test1_db;
SHOW CREATE DATABASE test1_db;
#前提是要db的创建者是db的owner,只有owner能给角色和用户alter的权限
alter database test1_db set owner role test_alter; #把某个库的alter权限赋给某个角色
alter database test1_db set owner user `mingze.yang`; #把某个库的alter权限赋给某个用户
#建好的库,查看owner要在hive的元数据库中查: