用Apache的CGI封裝器來加強安全性(轉)

post0發表於2007-08-09
用Apache的CGI封裝器來加強安全性(轉)[@more@]

如果要加強Apache伺服器的安全性,就應該檢查CGI(公共閘道器介面)的使用。一個應用程式中的漏洞通常在使用者接觸資料庫時的某個地方暴露出來,而這個地方正是CGI。它是Web伺服器和外部程式之間的橋樑,用來告知這些程式該如何執行以滿足瀏覽器的需求。CGI控制著兩個方向的資料格式。它是一個協議,而不是一種語言,可以用很多方法來實現。

尋找安全漏洞

CGI指令碼的一個大問題是伺服器的預設設定很容易被利用。下面一些是最危險的:

*

以Web伺服器使用者執行。預設地,所有的 CGI指令碼以相同的使用者身份執行,即Web伺服器本身。雖然這看起來像一個安全性的大敵,卻是有意義的。CGI指令碼控制著擁護和伺服器之間的介面,因此這些指令碼需要不同的檔案訪問許可權。給所有的指令碼以Web伺服器本身的許可權,然後再由管理員逐個程式來限制,這樣的預設設定簡單明瞭。問題是,管理員永遠也完成不了這些限制工作。

*

指令碼目錄很容易被找到。導致指令碼易於被訪問和操縱。伺服器上預設存放CGI指令碼的目錄是cgi-bin。如果駭客知道了指令碼的位置,就等於擁有了開啟寶藏庫的鑰匙。

*

副檔名眾所周知。預設的,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中這樣做:

ScriptAlias? /cgi-bin/? "/alternate_directory/cgi-bin/"

這就使得伺服器將這個替換目錄中的檔案作為CGI指令碼對待,而正常情況下伺服器只認cgi-bin目錄下的檔案。當然要確保限制使用者訪問這個目錄,否則使用者能夠透過root許可權將自己的CGI指令碼放進這個目錄,而伺服器還會允許其執行。

名字包含什麼意思

另一個CGI預設設定是伺服器被動地假定任何CGI指令碼(例如,副檔名為.cgi的檔案)在所有Web伺服器可以訪問的目錄下都是可以使用的。(這種情況只在已經啟用了用這種方式鑑別CGI指令碼的處理器才會出現,設定於httpd.conf。)

使 CGI在特定目錄執行比在整個伺服器中都可以執行要容易。只需為每個可以執行指令碼的目錄的Options新增ExecCGI就行。這樣,就為特定使用者和程式限制了CGI指令碼的I/O和資源分配。記住這種功能是一把雙刃劍,粗心大意的使用會給駭客入侵提供有效的途徑,如同正確使用可以阻止他們一樣

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-937276/,如需轉載,請註明出處,否則將追究法律責任。

相關文章