文章目录

  • 一、前言
  • 二、问题复现
  • 1、测试hive的权限
  • 2、测试HDFS权限
  • 3、查看HDFS文件的ACL
  • 4、 手动添加ACL
  • 解决方案
  • 总结


一、前言

使用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来操作这个库。

hive视图赋权语句 hive 赋权_hdfs

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一样。如果将此权限赋给其他用户时则需要加上数据库的权限,以保障数据的安全。

参考文章: