防范审计日志被篡改的核心是“删了也白删、改了就留痕、读了就记录”,需叠加账户隔离、不可变属性(chattr +i)、auditd访问审计、tls外发与journald前向密封(seal=yes)四层防线,缺一不可。

防范审计日志被篡改,核心不是“让攻击者删不掉”,而是“删了也白删、改了就留痕、读了就记录”。只读权限管控只是起点,必须叠加不可变性、访问审计和外发归档三层防线,才能真正守住溯源底线。
一、账户层面:创建专用只读审计员,禁用一切交互能力
绝不能复用 root 或普通管理员账号。新建独立用户,从登录入口就切断越权可能:
- 执行 sudo useradd -m -s /usr/sbin/nologin auditlog,确保无法启动任何 shell
- 禁用密码登录,仅允许 SSH 密钥认证,并在 /etc/ssh/sshd_config 中添加专属限制:
Match User auditlog
ForceCommand /usr/local/bin/audit-viewer
AllowTcpForwarding no
X11Forwarding no - 自定义 audit-viewer 脚本,只允许执行 journalctl --no-pager -n 100、tail -n 50 /var/log/secure 等明确命令,不接受任意参数
二、文件系统层面:用不可变属性(chattr +i)锁死关键日志
即使获得 root 权限,也无法覆盖或删除已加锁的日志文件——这是对抗清空操作最硬核的手段:
- 对当前活跃日志文件执行:sudo chattr +i /var/log/auth.log /var/log/secure /var/log/messages
- 注意:启用后 logrotate 会失败,必须在 /etc/logrotate.d/rsyslog 的 postrotate 段加入:
chattr -i /var/log/auth.log
chattr -i /var/log/secure
chattr -i /var/log/messages
并在 prerotate 段重新加回 +i - 验证是否生效:lsattr /var/log/auth.log 应显示 ----i---------e---
三、内核级审计:用 auditd 监控“谁动了日志”本身
权限和属性是防守,auditd 是反制——它不阻止修改,但确保每次读写删都留下带 UID、时间戳、系统调用的铁证:
- 添加规则到 /etc/audit/rules.d/log-protect.rules:
-w /var/log/auth.log -p wa -k auth_mod
-w /var/log/secure -p wa -k secure_mod
-w /var/log/messages -p wa -k msg_mod - 重载规则:sudo augenrules --load && sudo systemctl restart auditd
- 事后排查:sudo ausearch -k auth_mod | aureport -f -i,可精准定位哪个 UID 在何时执行了 open/write/unlink
四、架构级兜底:日志实时外发+前向密封(Seal=yes)
本地再严,整机沦陷就全盘失效。必须把原始日志第一时间推送到可信第三方:
- 配置 rsyslog TLS 加密转发:
*.* @@log-server.example.com:6514;RSYSLOG_SslForwardFormat
并部署受信 CA 证书,防止中间人窃听或伪造 - 启用 systemd-journald 前向安全密封:
编辑 /etc/systemd/journald.conf,设 Storage=persistent 和 Seal=yes,再运行 sudo journalctl --setup-keys
启用后,每条日志都参与哈希链计算,篡改任一记录都会导致后续校验失败(journalctl --verify 可检出)











