簡體   English   中英

如何在PHP中安全地維護持久的SSH連接?

[英]How to securely maintain a persistent SSH connection in PHP?

我目前正在使用一個使用主從模型的VPS面板。 一個主服務器運行用PHP編寫的面板,並通過SSH管理多個從服務器。 從屬服務器通過有限帳戶訪問,該帳戶可以sudo到特定服務器管理相關命令,並且所有交互都記錄在帳戶本身無權訪問的目錄中。

我目前正在使用PHP-SSH2,但這種方法有一些問題:

  • 退出代碼不能可靠地返回,因此所有命令都必須在包裝器腳本中執行,該腳本將stdout,stderr和退出代碼打包成JSON對象並通過stdout返回。 此腳本必須存在於每個從屬服務器上。
  • PHP-SSH2庫不知道“自定義連接超時”的概念,這意味着我必須在嘗試使用PHP-SSH2連接之前使用fsockopen探測服務器 - 如果我不這樣做,則無法訪問的服務器可能延遲頁面加載一分鍾或更長時間。 由於下一個問題,情況會更糟。
  • 持久連接是不可能的。 這會在面板中導致絕對荒謬的頁面加載時間,特別是與之前的超時問題相結合。

現在,我正在努力解決最后一個問題。

我遇到過幾種可能的解決方案,但它們都存在某種問題:

  • 使用PHPSecLib,一個純PHP SSH實現,並用pfsockopen調用替換所有fsockopen調用。 這將使連接持久,但它比我想要的更黑,並且PHP中持久套接字的安全含義尚不清楚。
  • 設置從主服務器到每個從屬服務器的持久SSH隧道,並在每個從屬服務器上運行一個簡單的守護進程(綁定到localhost),該服務器運行它所告知的任何內容。 出於兩個原因,這是一個問題。 首先,它介紹了在從服務器上需要一個守護進程,這是我寧願避免的。 第二個問題是,如果有人要破壞從屬服務器上的有限帳戶,他們仍然可以通過連接到“命令守護進程”來運行某些系統命令,即使他們無法從自己的shell訪問這些命令。 這是個問題。
  • 在主服務器上運行守護程序,該守護程序代表面板管理與從屬服務器的持久SSH連接。 這將涉及用Python編寫SSH客戶端(這是我熟悉的唯一合適的語言),並且可能歸結為使用paramiko。 由於的paramiko的文件很糟糕,這是不是一個非常有吸引力的選擇,甚至可能會導致安全問題,因為它是不完全清楚,我事情應該如何在的paramiko使用。

以下不是一個選項:

  • 切換到面板本身的不同語言。 我正在用PHP編寫面板,因為這是我最熟悉的語言,而且我知道我可能會遇到的怪癖和潛在問題。 用我不熟悉的語言寫這樣一個重要的面向公眾的項目是一個壞主意。
  • 使用Twisted作為第三個“可能的解決方案”。 扭曲是一個非常龐大和復雜的依賴,文檔似乎比paramiko更糟糕。
  • 在從屬服務器上運行HTTPd或其他非SSH面向公眾的守護程序。

在實踐中,我看到有時超過一分鍾的頁面加載時間,因為必須聯系多個服務器以獲取頁面加載。 對於VPS面板來說,這顯然是不可接受的。

我的目標是使用某種實現來避免使用PHP-SSH2時引入的連接開銷。 以安全的方式執行此操作的最佳方法是什么,同時在從屬服務器上引入最少量的依賴項?

您可以使用autossh,並使用autossh創建反向(portforward)隧道。 然后讓你的php應用程序與那些反向ssh端口對話。 如果ssh連接失敗,autossh將繼續嘗試重新創建連接。 您的PHP應用程序將無法連接到反向隧道,甚至沒有超時。

選項3如何,但也在PHP中編寫守護進程? 這是我嘗試使用自己的類似項目的路線。

您可以使用FIFO文件而不是套接字與其進行通信。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM