Linux

umask 如何影響 ACL?

  • November 5, 2017

umask如果啟動 ACL,有人可以向我解釋如何影響新創建文件的預設遮罩嗎?是否有一些關於此的文件?

例子:

$ mkdir test_dir && cd test_dir
$ setfacl -m d:someuser:rwx -m u:someuser:rwx .  # give access to some user
$ getfacl .
# file: .
# owner: myUsername
# group: myGroup
user::rwx
user:someuser:rwx
group::---
mask::rwx
other::---
default:user::rwx
default:user:someuser:rwx
default:group::---
default:mask::rwx
default:other::---
$ umask # show my umask
077
$ echo "main(){}" > x.c # minimal C program
$ make x # build it
cc     x.c   -o x
$ getfacl x
# file: x
# owner: myUsername
# group: myGroup
user::rwx
user:someuser:rwx           #effective:rw-
group::---
mask::rw-
other::---

我會期待mask:rwx。實際上,在設置umask為 eg之後,027我得到了預期的行為。

我找到了這個例子,標題為:ACL and MASK in linux。本文展示了以下範例,我認為這些範例有助於理解 ACL 以及如何umask相互互動。

背景

在 Linux 系統上創建文件0666時應用預設權限,而創建目錄時0777應用預設權限。

範例 1 - 文件

假設我們將 umask 設置為 077 並觸摸一個文件。當我們這樣做時,我們可以使用它strace來查看實際發生的情況:

$ umask 077; strace -eopen touch testfile 2>&1 | tail -1; ls -l testfile
open("testfile", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, 0666) = 3
-rw-------. 1 root root 0 Sep 4 15:25 testfile

在此範例中,我們可以看到系統呼叫open()是使用權限 0666 進行的,但是當umask 077核心隨後應用該權限時,會刪除以下權限 ( ---rwxrwx),剩下的rw-------就是 0600。

範例 - 2 目錄

相同的概念可以應用於目錄,除了預設權限不是 0666,而是 0777。

$ umask 022; strace -emkdir mkdir testdir; ls -ld testdir
mkdir("testdir", 0777)                  = 0
drwxr-xr-x 2 saml saml 4096 Jul  9 10:55 testdir

這次我們使用mkdir命令。該mkdir命令隨後呼叫了系統呼叫mkdir()。在上面的範例中,我們可以看到該mkdir命令呼叫了mkdir()具有預設權限0777( rwxrwxrwx) 的系統呼叫。這次022刪除了以下權限的 umask ( ),因此在創建目錄時----w--w-我們只剩下 0755 ( )。rwxr-xr-x

範例 3(應用預設 ACL)

現在讓我們創建一個目錄並展示將預設 ACL 與其中的文件一起應用到它時會發生什麼。

$ mkdir acldir
$ sudo strace -s 128 -fvTttto luv setfacl -m d:u:nginx:rwx,u:nginx:rwx acldir

$ getfacl --all-effective acldir
# file: acldir
# owner: saml
# group: saml
user::rwx
user:nginx:rwx          #effective:rwx
group::r-x          #effective:r-x
mask::rwx
other::r-x
default:user::rwx
default:user:nginx:rwx      #effective:rwx
default:group::r-x      #effective:r-x
default:mask::rwx
default:other::r-x

現在讓我們創建文件,aclfile

$ strace -s 128 -fvTttto luvly touch acldir/aclfile

# view the results of this command in the log file "luvly"
$ less luvly

現在獲取新創建文件的權限:

$ getfacl --all-effective acldir/aclfile 
# file: acldir/aclfile
# owner: saml
# group: saml
user::rw-
user:nginx:rwx          #effective:rw-
group::r-x          #effective:r--
mask::rw-
other::r--

注意麵具,mask::rw-。為什麼mask::rwx不像創建目錄時那樣?

檢查luvly日誌文件以查看創建文件時使用了哪些預設權限:

$ less luvly |grep open |tail -1
10006 1373382808.176797 open("acldir/aclfile", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, 0666) = 3 <0.000060>

這是它變得有點混亂的地方。將遮罩設置為rwx創建目錄時,您會期望創建文件的行為相同,但它不會那樣工作。這是因為核心正在open()使用預設權限呼叫該函式0666

總結

  • 文件不會獲得執行權限(屏蔽或有效)。我們使用哪種方法無關緊要:ACL、umask 或 mask & ACL。
  • 目錄可以獲得執行權限,但這取決於屏蔽欄位的設置方式。
  • 為 ACL 權限下的文件設置執行權限的唯一方法是使用chmod.

參考

引用自:https://unix.stackexchange.com/questions/82329