
如何授予特定使用者更改特定目錄內文件和目錄的使用者和群組所有權的權利?
我用谷歌搜尋了一下,發現有這樣的東西setfacl
,它允許授予用戶更改檔案和目錄權限的特定權限。但據我了解,此命令不允許授予 chown 權限。
所以,假設一個文件有
user1 user1 theFile1
user1 user1 theDirectory1
發出以下命令將會失敗。
[user1@THEcomputer]$ chown user2 theFile
我確實擁有電腦的 root 存取權。有沒有辦法授予使用者chown
在目錄內發出指令?
更新:如何將使用者新增至群組。
這裡是文章我曾經添加datamover
到hts
組中。
[root@Venus ~]# usermod -a -G datamover hts
[root@Venus ~]# exit
logout
[hts@Venus Receive]$ groups
hts wireshark datamover
[hts@Venus Receive]$
更新(RuiFRibeiro 的地址評論):
將目錄的所有權變更為該目錄不起作用,請參閱螢幕截圖。
[datamover@Venus root]$ ls -la
total 311514624
drwxrwxrwx. 6 datamover datamover 4096 Oct 14 14:05 .
drwxr-xr-x 4 root root 4096 Aug 20 16:52 ..
-rwxrwxrwx. 1 datamover datamover 674 Aug 31 16:47 create_files.zip
drwxrwxrwx 2 datamover datamover 4096 Oct 17 17:07 dudi
-rwxrwxrwx. 1 datamover datamover 318724299315 Oct 13 15:47 Jmr400.mov
-rwxrwxrwx. 1 datamover datamover 182693854 Aug 31 16:47 Jmr_Commercial_WithSubtitles.mov
-rwxrwxrwx. 1 datamover datamover 80607864 Aug 31 16:47 Jmr_DataMover_Final.mov
drwxrwxrwx. 2 datamover datamover 122880 Aug 23 11:54 ManyFiles
drwxrwxrwx. 3 datamover datamover 4096 Oct 25 07:18 Receive
drwxrwxrwx 2 datamover datamover 4096 Oct 14 13:40 sarah
-rwxrwxrwx 1 datamover datamover 3184449 Oct 14 14:05 SourceGrid_4_40_bin.zip
[datamover@Venus root]$ cd ./Receive/
[datamover@Venus Receive]$ ls -la
total 178540
drwxrwxrwx. 3 datamover datamover 4096 Oct 25 07:18 .
drwxrwxrwx. 6 datamover datamover 4096 Oct 14 14:05 ..
-rwxrwxrwx 1 hts hts 182693854 Oct 25 07:18 Jmr_Commercial_WithSubtitles.mov
drwxrwxrwx 2 datamover datamover 122880 Oct 23 13:33 ManyFiles
[datamover@Venus Receive]$ chown datamover:datamover ./Jmr_Commercial_WithSubtitles.mov
chown: changing ownership of './Jmr_Commercial_WithSubtitles.mov': Operation not permitted
這是作為文件所有者的嘗試:
[hts@Venus Receive]$ chown datamover:datamover Jmr_Commercial_WithSubtitles.mov
chown: changing ownership of 'Jmr_Commercial_WithSubtitles.mov': Operation not permitted
正如您所看到的,這兩種可能性都行不通。
更新(地址計數器模式的答案)
文件所有者(和 root)可以更改群組所有權。但是,這僅限於所有者所屬的群組。
是的,必須先註銷。這是我嘗試的結果:
[hts@Venus ~]$ groups hts
hts : hts wireshark datamover
[hts@Venus ~]$ cd /mnt/DataMover/root/Receive/
[hts@Venus Receive]$ ls -la
total 178540
drwxrwxrwx. 3 datamover datamover 4096 Oct 25 07:18 .
drwxrwxrwx. 6 datamover datamover 4096 Oct 14 14:05 ..
-rwxrwxrwx 1 hts hts 182693854 Oct 25 07:18 Jmr_Commercial_WithSubtitles.mov
drwxrwxrwx 2 datamover datamover 122880 Oct 23 13:33 ManyFiles
[hts@Venus Receive]$ chown hts:datamover ./Jmr_Commercial_WithSubtitles.mov
[hts@Venus Receive]$ ls -la
total 178540
drwxrwxrwx. 3 datamover datamover 4096 Oct 25 07:18 .
drwxrwxrwx. 6 datamover datamover 4096 Oct 14 14:05 ..
-rwxrwxrwx 1 hts datamover 182693854 Oct 25 07:18 Jmr_Commercial_WithSubtitles.mov
drwxrwxrwx 2 datamover datamover 122880 Oct 23 13:33 ManyFiles
[hts@Venus Receive]$ chown datamover:datamover ./Jmr_Commercial_WithSubtitles.mov
chown: changing ownership of ‘./Jmr_Commercial_WithSubtitles.mov’: Operation not permitted
[hts@Venus Receive]$
將 hts 新增至 datamover 群組確實允許我更改群組部分的所有權,因此現在對該語句進行部分回答和驗證。
答案1
只有 root 才有權更改文件的擁有權。相當現代的 Linux 版本提供了這種CAP_CHOWN
功能;具有此功能的使用者還可以更改任意文件的所有權。CAP_CHOWN
是全域的,一旦授予,它適用於本機檔案系統中的任何檔案。
文件所有者(和 root)可以更改群組所有權。但是,這僅限於所有者所屬的群組。因此,如果使用者 U 屬於群組 A、B 和 C,但不屬於群組 D,則 U 可以將 U 擁有的任何檔案的群組更改為 A、B 或 C,但不能更改為 D。那麼CAP_CHOWN
就是要走的路。
警告 CAP_CHOWN
具有嚴重的安全隱患,具有能力的 shell 的使用者CAP_CHOWN
可以獲得 root 權限。 (例如,chown
您自己的 libc,修補您的特洛伊木馬,chown
它會返回並等待 root 進程將其拾取。)
由於您想要限制更改某些目錄的所有權的能力,因此沒有任何可用的工具可以幫助您。相反,您可以編寫自己的變體chown
來處理預期的限制。該程式需要具有以下功能CAP_CHOWN
:
setcap cap_chown+ep /usr/local/bin/my_chown
警告
您的程式可能會模仿正版chown
,例如my_chown
user:group filename(s)
。請務必非常仔細地執行輸入驗證。檢查每個檔案是否滿足預期的限制,特別是要注意指向越界的軟連結。
如果您想要限制某些使用者存取您的程序,您可以建立一個特殊群組,將群組所有權設定my_chown
為該群組,將權限設為 0750,然後新增允許加入群組的所有使用者。或者,您可以使用sudo
合適的規則(在這種情況下,您也不需要能力魔法)。如果您需要更大的靈活性,那麼您需要將您想到的規則編碼到my_chown
.
答案2
我也遇到同樣的問題,並且已經在使用 ACL。這可能不適用於您的情況,但就我而言,特定使用者俱有對目錄樹的寫入存取權限,而所有其他使用者俱有讀取存取權限,因此我的策略是編寫一個小型setuid 程式來檢查呼叫使用者的寫入存取權限並允許更改其他人的讀取權限。
這裡有一個討論這個問題的問題: