是否可以允许同一 IP 存在多个 SSH 主机密钥?

是否可以允许同一 IP 存在多个 SSH 主机密钥?

我有一个脚本需要连接到高可用性集群当前活动的头。

集群中的每个节点都有固定的主机名和IP地址。
当前头另外还有一个“虚拟IP”。在切换或故障转移的情况下,另一个节点配置“虚拟IP”并开始充当头。

我可以将我的脚本指向虚拟IP吗?ssh当集群将虚拟 IP 移动到不同的节点时,不会抱怨主机密钥不匹配吗?

答案1

是的,这是可能的。

sshd(8)(来自 OpenSSH)指定文件的格式known_host(在部分中SSH_KNOWN_HOSTS FILE FORMAT):

执行主机身份验证时,如果任何匹配的行具有正确的密钥,则接受身份验证; […]

允许(但不建议)具有相同名称的多行或不同主机密钥。 当来自不同域的主机名的缩写形式放入文件中时,不可避免地会发生这种情况。这些文件可能包含有冲突的信息;如果可以从任一文件中找到有效信息,则接受身份验证。

因此,您只需将两个 HA 头的主机密钥添加到您的~/.ssh/known_hostsor /etc/ssh/ssh_known_hosts

203.0.113.50 ssh-rsa AAAAB3NzaC1yc2…6Yh5sHpkyIZvXLB
203.0.113.50 ssh-rsa AAAAB3NzaC1yc2…R0RNVnMB6C4plFr

并将ssh毫无怨言地连接到他们两个。

答案2

是的,n.st 答案是正确的。

但请注意,自版本 8.5 起,OpenSSH 客户端UpdateHostKeys默认启用 ssh_config 选项,启用该选项后,该解决方案将不再有效,因为客户端会自动删除连接的主机不具有的所有主机密钥(例如,您有一个服务 IP 浮动在两台主机,并且每台主机都有自己的主机密钥)来自客户端的known_hosts 文件。

为了防止这种情况,您需要UpdateHostKeys no在客户端的~/.ssh/config文件中进行设置以恢复旧的行为。

答案3

虽然这可能是一个有效的问题,但在大多数情况下,这是 XY 问题。

首先,浮动 IP 作为一种高可用性解决方案很糟糕。在某些情况下,实施更好的解决方案是不切实际的,但这种情况很少见(例如默认网关的地址)。

除非集群的主要目的是充当 ssh 服务器,否则您不需要(也不应该)以与 BAU 流量相同的方式路由管理流量 (ssh)。如果您的集群节点之一出现故障,您如何 1) 知道这一点 2) 解决问题?您需要能够连接到每个节点。您需要知道哪个节点是集群领导者(如果在单独的设备上使用 NAT,则应从每个节点或控制器上的集群守护程序获取该节点)。

但抛开所有这些......

ssh 不会抱怨主机密钥不匹配

如果你告诉 ssh 不要这样做,则不会。您可以通过 ssh_config 中的条目专门为虚拟 IP 执行此操作。除非您的脚本使用密码做一些混乱的事情expect,否则不存在安全问题。如果你正在做一些混乱的事情,expect那么你总是可以expect托管关键问题并处理它们。

如果所有节点都具有相同的主机密钥,则不会。

相关内容