云端认证:解密Linux known_hosts关键文件

在Linux系统中,当你使用SSH(Secure Shell)首次连接到远程服务器时,经常会看到类似如下的提示:

云端认证:解密Linux known_hosts关键文件

The authenticity of host ‘hostname (xxx.xxx.xxx.xxx)’ can’t be established. RSA key fingerprint is xx:xx:xx… Are you sure you want to continue connecting (yes/no)?

选择“yes”后,系统便会将该远程主机的公钥信息记录在一个名为 known_hosts 的文件中。这个文件是SSH协议实现主机身份验证的核心,其默认路径位于用户家目录下的 ~/.ssh/known_hosts

它的核心作用是防止“中间人攻击”(Man-in-the-Middle Attack)。通过预先记录可信主机的公钥,SSH客户端在后续连接时,会比对远程服务器提供的公钥与本地记录是否一致。如果一致,则建立连接;如果不一致,便会发出严厉警告,提示你主机身份可能已被篡改。

known_hosts 文件的结构解析

虽然 known_hosts 看起来像是一行行杂乱的文本,但其内部结构其实相当严谨。每一行代表一个已记录的主机条目,通常遵循以下格式:

  • 主机标识 (Host Marker): 指定该密钥适用于哪些主机。可以是IP地址、域名,或者一个模式(如 *.example.com)。
  • 密钥类型 (Key Type): 声明公钥的加密算法,例如 ssh-rsa, ecdsa-sha2-nistp256, ssh-ed25519 等。
  • 公钥 (Public Key): 这是最核心的部分,是一长串经过Base64编码的远程主机公钥数据。

一个典型的条目看起来是这样的:

github.com ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==

该文件还支持一些高级选项,例如在行首使用 @revoked 来标记一个已被吊销的密钥,或在行首使用 @cert-authority 来指定一个证书颁发机构。

known_hosts 的哈希化与安全性

出于隐私保护的考虑,你可以选择对 known_hosts 文件中的主机名或IP地址进行哈希处理。哈希化后的条目,其主机标识部分将不再是可读的明文,而是以 |1| 开头的一串哈希值。

例如,一个哈希化的条目可能如下所示:

|1|D2bKl8GDe0N1q06QCGoW6Lp6uOc=|oD8QHn0JLRW8T3+bJ12qZqZ0Wk4= ssh-rsa AAAAB3...

这是通过HMAC-SHA1算法,使用一个随机生成的密钥对主机标识进行计算得出的。这种方式可以有效防止攻击者通过扫描你的 known_hosts 文件来获知你经常访问哪些服务器。你可以通过修改 /etc/ssh/ssh_config 中的 HashKnownHosts 选项来全局启用或禁用此功能。

实战:管理与故障排查

在日常使用中,你可能会遇到与 known_hosts 相关的常见问题。

1. 主机密钥变更警告

当你看到 “WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!” 的恐怖提示时,通常有两种情况:一是服务器确实重建了SSH密钥(例如重装系统后);二是你正遭受中间人攻击。在确认是前者的情况下,你需要从 known_hosts 中移除旧的密钥。

使用 ssh-keygen 工具可以安全地删除指定条目的密钥:

ssh-keygen -R hostname_or_ip

这个命令会精确地删除对应主机的条目,而不会影响到其他记录。

2. 手动添加与查询密钥

你也可以手动获取并信任一个主机的公钥。使用 ssh-keyscan 命令可以获取远程主机的公钥,然后将其追加到你的 known_hosts 文件中。

ssh-keyscan hostname >> ~/.ssh/known_hosts

若要查看某个条目的具体信息,如密钥指纹(更易读的校验和),可以使用:

ssh-keygen -l -f ~/.ssh/known_hosts

系统会列出所有条目的指纹、位长和算法,你可以根据这个信息与服务器管理员提供的正确指纹进行比对。

全局 known_hosts 与高级配置

除了每个用户自己的 ~/.ssh/known_hosts 文件,系统还可以有一个全局的可信主机列表,通常位于 /etc/ssh/ssh_known_hosts。系统管理员可以将组织内所有服务器的公钥放置于此,方便统一管理。

SSH客户端的行为可以通过配置文件进行高度定制。以下是一些常用选项:

配置选项 作用
StrictHostKeyChecking 设置为 “no” 可自动接受新主机密钥;设置为 “yes” 则要求手动确认;”ask” 是默认值。
UserKnownHostsFile 指定用户自定义的 known_hosts 文件路径。
GlobalKnownHostsFile 指定系统全局的 known_hosts 文件路径。
CheckHostIP 设置为 “yes” 时,SSH会检查连接IP与 known_hosts 中记录的主机名是否对应。

总结与最佳实践

known_hosts 文件是SSH安全体系中一个简单却至关重要的组件。它通过一个本地化的“信任名单”,为每一次远程连接保驾护航。理解其工作原理,能让你在享受SSH便利的更好地掌控安全风险。

最佳实践建议:

  • 谨慎对待密钥变更警告:切勿忽视“主机密钥已变更”的警告,务必先通过其他可靠渠道确认服务器变更情况。
  • 定期审计:偶尔检查一下你的 known_hosts 文件,清理那些你不再访问的服务器条目。
  • 考虑启用哈希化:如果担心隐私泄露,可以启用 HashKnownHosts 选项。
  • 备份与同步:在多台机器上工作时,妥善备份或同步你的 known_hosts 文件可以避免重复的确认操作。

掌握了 known_hosts 的奥秘,你就在云端认证的世界里拥有了一把开启安全之门的钥匙。

内容均以整理官方公开资料,价格可能随活动调整,请以购买页面显示为准,如涉侵权,请联系客服处理。

本文由星速云发布。发布者:星速云。禁止采集与转载行为,违者必究。出处:https://www.67wa.com/134736.html

(0)
上一篇 2025年11月27日 上午4:27
下一篇 2025年11月27日 上午4:28
联系我们
关注微信
关注微信
分享本页
返回顶部