chattr +i是唯一能真正阻止root修改文件的内核级方案,它通过vfs层拦截所有写操作(删除、重命名、截断、链接等),而chmod/chown仅作用于posix权限层,root可完全绕过。

不能靠 chmod 或 chown 真正阻止修改——它们只管 POSIX 权限,root 一挥手就绕过。要让文件连 root 都改不了,必须用 chattr +i。
chattr +i 是唯一能拦住 root 的方式
普通权限机制(比如 chmod 000)对 root 完全无效:echo "x" > file、rm file、mv file new 全都能成功。只有 chattr +i 是内核级锁,写入、删除、重命名、截断、硬链接、软链接创建全部被拦截,错误统一是 Permission denied。
- 必须用 root 或具备
CAP_LINUX_IMMUTABLE能力的用户执行,普通用户直接报Operation not permitted - 别和
chmod 000混用:后者只是权限检查层,+i 是 VFS 层拦截;叠加不增强效果,反而可能掩盖真实问题 - 解锁前必须确认无进程占用,否则
chattr -i后文件可能立刻被覆盖——先跑lsof /path/to/file或fuser -v /path/to/file
chattr +a 适合日志类文件
如果目标不是完全锁死,而是允许追加但禁止覆盖(比如日志),用 chattr +a 更合适。它不限制 echo "msg" >> log,但会拒绝 echo "reset" > log 和 truncate -s 0 log。
- 仅 root 可设置,且只在 ext4/xfs 上稳定支持;overlayfs、tmpfs、NFS 挂载点上会报
Operation not supported -
+a不影响目录本身,只作用于文件内容;想保护整个日志目录结构,得配合+i锁目录 - 查看是否生效:运行
lsattr /var/log/myapp.log,输出中含a字符即表示启用
递归锁定目录要小心路径和时机
用 chattr -R +i /etc/ssl/private 确实能锁死整个私钥目录,但后果很重:不仅子文件不可改,连 touch 新文件、mkdir 子目录、甚至 rmdir 空子目录都会失败。
-
-R会把+i应用到目录自身及其所有现有内容,但不会自动继承到未来新建的文件——新文件默认无属性 - 某些 systemd 日志服务(如
StandardOutput=append:/path)即使停了,journalctl --rotate仍可能触发重开文件句柄,导致解锁后瞬间被覆盖 - 误锁
/boot会导致 grub 无法更新内核;救援时需先mount -o remount,rw /dev/sda2 /mnt,再chroot /mnt解锁
别指望 chmod 或 umask 实现真正防护
chmod 444 或 umask 077 只影响普通用户的权限判断,root 仍可随意 chmod 644 或直接写入。它们适合日常协作场景下的“礼貌性”限制,不是安全边界。
-
chmod数字模式(如600)和符号模式(如go-w)本质相同,选哪个看习惯;但都解决不了 root 绕过问题 - 想批量设权限,
find . -name "*.conf" -exec chmod 644 {} \;可行,但请确认没误触系统关键配置(比如/etc/shadow) -
chown改属主只是调整权限作用对象,不增加防护强度;和chmod配合用才有意义
真正难的是权衡:+i 一锁就彻底,但运维成本高;+a 灵活些,却只防覆盖不防删。多数人卡在“以为 chmod 000 就够了”,结果上线后被 root 脚本清空关键配置——这锅不在命令,而在没分清权限模型和强制属性的区别。











