必须用 ausearch 加时间窗、系统调用类型和行为标签三重过滤,因 grep execve 仅匹配多行事件中的 EXECVE 行,丢失 UID、参数、结果等关键字段,且全量扫描易致 I/O 饱和。

直接结论:别用 grep 扫全量 audit.log,必须用 ausearch 加时间窗 + 系统调用类型 + 关键行为标签三重过滤,否则 10GB 日志可能卡死终端或漏掉关键事件。
为什么不能直接 grep execve?
audit.log 每条 execve 事件实际跨多行(SYSCALL、PATH、CWD、EXECVE 等 type 字段),grep execve 只能匹配到 EXECVE 行,但丢失 UID、命令参数、结果 success=0/1 等判定依据;更严重的是,未加时间限制时,ausearch -m execve 默认查全部历史,可能触发磁盘 I/O 饱和,尤其当日志轮转后有多个 audit.log.1.gz 时,zcat | grep 更慢且无法解析结构化字段。
真正快的三步过滤法
- 限定时间范围:用
-ts和-te,例如-ts today或-ts 2026-01-25 09:00:00 -te 2026-01-25 17:00:00,避免扫描数天日志 - 锁定 syscall 类型与上下文:用
-m execve(不是-m SYSCALL),再加-i自动解析 UID/GID/路径,避免手动 decode - 结合行为特征二次筛选:在
ausearch输出后接grep -E,但只筛高危模式,例如:ausearch -m execve -ts today -i | grep -E "(sh|bash|python[23]?|nc|curl|wget|socat|perl)"
进阶:绕过 shell 名称混淆的技巧
攻击者常改名二进制(如 /tmp/.x)或用 sh -c "xxx" 绕过关键词匹配。这时要抓更底层的线索:
- 查非交互式 shell 启动:
ausearch -m execve -ts today -i | awk -F'cwd="|"' '/exe="\/bin\/sh|\/bin\/bash/ && !/tty=.*$/ {print}' - 查带网络连接参数的 execve:
ausearch -m execve -ts today -i | grep -A2 -B2 "argv.*connect\|argv.*80\|argv.*443" - 查低 UID 但非 root 的可疑执行:
ausearch -m execve -ts today -i | awk '$5 ~ /uid=[0-9]+/ && $5 ($5 是 UID 字段,-i后位置固定)
容易被忽略的性能陷阱
默认 audit.log 格式是 ENRICHED,解析开销大;若仅需快速筛查,可临时切为 RAW 格式减少解析负担:
编辑 /etc/audit/audit.conf,设 log_format = RAW,重启 auditd(注意:这会丢失部分自动解析字段,适合应急排查,不建议长期使用)。另外,aureport -f -i -ts today | head -20 虽快,但它统计的是文件访问,不是 execve 行为——别混用。










