使文件在 Linux 上只读,即使对于 root

Mad*_*dno 6 linux command-line permissions files

我知道chattr +i filename使文件对所有用户只读的命令。但是,问题是我可以通过使用chattr -i filename.

有没有办法让系统上的每个人都可以读取文件,但任何人都不能写入,即使是根用户也不能写入,并且无法返回(无法再次使其可写入)?

ilk*_*chu 17

把它放在 CD 或 DVD 上。曾经可写的那种,而不是可擦除的。或者其他类型的只读设备。

好吧,我想你想的软件解决方案,所以这里有一些想法:你可能禁用系统调用创建一个SELinux的规则集(*)是chattr用途,即使是根。另一种可能性是使用功能:设置+i需要CAP_LINUX_IMMUTABLE功能,因此如果您可以安排所有进程的功能边界集不包括该功能,那么没有人可以更改这些标志。但是您需要支持init才能将其应用于所有流程。Systemd可以做到这一点,但我认为需要为每个服务单独完成。

(* 也许它是一个ioctl替代。)

但是,如果您这样做,请记住通常的 root 可以从原始设备修改文件系统(这就是debugfs目的),因此您也需要防止这种情况,以及防止修改内核(加载模块)。可以使用kernel.modules_disabledsysctl阻止加载模块,但我不确定是否可以阻止访问原始设备。并使所有相关的配置文件也是不可变的。

无论如何,在那之后,您还需要防止更改系统启动方式,否则有人可以使用允许覆盖上述限制的内核重新启动系统。

  • 并且不要忘记`mount --bind modified-file original-file`,它通常会获得与修改文件相同的结果,而实际上没有这样做 (7认同)

小智 5

您想要的是强制访问控制。它允许您指定一组权限,内核不允许覆盖这些权限,即使是 root 也不允许覆盖这些权限。SELinux 是一个著名的此类系统,Smack是另一个例子,AppArmor 是第三个此类系统。在 Linux 中,它们被实现为Linux 安全模块,这是一种通用工具,用于控制传统类 UNIX 安全模型之外的访问。除了现有的通用系统之外,您当然可以创建自己的用于特殊目的的系统。

当然,root 能够打开或关闭整个设施或更改文件的 MAC 权限,其中一些系统甚至允许将这些功能授予非 root 用户。但是,根据系统的不同,也可以禁用此功能。我知道 SELinux 和 Smack 使这成为可能;我怀疑所有 LSM 都这样做。一旦禁用,恢复该功能的唯一方法是重新启动内核。然后,您将希望引导过程在启用用户访问之前禁用该功能。如果您的内核和启动过程是安全的,则只能通过物理删除存储介质来更改此类配置(至少在理论上)。

例如,如果您使用 SMACK,您可以执行以下操作:

chsmack -a _ <file>
Run Code Online (Sandbox Code Playgroud)

这会将文件设置为具有特殊标签“_”,该标签仅允许读取或执行访问,但不允许写入。现在,即使是 root 也无法写入此文件(一旦 SMACK 已被激活并且安全覆盖功能已被禁用,如上所述)。

但是,您还必须确保您的内核是安全的。默认情况下,root很容易颠覆内核,因为内核信任root用户。如果 root 只能删除安全模块,那并没有多大帮助。此处提供了此类方法的列表,但请注意,此类列表不可能真正完整地适用于所有情况。

最后,根据您的情况,您可能需要保护启动过程。对于拥有唯一物理访问权限的计算机,可能不需要这样做,但为了获得最大的安全性,您确实需要加密的文件系统和安全的内核启动方式,例如 UEFI 安全启动。