問題描述
通過HDFS指令為目錄設定使用者群組的default acl權限,在該目錄下建立的子目錄時使用者群組的權限與設定的default acl權限不一緻,提示“#effective:r-x”
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5yNyIjM4MWNiZGOzcDN2kTMzYzX5MTM0ETM4AzLclDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
- 測試環境
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。