首页/安全/应急响应速查/SSH 爆破日志分析与成功判定

SSH 爆破日志分析与成功判定

从 auth.log/secure 提取失败来源与频率,并把失败与成功记录对照,判断爆破是否已经突破——只统计失败量没有意义。

应急响应速查安全更新于 2026-10-13

SSH 爆破日志分析

SSH 爆破几乎发生在每一台暴露到公网的主机上,所以「失败次数多」本身不构成事件。真正要回答的是三个问题:有没有成功登录、成功的是哪个账号、成功后执行了什么。分析方法是先按来源 IP 与目标账号聚合失败记录,再把时间窗前后推一步去看有没有对应的 Accepted 记录——只统计失败量的报告对处置没有任何指导意义。

基本信息

日志位置Debian 系 /var/log/auth.log,RHEL 系 /var/log/secure,部分系统在 journald
失败关键字Failed password、Invalid user、Authentication failure、Connection closed by authenticating user
成功关键字Accepted password、Accepted publickey、session opened for user
轮转文件auth.log.1 与压缩后的 .gz 需用 zgrep 检索,否则历史窗口被截断
时间基准日志使用系统本地时区,分析前先确认时区并统一为 UTC
辅助证据last、lastb、authorized_keys 的 mtime、sudo 日志、命令历史

典型使用场景

  • 安全设备告警提示某 IP 高频登录失败,需要判断是否已突破
  • 主机出现陌生外联,回溯登录入口确认是否为 SSH 密码爆破得手
  • 评估现有加固策略(密钥认证、来源限制、失败锁定)是否有效
  • 统计被尝试的账号名,判断是随机字典还是针对本单位账号的定向尝试
  • 为边界封禁与告警规则优化提供依据

失败聚合与成功对照

失败聚合与成功对照
grep -h 'Failed password' /var/log/auth.log* 2>/dev/null | grep -oE 'from [0-9.]+' | awk '{print $2}' | sort | uniq -c | sort -rn | head -n 10   # 失败来源
grep -h 'Invalid user' /var/log/auth.log* 2>/dev/null | grep -oE 'user [^ ]+' | sort | uniq -c | sort -rn | head -n 10                          # 被尝试的账号
sudo grep -hE 'Accepted (password|publickey)' /var/log/auth.log* 2>/dev/null | tail -n 20                                                        # 成功登录
sudo zgrep -h 'Accepted' /var/log/auth.log.*.gz 2>/dev/null | tail -n 20                                                                          # 轮转历史也要看
sudo grep -E 'Accepted|session opened' /var/log/auth.log | head -n 5                                                                               # 确认日志格式与字段位

日志行读法

字段含义异常信号
时间戳月 日 时:分:秒,本地时区与告警时间、文件落地时间对齐才有意义
主机名写日志的主机集中式日志里用于区分来源主机
进程与 PIDsshd 与进程号同一 PID 连续大量失败说明是同一条连接在重试
动作Failed password、Invalid user、Accepted、session opened失败与成功混合出现最需要警惕
用户名认证目标账号root、admin 以及本单位真实账号被尝试属定向攻击
来源 IP 与端口客户端地址与源端口同一 IP 变换端口反复尝试是自动化工具特征
认证方式password 或 publickeypublickey 成功时要顺带核对公钥指纹是否在台账内
判定口径要写死:同一来源在短时间内先出现大量 Failed password,紧接着出现 Accepted,就按「已突破」处理,立即进入账号处置流程——核查该账号的密钥文件、命令历史、sudo 记录与新增进程,而不是先去封 IP。
密钥登录也要核指纹:Accepted publickey 行会带出密钥类型与指纹,把它与 authorized_keys 里的指纹、运维台账逐条比对,能发现「密钥认证被滥用」这类密码爆破之外的入口。

突破后的动作核对

突破后的动作核对
sudo last -aiF -n 20                                    # 该来源是否有真实会话
sudo ls -l --time-style=full-iso /root/.ssh /home/*/.ssh 2>/dev/null | head -n 20   # 密钥文件改动时间
sudo grep -rE 'sudo:\s+[^:]+:' /var/log/auth.log | tail -n 10    # 是否使用了 sudo
sudo tail -n 200 /root/.bash_history 2>/dev/null         # 登录后执行了什么
sudo ss -antp | grep -E 'ESTAB' | head -n 20             # 当前是否仍有回连
封禁要区分噪声源:监控探针、漏扫平台与堡垒机也会持续产生失败记录,先与台账核对来源再批量封禁,避免误封导致监控盲区。
结论建议写成三行便于交接与复核:尝试来源与总量、是否出现成功登录、成功之后执行了什么动作。只写「存在大量爆破尝试」的结论既无法支撑后续处置,也无法评估加固措施是否有效。
排查时间窗建议覆盖告警时间前后各 24 小时,并把上一次轮转的文件一起纳入,否则容易漏掉真正的首次尝试时间。

易错点

  • 只看失败次数:不对照 Accepted 记录,可能漏掉已经突破的账号
  • 忽略轮转文件:auth.log.1 与 .gz 里往往正好是被突破的那段时间,必须用 zgrep 一并检索
  • 把大量失败直接当成事件定级为最高级:多次扫描本不构成严重事件,应以是否突破为准
  • 封禁时不核对白名单:把监控与漏扫来源一起封掉,造成盲区与误告警
  • 只看密码登录不看密钥:Accepted publickey 同样需要核对指纹归属

数据来源与参考

  • OpenSSH 日志格式(Ubuntu Server 文档)
  • MITRE ATT&CK T1110 Brute Force

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌