SSH 日志管理与安全分析:配置、解读与暴力破解告警
SSH 日志记录了每一次远程登录尝试,是服务器安全的第一道情报来源。本文讲解 SSH 日志的存放位置、典型条目解读、LogLevel 与 SyslogFacility 配置、grep/awk/journalctl 分析命令,以及用观测云实现暴力破解实时告警的落地方案。
SSH 日志(SSH Log)是由 SSH 守护进程 sshd 生成的安全审计记录,涵盖登录成功/失败、认证方式、来源 IP、会话断开等全部远程访问事件,是发现暴力破解与未授权访问的核心数据源。 凡是有公网 IP 的服务器,SSH 日志里从不缺少"访客"——区别在于你是否在看。
核心要点速览
- 日志位置:Debian/Ubuntu 在
/var/log/auth.log,RHEL/CentOS 在/var/log/secure,systemd 系统用journalctl -u ssh; - 生产推荐
LogLevel VERBOSE——多记一行密钥指纹,审计价值远超存储成本; - 单机分析三板斧:grep 过滤失败记录、awk 统计 TOP 来源 IP、journalctl 按时间/级别过滤;
- 持续安全监控的正确姿势:DataKit 采集 → Pipeline 结构化 → 观测云监控器对"失败次数突增、root 登录成功"实时告警。
SSH 日志存在哪里?
| 环境 | 位置/方式 |
|---|---|
| Debian / Ubuntu | /var/log/auth.log |
| RHEL / CentOS / Fedora | /var/log/secure |
| systemd 系统 | journalctl -u ssh(可加 -f 实时跟踪) |
拿不准时可查配置确认:grep -i log /etc/ssh/sshd_config。
典型日志条目解读
成功登录(密码/密钥):
Jul 17 15:45:23 web sshd[5678]: Accepted password for devuser from 10.0.2.15 port 49812 ssh2
Jul 17 15:49:45 web sshd[5680]: Accepted publickey for jenkins from 10.0.2.20 port 52413 ssh2: RSA SHA256:LmNo...
失败尝试(重点监控对象):
Jul 17 15:47:10 web sshd[5679]: Failed password for invalid user admin from 45.227.253.82 port 38654 ssh2
invalid user 表示对方尝试了一个系统上不存在的用户名——扫描探测的典型特征。
会话断开:
Jul 17 16:02:33 web sshd[5678]: Disconnected from user devuser 10.0.2.15 port 49812
每条日志都包含五要素:时间、主机、进程(sshd[PID])、事件、来源(用户/IP/端口/协议)。
日志详细程度怎么调?
编辑 /etc/ssh/sshd_config:
LogLevel VERBOSE
SyslogFacility AUTHPRIV
LogLevel可选QUIET/FATAL/ERROR/INFO/VERBOSE/DEBUG(1-3)。生产推荐VERBOSE——成功登录会附带密钥指纹,事后审计能精确定位是哪把钥匙开的门。DEBUG 仅排障时临时开启;SyslogFacility决定日志归入哪个 syslog 设施,AUTHPRIV访问受限更严格,适合认证类敏感日志。
改完执行 sudo systemctl restart sshd 生效。
单机分析:常用命令组合
# 所有失败登录
grep "Failed password" /var/log/auth.log
# 按来源 IP 统计失败次数,降序排列——暴力破解来源一目了然
grep "Failed password" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -nr | head
# journalctl 进阶过滤
journalctl -u ssh --since "1 hour ago" # 最近一小时
journalctl -u ssh -p err # 仅错误级
journalctl -u ssh -f # 实时跟踪
排障速查
- 用户报无法登录:先
grep "authentication failure" auth.log; - 权限问题:
grep "bad ownership or modes"——SSH 对~/.ssh(700)与authorized_keys(600)权限极敏感; - 密钥被拒绝:
grep "key_read"相关记录。
集中监控:从"定期抽查"到"实时告警"
单机命令适合临时排查,但安全监控必须是 7×24 的。观测云落地:
- 采集与结构化:DataKit 磁盘文件采集
auth.log/secure,Pipeline grok 切割出username、src_ip、auth_method等字段,含Failed的行标记status = "error"、Accepted标记为info; - 实时检索与聚类:日志查看器中按
src_ip分组看攻击来源排行,聚类分析自动归并扫描器刷出的海量同类记录,新型攻击模式(如换了一批罕见用户名)即刻浮现 ; - 监控器告警(监控 > 监控器 > 日志检测):
- root 登录成功:出现 ≥1 条即触发,即时推送;
- 暴力破解:同一
src_ip5 分钟内失败 > 20 次触发; - 异常维度:密码认证成功(应全走密钥)、非白名单 IP/用户登录成功;
- 告警策略绑定钉钉/企业微信/飞书通知对象,事件中心统一跟进;
- 配合加固:禁 root 直连、禁密码登录、改默认端口、Fail2Ban 封禁、MFA——监控发现规律,加固堵住入口,两者缺一不可。
总结
SSH 日志安全运营的要义:VERBOSE 级别保证证据完整,集中化保证不漏一台机器,监控器保证第一时间知道。命令行回答"刚才发生了什么",观测云回答"此刻全网每台机器正在发生什么"。
常见问题(FAQ)
Q:auth.log 里全是陌生 IP 的失败记录,服务器被入侵了吗?
失败记录本身不代表入侵——公网服务器被扫描是常态。需要警惕的信号是:出现 Accepted 的可疑成功登录、针对真实用户名的高频尝试、来自可信 IP 段的异常失败(可能内鬼或跳板失陷)。
Q:LogLevel DEBUG 能长期开吗?
不建议。DEBUG(尤其 DEBUG3)会记录大量会话细节,日志体积暴涨且可能含敏感信息。排障时临时开启,问题解决后调回 VERBOSE。
Q:如何区分自己的登录和攻击者的登录?
三点核对:来源 IP 是否在你的常用网络/跳板机白名单内、认证方式是否为密钥、登录时间是否符合你的工作时段。这正是要把成功登录也纳入告警并记录密钥指纹的原因。
Q:观测云里能直接看到"谁在扫我"的统计吗?
可以。日志查看器中按 src_ip 对 status: error 的 SSH 日志做分组计数即可得到 TOP 攻击来源列表,该视图可导出到仪表板长期跟踪。
系列阅读:Linux 认证日志监控实战 | 日志监控是什么