如何在 Apache 中抵禦暴力破解和 DDoS 攻擊
安裝mod_security和mod_evasive來保護Apache
在這篇文章中我們將討論如何安裝、配置以及在RHEL/CentOS6、7和Fedora 21-15上將它們整合到Apache。另外,我們會模擬攻擊以便驗證伺服器做出了正確的反應。
以上以您的系統中安裝有LAMP伺服器為基礎,所以,如果您沒有安裝,請先閱讀下面鏈接的文章再開始閱讀本文。
(LCTT 譯註:本文有修改。原文為了在RHEL/CentOS 7或Fedora 21中使用同樣的工具,而刪除了它們自帶的 firewalld,使用了舊式的iptables。譯者以為這樣並不恰當,因此,譯文中做了相應刪節,並增加了firewalld的相應腳本。)
步驟 1: 安裝mod_security和mod_evasive
另外,在安裝LAMP後,您還需要在RHEL/CentOS 7/6中開啟EPEL倉庫來安裝這兩個包。Fedora用戶不需要開啟這個倉庫,因為epel已經是Fedora項目的一部分了。
# yum update && yum install mod_security mod_evasive
當安裝結束後,您會在/etc/httpd/conf.d下找到這兩個工具的配置文件。
# ls -l /etc/httpd/conf.d
mod_security + mod_evasive 配置文件
現在,為了整合這兩個模塊到Apache,並在啟動時載入它們。請確保下面幾行出現在mod_evasive.conf和mod_security.conf的頂層部分,它們分別為:
LoadModule evasive20_module modules/mod_evasive24.so
LoadModule security2_module modules/mod_security2.so
請注意modules/mod_security2.so和modules/mod_evasive24.so都是從/etc/httpd到模塊源文件的相對路徑。您可以通過列出/etc/httpd/modules的內容來驗證(如果需要的話,修改它):
# cd /etc/httpd/modules
# pwd
# ls -l | grep -Ei '(evasive|security)'
驗證mod_security + mod_evasive模塊
接下來重啟Apache並且核實它已載入了mod_evasive和mod_security:
# service httpd restart [在RHEL/CentOS 6和Fedora 20-18上]
# systemctl restart httpd [在RHEL/CentOS 7和Fedora 21上]
# httpd -M | grep -Ei '(evasive|security)' [輸出已載入的靜態模塊和動態模塊列表]
檢查mod_security + mod_evasive模塊已載入
步驟 2: 安裝一個核心規則集並且配置mod_security
簡單來說,一個核心規則集(即CRS)為web伺服器提供特定狀況下如何反應的指令。mod_security的開發者們提供了一個免費的CRS,叫做OWASP([開放Web應用安全項目])ModSecurity CRS,可以從下面的地址下載和安裝。
下載OWASP CRS到為之創建的目錄
# mkdir /etc/httpd/crs-tecmint
# cd /etc/httpd/crs-tecmint
# wget https://github.com/SpiderLabs/owasp-modsecurity-crs/tarball/master
下載mod_security核心規則
解壓CRS文件並修改文件夾名稱
# tar xzf master
# mv SpiderLabs-owasp-modsecurity-crs-ebe8790 owasp-modsecurity-crs
解壓mod_security核心規則
現在,是時候配置mod_security了
將示例的規則文件(owasp-modsecurity-crs/modsecuritycrs10_setup.conf.example)拷貝為同名的配置文件。
# cp modsecurity_crs_10_setup.conf.example modsecurity_crs_10_setup.conf
並通過將下面的幾行插入到web伺服器的主配置文件/etc/httpd/conf/httpd.conf來告訴Apache將這個文件和該模塊放在一起使用。如果您選擇解壓打包文件到另一個文件夾,那麼您需要修改Include的路徑:
<IfModule security2_module>
Include crs-tecmint/owasp-modsecurity-crs/modsecurity_crs_10_setup.conf
Include crs-tecmint/owasp-modsecurity-crs/base_rules/*.conf
</IfModule>
最後,建議您在/etc/httpd/modsecurity.d目錄下創建自己的配置文件,在那裡我們可以用我們自定義的文件夾(接下來的示例中,我們會將其命名為tecmint.conf)而無需修改CRS文件的目錄。這樣做能夠在CRS發布新版本時更加容易的升級。
<IfModule mod_security2.c>
SecRuleEngine On
SecRequestBodyAccess On
SecResponseBodyAccess On
SecResponseBodyMimeType text/plain text/html text/xml application/octet-stream
SecDataDir /tmp
</IfModule>
您可以在SpiderLabs的ModSecurity GitHub倉庫中參考關於mod_security目錄的更完整的解釋。
步驟 3: 配置mod_evasive
mod_evasive被配置為使用/etc/httpd/conf.d/mod_evasive.conf中的指令。與mod_security不同,由於在包升級時沒有規則來更新,因此我們不需要獨立的文件來添加自定義指令。
默認的mod_evasive.conf開啟了下列的目錄(注意這個文件被詳細的注釋了,因此我們剔掉了注釋以重點顯示配置指令):
<IfModule mod_evasive24.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,他的源IP地址將會在DOSBlockingPeriod期間內被加入黑名單。在DOSBlockingPeriod期間,任何從這個IP地址發起的請求將會遭遇一個403禁止錯誤。
儘可能的試驗這些值,以使您的web伺服器有能力處理特定大小的負載。
一個小警告: 如果這些值設置的不合適,則您會蒙受阻擋合法用戶的風險。
您也許還會用到以下其它有用的指令:
DOSEmailNotify
如果您運行有一個郵件伺服器,您可以通過Apache發送警告消息。注意,如果SELinux已開啟,您需要授權apache用戶SELinux的許可權來發送email。您可以通過下面的命令來授予許可權:
# setsebool -P httpd_can_sendmail 1
接下來,將這個指令和其他指令一起加入到mod_evasive.conf文件。
DOSEmailNotify you@yourdomain.com
如果這個指令設置了合適的值,並且您的郵件伺服器在正常的運行,則當一個IP地址被加入黑名單時,會有一封郵件被發送到相應的地址。
DOSSystemCommand
它需要一個有效的系統命令作為參數,
DOSSystemCommand </command>
這個指令指定當一個IP地址被加入黑名單時執行的命令。它通常結合shell腳本來使用,比如在腳本中添加一條防火牆規則來阻擋某個IP進一步的連接。
寫一個shell腳本在防火牆階段處理IP黑名單
當一個IP地址被加入黑名單,我們需要阻擋它進一步的連接。我們需要下面的shell腳本來執行這個任務。在/usr/local/bin下創建一個叫做scripts-tecmint的文件夾(或其他的名字),以及一個叫做ban_ip.sh的文件。
用於iptables防火牆
#!/bin/sh
# 由mod_evasive檢測出,將被阻擋的IP地址
IP=$1
# iptables的完整路徑
IPTABLES="/sbin/iptables"
# mod_evasive鎖文件夾
mod_evasive_LOGDIR=/var/log/mod_evasive
# 添加下面的防火牆規則 (阻止所有從$IP流入的流量)
$IPTABLES -I INPUT -s $IP -j DROP
# 為了未來的檢測,移除鎖文件
rm -f "$mod_evasive_LOGDIR"/dos-"$IP"
用於firewalld防火牆
#!/bin/sh
# 由mod_evasive檢測出,將被阻擋的IP地址
IP=$1
# firewalld-cmd的完整路徑
FIREWALL_CMD="/usr/bin/firewall-cmd"
# mod_evasive鎖文件夾
mod_evasive_LOGDIR=/var/log/mod_evasive
# 添加下面的防火牆規則 (阻止所有從$IP流入的流量)
$FIREWALL_CMD --zone=drop --add-source $IP
# 為了未來的檢測,移除鎖文件
rm -f "$mod_evasive_LOGDIR"/dos-"$IP"
我們的DOSSystemCommand指令應該是這樣的:
DOSSystemCommand "sudo /usr/local/bin/scripts-tecmint/ban_ip.sh %s"
上面一行的%s代表了由mod_evasive檢測到的攻擊IP地址。
將apache用戶添加到sudoers文件
請注意,如果您不給予apache用戶以無需終端和密碼的方式運行我們腳本(關鍵就是這個腳本)的許可權,則這一切都不起作用。通常,您只需要以root許可權鍵入visudo來存取/etc/sudoers文件,接下來添加下面的兩行即可:
apache ALL=NOPASSWD: /usr/local/bin/scripts-tecmint/ban_ip.sh
Defaults:apache !requiretty
添加Apache用戶到Sudoers
重要: 在默認的安全策略下您只能在終端中運行sudo。由於這個時候我們需要在沒有tty的時候運行sudo,我們必須像下圖中那樣注釋掉下面這一行:
#Defaults requiretty
為Sudo禁用tty
最後,重啟web伺服器:
# service httpd restart [在RHEL/CentOS 6和Fedora 20-18上]
# systemctl restart httpd [在RHEL/CentOS 7和Fedora 21上]
步驟4: 在Apache上模擬DDoS攻擊
有許多工具可以在您的伺服器上模擬外部的攻擊。您可以google下「tools for simulating DDoS attacks」來找一找相關的工具。
注意,您(也只有您)將負責您模擬所造成的結果。請不要考慮向不在您自己網路中的伺服器發起模擬攻擊。
假如您想對一個由別人託管的VPS做這些事情,您需要向您的託管商發送適當的警告或就那樣的流量通過他們的網路獲得允許。Tecmint.com不會為您的行為負責!
另外,僅從一個主機發起一個DoS攻擊的模擬無法代表真實的攻擊。為了模擬真實的攻擊,您需要使用許多客戶端在同一時間將您的伺服器作為目標。
我們的測試環境由一個CentOS 7伺服器[IP 192.168.0.17]和一個Windows組成,在Windows[IP 192.168.0.103]上我們發起攻擊:
確認主機IP地址
請播放下面的視頻(YT 視頻,請自備梯子: https://www.youtube.com/-U_mdet06Jk ),並跟從列出的步驟來模擬一個DoS攻擊:
然後攻擊者的IP將被防火牆阻擋:
阻擋攻擊者的IP地址
結論
在開啟mod_security和mod_evasive的情況下,模擬攻擊會導致CPU和RAM用量在源IP地址被加入黑名單之前出現短暫幾秒的使用峰值。如果沒有這些模塊,模擬攻擊絕對會很快將伺服器擊潰,並使伺服器在攻擊期間無法提供服務。
我們很高興聽見您打算使用(或已經使用過)這些工具。我們期望得到您的反饋,所以,請在留言處留下您的評價和問題,謝謝!
參考鏈接
via: http://www.tecmint.com/protect-apache-using-mod_security-and-mod_evasive-on-rhel-centos-fedora/
作者:Gabriel Cánepa 譯者:wwy-hust 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive