如何讓 SSH 的 Know_hosts 保持最新(半安全)?

如何讓 SSH 的 Know_hosts 保持最新(半安全)?

只是為了把它放在前面,這樣我就不會被告知不要這樣​​做:

  1. 有問題的機器都位於本地網路上,幾乎無法存取互聯網(它們甚至沒有很好地連接到公司網路)
  2. 每個有能力設定中間人攻擊的人都已經擁有機器的root權限
  3. 作為 QA 程式的一部分,機器會重新安裝,因此擁有新的主機金鑰很重要(我們需要看看其他機器如何反應);我只是想讓我的機器更好用。

我在更改主機金鑰的電腦上進行了大量重新安裝。這需要進入~/.ssh/known_hosts我的機器並清除舊密鑰並添加新密鑰。這是一個巨大的痛苦,所以我開始考慮自動化的方法。

我不想盲目地接受任何主機金鑰,因此修補 OpenSSH 以忽略主機金鑰已經過時了。我考慮過圍繞該ssh命令創建一個包裝器,它將檢測返回的錯誤ssh並向我提示刪除舊密鑰或退出。我還考慮過創建一個守護進程,它可以從白名單上的電腦(大約有二十台電腦正在不斷重新安裝)中獲取最新的主機密鑰,並替換known_hosts.

您將如何自動化這個流程?

答案1

根據重新安裝/IP 保持不變的原因,我將考慮在 ~/.ssh/config 中為特定主機/IP/模式設定「StrictHostKeyChecking」。

如果這是不可能的,那麼考慮在主機上自動載入金鑰,也許在重新安裝過程中。

答案2

如果您使用的是設定管理系統(例如 Puppet),則可以使用它/etc/ssh/ssh_known_hosts在用戶端電腦向中央伺服器簽入時保持檔案與主機的更新。然後您可以StrictHostKeyChecking在設定檔中啟用該選項。

這正是我們對透過 Puppet 主伺服器進行簽入的 Amazon EC2 執行個體所做的事情。我們讓 puppet 伺服器作為 EC2 執行個體的堡壘跳轉箱,並且是唯一允許透過 SSH 連接到這些執行個體的機器。然後,我們/etc/ssh/ssh_known_hosts使用主機金鑰和檔案/etc/hosts更新 EC2 的公共 DNS IP 位址。

答案3

你想要的ssh-keyscan,它是與 openssh 一起分發的。來自手冊頁:

 ssh-keyscan is a utility for gathering the public ssh host keys of a num‐
 ber of hosts.  It was designed to aid in building and verifying
 ssh_known_hosts files. 

作為重新安裝的一部分,讓一台具有最新金鑰清單的電腦執行此命令,然後將更新的known_hosts 檔案分發到其餘電腦。

或者,正如其他人所提到的,您可以關閉 StrictHostKeyChecking。這會讓您面臨中間人攻擊,儘管在您的環境中這可能不是一個問題。

答案4

也許您想在重新安裝之前保存主機金鑰,然後在之後恢復它們。

或者,您可以使用一些組態管理工具,例如CF引擎或者木偶/etc/ssh/ssh_known_hosts向您網站上的所有客戶分發權威資訊。 (OpenSSH 會查詢/etc/ssh/ssh_known_hosts中是否沒有符合的條目~/.ssh/known_hosts。)

相關內容