突增本身就是线索
把某类事件单独抽出来统计频率,比看全量日志更容易看出异常:失败登录在某个小时集中爆发、Web 日志出现大量 5xx、同一路径被反复请求、某个 User-Agent 突然高频出现,这些都是扫描、爆破或攻击尝试的典型形态。做法是按小时或十分钟聚合计数,找出峰值时段。
先减去正常业务曲线
监控探活、健康检查、爬虫与业务批量操作本身就会产生规律性高频事件。判断突增前先把已知的固定频率来源标出来,剩下的离群计数才值得深入看,否则报告里会出现大量「疑似扫描」其实是内部监控的结论。
基本信息
| 适用平台 | Linux 命令行(grep、awk、sort、uniq、zgrep) |
|---|---|
| 统计对象 | 失败登录、特定状态码、特定路径、特定 User-Agent、特定域名 |
| 聚合粒度 | 按小时为主,攻击短促时改用十分钟 |
| 对照基线 | 同主机前后时段的分布、同类主机的横向对比 |
| 输出 | 峰值时段清单加对应来源地址与请求特征 |
典型使用场景
- 确认爆破时间段与来源:按小时统计失败登录,再看来源地址分布
- 定位扫描行为:统计同一来源在短时间内的多路径请求
- 发现异常状态码:Web 日志里 5xx 集中出现,可能是利用成功的迹象
- 识别异常客户端:某个 User-Agent 或工具特征在特定时段集中出现
- 验证防护效果:某时段后计数归零,说明封禁或加固起了作用
按事件统计频率
按事件统计频率
# 失败登录:按小时聚合
awk '/Failed password|Failed publickey/ {print substr($3,1,2)}' /var/log/auth.log | sort | uniq -c
# 同时看来源地址分布,判断是单源还是多源
grep 'Failed password' /var/log/auth.log | \
grep -oE 'from [0-9a-fA-F:.]+ port' | awk '{print $2}' | sort | uniq -c | sort -rn | head -20
# Web 日志:压缩历史一起统计 5xx 的时间分布
zgrep -hE ' 5[0-9][0-9] ' /var/log/nginx/access.log* 2>/dev/null | cut -c1-16 | uniq -c | tail -20
# 特定路径被高频请求
zcat /var/log/nginx/access.log.*.gz 2>/dev/null | awk '{print $7}' | sort | uniq -c | sort -rn | head突增模式与常见含义
| 模式 | 常见含义 | 验证方式 |
|---|---|---|
| 同源高频失败登录 | 口令爆破 | 看来源地址与尝试的用户名集合 |
| 同源多路径 404 | 目录扫描或漏洞探测 | 看请求路径的字典特征 |
| 固定间隔规律请求 | 监控探活或计划任务 | 与监控配置、任务计划表比对 |
| 5xx 集中出现 | 利用尝试或服务异常 | 对照错误日志与变更记录 |
| 单一 UA 高频 | 自动化工具或爬虫 | 提取 UA 与其他来源横向对比 |
统计口径必须一致:同一个表里混用「按行计数」与「按唯一实体计数」,或者一部分文件没加 -h 导致带文件名前缀,都会让结果不可比。
轮转后的压缩文件要一并纳入统计,否则最早的一段(往往正是攻击开始的时间)会被漏掉;用 zgrep -h 处理多文件可避免输出里混入文件名。