《auditd 审计、合规基线与入侵取证实战》

系统讲解 Linux 审计子系统:auditd 架构与内核事件模型、审计规则(文件监控、系统调用、用户与权限变更)的编写方法、ausearch 与 aureport 的定向查询与汇总报表、日志留存与远程集中、基于 CIS Benchmark 的审计基线加固,以及一套可执行的入侵排查与取证流程,并兼顾性能开销与合规落地。

引言

日志告诉你「发生了什么」,而审计(audit)回答的是「谁、在什么时候、对哪个对象、做了什么、结果如何」——它是合规检查的证据链,也是入侵发生后唯一能还原现场的黑匣子。Linux 审计子系统由内核 audit 模块与用户态 auditd 守护进程组成,能在系统调用层面记录几乎所有敏感行为,且独立于应用日志,难以被普通攻击者抹除。

本文从 auditd 的架构与事件模型讲起,手把手写审计规则(文件监控、系统调用、用户与权限变更),用 ausearch/aureport 做查询与统计,讨论日志留存与远程集中,再给出基于 CIS Benchmark 的基线加固方法与一套可执行的入侵排查流程,最后谈性能开销与运维实践。

前置:systemd 与 journald 日志体系。日志轮转与集中见 logrotate 与 rsyslog,安全加固整体思路见 Linux 安全加固与基线。


目录


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审计规则被修改
AVCSELinux 拒绝事件
# 安装与启用
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审计用户 IDauid>=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/groupidentity
提权sudo、su、setuid syscallpriv_esc
持久化cron、systemd、ld.so.preloadpersistence
外联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启用 auditdsystemctl 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/setuidpriv_esc
持久化cron/systemd/sshpersistence
外联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 都改不动。


延伸阅读

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「linux」更多文章

  1. 《Linux 故障排查工具箱:从 strace 到火焰图》
  2. 《磁盘加密与 LUKS 密钥管理实战》
  3. 《文本处理三剑客:grep、sed、awk 与 jq 实战》