SSH 是否支援*真正的*預共用金鑰?

SSH 是否支援*真正的*預共用金鑰?

眾所周知,sshd在公開可用的電腦上運作是一種很好的攻擊媒介,因此應盡可能受到保護。除了「設定PermitRootLoginno」和「切換到 pubkey 驗證」等明顯的建議之外,我還發現了以下方法來限製配備以下命令的腳本小子對我的電腦的存取nmap

  • 將連接埠更改為 22 以外的其他連接埠nmap
  • 讓連接埠 22 保持開啟狀態,但只需刪除該連接埠的所有內容,然後使用以下命令接受來自另一個連接埠的 SSH 連接這個拐杖。比以前的方法更好,但它仍然只是一個障礙。
  • 設定連接埠碰撞。麻煩且仍然並不完全安全,因為「敲門」流量可能會被攔截。

如果我要設計一個用於遠端存取我的機器的系統,它會如下所示:

  1. 產生隨機秘密。
  2. 手動將其複製到應連接的兩台機器上(甚至可以使用閃存驅動器來完成此操作,以實現最大程度的肛門保留)。
  3. 第一個資料包Client機器傳送給Server的(即SSH握手發起)是已經用這個秘密加密。
  4. 如果伺服器收到未使用此金鑰正確加密的資料包,它只會默默地關閉 TCP 連線。

結果是這樣的物理上不可能攻擊者甚至可以發現伺服器上正在執行 SSH 服務。在我的腦海中這正是「預共享密鑰」的意思。

相反,當我嘗試搜尋“使用預共享密鑰的 ssh”時,除了有關如何從 遷移PasswordAuthenticationPubkeyAuthentication.

答案1

不,事實並非如此。在協定級別,每個標準 SSHv2 連線始終以 1) 純 ASCII 格式的協定版本「橫幅」開始,2) 列出所有支援的密碼和金鑰交換方法的未加密資料包。

從第 3 步開始,您可以實作涉及 PSK 的自訂金鑰交換方法(理想情況下另外通常的動態 DH 金鑰交換),但這需要客製化的 sshd 守護程式以及客製化用戶端。目前 OpenSSH、PuTTY、Bitvise WinSSHD 以及我迄今為止使用過的任何其他 SSHv2 實作中都不存在此類功能。

最簡單的替代方案是使用VPN 系統,因為這些系統經常支援PSK(但更常見的是作為HMAC 金鑰來保護初始金鑰交換,而不是作為AES 金鑰來加密實際資料通道,因為這會失去「前向保密性”) “ 特徵)。一旦您執行了 VPN 服務,您就可以完全停用直接 SSH 連線:沒有人可以發現實際上不再監聽的 sshd。

例如,流行的 WireGuard 和 OpenVPN 都支援使用預共用 MAC 金鑰來驗證所有連線嘗試。由於兩者都使用 UDP 進行初始協商,因此它們根本不響應根本不無法驗證的資料包,使服務無法被發現。 (儘管我相信即使沒有 PSK 模式,WireGuard 也已經這樣做了...)請注意,OpenVPN 將此功能稱為“tls-auth”模式 - 不要將其與其“靜態密鑰”模式混淆。

這裡也可以使用 IPsec AH – 如果您需要的只是完全靜態的身份驗證金鑰,則可以在兩端手動設定 SA,而根本不需要任何動態 IKE 握手,只需使用命令即可ip xfrm。但這可能會變得煩人。

作為另一種選擇,某些作業系統支援TCP級使用 TCP-MD5 (RFC1321) 或 TCP-AO (RFC5925) 進行預先共用金鑰驗證。這很容易侵入 SSH 軟體,因為它只需要一個 sockopt,儘管這又進入了自訂客戶端的領域。此外,作業系統層級的支援很差——儘管由於人們希望將 TCP-MD5 與 BGP 一起使用而仍然支援 TCP-MD5,但對 TCP-AO 的支援實際上可能不存在。

相關內容