我正在使用一个由 20 台主机组成的集群,所有主机均运行 CentOS 7.3。
我正在尝试创建一个自动化测试来检查:
- 我们的预期网络连接已到位
- 我们的 SSH 单点登录 (SSO) 解决方案正在运行
预期的网络连接非常简单:它是一个单一的平面子网。每个主机都应该能够访问其他每个主机。
我们的 SSH SSO 解决方案 (FreeIPA) 使用 Kerberos 来验证用户,并使用 SSH 公钥来验证主机。用户的 Kerberos 票证授予票证 (TGT) 设置为转发到用户使用 SSH 连接的任何主机。
测试非常简单:
让每个主机尝试使用 SSH 执行主机名作为其他所有主机上的远程命令。
为此,我使用了一个名为韋斯。
简而言之,此实用程序使用 SSH 在一组主机上执行远程命令。它通过为每个主机生成一个线程并在每个线程中执行命令来并行执行此操作远程控制 。
我对此命令的使用如下。在不是 20 个集群主机之一的机器上,我执行此命令:
pdsh -g all 'pdsh -g all "hostname"'
-g 全部指定远程命令应在所有集群主机上运行。如上所述,我有 20 个集群主机。
每个远程主机上要执行的命令是:
pdsh -g all "hostname"
因此,如上所述,每个主机都会尝试通过 SSH 在其他每个主机上以远程命令的形式执行命令“hostname”。
因此,这会导致 20 次调用(每个集群主机一次):
ssh 'pdsh -g all "hostname"'
反过来,这会导致 20 * 20 = 400 次调用:
ssh <hostname> hostname
因此,我在很短的时间内总共进行了 20 + 400 = 420 次 SSH 身份验证。
我看到的问题是少数身份验证失败。发生失败的主机是任意的。没有任何规律或理由。失败看起来像这样:
host-5: host-3: Permission denied, please try again.
host-5: host-3: Permission denied, please try again.
host-5: host-3: Received disconnect from UNKNOWN: 2: Too many authentication failures for myuser
host-5: pdsh@host-5: host-3: ssh exited with exit code 255
我已在以下位置配置/etc/ssh/sshd_config允许多个需要验证的会话同时存在:
MaxStartups 500:30:600
请注意,这有点过头了——它考虑了整个集群中进行的身份验证次数,但实际上只需要考虑给定主机上发生的身份验证次数。所以,我认为问题出在其他地方。
因此,总而言之,我在很短的时间内通过 Kerberos 在 20 台主机的集群中进行了大量的 SSH 用户身份验证。用户身份验证随机失败。
为什么会发生此类用户身份验证失败的情况?
答案1
如果您要重新打开与同一主机的 SSH 会话,我建议您使用控制主连接。基本上,经过身份验证的会话由客户端和服务器保持,从而避免重复身份验证。