如何使文件不可修改?


35

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

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 +iWorks的原因-只有root可以调用chattr -i。从理论上讲,如果以root身份运行,vim(或任何程序)对chattr的作用与对不可变文件的chmod的作用相同。


3
我相信vim实际上是在更改权限,然后再放回去。
jordanm

root吗?
Alvin Wong

Alvin,我以非root用户身份进行此操作。我已编辑帖子以澄清。
user2141130 2013年

Answers:


49

您可以在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.

3
在Linux上,不可变的标志是可在许多文件系统不只是EXT2 / 3/4(至少BTRFS,hfsplus,JFS,NILFS2,XFS,OCFS2,UBIFS,GFS2,从快看的ReiserFS AFAICT通过代码)
斯特凡Chazelas

@StephaneChazelas我看到chattr命令是e2fsprogs系统中软件包的一部分。这就是为什么我发表这一声明。我已根据您的评论更新了答案。
jordanm

它为符号链接:-(不工作该解决方案将是巨大的,因为我想避免这种符号链接可以。不期而遇由包括root用户的任何修改。
natenho

不可变的inode标志正确,而不是xattr吗?ioctl标志准确吗?
ytpillai

1

您可以:

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

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


3
如果您可以写入父目录,那么vim可以删除该文件并创建一个新文件(这是您执行操作时的操作:w!)。vim并没有达到暂时更改目录权限的程度。因此,保持目录不可写应该是安全的。
斯特凡Chazelas

0

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.