為共享主機 (WAMP) 保護 mod_php 的技術?
我已經設置了一個用於生產的 Web 伺服器。作業系統是 Windows Server,它執行 Apache 2.0 和 PHP 5.3 作為 apache 模組(還有 MySQL ……)。它用於託管屬於不同客戶的多個虛擬主機(Apache vhost)。
此時 PHP 正在以系統使用者身份執行。將來可能會授予客戶 FTP 訪問權限,因此 - 預設情況下 - 每個客戶都可以通過 PHP 訪問整個系統。這顯然是不可接受的。
我知道我可以在 PHP 中設置 open_basedir,但我不確定它是否包含且足夠可靠以被視為解決方案 - 它是否限制對所有 PHP 函式的訪問,例如包含…?PHP流怎麼樣?
我也知道 IIS 提供了解決該問題的方法,但我更喜歡保留 Apache。
理想情況下,我希望建立一個能夠滿足以下要求的解決方案(主要):
- 優雅而自動。我正在手動管理伺服器 - 我希望每個虛擬主機的設置盡可能少地涉及設置和配置編輯。
- 允許例外。大多數託管網站都是由我自己開發的,我想將它們全部連結到一個庫文件夾,因此應該允許對該文件夾進行只讀訪問,儘管它位於虛擬主機的根目錄之外。
那麼,如果有的話,有哪些可用的選項?我已經做了一些研究,似乎該領域的大部分工作都是在 Linux 系統上完成的。
PHP 和 FTP 沒有任何關係。
FTP 是一種(糟糕、不安全、古老)在機器之間移動文件的方式。
PHP 是一種由您的 Web 伺服器執行的腳本語言。
您可以(並且可能應該)使用 IIS FTP 功能來授予對伺服器的 FTP 訪問權限,同時拒絕您的使用者訪問諸如根卷 (
C:\
) 和共享庫目錄之類的內容。您的安全問題的另一半是 PHP 本身——
mod_php
在多租戶安全方面並不出色,open_basedir
也不是一個包羅萬象的解決方案(儘管總比沒有好)。
- 如果您想要真正的安全性,您幾乎需要在 chroot 中為每個人提供自己的 Apache。
這是不愉快的(對於您作為管理員),但安全。它也很靈活,因為您可以為每個站點修改 php.ini。
- 您的下一個最佳選擇是將 PHP 作為 CGI。
您可以呼叫 PHP 的 CGI 解釋器作為網站所有者的使用者 ID——這使您受益於作業系統的文件權限功能,並且避免了必須為每個站點維護單獨的 Apache/PHP 實例。
主要的缺點是 PHP 必須被稱為 CGI,因此您失去了任何依賴 PHP 作為 Web 伺服器模組的功能。
- 您的第三個最佳選擇是
open_basedir
和disable_functions
/disable_classes
。
open_basedir
並沒有真正保護任何東西,因為它只影響PHP:您的使用者仍然可以上傳/執行二進製文件以訪問其他人的數據。php.ini中的
disable_functions
anddisable_classes
指令可讓您關閉某些不安全的功能(您需要自己獲取可利用類的列表)。
- 但問題是:這些是黑名單,而黑名單是為了AWFUL安全,因為如果您錯過了可利用/易受攻擊的功能,您仍然容易受到攻擊。
你可以用這種方式遮住明顯的洞,但你基本上就是那個手指插在堤壩上的荷蘭小男孩。你只有這麼多手指,而且總是多一個洞……
您絕對不應該將 Apache 執行為
Local System
(或任何具有提升權限的帳戶)。在將此伺服器投入生產之前,請確保根據 Apache 文件中的最佳實踐對其進行配置。