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