5.13 Linux 审计——auditd 配置与规则编写
预计阅读时间:13 分钟
📖 目录
学习目标
- 理解 auditd 与普通日志的本质区别及其在合规审计中的地位
- 掌握 auditd 架构:内核审计子系统 → auditd 守护进程 → audit.log 的完整链路
- 能够使用 auditctl 编写文件监控规则(-w/-p/-k)与系统调用规则(-S)
- 熟练运用 ausearch 按时间、用户、键值、事件类型检索审计日志
- 使用 aureport 生成用户活动、登录、文件变更等审计报表
- 了解等保 2.0 三级对审计功能的要求及 auditd 合规配置方法
核心知识
审计 vs 普通日志
| 维度 | 普通日志(syslog/journald) | 审计日志(auditd) |
|---|---|---|
| 记录内容 | 应用程序主动输出的信息 | 内核层面记录的系统调用(syscall) |
| 不可抵赖性 | 低(程序可以伪造日志) | 高(内核记录,root 也难以篡改) |
| 覆盖范围 | 取决于应用程序是否写日志 | 所有系统调用均可记录 |
| 性能开销 | 极低 | 取决于规则数量 |
| 合规要求 | 通常不满足 | 等保、PCI-DSS、SOC2 等要求使用 |
auditd 三大命令
| 命令 | 作用 | 典型用法 |
|---|---|---|
| auditctl | 管理内核审计规则(加载/查看/删除) | auditctl -w /etc/passwd -p wa -k mykey |
| ausearch | 查询 audit.log,按键值/时间/用户/系统调用过滤 | ausearch -k mykey -i -ts today |
| aureport | 生成统计报表(用户/登录/文件/系统调用) | aureport -u -i |
规则语法速查
| 参数 | 含义 | 示例 |
|---|---|---|
-w | 监控的文件或目录路径 | -w /etc/shadow |
-p | 权限组合:r=读, w=写, x=执行, a=属性变更 | -p wa |
-k | 日志键值,用于后续检索过滤 | -k etc_shadow |
-S | 监控的系统调用名称 | -S execve |
-a | 添加规则到规则列表 | -a exit,always |
知识关联
- 前置知识:2.7:日志与故障排查 日志与故障排查(journald/syslog 基础)、5.1:Linux 安全加固 Linux 安全加固(审计与合规需求)
- 后续影响:4.8:集中式日志管理 集中式日志管理(审计日志汇入 ELK/Loki)、5.12:eBPF 基础 eBPF 基础(内核可观测性进阶)
- 配套技术:auditd + SELinux + AppArmor 构成纵深安全审计体系,ausearch/aureport 是核心查询与报表工具
原理讲解
auditd 的审计管道从内核到磁盘分为三个层级:
- 内核审计子系统:Linux 内核内置的审计框架,在每次系统调用经过时根据规则决定是否生成审计记录(audit record),记录包含 syscall 编号、参数、返回值、进程信息等。
- auditd 守护进程:用户态 daemon,通过
netlinksocket 从内核收取审计事件,按/etc/audit/auditd.conf配置写入audit.log,同时通过 audispd 分发到插件(如远程 syslog)。 - 查询与分析工具:ausearch 解析
audit.log中的结构化记录进行过滤检索;aureport 聚合统计生成汇总报表。
# auditd 组件
# ┌────────┐ ┌──────────┐ ┌──────────────┐
# │ 内核 │───→│ auditd │───→│ /var/log/ │
# │ audit │ │ (守护进程)│ │ audit/ │
# │ 子系统 │ └────┬─────┘ │ audit.log │
# └────────┘ │ └──────────────┘
# │ ausearch / aureport / auditctl
# │ (查询与分析工具)
# └─→ audispd(插件分发器 → 远程日志)
审计事件的生命周期:应用程序发起系统调用 → 内核根据规则匹配 → 生成 audit record → 通过 netlink 发送 → auditd 接收 → 格式化为日志行 → 写入 audit.log(或通过 audispd 转发)。
# 查看审计子系统状态
auditctl -s
# 输出:
# enabled 1 # 是否启用
# failure 1 # 审计失败时的行为(1=printk, 2=panic)
# pid 1234 # auditd 进程 PID
# rate_limit 0 # 消息速率限制
# backlog_limit 64 # 积压限制
# lost 0 # 丢失的事件数
# backlog 0 # 当前积压
# 安装 auditd
apt install -y auditd audispd-plugins
systemctl enable --now auditd
💡 审计 vs 安全 auditd 不阻止任何操作——它只是记录。SELinux/AppArmor 是阻止的,auditd 是记录的。两者互补:SELinux 阻止+记录,auditd 做更深层的系统调用审计。
审计事件类型速览
审计记录由 type= 字段标识事件类别,掌握常用类型能大幅提高检索效率:
| 事件类型 | 含义 | 典型场景 |
|---|---|---|
SYSCALL | 系统调用记录(核心类型) | 一切规则触发的基础记录 |
PATH | 系统调用访问的文件路径 | 文件监控的路径细节 |
EXECVE | 命令执行参数(配合 -S execve) | 记录执行了哪条命令 |
USER_CMD | 用户通过终端执行的命令 | 审计用户操作 |
LOGIN | 登录/登出会话 | 登录审计 |
USER_AUTH / USER_LOGIN | 认证尝试(含失败) | 暴力破解溯源 |
AVC | SELinux 决策记录 | SELinux 排错(5.6:SELinux 与 AppArmor) |
CONFIG_CHANGE | 审计配置本身被修改 | 防审计绕过 |
DAEMON_START / DAEMON_END | auditd 启停 | 检查审计是否被关闭 |
审计记录的"不可抵赖性"来自内核层记录:审计日志文件的访问/修改用 -w 文件监控规则(如 -w /var/log/audit -p wa)记录;CONFIG_CHANGE 事件仅在审计配置本身变更(加载规则、auditctl 操作)时产生。这是普通应用日志无法替代的关键差异。
示例代码
文件监控规则
# -w 文件路径 -p 权限 -k 键值
# 监控 passwd 文件变更
auditctl -w /etc/passwd -p wa -k etc_passwd_change
# 监控系统关键文件
auditctl -w /etc/shadow -p wa -k etc_shadow
auditctl -w /etc/sudoers -p wa -k etc_sudoers
auditctl -w /etc/ssh/sshd_config -p wa -k sshd_config
auditctl -w /etc/crontab -p wa -k cron_changes
# 监控目录(递归子文件)
auditctl -w /etc/nginx/ -p wa -k nginx_config
# 查看当前所有规则
auditctl -l
# 删除单条规则(参数与添加时一致,-W 大写)
auditctl -W /etc/passwd -p wa -k etc_passwd_change
系统调用监控规则
# -a , -S -F = -k
# 监控文件删除操作
auditctl -a exit,always -S unlink -S rmdir -k deleted_files
# 监控所有命令执行
auditctl -a exit,always -S execve -k exec_log
# 仅监控失败的文件打开
auditctl -a exit,always -S open -S openat -F success!=0 -k failed_opens
永久规则配置(重启后生效)
cat <<'EOF' > /etc/audit/rules.d/security.rules
# 关键系统文件监控
-w /etc/passwd -p wa -k etc_passwd
-w /etc/shadow -p wa -k etc_shadow
-w /etc/sudoers -p wa -k etc_sudoers
-w /etc/ssh/sshd_config -p wa -k sshd_config
# 敏感目录递归监控
-w /etc/nginx/ -p wa -k nginx_config
# 系统调用监控(受限使用)
-a exit,always -S unlink -S rmdir -k file_deletion
# 限制速率(防止 DoS 打满磁盘)
-b 8192
-f 1
-r 800
# 记录失败的系统调用
-a exit,always -S open -S openat -F success!=0 -k failed_opens
EOF
# 加载规则
augenrules --load
ausearch 日志检索
# 按键值搜索
ausearch -k etc_passwd -ts today
ausearch -k nginx_config -ts 07/28/2026
# 按时间范围搜索
ausearch -ts 14:00:00 -te 15:00:00
ausearch -ts yesterday
ausearch -ts "07/29/2026 09:00:00"
# 按用户搜索(用户名或 UID)
ausearch -ua root
ausearch -ui 1000
# 按系统调用搜索
ausearch -sc execve
ausearch -sc open -sc unlink
# 按事件类型搜索
ausearch -m AVC # SELinux 拒绝事件
ausearch -m LOGIN # 登录相关
ausearch -m USER_CMD # 用户执行命令
# 人性化输出(将时间戳转为可读格式)
ausearch -k etc_passwd -i
aureport 报表生成
# 按时间分类汇总
aureport --start today --summary
aureport --start yesterday
# 用户活动报告
aureport -u -i
# 登录报告
aureport -l -i
# 文件变更报告(按键值过滤)
aureport -f -i -k etc_passwd
# 系统调用 Top 报告
aureport -s -i | head -20
# 失败事件报告
aureport --failed -i
# 完整可读报告
aureport -x -i -ts this-week
审计记录字段解读
# 一条典型的文件写入审计记录(ausearch -i 之前):
# type=SYSCALL msg=audit(1690000000.123:456): arch=c000003e syscall=257
# success=yes exit=2 a0=ffffff9c a1=558c1a2e68b0 a2=1 a3=0 items=1
# ppid=1200 pid=1234 auid=1000 uid=1000 gid=1000 euid=1000 suid=1000
# fsuid=1000 egid=1000 sgid=1000 fsgid=1000 tty=pts0 ses=3 comm="vim"
# exe="/usr/bin/vim.basic" subj=system_u:system_r:unconfined_service_t:s0
# key="etc_passwd_change"
# type=CWD msg=audit(...): cwd="/root"
# type=PATH msg=audit(...): item=0 name="/etc/passwd" inode=123456 dev=fd:01
# mode=0100644 ouid=0 ogid=0 rdev=00:00 obj=system_u:object_r:etc_t:s0
# 关键字段速读:
# syscall=257 → openat 系统调用(常见: 2=open, 59=execve, 87=unlink)
# auid=1000 → 审计用户 ID(真实登录用户,root 提权也追踪得到)
# uid/euid → 实际/有效用户 ID
# comm="vim" → 触发进程名;exe= 完整路径
# key= → 规则里定义的 -k 键值(检索索引)
# PATH 记录 → 本次调用涉及的文件(name= 路径、mode= 权限)
# 解读系统调用号(无手册时)
ausyscall 257
# 输出: openat
audispd 远程日志转发
# 审计日志必须异地备份才有合规意义
# 配置 audispd 的远程转发插件(audispd-plugins 包)
# 1. 启用远程插件
cat > /etc/audisp/plugins.d/au-remote.conf <<'EOF'
active = yes
direction = out
path = /sbin/audisp-remote
type = always
args = 60
EOF
# 2. 配置日志服务器地址与协议
cat > /etc/audisp/audisp-remote.conf <<'EOF'
remote_server = logserver.internal.example.com
port = 60
mode = tcp
queue_file = /var/spool/audit/remote.log
network_retry_time = 5
EOF
# 3. 重启 auditd 使配置生效(注意:重启会重载规则)
systemctl restart auditd
# 4. 日志服务器端:安装 rsyslog 并监听 TCP 60 端口
# /etc/rsyslog.d/audit.conf:
# module(load="imtcp")
# input(type="imtcp" port="60")
# $template AuditFile, "/var/log/audit-remote/%HOSTNAME%.log"
# :msg, contains, "audit(" -?AuditFile
# 5. 本地测试发送
logger -t AUDIT_TEST "audit(1690000000.123:456): remote forward test"
# 在日志服务器上验证
tail -f /var/log/audit-remote/$(hostname).log
常见错误
| 错误 | 现象 | 原因与解决 |
|---|---|---|
| 规则写错路径 | ausearch 查不到任何记录 | 路径必须绝对路径,目录末尾是否有 / 不影响,但必须已存在 |
忘记 -k 键值 | 检索时需要猜 what 字段,效率低 | 生产中每条规则都应加 -k,它是检索的核心索引 |
| 系统调用规则过宽 | audit.log 数秒内暴涨,磁盘写满 | 避免不加 -F 过滤的 -S open 等高频调用,先用 -r 800 限制速率 |
| 永久规则未加载 | 重启后规则丢失 | 规则写入 /etc/audit/rules.d/*.rules 后必须执行 augenrules --load |
| 磁盘写满导致系统异常 | auditd 挂起,部分操作卡顿 | 配置 max_log_file 和 disk_full_action=SUSPEND,搭配 logrotate |
ausearch 不加 -i | 时间戳显示为 Unix epoch,不可读 | 习惯加 -i 让输出人性化 |
| auditd 重启后规则消失 | auditctl 添加的是运行时规则 | 写入 /etc/audit/rules.d/ 并用 augenrules --load |
| 远程转发后本地查询不到 | 插件未启用或 auditd 未重启 | 检查 /etc/audisp/plugins.d/,auditctl -s 确认插件状态 |
ausearch 查 -m LOGIN 为空 | 某些发行版登录事件类型不同(如 USER_LOGIN) | 先 ausearch -m USER_LOGIN 或 aureport -au -i 全量浏览 |
| audit.log 中出现大量重复的 PATH 记录 | 一条系统调用携带多个 PATH 记录(多文件操作) | 属正常行为;检索时用 ausearch -i 按 SYSCALL 主记录查看 |
最佳实践
等保合规配置清单
中国等保 2.0 三级要求中,审计是必过项:
- 安全审计功能启用:auditd 运行且规则已加载
- 审计范围覆盖:用户增删改、权限变更、关键文件修改、网络配置变更
- 日志保护:
/var/log/audit/设置chmod 600,拒绝非授权访问 - 日志异地备份:通过 audispd 的 syslog 插件转发到远程日志中心
- 存储容量:配置 logrotate 或
max_log_file,防止磁盘满
auditd.conf 推荐配置
# /etc/audit/auditd.conf 关键配置
log_file = /var/log/audit/audit.log
log_format = RAW
log_group = root
max_log_file = 128 # 单个日志文件最大 128MB
num_logs = 10 # 保留 10 个轮转文件
max_log_file_action = ROTATE # 轮转而非停止
space_left = 512 # 剩余空间小于 512MB 时告警
space_left_action = SYSLOG
admin_space_left = 128
admin_space_left_action = SINGLE # 小于 128MB 切换单用户
disk_full_action = SUSPEND # 磁盘满后停止审计(不停止系统)
规则设计原则
- 够用就好:只监控真正需要审计的路径和系统调用,避免全盘监控引发性能与存储问题
- 先测试后上线:先用
auditctl临时加载规则观察日志量,确认无误后再写入rules.d/持久化 - 键值命名规范:
-k使用有意义的命名空间,如etc_passwd、ssh_config、nginx_conf,便于统一检索 - 速率限制:生产环境始终配置
-r和-b,防止审计风暴 - 日志轮转与异地备份:单机日志无合规意义,必须异地备份
合规场景对照(等保 2.0 / PCI-DSS)
| 合规要求 | auditd 落地方案 | 验证命令 |
|---|---|---|
| 审计功能启用与不可关闭 | systemd 托管 + auditd.service 常驻,规则持久化 | auditctl -s 的 enabled=1 |
| 覆盖用户/权限/配置变更 | 监控 passwd/shadow/sudoers 与 /etc 关键配置 | auditctl -l 查看规则清单 |
| 审计日志防篡改 | chmod 600 /var/log/audit/,配置 CONFIG_CHANGE 监控 | ausearch -m CONFIG_CHANGE -i |
| 日志保留期(PCI-DSS 要求 12 个月,3 个月可查) | logrotate + 异地转发 + 归档存储 | logrotate -d /etc/logrotate.d/auditd |
| 登录与认证审计 | 系统默认 LOGIN/USER_AUTH 事件 + 监控 /etc/passwd | aureport -au -i --start today |
练习题
- 安装 auditd 并启动服务,用
auditctl -s确认状态为 enabled。 - 编写一条规则监控
/etc/hosts的写和属性变更操作,键值设为etc_hosts。 - 使用 ausearch 查询今天所有键值为
etc_hosts的审计事件,以人性化格式输出。 - 使用 aureport 生成今天的失败事件汇总报表。
- 在
/etc/audit/rules.d/下创建custom.rules,写入对/etc/hosts和/etc/hostname的监控,然后执行augenrules --load加载。 - 用
ausearch -m LOGIN -i查看系统上的所有登录记录,观察哪些用户在什么时间登录过。
点击查看答案
apt install auditd audispd-plugins,systemctl start auditd && systemctl enable auditd。auditctl -s显示enabled 1。auditctl -w /etc/hosts -p wa -k etc_hosts。auditctl -l确认规则已加载。ausearch -k etc_hosts -i -ts today。输出显示每次操作的时间、进程、UID、操作类型(write/attr)。aureport -f -i -ts today。输出包含各文件的失败访问次数统计。/etc/audit/rules.d/custom.rules写-w /etc/hosts -p wa -k etc_hosts和-w /etc/hostname -p wa -k hostname。augenrules --load后auditctl -l验证。ausearch -m LOGIN -i显示每个 login 会话的用户、时间、终端、成功/失败状态。
学习检查点
学完本章后,请检验自己是否掌握以下内容:
| 检查项 | 自测问题 | 验证方法 |
|---|---|---|
| 概念理解 | 能用自己的话解释 auditd 审计系统的架构和审计规则 | 尝试向他人讲解 |
| 命令操作 | 能不查文档完成 auditd 安装、审计规则编写和日志查询 | 在终端实际执行 |
| 原理掌握 | 能说出 auditd 的系统调用跟踪和审计日志分析原理 | 画出流程图 |
| 故障排查 | 能独立排查 auditd 规则不生效或日志丢失的问题 | 模拟故障并修复 |
| 最佳实践 | 能说明为什么审计日志需要远程存储和定期轮转 | 对比不同方案 |
本章总结
auditd 是实现安全审计和合规要求的核心工具。核心用法可归结为三句话:
- 写规则:
auditctl -w /etc/passwd -p wa -k mykey - 查日志:
ausearch -k mykey -i -ts today - 出报表:
aureport -f -i -k mykey
合理规划审计范围、加好键值索引、配置轮转与异地备份,auditd 就能成为等保合规与安全事件溯源的有力工具。
速查表
| 命令 | 用途 |
|---|---|
auditctl -w /path -p wa -k key | 添加文件监控规则 |
auditctl -l | 列出已加载规则 |
ausearch -k key -i -ts today | 按键值查询事件 |
aureport -f -i | 生成文件访问统计报表 |
augenrules --load | 加载 /etc/audit/rules.d/ 下的持久规则 |
延伸阅读
- 2.7:日志与故障排查 日志与故障排查 — 了解 syslog/journald 与 auditd 的协同
- 5.6:SELinux 与 AppArmor SELinux 与 AppArmor — auditd 与 MAC 机制的联动(AVC 事件)
- 5.1:Linux 安全加固 Linux 服务器安全加固指南 — auditd 在整体安全体系中的定位
- 5.12:eBPF 基础 eBPF 基础 — 新一代内核可观测性技术,与 auditd 互补
常见问题
auditd 和 syslog 有什么区别?
syslog(rsyslog/syslog-ng)是应用层日志框架,捕获应用程序输出的日志。auditd 是内核级审计系统,由内核审计子系统(kauditd)产生审计事件,记录系统调用(如文件打开、网络连接、用户登录)。auditd 更底层更详细,但日志量也更大。等保合规要求的审计日志通常由 auditd 生成。
auditd 日志太多怎么控制?
合理配置规则避免全量审计。用 -a exclude,always -F msgtype!=USER_LOGIN 排除非关键事件。设置 max_log_file 和 max_log_file_action=ROTATE 限制单个日志大小。num_logs 控制保留轮转数。使用 aureport --summary 了解各事件类型的数量分布,调整规则收缩范围。每月审查一次 audit 规则,移除不必要的监控项。
等保三级对审计日志有哪些要求?
等保三级通用要求:① 审计范围覆盖所有用户对重要信息系统的访问;② 审计内容包括日期、时间、类型、主客体标识、事件结果;③ 审计记录保护(防止未授权访问、修改、删除);④ 审计记录保留 6 个月以上。auditd 配合 logrotate 和集中式日志系统通常能满足要求。关键点:留存策略和完整性保护(防止被入侵者清理痕迹)。