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

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=root 和 res=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 配置),该留还得留,重点看type和msg字段组合 - PDF 生成环节建议用
wkhtmltopdf直接转 HTML 表格,别用纯文本塞进enscript—— 中文或长用户名会导致列宽崩坏,打印出来全是乱码
事情说清了就结束。真正麻烦的是 auditd 配置本身:比如 log_format = ENRICHED 开关会影响 -i 解析结果,还有 SELinux enabled 时部分事件字段为空——这些不在脚本层能绕开。










