3. 审计框架介绍:Linux审计系统架构、auditd组件、内核审计子系统

Linux 审计系统是内核级安全事件采集与记录的基础设施,它不依赖第三方软件,而是由内核审计子系统、用户空间守护进程和规则管理工具三层构成。理解这一架构是进行系统调用审计日志分析的前提。

3.1 三层架构总览

Linux 审计系统采用“内核采集 — 用户态守护进程 — 规则管理”的分层设计。内核审计子系统负责捕获系统调用和内核事件;auditd 守护进程负责接收、过滤、写入日志;auditctl 等工具负责加载规则和控制行为。

架构要点: 内核审计子系统独立于 LSM(Linux Security Module),不依赖 SELinux 或 AppArmor,可单独启用。审计日志默认写入 /var/log/audit/audit.log。
Linux 审计系统三层架构 用户空间管理工具 auditctl(规则管理) | ausearch(日志查询) | aureport(报告生成) auditd 守护进程(用户空间) 接收内核事件 → 规则过滤 → 写入 audit.log 内核审计子系统(kauditd) 系统调用拦截 | 事件上下文采集 | 通过 netlink 发送至 auditd

3.2 内核审计子系统(kauditd)

内核审计子系统是审计能力的源头,编译进内核(CONFIG_AUDIT=y)后常驻运行。它不依赖任何用户态进程,即使 auditd 未启动,内核仍可缓存事件。

组件 功能 关键参数
系统调用拦截点 在 syscall 入口/出口处插入审计钩子 audit_enabled(sysctl)
事件上下文采集 记录 UID、GID、PID、SID、系统调用号、参数、返回值 audit_backlog_limit
netlink 通信 通过 AF_NETLINK 套接字将事件发送至 auditd audit_rate_limit
缓冲区管理 内核事件队列,防止丢失 /proc/sys/kernel/audit_backlog_limit
排查提示: 若 auditd 未运行,内核事件会堆积在 skb 队列中。当队列满时,内核会丢弃新事件并记录 audit: backlog limit exceeded 内核日志。

3.3 auditd 守护进程

auditd 是用户空间的核心组件,负责从内核接收审计事件、执行规则过滤、写入磁盘日志文件,并可触发远程日志转发或执行脚本。

3.3.1 工作流程

  1. 接收: 通过 netlink 套接字读取内核发送的审计事件。
  2. 过滤: 根据 /etc/audit/audit.rules 中的规则判断是否记录。
  3. 格式化: 将事件转换为标准审计日志格式(type=... msg=...)。
  4. 写入: 追加到 /var/log/audit/audit.log。
  5. 分发: 可选通过 audispd 插件转发至 syslog、远程服务器或执行脚本。
auditd 事件处理流程 内核审计事件 netlink 套接字接收 规则过滤(audit.rules) 写入 /var/log/audit/audit.log

3.3.2 关键配置文件

文件路径 用途 典型内容
/etc/audit/auditd.conf 守护进程行为配置 日志文件大小、保留轮转、磁盘空间告警
/etc/audit/audit.rules 审计规则定义 -w /etc/passwd -p wa -k passwd_change
/etc/audit/plugins.d/ audispd 插件配置 syslog 转发、远程日志服务器

3.4 审计规则体系

审计规则决定哪些系统调用或文件操作被记录。规则分为三类:

  • 文件系统规则(-w): 监控特定文件或目录的读、写、执行、属性修改。
  • 系统调用规则(-a): 监控特定系统调用及其参数,可基于 UID、PID、成功/失败等条件过滤。
  • 可执行文件规则(-x): 监控特定程序的执行。
规则加载顺序: auditctl -R /etc/audit/audit.rules 按行顺序加载。规则数量过多会增大内核审计缓冲区压力,建议控制在 200 条以内。

3.5 审计日志格式

审计日志每行以 type= 开头,包含事件类型、时间戳、序列号、系统调用信息等字段。典型格式如下:

type=SYSCALL msg=audit(1710000000.123:456): arch=c000003e syscall=59 success=yes exit=0
  a0=7f8c4a0b2e00 a1=7f8c4a0b2f00 a2=7f8c4a0b3000 a3=7f8c4a0b3100
  items=2 ppid=1234 pid=5678 auid=1000 uid=0 gid=0 euid=0 suid=0 fsuid=0
  egid=0 sgid=0 fsgid=0 tty=pts0 ses=1 comm="bash" exe="/usr/bin/bash"
  key="exec_shell"
字段 含义 安全分析用途
syscall=59 系统调用号(59 = execve) 识别进程执行行为
success=yes 系统调用是否成功 区分攻击尝试与成功利用
auid=1000 登录用户 ID(不可伪造) 追溯真实用户身份
key="exec_shell" 规则关联键值 快速过滤特定事件类别

3.6 审计系统状态检查

运维中常用以下命令确认审计系统运行状态:

# 检查 auditd 进程状态
systemctl status auditd

# 查看当前审计规则
auditctl -l

# 查看内核审计状态
auditctl -s

# 实时查看审计日志(tail 模式)
ausearch --tail
安全基线检查项: 生产环境应确保 auditd 开机自启、audit_backlog_limit 不低于 8192、日志轮转策略保留至少 90 天。

3.7 架构总结

Linux 审计系统的三层设计实现了安全事件采集与管理的解耦:内核专注高性能捕获,auditd 专注可靠记录,管理工具专注灵活查询。理解这一架构是后续章节中分析系统调用审计日志、溯源安全事件的基础。

审计系统三层协作关系 用户空间工具 auditctl / ausearch auditd 守护进程 接收 / 过滤 / 写入 内核审计子系统 kauditd / 系统调用钩子 数据流方向 系统调用 → 内核审计子系统捕获 → netlink 发送 → auditd 接收过滤 → audit.log 管理员通过 auditctl 加载规则,通过 ausearch 查询日志