如何在 Apache 中抵禦暴力破解和 DDos 攻擊
對於那些需要在因特網上提供服務或託管主機的人來說,保證您的系統在面對攻擊時的安全是一個重要的事情。
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
相關文章
- 在Linux中,什麼是DDoS攻擊?如何在Linux中防禦DDoS攻擊?Linux
- 【知識分享】 伺服器抵禦ddos攻擊的方法伺服器
- 淺談DDOS攻擊攻擊與防禦
- 淺談DDos攻擊與防禦
- 【網路安全】如何有效地防禦DDOS攻擊和CC攻擊?
- 透過nginx配置檔案抵禦攻擊Nginx
- 通過Nginx配置檔案抵禦攻擊Nginx
- 利用網路分段和訪問控制來抵禦攻擊
- DDOS攻擊原理,種類及其防禦
- DDoS攻擊激增,分享高效可靠的DDoS防禦方案
- 小鳥雲伺服器 新增香港高防雲伺服器,抵禦DDoS攻擊伺服器
- DDOS伺服器防禦的方法有哪些,如何防禦DDOS攻擊伺服器
- 密碼學系列之:碰撞抵禦和碰撞攻擊collision attack密碼學
- JeecgBoot抵禦XSS攻擊實現方案boot
- 【知識分享】伺服器遭受攻擊的方式,如何抵禦攻擊?伺服器
- 伺服器為什麼經常被攻擊?DDoS攻擊和防禦介紹伺服器
- 【網路安全入門知識】如何有效防禦DDoS攻擊和CC攻擊?
- 運維和IT技術需知的DDOS攻擊防禦整理運維
- 淺談 JavaScript DDoS 攻擊原理與防禦JavaScript
- 淺談JavaScript DDoS攻擊原理與防禦JavaScript
- 淺談JS DDoS攻擊原理與防禦JS
- 網路攻擊盯上民生領域,應對DDoS和APT攻擊,如何有效防禦?APT
- DDoS攻擊是什麼?網站DDoS防禦策略有哪些?網站
- 聚焦DDoS安全,分享防禦DDoS攻擊的幾大有效方法
- 網際網路公司如何防禦DDoS攻擊?
- Linux下防禦DDOS攻擊的操作梳理Linux
- 魏興國:深入淺出DDoS攻擊防禦
- DDoS 攻擊與防禦:從原理到實踐
- 跨域攻擊分析和防禦(中)跨域
- 恆訊科技的DDoS攻擊防禦解決方案
- 如何防禦DDoS攻擊?學習網路安全多久?
- 用Linux系統防火牆功能抵禦網路攻擊Linux防火牆
- 抵禦惡意http攻擊,使用redis製作一個簡單的防禦HTTPRedis
- 淺談DDOS中NTP放大攻擊的操作過程以及防禦措施?
- 抵禦中間人攻擊:Win10斯巴達瀏覽器將支援HSTSWin10瀏覽器
- 一文讀懂DDoS,分享防禦DDoS攻擊的幾大有效方法
- 如何防禦DDOS攻擊?網路安全技術學多久?
- DDoS攻擊原理是什麼?防禦措施都有哪些呢?