我正在使用一個由 20 台主機組成的集群,所有主機都運行 CentOS 7.3。
我正在嘗試建立一個自動化測試來檢查:
- 我們預期的網路連線已到位
- 我們的 SSH 單一登入 (SSO) 解決方案正在運行
預期的網路連線非常簡單:它是一個單一的、扁平的子網路。每個主機都應該能夠存取其他主機。
我們的 SSH SSO 解決方案 (FreeIPA) 使用 Kerberos 來驗證使用者身份,並使用 SSH 公鑰來驗證主機。使用者的 Kerberos 票證授予票證 (TGT) 設定為轉發到使用者使用 SSH 連接到的任何主機。
測試非常簡單:
讓每個主機都嘗試使用 SSH 來執行主機名稱作為所有其他主機上的遠端命令。
為此,我使用一個名為的實用程序PDSH。
簡而言之,該實用程式使用 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 會話,我建議使用控制主連線。基本上,經過身份驗證的會話由客戶端和伺服器保持,避免重複身份驗證。
也可以看看:ssh_config(5) -- 控制大師