Apache HTTP Server 版本2.2
suEXEC特性使得Apache可以使用與調(diào)用web服務(wù)器的用戶(hù)不同的用戶(hù)身份來(lái)運(yùn)行CGI和SSI程序。而通常情況下,CGI或者SSI程序執(zhí)行時(shí)使用和web服務(wù)器相同的用戶(hù)身份。
正確運(yùn)用該特性,可以減少很多因?yàn)樘峁┯脩?hù)執(zhí)行私有CGI或者SSI程序所帶來(lái)的安全風(fēng)險(xiǎn)。但如果配置不當(dāng)?shù)脑,則可能引起很多問(wèn)題,使你的計(jì)算機(jī)產(chǎn)生更多的安全漏洞。如果你對(duì)管理 setuid root 程序以及可能導(dǎo)致的安全問(wèn)題不熟悉的話,我們強(qiáng)烈建議你不要使用suEXEC。
在我們開(kāi)始切入正題之前,你必須明白Apache開(kāi)發(fā)組以及本文檔所做的假設(shè)。
首先,我們假設(shè)你正在使用類(lèi)UNIX操作系統(tǒng),只有這類(lèi)操作系統(tǒng)才具有setuid和setgid命令。所有的其他命令行的例子也是如此。其他的操作系統(tǒng)平臺(tái),即使也支持suEXEC,但是它的配置可能和我們所講的并不相同。
第二,我們假設(shè)你熟悉計(jì)算機(jī)的安全和管理計(jì)算機(jī)的一些基本概念。這關(guān)系到如何正確理解setuid/setgid操作以及對(duì)你的系統(tǒng)可能帶來(lái)的各種影響和不同的安全等級(jí)。
第三,我們假設(shè)你正在使用源代碼未經(jīng)修改的suEXEC版本。所有suEXEC的代碼都經(jīng)過(guò)開(kāi)發(fā)者的仔細(xì)查驗(yàn)并做過(guò)大量測(cè)試。在這些代碼中,人們采取了各種預(yù)防措施,使之簡(jiǎn)單、健壯、安全。修改這些代碼可能會(huì)導(dǎo)致預(yù)料之外的問(wèn)題和安全隱患。所以我們強(qiáng)烈地建議你不要修改代碼,除非你精通安全編程,并愿意和Apache開(kāi)發(fā)組共享成果。
第四,也是最后一點(diǎn),Apache開(kāi)發(fā)組已經(jīng)決定默認(rèn)不安裝suEXEC。suEXEC的配置需要管理員細(xì)致關(guān)注各個(gè)細(xì)節(jié)。在仔細(xì)考察過(guò)關(guān)于suEXEC的各種設(shè)置方法后,管理員應(yīng)該使用標(biāo)準(zhǔn)的安裝方法來(lái)安裝suEXEC。設(shè)置的參數(shù)應(yīng)該經(jīng)過(guò)仔細(xì)推敲,以保證系統(tǒng)的安全運(yùn)行。Apache開(kāi)發(fā)組希望通過(guò)限制suEXEC的安裝,僅使那些經(jīng)過(guò)細(xì)致理解,并有能力運(yùn)用它的管理員來(lái)使用。
你還想使用suEXEC嗎?還想?很好!那我們開(kāi)始吧!
在我們開(kāi)始配置和安裝suEXEC之前,我們需要先討論一下它的安全模型。這樣,你才能更好的理解suEXEC內(nèi)部究竟做了些什么事情,以及哪些確保系統(tǒng)安全的預(yù)防措施。
suEXEC是基于一個(gè)setuid的"封裝"程序,該程序由"主"Apache web服務(wù)器調(diào)用。當(dāng)一個(gè)HTTP請(qǐng)求的是管理員指定的、以不同于"主"服務(wù)器用戶(hù)身份運(yùn)行的CGI或SSI程序時(shí),該封裝程序?qū)⒈徽{(diào)用。處理這樣的請(qǐng)求時(shí),Apache將被請(qǐng)求的程序名及其UID和GID提供給suEXEC封裝器。
封裝器(wrapper)通過(guò)處理下面所描述的步驟,來(lái)決定封裝的成功或失。喝绻腥我庖粋(gè)條件為假,程序?qū)彦e(cuò)誤情況記錄到日志中,退出并返回錯(cuò)誤信息。否則繼續(xù)執(zhí)行。(以下所說(shuō)的"程序"均指"CGI/SSI程序")
確保運(yùn)行封裝器的是一個(gè)系統(tǒng)中確實(shí)存在的用戶(hù)。
封裝器僅在使用了正確數(shù)量的參數(shù)調(diào)用時(shí)才會(huì)執(zhí)行。Apache web服務(wù)器知道正確的參數(shù)格式是什么。如果封裝器沒(méi)有收到正確數(shù)量的參數(shù),則說(shuō)明要么被黑客攻擊,要么Apache二進(jìn)制代碼中suEXEC的部分出了問(wèn)題。
這個(gè)用戶(hù)是可以運(yùn)行封裝器的用戶(hù)嗎??jī)H有一個(gè)用戶(hù)(Apache用戶(hù))被允許運(yùn)行封裝器。
目標(biāo)CGI/SSI程序包含了"/"開(kāi)頭或者有".."后向路徑索引嗎?這些都是不允許的;并且目標(biāo)程序必須位于suEXEC的文檔根目錄下。(參見(jiàn)下面的:--with-suexec-docroot=DIR
)
目標(biāo)程序的所屬用戶(hù)名存在嗎?
目標(biāo)程序的所屬用戶(hù)組存在嗎?
目前,suEXEC不允許root執(zhí)行CGI/SSI程序。
最小UID值是在配置中指定的。你可以指定允許執(zhí)行CGI/SSI程序的最小UID值,這樣可以保證不會(huì)和系統(tǒng)賬號(hào)沖突。
目前,suEXEC不允許root組用戶(hù)執(zhí)行CGI/SSI程序。
最小GID值是在配置中指定的。你可以指定允許執(zhí)行CGI/SSI程序的最小GID值,這樣可以保證不會(huì)和系統(tǒng)賬號(hào)沖突。
這里就是程序變?yōu)槟繕?biāo)用戶(hù)和組的關(guān)鍵步驟了。我們是通過(guò)調(diào)用setuid和setgid來(lái)實(shí)現(xiàn)的。在組訪問(wèn)列表中,和該用戶(hù)相關(guān)的所有組信息都將被初始化。
如果不存在,將無(wú)法包含程序文件。如果不能切換一般也表示目錄不存在。
如果是對(duì)于服務(wù)器的一般請(qǐng)求,那么請(qǐng)求的目錄是在suEXEC的根文檔目錄下嗎?如果請(qǐng)求的是一個(gè)用戶(hù)目錄,那么該目錄是在suEXEC配置的該用戶(hù)的根目錄下嗎?(參見(jiàn):suEXEC配置選項(xiàng))
我們不想把目錄開(kāi)放給其他人;只有屬主才可以改變?cè)撃夸浿械膬?nèi)容。
如果不存在,當(dāng)然無(wú)法繼續(xù)運(yùn)行。
我們不想給其他人有修改程序的權(quán)限。
我們不想要執(zhí)行的程序被再次改變UID/GID。
用戶(hù)是這個(gè)文件的屬主嗎?
suEXEC通過(guò)建立一個(gè)安全的可執(zhí)行路徑(在配置中定義)來(lái)清除該進(jìn)程的環(huán)境變量,同時(shí)只傳送在安全環(huán)境變量列表(配置中定義)中所列出的環(huán)境變量。
這里就是suEXEC結(jié)束,并開(kāi)始運(yùn)行目標(biāo)程序的地方了。
這是suEXEC封裝器標(biāo)準(zhǔn)操作方式的安全模型。它有些嚴(yán)格,并強(qiáng)加了CGI/SSI設(shè)計(jì)上的限制。但它是仔細(xì)考慮過(guò)安全之后一步步發(fā)展起來(lái)的模型。
更多關(guān)于該安全模型如何根據(jù)服務(wù)器的配置來(lái)限制使用者的權(quán)限,以及恰當(dāng)?shù)膕uEXEC安裝步驟能夠避免的安全隱患,請(qǐng)參見(jiàn)警告和舉例部分。
繼續(xù)我們的探險(xiǎn) ...
suEXEC配置選項(xiàng)
--enable-suexec
--with-suexec-xxxxx
選項(xiàng),以使APACI使用suEXEC功能來(lái)處理請(qǐng)求。--with-suexec-bin=PATH
suexec
二進(jìn)制程序的路徑必須用這個(gè)選項(xiàng)指定并硬編碼在服務(wù)器里。比如:--with-suexec-bin=/usr/sbin/suexec
--with-suexec-caller=UID
--with-suexec-userdir=DIR
UserDir
指令(即不帶"*"),則此處應(yīng)該被設(shè)置為相同的值。當(dāng)UserDir
指令所指向的目錄與"passwd"文件所指定的用戶(hù)宿主目錄不同時(shí),suEXEC將不會(huì)正常工作,其默認(rèn)值是"public_html"。如果所支持的虛擬主機(jī)對(duì)每個(gè)用戶(hù)有不同的UserDir
,則應(yīng)該把他們集中在同一個(gè)父目錄下,而用這個(gè)參數(shù)指向這個(gè)父目錄。如果配置不當(dāng),"~userdir"下的cgi請(qǐng)求將無(wú)效!--with-suexec-docroot=DIR
DocumentRoot
。它是除UserDir
外suEXEC唯一可以使用的目錄。其默認(rèn)目錄是 --datadir
值所指定的帶有"/htdocs"的后綴的目錄,比如:如果配置了"--datadir=/home/apache
",那么"/home/apache/htdocs"目錄將作為suEXEC處理器的文檔根目錄。--with-suexec-uidmin=UID
--with-suexec-gidmin=GID
--with-suexec-logfile=FILE
--logfiledir
)。--with-suexec-safepath=PATH
編譯和安裝suEXEC處理器
若用 --enable-suexec
打開(kāi)了suEXEC功能,那么執(zhí)行make
命令時(shí)(Apache自帶的)suexec
二進(jìn)制文件就會(huì)被自動(dòng)建立。所有組件編譯完畢后執(zhí)行 make install
命令進(jìn)行安裝時(shí),suexec
文件將被安裝在 --sbindir
選項(xiàng)指定的目錄中,默認(rèn)為"/usr/local/apache2/sbin/suexec"。
注意,安裝過(guò)程需要root權(quán)限。為了使suEXEC處理器可以設(shè)置UID,其所有者必須為root
,并且文件模式中的執(zhí)行位必須設(shè)置為1(允許執(zhí)行)。
設(shè)置許可權(quán)限
雖然suEXEC包裝會(huì)檢查以確保它的調(diào)用者就是配置選項(xiàng)
--with-suexec-caller
所指定的用戶(hù)。但是總是存在這樣的可能性:一個(gè)系統(tǒng)或者庫(kù)在suEXEC執(zhí)行用戶(hù)身份檢查之前調(diào)用它,這樣就存在一個(gè)可利用的漏洞。通常,避免這種問(wèn)題的最佳辦法是,使用文件系的統(tǒng)權(quán)限來(lái)確保只有Apache組用戶(hù)運(yùn)行的程序才能執(zhí)行suEXEC。
如果你的web-server是按照如下所示進(jìn)行配置的:
User www
Group webgroup
并且suexec
被安裝在"/usr/local/apache2/sbin/suexec"目錄,你應(yīng)當(dāng)運(yùn)行以下命令:
chgrp webgroup /usr/local/apache2/bin/suexec
chmod 4750 /usr/local/apache2/bin/suexec
這將確保只有Apache組用戶(hù)運(yùn)行的程序才能執(zhí)行suEXEC。
Apache在啟動(dòng)過(guò)程中,會(huì)在 --sbindir
選項(xiàng)指定的目錄(默認(rèn)為:"/usr/local/apache/sbin/suexec")中尋找suexec
。如果Apache找到了一個(gè)正確配置的suEXEC處理器,會(huì)在錯(cuò)誤日志中記錄以下信息:
[notice] suEXEC mechanism enabled (wrapper: /path/to/suexec)
如果服務(wù)器啟動(dòng)后沒(méi)有這個(gè)信息,那么很可能是服務(wù)器沒(méi)找到適當(dāng)?shù)奶幚砥,或者是這個(gè)執(zhí)行程序沒(méi)有安裝setuid root。
如果要在Apache服務(wù)器運(yùn)行過(guò)程中打開(kāi)suEXEC功能,則必須停止并重新啟動(dòng)Apache。用一個(gè)簡(jiǎn)單的HUP或USR1信號(hào)來(lái)重新啟動(dòng)是不夠的。
如果要關(guān)閉suEXEC功能,應(yīng)該刪除suexec
文件,并停止和重新啟動(dòng)Apache。
對(duì)CGI程序的請(qǐng)求僅在下述兩種情況下才會(huì)調(diào)用suEXEC包裝:對(duì)一個(gè)含SuexecUserGroup
指令的虛擬主機(jī)發(fā)起請(qǐng)求,或者該請(qǐng)求由mod_userdir
模塊處理。
虛擬主機(jī):
使用suEXEC處理器的方法之一是在VirtualHost
定義中使用SuexecUserGroup
指令。通過(guò)設(shè)置這個(gè)指令來(lái)確定不同于主服務(wù)器的UID,所有對(duì)CGI資源的請(qǐng)求將以<VirtualHost>
所定義的User和Group身份執(zhí)行。如果<VirtualHost>
中沒(méi)有這個(gè)指令,則將以主服務(wù)器的UID身份執(zhí)行。
用戶(hù)目錄:
由mod_userdir
處理的請(qǐng)求會(huì)調(diào)用suEXEC處理器以被請(qǐng)求的用戶(hù)目錄所屬的UID執(zhí)行CGI程序。此功能的唯一要求是,此用戶(hù)必須有CGI執(zhí)行權(quán)限,并且其腳本符合上述安全檢查的要求。參見(jiàn) --with-suexec-userdir
編譯選項(xiàng)。
如上所述,suEXEC處理器會(huì)在 --with-suexec-logfile
選項(xiàng)所指定的日志文件中記錄信息。如果你感覺(jué)配置和安裝不正常,可以查看這個(gè)日志以及服務(wù)器的錯(cuò)誤日志。
注意!這部分文檔可能還沒(méi)有完成。查看最新的修訂版本,請(qǐng)到Apache開(kāi)發(fā)組的在線文檔。
以下是有關(guān)限制和服務(wù)器安裝的幾個(gè)注意事項(xiàng),在提交任何關(guān)于suEXEC的"bugs"以前,請(qǐng)仔細(xì)閱讀。
出于安全和效率考慮,所有suEXEC請(qǐng)求必須被限制在虛擬主機(jī)或者用戶(hù)目錄的頂層。舉例來(lái)說(shuō),如果你配置了4個(gè)虛擬主機(jī),你必須把所有虛擬主機(jī)的文檔根目錄都安置在同一個(gè)主Apache目錄中,這樣才能為虛擬主機(jī)啟用suEXEC。(例子以后會(huì)有的)
改變這個(gè)變量的值是危險(xiǎn)的,必須確保其中每個(gè)路徑都是可以信任的目錄。你不會(huì)希望誰(shuí)都可以在你的服務(wù)器上安裝特洛伊木馬。
重申,如果你不清楚你在干什么就盡量避免,否則會(huì)帶來(lái)大麻煩的。