chattr +i 是唯一能真正阻止 root 修改或删除文件的方式,它在内核 vfs 层拦截 write、unlink、rename、truncate 等系统调用,错误统一返回 operation not permitted;而 chmod 444 仅控制 posix 权限,root 可绕过。

chattr +i 是唯一能真正阻止 root 修改或删除文件的方式,但它不是“设只读”,而是内核 VFS 层拦截所有写类元操作——加错位置或时机,系统可能直接瘫痪。
chattr +i 为什么比 chmod 444 更硬核
chmod 控制的是 POSIX 权限检查,root 可以绕过;chattr +i 是文件系统扩展属性,在内核 VFS 层直接拒绝 write、unlink、rename、truncate 等系统调用,错误统一返回 Operation not permitted。这意味着:
-
echo "x" > /etc/sudoers、rm -f /etc/passwd、mv sshd_config old全部失败 - 即使文件权限是
777,加了+i后也完全不可写 -
visudo、usermod、yum update等命令会卡住或报错,因它们内部依赖写入这些文件
哪些文件适合加 i 属性,哪些绝对不能碰
加 +i 前必须确认该文件是「静态、极少变更、且修改必须人工介入」的。典型可锁目标:
-
/etc/passwd、/etc/shadow、/etc/group:用户身份基线,被篡改等于权限体系崩塌 -
/etc/sudoers:误删一行可能导致全员无法提权,或意外开放ALL NOPASSWD -
/etc/ssh/sshd_config:但注意systemctl reload sshd会失败,需先解锁再重载 -
/boot/grub2/grub.cfg:启动链第一环,防持久化后门
以下场景加 +i 会直接导致服务异常:
- 日志文件(
/var/log/*.log):写入直接报Permission denied,rsyslog/journald 崩溃 - 数据库数据目录(如
/var/lib/mysql):mysqld 启动失败 - 由 NetworkManager、dhcpcd 等动态管理的配置(如
/etc/resolv.conf) - 任何被包管理器(yum/dpkg)预期覆盖的文件,例如
/etc/ssh/sshd_config升级时会被重写
chattr +i 实操中高频踩坑点
新手常在没验证前提下直接执行 chattr +i,结果维护时连 visudo 都打不开。关键细节:
- 必须用
root执行,sudo chattr +i可以,但本质仍是 root 权限 - 加锁前先备份到其他挂载点:
cp /etc/sudoers /backup/sudoers.$(date +%s),因为加完+i后cp也会失败 - 确认文件系统支持:
df -T /etc输出应为ext4或xfs;FAT32/NTFS 挂载点不支持 - 检查 SELinux 上下文:
ls -Z /etc/sudoers,若类型是admin_home_t等非标准类型,chattr +i可能被 SELinux 静默阻断 - 验证是否生效:
lsattr /etc/sudoers输出中必须含i字符,如----i---------e---
对目录加 +i(如 chattr +i /etc/ssh)只禁止新建/删除/重命名条目,不影响已有文件内容修改——这点常被误以为“整个目录锁死了”。
安全解锁与紧急恢复流程
临时解锁不是“先 -i → 编辑 → 再 +i”这么简单,中间存在时间窗口。正确做法:
- 先确认无服务正在热读该文件:
lsof /etc/ssh/sshd_config - 执行
chattr -i /etc/ssh/sshd_config - 立刻编辑并保存,不要做无关操作
- 编辑完成后立即重新加锁:
chattr +i /etc/ssh/sshd_config
如果已误锁且系统无法启动(如 /boot 分区也被加 +i),需进 recovery mode 或用 live USB:
mount -o remount,rw /dev/sda2 /mntchroot /mntchattr -i /etc/passwd
真正危险的是:加 +i 后不检查包管理器行为(如 rpm -V sudo)、不验证 SELinux 上下文、不对目录和文件属性分开验证(lsattr -d /etc/ssh vs lsattr /etc/ssh/*),这些才是线上事故最常发源地。











