如何使文件不可修改?

如何使文件不可修改?

登录后,我可以执行以下操作:

mkdir foo
touch foo/bar
chmod 400 foo/bar 
chmod 500 foo

然后我可以打开 vim (不是作为root),编辑bar,使用 强制写入w!,然后文件被修改。

如何让操作系统禁止任何文件修改?

2017 年 3 月 2 日更新

  1. chmod 500 foo这是一个转移注意力的话题:目录的写权限与修改文件内容的能力无关,而与创建和删除文件的能力无关。

  2. 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

你可以:

  1. 将文件所有者更改为root或新创建的虚拟用户
  2. 保留正确的组。
  3. 用于chmod 440允许按小组(即您)阅读。

如果正确的用户不是该组中唯一的用户,则应创建一个新组并仅将其添加到其中,并使用该组。但是,您不是该文件的所有者,因此您vi无法更改文件所有者。

答案3

要将整个目录树设置为只读:

cd <directory>
find ./ -print0 | sudo xargs -I {} -0 chattr +i {}

要使其再次可读,请更改+i-i.

相关内容