Permissions
為什麼我為目錄所有者設置了 acl 的目錄被拒絕權限(在刪除所有標準 posix 權限之後)?
我正在嘗試在
ls
對目錄的所有者和組具有 acl 權限的目錄上執行命令(沒有設置標準的 posix 權限)。即使getfacl
說使用者應該能夠這樣做,這也會導致 Permission Denied。這就是我正在做的事情:
- 在其中創建一個目錄和一個文件。
mkdir /tmp/mydir && touch /tmp/mydir/myfile
- 檢查我是否可以
ls
在此目錄上執行。jgazula@gazula:/tmp$ ls -al /tmp/mydir/ total 896 drwxrwxr-x 2 jgazula jgazula 4096 Nov 1 11:57 . drwxrwxrwt 25 root root 909312 Nov 1 11:57 .. -rw-rw-r-- 1 jgazula jgazula 0 Nov 1 11:57 myfile
- 現在,讓我們刪除此目錄上的所有標準 posix 權限。
chmod 000 /tmp/mydir
- 驗證權限。
jgazula@gazula:/tmp$ ls -al /tmp | grep mydir d--------- 2 jgazula jgazula 4096 Nov 1 11:57 mydir
- 我們現在應該做不到
ls
。jgazula@gazula:/tmp$ ls -al /tmp/mydir/ ls: cannot open directory '/tmp/mydir/': Permission denied
- 設置
jgazula
使用者和組的 acl 權限。
sudo setfacl --mask -Rm u:jgazula:rwx,g:jgazula:rwx /tmp/mydir/
- 驗證 acl 權限。
jgazula@gazula:/tmp$ getfacl -ep /tmp/mydir/ # file: /tmp/mydir/ # owner: jgazula # group: jgazula user::--- user:jgazula:rwx #effective:rwx group::--- #effective:--- group:jgazula:rwx #effective:rwx mask::rwx other::---
- 既然acl權限(包括有效權限)看起來不錯,應該可以
ls
在目錄上執行吧?jgazula@gazula:/tmp$ ls -al /tmp/mydir/ ls: cannot open directory '/tmp/mydir/': Permission denied
但我不能,我不明白為什麼。
- 有趣的是,當我檢查標準 posix 權限時,組權限位已設置?不確定我是否理解為什麼只更新了組權限。
jgazula@gazula:/tmp$ ls -al /tmp | grep mydir d---rwx---+ 2 jgazula jgazula 4096 Nov 1 12:13 mydir
- 讓我們為所有者和組設置 acl 權限(即,從命令中省略所有者/組)。
sudo setfacl --mask -Rm u::rwx,g::rwx /tmp/mydir/
- 再次驗證 acl 權限。
jgazula@gazula:/tmp$ getfacl -ep /tmp/mydir/ # file: /tmp/mydir/ # owner: jgazula # group: jgazula user::rwx user:jgazula:rwx #effective:rwx group::rwx #effective:rwx group:jgazula:rwx #effective:rwx mask::rwx other::---
- 檢查我
ls
現在是否可以執行。jgazula@gazula:/tmp$ ls -al /tmp/mydir/ total 896 drwxrwx---+ 2 jgazula jgazula 4096 Nov 1 11:57 . drwxrwxrwt 25 root root 909312 Nov 1 11:57 .. -rwxrwxr--+ 1 jgazula jgazula 0 Nov 1 11:57 myfile
為什麼步驟#6 不能單獨工作?我正在為使用者和組顯式設置 acl 權限。為什麼我需要執行步驟 #11?
執行時
sudo setfacl --mask -Rm u:jgazula:rwx,g:jgazula:rwx /tmp/mydir/
,您正在為 user 創建一個ACL_USER
條目jgazula
。但是ACL_USER_OBJ
對於文件的所有者來說仍然是---
.getfacl
(您可以在步驟 7的輸出中看到這一點。)根據
man ACL
,訪問檢查算法如下:1. If the effective user ID of the process matches the user ID of the file object owner, then if the ACL_USER_OBJ entry contains the requested permissions, access is granted, else access is denied. 2. else if the effective user ID of the process matches the qualifier of any entry of type ACL_USER, then if the matching ACL_USER entry and the ACL_MASK entry contain the requested permissions, access is granted, else access is denied.
因此,該
ACL_USER
條目甚至從未被檢查過。關於 serverfault 基本上有同樣的問題:ACL:giving - - permissions for the owner of the file。(但看起來那裡的答案是
ACL_USER
相反ACL_USER_OBJ
的。)