如何安裝配置Apache中的mod_security和mod_evasive
譯文網站服務器安全是個大話題;說到什么是加固某一臺網站服務器的最佳工具和技術,不同的人自有不同的偏好和觀點。就Apache網站服務器而言,即便不是所有專家,至少也是絕大多數專家一致認為,mod_security和mod_evasive是兩個非常重要的模塊,可以保護Apache網站服務器遠離常見的威脅。
我們在本文中將探討如何安裝及配置mod_security和mod_evasive,假設Apache HTTP網站服務器已經搭建并運行起來。我們將執行演示性質的壓力測試,看看該網站服務器在遇到拒絕服務(DOS)攻擊時會有怎樣的反應,并且演示它如何借助這些模塊來反擊。我們在本教程中將使用CentOS平臺。
安裝mod_security和mod_evasive
要是你還沒有啟用CentOS/RHEL服務器中的EPEL軟件庫,就需要先啟用該軟件庫,之后再安裝這些軟件包。
# yum install mod_security # yum install mod_evasive
安裝完成后,你會在/etc/httpd/conf.d里面找到主配置文件:
現在,你需要確保Apache啟動時裝入這兩個模塊。在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目錄的內容,就能核實路徑(必要的話,還可以更改路徑)。
現在重啟Apache網站服務器:
# service httpd restart
#p#
配置mod_security
為了使用mod_security,必須先安裝核心規則集(CRS)。基本上而言,CRS為網站服務器提供了一套規則,這套規則明確了在某些情形下服務器有怎樣的行為。Trustwave的SpiderLabs(開發mod_security的公司)提供了開放式Web應用安全項目(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
現在,瀏覽到已安裝的OWASP CRS目錄。
# cd /etc/httpd/crs/owasp-modsecurity-crs
在OWASP CRS目錄里面,你會找到附有規則的示例文件(modsecurity_crs_10_setup.conf.example)。
我們將該文件的內容拷貝到一個新文件中,為了方便起見,新文件名為modsecurity_crs_10_setup.conf。
# cp modsecurity_crs_10_setup.conf.example modsecurity_crs_10_setup.conf
為了告訴Apache就mod_security模塊使用這個文件,將下面幾行插入到/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目錄里面創建自己的配置文件,我們會將所選擇的指令加入到該配件文件中。在本例中,我們將這個配置文件命名為xmodulo.conf。強烈建議你別直接編輯CRS文件,而是把所有必要的指令都放在這個配置文件中。這樣一來,更新的CRS發布后,就比較容易升級。
# 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:啟用對傳送數據的請求主體(比如POST參數)進行檢查的功能。
•SecResponseBodyAccess On:緩沖響應主體(前提是響應MIMI類型符合用SecResponseBodyMimeType配置的列表)。
•SecResponseBodyMimeType text/plain text/html text/xml application/octet-stream:配置認為哪些MIME類型用于響應主體緩沖。如果你對MIME類型不熟悉,或者對它們的名稱或用法沒有把握,可以檢查互聯網編號分配機構(IANA)網站。
•SecDataDir /tmp:存儲持久性數據(比如IP地址數據和會話數據等數據)的路徑。這里的持久性意味著不存儲在內存中,而是存儲在硬盤上的任何數據。
你可以訪問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不一樣,我們不需要獨立的配置文件,因為在系統或軟件包升級過程中沒有規則需要更新。
默認的mod_evasive.conf文件已啟用了下列指令:
<IfModule mod_evasive20.c>
DOSHashTableSize 3097
DOSPageCount 2
DOSSiteCount 50
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 10
</IfModule>
•DOSHashTableSize:用來跟蹤每個IP地址活動的哈希表的大小。加大這個數值可以加快查詢客戶機過去所訪問的網站的速度,但要是該值設得過高,可能會影響整體性能。
•DOSPageCount:訪客在DOSPageInterval間隔時間內可以向某個URI(比如Apache加載的文件)發出的相同請求的數量。
•DOSSiteCount:類似DOSPageCount,不過是指在DOSSiteInterval間隔時間內可以向網站發出總共多少個請求。
•DOSBlockingPeriod:如果訪客超過了DOSSPageCount或DOSSiteCount設定的限制,他或她在DOSBlockingPeriod時間段時被列入黑名單。在這個間隔時間內,來自他/她的任何請求將返回403 Forbidden出錯信息。
你可能需要根據自己的網站服務器需要處理的流量大小和類型來更改這些值。請注意:如果這些值沒有合理設置,最后可能會阻止正當的訪客。
下面是用于mod_evasive的其他實用指令:
1. DOSEmailNotify:只要IP地址被列入黑名單,就發送電子郵件到指定的地址。它需要一個有效的電子郵件地址作為變量。如果SELinux狀態被設成enforcing(執行),你就需要為用戶apache可授予發送電子郵件的SELinux權限。也就是說,以root用戶的身份來運行該命令。
# setsebool -P httpd_can_sendmail 1
然后,將該指令添加到mod_evasive.conf文件中:
DOSEmailNotify you@yourdomain.com
2. DOSSystemCommand:只要IP地址被列入黑名單,就執行自定義系統命令。它可能適用于添加防火墻規則,完全阻止不正當的IP地址:
DOSSystemCommand <command>
我們將使用該指令,通過下列腳本(/etc/httpd/scripts/ban_ip.sh)來添加防火墻規則:
#!/bin/sh
# 不正當的IP被mod_evasive檢測出來
IP=$1
# 用戶apache通過sudo執行的iptables二進制文件的路徑
IPTABLES="/sbin/iptables"
# mod_evasive鎖定目錄
MOD_EVASIVE_LOGDIR=/tmp
# 添加下列防火墻規則(阻止IP)
$IPTABLES -I INPUT -s $IP -j DROP
# 2小時后,通過‘at’命令解除阻止不正當的IP;參閱“man at”,即可了解進一步的細節
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權限,以便以apache用戶的身份運行腳本:
# vi /etc/sudoers apache ALL=NOPASSWD: /usr/local/bin/scripts/ban_ip.sh Defaults:apache !requiretty
#p#
模擬DoS攻擊
我們將使用三款工具對我們的Apache網站服務器進行壓力測試,該服務器運行在CentOS 6.5平臺上,配備512 MB內存和AMD速龍II X2 250處理器,分別在啟用和禁用mod_security和mod_evasive的情況下進行測試,檢查該網站服務器在每一種情況下表現如何。
確保你只在自己的測試服務器中執行下列步驟,別針對外部的生產網站執行下列步驟。
在下面幾個例子中,將http://centos.gabrielcanepa.com.ar/index.php換成你自己的域和所選擇的文件。
基于Linux的工具
1. Apache bench:Apache服務器基準測試工具。
# ab -n1000 -c1000 http://centos.gabrielcanepa.com.ar/index.php
•-n:為基準測試會話而執行的請求數量。
•-c:每次執行的多個請求數量。
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):這是一款網絡壓力測試工具。為了生成工作負載,請按照下面屏幕截圖中顯示的順序,其他的別去改動。
壓力測試結果
mod_security和mod_evasive啟用后(三款工具同時運行),處理器和內存使用率達到最高峰,分別是60%和50%,這種情形只持續了2秒,之后源IP被列入黑名單,被防火墻阻止,攻擊隨告停止。
另一方面,如果禁用mod_security和mod_evasive,上述三款工具很快就擊倒了服務器(而且在攻擊持續時段一直保持這個狀態);當然,不正當的IP地址并沒有被列入黑名單。
結束語
我們可以看出,如果配置得當,mod_security和mod_evasive是加固Apache網站服務器,防范幾種威脅的兩個重要工具,應當考慮部署在暴露在互聯網上的環境中。
原文地址:http://xmodulo.com/2014/09/harden-apache-web-server-mod_security-mod_evasive-centos.html