題 在寫操作期間更改文件所有權


默認情況下,umask為0022:

usera@cmp$ touch somefile; ls -l
total 0
-rw-r--r-- 1 usera usera 0 2009-09-22 22:30 somefile

目錄 /home/shared/ 適用於共享文件,應歸自己所有 root 和 shared 組。這裡創建的文件 userñ (任何用戶)自動擁有 shared 組。每天有一個cron-job負責更改擁有用戶和擁有組(任何已移動文件):

usera@cmp$ cat /etc/cron.daily/sharedscript

#!/bin/bash

chown -R root:shared /home/shared/
chmod -R 770 /home/shared/

我在寫一篇文章 真的很大 文件到共享目錄。它有我(usera)作為擁有用戶和 shared 組作為組所有者。在寫操作期間,運行了cron作業,我仍然沒有完成寫入過程的問題。

你看。我以為這會發生:

  1. 我正在寫文件。該文件的文件權限和所有權數據如下所示: -rw-r--r-- usera shared
  2. cron工作開始了!處理chown行,現在該文件歸 root 用戶和 shared 組。
  3. 由於擁有組只對文件具有讀訪問權限,因此我收到文件寫入錯誤!繁榮!故事結局。

為什麼手術成功了?一些鏈接到某種參考文檔來支持原因是非常受歡迎的(因為我可以用它來研究更多細節)。


4
2017-09-22 20:46


起源


查看chmod的SGID位選項(在下面的johnathan的答案中)。這將使您不必使用cron設置組。 - Chris Nava
@Chris:我確實知道。但是我需要修復移動文件的東西。 - Deleted


答案:


據我所知, POSIX 1003.1 僅需要fopen在權限不足時返回[EACCES]錯誤。像fputc這樣的後續操作可能會返回[EBADF]錯誤的文件描述符錯誤,但我不認為這意味著在文件打開時覆蓋權限更改。

幾年前,我在一家公司工作,我們設置了AIX服務器,以便他們使用該屬性使日誌文件更安全。當服務啟動時,root將觸及/var/log/service.log,然後將其chown到serveruser:servergroup,su - 啟動服務(它將以追加模式打開文件),然後將文件重新命名為root。因此,服務可以附加到自己的日誌文件,但不能刪除或覆蓋它,因此如果攻擊者設法破壞了服務,他就無法篡改過去的日誌條目。

類似的技巧可用於臨時文件:打開文件,然後將其刪除。目錄條目已經消失,文件不可見,但由於文件句柄仍處於打開狀態,因此inode仍然存在。關閉文件後,鏈接計數變為零,操作系統將回收磁盤空間。


7
2017-09-23 15:53





我認為原因是當cron啟動時,你仍然有一個有效的文件句柄,所以你可以正常使用..換句話說,系統會在你嘗試打開它時檢查你的權限,而不是在每個文件上操作。


5
2017-09-22 21:12



是的,我也一直傾向於此。你知道任何我可以閱讀更多相關信息的來源嗎?我想知道這是否可以在所有unices之間移植。如果它是POSIX標準的一部分。 - Deleted
我害怕我不知道...... :(也許有人在ServerFault會這麼做?我認為對於像這樣的問題來說,這會是一個更好的“觀眾”。 - Joril


正如Joril所說,文件打開時權限是相關的;之後不會檢查它們。

請記住,您可以為文件創建一個具有400(或444或000)權限的文件。當然,您需要在目錄中創建文件的權限,但您可以對其他任何人(除root)之外的文件進行寫入訪問。

另請注意,默認情況下可以通過設置保留目錄中的SGID位來設置組:

chmod g+s /home/shared

目錄中創建的所有文件都屬於擁有的組 /home/shared 直到小組改變。在MacOS X上,系統的行為就像在每個目錄上設置了SGID位一樣 - 將文件複製到目錄時,該組將設置為擁有該目錄的組。


2
2017-09-22 21:18



我知道SGID位,我正在使用它。但它不適用於我在其他地方創建的文件,然後移動到這些文件 /home/shared,cron-job負責。但是,了解MacOS X上的差異,這是一個很好的瑣事和有趣的事情。 - Deleted