Linux - 有没有办法防止/保护文件不被 root 删除?

90 linux files

我有一个非常重要的文件,我的工作场所中的应用程序使用它,我需要确保它不会被删除,我该怎么做?

Ita*_*not 134

是的,您可以将文件的属性更改为只读。

命令是:

chattr +i filename
Run Code Online (Sandbox Code Playgroud)

并禁用它:

chattr -i filename
Run Code Online (Sandbox Code Playgroud)

来自man chattr

具有该i属性的文件无法修改:无法删除或重命名,无法创建指向该文件的链接,也无法将数据写入该文件。只有超级用户或拥有该CAP_LINUX_IMMUTABLE能力的进程才能设置或清除该属性。

  • 请注意,具有 root 访问权限的用户可以取消设置该标志,然后删除该文件。这不太可能是偶然发生的,但它不能防止故意删除。 (86认同)
  • @Grant 如果想极端化,10 ^ 30 年内无法防止分区被删除或磁盘被放入熔炉或质子衰变... (16认同)
  • 对于感兴趣的人,bsd 等价物是`chflags schg` (11认同)
  • @Grant,如果 [Securelevel](https://en.wikipedia.org/wiki/Securelevel) 设置得足够高,则不会。启动过程在启用网络之前将安全级别设置为 2,因此重置标志需要本地机器访问(但这意味着在此之前启动过程中使用的文件也需要是不可变的)。 (6认同)
  • @Itai Ganot 伙计,我希望我在 4 天前读过它。我是我参加的考试中的一个问题 =/ (2认同)
  • 鉴于 OP 对 Kevin 的回复表示赞赏,这个答案看起来很理想 - OP 询问如何防止具有 root 访问权限的用户意外删除,而不是如何防止恶意超级用户造成问题 (2认同)

Tho*_*sen 84

将其刻录到 CD。将 CD 放入 CD-ROM 驱动器并从那里访问它。

  • +1 用于开箱即用的思考。而且,afaik,它之前也曾在某些情况下使用过(带有 cd 的黑盒 cdrom 驱动器运到目的地)。无论如何,如果有人能够断开驱动器的连接,这可能不合适。 (15认同)
  • 如今,内置读卡器中的全尺寸 SD 卡可能是更好的解决方案 - 功耗更低,在许多情况下访问速度更快,并且在非写入使用中更耐用。 (7认同)
  • @jpmc26 因此是 CD-ROM 驱动器。那些是只读的。 (3认同)
  • 我认为这是这个问题的正确答案。更改文件属性 (chattr -i) 无法防止恶意操作。 (2认同)

小智 29

  1. 创建文件系统映像。
  2. 安装图像。
  3. 将文件复制到挂载的映像。
  4. 卸载映像并将其重新挂载为只读。
  5. 现在你不能删除它。

例子:

# dd if=/dev/zero of=readonly.img bs=1024 count=1024
# mkfs.ext2 readonly.img
# mkdir readonlyfolder
# mount readonly.img readonlyfolder/
# echo "can't delete this" > readonlyfolder/permanent.txt
# umount readonlyfolder
# mount -o ro readonly.img readonlyfolder
# cat readonlyfolder/permanent.txt 
can't delete this
# rm readonlyfolder/permanent.txt 
rm: cannot remove `readonlyfolder/permanent.txt': Read-only file system
Run Code Online (Sandbox Code Playgroud)

  • `mount -o remount,rw readonlyfolder/ && rm readonlyfolder/permanent.txt` (3认同)
  • 更进一步,您可以使用压缩和只读的 `squashfs` 或 `cramfs`。它需要一个特殊的工具来构建文件系统。 (3认同)

小智 7

您还应该为该文件创建多个硬链接。这些应该位于普通用户无法访问的各个位置。

这样,即使他们确实设法覆盖了您的 chattr 保护,数据仍将保留,您可以轻松地将其恢复到您的应用程序正在查找的位置。

  • 硬链接不会保护文件的内容。 (11认同)
  • @barbecue 如果文件以应用程序查找的名称取消链接,则该文件的内容是否以其他名称存在并不重要。对于查找具有预期名称的文件的任何内容,该文件仍然已被删除。 (2认同)

poi*_*ige 7

Linux 有所谓的绑定挂载选项,这是一个非常强大且有用的功能,需要了解

%  cd $TMP && mkdir usebindmountluke && cd usebindmountluke
%  echo usebindmountluke > preciousfile
%  sudo mount -B preciousfile preciousfile
%  sudo mount -oremount,ro preciousfile
%  echo sowhat > preciousfile
zsh: read-only file system: preciousfile
%  rm preciousfile
rm: cannot remove ‘preciousfile’: Read-only file system
Run Code Online (Sandbox Code Playgroud)

— 这里所做的是绑定挂载文件到它自己(是的,你可以在 Linux 中这样做),然后它在 R/O 模式下重新挂载。当然,这也可以对目录进行。


Kev*_*vin 5

其他人已经按照你的要求回答了你的问题。正如@Sven 在评论中提到的,问题的一般解决方案是“如何确保我永远不会丢失文件?” 是创建文件的备份。制作文件的副本并将其存储在多个位置。此外,如果文件非常重要,并且您的公司有使用备份服务备份重要数据的策略,您可能会考虑将此文件包含在服务中。

  • 嗯,当然,文件会定期备份,我只是想要另一层保护,以防止有时在具有 root 用户权限的盒子上工作的用户。 (2认同)

sch*_*sch 5

在 Linux 上,不可变标志仅在某些类型的文件系统上受支持(大多数本地文件系统,如ext4, xfs, btrfs...)

在不支持它的文件系统上,另一种选择是以只读模式绑定挂载文件。这必须分两步完成:

mount --bind file file
mount -o remount,bind,ro file
Run Code Online (Sandbox Code Playgroud)

不过,这必须在每次启动时完成,例如通过/etc/fstab.