強制所有者創建文件和文件夾
我有一個目錄,其中包含多個使用者之間共享的數據。對該目錄及其下任何內容的訪問將由該目錄的組控制,該組將被添加到相關使用者中。因此,我創建了文件夾“粘性組”
chmod g+s
集。該目錄將包含一個包含目錄和文件的樹結構,文件總數可能為幾百萬。這些文件會相當小,我預計不會超過 50MB。我的問題是文件或目錄的所有者仍然是創建它的使用者。因此,即使我應該從訪問組中刪除該使用者,我也不會完全刪除他的訪問權限。
所以:
我是否錯過了其他選項來確保所有文件和子目錄都具有相同的所有者?
我希望我可以使用 cron-job 定期瀏覽整個目錄,但這讓我覺得對於本質上是一次 pr-file 命令的效率低下。
我找到了一個使用 INotify的範例,但我覺得它需要大量維護,因為它需要編寫腳本。
我無法弄清楚 ACL 是否可以幫助我強制擁有所有權。
有沒有更聰明的方法來做到這一點?
我想要的是有一個可以通過向使用者添加組來共享的目錄。在此目錄中創建的任何內容都從其父目錄繼承權限方案。如果有比我正在嘗試的更好的方法,我會全力以赴。
“自動”設置預設所有者將需要一個
setuid
行為類似於setgid
. 然而,雖然這可以在 FreeBSD 上進行配置,但其他 UNIX 和 Linux 系統只是忽略u+s
. 但是,在您的情況下,可能還有另一種解決方案。我想要的是有一個可以通過向使用者添加組來共享的目錄。在此目錄中創建的任何內容都從其父目錄繼承權限方案。如果有比我正在嘗試的更好的方法,我會全力以赴。
所以,基本上,據我所見,您想使用組機制控制對目錄的訪問。但是,這並不要求您限制整個目錄結構中的權限。實際上,目錄
--x
執行位可能正是您所需要的。讓我給你舉個例子。假如說…
group_dir
控制對目錄的訪問的組是ourgroup
。- 只有
ourgroup
群組中的人才能訪問group_dir
。user1
並且user2
屬於ourgroup
。- 預設的 umask 是 0022。
…考慮以下設置:
drwxrws--- root:ourgroup |- group_dir/ drwxr-sr-x user1:ourgroup |---- group_dir/user1_submission/ drwxr-sr-x user2:ourgroup |---- group_dir/user2_submission/ -rw-r--r-- user2:ourgroup |-------- group_dir/user2_submission/README
在這裡,讓我們假設每個項目都是由其所有者創建的。
現在,在這個設置中:
- 所有目錄都可以被
ourgroup
. 群組中的任何人都可以在內部的任何位置group_dir
(但不能更深入)創建、移動、刪除文件。- 任何不在其中的人都
ourgroup
將在 處被阻止group_dir
,因此將無法操縱其下的任何內容。例如,user3
(不是 的成員ourgroup
)無法讀取group_dir/user2_submission/README
(即使他r--
對文件本身俱有權限)。但是,在這種情況下有一個小問題:由於典型的 umask,使用者創建的項目不能被組的其他成員操作。這就是 ACL 的用武之地。通過設置預設權限,您將確保一切正常,儘管有 umask 值:
$ setfacl -dRm u::rwX,g::rwX,o::0 group_dir/
此呼叫設置:
- 所有者的預設
rw(x)
權限。- 組的預設
rw(x)
權限。- 其他人預設沒有權限。請注意,由於其他人無論如何都無法訪問
group_dir
,因此他們下面的權限並不重要。現在,如果我創建一個項目
user2
:$ touch group_dir/user2_submission/AUTHORS $ ls -l group_dir/user2_submission/AUTHORS rw-rw---- user2:ourgroup group_dir/user2_submission/AUTHORS
有了這個 ACL,我們可以嘗試重建我們之前的結構:
drwxrws---+ root:ourgroup |- group_dir/ drwxrws---+ user1:ourgroup |---- group_dir/user1_submission/ drwxrws---+ user2:ourgroup |---- group_dir/user2_submission/ -rw-rw----+ user2:ourgroup |-------- group_dir/user2_submission/README
同樣,每個項目都是由其所有者創建的。
此外,如果您想為使用該目錄的人提供更多的權力/安全性,您可能需要考慮一個粘性位。例如,這將阻止
user1
刪除user2_submission
(因為他對 有-w-
權限group_dir
):$ chmod +t group_dir/
現在,如果
user1
嘗試刪除user2
的目錄,他會得到一個可愛的Operation not permitted
. 但是請注意,雖然這會阻止 中的目錄結構修改group_dir
,但它下面的文件和目錄仍然可以訪問:user1@host $ rm -r user2_submission Operation not permitted user1@host $ > user2_submission/README user1@host $ file user2_submission/README user2_submission/README: empty (uh-oh)
另一件需要考慮的事情是我們使用的 ACL 設置了預設權限。因此,項目的所有者可以更改與其關聯的權限。例如,
user2
可以完美執行…$ chown g= user2_submission/ -R or $ chgrp nobody user2_submission -R
…因此使組中的任何人都無法使用他的完整送出目錄。
但是,由於您最初願意向
rws
組中的任何人授予完全訪問權限,因此我假設您信任這些使用者,並且您不會期望他們進行太多惡意操作。