登录后,我可以执行以下操作:
mkdir foo
touch foo/bar
chmod 400 foo/bar
chmod 500 foo
然后我可以打开 vim (不是作为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 执行的相同操作。
答案1
您可以为 Linux 中的大多数文件系统设置“不可变”属性。
chattr +i foo/bar
要删除不可变属性,请-
使用+
:
chattr -i foo/bar
要查看文件的当前属性,可以使用 lsattr:
lsattr foo/bar
这聊天(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.
答案2
你可以:
- 将文件所有者更改为
root
或新创建的虚拟用户 - 保留正确的组。
- 用于
chmod 440
允许按小组(即您)阅读。
如果正确的用户不是该组中唯一的用户,则应创建一个新组并仅将其添加到其中,并使用该组。但是,您不是该文件的所有者,因此您vi
无法更改文件所有者。
答案3
要将整个目录树设置为只读:
cd <directory>
find ./ -print0 | sudo xargs -I {} -0 chattr +i {}
要使其再次可读,请更改+i
为-i
.