失败统计能说明什么
把认证日志里的 Failed password 行按来源 IP 与账号聚合,得到的是爆破的规模与结构:有多少次尝试、来自几个来源、针对哪些账号、持续了多久。这组数字有三重用途——作为阻断依据、作为时间线上的密度信号、以及作为「是否得手」的前置条件(大量失败之后是否出现成功登录)。聚合前要先确认日志覆盖范围,轮转文件不纳入统计会让规模被严重低估。
基本信息
| 数据来源 | /var/log/auth.log(Debian 系)、/var/log/secure(RHEL 系)及其轮转文件 |
|---|---|
| 聚合维度 | 来源 IP、被尝试账号、时间分布(按小时或按天) |
| 关键模式 | Failed password、Invalid user、Connection closed by authenticating user |
| 配套证据 | btmp/lastb(失败记录文件)、成功登录的 Accepted 行 |
| 环境干扰 | 前置代理、跳板机、容器网络会让日志中的 IP 变成代理地址 |
| 产出形式 | 聚合统计表 + 时间分布图,作为报告的量化部分 |
典型使用场景
- 评估爆破强度:总量、来源数、时间跨度
- 为封禁与限速策略提供依据(哪些 IP 该进黑名单)
- 判断攻击是广撒网还是针对特定账号(决定口令策略优先级)
- 把失败高峰与业务异常时间段对齐,判断是否伴随其他攻击行为
- 确认拦截措施是否生效:封禁后同一来源的记录是否停止
- 为「未得手」的结论提供支撑,避免只凭没有成功记录就下判断
聚合统计
聚合统计
# 总次数与轮转文件一起统计,避免漏高峰
zgrep -c 'Failed password' /var/log/auth.log* 2>/dev/null | tail -5
# 按来源地址聚合,取前 20
zcat -f /var/log/auth.log* 2>/dev/null | grep -oE 'from [0-9a-fA-F:.]+ port' | awk '{print $2}' | sort | uniq -c | sort -rn | head -20
# 按被尝试账号聚合
zcat -f /var/log/auth.log* 2>/dev/null | grep -oE 'Invalid user [^ ]+|Failed password for [^ ]+' | awk '{print $NF}' | sort | uniq -c | sort -rn | head -20
# 按小时看分布,定位攻击高峰
zcat -f /var/log/auth.log* 2>/dev/null | grep 'Failed password' | awk '{print $1,$2,$3}' | cut -d: -f1 | sort | uniq -c
# 是否存在失败之后的成功(得手信号)
zcat -f /var/log/auth.log* 2>/dev/null | grep -E 'Accepted|Failed' | tail -40统计口径与判读
| 统计项 | 含义 | 判读要点 |
|---|---|---|
| 尝试总量 | 指定时间窗内的失败次数 | 与业务规模对比才有意义;单看绝对值容易夸大 |
| 来源 IP 数 | 不同来源地址的数量 | 大量分散来源多为僵尸网络扫描 |
| Top 来源占比 | 单个 IP 占全部尝试的比例 | 集中在一两个来源说明是定向目标 |
| 被尝试账号 | 涉及的用户名 | 出现不存在的账号名说明按字典批量尝试 |
| 失败与成功比 | 同来源的失败次数与是否出现成功 | 失败后短时间内出现成功,是要优先排查的组合 |
同一 IP 对大量不同账号失败,通常是字典爆破;同一账号被反复尝试,更像是针对性的口令猜测。两种情形的处置优先级不同,聚合时按维度分开看。
引入 fail2ban、反向代理或负载均衡后,日志中记录的来源地址可能是代理地址而不是真实客户端。统计前先确认部署结构,否则会把内网地址误判为攻击来源。
统计只覆盖日志保留期内的数据。超出保留期的历史尝试已不可见,报告里应写明统计区间,不要把它当作完整历史。