保障audit.log完整性与实时性的关键是让auditd独立运行、隔离I/O、精准配置规则并启用copytruncate轮转。auditd须脱离syslog,独占磁盘路径,设flush=sync,禁用rsyslog转发;用-augenrules加-k标签分类监控敏感文件、特权命令和权限提升事件;logrotate需配copytruncate、maxsize与postrotate通知机制。

要保障安全审计日志的完整性与实时性,关键不是给 audit.log “提优先级”,而是让 auditd 本身独立运行、不受 syslog 类服务调度影响,并通过资源隔离、日志路径专管和事件触发机制来确保关键审计事件不丢失、不延迟。
auditd 必须独立于 syslog 运行
auditd 是内核级审计子系统,它直接从内核接收事件,写入自己的日志文件(默认 /var/log/audit/audit.log),完全不经过 rsyslog 或 journald。这点必须明确——你不能也不该试图用 syslog 的“优先级”去控制 audit 日志。
- auditd 自带缓冲队列和同步写入策略,配置在 /etc/audit/audit.conf 中,例如:
flush = sync(强制同步写入,牺牲一点性能换确定性)
freq = 20(每20条刷一次磁盘,若设为1则每条都刷) - 禁止将 audit.log 转发给 rsyslog:不要在 rsyslog 配置里添加
input(type="imfile" File="/var/log/audit/audit.log")类规则,否则会引入竞争和延迟。
限制 auditd 日志路径的 I/O 干扰
audit.log 持续高频写入,若与其他日志共用同一磁盘或分区,可能因 I/O 拥塞导致写入阻塞甚至丢事件。实战中应做物理或逻辑隔离:
- 将 /var/log/audit 单独挂载到独立磁盘或高速 SSD 分区;
- 设置挂载选项:
noatime,nodiratime,barrier=1,减少元数据开销; - 确认 auditd 进程使用 ionice -c 1 -n 0(实时类 I/O 调度)启动(可通过 systemd service 文件覆盖)。
用 augenrules + key 标签实现精准捕获与快速检索
审计规则本身决定了哪些事件会被记录。不加区分地全量监控会拖慢系统,而漏掉关键行为又等于没审。重点监控以下三类:
-
敏感文件变更:如
-w /etc/shadow -p wa -k identity_files; -
特权命令执行:如
-a always,exit -F arch=b64 -S execve -F uid!=1000 -k privileged_exec(排除普通用户); -
登录与权限提升:如
-a always,exit -F arch=b64 -S setuid,setgid,setreuid,setregid -k auth_privilege。
所有规则统一打 -k 标签,后续用 ausearch -k identity_files 可毫秒级定位,避免全盘扫描。
强制日志轮转与防丢保护双机制
auditd 不自带归档压缩,必须靠 logrotate 配合,但默认配置可能丢最后一段日志。正确做法是:
- 在 /etc/logrotate.d/auditd 中启用 copytruncate(先拷贝再清空原文件,避免 auditd 写入中断);
- 设置 maxsize 50M + rotate 12,防止单次轮转过大;
- 添加 postrotate 脚本调用
kill -USR1 $(cat /var/run/auditd.pid 2>/dev/null),通知 auditd 重打开新日志文件; - chmod 600 /var/log/audit/*,chown root:root,禁用非 root 读取,防篡改。

















