Linux系统管理员基础知识:解决已知主机故障的问题

234 阅读2分钟

原文地址:www.redhat.com/sysadmin/li…

"p1120431" by generalising is licensed under CC BY-SA 2.0

SSH很容易使用,但是当某些东西导致你的know_hosts反作用于你的时候,就会让人很沮丧。这里是如何解决这个问题的。

SSH很容易使用,而且一般没有问题。但是,在你的主目录中有一个小文件,它可能成为这个无处不在的协议和工具的一个罕见的痛点。违规的实体是~/.ssh/known_hosts文件。如果你不知道它,你现在应该认识一下。这个文件会在你的职业生涯中的某个时刻出现。

如果你曾经看到过下面的信息,你要么会被吓坏,认为有人在试图入侵你,要么你会意识到DHCP或其他一些异常现象在你身上做了一个很肮脏的行为。

$ ssh 192.168.1.84

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    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 a host key has just been changed.
The fingerprint for the ECDSA key sent by the remote host is
SHA256:I02UyJs2vS0ym4jWn5upAWZDqwu5RjMg4aM9hPq8G1k.
Please contact your system administrator.
Add correct host key in /Users/khess/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /Users/khess/.ssh/known_hosts:4
ECDSA host key for 192.168.1.84 has changed and you have requested strict checking.
Host key verification failed.

这里发生的情况是,你试图连接到一个不再有192.168.1.84这个IP地址的系统。一个不同的系统拥有这个IP地址,而SSH正在抱怨你可能会被黑掉。实际情况往往没有那么兴奋。你的 "known_hosts "文件可能与实际的主机情况不同步。

多种情况可能导致这种IP地址的抢椅子游戏。其中一个系统可能已经瘫痪了很长一段时间,当另一个系统的租约到期时,它获取了下一个可用的IP地址。 一个补丁事件和随后的重启导致你的一些系统获得不同的IP地址。 系统可能被重新安装并生成了一个新的身份,或者也许有人意识到了,给你的服务器系统提供了静态IP地址。(我认为,所有的服务器都应该有静态的IP地址。任何支持组件也是如此,如路由器、交换机、接入点、物联网设备、摄像机、会议室系统,甚至打印机。只有终端用户设备应该有获得随机IP地址的特权。我有我强烈的理由,我将在以后的另一篇文章中分享这个观点)。

不管它是如何发生的,你有兴趣连接的系统有一个新的IP地址。一个也是你的系统所知道的,但有一个不同的指纹。

前面提到的 "known_hosts "文件是一个简单的文本文件,位于你的主目录下的一个隐藏目录(.ssh)中。要查看其内容,请输入以下命令:

$ cat .ssh/known_hosts

192.168.1.97 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBMJWpXf8Ou/XJ1Q5YcIS5Me4GgN1F7AYHbvIPayfGqwd90kvhQygrPCYEqVdw44lEOIZe+DEKP4F6Otdt38yf68=

192.168.1.101 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBJRNTZm8M9IYYN3uJL/yCPv4EJRMDZkkcnt1CY8L6OR84wstYdhqtNqV0v/LQiz/AoRbHKxPTdjXfIOrc1vYDHc=

ken,192.168.1.69 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBB53lh2RyFiMfJFKBkLa643lS4GGILG6oVGq33KyBSgaDU2ZHryYak1FU1HcPa6Xb/xYqEUugv9cOXFRwajbrmg=

192.168.1.84 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBMGjMsJPX4bfdEnVy59Uf2VhH1oAt7Zemd5bfSoSGxX69HBcjkekO/LkEZUlhVplBlHFqJBqs2gWYp3zVDCTwr4=

192.168.1.64 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBIkK9WylcZcgjT7gUz9DMLehUBApION1CLiBVc3Pa/YfAbIDUlIWta12zL5B12RmBXgoYvntdW5rcowPiqjL0/o=

解决这个问题的简单方法是删除known_hosts文件,并允许为你连接的每个主机生成新的密钥。在这个演示中,我从known_hosts文件中删除了192.168.1.84条目,然后连接到该地址的新主机,这样你可以看到这个过程中发生的差异。首先,用ssh-keygen命令删除一个known_hosts条目。

$ ssh-keygen -R 192.168.1.84 -f .ssh/known_hosts

 Host 192.168.1.84 found: line 4
.ssh/known_hosts updated.
Original contents retained as .ssh/known_hosts.old

原来的条目被保存到.ssh/known_hosts.old,以备将下来需要。

known_hosts文件中删除192.168.1.84条目后,我再次尝试连接到主机192.168.1.84

$ ssh 192.168.1.84
The authenticity of host '192.168.1.84 (192.168.1.84)' can't be established.
ECDSA key fingerprint is SHA256:I02UyJs2vS0ym4jWn5upAWZDqwu5RjMg4aM9hPq8G1k.
Are you sure you want to continue connecting (yes/no)? yes

Warning: Permanently added '192.168.1.84' (ECDSA) to the list of known hosts.

你可以看到,我现在添加的密钥与文章开头的错误中所列的密钥一致。 要验证一个主机的密钥,在远程主机上发出以下命令。

$ ssh-keygen -lf /etc/ssh/ssh_host_ecdsa_key.pub
256 SHA256:I02UyJs2vS0ym4jWn5upAWZDqwu5RjMg4aM9hPq8G1k no comment (ECDSA)

结尾

除非你使用静态IP地址,而且你的系统从不改变,否则在你的职业生涯中,你会在某个时候遇到这个问题。这种情况经常发生在我身上,因为我每个月都要创建和销毁几次虚拟机。事实上,这种情况经常发生,以至于现在我有一个脚本,在每个月的月初删除known_hosts文件。

理想情况下,你永远不需要从 "known_hosts "文件中删除一个条目(或整个文件)。但如果你不得不这样做,这时你已经学会了如何去做。

启示:known_hosts, ssh-keygen.