Linux
如何使文件不可修改?
登錄後,我可以執行以下操作:
mkdir foo touch foo/bar chmod 400 foo/bar chmod 500 foo
然後我可以打開 vim(不是 as
root
),編輯bar
,用 強制寫入w!
,文件被修改。如何使作業系統不允許任何文件修改?
2017 年 3 月 2 日更新
chmod 500 foo
是一條紅鯡魚:目錄的寫權限與修改文件內容的能力無關 - 只有創建和刪除文件的能力。chmod 400 foo/bar
實際上確實阻止了文件的內容被更改。但是,它不會阻止更改文件的權限——文件的所有者總是可以更改他的文件的權限(假設他們可以訪問該文件,即對所有祖先目錄的執行權限)。事實上,strace(1) 揭示了 vim (7.4.576 Debian Jessie) 正在做的事情——vim 呼叫 chmod(2) 臨時為文件所有者添加寫權限,修改文件,然後呼叫 chmod( 2)再次刪除寫權限。這就是為什麼使用chattr +i
有效——只有 root 可以呼叫chattr -i
. 從理論上講,如果以 root 身份執行,vim(或任何程序)可以對 chattr 執行與對不可變文件使用 chmod 執行相同的操作。
您可以為 Linux 中的大多數文件系統設置“不可變”屬性。
chattr +i foo/bar
要刪除不可變屬性,請使用
-
而不是+
:chattr -i foo/bar
要查看文件的目前屬性,可以使用 lsattr:
lsattr foo/bar
chattr(1)聯機幫助頁提供了所有可用屬性的描述。以下是 的描述
i
:A file with the `i' attribute cannot be modified: it cannot be deleted or renamed, no link can be created to this file and no data can be written to the file. Only the superuser or a process possessing the CAP_LINUX_IMMUTABLE capability can set or clear this attribute.