【Hadoop】hdfs使用setfacl 对hive的库赋权不生效问题
一、前言
使用sentry
赋予普通用户的权限是能正常工作,但是HDFS文件的ACL权限未同步导致不能对相应表的数据目录进行操作。并且使用HDFS 的setfacl
命令也无法生效。
意味着使用beeline 连接hive 可以正常使用,但是直接使用HDFS的命令确会报权限不足的错误。
二、问题复现
1、测试hive的权限
beeline 连接 hiveserver2后,查看risk_admin_role 角色权限
show grant role risk_admin_role;
可以看到有全部数据库的权限
+-----------+--------+------------+---------+------------------+-----------------+------------+---------------+-------------------+----------+--+
| database | table | partition | column | principal_name | principal_type | privilege | grant_option | grant_time | grantor |
+-----------+--------+------------+---------+------------------+-----------------+------------+---------------+-------------------+----------+--+
| * | | | | risk_admin_role | ROLE | * | false | 1638965696096000 | -- |
+-----------+--------+------------+---------+------------------+-----------------+------------+---------------+-------------------+----------+--+
并且create,inesrt,drop 等操作执行下来都没有问题。
2、测试HDFS权限
测试命令
hdfs dfs -ls /user/hive/warehouse/test.db
报错信息
ls: Permission denied: user=risk_other, access=READ_EXECUTE, inode="/user/hive/warehouse/test.db":hive:hive:drwxrwx--x
3、查看HDFS文件的ACL
查看权限
hdfs dfs -getfacl /user/hive/warehouse/test.db
可以看到我们risk_other 这个角色是并没有这个文件的访问权限的,但是我们可以通过hive来操作这个库。
4、 手动添加ACL
因为我要从HDFS的文件中直接下载数据,所以当时想通过setfacl
命令来快速给用户赋予读写可执行的权限。
hdfs dfs -setfacl -m user:risk_other:rwx /user/hive/warehouse/test.db
本来想着这个命令就已经可以解决问题了,但是测试命令
hdfs dfs -ls /user/hive/warehouse/test.db
依旧报错:
ls: Permission denied: user=risk_other, access=READ_EXECUTE, inode="/user/hive/warehouse/test.db":hive:hive:drwxrwx--x
再次查看acl
hdfs dfs -getfacl /user/hive/warehouse/test.db
# file: /user/hive/warehouse/test.db
# owner: hive
# group: hive
user::rwx
group::---
user:hive:rwx
group:hive:rwx
group:op_test:rwx
mask::rwx
other::--x
依旧没有,也就是setfacl
并没有生效。
解决方案
如果需要对非hive用户赋予server1的权限,则需要将server1下所有库的权限一一赋给需要赋予的用户组,这样才能确保HDFS文件的ACL权限也是同步的。如果是最大权限的用户则可以为该用户添加hive组。
对需要操作的库添加权限!
GRANT ALL ON database india_vision TO ROLE risk_other_role;
grant all on uri 'hdfs:///user/hive/warehouse/test.db' to role <role_name>;
查看权限
show grant role risk_other_role;
+---------------+--------+------------+---------+------------------+-----------------+------------+---------------+-------------------+----------+--+
| database | table | partition | column | principal_name | principal_type | privilege | grant_option | grant_time | grantor |
+---------------+--------+------------+---------+------------------+-----------------+------------+---------------+-------------------+----------+--+
| * | | | | risk_other_role | ROLE | * | false | 1638965696096000 | -- |
| india_vision | | | | risk_other_role | ROLE | * | false | 1639479619687000 | -- |
+---------------+--------+------------+---------+------------------+-----------------+------------+---------------+-------------------+----------+--+
总结
在使用Sentry赋予server1的权限给非hive用户时是不能达到所有HDFS文件的ACL同步,如果是非最大权限的用户则需要加上数据库授权,如果是最大权限的用户可以使用hive/impala或着为用户添加hive组。
server1的权限一般是hive中管理员权限,如hive或者impala用户,就像这个文件/user/hive/warehouse的owner是hive一样。如果将此权限赋给其他用户时则需要加上数据库的权限,以保障数据的安全。
参考文章:
- https://cloud.tencent.com/developer/article/1078182