下面是一段关于 Linux 系统中 ~/.ssh/known_hosts
文件的简要说明和补充信息,帮助你更好地理解和使用该文件:
1. 什么是 known_hosts
文件
- 概念:
known_hosts
是存储“已知远程主机公钥”的文件。当我们使用 SSH 连接到远程服务器时,SSH 客户端会检查该服务器的公钥是否已记录在known_hosts
文件中,以确保连接到的是预期的服务器,而不是被中间人攻击所冒充的服务器。 - 作用:通过校验服务器的公钥,SSH 可以防止中间人攻击,确保连接的真实性和安全性。
2. known_hosts
的默认路径
- 位置:通常位于当前用户家目录下的
~/.ssh/known_hosts
。 - 权限:一般情况下,
~/.ssh
目录的权限通常为 700(仅用户自己可访问),known_hosts
文件的权限为 644(用户读写、组读、其他读),或者更严格一些,这取决于系统的安全策略。
3. known_hosts
文件中的记录格式
每一条记录通常包括以下信息:
- 远程主机名(或 IP 地址)
- SSH 公钥算法类型(例如
ssh-rsa
、ecdsa-sha2-nistp256
等) - 远程主机的公钥
示例条目(简化示例):
example.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC...
在实际环境中,公钥字符串会更长。
4. known_hosts
的常见使用场景
首次连接到新的远程主机:
- 当你第一次使用 SSH 连接到一台尚未在
known_hosts
中记录过的主机时,系统会提示你确认“主机指纹”,一旦你选择“是”,主机的公钥就会写入到known_hosts
文件里。 - 确认后再次连接同一主机时,SSH 就会对比
known_hosts
中的记录来验证主机的真实性,连接时不会再弹出提示。
- 当你第一次使用 SSH 连接到一台尚未在
主机公钥发生变化:
- 如果远程主机的公钥发生了变化,SSH 会发出警告(例如
WARNING: POSSIBLE DNS SPOOFING DETECTED!
或REMOTE HOST IDENTIFICATION HAS CHANGED!
)。 这有可能是以下原因所致:
- 服务器做了重新安装或更换密钥。
- 公钥真的被恶意篡改,存在安全风险。
- 此时需要确认变更是否可信,如果确认无风险,可以手动从
known_hosts
中删除旧的公钥条目,再重新连接以添加新公钥。
- 如果远程主机的公钥发生了变化,SSH 会发出警告(例如
5. 如何维护 known_hosts
查看
known_hosts
- 直接使用文本编辑器(如
vim
、nano
)打开~/.ssh/known_hosts
查看。 - 也可以使用
ssh-keygen -l -f ~/.ssh/known_hosts
查看所有主机条目的指纹。
- 直接使用文本编辑器(如
删除特定主机条目
- 如果需要删除特定主机的条目,可以直接在文本编辑器中删除相应行。
也可使用
ssh-keygen -R <hostname>
命令自动删除某个指定主机的记录。例如:ssh-keygen -R example.com
这条命令会在
known_hosts
中自动查找并删除example.com
相关的条目。
手动添加公钥
- 在需要的情况下,你也可以手动将某个远程主机的公钥条目添加到
known_hosts
中(比如在批量部署脚本中或提前分发公钥的场景)。 - 格式需要与
known_hosts
内已有的条目一致。
- 在需要的情况下,你也可以手动将某个远程主机的公钥条目添加到
6. 总结
known_hosts
文件是 SSH 验证远程主机身份的重要机制,通过存储并校验服务器公钥,避免了因公钥被冒充或篡改引发的安全风险。- 维护好该文件,及时添加、删除或更新远程主机的公钥,可以大幅降低 SSH 连接遭到中间人攻击的可能性,确保连接的安全性和可靠性。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。