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

知识关联

原理讲解

auditd 的审计管道从内核到磁盘分为三个层级:

  1. 内核审计子系统:Linux 内核内置的审计框架,在每次系统调用经过时根据规则决定是否生成审计记录(audit record),记录包含 syscall 编号、参数、返回值、进程信息等。
  2. auditd 守护进程:用户态 daemon,通过 netlink socket 从内核收取审计事件,按 /etc/audit/auditd.conf 配置写入 audit.log,同时通过 audispd 分发到插件(如远程 syslog)。
  3. 查询与分析工具: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认证尝试(含失败)暴力破解溯源
AVCSELinux 决策记录SELinux 排错(5.6:SELinux 与 AppArmor
CONFIG_CHANGE审计配置本身被修改防审计绕过
DAEMON_START / DAEMON_ENDauditd 启停检查审计是否被关闭

审计记录的"不可抵赖性"来自内核层记录:审计日志文件的访问/修改用 -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_filedisk_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_LOGINaureport -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_passwdssh_confignginx_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/passwdaureport -au -i --start today

练习题

  1. 安装 auditd 并启动服务,用 auditctl -s 确认状态为 enabled。
  2. 编写一条规则监控 /etc/hosts 的写和属性变更操作,键值设为 etc_hosts
  3. 使用 ausearch 查询今天所有键值为 etc_hosts 的审计事件,以人性化格式输出。
  4. 使用 aureport 生成今天的失败事件汇总报表。
  5. /etc/audit/rules.d/ 下创建 custom.rules,写入对 /etc/hosts/etc/hostname 的监控,然后执行 augenrules --load 加载。
  6. ausearch -m LOGIN -i 查看系统上的所有登录记录,观察哪些用户在什么时间登录过。
点击查看答案
  1. apt install auditd audispd-pluginssystemctl start auditd && systemctl enable auditdauditctl -s 显示 enabled 1
  2. auditctl -w /etc/hosts -p wa -k etc_hostsauditctl -l 确认规则已加载。
  3. ausearch -k etc_hosts -i -ts today。输出显示每次操作的时间、进程、UID、操作类型(write/attr)。
  4. aureport -f -i -ts today。输出包含各文件的失败访问次数统计。
  5. /etc/audit/rules.d/custom.rules-w /etc/hosts -p wa -k etc_hosts-w /etc/hostname -p wa -k hostnameaugenrules --loadauditctl -l 验证。
  6. ausearch -m LOGIN -i 显示每个 login 会话的用户、时间、终端、成功/失败状态。

学习检查点

学完本章后,请检验自己是否掌握以下内容:

检查项自测问题验证方法
概念理解能用自己的话解释 auditd 审计系统的架构和审计规则尝试向他人讲解
命令操作能不查文档完成 auditd 安装、审计规则编写和日志查询在终端实际执行
原理掌握能说出 auditd 的系统调用跟踪和审计日志分析原理画出流程图
故障排查能独立排查 auditd 规则不生效或日志丢失的问题模拟故障并修复
最佳实践能说明为什么审计日志需要远程存储和定期轮转对比不同方案

本章总结

auditd 是实现安全审计和合规要求的核心工具。核心用法可归结为三句话:

  1. 写规则auditctl -w /etc/passwd -p wa -k mykey
  2. 查日志ausearch -k mykey -i -ts today
  3. 出报表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/ 下的持久规则

延伸阅读

常见问题

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 和集中式日志系统通常能满足要求。关键点:留存策略和完整性保护(防止被入侵者清理痕迹)。
↑ 回到顶部