应使用chattr +a锁定日志文件:只允许追加写入,禁止删除、覆盖和截断;+i会彻底禁止所有写操作,导致日志服务崩溃。/var/log/messages等普通日志文件适用+a,/var/log/journal/等目录或需truncate的文件不可用。

chattr +a 和 +i 的区别到底该用哪个
锁定日志文件,核心是阻止删除和覆盖,但日志还得能追加写入——+i 会彻底禁止所有写操作(包括 echo "x" >> /var/log/secure),直接让日志服务崩溃;+a 才是正解:只允许追加,不允许截断、删除、重命名或覆写。
常见错误现象:systemd-journald 或 rsyslog 报 Permission denied,其实是误用了 chattr +i。
-
chattr +a /var/log/secure—— 正确,日志可追加,不可删改 -
chattr +i /var/log/secure—— 错误,连logger命令都会失败 - 对轮转后的旧日志(如
/var/log/secure.1)才考虑用+i归档锁定
哪些路径必须加 chattr,哪些加了反而坏事
不是所有日志路径都适合加锁。关键看进程是否需要修改文件元数据或 truncate —— 比如 /var/log/journal/ 是二进制结构化目录,chattr 对整个目录加 +a 无效(+a 只对普通文件生效),且 systemd-journald 会自己管理文件生命周期。
- 应加
+a的典型路径:/var/log/messages、/var/log/secure、/var/log/maillog - 不该加的:
/var/log/journal/(目录)、/var/log/lastlog(会被login截断)、/var/log/wtmp(同理) - 轮转配置(
/etc/logrotate.conf)里要确认使用copytruncate而非create,否则logrotate会因无法 unlink 老文件而失败
chattr 权限绕过风险与 root 用户限制
chattr 锁定只防普通用户和大部分恶意进程,不防 root——只要攻击者拿到 root shell,一条 chattr -a /var/log/secure 就能解锁。所以它本质是纵深防御的一环,不是银弹。
- 必须配合
lsattr定期巡检:lsattr /var/log/*.log - 不能替代文件完整性监控(如
aide或tripwire) - 某些容器环境或 systemd 管理的系统中,
/var/log可能挂载为 tmpfs 或只读,此时chattr会报Operation not supported
实际执行时最容易漏掉的三件事
很多人跑完 chattr +a 就以为完事了,结果发现日志还是被清空,或者轮转失败——往往卡在这几个细节上。
- 忘记检查 SELinux 上下文:
ls -Z /var/log/secure,若上下文异常(如被改成unconfined_u),rsyslog可能拒绝写入,需用restorecon -v /var/log/secure - 没处理 logrotate 的 postrotate 脚本:有些自定义脚本会
kill -HUP后手动touch日志文件,+a不影响touch,但若脚本里有> /var/log/secure这种截断操作,就会失败 - 忽略 systemd 服务重启逻辑:改完属性后,建议
systemctl kill --signal=SIGUSR1 rsyslog(而非 restart),避免服务因文件状态异常拒绝加载
真正难的不是加那条 chattr +a,而是搞清日志服务怎么写、logrotate 怎么转、SELinux 怎么拦——每个环节松一扣,锁就形同虚设。











