主机密钥与变更检测
主机密钥在系统安装或首次启动时生成,客户端首次连接会记录其指纹,之后用于校验对端身份。密钥文件的生成时间与指纹因此成为判断依据:整套密钥的时间戳都很新,通常意味着系统重装或密钥被主动重建;只有一个密钥文件被改动而其他文件时间不变,更值得怀疑。把指纹与资产台账中的登记值比对,是最快能发现密钥被替换的做法,也是识别中间人设备的常用手段。
基本信息
| 文件 | /etc/ssh/ssh_host_*_key 及对应的 .pub 公钥 |
|---|---|
| 指纹命令 | ssh-keygen -lf <公钥> -E sha256(-E md5 可对照老格式) |
| 时间基线 | 随系统安装生成,可能因重装或升级被重建 |
| 权限基线 | 私钥 600,公钥 644 |
典型使用场景
- 把指纹与资产台账比对,确认主机未被替换
- 排查客户端提示主机密钥变更的真实原因
- 判断主机是否在事件时间窗内发生过重装
- 核查是否有单个密钥文件被单独替换的痕迹
- 为报告提供主机身份的可验证记录
查看时间与指纹
查看时间与指纹
ls -l --time-style=long-iso /etc/ssh/ssh_host_*_key* # 看密钥生成时间是否一致
for f in /etc/ssh/ssh_host_*_key.pub; do ssh-keygen -lf "$f" -E sha256; done
ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub -E md5 # 老格式指纹对照
stat -c '%n %y %a' /etc/ssh/ssh_host_ed25519_key # 私钥时间与权限
grep -i 'host key' /var/log/secure | tail -5 # 日志中与主机密钥相关的提示指纹输出读法
| 字段 | 含义 | 判读要点 |
|---|---|---|
| 位长 | 密钥长度 | 位长过短属历史遗留,建议更新 |
| SHA256 指纹 | 公钥摘要,Base64 形式 | 与台账逐字符比对,不看前缀 |
| 注释字段 | 通常为 hostname 或安装信息 | 注释可被修改,不能作为依据 |
| 密钥算法 | rsa、ecdsa、ed25519 等 | 整套密钥时间应基本一致 |
重新安装 openssh 包或重建镜像可能触发密钥重新生成,出现变更时先查包管理日志与系统安装记录,再判断性质。
公钥与私钥要成对核对:仅比对公钥无法确认私钥是否被替换,可用 ssh-keygen -y 从私钥导出公钥做一致性验证。
客户端 known_hosts 中保留了对端主机的历史指纹,把服务端当前指纹与客户端记录对照,可以判断变更大约发生在哪一次连接之后,是定位变更时间点的常用辅助手段。