如果要加強Apache服務器的安全性,就應該檢查CGI(公共網關接口)的使用。一個應用程序中的漏洞通常在用戶接觸數據庫時的某個地方暴露出來,而這個地方正是CGI。它是Web服務器和外部程序之間的橋梁,用來告知這些程序該如何執行以滿足瀏覽器的需求。CGI控制著兩個方向的數據格式。它是一個協議,而不是一種語言,可以用很多方法來實現。
尋找安全漏洞
CGI腳本的一個大問題是服務器的默認設置很容易被利用。下面一些是最危險的:
1.以Web服務器用戶運行。默認地,所有的 CGI腳本以相同的用戶身份運行,即Web服務器本身。雖然這看起來像一個安全性的大敵,卻是有意義的。CGI腳本控制著擁護和服務器之間的接口,因此這些腳本需要不同的文件訪問權限。給所有的腳本以Web服務器本身的權限,然後再由管理員逐個程序來限制,這樣的默認設置簡單明了。問題是,管理員永遠也完成不了這些限制工作。
2.腳本目錄很容易被找到。導致腳本易於被訪問和操縱。服務器上默認存放CGI腳本的目錄是cgi-bin。如果黑客知道了腳本的位置,就等於擁有了打開寶藏庫的鑰匙。
3.擴展名眾所周知。默認的,CGI腳本擴展名為.cgi。Apache服務器將所有擴展名為.cgi的文件都當作CGI來處理。如果整個服務器都這樣通過擴展名來識別腳本而且不將腳本限制在某個目錄中的話,黑客就可以運行未經授權的CGI腳本而不需要經過管理員的允許。
緊密封裝起來
CGI腳本嵌入在Web應用程序中,帶著用戶直接進入服務器內部,在這裏腳本擁有權限,能夠訪問服務器資源,惡意的用戶會濫用這些權限。但是你可以在此增加一層保護層,辦法是將CGI腳本封裝隔離起來,從而使CGI腳本、應用程序以及用戶無法利用服務器的設置缺陷。封裝器可以擁有訪問CGI腳本所必須的權限和資源,這樣黑客最多只能擁有封裝器的權限和資源,而不是腳本本身。
SuEXEC可以解決大多數問題
Switch User for Exec(suEXEC)是一個用來對付很多CGI危險的管理工具。它允許服務器管理員以用戶而不是Web服務器用戶身份運行CGI腳本。一個用戶的程序將以其ID運行。使用CGI腳本的應用程序就能被限制在它們特定的用戶環境下。
這就解決了權限問題。你已經有效地創建了一個封裝,將用戶與系統root權限隔離起來。另外,每次有腳本運行時,suEXEC包裝器都將檢查其安全性,動態驗證程序調用、用戶、文件位置和權限,以及所有由管理員定義的東西。
啟用suEXEC
從1.2版開始,suEXEC成為Apache的一部分。1.3.x版本以後,它的啟用成為Apache配置的一部分內容,鍵入以下命令:
enable-suexec
指定名字和路徑(區別於用戶路徑)也很簡單:
suexec-
caller=USERNAME
suexec-docroot=DIR (default is htdoCS)
你可以設置其他參數來加強用戶ID的安全性。這包括設置合法的文件路徑、用戶ID限制以及合法的用戶根目錄。更多請參考文檔說明。
其它CGI包裝器
一個名為FastCGI的基於庫的包裝器也是一種選擇。它更像一個對付黑客面向程序員的工具而不是一個管理員工具。FastCGI擴展了CGI規範,提供了包含安全I/O方法的程序插件。這就允許開發者可以將使用其他方法來加強CGI腳本安全性,例如調整內存段的使用以防其被誤用。
CGIWrap在Web服務器和可執行程序之間建立了一個附加層,它與suEXEC在很多方面相似,例如以非Web服務器用戶身份運行CGI腳本。它也在每個腳本運行時進行安全性檢查。
使用別名
可以通過為腳本目錄起晦澀難懂的名字來阻止惡意用戶查詢CGI腳本。除了cgi-bin目錄,服務器不會執行其它目錄下的CGI腳本。但是使用別名,就可以隱藏它。在配置文件httpd.conf中這樣做: