有關(guān)設(shè)置Web服務(wù)器的安全問(wèn)題的一些提示和技巧。一些建議通用的,其他建議特定于A(yíng)pache版本。
Apache HTTP Server具有良好的安全記錄和高度關(guān)注安全問(wèn)題的開(kāi)發(fā)人員社區(qū)。但是,在軟件發(fā)布之后,軟件中會(huì)發(fā)現(xiàn)一些小問(wèn)題或大問(wèn)題是不可避免的。因此,了解軟件更新至關(guān)重要。如果是直接從Apache獲得了HTTP Server的版本,我們強(qiáng)烈建議您訂閱Apache HTTP Server公告列表,以便隨時(shí)了解新版本和安全更新。大多數(shù)Apache軟件的第三方分銷(xiāo)商都提供類(lèi)似的服務(wù)。
當(dāng)然,大多數(shù)情況下Web服務(wù)器受到攻擊,并不是因?yàn)镠TTP Server代碼中存在問(wèn)題。相反,它來(lái)自附加代碼,CGI腳本或底層操作系統(tǒng)中的問(wèn)題。因此,您必須了解系統(tǒng)中所有軟件的問(wèn)題和更新。
所有網(wǎng)絡(luò)服務(wù)器都可能遭受拒絕服務(wù)攻擊,這些攻擊試圖通過(guò)占用服務(wù)器的資源來(lái)阻止對(duì)客戶(hù)端的響應(yīng)。不可能完全阻止此類(lèi)攻擊,但可以做某些事情來(lái)緩解這些問(wèn)題。
通常,最有效的反DoS工具將是防火墻或其他操作系統(tǒng)配置。例如,大多數(shù)防火墻可以配置為限制來(lái)自任何單個(gè)IP地址或網(wǎng)絡(luò)的同時(shí)連接數(shù),從而防止一系列簡(jiǎn)單攻擊。當(dāng)然,這對(duì)分布式拒絕服務(wù)攻擊(DDoS)沒(méi)有幫助。
還有一些Apache HTTP Server配置設(shè)置可以幫助緩解問(wèn)題:
在典型操作中,Apache由root用戶(hù)啟動(dòng),并切換到User指令定義的用戶(hù)以提供命中。與root執(zhí)行的任何命令一樣,必須注意保護(hù)它免受非root用戶(hù)的修改。文件本身不僅必須只能由root寫(xiě)入,而且目錄和所有目錄的父項(xiàng)也必須可寫(xiě)。例如,如果選擇將ServerRoot放在/usr/local/apache中,則建議以root身份創(chuàng)建該目錄,其命令如下:
mkdir /usr/local/apache cd /usr/local/apache mkdir bin conf logs chown 0 . bin conf logs chgrp 0 . bin conf logs chmod 755 . bin conf logs
Shell
假設(shè)/,/usr和/usr/local只能由root用戶(hù)修改。安裝httpd可執(zhí)行文件時(shí),應(yīng)確保它受到類(lèi)似的保護(hù):
cp httpd /usr/local/apache/bin chown 0 /usr/local/apache/bin/httpd chgrp 0 /usr/local/apache/bin/httpd chmod 511 /usr/local/apache/bin/httpd
Shell
您可以創(chuàng)建一個(gè)可由其他用戶(hù)修改的htdocs子目錄 - 因?yàn)閞oot從不執(zhí)行任何文件,并且不應(yīng)該在那里創(chuàng)建文件。
如果您允許非root用戶(hù)修改root執(zhí)行或?qū)懭氲娜魏挝募?,那么打開(kāi)系統(tǒng)以進(jìn)行root妥協(xié)。例如,有人可以替換httpd二進(jìn)制文件,以便下次啟動(dòng)它時(shí),它將執(zhí)行一些任意代碼。如果logs目錄是可寫(xiě)的(由非root用戶(hù)),則有人可以使用符號(hào)鏈接將日志文件替換為某個(gè)其他系統(tǒng)文件,然后root可能會(huì)使用任意數(shù)據(jù)覆蓋該文件。如果日志文件本身是可寫(xiě)的(由非root用戶(hù)),那么有人可能能夠用偽造的數(shù)據(jù)覆蓋日志本身。
服務(wù)器端包含(SSI)為服務(wù)器管理員提供了若干潛在的安全風(fēng)險(xiǎn)。
第一個(gè)風(fēng)險(xiǎn)是服務(wù)器上的負(fù)載增加。無(wú)論文件中是否包含任何SSI指令,所有啟用SSI的文件都必須由Apache解析。雖然這種負(fù)載增加很小,但在共享服務(wù)器環(huán)境中,它可能會(huì)變得很重要。
SSI文件通常也會(huì)帶來(lái)與CGI腳本相關(guān)的風(fēng)險(xiǎn)。使用exec cmd元素,啟用SSI的文件可以在用戶(hù)和Apache運(yùn)行的組的權(quán)限下執(zhí)行任何CGI腳本或程序,如httpd.conf中所配置的那樣。
有一些方法可以增強(qiáng)SSI文件的安全性,同時(shí)仍然利用它們提供的好處。
要隔離任意SSI文件可能導(dǎo)致的損壞,服務(wù)器管理員可以啟用suexec。
為具有.html或.html擴(kuò)展名的文件啟用SSI可能很危險(xiǎn)。在共享或高流量的服務(wù)器環(huán)境中尤其如此。啟用SSI的文件應(yīng)具有單獨(dú)的擴(kuò)展名,例如傳統(tǒng)的.shtml。這有助于將服務(wù)器負(fù)載降至最低,并可以更輕松地管理風(fēng)險(xiǎn)。
另一種解決方案是禁用從SSI頁(yè)面運(yùn)行腳本和程序的能力。要執(zhí)行此操作,請(qǐng)?jiān)贠ptions指令中將Includes替換為IncludesNOEXEC。請(qǐng)注意,如果這些腳本位于ScriptAlias指令指定的目錄中,則用戶(hù)仍可以使用<--#include virtual="..." -->來(lái)執(zhí)行CGI腳本。
首先,必須始終記住,信任CGI腳本/程序的編寫(xiě)者或在CGI中發(fā)現(xiàn)潛在安全漏洞的能力,無(wú)論這些漏洞是故意的還是偶然的。CGI腳本可以使用Web服務(wù)器用戶(hù)的權(quán)限在您的系統(tǒng)上運(yùn)行基本上任意的命令,因此如果不仔細(xì)檢查它們會(huì)非常危險(xiǎn)。
所有CGI腳本都將作為同一個(gè)用戶(hù)運(yùn)行,因此它們有可能(意外或故意)與其他腳本沖突,例如 用戶(hù)A討厭用戶(hù)B,因此他將腳本寫(xiě)入垃圾用戶(hù)B的CGI數(shù)據(jù)庫(kù)。一個(gè)可用于允許腳本作為不同用戶(hù)運(yùn)行的程序是suEXEC,它包含在A(yíng)pache的1.2版本中,并且是從Apache服務(wù)器代碼中的特殊鉤子調(diào)用的。另一種流行的方法是使用CGIWrap。
只有在以下情況下才允許用戶(hù)在任何目錄中執(zhí)行CGI腳本:
將CGI限制為特殊目錄可使管理員控制進(jìn)入這些目錄的內(nèi)容。這不可避免地比非腳本別名CGI更安全,但僅當(dāng)具有對(duì)目錄的寫(xiě)訪(fǎng)問(wèn)權(quán)限的用戶(hù)可信或管理員愿意測(cè)試每個(gè)新的CGI腳本/程序以尋找潛在的安全漏洞時(shí)。
大多數(shù)站點(diǎn)都選擇此選項(xiàng)而不是非腳本別名CGI方法。
作為服務(wù)器本身的一部分運(yùn)行的嵌入式腳本選項(xiàng),例如:mod_php,mod_perl,mod_tcl和mod_python,在服務(wù)器本身的標(biāo)識(shí)下運(yùn)行(參見(jiàn)User指令),因此這些引擎執(zhí)行的腳本可能訪(fǎng)問(wèn)任何內(nèi)容 服務(wù)器用戶(hù)可以。某些腳本引擎可能會(huì)提供限制,但最好是安全而不是假設(shè)。
在設(shè)置動(dòng)態(tài)內(nèi)容時(shí),例如:mod_php,mod_perl或mod_python,許多安全注意事項(xiàng)都超出了httpd本身的范圍,您需要查閱這些模塊的文檔。例如,PHP允許設(shè)置安全模式,默認(rèn)情況下最常禁用安全模式。另一個(gè)例子是Suhosin,這是一個(gè)更安全的PHP插件。
在A(yíng)pache級(jí)別,mod_security模塊可以被視為HTTP防火墻,如果配置得非常好,可以幫助增強(qiáng)動(dòng)態(tài)內(nèi)容安全性。
要運(yùn)行非常緊湊的船舶,需要阻止用戶(hù)設(shè)置.htaccess文件,這些文件可以覆蓋已配置的安全功能。這是一種方法。
在服務(wù)器配置文件中,加入以下內(nèi)容 -
<Directory "/"> AllowOverride None </Directory>
Shell
這可以防止在除特別啟用的目錄之外的所有目錄中使用.htaccess文件。
注意,此設(shè)置是Apache 2.3.9以上版本的默認(rèn)設(shè)置。
Apache的一個(gè)方面是默認(rèn)訪(fǎng)問(wèn)的特征。也就是說(shuō),除非采取措施進(jìn)行更改,否則如果服務(wù)器可以通過(guò)常規(guī)URL映射規(guī)則找到文件,則可以將其提供給客戶(hù)端。
例如,請(qǐng)考慮以下示例:
# cd /; ln -s / public_html Accessing http://localhost/~root/
Shell
這將允許客戶(hù)端遍歷整個(gè)文件系統(tǒng)。要解決此問(wèn)題,請(qǐng)將以下塊添加到服務(wù)器的配置中:
<Directory "/"> Require all denied </Directory>
Shell
這將禁止默認(rèn)訪(fǎng)問(wèn)文件系統(tǒng)位置。添加適當(dāng)?shù)哪夸泬K以?xún)H允許在希望的那些區(qū)域中進(jìn)行訪(fǎng)問(wèn)。例如:
<Directory "/usr/users/*/public_html"> Require all granted </Directory> <Directory "/usr/local/httpd"> Require all granted </Directory>
Shell
特別注意Location和Directory指令的交互; 例如,即使<Directory "/">拒絕訪(fǎng)問(wèn),<Location "/">指令也可能推翻它。
同時(shí)要小心使用UserDir指令玩游戲; 將它設(shè)置為./會(huì)對(duì)root產(chǎn)生相同的效果,就像上面的第一個(gè)例子一樣。強(qiáng)烈建議在服務(wù)器配置文件中包含以下行:
UserDir disabled root
Shell
要及時(shí)了解服務(wù)器的實(shí)際情況,需要檢查日志文件。即使日志文件僅報(bào)告已發(fā)生的事件,它們也會(huì)讓您了解針對(duì)服務(wù)器的攻擊,并用于檢查是否存在必要的安全級(jí)別。
參考幾個(gè)例子:
grep -c "/jsp/source.jsp?/jsp/ /jsp/source.jsp??" access_log grep "client denied" error_log | tail -n 10
Shell
第一個(gè)示例將列出嘗試?yán)肁pache Tomcat source.jsp格式錯(cuò)誤的請(qǐng)求信息泄露漏洞的攻擊數(shù)量,第二個(gè)示例將列出最后被拒絕的十個(gè)客戶(hù)端,例如:
[Thu Jul 11 17:18:39 2002] [error] [client foo.example.com] client denied by server configuration: /usr/local/apache/htdocs/.htpasswd
Shell
如上所見(jiàn),日志文件僅報(bào)告已發(fā)生的情況,因此如果客戶(hù)端能夠訪(fǎng)問(wèn).htpasswd文件,會(huì)看到類(lèi)似于:
foo.example.com - - [12/Jul/2002:01:59:13 +0200] "GET /.htpasswd HTTP/1.1"
Shell
在訪(fǎng)問(wèn)日志中,可能在服務(wù)器配置文件中注釋掉以下內(nèi)容:
<Files ".ht*"> Require all denied </Files>
Shell
配置部分的合并是復(fù)雜的,有時(shí)是指令特定的。在創(chuàng)建合并指令的依賴(lài)關(guān)系時(shí),始終要測(cè)試您的更改。
對(duì)于未實(shí)現(xiàn)任何合并邏輯的模塊,例如mod_access_compat,后面部分中的行為取決于后一部分是否具有來(lái)自模塊的任何指令。繼承配置,直到進(jìn)行更改,此時(shí)配置被替換而不是合并。
更多建議: