记录的是主动连接过的主机
SSH 客户端第一次连接某台主机时会记录对方的公钥指纹到 ~/.ssh/known_hosts,下次连接时用于校验。从取证角度看,这个文件反映的是本机作为客户端主动连出去的目标:它是判断「这台主机有没有横向连接到别处」的线索之一,视角与服务器端的认证日志正好互补。
哈希化条目怎么处理
出于隐私考虑,很多发行版默认开启 HashKnownHosts,写入的主机名是加盐哈希值,直接读文件看不到明文主机名,只能统计条目数量。要判断某个具体主机是否在列表里,可以用 ssh-keygen 的查找功能按主机名比对,而不是靠肉眼或字符串搜索。
基本信息
| 适用平台 | Linux/macOS(OpenSSH 客户端) |
|---|---|
| 路径 | ~/.ssh/known_hosts,也可能在 ~/.ssh/known_hosts2 |
| 条目形态 | 明文主机名或哈希化主机名加公钥类型与密钥 |
| 哈希默认 | 多数发行版默认开启 HashKnownHosts |
| 查找命令 | ssh-keygen -F <主机名> 检查该主机是否在列表中 |
典型使用场景
- 判断横向活动:确认本机是否连接到过其他内网主机
- 解释出站连接:配合认证日志说明某个 SSH 连接的来源与目标
- 清理确认:处置后核对清单中是否仍有可疑目标
- 批量盘点:统计多台主机 known_hosts 的交集,找出共同跳板
- 与其他线索互证:远程主机地址可与网络日志中的出站连接对照
查看与查找
查看与查找
# 条目数量与文件时间
wc -l /root/.ssh/known_hosts 2>/dev/null
stat -c '%n | mtime=%y' /root/.ssh/known_hosts 2>/dev/null
# 明文条目下可以直接取第一列(哈希条目取出来是乱码)
cut -d' ' -f1 /root/.ssh/known_hosts 2>/dev/null | head -20
# 判断某台主机是否在列表中(哈希条目也能查)
ssh-keygen -F 10.0.3.21 2>/dev/null
# 逐个核对清单中的目标是否仍应存在
for h in 10.0.3.21 10.0.3.22; do printf '%s -> ' "$h"; ssh-keygen -F "$h" >/dev/null 2>&1 && echo 在列 || echo 不在列; done文件条目读法
| 字段 | 含义 | 分析用法 |
|---|---|---|
| 主机名或哈希值 | 连接过的目标主机 | 哈希条目需用命令行查找 |
| 密钥类型 | 如 ssh-ed25519、ssh-rsa | 可辅助判断客户端版本与配置 |
| 公钥内容 | 对端主机公钥 | 与目标主机实际公钥比对可确认身份 |
| 被注释的条目 | 以 # 开头 | 可能表示连接失败或被移除 |
| 文件时间 | 最后写入时刻 | 新增条目时间接近事件窗口即值得深查 |
条目只说明连接过,不代表登录成功:认证失败同样可能在交互过程中留下记录,判断成功与否要回到目标主机的认证日志。
清理该文件不会影响服务端日志,双向核对(本机 known_hosts 与对端登录记录)才能确认一次横向连接是否真正发生。