关于 Linux 中 known_hosts 文件的所有重要信息

如果您查看主目录中的 .ssh 文件夹,您会在其他文件中看到 known_hosts 文件。

[email protected]:~$ ls -l .ssh
total 16
-rwxr-xr-x 1 abhishek abhishek  618 Aug 30 16:52 config
-rw------- 1 abhishek abhishek 1766 Nov 12  2017 id_rsa
-rw-r--r-- 1 abhishek abhishek  398 Nov 12  2017 id_rsa.pub
-rw------- 1 abhishek abhishek    1 Sep 26 15:00 known_hosts

这里, id_rsa 是您的私有 SSH 密钥,id_rsa.pub 是公共 SSH 密钥。 SSH 中的配置文件用于创建配置文件以轻松连接到各种主机。 它不是一个通用文件,我专门创建了它。

本文的重点是最后一个文件, known_hosts. 这个 ~/.ssh/known_hosts 文件是客户端 SSH 配置文件的重要组成部分。

让我分享更多关于它的细节。

SSH 中的 known_hosts 文件是什么?

known_hosts 文件存储用户访问的主机的公钥。 这是一个非常重要的文件,它通过将用户身份保存到本地系统来确保用户连接到合法服务器。 它还有助于避免 中间人攻击.

当您通过 SSH 连接到新的远程服务器时,系统会提示您是否要将远程主机添加到 known_hosts 文件。

该消息基本上询问您是否要将远程系统的详细信息添加到您的系统中。

The authenticity of host '194.195.118.85 (194.195.118.85)' can't be established.
ED25519 key fingerprint is SHA256:wF2qILJg7VbqEE4/zWmyMTSwy3ja7be1jTIg3WzmpeE.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])?

如果选择 yes,服务器的身份将保存到您的系统中。

避免中间人攻击

假设您定期连接到服务器并将其添加到 known_hosts 文件中。

如果远程服务器的公钥发生更改,您的系统将通过 known_hosts 文件中存储的信息记录此更改。 您将立即收到有关此更改的警报:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: POSSIBLE DNS SPOOFING DETECTED!
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
The RSA host key for xyz remote host has changed,and the key for the corresponding IP address xxx.yy.xxx.yy is unknown. This could either mean that DNS SPOOFING is happening or the IP address for the host and its host key have changed at the same time.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that the RSA host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
69:4e:bb:70:6a:64:e3:78:07:6f:b4:00:41:07:d8:9c.
Please contact your system administrator.
Add correct host key in /home/.ssh/known_hosts to get rid of this message.
Offending key in /home/.ssh/known_hosts:1
Keyboard-interactive authentication is disabled to avoid man-in-the-middle attacks.

在这种情况下,您可以在接受此新密钥之前联系远程服务器的管理员。 通过这种方式,您可以确保远程服务器或主机没有受到威胁。

有时会故意更改服务器或主机的密钥 管理员或重新安装服务器。

无论此更改的原因是什么,您都需要首先从 known_hosts 文件中删除旧密钥,以便重新连接到远程服务器。 下次连接此服务器时,客户端主机将为该服务器创建一个新的主机密钥。

管理多个经过身份验证的用户

如前所述,一旦客户端主机成功连接到远程服务器,其 known_hosts 文件将附加服务器的公钥。

有时,您希望在不提示服务器密钥验证的情况下向多个用户验证服务器。 为了 example,您正在运行某种配置管理工具,例如 Ansible,并且您不希望客户端主机要求服务器密钥验证。

因此,如果您有多个用户,您可以使用三种方式绕过 SSH 交互提示:

  • 手动将服务器的公钥附加到每个用户的 known_hosts 文件中。
  • 使用命令行选项 -o StrictHostKeyChecking=no 通过 SSH 访问服务器时与每个客户端一起使用(不推荐)
  • 在主 ssh_known_hosts 文件中注册所有主机,然后将此文件编排到所有客户端主机。 此外,为了完成这项工作,可以使用 ssh-keyscan 命令:
ssh-keyscan -H -t rsa ‘your-server-ip’ >> /etc/ssh/ssh_known_hosts

下面的屏幕截图显示了如何使用 StrictHostKeyChecking=no 选项:

使用 StrictHostKeyChecking=no 开关绕过主机密钥检查

与其他两种方法相比,第一种管理多个用户以验证服务器的方法是最麻烦的。

从 known_hosts 文件获取远程系统详细信息

这不是一项简单而直接的任务。

几乎所有的 Linux 系统集 HashKnownHosts 在 SSH 配置文件中将参数设置为 Yes。 这是一项安全功能。

这意味着 known_hosts 文件中的详细信息是经过哈希处理的。 你可以看到随机数,但不能从中做出任何事情。

[email protected]:~$ cat .ssh/known_hosts

|1|yWIW17YIg0wBRXJ8Ktt4mcfBqsk=|cFHOrZ8VEx0vdOjau2XQr/K7B/c= ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFR293PJnDCj59XxfqYGctrMo60ZU5IOjACZZNRp9D6f
|1|Ta7hoH/az4O3l2dwfaKh8O2jitI=|WGU5TKhMA+2og1qMKE6kmynFNYo= ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCmrxLW436AyBGyGCggl/j2qBCr782AVIvbiTEsWNBWLcWMKYAQpTdAXnaV4bBRqnk2NJg/60XDHKC2DF1tzx6ABWN/R6vcUAbulI9H1RUWpJ1AiDmFL84MvW2UukbpN5a6Lr+DvjclVqPxJRjQKr6Vy2K9oJgGKnHVcWSIHeAlW49kCCg5fIxF8stBTqJg0cRk6uxmcYVud1vh9a7SaZGK+jFZTB75RiHAVFuitHWpljecMxJRNYy/EhmmXrrvyU8pObVXlWlDd61uwExi4uEwNSY+Do7vR1y8svnt9mjTzzyM6MhT4sOcxWmNgdmw7bU/wPpie3dSjZMQeu2mQCSM7SG28dwjSyFPpanRsZKzkh0okAaCSItoNwl6zOf6dE3zt0s5EI6BPolhFAbT3NqmXRblxb7eV8rGEPf14iguHUkg6ZQr2OUdfeN1FYNMJ8Gb9RD159Mwjl4/jPIBdnXvt7zYct3XhPKm7Wxv4K/RWZE837C7mGQh2KEahWajdq8=
|1|NonAy25kVXL24U2mx6ZNxAY5m98=|ypf0IMpf3qq3vhrvUMprssOhODs= ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBE3br/9jaZfdB+qBxiVEZBJMb4XQONwzV4tH1xeFZX/zkyws2eBHrVO9O5l9b6M6+gO6nBtCwAzzaeLOn6mo8GQ=

如果您知道系统的主机名或 IP 地址,则可以从 known_hosts 获取相关条目:

ssh-keygen -l -F <server-IP-or-hostname>

但是,如果您想要一个可以以明文形式列出所有服务器及其详细信息的命令,那是不可能的。

有用于破译 known_hosts 的特制工具和脚本,但这不在像你我这样的普通用户的范围内。

从 known_hosts 中删除一个条目

如果要从 known_hosts 文件中删除特定条目,则可以在知道远程系统的主机名或 IP 的情况下执行此操作。

ssh-keygen -R server-hostname-or-IP

这比识别与服务器相关的条目然后使用 rm 命令手动删除它们要好得多。

结论

通过正确了解各种 SSH 配置文件,您可以更好地掌握系统安全性。 “Known_hosts”是这些文件的重要组成部分。

我在这里只介绍了 known_hosts 文件; 如果您想了解更多关于 SSH 的信息,请查看我们的 Linux 中 SSH 入门指南。