Linux ausearch / aureport 的审计日志过滤与周报生成脚本模板

3次阅读

最稳的失败登录查询用 ausearch –start “today 00:00:00” –end “today 23:59:59” -m login -i | grep “res=failed”,时间字符串必须加双引号,否则 shell 截断报错;查归档日志需手动指定 -f 或用 zcat | ausearch –input -。

Linux ausearch / aureport 的审计日志过滤与周报生成脚本模板

ausearch 按时间范围查失败登录最常用写法

直接用 --start--end 最稳,别信网上那些用 -ts/-te 缩写又不加引号的写法——shell 一碰空格就截断,查不到东西还怪日志没记录。

  • ausearch --start "today 00:00:00" --end "today 23:59:59" -m LOGIN -i | grep "res=failed" —— -i 解析 UID/GID,-m LOGIN 锁定登录事件类型
  • 时间字符串必须加双引号,否则 today 00:00:00 被当两个参数,ausearch 报错 Invalid date format
  • 别用 now-7days 这类相对写法查周报:它按秒级计算,跨夏令时或系统时间跳变时会漏掉几小时日志
  • 如果审计日志轮转过(/var/log/audit/audit.log.1),ausearch 默认只查当前 audit.log,得加 -f /var/log/audit/audit.log.1 手动指定

aureport 生成失败登录统计时字段选错就白跑

aureport-k(key)、-m(message type)、-i(interpret)三者顺序和组合决定输出是否可用,尤其统计失败登录时,-m LOGIN 必须带,否则 -i 解出来的用户字段全是数字,没法聚合。

  • 正确命令:aureport -m LOGIN -i --failure --summary | grep "acct=" —— --failure 过滤 res=failed,--summary 按字段归总,grep "acct=" 排除无关行
  • 错误示范:aureport -i --failure --summary —— 不指定 -m LOGIN,结果混着 SYSCALL、CRED_ACQ 等事件,acct= 字段压根不出现在失败登录里
  • aureport -m LOGIN -i --start "last week" --end "today" 不能直接导出 CSV,它默认用空格对齐,字段含空格(如用户名带空格)就错位;真要进 excel,得用 --format csv,但注意它不自动加引号,含逗号的字段会裂开

用 shell 脚本拼周报时 audit.log 轮转路径容易硬编码错

审计日志轮转不是简单后缀加数字,auditd 默认用 audit.log.N(N 从 1 开始),但 max_log_file_action=rotate 时可能生成 audit.log.1.gz,而 ausearch -f 不支持解压读取 gz 文件——脚本里直接写死 /var/log/audit/audit.log.1 会漏掉压缩归档里的事件。

  • 先查真实存在的日志文件:ls -t /var/log/audit/audit.log* | head -n 5,再用循环逐个 ausearch -f 处理,别只扫 .1
  • 遇到 .gz 文件,用 zcat + ausearch --input - 替代:zcat /var/log/audit/audit.log.1.gz | ausearch --input - -m LOGIN -i --failure
  • 脚本开头加 export TZ=UTC —— 否则本地时区 + ausearch --start "last week" 在跨时区服务器上可能算错七天边界
  • aureport 不接受管道输入,所以汇总多日数据只能先合并原始 log 行(用 ausearch -m LOGIN -i --failure --start X --end Y > tmp.log),再喂给 aureport -f tmp.log

生成周报 PDF 或邮件正文前必须过滤掉 auditd 自身重启事件

每次 systemctl restart auditd 或服务崩溃恢复,都会在日志里插一条 type=DAEMON_START,它带 acct=rootres=success,但跟人无关——不剔除的话,周报里“root 成功登录”次数虚高,运维看了第一反应是被黑了。

  • 在最终输出前加过滤:... | grep -v "type=DAEMON_START|type=CONFIG_CHANGE|msg=audit([0-9]+): ANOM_ABEND"
  • aureport -m LOGIN 默认不包含 DAEMON_START,但如果你用 ausearch 原始抓取再自己 parse,就得手动 skip 这些 type
  • 别依赖 acct!=root 过滤——有些系统服务用 root 权限调 PAM 登录(比如某些 sudo 配置),该留还得留,重点看 typemsg 字段组合
  • PDF 生成环节建议用 wkhtmltopdf 直接转 HTML 表格,别用纯文本塞进 enscript —— 中文或长用户名会导致列宽崩坏,打印出来全是乱码

事情说清了就结束。真正麻烦的是 auditd 配置本身:比如 log_format = ENRICHED 开关会影响 -i 解析结果,还有 SElinux enabled 时部分事件字段为空——这些不在脚本层能绕开。

text=ZqhQzanResources