第3章 审计规则编写基础

本章聚焦审计规则缺失或配置错误的排查路径。以“审计日志中无关键事件”为起点,系统性地诊断规则缺失类型,依次解决文件监控、系统调用监控、用户登录监控三类规则的编写与加载问题,并建立永久规则配置的预防机制。

审计规则缺失问题排查六阶段流程 审计规则缺失问题排查六阶段流程 🔍 现象识别 审计日志缺失关键事件 安全监控出现盲区 📊 数据采集 auditctl -l 查看规则 检查 auditd 服务状态 ⚙️ 原因定位 对比期望监控项 识别缺失规则类型 🛠️ 修复动作 文件监控 -w 系统调用 -a 登录监控规则 ✅ 复测 触发监控事件 ausearch 验证日志 🛡️ 预防 永久规则 /etc/audit/rules.d/ 定期审查与版本管理 📌 排查路径:现象 → 采集 → 定位 → 修复 → 复测 → 预防 核心工具:auditctl / ausearch / aureport

3.1 现象识别

典型表现:安全事件响应过程中,发现审计日志中缺少预期记录——文件被篡改无记录、可疑系统调用无迹可查、异常登录行为无法追溯。直接后果是安全监控出现盲区,事件溯源链断裂。

诊断判断规则: 若出现以下任一情形,可初步判定审计规则配置缺失或错误:
  • 文件完整性类:明知某文件被修改,但 ausearch -f /path/to/file 返回空。
  • 系统调用类:进程执行了敏感操作(如 open、execve),但 ausearch -sc open 无对应记录。
  • 登录行为类:存在 SSH 登录失败记录,但 ausearch -m USER_LOGIN 或 ausearch -f /var/log/faillog 无输出。

3.2 数据采集

执行以下命令收集当前审计系统的状态与规则列表,为原因定位提供依据。

检查项命令预期输出/说明
auditd 服务状态
systemctl status auditd
Active: active (running)
当前生效规则列表
auditctl -l
列出所有已加载规则,若无规则则输出 No rules
审计日志最近事件
ausearch --start recent -m ALL | head -30
显示最近 30 条审计记录
规则文件内容(永久)
cat /etc/audit/rules.d/*.rules
查看已配置的永久规则
审计缓冲区状态
auditctl -s
显示 enabled 1 且 loss 0 为正常
数据采集避坑: 使用 auditctl -l 查看的是当前内核加载的规则,而 /etc/audit/rules.d/ 下的文件是永久规则。两者可能不同——重启后永久规则才会全部生效。排查时务必同时检查两处。

3.3 原因定位

将采集到的规则列表与期望监控项进行对比,按以下故障树逻辑判断缺失类型。

规则缺失类型故障树:
审计日志缺失关键事件
├── 文件/目录监控规则缺失
│   └── 检查点: auditctl -l | grep '\-w' 是否覆盖目标路径
├── 系统调用监控规则缺失
│   └── 检查点: auditctl -l | grep '\-S' 是否覆盖目标系统调用
├── 用户登录监控规则缺失
│   └── 检查点:
│       ├── 文件监控: auditctl -l | grep 'faillog\|lastlog\|wtmp'
│       └── 系统调用: auditctl -l | grep 'pam_tty_audit\|execve.*login'
└── 规则已配置但未生效
    └── 检查点: auditd 服务是否运行; 规则文件语法是否正确
现象可能原因诊断命令
文件被修改但无审计记录缺少 -w 文件监控规则
auditctl -l | grep -w /etc/passwd
进程执行敏感调用无记录缺少 -a ... -S 系统调用规则
auditctl -l | grep -S open
SSHD 登录失败无记录缺少登录相关监控规则
auditctl -l | grep -E 'faillog|lastlog|login'
所有事件均无记录auditd 未运行或内核审计禁用
systemctl status auditd; auditctl -s

3.4 修复动作

根据定位出的缺失规则类型,执行对应的规则添加操作。以下是三类核心监控规则的编写规范与示例。

3.4.1 文件/目录监控规则

使用 -w 参数监控文件或目录的读、写、执行、属性变更。

# 语法: -w 路径 -p 权限掩码 -k 键名
# 权限掩码: r=读, w=写, x=执行, a=属性变更

# 示例:监控 /etc/passwd 的写和属性变更
auditctl -w /etc/passwd -p wa -k passwd_changes

# 示例:监控 /etc/shadow 的所有访问
auditctl -w /etc/shadow -p rwxa -k shadow_access

# 示例:监控 /var/www/html 目录的写操作(递归)
auditctl -w /var/www/html -p w -k web_write

3.4.2 系统调用监控规则

使用 -a 参数在规则列表末尾添加系统调用过滤规则。

# 语法: -a action,list -S syscall_name [-F field=value] -k key
# action 通常为 always, list 通常为 exit

# 示例:监控 open 系统调用(文件打开)
auditctl -a always,exit -S open -F arch=b64 -k file_open

# 示例:监控 execve 系统调用(程序执行)
auditctl -a always,exit -S execve -k process_exec

# 示例:监控 bind 系统调用(端口绑定),只关注 443 端口
auditctl -a always,exit -S bind -F addr=0.0.0.0:443 -k bind_443
系统调用规则性能考量: 高频系统调用(如 open、read、write)会增加审计日志量。生产环境中应搭配 -F 字段过滤缩小范围,避免日志洪泛导致磁盘 I/O 瓶颈。

3.4.3 用户登录监控规则

登录行为涉及身份认证和会话创建,需要从文件监控和系统调用两个维度覆盖。

# 维度一:监控登录相关文件
auditctl -w /var/log/faillog -p wa -k login_failures
auditctl -w /var/log/lastlog -p wa -k login_state
auditctl -w /var/log/wtmp -p wa -k login_history

# 维度二:监控登录相关的系统调用(PAM 审计)
auditctl -a always,exit -S pam_tty_audit -k pam_login

# 维度三:监控 SSH 和 login 程序执行
auditctl -a always,exit -S execve -F path=/usr/sbin/sshd -k sshd_exec
auditctl -a always,exit -S execve -F path=/bin/login -k login_exec
规则类型监控对象auditctl 参数模式典型示例
文件/目录监控文件或目录的访问/修改-w 路径 -p 权限 -k 键名
-w /etc/passwd -p wa -k passwd
系统调用监控系统调用的执行-a always,exit -S 调用名 -k 键名
-a always,exit -S open -k open
用户登录监控登录尝试与状态变化文件监控 + 系统调用组合
-w /var/log/faillog -p wa -k logins

规则加载与生效

# 方式一:立即加载临时规则(重启后失效)
auditctl -R /path/to/rule_file.rules

# 方式二:加载单条规则
auditctl -w /etc/crontab -p wa -k crontab_changes

# 验证加载是否成功
auditctl -l | grep crontab_changes

3.5 复测

规则添加后,必须通过实际触发事件来验证规则是否生效。以下为三类规则的标准复测方法。

复测判断规则: 执行触发动作 → 等待 2-3 秒(审计事件异步写入)→ 使用 ausearch 查询 → 确认记录出现。若三次复测均无记录,则规则未生效。
规则类型触发动作验证命令
文件监控
echo "test" >> /etc/passwd
ausearch -f /etc/passwd --start recent -i | tail -10
系统调用监控
touch /tmp/test_audit_file
ausearch -sc open -F path=/tmp/test_audit_file --start recent
登录监控
ssh localhost -l nonexistent
(触发失败登录)
ausearch -f /var/log/faillog --start recent -i
# 通用验证流程
# 步骤1:触发事件
echo "audit_test" > /tmp/audit_test_file
# 步骤2:查询审计日志
ausearch -f /tmp/audit_test_file --start recent -i
# 步骤3:若为空,检查规则是否在列表中
auditctl -l | grep /tmp/audit_test_file
# 步骤4:检查审计服务状态
systemctl status auditd
复测常见陷阱: 部分文件系统(如 tmpfs、overlay)可能不在审计监控范围内。始终先在常规路径(如 /etc、/var/log)下做复测,排除路径特殊性的干扰。

3.6 预防

将临时规则固化到永久规则文件中,确保重启后规则自动加载,并建立规则管理规范。

永久规则配置

# 规则文件存放目录:/etc/audit/rules.d/
# 建议按用途拆分文件,便于管理
# 文件命名示例:
#   - 00-base.rules        (基础规则)
#   - 10-file-monitor.rules(文件监控规则)
#   - 20-syscall.rules     (系统调用规则)
#   - 30-login.rules       (登录监控规则)

# 示例:/etc/audit/rules.d/10-file-monitor.rules
-w /etc/passwd -p wa -k passwd_changes
-w /etc/shadow -p wa -k shadow_changes
-w /etc/selinux/config -p wa -k selinux_config

# 示例:/etc/audit/rules.d/30-login.rules
-w /var/log/faillog -p wa -k login_failures
-w /var/log/lastlog -p wa -k login_state
-a always,exit -S pam_tty_audit -k pam_login

# 加载永久规则
augenrules --load
# 或
auditctl -R /etc/audit/rules.d/*.rules

# 验证所有规则已加载
auditctl -l | wc -l

规则管理预防清单

  • 语法检查: 在加载前使用 auditctl -R 试加载,观察是否有错误输出。
  • 规则版本化: 将 /etc/audit/rules.d/ 纳入 Git 或类似版本控制系统,记录每次变更。
  • 定期审查: 每月执行 auditctl -l 导出规则清单,与安全基线比对,移除冗余规则。
  • 日志容量规划: 根据规则数量预估日志增长率,调整 /etc/audit/auditd.conf 中的 max_log_file 和 num_logs。
  • 重启验证: 每次修改永久规则后,执行 systemctl restart auditd; auditctl -l 确认规则在重启后仍然生效。
预防核心原则: 审计规则是安全监控的“传感器”。传感器失效,后续所有数据分析、溯源、合规报告都将失去基础。务必把审计规则配置纳入变更管理流程,任何涉及文件路径、系统调用、登录机制的应用变更,都必须同步评估审计规则的更新需求。