Linux

ACL 和 umask 之間的衝突

  • March 13, 2015

我有一個目錄,可以由幾個 unix 組讀取和寫入。這是通過使用 ACL 來實現的。假設我是這樣做的:

mkdir /tmp/test
setfacl -d -m g:group1:rwx /tmp/test

效果很好,整個組(以及我添加的其他組)都可以讀/寫到這個目錄。但是有一個例外:當有人使用創建子文件夾時,mkdir -p這個目錄是用 unix 權限 0755 創建的,因為預設的 umask 是 022。這導致該組的其他使用者不能再寫入這個子文件夾的問題,因為ACL 現在看起來像這樣:

group:group1:rwx            #effective:r-x

由於某種原因,使用“mkdir”(沒有 -p 參數)時不會發生這種情況。一種解決方案是將 umask 設置為 002 但這確實是一件壞事,因為這也會影響在 ACL 控制的目錄之外創建的文件和目錄,並且這些文件預設情況下不應是組可寫的。

所以我想知道是否有另一種可能性來解決這個問題。能夠完全禁用/忽略 ACL 控制目錄的舊 unix 樣式權限內容將是完美的。或者禁用這個“有效的 ACL”的東西。那可能嗎?或者是否有另一種方法來解決由“mkdir -p”之類的程序引起的不可寫目錄的問題?最後,我想要一個根據我配置的 ACL 完全(並且遞歸)可讀和可寫的目錄,並且這永遠不會改變(僅通過修改 ACL 本身)。


注意:重現問題:

$ mkdir /tmp/test
$ setfacl -d -m g:group1:rwx /tmp/test
$ umask 0022
$ mkdir /tmp/test/aa
$ mkdir -p /tmp/test/bb
$ ls -log /tmp/test
drwxrwxr-x+ 2 4096 Mar  9 23:38  aa
drwxr-xr-x+ 2 4096 Mar  9 23:38  bb

$ getfacl /tmp/test/bb | grep ^group:group1
group:group1:rwx                     #effective:r-x

這是 gnu 的一個錯誤mkdirhttp ://savannah.gnu.org/bugs/?19546沒有辦法禁用傳統的 Unix 權限。由於mkdir工作正常,您可以編寫一個覆蓋mkdir. 在 shell 函式-p中,在 args 中查找 a 並執行一系列非 p 使用mkdir的 s。

許多基於 Linux 的系統現在將 umask 0002 與使用者私有組一起使用,因此不會出現此問題。

這是 gnu mkdir( #14371 ) 的一個錯誤,它已在 coreutils 8.22 中修復。

  • 受影響:Debian Wheezy 7、RHEL/CentOS 5 和 6 受影響(可能還有 Ubuntu Trusty 14.04)
  • 不受影響:Debian 8 Jessie、RHEL/CentOS 7(可能還有 Tbuntu Utopic 14.10)

有一些解決方法。

解決方法 #1:包裝器(Mark Wagner 已經建議)

由於 mkdir 有效,您可以編寫一個覆蓋 mkdir 的 shell 函式(或腳本 /usr/local/bin/mkdir,因為這通常在 /bin 之前)。該腳本在 args 中查找 -p,然後遞歸呼叫不帶“-p”的 mkdir。

解決方法 #2:umask 0002

如果您可以控制呼叫 mkdir 的腳本,則可以在呼叫 mkdir 之前設置遮罩:

(umask 0002 ; mkdir -p /path/to/dir)

您的其他問題:

所以我想知道是否有另一種可能性來解決這個問題。能夠完全禁用/忽略 ACL 控制目錄的舊 unix 樣式權限內容將是完美的。

不,兼容性需要權限,另請閱讀為什麼組上的 chmod(1) 會影響 ACL 遮罩?

或者禁用這個“有效的 ACL”的東西。

引用自:https://serverfault.com/questions/197263