如何安裝配置Apache中的mod_security和mod_evasive
譯文網(wǎng)站服務(wù)器安全是個(gè)大話題;說到什么是加固某一臺網(wǎng)站服務(wù)器的最佳工具和技術(shù),不同的人自有不同的偏好和觀點(diǎn)。就Apache網(wǎng)站服務(wù)器而言,即便不是所有專家,至少也是絕大多數(shù)專家一致認(rèn)為,mod_security和mod_evasive是兩個(gè)非常重要的模塊,可以保護(hù)Apache網(wǎng)站服務(wù)器遠(yuǎn)離常見的威脅。
我們在本文中將探討如何安裝及配置mod_security和mod_evasive,假設(shè)Apache HTTP網(wǎng)站服務(wù)器已經(jīng)搭建并運(yùn)行起來。我們將執(zhí)行演示性質(zhì)的壓力測試,看看該網(wǎng)站服務(wù)器在遇到拒絕服務(wù)(DOS)攻擊時(shí)會有怎樣的反應(yīng),并且演示它如何借助這些模塊來反擊。我們在本教程中將使用CentOS平臺。
安裝mod_security和mod_evasive
要是你還沒有啟用CentOS/RHEL服務(wù)器中的EPEL軟件庫,就需要先啟用該軟件庫,之后再安裝這些軟件包。
# yum install mod_security # yum install mod_evasive
安裝完成后,你會在/etc/httpd/conf.d里面找到主配置文件:
現(xiàn)在,你需要確保Apache啟動時(shí)裝入這兩個(gè)模塊。在mod_security.conf和mod_evasive.conf中分別尋找下列行(如果沒有這些行,就添加上去):
LoadModule security2_module modules/mod_security2.so LoadModule evasive20_module modules/mod_evasive20.so
在上述兩行:
•LoadModule指令告訴Apache鏈接對象文件(*.so),將它添加到活動模塊列表。
•security2_module和evasive20_module是模塊的名稱。
•modules/mod_security2.so和modules/mod_evasive20.so是從/etc/httpd目錄到模塊源文件的相對路徑。只要檢查/etc/httpd/modules目錄的內(nèi)容,就能核實(shí)路徑(必要的話,還可以更改路徑)。
現(xiàn)在重啟Apache網(wǎng)站服務(wù)器:
# service httpd restart
#p#
配置mod_security
為了使用mod_security,必須先安裝核心規(guī)則集(CRS)?;旧隙?,CRS為網(wǎng)站服務(wù)器提供了一套規(guī)則,這套規(guī)則明確了在某些情形下服務(wù)器有怎樣的行為。Trustwave的SpiderLabs(開發(fā)mod_security的公司)提供了開放式Web應(yīng)用安全項(xiàng)目(OWASP)ModSecurity CRS,詳見https://www.owasp.org/index.php/Category:OWASP_ModSecurity_Core_Rule_Set_Project。
如果想下載并安裝最新的OWASP CRS,可以使用下面這些命令。
# mkdir /etc/httpd/crs # cd /etc/httpd/crs # wget https://github.com/SpiderLabs/owasp-modsecurity-crs/tarball/master # tar xzf master # mv SpiderLabs-owasp-modsecurity-crs-ebe8790 owasp-modsecurity-crs
現(xiàn)在,瀏覽到已安裝的OWASP CRS目錄。
# cd /etc/httpd/crs/owasp-modsecurity-crs
在OWASP CRS目錄里面,你會找到附有規(guī)則的示例文件(modsecurity_crs_10_setup.conf.example)。
我們將該文件的內(nèi)容拷貝到一個(gè)新文件中,為了方便起見,新文件名為modsecurity_crs_10_setup.conf。
# cp modsecurity_crs_10_setup.conf.example modsecurity_crs_10_setup.conf
為了告訴Apache就mod_security模塊使用這個(gè)文件,將下面幾行插入到/etc/httpd/conf/httpd.conf文件中。具體路徑可能不一樣,取決于你將CRS打包文件解壓縮在何處。
<IfModule security2_module>
Include crs/owasp-modsecurity-crs/modsecurity_crs_10_setup.conf
Include crs/owasp-modsecurity-crs/base_rules/*.conf
</IfModule>
最后但并非最不重要的是,我們將在modsecurity.d目錄里面創(chuàng)建自己的配置文件,我們會將所選擇的指令加入到該配件文件中。在本例中,我們將這個(gè)配置文件命名為xmodulo.conf。強(qiáng)烈建議你別直接編輯CRS文件,而是把所有必要的指令都放在這個(gè)配置文件中。這樣一來,更新的CRS發(fā)布后,就比較容易升級。
# vi /etc/httpd/modsecurity.d/xmodulo.conf
<IfModule mod_security2.c>
SecRuleEngine On
SecRequestBodyAccess On
SecResponseBodyAccess On
SecResponseBodyMimeType text/plain text/html text/xml application/octet-stream
SecDataDir /tmp
</IfModule>
•SecRuleEngine On:使用OWASP CRS檢測并阻止惡意攻擊。
•SecRequestBodyAccess On:啟用對傳送數(shù)據(jù)的請求主體(比如POST參數(shù))進(jìn)行檢查的功能。
•SecResponseBodyAccess On:緩沖響應(yīng)主體(前提是響應(yīng)MIMI類型符合用SecResponseBodyMimeType配置的列表)。
•SecResponseBodyMimeType text/plain text/html text/xml application/octet-stream:配置認(rèn)為哪些MIME類型用于響應(yīng)主體緩沖。如果你對MIME類型不熟悉,或者對它們的名稱或用法沒有把握,可以檢查互聯(lián)網(wǎng)編號分配機(jī)構(gòu)(IANA)網(wǎng)站。
•SecDataDir /tmp:存儲持久性數(shù)據(jù)(比如IP地址數(shù)據(jù)和會話數(shù)據(jù)等數(shù)據(jù))的路徑。這里的持久性意味著不存儲在內(nèi)存中,而是存儲在硬盤上的任何數(shù)據(jù)。
你可以訪問SpiderLabs的ModSecurity GitHub軟件庫:https://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual#Configuration_Directives,參閱配置指令的完整指南。
別忘了重啟Apache,讓變更生效。#p#
配置mod_evasive
mod_evasive模塊讀取來自/etc/httpd/conf.d/mod_evasive.conf的配置。與mod_security不一樣,我們不需要獨(dú)立的配置文件,因?yàn)樵谙到y(tǒng)或軟件包升級過程中沒有規(guī)則需要更新。
默認(rèn)的mod_evasive.conf文件已啟用了下列指令:
<IfModule mod_evasive20.c>
DOSHashTableSize 3097
DOSPageCount 2
DOSSiteCount 50
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 10
</IfModule>
•DOSHashTableSize:用來跟蹤每個(gè)IP地址活動的哈希表的大小。加大這個(gè)數(shù)值可以加快查詢客戶機(jī)過去所訪問的網(wǎng)站的速度,但要是該值設(shè)得過高,可能會影響整體性能。
•DOSPageCount:訪客在DOSPageInterval間隔時(shí)間內(nèi)可以向某個(gè)URI(比如Apache加載的文件)發(fā)出的相同請求的數(shù)量。
•DOSSiteCount:類似DOSPageCount,不過是指在DOSSiteInterval間隔時(shí)間內(nèi)可以向網(wǎng)站發(fā)出總共多少個(gè)請求。
•DOSBlockingPeriod:如果訪客超過了DOSSPageCount或DOSSiteCount設(shè)定的限制,他或她在DOSBlockingPeriod時(shí)間段時(shí)被列入黑名單。在這個(gè)間隔時(shí)間內(nèi),來自他/她的任何請求將返回403 Forbidden出錯信息。
你可能需要根據(jù)自己的網(wǎng)站服務(wù)器需要處理的流量大小和類型來更改這些值。請注意:如果這些值沒有合理設(shè)置,最后可能會阻止正當(dāng)?shù)脑L客。
下面是用于mod_evasive的其他實(shí)用指令:
1. DOSEmailNotify:只要IP地址被列入黑名單,就發(fā)送電子郵件到指定的地址。它需要一個(gè)有效的電子郵件地址作為變量。如果SELinux狀態(tài)被設(shè)成enforcing(執(zhí)行),你就需要為用戶apache可授予發(fā)送電子郵件的SELinux權(quán)限。也就是說,以root用戶的身份來運(yùn)行該命令。
# setsebool -P httpd_can_sendmail 1
然后,將該指令添加到mod_evasive.conf文件中:
DOSEmailNotify you@yourdomain.com
2. DOSSystemCommand:只要IP地址被列入黑名單,就執(zhí)行自定義系統(tǒng)命令。它可能適用于添加防火墻規(guī)則,完全阻止不正當(dāng)?shù)腎P地址:
DOSSystemCommand <command>
我們將使用該指令,通過下列腳本(/etc/httpd/scripts/ban_ip.sh)來添加防火墻規(guī)則:
#!/bin/sh
# 不正當(dāng)?shù)腎P被mod_evasive檢測出來
IP=$1
# 用戶apache通過sudo執(zhí)行的iptables二進(jìn)制文件的路徑
IPTABLES="/sbin/iptables"
# mod_evasive鎖定目錄
MOD_EVASIVE_LOGDIR=/tmp
# 添加下列防火墻規(guī)則(阻止IP)
$IPTABLES -I INPUT -s $IP -j DROP
# 2小時(shí)后,通過‘at’命令解除阻止不正當(dāng)?shù)腎P;參閱“man at”,即可了解進(jìn)一步的細(xì)節(jié)
echo "$IPTABLES -D INPUT -s $IP -j DROP" | at now + 2 hours
# 刪除鎖定文件,以便將來核查
rm -f "$MOD_EVASIVE_LOGDIR"/dos-"$IP"
我們的DOSSystemCommand指令然后顯示如下:
DOSSystemCommand "sudo /etc/httpd/scripts/ban_ip.sh %s"
別忘了更新sudo權(quán)限,以便以apache用戶的身份運(yùn)行腳本:
# vi /etc/sudoers apache ALL=NOPASSWD: /usr/local/bin/scripts/ban_ip.sh Defaults:apache !requiretty
#p#
模擬DoS攻擊
我們將使用三款工具對我們的Apache網(wǎng)站服務(wù)器進(jìn)行壓力測試,該服務(wù)器運(yùn)行在CentOS 6.5平臺上,配備512 MB內(nèi)存和AMD速龍II X2 250處理器,分別在啟用和禁用mod_security和mod_evasive的情況下進(jìn)行測試,檢查該網(wǎng)站服務(wù)器在每一種情況下表現(xiàn)如何。
確保你只在自己的測試服務(wù)器中執(zhí)行下列步驟,別針對外部的生產(chǎn)網(wǎng)站執(zhí)行下列步驟。
在下面幾個(gè)例子中,將http://centos.gabrielcanepa.com.ar/index.php換成你自己的域和所選擇的文件。
基于Linux的工具
1. Apache bench:Apache服務(wù)器基準(zhǔn)測試工具。
# ab -n1000 -c1000 http://centos.gabrielcanepa.com.ar/index.php
•-n:為基準(zhǔn)測試會話而執(zhí)行的請求數(shù)量。
•-c:每次執(zhí)行的多個(gè)請求數(shù)量。
2. test.pl:mod_evasive模塊隨帶的Perl腳本。
#!/usr/bin/perl
# test.pl:測試mod_dosevasive功效的小腳本
use IO::Socket;
use strict;
for(0..100) {
my($response);
my($SOCKET) = new IO::Socket::INET( Proto => "tcp",
PeerAddr=> "192.168.0.16:80");
if (! defined $SOCKET) { die $!; }
print $SOCKET "GET /?$_ HTTP/1.0\n\n";
$response = <$SOCKET>;
print $response;
close($SOCKET);
}
基于Windows的工具
1. Low Orbit Ion Cannon(LOIC):這是一款網(wǎng)絡(luò)壓力測試工具。為了生成工作負(fù)載,請按照下面屏幕截圖中顯示的順序,其他的別去改動。
壓力測試結(jié)果
mod_security和mod_evasive啟用后(三款工具同時(shí)運(yùn)行),處理器和內(nèi)存使用率達(dá)到最高峰,分別是60%和50%,這種情形只持續(xù)了2秒,之后源IP被列入黑名單,被防火墻阻止,攻擊隨告停止。
另一方面,如果禁用mod_security和mod_evasive,上述三款工具很快就擊倒了服務(wù)器(而且在攻擊持續(xù)時(shí)段一直保持這個(gè)狀態(tài));當(dāng)然,不正當(dāng)?shù)腎P地址并沒有被列入黑名單。
結(jié)束語
我們可以看出,如果配置得當(dāng),mod_security和mod_evasive是加固Apache網(wǎng)站服務(wù)器,防范幾種威脅的兩個(gè)重要工具,應(yīng)當(dāng)考慮部署在暴露在互聯(lián)網(wǎng)上的環(huán)境中。
原文地址:http://xmodulo.com/2014/09/harden-apache-web-server-mod_security-mod_evasive-centos.html