加入sentry后普通用户访问hdfs文件权限问题

本文探讨了在集成LDAP和Sentry权限控制后,如何为普通用户hadoopuser设置读写权限于HDFS的/user/hive/warehouse目录,包括尝试使用setfacl失败,加入hive组并授权的过程,以及服务器间的权限同步需求。

问题:

        加入LDAP和sentry控制权限后,在每台服务器中添加了普通用户,例如hadoopuser,在hadoopuser下执行su - u hadooouser hdfs dfs -ls /user/hive/warehouse报错,报错信息如下。

ls: Permission denied: user=hadoopuser, access=READ_EXECUTE, inode="/user/hive/warehouse":hive:hive:drwxrwx--x

分析思路:

        由于增加了sentry权限管控,像平时的chmod去修改文件权限都是不会生效的。

通过   -getfacl    查看hadoopuser根本不在管控的权限中。通过如下命令添加权限一样不生效

hdfs dfs -setfacl -m user:hadoopuser:rwx  /user/hive/warehouse

[root@hadoopap ~]# hadoop fs -getfacl /user/hive/warehouse
# file: /user/hive/warehouse
# owner: hive
# group: hive
user::rwx
group::---
user:hive:rwx
group:hive:rwx
mask::rwx
other::--x

于是想着把hadoopuser 添加到hive组中应该就可以了吧

在一台服务器上把普通用户添加到hive组,让其拥有hive一样的权限。

usermod  -G hive hadoopuser

再次执行su - u hadooouser hdfs dfs -ls /user/hive/warehouse 仍然权限不足。

其实加入sentry,只能通过添加用户到用户组,再belline中授权的方式实现;以上思路没有问题,最后才发现,需要把每台服务器hadoopuser用户都要添加到hive组中才会有效

# Hive中管理HDFS副本写入权限的差异化控制方案 在Hadoop生态系统中,Hive表数据实际存储在HDFS上,而用户HDFS副本的写入权限可以基于不同用户进行差异化配置。以下是专业解决方案: ## 1. 权限分层控制架构 ``` 应用层权限控制 ├── Hive SQL权限 (GRANT/REVOKE) ├── HDFS ACL权限 (setfacl) └── Linux文件系统权限 (chmod) ``` ## 2. HDFS ACL精细化控制 ### (1) 基础ACL设置命令 ```bash # 查看当前ACL hdfs dfs -getfacl /user/hive/warehouse/mytable # 设置用户特定写入权限 hdfs dfs -setfacl -m user:user1:rwx /user/hive/warehouse/mytable hdfs dfs -setfacl -m user:user2:r-x /user/hive/warehouse/mytable # 设置默认ACL(影响新创建文件) hdfs dfs -setfacl -m default:user:user1:rwx /user/hive/warehouse/mytable ``` ### (2) Hive表目录权限初始化 ```sql -- 创建表时指定HDFS权限 CREATE TABLE mytable (id INT) LOCATION '/user/hive/warehouse/mytable' TBLPROPERTIES ( 'hive.hdfs.acl'='user::rwx,user:user1:rwx,user:user2:r-x,group::r-x,other::---', 'hive.hdfs.acl.default'='user::rwx,user:user1:rwx,user:user2:r-x,group::r-x,other::---' ); ``` ## 3. 基于Hive Hook的动态权限控制 实现`DriverRunHook`在查询执行前后动态调整权限: ```java public class AclControlHook implements DriverRunHook { @Override public void postDriverRun(HookContext hookContext) { String user = hookContext.getUgi().getShortUserName(); String tablePath = hookContext.getTable().getPath().toString(); // 根据用户设置不同ACL if(user.equals("user1")) { ShellCmdUtil.run("hdfs dfs -setfacl -m user:"+user+":rwx "+tablePath); } else { ShellCmdUtil.run("hdfs dfs -setfacl -m user:"+user+":r-x "+tablePath); } } } ``` 配置`hive-site.xml`: ```xml <property> <name>hive.exec.driver.run.hooks</name> <value>com.example.AclControlHook</value> </property> ``` ## 4. Sentry/Ranger集成方案 使用Sentry配置精细化HDFS访问策略: ```xml <!-- sentry-site.xml --> <property> <name>sentry.hive.integration</name> <value>true</value> </property> <property> <name>sentry.hdfs.integration</name> <value>true</value> </property> <property> <name>sentry.hdfs.allow.acl.inheritance</name> <value>true</value> </property> ``` ## 5. 权限继承与覆盖规则 1. **显式ACL优先**:直接设置的ACL优先于默认ACL 2. **最近匹配原则**:精确到文件的权限设置覆盖目录级设置 3. **拒绝优先**:DENY权限覆盖ALLOW权限 4. **Hive权限与HDFS权限关系**: - Hive的GRANT只控制元数据权限 - 实际文件操作需要HDFS权限配合 - 最终权限取两者交集 ## 6. 最佳实践建议 1. **权限模板化**:为不同角色创建权限模板 ```bash # 管理员模板 hdfs dfs -setfacl -x user:admin:rwx template_admin # 分析师模板 hdfs dfs -setfacl -x user:analyst:r-x template_analyst ``` 2. **定期权限审计** ```bash # 查找权限不一致的文件 hdfs dfs -ls -R /user/hive | awk '{print $8}' | xargs -I {} hdfs dfs -getfacl {} | grep -v "^#" | sort | uniq -c ``` 3. **自动化权限修复** ```python # 用Python脚本同步Hive元数据权限和HDFS ACL for table in hive_client.get_tables(): hdfs_path = table.get_location() acl = generate_acl_based_on_hive_perms(table) subprocess.run(f"hdfs dfs -setfacl -R {acl} {hdfs_path}", shell=True) ``` 4. **测试环境验证** ```sql -- 使用EXPLAIN验证权限 EXPLAIN EXTENDED INSERT INTO TABLE target_table SELECT * FROM source_table; -- 检查输出的HDFS路径权限 ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值