ausearch是查违规行为的第一工具,因其能按语义条件(如时间、用户、系统调用、失败标志)精准提取并反解原始审计日志,避免人工解析海量二进制字段。

auditd 本身不生成“违规告警”,它只记录原始审计事件;所谓“告警”必须靠后续解析、过滤和触发逻辑实现。直接 tail -f /var/log/audit/audit.log 看到的只是海量结构化日志,不是告警。
为什么 ausearch 是查违规行为的第一工具
人工翻 /var/log/audit/audit.log 几乎不可行:字段密集、无换行、含十六进制参数。而 ausearch 能按语义条件精准提取,且支持 -i(反解 UID/系统调用名)和 -ts(时间范围)。
- 查所有失败的 sudo 尝试:
ausearch -m EXECVE -i -sv no | grep -i "sudo" - 查过去一小时对
/etc/shadow的写操作:ausearch -w /etc/shadow -p w -ts recent -i - 查非 root 用户执行的特权命令:
ausearch -m SYSCALL -i -F uid!=0 -F auid!=unset -k privileged_exec
注意:-k 标签必须与你规则中定义的一致,否则搜不到;-sv no 表示 success=0,即操作失败——很多真实攻击行为就藏在失败日志里。
用 aureport 快速定位高频异常模式
aureport 不是“汇总统计”,而是帮你发现偏离基线的行为。比如登录暴破、批量文件删除、异常 UID 活动,这些靠单条日志很难识别。
- 看昨日所有失败登录源 IP 排名:
aureport -m USER_AUTH -ts yesterday --summary | awk '$1 ~ /^[0-9]+\.[0-9]+/ {print $0}' | sort -k2nr - 查某用户最近 10 分钟内执行的命令列表:
aureport -f -i -ul username -ts recent | tail -n +3 | head -20 - 导出所有 execve 调用中带
/bin/sh或python -c的可疑行:aureport -m SYSCALL -i --raw | awk -F': ' '/execve.*sh|python.*-c/ {print $0}'
关键点:aureport -f 只输出文件类事件,-m SYSCALL 才覆盖命令执行;--raw 输出机器可读格式,适合管道处理,但需配合 ausearch -i 才能人工验证。
真正“告警”得靠规则 + 外部触发,别指望 auditd 自己发邮件
auditd 没有内置通知机制。生产环境里所谓“实时告警”,其实是三层链路:
- 第一层:auditd 规则打标,例如
-w /etc/passwd -p wa -k identity_change - 第二层:rsyslog 过滤转发,把含
identity_change的事件单独写入/var/log/audit/alert.log - 第三层:inotifywait 监听该文件追加,每新增一行就触发
curl或logger
漏掉任意一层,就只有日志,没有告警。最常卡在第二步:很多人改了 /etc/rsyslog.d/ 却忘了 systemctl restart rsyslog,或者没确认 auditd 日志是否真的含目标关键词(可用 ausearch -k identity_change | head -3 验证)。
实际运维中最容易被忽略的是:auditd 默认 log_format = RAW,导致 rsyslog 收到的是二进制字段,无法用 $msg contains 匹配。必须先在 /etc/audit/auditd.conf 中设 log_format = ENRICHED,再重启 auditd,否则整个告警链路从源头就断了。


















