chattr +i 是唯一能从内核 VFS 层拦截所有 write/unlink/rename 操作的硬锁手段,可防止 root 权限下篡改 /etc/passwd 等关键文件,但仅适用于 ext4/xfs 本地文件系统,且需严格按列表锁定、验证并闭环维护。

黑客一旦获得 root 权限,就能随意覆盖 /etc/passwd、/etc/shadow、/etc/sudoers 等核心配置文件,植入后门或清空权限体系——chattr +i 是唯一能从内核 VFS 层拦截所有 write/unlink/rename 操作的硬锁手段,连 root 执行 echo > 或 rm 命令都会返回 Operation not permitted。
确认前提条件再动手
跳过这一步,后续所有操作都可能引发系统瘫痪:运行 df -T /etc,确保输出中文件系统类型为 ext4 或 xfs;非本地文件系统(如 NFS、tmpfs、FAT)完全不支持 +i 属性,强行执行不会报错但实际无效。
用 lsattr /etc/passwd 查看当前状态,确认输出不含 i 字符(例如显示 ----------------e--- /etc/passwd),否则说明文件已被锁定,需先解锁才能继续下一步。
执行 cp /etc/sudoers /etc/sudoers.bak && chattr +i /etc/sudoers.bak —— 备份必须同步加锁,否则攻击者可直接覆盖备份文件。
逐个锁定必须保护的核心文件
只锁定静态、极少变更、改错即导致系统不可用的文件,严禁对整个 /etc 目录递归加锁(chattr -R +i /etc 会阻断包管理器、systemd、SSH 密钥生成等所有写入行为)。
以 root 身份执行以下命令:
chattr +i /etc/passwd /etc/shadow /etc/group /etc/gshadow /etc/sudoers /etc/fstab /etc/ssh/sshd_config /boot/grub2/grub.cfg
这条命令一次性设置全部关键文件的不可变属性,【必须严格按此列表执行,漏掉 /etc/shadow 或 /etc/sudoers 就等于留出 root 后门】。
立即验证效果:运行 lsattr /etc/passwd /etc/shadow /etc/sudoers,每行开头都应显示 ----i--------e---,若任一文件缺少 i,则说明加锁失败,需检查该文件是否被其他进程占用或路径拼写错误。
验证防护是否真正生效
方法一:破坏性测试
执行 echo "test" >> /etc/passwd,正确结果必须是 bash: /etc/passwd: Operation not permitted;如果静默成功或报 Permission denied,说明防护未生效。
方法二:模拟攻击动作
尝试用 root 删除:rm /etc/shadow → 应返回 Operation not permitted;尝试重命名:mv /etc/sudoers /etc/sudoers.old → 同样报错;这两步任一成功,都意味着 +i 未起作用。
注意:不要在生产环境直接测试 rm -f,因为某些 shell 优化可能导致提示信息被吞掉,务必用 >> 或 mv 显式触发系统调用。
日常维护时安全修改文件的闭环流程
第一步:临时解锁指定文件
chattr -i /etc/sudoers
第二步:用专用校验工具编辑
必须使用 visudo 修改 sudoers,它会在保存前自动执行 visudo -c 语法检查;直接 vim 编辑并保存错误语法,会导致全员无法 sudo,且因文件已解锁,错误内容将直接落盘。
第三步:编辑保存后立刻重锁
chattr +i /etc/sudoers
这三步缺一不可,【漏掉第三步等于主动解除防护,且无日志告警】。











