核心方法是使用chattr +i,它通过内核vfs层拦截write、unlink、rename等系统调用,使root也无法修改、删除或重命名文件,错误统一返回operation not permitted;比chmod 444更底层、不可绕过,适用于/etc/passwd等静态关键配置,但不可用于日志或动态文件。

要用属性阻止 Linux 文件被修改,核心方法是使用 chattr +i。它不是改权限,而是给文件打上“不可变”内核标记,连 root 都无法写、删、重命名或链接——错误统一报 Operation not permitted,比 chmod 444 或 chown 更底层、更难绕过。
为什么必须用 chattr +i,而不是 chmod
chmod 444 只控制用户空间的读写判断,root 可直接跳过;而 +i 是文件系统 inode 级属性,内核在每次 write、unlink、rename、truncate 前都会拦截。哪怕文件权限是 777,加了 +i 后 echo >、rm、mv 全部失败。
- chmod 444 /etc/passwd → root 仍可 echo "x" > /etc/passwd
- chattr +i /etc/passwd → root 执行相同命令,提示 Permission denied
- ls -l 完全不显示 +i,必须用 lsattr 查看,否则容易误以为没生效
哪些文件适合加 i 属性
只锁那些「静态、极少变更、且修改必须人工介入」的核心配置:
- /etc/passwd、/etc/shadow、/etc/group:用户身份基线,被篡改等于权限体系崩塌
- /etc/sudoers:一行写错可能导致全员失权或提权失控
- /etc/ssh/sshd_config:但加锁后 systemctl reload sshd 会失败,需先解锁再重载
- /boot/grub2/grub.cfg:启动链第一环,防持久化后门
绝对不要加在日志(/var/log/*.log)、数据库目录(/var/lib/mysql)、动态生成配置(/etc/resolv.conf)或包管理器预期覆盖的文件上——加了会导致服务崩溃或升级失败。
执行前必须检查的几件事
加错位置或时机,系统可能直接瘫痪。操作前请确认:
- 必须用 root 执行,sudo chattr +i 可以,但本质仍是 root 权限
- 文件系统支持:运行 df -T /path,输出应为 ext4 或 xfs(FAT32/NTFS 不支持)
- 备份到其他挂载点:cp /etc/sudoers /backup/sudoers.$(date +%s),因为加完 +i 后 cp 本身也会失败
- SELinux 上下文正常:ls -Z /etc/sudoers,类型应为 etc_t;若为 admin_home_t 等非标类型,+i 可能被 SELinux 静默阻断
加锁后哪些操作会失败
不是“没权限”,而是内核拒绝所有写类系统调用:
- echo "x" > file、printf "y" >&1 > file → bash: file: Permission denied
- rm file、mv file old、ln file link → Operation not permitted
- usermod -aG wheel alice → 卡住或报错(要写 /etc/group 和 /etc/gshadow)
- yum update openssh-server → 可能覆盖 /etc/ssh/sshd_config,导致 SSH 服务启动失败
对目录加 +i(如 chattr +i /etc/ssh)只禁止新建/删除/重命名子项,不影响已有文件内容读写——这点常被误解为“整个目录完全锁死”。











