问题描述
通过HDFS命令为目录设置用户和组的default acl权限,在该目录下创建的子目录时用户和组的权限与设置的default acl权限不一致,提示“#effective:r-x”
1.Redhat7.6
2.采用root用户操作
3.CM和CDH版本为5.16.2
4.HDFS启用ACL权限控制
问题复现
1.使用cdhadmin用户创建一个HDFS目录
[root@cdh2 ~]# kinit cdhadmin
[root@cdh2 ~]# hadoop fs -mkdir /tmp/testacl
[root@cdh2 ~]# hadoop fs -getfacl /tmp/testacl
2.为huet用户和test组设置/tmp/testacl目录default acl权限为rwx
[root@cdh2 ~]# hadoop fs -setfacl -m default:user:huet:rwx /tmp/testacl
[root@cdh2 ~]# hadoop fs -setfacl -m default:group:test:rwx /tmp/testacl
[root@cdh2 ~]# hadoop fs -getfacl /tmp/testacl
通过user::rwx,group::r-x,other::r-x可以看到与umask-mode定义的022一致(即777 && 022=755,刚好对应user、group、other的权限)
3.在/tmp/testacl目录下创建一个子目录tt,并查看acl权限
[root@cdh2 ~]# hadoop fs -mkdir /tmp/testacl/tt
[root@cdh2 ~]# hadoop fs -getfacl /tmp/testacl/tt
通过上图可以看到父目录设置的huet用户和test组的default acl权限为rwx,但是新建的子目录权限显示为user:huet:rwx #effective:r-x用户和组的写权限丢失。
问题分析
HDFS服务dfs.umaskmode, fs.permissions.umask-mode默认配置为022
rwx权限说明:
r(read)可读权限,对应数字为4
w(write)可写权限,对应数字为2
x(execute)可执行权限,对应数字为1
HDFS文件或目录的权限位是由9个权限位来控制,每三位为一组,他们分别是文件属主(Owner)的读、写、执行,用户组(Group)的读、写、执行以及(Other)其它用户的读、写、执行。由于HDFS默认的umask为022,因此我们在HDFS上创建目录时目录的权限为755(即777 && 022 为 755),即test用户创建一个目录/tmp/test
1)owner对目录拥有rwx权限(7-0)
2)group对该目录只有r-x权限(7-2)
3)other user对该目录只有r-x权限(7-2)
因此这也就说明了为什么在我们为指定目录设置了default acl权限后,子目录会出现继承的权限与实际的设置的权限不一致问题,接下来主要介绍两种不同的方式修复问题。
问题解决
该问题在HDFS的JIRA中也有相应的记录具体链接如下:
https://issues.apache.org/jira/browse/HDFS-6962
4.1方法一
通过指定HDFS的umask配置参数方式解决问题,该方式可以通过CM界面配置全局的,也可以在自己当前命令操作节点修改hdfs-site.xml配置文件来实现。
1.把默认值022改成000
2.保存配置并回到CM主页重启过时服务
3.删除创建的tt子目录在重新创建
[root@cdh2 ~]# hadoop fs -rmr /tmp/testacl/tt
[root@cdh2 ~]# hadoop fs -mkdir /tmp/testacl/tt
[root@cdh2 ~]# hadoop fs -getfacl /tmp/testacl/tt
注意:之前已创建的目录继承的ACL权限是不会因为修改配置而更新,需要重新创建该目录才可以。
4.2方法二
根据JIRA里面描述HDFS提供了,给的解决方法是通过在hdfs-site.xml配置中将dfs.namenode.posix.inheritance.enabled设置为true,开启此配置后在指定了default acl时则umask不起作用。
1.在CM界面修改配置 hdfs-site.xml的NameNode高级配置代码段(安全阀)dfs.namenode.posix.acl.inheritance.enabled为true,点击保存
2.由于该配置为NameNode的高级配置,只需要重启NameNode服务即可
3.删除创建的tt子目录在重新创建
[root@cdh3 ~]# hadoop fs -rmr /tmp/testacl/tt
[root@cdh3 ~]# hadoop fs -mkdir /tmp/testacl/tt
[root@cdh3 ~]# hadoop fs -getfacl /tmp/testacl/tt
总结
1.针对HDFS Default ACL继承与umask冲突问题可以通过两种方式解决,一种是通过修改客户端配置umask即可,一种是为NameNode服务添加高级配置dfs.namenode.posix.acl.inheritance.enabled为true的方式解决,指定该配置后子目录在继承权限时无视umask配置。
2.对于NameNode高级配置代码段(安全阀)中的dfs.namenode.posix.acl.inheritan
ce.enabled的参数,在C5中默认是false,在C6中默认是true。
3.重新部署客户端配置之前就创建的子目录,更改客户端配置之后权限仍然会继承失败,只有在部署客户端之后创建的子目录才能正常继承父目录的权限。对于父目Default ACL的后续修改不影响现有子目录的ACL。
4.只有目录的的创建者也就是owner可以直接设置目录的ACL,否则需要以HDFS用户去给各个目录设置ACL。