2013-12-22

Apache suEXEC

參考官方說明文件:suEXEC Support



以下文章轉錄自頂客論壇:(官方說明文件的中文翻譯)

suEXEC自Apache 1.2版本開始引入,負責處理CGI和SSI程序的請求,確保網頁使用者能以該目錄或程序的用戶ID來執行遠程程序。在正常情況下,所有CGI或SSI程序都必需由程序擁有者,透過Apache執行。

在suEXEC使用正確的情況下,使用CGI/SSI程序的用戶ID來執行程序,能強制阻止其它用戶胡亂執行,從而提高網絡的安全性。相反,假若網管人員未能正確設定suEXEC,suEXEC將會為你帶來多個無可預知的系統保安漏洞,若你不熟識控制及設定ID的程序及其安全問題,我們強烈建議你不使用suEXEC。

用前準備

在閱讀正式說明文件前,請細看及留意Apache Group的要求及假設。

第一,Apache Group假定你的操作系統為任何一種UNIX系統,並擁有setuid及setgid功能,所有suEXEC設置例子都需在這大前提下才能正常運作。而在其它支持suEXEC的作業平台中,suEXEC的設置亦有可能和UNIX不同。

第二,你必需有系統保安及管理的基本概念,這些概念包括setuid/setgid的運作原理及其對系統的衝擊,和清楚知道這些運作所產生的保安漏洞。

第三,在你沒有更改suEXEC程序代碼的情況下,Apache Group才能保證suEXEC的風險已減到最低,suEXEC的程序代碼經開發者及測試者審慎測試,已加入預防錯誤的程序代碼以保證suEXEC不會產生錯 誤,更改原有程序代碼會引起無法預知的系統漏洞。除非你已精通系統安全編程,及你願意和Apache Group分享你的開發成果,不則我們絕不建議更改suEXEC的程序代碼。

第四,在Apache Group考慮過後,suEXEC已豁出Apache的預設安裝之外。因此,網管人員在安裝suEXEC時需特別注意suEXEC的細節,幾經考慮了 suEXEC的各項設置後,網管人員可從預設的安裝方法嵌入suEXEC至Apache中,suEXEC的設置參數必需謹慎決定。由於suEXEC需網管人員有周密的計劃,故Apache Group謹希望審慎及細心的網管人員使用。

suEXEC安全模型

在設定及安裝suEXEC之前,我們先討論suEXEC的安全模型,這樣你可詳細地瞭解suEXEC的運作狀況及其系統保安措施。

suEXEC是Apache的「包裝程序」,這包裝程序有setuid權限,當有CGI或SSI執行請求時,suEXEC就會把執行用戶更改為程序的擁有者後才執行。

包裝程序其後會根據以下步驟檢查「包裝過程」是否正常,若以下有其中一個檢查失敗,suEXEC會把錯誤寫入記錄,並拒絕執行請求:

傳入包裝程序的參數不足 。包裝程序只會在傳入足夠參數時才會執行,而這些參數必需乎合Apache的內部格式,如果包裝程序接收不到足夠的參數,那代表suEXEC被人破壞,或你suEXEC的Binary版本出現問題。

執行包裝程序的是否合法用戶? 這檢查確保執行程序的用戶是系統中合法的用戶。

執行用戶有沒有權使用包裝程序?只有唯一一個用戶(Apache用戶)可執行這個程序。

被執行的程序有不安全的相對目錄參照字符?所有程序文件名開頭含有「/」或「..」都不獲處理,程序需存在Apache分配的目錄中。

執行用戶是否合法用戶? 執行用戶必需是系統中已存在用戶。

執行工作組是否合法工作組?執行工作組必需是系統中已存在工作組。

執行用戶是否超級用戶? 目前Apache仍不允許「root」執行CGI/SSI程序。 CGI/SSI programs.

執行用戶ID是否低於Apache的最低容許ID? 最低允許ID值在設定檔中找到,用來控制哪個值以上的ID才可執行包裝程序,這功能可過濾系統內設用戶。

程序所屬的工作組是否超級用戶工作組? 目前suEXEC仍不允許「root」工作組執行CGI/SSI程序

程序工作組是否低於Apache最低容許ID? 最低允許ID值在設定檔中找到,用來控制哪個值以上的GID才可執行包裝程序,這功能可過濾系統內設工作組。

包裝程序可否更改執行用戶及其工作組? 成功與否在於將CGI/SSI程序SETUID及SETGID的過程,工作組使用列表

載有該程序的目錄是否存在? 若果該目錄並不存在,要執行的程序也不會存在。

載有程序的目錄是否在Apache所設置的網頁空間內? 若執行請求發生於Apache常規部分,該目錄應在Apache的根目錄;若請求發生於一般UserDir,該目錄應在用戶的Document Root中。

載有程序的目錄是否拒絕任何人寫入? 其它用戶不能存取這個目錄,只有目錄擁有者才能更改目錄裡的內容。

要執行的程序存在嗎? 不可能執行不存在的程序。

程序是否不能被更改或更新? 除了程序擁有者外,任何人都沒有權限更改該程序。

你的程序是否setuid或setgid程序? suEXEC不會處理會更改現時UID/GID的程序。

程序擁有者是否就是suEXEC所包裝的用戶? 只有把請求包裝成程序擁有者權限才能執行該程序。

可否清除程序環境以確保程序能順利行? suEXEC利用安全執行目錄來清除程序環境,所有頁面傳遞變量均會清除(在設置suEXEC時已設定)。

我們能否成為被執行的程序? execute? suEXEC已完了,是被執行的程序的開始。

以上就是suEXEC包裝程序的標準運作安全模型,這嚴謹的模型引入了CGI/SSI程序的限制及程序設計指導,但設計時當然要在腦海中一步步實行。

如欲獲取更多關於安全模型如何限制服務器的設定,以及知道如何避免suEXEC所產生的系統漏洞,請參看Beware the Jabberwock。

設定及安裝suEXEC

我們正式開始把suEXEC嵌入Apache中,如果你正使用Apache 1.2或是Apache 1.3的src/Configure的話,你需修改suEXEC的頭檔(Header File)及人手安裝Binary版本至正確位置,安裝過程可在suEXEC附加文件找到。以下幾節將會描述Apache 1.3,透過AutoConf-Style Interface(APACI)的設定及安裝過程。

suEXEC APACI設定選項

--enable-suexec

代表安裝suEXEC至Apache中,加入這選項後,必需額外設置最少有一個 --suexec-xxxxx 選項,讓APACI知道suEXEC該如何設定。

--suexec-caller=UID

在Apache能呼叫suEXEC的用戶名稱,這是執行Apache子程序的用戶,只有這個用戶才可呼叫suEXEC。

--suexec-docroot=DIR

設定網頁文件存放位置,只有這目錄及其子目錄內的程序才可使用suEXEC,預設的目錄為 --datadir 加上「/htdocs」,例如你將datadir設為--datadir=/home/apache,那麼「/home/apache/htdocs」就是允許使用suEXEC包裝程序的目錄。

--suexec-logfile=FILE

設定記錄文件的文件名稱,所有suEXEC的執行記錄及錯誤均會記入此檔(方便檢查及除錯),默認值為「suexec_log」,而預設目錄設在--logfiledir中。

--suexec-userdir=DIR

設定用戶存放網頁的目錄,所有suEXEC包裝都必需在這個目錄內進行,以確定這個程序是用戶親自允許執行的,若你只簡單地鍵入絕對路徑(i.e. 沒有萬用字符「*」),那麼UserDir和允許使用suEXEC的地方就應設定為同一個目錄,若suEXEC的UserDir並不包括用戶存放網頁的目錄,那麼這些網頁就因不乎合密碼文件的記錄而不能使用suEXEC。UserDir的默認值為「public_html」,若你設定Virtual Host時其UserDir在suEXEC目錄之外,那麼你就需要把suEXEC的UserDir設定為這堆目錄的父目錄。若你不正確設定 UserDir,所有「~userdir」的CGI請求均會失敗。

--suexec-uidmin=UID

設定使用suEXEC的最大允許用戶ID,默認值為100,一般系統是500或者100。

--suexec-gidmin=GID

設定使用suEXEC的最大允許用戶組ID,默認值為100。

--suexec-safepath=PATH

設定suEXEC的安全目錄,這安全目錄允許執行CGI程序,默認值為「/usr/local/bin:/usr/bin:/bin」。

檢查suEXEC的設定

在編譯及安裝suEXEC包裝程序之前,你可利用--layout選項檢查你目前各設定選項:

輸出例子:

suEXEC setup:

suexec binary: /usr/local/apache/sbin/suexec

document root: /usr/local/apache/share/htdocs

userdir suffix: public_html

logfile: /usr/local/apache/var/log/suexec_log

safe path: /usr/local/bin:/usr/bin:/bin

caller ID: www

minimum user ID: 100

minimum group ID: 100

編譯及安裝suEXEC包裝程序

若你透過--enable-suexec選項,在Binary版本中決定使用suEXEC的話,按「make」後就會自動把suEXEC嵌入Apache中。

執行「make install」安裝所有Apache組件後,suEXEC會放置在由--sbindir選項決定的目錄中,預設目錄為「/usr/local/apache/sbin/suexec」。請留意,你需要成為超級用戶方可完成安裝過程,為了讓suEXEC有setuid的權力,你必需把suEXEC擁有者轉為「root」及加入setuid權限至suEXEC程序。

啟動及關閉suEXEC

在啟動Apache之前,Apache主程序會尋找「sbin」裡的「suexec」程序文件(默認值為「/usr/local/apache/sbin/suexec」,若Apache能找到正確的suexec檔,Apache將會把suEXEC啟動記錄寫入錯誤日誌中:

[notice] suEXEC mechanism enabled (wrapper: /path/to/suexec)

若在Apache啟動後在錯誤日誌中找不到以上訊息,即代表Apache服務器找不到包裝程序,又或者該包裝程序文件沒有setuid權限。

你不可以中途加入suEXEC至運行中的Apache,你必先關閉並重新啟動Apache服務器,純粹使用「HUP」或「USR1」是沒效的;若你想關掉suEXEC,你亦需同樣把Apache服務器關閉並重開,但在重開之前你需移除suexec程序文件

使用suEXEC

虛擬主機:

透過User和Group可讓虛擬主機自設suEXEC的用戶及用戶組,設定後所有CGI請求都會依照User和Group的設定值來執行,若在宣告虛擬主機時沒有設定User和Group,Apache會使用主服器的用戶及用戶組

使用者目錄:

suEXEC包裝程序亦會接受以個別設定的用戶權限來執行CGI程序,只要把「~」加在用戶ID之前把主服務器目錄導向至用戶之網頁目錄即可,所有乎合suEXEC安全模型的CGI程序及請求都可用這個方法以特定用戶執行CGI程序。

suEXEC除錯

所有suEXEC的執行過程都會寫入日誌檔案,日誌文件名稱可於--suexec-logfile選項中設定,若你已確定自己設置無誤,但仍有不明的suEXEC錯誤的話,可參看suEXEC的error_log。

suEXEC注意事項

目錄階層限制

在系統安全及效率的大前提下,所有在虛擬主機的網頁及個別用戶的suEXEC請求都必需在根目錄裡執行,例如你設定了四個虛擬主機,你必需把這些虛擬主機的根目錄歸納在一個Apache主文件目錄中,以乎合suEXEC需要在特定安全目錄下執行這個條件。

執行環境中的suEXEC路徑

更改suEXEC執行目錄有可能產生系統保安漏洞,請確定suEXEC的執行目錄為可信任的目錄,讓不可靠的目錄設定為suEXEC的執行目錄有可能被任何人以木馬程序攻擊計算機系統。

更改suEXEC的程序代碼

若你不清楚suEXEC程序代碼的意義就自行更改其內容,可引起龐大的程序錯誤,請儘量不要更改suEXEC的程序代碼。





以下文章轉錄自:改變 CGI 執行身份: suEXEC

在 Apache 內的虛擬主機預設會使用和 Apache 相同的身份執行 CGI,例如 apache 或 nobody,如果想每個虛擬主機使用不同身份執行,可以透過 suEXEC 實現。

要檢查 Apache 是否支援 suEXEC,可以執行以下指令:

/usr/local/apache/bin/httpd -l | grep suexec

以上 /usr/local/apache/bin 改成你的 Apache 安裝目錄,如果結果出現了 "mod_suexec.c",代表 Apache 已經支援 suEXEC,如果不支援的話請重新編譯 Apache,並在編譯時加上 –enable-suexec 選擇。以下是 suEXEC 使用方法:

Apache 1.3.x
在 httpd.conf 內的 <VirtualHost> 段落下加上兩行,分別是:

User samtang
Group samtang

以上會以 samtang 作為使用者及群組執行這個虛擬主機的 CGI,重新啟動 Apache 後便會生效。

Apache 2.0.x
在 httpd.conf 內的 <VirtualHost> 段落下加上這行:

SuexecUserGroup samtang samtang

沒有留言:

張貼留言