audit.log 海量日志如何快速过滤出可疑 execve syscall

12次阅读

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

audit.log 海量日志如何快速过滤出可疑 execve syscall

直接结论:别用 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 行为——别混用。

text=ZqhQzanResources