SSH 隧道作為本機服務的加密和身份驗證

SSH 隧道作為本機服務的加密和身份驗證

背景:

在我的伺服器上,正在運行一個服務,該服務在網域套接字上偵聽/srv/socket傳入連接,然後與連接的使用者進行互動。請注意,該服務是我編寫的(用 C++),因此我可以輕鬆修改該服務的行為。目前,該服務不進行任何身份驗證或權限檢查(正如您稍後將看到的,這必須更改)。與我合作的一些開發人員(大概有五到十個)需要從互聯網上其他地方的電腦存取此服務(並且僅此服務)。因為這項服務給了他們相當多的特權,所以我希望身份驗證盡可能強大,並對連接進行加密。我的根本問題(為了避免任何 XY 問題)是:我該如何設定?

關於它的想法和問題:

我最初的想法是提供自己的身份驗證,然後使用 TLS 進行加密(當然在外部連接埠上公開服務)。然而,編寫自己的身份驗證可能會導致安全缺陷,並且設定連接以通過 TLS 工作將是一件痛苦的事情。

我的第二個想法是只用 SSH。 SSH 已經具有非常強大的身份驗證和加密功能,並且基本上可以滿足我的需求。不幸的是,我不太確定如何設定。首先,我當然不想授予開發人員完整的 shell 存取權限,因此我將把他們的預設 shell 更改為/bin/false(根據本網站和相關網站上的其他一些答案)。但我仍然需要它們能夠連接到相關的套接字。我研究了 ssh 隧道,但這似乎不是我需要的,並且其他類似「ssh 作為代理」的搜尋都揭示了相關但不相同的問題。在這裡做什麼是正確的?當然,我可以編寫一個自訂可執行檔來充當「外殼」並簡單地將這些用戶連接到我的服務,但同樣,此程式碼將是安全敏感的,並且在可能的情況下我希望避免編寫自己的代碼。

最佳案例場景:

理想情況下,我希望發生以下情況:

  1. 用戶在其客戶端上運行一些命令。
  2. 創建與我的伺服器上的代理服務的加密連接,並且用戶向該服務驗證自己的身份(理想情況下,這是一項完善的服務,已知相當安全)。
  3. 代理服務開啟與我的服務的連接,轉發使用者名稱(或某些使用者識別碼),然後連接客戶端。

這樣做的最佳方法是什麼?

答案1

我知道你的問題已經有一段時間了,但如果你仍然感興趣,請看看我的郵政關於伺服器故障。雖然問題與您的要求無關,但我提出的解決方案可能直接相關。我希望能得到比我更了解安全影響的專家對該帖子的一些回應,但這並沒有發生。

這篇文章有點長,無法在這裡重複,但簡而言之,這是一個概念:

  • 將 SSH 設定為需要您需要/可以容忍的盡可能多的身份驗證機制,例如密碼 + 金鑰 + otp 等。
  • 將使用者 shell 設定為/sbin/nologin(/sbin/nologin優先於/bin/false)
  • 當使用者透過 ssh 連線(驗證)時,請利用伺服器上的 sshrc 呼叫腳本,該腳本可以執行您需要的任何操作,例如啟動服務

在上面的設定中,您的用戶透過 SSH 進行身份驗證,一旦通過身份驗證,/etc/ssh/sshrc就會執行您的服務所需的操作,並/sbin/nologin在身份驗證後優雅地斷開 SSH 會話,因為不再需要它。

您可以對 sshrc 中的腳本發瘋。例如,考慮開始時不為您的服務開啟任何連接埠。使用者通過身份驗證後,sshrc 腳本可以在防火牆中動態開啟使用者 IP 的連接埠。

請注意:上述內容假設您確實非常了解 ssh 配置方面的操作。雖然有幾種經過充分測試的 SSH 實現,但其中許多很容易配置錯誤,從而產生重大安全隱患。另外,對於 SSH 身份驗證,我強烈建議始終使用金鑰 +(使用者至少知道一件事,例如密碼或 otp,最好兩者都知道)。

相關內容