如何在 Apache 中抵禦暴力破解和 DDos 攻擊

Gabriel Cánepa發表於2015-06-16

對於那些需要在因特網上提供服務或託管主機的人來說,保證您的系統在面對攻擊時的安全是一個重要的事情。

mod_security(一個開源的用於Web應用入侵檢測及防護的引擎,可以無縫地整合到Web伺服器)和mod_evasive是兩個在伺服器端對抗暴力破解和(D)DoS攻擊的非常重要的工具。

mod_evasive,如它的名字一樣,在受攻擊時提供避實就虛的功能,它像一個雨傘一樣保護Web伺服器免受那些威脅。

安裝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

本文由 LCTT 原創翻譯,Linux中國 榮譽推出

相關文章