第3章 审计规则编写基础
本章聚焦审计规则缺失或配置错误的排查路径。以“审计日志中无关键事件”为起点,系统性地诊断规则缺失类型,依次解决文件监控、系统调用监控、用户登录监控三类规则的编写与加载问题,并建立永久规则配置的预防机制。
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 服务状态 | | Active: active (running) |
| 当前生效规则列表 | | 列出所有已加载规则,若无规则则输出 No rules |
| 审计日志最近事件 | | 显示最近 30 条审计记录 |
| 规则文件内容(永久) | | 查看已配置的永久规则 |
| 审计缓冲区状态 | | 显示 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 文件监控规则 | |
| 进程执行敏感调用无记录 | 缺少 -a ... -S 系统调用规则 | |
| SSHD 登录失败无记录 | 缺少登录相关监控规则 | |
| 所有事件均无记录 | auditd 未运行或内核审计禁用 | |
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 键名 | |
| 系统调用监控 | 系统调用的执行 | -a always,exit -S 调用名 -k 键名 | |
| 用户登录监控 | 登录尝试与状态变化 | 文件监控 + 系统调用组合 | |
规则加载与生效
# 方式一:立即加载临时规则(重启后失效)
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 查询 → 确认记录出现。若三次复测均无记录,则规则未生效。
| 规则类型 | 触发动作 | 验证命令 |
|---|---|---|
| 文件监控 | | |
| 系统调用监控 | | |
| 登录监控 | (触发失败登录) | |
# 通用验证流程
# 步骤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确认规则在重启后仍然生效。
预防核心原则: 审计规则是安全监控的“传感器”。传感器失效,后续所有数据分析、溯源、合规报告都将失去基础。务必把审计规则配置纳入变更管理流程,任何涉及文件路径、系统调用、登录机制的应用变更,都必须同步评估审计规则的更新需求。