审计日志系统是贯穿内核到用户空间的可信数据链,核心依赖内核 audit 子系统在系统调用入口设钩子捕获全量命令行为,经 netlink 传至 auditd 落盘,再通过 ausearch/aureport 解析,并需本地防篡改与远程集中留存保障可信性。

审计日志系统不是一层简单写文件的操作,而是一条贯穿内核到用户空间的可信数据链。真正能捕获全部命令执行行为的,只有内核级审计机制——它不依赖 shell、不绕过非交互环境、也无法被用户侧手段禁用。
内核层:audit 子系统与系统调用钩子
Linux audit 由内核原生支持,在系统调用入口处设置钩子(如 execve、openat、setuid)。当进程触发受监控的系统调用时,audit 子系统立即生成审计事件,并通过 netlink 通道发往用户空间的 auditd 守护进程。这个过程发生在特权级,不受用户环境干扰。
- 规则通过 auditctl 加载,必须指定 arch=b64(x86_64)或 arch=b32(兼容 32 位程序),否则部分调用可能漏记
- 规则需持久化到 /etc/audit/rules.d/ 目录下以
.rules结尾的文件中,否则重启即失效 - 避免在规则中过滤 uid 或 comm 字段,应在查询阶段处理,防止规则加载失败导致审计断点
用户空间层:auditd 守护进程与日志落盘
auditd 是 audit 子系统的用户空间守门人,负责接收内核事件、格式化、缓冲、写入磁盘。默认日志路径为 /var/log/audit/audit.log,采用紧凑二进制文本混合格式,不可直接用 cat 查看。
- 建议对日志文件启用 append-only 属性:chattr +a /var/log/audit/audit.log,防止被恶意截断或覆盖
- auditd 自带轮转能力,但更推荐配合 logrotate 管理归档策略(如按大小、时间切分,保留 90 天)
- 可通过 systemctl status auditd 确认服务状态;ausearch -m avc 可查 SELinux 拒绝事件
日志解析与查询:从原始记录到可读证据
原始 audit.log 不具备可读性,必须使用配套工具链还原上下文。核心组合是 ausearch(条件检索) + aureport(结构化输出)。
- 查某用户所有命令:sudo ausearch -u username -m execve --raw | aureport -f -i
- 查某次登录会话(session ID 可从 last 或 loginuid 字段获取):sudo ausearch -m event --session 12345
- 查含敏感操作的 execve 记录:sudo ausearch -m execve | grep -i -E "(passwd|sudo|ssh)"(注意这是后置文本过滤)
增强可信性:防篡改与集中化
本地日志再全也存在被清除风险。生产环境必须构建“本地采集 + 远程留存”双轨机制。
- 配置 rsyslog 或 journald 将 audit 日志转发至远程 SIEM(如 Loki、ELK、Splunk),使用 TLS 加密和认证确保传输安全
- 可在 auditd 配置中启用 flush = incremental 和 freq = 20,减少事件丢失窗口
- 定期校验日志完整性(如用 aureport --key 标记关键事件,配合哈希存证)

















