使用Mod_Security和Mod_evasive模塊保護(hù)Apache
譯文對(duì)于從事主機(jī)托管行業(yè)的人士來說,或者如果你托管自己的服務(wù)器,并將服務(wù)器暴露在互聯(lián)網(wǎng)面前,那么保護(hù)系統(tǒng)遠(yuǎn)離攻擊者肯定是重中之重。
mod_security和mod_evasive是兩種非常重要的工具,它們可以用來保護(hù)Web服務(wù)器遠(yuǎn)離蠻力攻擊或分布式拒絕服務(wù)(DDoS)攻擊。mod_security是一種面向Web應(yīng)用程序的開源入侵檢測(cè)和預(yù)防引擎,它與Web服務(wù)器無縫地整合起來。
顧名思義,mod_evasive提供了規(guī)避功能;另外在遭到攻擊時(shí),還能充當(dāng)保護(hù)傘,保護(hù)Web服務(wù)器遠(yuǎn)離這種威脅。
安裝Mod_Security和Mod_Evasive來保護(hù)Apache
我們?cè)诒疚闹袑⒂懻撊绾卧赗HEL/CentOS 6和7以及Fedora 21-15上安裝、配置這兩個(gè)模塊,并讓它們與Apache協(xié)同運(yùn)行。此外,我們會(huì)模擬攻擊,以便證實(shí)服務(wù)器作出相應(yīng)的反應(yīng)。
本文假設(shè)你已在系統(tǒng)上安裝了LAMP服務(wù)器。要是還沒有安裝,請(qǐng)?jiān)陂_始下一步之前參閱這篇文章《在RHEL/CentOS 7中安裝LAMP架構(gòu)》:http://www.tecmint.com/install-lamp-in-centos-7/。
如果你在運(yùn)行RHEL/CentOS 7或Fedora 21,還需要將iptables設(shè)置為默認(rèn)防火墻前端,而不是將firewalld設(shè)置為默認(rèn)防火墻前端。我們這么做是為了在RHEL/CentOS 7/6和dora 21中都使用同一個(gè)工具。
第一步:將Iptables防火墻安裝到RHEL/CentOS 7和Fedora 21上
想開始入手,先停止并禁用firewalld:
# systemctl stop firewalld
# systemctl disable firewalld
禁用Firewalld服務(wù)
然后,在啟用iptables之前,安裝iptables-services程序包:
# yum update && yum install iptables-services
# systemctl enable iptables
# systemctl start iptables
# systemctl status iptables
安裝Iptables防火墻#p#
第二步:安裝Mod_Security和Mod_evasive
除了已經(jīng)部署到位的LAMP架構(gòu)外,你還要啟用RHEL/CentOS 7/6中的EPEL軟件庫(kù),那樣才能安裝這兩個(gè)程序包。Fedora用戶不需要啟用任何軟件庫(kù),因?yàn)閑pel早已是Fedora項(xiàng)目的一部分。
# yum update && yum install mod_security mod_evasive
安裝完畢后,你可以在/etc/httpd/conf.d中找到這兩個(gè)工具的配置文件。
# ls -l /etc/httpd/conf.d
mod_security和mod_evasive的配置
現(xiàn)在,為了將這兩個(gè)模塊與Apache整合起來,并且在Apache啟動(dòng)時(shí)讓它裝入這兩個(gè)模塊,就要確保下面幾行分別出現(xiàn)在mod_evasive.conf和mod_security.conf的頂層部分:
LoadModule evasive20_module modules/mod_evasive24.so
LoadModule security2_module modules/mod_security2.so
請(qǐng)注意:modules/mod_security2.so和modules/mod_evasive24.so是相對(duì)路徑,從/etc/httpd目錄到模塊的源文件。你可以列出/etc/httpd/modules目錄的內(nèi)容對(duì)此加以證實(shí)(需要的話,還可以更改):
# cd /etc/httpd/modules
# pwd
# ls -l | grep -Ei '(evasive|security)'
證實(shí)mod_security和mod_evasive模塊
然后重啟Apache,證實(shí)它裝入了mod_evasive和mod_security:
# service httpd restart [On RHEL/CentOS 6 and Fedora 20-18]
# systemctl restart httpd [On RHEL/CentOS 7 and Fedora 21]
[Dump a list of loaded Static and Shared Modules]
# httpd -M | grep -Ei '(evasive|security)'
檢查已裝入的mod_security和mod_evasive模塊#p#
第三步:安裝核心規(guī)則集和配置Mod_Security
簡(jiǎn)單地說,核心規(guī)則集(又叫CRS)為Web服務(wù)器提供了在某些情況下如何運(yùn)行的指令。開發(fā)mod_security的公司提供了一套免費(fèi)的CRS,名為OWASP(開放式Web應(yīng)用安全項(xiàng)目)ModSecurity CRS,可以下載并安裝,具體如下所示。
1. 將OWASP CRS下載到一個(gè)專門為此而建立的目錄。
# mkdir /etc/httpd/crs-tecmint
# cd /etc/httpd/crs-tecmint
# wget https://github.com/SpiderLabs/owasp-modsecurity-crs/tarball/master
下載mod_security核心規(guī)則
2. 解壓CRS文件,將目錄名稱改成便于我們使用的一個(gè)名稱。
# tar xzf master
# mv SpiderLabs-owasp-modsecurity-crs-ebe8790 owasp-modsecurity-crs
抽取mod_security核心規(guī)則
3. 現(xiàn)在可以配置mod_security了。將擁有規(guī)則的樣本文件(owasp-modsecurity-crs/modsecurity_crs_10_setup.conf.example)拷貝到?jīng)]有.example擴(kuò)展名的另一個(gè)文件中。
# cp modsecurity_crs_10_setup.conf.example modsecurity_crs_10_setup.conf
并告訴Apache使用這個(gè)文件以及模塊,為此只要在Web服務(wù)器的主配置文件/etc/httpd/conf/httpd.conf文件中插入下面幾行。如果你選擇在另一個(gè)目錄中解壓tarball,就需要編輯Include指令后面的路徑:
Include crs-tecmint/owasp-modsecurity-crs/modsecurity_crs_10_setup.conf
Include crs-tecmint/owasp-modsecurity-crs/base_rules/*.conf
最后,我們建議:應(yīng)該在/etc/httpd/modsecurity.d目錄里面創(chuàng)建自己的配置文件,我們將把定制的指令放在該文件(我們?cè)谙旅娴睦訉⑽募麨閠ecmint.conf)里面,而不是直接改動(dòng)CRS文件。這么一來,新版本發(fā)布后,更容易升級(jí)CRS。
SecRuleEngine On
SecRequestBodyAccess On
SecResponseBodyAccess On
SecResponseBodyMimeType text/plain text/html text/xml application/octet-stream
SecDataDir /tmp
你可以參閱SpiderLabs的ModSecurity GitHub軟件庫(kù)(https://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual#Configuration_Directives),了解mod_security配置指令的完整的解釋性指南。#p#
第四步:配置Mod_Evasive
mod_evasive使用/etc/httpd/conf.d/mod_evasive.conf中的指令來配置。與mod_security不同,由于在程序包升級(jí)期間沒有規(guī)則要更新,我們不需要單獨(dú)的文件來添加定制的指令。
默認(rèn)的mod_evasive.conf文件啟用了下列指令(請(qǐng)注意該文件添加了大量注釋,于是我們?nèi)コ俗⑨專攸c(diǎn)突出下列配置指令):
DOSHashTableSize 3097
DOSPageCount 2
DOSSiteCount 50
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 10
指令解釋:
•DOSHashTableSize:該指令指定了用來根據(jù)每個(gè)IP地址跟蹤活動(dòng)的哈希表的大小。增加這個(gè)值可以更快速地查詢客戶機(jī)在過去訪問過的網(wǎng)站,但要是該值設(shè)得過高,可能會(huì)影響總體性能。
•DOSPageCount:訪客在DOSPageInterval間隔期間內(nèi)對(duì)某個(gè)特定URI(比如,Apache服務(wù)的任何文件)提出的合法的相同請(qǐng)求數(shù)量。
•DOSSiteCount:類似于DOSPageCount,不過是指在DOSSiteInterval間隔期間內(nèi)對(duì)整個(gè)網(wǎng)站能提出多少整體請(qǐng)求。
•DOSBlockingPeriod:如果訪客超過了DOSSPageCount或DOSSiteCount設(shè)置的限值,其源IP地址在DOSBlockingPeriod時(shí)間段內(nèi)將被列入黑名單。在DOSBlockingPeriod期間,來自該IP地址的任何請(qǐng)求將遇到403禁止錯(cuò)誤。
可以隨意嘗試這些值,以便你的Web服務(wù)器能夠處理所需要的流量數(shù)量和類型。
只是有一個(gè)小地方需要注意:要是這些值沒有設(shè)置好,有可能最后阻攔合法訪客。
你可能還應(yīng)該考慮其他有用的指令:
DOSEmailNotify
如果你已經(jīng)在運(yùn)行一臺(tái)郵件服務(wù)器,可以通過Apache發(fā)送警告信息。請(qǐng)注意:如果SELinux被設(shè)置成執(zhí)行,你需要為apache用戶授予SELinux許可權(quán)限,以便發(fā)送電子郵件。為此,你可以運(yùn)行下面這個(gè)命令:
# setsebool -P httpd_can_sendmail 1
下一步,將該指令連同其他指令一并添加到mod_evasive.conf文件中:
DOSEmailNotify you@yourdomain.com
如果該值已設(shè)置好,而且你的郵件服務(wù)器正常運(yùn)行,一旦某個(gè)IP地址被列入黑名單,電子郵件就會(huì)被發(fā)送到指定的地址。
DOSSystemCommand
這需要有效的系統(tǒng)命令作為變量,
DOSSystemCommand
該指令指定了IP地址被列入黑名單后所執(zhí)行的命令。它常常與添加防火墻規(guī)則以阻止今后從該IP地址來進(jìn)行連接的外殼腳本結(jié)合使用。
編寫在防火墻層面處理IP黑名單機(jī)制的外殼腳本
某個(gè)IP地址被列入黑名單后,我們就要阻止今后來自它的連接。我們要使用執(zhí)行這項(xiàng)任務(wù)的下列外殼腳本。在/usr/local/bin中創(chuàng)建一個(gè)名為scripts-tecmint的目錄(名稱可以隨意取),并在該目錄中創(chuàng)建一個(gè)名為ban_ip.sh的文件。
#!/bin/sh
# IP that will be blocked, as detected by mod_evasive
IP=$1
# Full path to iptables
IPTABLES="/sbin/iptables"
# mod_evasive lock directory
MOD_EVASIVE_LOGDIR=/var/log/mod_evasive
# Add the following firewall rule (block all traffic coming from $IP)
$IPTABLES -I INPUT -s $IP -j DROP
# Remove lock file for future checks
rm -f "$MOD_EVASIVE_LOGDIR"/dos-"$IP"
我們的DOSSystemCommand指令應(yīng)該如下所示:
DOSSystemCommand "sudo /usr/local/bin/scripts-tecmint/ban_ip.sh %s"
在上面這行中,%s代表被mod_evasive檢測(cè)出來的冒犯性的IP。
將apache用戶添加到sudoers文件
請(qǐng)注意:除非你為用戶apache授予無需終端和密碼即可運(yùn)行腳本(只有這個(gè)腳本!)的權(quán)限,否則這一切根本不管用。如往常一樣,你只要鍵入visudo作為根用戶,即可訪問/etc/sudoers文件,然后添加下面兩行,如下圖所示:
apache ALL=NOPASSWD: /usr/local/bin/scripts-tecmint/ban_ip.sh
Defaults:apache !requiretty
添加Apache用戶到Sudoers
重要提示:作為一項(xiàng)默認(rèn)的安全策略,你只能在終端中運(yùn)行sudo。由于在這里我們需要使用不帶tty的sudo,我們只好注釋掉下圖中高亮顯示的那一行:
#Defaults requiretty
為Sudo禁用tty
最后,重啟Web服務(wù)器:
# service httpd restart [On RHEL/CentOS 6 and Fedora 20-18]
# systemctl restart httpd [On RHEL/CentOS 7 and Fedora 21]
#p#
第五步:在Apache上模擬DDoS攻擊
你可以使用幾個(gè)工具在自己的服務(wù)器上模擬外部攻擊。只要在谷歌搜索引擎上輸入“tools for simulating ddos attacks”,即可找到其中的幾個(gè)工具。
請(qǐng)注意:你要對(duì)模擬的結(jié)果完全負(fù)責(zé)。想對(duì)不在自己的網(wǎng)絡(luò)上托管運(yùn)行的服務(wù)器發(fā)動(dòng)模擬攻擊,勸你莫?jiǎng)舆@個(gè)念頭。
如果你想對(duì)別人托管的虛擬專用服務(wù)器(VPS)進(jìn)行同樣的模擬攻擊,就需要以適當(dāng)?shù)姆绞教嵝阎鳈C(jī)托管提供商,或者獲得許可,以便這種洪水流量可以通過其網(wǎng)絡(luò)來傳輸。我們Tecmint.com絕對(duì)不對(duì)你的行為負(fù)責(zé)!
此外,只從一個(gè)主機(jī)發(fā)動(dòng)模擬的拒絕服務(wù)攻擊并不代表是現(xiàn)實(shí)的攻擊。想模擬這種攻擊,你就需要同時(shí)從幾個(gè)客戶機(jī)向你的服務(wù)器發(fā)動(dòng)攻擊。
我們的測(cè)試環(huán)境包括一臺(tái)CentOS 7服務(wù)器 [IP 192.168.0.17]和一個(gè)Windows主機(jī)[IP 192.168.0.103],我們將從該主機(jī)發(fā)動(dòng)攻擊:
證實(shí)主機(jī)的IP地址
請(qǐng)播放下列視頻,按照概述的步驟來操作,以模擬簡(jiǎn)單的拒絕服務(wù)攻擊:
然后,冒犯性的IP地址被iptables阻攔:
被阻攔的攻擊IP地址
結(jié)束語
mod_security和mod_evasive被啟用后,模擬的攻擊導(dǎo)致處理器和內(nèi)存暫時(shí)出現(xiàn)使用高峰,不過只持續(xù)了幾秒,隨后源IP地址被列入黑名單,并被防火墻阻攔。要是沒有這些工具,模擬攻擊勢(shì)必會(huì)很快擊 垮服務(wù)器,導(dǎo)致服務(wù)器在攻擊持續(xù)時(shí)段內(nèi)無法使用。
要是你打算使用(或者過去用過)這些工具,我們很高興。我們總是期盼你也使用這些工具,歡迎留言交流。
原文地址:http://www.tecmint.com/protect-apache-using-mod_security-and-mod_evasive-on-rhel-centos-fedora/