单纯靠 auditd 日志文件权限控制无法防住本地 root 篡改或清空,因 root 天然拥有全部操作权;真正有效防护需锁定日志生成源头、分离存储路径、引入内核级写入约束,包括启用 auditd 原生远程转发、挂载只读远程存储、用 auditd 规则自身监控日志文件及进程异常。

单纯靠 auditd 自身日志文件权限控制,无法防住本地 root 篡改或清空 —— 因为 root 天然拥有对 /var/log/audit/audit.log 的全部操作权。真正有效的防护必须绕过“日志文件本身”,转而锁定日志生成源头、分离存储路径、并引入不可绕过的内核级写入约束。
auditd 日志文件权限再严也挡不住 root rm -f
很多人给 /var/log/audit/audit.log 设 chattr +a(仅追加)甚至 +i(不可变),但这是危险且无效的:
-
+i会直接导致auditd无法写入,服务崩溃; -
+a可被 root 用chattr -a解除,毫无意义; - root 可直接
rm -f /var/log/audit/audit.log && touch /var/log/audit/audit.log,日志从物理层消失; - 更隐蔽的是清空:
cat /dev/null > /var/log/audit/audit.log,连时间戳都不变。
必须启用 auditd 的远程日志转发(不走 syslog)
auditd 原生支持通过 audispd 插件将事件实时发往远程 TCP/UDP 端口,该机制独立于 rsyslog 或 journal,且在内核事件捕获后立即触发,比任何用户空间日志服务都早一步。
- 编辑
/etc/audisp/plugins.d/syslog.conf,设active = no(禁用 syslog 转发); - 启用
/etc/audisp/plugins.d/af_unix.conf或af_remote.conf; - 若用
af_remote:设active = yes,args = 10.10.20.5:60005(指向专用日志服务器); - 远程接收端必须是另一台**非审计主机**(如专用 SIEM 或只读日志归集节点),且该主机禁止 root 登录、禁用 shell、仅开放指定端口;
- 关键点:转发发生在
auditd进程内,root 即使 kill 掉auditd,只要规则已加载,内核仍会缓存事件直到进程恢复或缓冲区满——但远程转发能极大压缩这个窗口。
强制日志写入只读挂载的远程 NFS 或 CIFS
如果暂时无法部署远程 TCP 接收端,次优解是把日志目录挂载为只读远程存储,让本地 root 无法修改文件内容(但可 umount):
- 在日志服务器上导出只读 NFS:选项含
ro,sync,no_root_squash(注意no_root_squash是必要妥协,否则 auditd 写不进); - 客户端挂载时加
ro,hard,intr,nolock,并在/etc/fstab中设noauto,x-systemd.automount避免启动卡死; - 修改
/etc/audit/auditd.conf中log_file = /mnt/audit/audit.log; - 验证:以 root 执行
echo test > /mnt/audit/audit.log应失败;ls -l /mnt/audit/显示属主为root:root但权限为rw-r--r--,实际因挂载只读而失效; - 风险提示:此法仍可被 root 卸载(
umount /mnt/audit),所以必须配合监控脚本每 5 分钟检查挂载状态,并告警。
用 auditd 规则自身监控日志文件和 auditd 进程异常
防御的最后一道本地防线,是让 auditd “看住自己”:
- 监控日志文件路径本身:
-w /var/log/audit/audit.log -p wa -k audit_log_access(记录所有 open/write/unlink); - 监控 auditd 主程序:
-w /sbin/auditd -p x -k auditd_exec(防替换二进制); - 监控配置文件:
-w /etc/audit/auditd.conf -p wa -k auditd_conf; - 监控规则加载行为:
-w /sbin/auditctl -p x -k auditctl_exec; - 最关键的一条:监控
systemctl restart auditd类操作:-a always,exit -F path=/usr/bin/systemctl -F arg=/bin/systemctl -F argc=3 -F a2=auditd -F a3=restart -k auditd_restart(需根据实际 systemctl 路径调整)。
这些规则本身必须写入 /etc/audit/rules.d/immutable.rules 并用 augenrules --load 加载,且该文件权限设为 600、属主 root:root —— 它们不是防 root,而是让 root 的每一次擦除动作都留下可追溯痕迹。真正的难点从来不是“能不能删”,而是“删的时候有没有被记下来”。











