Apache 安全設(shè)置

2021-10-13 18:22 更新

有關(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ù)(DoS)攻擊

所有網(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)題:

  • RequestReadTimeout指令允許限制客戶(hù)端發(fā)送請(qǐng)求所花費(fèi)的時(shí)間。
  • 應(yīng)該在受到DoS攻擊的站點(diǎn)上降低TimeOut指令。將其設(shè)置為低至幾秒可能是合適的。由于TimeOut當(dāng)前用于多個(gè)不同的操作,因此將其設(shè)置為較低值會(huì)導(dǎo)致長(zhǎng)時(shí)間運(yùn)行的CGI腳本出現(xiàn)問(wèn)題。
  • KeepAliveTimeout指令也可能會(huì)在受到DoS攻擊的網(wǎng)站上降低。有些網(wǎng)站甚至通過(guò)KeepAlive完全關(guān)閉了Keepalive,這當(dāng)然還有其他性能上的缺點(diǎn)。
  • 應(yīng)檢查其他模塊提供的各種超時(shí)相關(guān)指令的值。
  • 應(yīng)仔細(xì)配置LimitRequestBody,LimitRequestFields,LimitRequestFieldSize,LimitRequestLine和LimitXMLRequestBody指令,以限制客戶(hù)端輸入觸發(fā)的資源消耗。
  • 在支持它的操作系統(tǒng)上,確保使用AcceptFilter指令將部分請(qǐng)求處理卸載到操作系統(tǒng)。這在A(yíng)pache httpd中默認(rèn)是活動(dòng)的,但可能需要重新配置內(nèi)核。
  • 調(diào)整MaxRequestWorkers指令以允許服務(wù)器處理最大數(shù)量的并發(fā)連接,而不會(huì)耗盡資源。
  • 使用線(xiàn)程mpm可以讓您處理更多的同時(shí)連接,從而減輕DoS攻擊。此外,事件mpm使用異步處理來(lái)避免將線(xiàn)程用于每個(gè)連接。由于OpenSSL庫(kù)的性質(zhì),事件mpm當(dāng)前與mod_ssl和其他輸入過(guò)濾器不兼容。在這些情況下,它會(huì)回落到工人mpm的行為。
  • 通過(guò)http://modules.apache.org/可以使用許多第三方模塊,這些模塊可以限制某些客戶(hù)端行為,從而緩解DoS問(wèn)題。

ServerRoot目錄的權(quá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ù)器端包含

服務(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腳本

首先,必須始終記住,信任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。

非腳本別名CGI

只有在以下情況下才允許用戶(hù)在任何目錄中執(zhí)行CGI腳本:

  • 您信任用戶(hù)不要編寫(xiě)會(huì)故意或意外地將系統(tǒng)暴露給攻擊的腳本。
  • 您認(rèn)為所在站點(diǎn)的安全性在其他方面非常弱,以至于使一個(gè)潛在的漏洞變得無(wú)關(guān)緊要。
  • 您沒(méi)有用戶(hù),也沒(méi)有人訪(fǎng)問(wèn)您的服務(wù)器。

腳本別名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方法。

其他動(dòng)態(tài)內(nèi)容來(lái)源

作為服務(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è)。

動(dòng)態(tài)內(nèi)容安全性

在設(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)容安全性。

保護(hù)系統(tǒng)設(shè)置

要運(yùn)行非常緊湊的船舶,需要阻止用戶(hù)設(shè)置.htaccess文件,這些文件可以覆蓋已配置的安全功能。這是一種方法。

在服務(wù)器配置文件中,加入以下內(nèi)容 -

<Directory "/">
    AllowOverride None
</Directory>
Shell

這可以防止在除特別啟用的目錄之外的所有目錄中使用.htaccess文件。

注意,此設(shè)置是Apache 2.3.9以上版本的默認(rèn)設(shè)置。

默認(rèn)保護(hù)服務(wù)器文件

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í)配置被替換而不是合并。





以上內(nèi)容是否對(duì)您有幫助:
在線(xiàn)筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)