auditd —— 内核级操作审计

运维工具手册 11-安全与审计 6.1 KB 原文

auditd —— 内核级操作审计

分类:11 安全与审计 适用:Linux(audit 2.x ~ 3.x),RHEL 系默认安装 一句话:记录"谁在什么时候对哪个文件/系统调用做了什么",等保合规与入侵溯源的底层证据。

1. 它解决什么问题

  • 谁改了 /etc/passwd、/etc/sudoers?
  • 某进程执行了哪些命令、读取了哪些敏感文件?
  • 登录失败、提权、挂载、内核模块加载的记录。
  • 等保 2.0/3.0 要求的审计项落地。

auditd 工作在内核层(通过 netlink 接收 audit 子系统事件),比 shell history、rsyslog 更可靠——用户无法轻易绕过。

2. 安装与服务

apt install -y auditd audispd-plugins
dnf install -y audit

systemctl enable --now auditd
systemctl status auditd

# 注意:重载规则不要用 systemctl restart auditd(会被拒绝)
service auditd restart
auditctl -R /etc/audit/rules.d/audit.rules

配置文件:

/etc/audit/auditd.conf           # 守护进程行为
/etc/audit/audit.rules           # 规则(传统单文件)
/etc/audit/rules.d/*.rules       # 规则分片(推荐)
/var/log/audit/audit.log         # 审计日志

3. 临时规则(auditctl,重启失效)

# 监控文件:-w 路径 -p 权限(w写 a属性 r读 x执行) -k 关键字
auditctl -w /etc/passwd -p wa -k identity
auditctl -w /etc/shadow -p wa -k identity
auditctl -w /etc/sudoers -p wa -k sudoers
auditctl -w /etc/ssh/sshd_config -p wa -k sshd

# 监控目录
auditctl -w /etc/nginx/ -p wa -k nginx_conf

# 查看当前规则
auditctl -l

# 删除规则
auditctl -W /etc/passwd -p wa -k identity
auditctl -D                       # 清空所有规则(⚠️)

# 状态
auditctl -s

-p 权限位:

位 含义
r 读
w 写
x 执行
a 修改属性(chmod/chown)

4. 持久化规则

/etc/audit/rules.d/audit.rules:

# 1. 清空已有规则
-D
-b 8192

# 2. 失败即记录(不 panic)
-f 1

# 3. 身份与认证
-w /etc/passwd -p wa -k identity
-w /etc/shadow -p wa -k identity
-w /etc/group -p wa -k identity
-w /etc/gshadow -p wa -k identity
-w /etc/sudoers -p wa -k sudoers
-w /etc/sudoers.d/ -p wa -k sudoers
-w /etc/ssh/sshd_config -p wa -k sshd

# 4. 登录与用户变更
-w /var/log/taos.log -p wa -k logins
-w /var/run/utmp -p wa -k session
-w /var/run/faillock -p wa -k logins

# 5. 提权与权限变更
-a always,exit -F arch=b64 -S setuid -S setgid -S setreuid -S setregid -k priv_change
-a always,exit -F arch=b64 -S chmod -S fchmod -S fchmodat -F auid>=1000 -F auid!=-1 -k perm_mod
-a always,exit -F arch=b64 -S chown -S fchown -S lchown -k owner_change

# 6. 敏感命令执行
-a always,exit -F arch=b64 -S execve -F path=/usr/bin/sudo -k sudo_exec
-a always,exit -F arch=b64 -S execve -F path=/usr/bin/passwd -k passwd_exec

# 7. 内核模块与挂载
-a always,exit -F arch=b64 -S init_module -S delete_module -k modules
-a always,exit -F arch=b64 -S mount -S umount2 -k mount

# 8. 不可变(规则锁定,需重启才能改)
# -e 2

加载:

augenrules --load
auditctl -l | head

-e 2 会把规则锁死(包括自己),调试阶段先别开。

5. 查询日志

# 按关键字查
ausearch -k identity
ausearch -k identity -ts today
ausearch -k identity -ts '2026-11-05 14:00:00' -te '2026-11-05 15:00:00'
ausearch -k identity -i                 # 解析 uid→用户名、syscall→名称
ausearch -k identity -f /etc/passwd      # 按文件名
ausearch -m USER_LOGIN -ts today         # 按事件类型
ausearch -ua 1000 -ts today              # 按用户
ausearch -p 1234                         # 按 PID

# 汇总报告
aureport
aureport -au                             # 认证事件
aureport -l                              # 登录
aureport -f                              # 文件
aureport -x                              # 可执行文件
aureport -k -i                           # 按 key
aureport --summary

一条记录长什么样

type=SYSCALL msg=audit(1762300800.123:4567): arch=c000003e syscall=257 success=yes
  exit=3 a0=ffffff9c a1=7ffd... a2=0 a3=0 items=1 ppid=1234 pid=5678
  auid=1000 uid=0 gid=0 euid=0 tty=pts0 ses=3 comm="vim"
  exe="/usr/bin/vim" key="identity"

type=PATH msg=audit(...): item=0 name="/etc/passwd" inode=123456 dev=fd:00 mode=0100644
字段 含义
auid 登录时的原始用户(审计关键,-1 表示未登录)
uid/euid 执行时的有效用户
comm / exe 进程名 / 可执行文件
syscall 系统调用
key 规则关键字
success 是否成功
tty / ses 终端 / 会话

auid 是审计的灵魂:sudo 之后 uid=0,但 auid 仍是真实用户,才能追到人。

6. 实战场景

6.1 谁改了 /etc/passwd

ausearch -k identity -i | grep -A5 'name="/etc/passwd"'

重点看 auid、comm、exe、tty、时间。如果是 useradd/passwd,属于正常运维;如果是 vim/echo 且来自陌生 IP,需警惕。

6.2 排查提权行为

ausearch -k sudo_exec -ts today -i | grep -E 'auid|comm|exe' | head -40
aureport -au --summary

6.3 追踪某个进程的所有文件访问

# 先拿到 PID
ausearch -k identity -i | grep 'pid=' | tail -1
# 再按 PID 查
ausearch -p <PID> -i

6.4 等保常见审计项

要求 规则
用户增删改 -w /etc/passwd -p wa -k identity
权限变更 -S chmod -S chown
登录事件 -w /var/run/utmp -p wa -k session
重要文件访问 按业务加 -w
内核模块 -S init_module -S delete_module
审计日志保护 -e 2 + 日志权限 600

6.5 审计日志被写满

tail -50 /var/log/audit/audit.log
grep -E 'space_left|admin_space_left' /var/log/messages

auditd.conf 调整:

max_log_file = 100
max_log_file_action = ROTATE
num_logs = 10
space_left = 500
space_left_action = SYSLOG
admin_space_left_action = SUSPEND
disk_full_action = SUSPEND

规则太宽(如监控整个 /etc)会产生海量事件,先用 aureport -k 看哪条规则量大。

7. 常见坑

  1. systemctl restart auditd 失败:设计如此,用 service auditd restart。
  2. 规则重启丢失:auditctl -w 是临时的,必须写入 /etc/audit/rules.d/。
  3. -w 目录不递归:只监控目录本身的变更,子文件要单独加或用 -F dir= 递归语法。
  4. -p wa 漏了 x:执行不记录,排查"谁运行了脚本"会漏。
  5. auid=-1:说明操作发生在登录会话之外(cron、systemd 服务),不能当"没人干"。
  6. 缓冲不足丢事件:-b 8192 在高负载下不够,看 auditctl -s 的 lost 计数。
  7. -e 2 锁死后无法改规则:只能重启,调试期别开。
  8. 性能影响:execve 全量监控在高并发机器上开销明显,按需加 -F auid>=1000 过滤。
  9. 日志轮转与 space_left:磁盘满会导致审计暂停甚至系统拒绝服务(disk_full_action)。
  10. 容器内 auditd 无效:审计在内核层,容器看不到宿主规则产生的全部事件。
  11. 规则语法错误:augenrules --load 失败时看 /var/log/messages,auditctl -R 会报具体行号。
  12. ausearch 时间格式:必须 YYYY-MM-DD HH:MM:SS,且是本地时区。
  13. 与 rsyslog 重复:audispd-plugins 的 syslog.conf 会把审计同时写 syslog,注意容量。

8. 速查表

# 服务
systemctl enable --now auditd
service auditd restart
auditctl -s

# 临时规则
auditctl -w /etc/passwd -p wa -k identity
auditctl -w /path -p rwxa -k key
auditctl -l
auditctl -D
auditctl -W /etc/passwd -p wa -k identity

# 持久化
/etc/audit/rules.d/audit.rules
augenrules --load

# 查询
ausearch -k <key> -i
ausearch -k <key> -ts today
ausearch -m USER_LOGIN -ts today
ausearch -p <pid>
ausearch -f /etc/passwd
aureport -au / -l / -f / -k

# 日志
/var/log/audit/audit.log
/etc/audit/auditd.conf  (max_log_file, space_left)