引言
日志告诉你「发生了什么」,而审计(audit)回答的是「谁、在什么时候、对哪个对象、做了什么、结果如何」——它是合规检查的证据链,也是入侵发生后唯一能还原现场的黑匣子。Linux 审计子系统由内核 audit 模块与用户态 auditd 守护进程组成,能在系统调用层面记录几乎所有敏感行为,且独立于应用日志,难以被普通攻击者抹除。
本文从 auditd 的架构与事件模型讲起,手把手写审计规则(文件监控、系统调用、用户与权限变更),用 ausearch/aureport 做查询与统计,讨论日志留存与远程集中,再给出基于 CIS Benchmark 的基线加固方法与一套可执行的入侵排查流程,最后谈性能开销与运维实践。
前置:systemd 与 journald 日志体系。日志轮转与集中见 logrotate 与 rsyslog,安全加固整体思路见 Linux 安全加固与基线。
目录
- 1. auditd 架构与审计事件模型
- 2. 审计规则:文件、系统调用与用户
- 3. 审计规则实战:syscall 监控
- 4. ausearch 与 aureport 查询
- 5. 日志留存与远程集中
- 6. CIS Benchmark 基线加固
- 7. 入侵排查流程
- 8. 合规要求与审计策略
- 9. 性能与运维实践
- 10. 速查表
- 延伸阅读
1. auditd 架构与审计事件模型
内核 audit 子系统负责「拦截并生成事件」,用户态 auditd 负责「落盘与分发」——两者通过 netlink 通信,即使用户态挂掉内核也会缓冲。
应用系统调用 → 内核 audit 模块(按规则过滤)
↓ netlink
auditd 守护进程
├─→ /var/log/audit/audit.log
└─→ audispd 插件 → 远程/SIEM
每条审计事件由一条或多条记录组成,通过 msg=audit(<时间戳>:<序号>) 关联,记录类型(type)决定含义:
| 记录类型 | 含义 |
|---|---|
| SYSCALL | 系统调用主体(pid、uid、返回值) |
| PATH / CWD | 被访问文件路径与工作目录 |
| EXECVE / PROCTITLE | 执行程序及完整命令行 |
| USER_AUTH / USER_LOGIN | 认证与登录事件 |
| CONFIG_CHANGE | 审计规则被修改 |
| AVC | SELinux 拒绝事件 |
# 安装与启用
apt install auditd audispd-plugins # Debian/Ubuntu
yum install audit auditd # RHEL/CentOS
systemctl enable --now auditd
auditctl -s # 查看状态
auditctl -s 中的 backlog 与 lost 是关键健康指标——lost 非零说明内核缓冲区溢出、审计事件被丢弃,合规场景不可接受。
一句话:auditd 的日志是「内核视角」的事实记录,比应用日志更难伪造——这也是它在合规与取证中不可替代的原因。
2. 审计规则:文件、系统调用与用户
审计规则分三类:文件系统规则(-w 监控路径)、系统调用规则(-a 按 syscall 过滤)、控制规则(调整审计行为)。
文件监控用 -w 加权限位(r/w/x/a 分别代表读/写/执行/属性变更):
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/ -p wa -k etc_change
系统调用规则用 -a 指定链与动作,常见 exit,always:
# 监控执行(用 auid 过滤真实用户,避免全量)
auditctl -a always,exit -F arch=b64 -S execve -F auid>=1000 -k exec_all
# 监控文件删除与重命名
auditctl -a always,exit -F arch=b64 -S unlink -S unlinkat -S rename -k delete
# 监控权限位修改与提权
auditctl -a always,exit -F arch=b64 -S chmod -S fchmod -k perm_mod
auditctl -a always,exit -F arch=b64 -S setuid -S setgid -k priv_esc
规则字段速查:
| 字段 | 含义 | 示例 |
|---|---|---|
-F arch | 架构 | b64(x86_64) |
-S | 系统调用名 | execve、openat |
-F auid | 审计用户 ID | auid>=1000 |
-F success | 成功与否 | success=0(只记失败) |
-k | 规则键(标签) | identity |
-p | 权限位(文件规则) | wa |
auditctl -l # 查看已加载规则
auditctl -D # 删除所有规则(慎用)
auditctl -W /etc/passwd -p wa -k identity # 按 key 删除
一句话:规则一定要加
-k键——没有 key 的规则在大规模审计里就是「无索引的全文搜索」,ausearch -k才是取证时的救命绳。
3. 审计规则实战:syscall 监控
生产环境不追求「全录」,而是围绕「身份、提权、持久化、外联、数据」五类高危行为精准布控。
持久化与提权布控:
auditctl -w /etc/cron.d/ -p wa -k persistence
auditctl -w /etc/systemd/system/ -p wa -k persistence
auditctl -w /root/.ssh/ -p wa -k persistence
auditctl -w /etc/ld.so.preload -p wa -k persistence
auditctl -w /usr/bin/sudo -p x -k priv_esc
auditctl -a always,exit -F arch=b64 -S init_module -S delete_module -k modules
数据外联布控:
# 网络连接(区分成功/失败)
auditctl -a always,exit -F arch=b64 -S connect -k network_connect
# 读取敏感文件
auditctl -w /etc/shadow -p r -k shadow_read
# 挂载与卸载
auditctl -a always,exit -F arch=b64 -S mount -S umount2 -k mount
| 行为类别 | 监控对象 | 典型 key |
|---|---|---|
| 身份 | /etc/passwd、/etc/group | identity |
| 提权 | sudo、su、setuid syscall | priv_esc |
| 持久化 | cron、systemd、ld.so.preload | persistence |
| 外联 | connect syscall、防火墙规则 | network_connect |
| 数据 | /etc/shadow、数据库目录 | shadow_read |
一句话:审计规则要「围绕攻击链而非文件清单」——从初始访问到提权、持久化、横向、外泄,每一步留一个钩子,比无脑监控全盘有效得多。
4. ausearch 与 aureport 查询
ausearch 做「定向检索」,aureport 做「汇总统计」——一个回答「具体发生了什么」,一个回答「整体趋势如何」。
ausearch 常用检索维度:
ausearch -k identity # 按 key 检索
ausearch -ts today -k priv_esc # 按时间 + key
ausearch -ua 1000 # 按审计用户
ausearch -p 12345 # 按进程号
ausearch -sc execve # 按系统调用
ausearch -m SYSCALL -sv no # 只找失败
ausearch -i -k identity # 解析为可读文本
aureport 生成各类统计报表:
aureport --summary # 总体摘要
aureport -l # 登录报表
aureport -au --failed # 认证失败
aureport -x # 执行命令报表
aureport -f # 文件访问报表
aureport -u # 按用户统计
| 工具 | 用途 | 典型命令 |
|---|---|---|
| ausearch | 定向检索事件 | ausearch -k identity -ts today |
| aureport | 汇总统计 | aureport --summary |
| ausearch -i | 解析为可读格式 | ausearch -i -m USER_LOGIN |
| aureport -au | 认证失败统计 | aureport -au --failed |
| aureport -x | 命令执行统计 | aureport -x |
# 组合:今天所有提权失败
ausearch -ts today -k priv_esc -sv no -i
# 本周登录失败最多的用户
aureport -au --failed -ts this-week
一句话:
ausearch用来「查案」,aureport用来「看趋势」——取证时先aureport找到异常时段,再用ausearch精确钻取,效率最高。
5. 日志留存与远程集中
本地审计日志一旦主机被拿下就可能被清空,合规与取证都要求「异地留存 + 完整性保护」。
auditd 主配置文件 /etc/audit/auditd.conf 关键项:
# /etc/audit/auditd.conf
log_file = /var/log/audit/audit.log
flush = INCREMENTAL
freq = 20
num_logs = 10
max_log_file = 50 # 单个日志最大 MB
max_log_file_action = ROTATE
space_left_action = SYSLOG
admin_space_left_action = SUSPEND # 磁盘将满时暂停审计
disk_full_action = SUSPEND
admin_space_left_action = SUSPEND 是合规关键:磁盘将满时暂停系统而非丢弃日志,宁可停机也不丢证据。
远程集中用 audisp-remote 插件:
# /etc/audit/plugins.d/au-remote.conf
active = yes
direction = out
path = /sbin/audisp-remote
type = always
# /etc/audit/audisp-remote.conf
remote_server = 10.0.0.100
port = 60
transport = tcp
mode = immediate
服务端(接收方)在 /etc/audit/auditd.conf 设 tcp_listen_port = 60 并放行防火墙。
| 风险 | 缓解 |
|---|---|
| 主机被入侵后删日志 | 远程集中 + append-only |
| 磁盘写满丢事件 | admin_space_left_action = SUSPEND |
| 日志被篡改 | 定期哈希 + 异地副本 |
| 时间线混乱 | 保证 NTP 同步(时间戳是取证基石) |
ss -lntup | grep :60 # 验证接收端
sha256sum /var/log/audit/audit.log* > /root/audit-hash.txt
一句话:没有异地留存的审计等于没有审计——攻击者进主机后的第一件事往往就是清日志,只有远程副本和 append-only 属性才挡得住。
6. CIS Benchmark 基线加固
CIS Benchmark 把「审计子系统该配成什么样」拆成可勾选的条目,是合规落地的通用语言。
CIS 中与审计相关的核心控制项:
| 控制项 | 要求 | 检查命令 |
|---|---|---|
| 4.1.1.1 | 启用 auditd | systemctl is-enabled auditd |
| 4.1.1.2 | 日志不被删除 | auditctl -s | grep -i lost |
| 4.1.1.3 | 规则不可变 | auditctl -s | grep enabled 为 2 |
| 4.1.3.x | 记录身份文件变更 | 监控 /etc/passwd 等 |
| 4.1.5.x | 记录 sudoers 变更 | 监控 /etc/sudoers |
| 4.1.6.x | 记录内核模块加载 | 监控 init_module |
| 4.1.7.x | 记录提权 | 监控 setuid/setgid |
| 4.1.10 | 记录文件删除 | 监控 unlink/rename |
规则持久化:auditctl 写的规则重启即失效,必须写入规则文件:
# /etc/audit/rules.d/99-hardening.rules(节选)
-w /etc/passwd -p wa -k identity
-w /etc/shadow -p wa -k identity
-w /etc/sudoers -p wa -k scope
-a always,exit -F arch=b64 -S init_module -S delete_module -k modules
-a always,exit -F arch=b64 -S setuid -S setgid -k priv_esc
-a always,exit -F arch=b64 -S unlink -S unlinkat -S rename -k delete
-a always,exit -F arch=b64 -S execve -F auid>=1000 -k exec
-e 2
augenrules --load # 加载规则
auditctl -s | grep enabled # 确认为 2(不可变)
规则不可变(-e 2):启用后连 root 也不能在运行时修改规则,必须重启——这能有效阻止攻击者关闭审计。
一句话:基线加固的顺序是「先启用、再布规则、后置不可变」——顺序颠倒会导致规则加载失败,而
-e 2一旦生效就只能靠重启回退。
7. 入侵排查流程
取证的核心是「时间线重建」:以审计事件为轴,把登录、提权、执行、外联、文件变更串成一条攻击链。
auditctl -s # 1. 确认审计未被关闭或清空
aureport -ts this-week --summary # 2. 建立时间基线,找异常时段
aureport -au --failed -ts this-week # 3. 查可疑登录与认证失败
ausearch -k priv_esc -ts this-week -i # 4. 查提权行为
ausearch -k exec -ts this-week -i | grep -iE 'nc |/dev/tcp|curl|wget'
ausearch -k persistence -ts this-week -i # 5. 查持久化落点
ausearch -k network_connect -ts this-week -i # 6. 查外联
排查清单(按攻击链):
ps auxf | grep -vE '\[.*\]' # 可疑进程
ss -lntup # 监听端口
crontab -l; ls -la /etc/cron.*/ # 异常定时任务
awk -F: '$3==0' /etc/passwd # 异常 UID=0 账户
cat /root/.ssh/authorized_keys # 异常密钥
find /tmp /var/tmp /dev/shm -type f -mtime -7 -ls # 近期可疑文件
lsmod; ls -la /etc/ld.so.preload # rootkit 痕迹
| 阶段 | 关键证据 | 审计 key |
|---|---|---|
| 初始访问 | 登录、认证失败 | USER_LOGIN、USER_AUTH |
| 执行 | 命令与参数 | exec、EXECVE、PROCTITLE |
| 提权 | sudo/su/setuid | priv_esc |
| 持久化 | cron/systemd/ssh | persistence |
| 外联 | connect 系统调用 | network_connect |
| 清理 | 日志删除、规则变更 | CONFIG_CHANGE、delete |
一句话:取证三原则:不动现场、先取副本、按时间线串证据——所有分析尽量在
audit.log的只读副本上进行,原始文件保持原状以备司法鉴定。
8. 合规要求与审计策略
不同合规框架对审计的要求侧重点不同,但共通点是「可追溯、可留存、防篡改」。
| 框架 | 审计相关要求 | 留存期 |
|---|---|---|
| CIS Benchmark | 审计子系统配置基线 | 按组织策略 |
| PCI DSS | 记录对系统组件的访问 | ≥ 1 年,近 3 月可查 |
| ISO 27001 | 事件日志与证据保全 | 按风险评估 |
| 等保 2.0(三级) | 安全审计、日志保护 | ≥ 6 个月 |
| SOX / HIPAA | 访问与变更可追溯 | 6 年 / 6 年 |
合规审计策略要点:
-w /var/lib/mysql/ -p rw -k db_access # 敏感数据访问
-a always,exit -F arch=b64 -S chmod -S chown -S setxattr -k perm_mod
-a always,exit -F arch=b64 -S adjtimex -S clock_settime -k time_change
-a always,exit -F arch=b64 -S sethostname -S setdomainname -k network_mod
-w /etc/audit/ -p wa -k audit_config # 审计配置自身
一句话:合规审计要「自证清白」——连审计配置自身的变更都要被审计,否则攻击者改掉规则就再无证据,合规检查一票否决。
9. 性能与运维实践
审计有成本:规则越多、syscall 越热,开销越大——生产要「精准布控 + 监控溢出 + 定期评审」。
开销控制手段:
# 1. 用 auid 过滤真实用户,避免全量 execve
-a always,exit -F arch=b64 -S execve -F auid>=1000 -F auid!=4294967295 -k exec
# 2. 只记失败,减少日志量
-a always,exit -F arch=b64 -S open -F success=0 -k open_fail
# 3. 只监控写操作,不监控读
-w /etc/ -p wa -k etc_change
监控审计健康度:
auditctl -s # 队列与丢失事件
grep -E 'backlog|rate' /etc/audit/auditd.conf
du -sh /var/log/audit/ # 日志增长速率
| 现象 | 原因 | 处理 |
|---|---|---|
lost 持续增长 | 事件速率超处理能力 | 收紧规则 / 提高 backlog |
| CPU 占用高 | 高频 syscall 规则 | 加 auid/success 过滤 |
| 日志暴涨 | 监控了读或目录过宽 | 只留 wa,缩小范围 |
| 审计规则丢失 | 未持久化 | 写入 rules.d 并 augenrules –load |
| 时间线错乱 | 时间未同步 | 部署 chrony,保证 NTP |
一句话:审计的性能问题几乎都源于「规则太宽」——
-F auid>=1000、-F success=0、只监控写,这三招能砍掉绝大部分无效事件。
10. 速查表
| 需求 | 命令 |
|---|---|
| 查看审计状态 | auditctl -s |
| 添加文件监控 | auditctl -w /etc/passwd -p wa -k identity |
| 添加 syscall 规则 | auditctl -a always,exit -F arch=b64 -S execve -k exec |
| 列出规则 | auditctl -l |
| 持久化规则 | 写入 /etc/audit/rules.d/*.rules |
| 加载规则 | augenrules --load |
| 规则不可变 | 规则末尾加 -e 2 |
| 按 key 检索 | ausearch -k identity -i |
| 按时间检索 | ausearch -ts today -m EXECVE |
| 按用户检索 | ausearch -ua 1000 |
| 只找失败 | ausearch -sv no |
| 登录报表 | aureport -l |
| 认证失败报表 | aureport -au --failed |
| 命令执行报表 | aureport -x |
| 摘要报表 | aureport --summary |
| 远程集中 | audisp-remote 插件 |
| 磁盘将满保护 | admin_space_left_action = SUSPEND |
一句话记忆:规则要带 -k 键、只监控写与高危 syscall;查案用 ausearch -i、看趋势用 aureport;日志必须异地留存、磁盘将满宁可 SUSPEND;最后用 -e 2 锁死规则,连 root 都改不动。
延伸阅读
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。