用 Apache 服務器模塊保護您的網站免受應用層 DOS 攻擊
發布時間: 2018-02-05
通過配置普通的網頁服務器,可以保護網頁免受應用層攻擊,至少是適度的防護。防止這種形式的攻擊是非常重要的,因為 Cloudflare 最近 報告稱 網絡層攻擊的數量正在減少,而應用層攻擊的數量則在增加。?
有多種可以導致網站下線的攻擊方法,比較復雜的方法要涉及數據庫和編程方面的技術知識。一個更簡單的方法被稱為“拒絕服務Denial Of Service”(DOS)攻擊。這個攻擊方法的名字來源于它的意圖:使普通客戶或網站訪問者的正常服務請求被拒絕。
一般來說,有兩種形式的 DOS 攻擊:
☉ OSI 模型的三、四層,即網絡層攻擊☉ OSI 模型的七層,即應用層攻擊第一種類型的 DOS 攻擊——網絡層,發生于當大量的垃圾流量流向網頁服務器時。當垃圾流量超過網絡的處理能力時,網站就會宕機。
第二種類型的 DOS 攻擊是在應用層,是利用合法的服務請求,而不是垃圾流量。當頁面請求數量超過網頁服務器能承受的容量時,即使是合法訪問者也將無法使用該網站。
本文將著眼于緩解應用層攻擊,因為減輕網絡層攻擊需要大量的可用帶寬和上游提供商的合作,這通常不是通過配置網絡服務器就可以做到的。
通過配置普通的網頁服務器,可以保護網頁免受應用層攻擊,至少是適度的防護。防止這種形式的攻擊是非常重要的,因為 Cloudflare[1] 最近 報告稱[2] 網絡層攻擊的數量正在減少,而應用層攻擊的數量則在增加。
本文將介紹如何使用 zdziarski[3] 開發的 Apache2 的模塊 mod_evasive[4]。
另外,mod_evasive 會阻止攻擊者通過嘗試數百個用戶名和密碼的組合來進行猜測(即暴力攻擊)的企圖。
mod_evasive 會記錄來自每個 IP 地址的請求的數量。當這個數字超過相應 IP 地址的幾個閾值之一時,會出現一個錯誤頁面。錯誤頁面所需的資源要比一個能夠響應合法訪問的在線網站少得多。
在 Ubuntu 16.04 上安裝 mod_evasive
Ubuntu 16.04 默認的軟件庫中包含了 mod_evasive,名稱為 “libapache2-mod-evasive”。您可以使用 apt-get 來完成安裝:
apt-get update
apt-get upgrade
apt-get install libapache2-mod-evasive
現在我們需要配置 mod_evasive。
它的配置文件位于 /etc/apache2/mods-available/evasive.conf。默認情況下,所有模塊的設置在安裝后都會被注釋掉。因此,在修改配置文件之前,模塊不會干擾到網站流量。
<IfModule mod_evasive20.c>
#DOSHashTableSize 3097
#DOSPageCount 2
#DOSSiteCount 50
#DOSPageInterval 1
#DOSSiteInterval 1
#DOSBlockingPeriod 10
#DOSEmailNotify [email protected]
#DOSSystemCommand "su - someuser -c '/sbin/... %s ...'"
#DOSLogDir "/var/log/mod_evasive"
</IfModule>
第一部分的參數的含義如下:
? DOSHashTableSize - 正在訪問網站的 IP 地址列表及其請求數的當前列表。? DOSPageCount - 在一定的時間間隔內,每個頁面的請求次數。時間間隔由 DOSPageInterval 定義。? DOSPageInterval - mod_evasive 統計頁面請求次數的時間間隔。? DOSSiteCount - 與 DOSPageCount 相同,但統計的是來自相同 IP 地址對網站內任何頁面的請求數量。? DOSSiteInterval - mod_evasive 統計網站請求次數的時間間隔。? DOSBlockingPeriod - 某個 IP 地址被加入黑名單的時長(以秒為單位)。如果使用上面顯示的默認配置,則在如下情況下,一個 IP 地址會被加入黑名單:
? 每秒請求同一頁面超過兩次。? 每秒請求 50 個以上不同頁面。如果某個 IP 地址超過了這些閾值,則被加入黑名單 10 秒鐘。
這看起來可能不算久,但是,mod_evasive 將一直監視頁面請求,包括在黑名單中的 IP 地址,并重置其加入黑名單的起始時間。只要一個 IP 地址一直嘗試使用 DOS 攻擊該網站,它將始終在黑名單中。
其余的參數是:
? DOSEmailNotify - 用于接收 DOS 攻擊信息和 IP 地址黑名單的電子郵件地址。? DOSSystemCommand - 檢測到 DOS 攻擊時運行的命令。? DOSLogDir - 用于存放 mod_evasive 的臨時文件的目錄。配置 mod_evasive
默認的配置是一個很好的開始,因為它不會阻塞任何合法的用戶。取消配置文件中的所有參數(DOSSystemCommand 除外)的注釋,如下所示:
<IfModule mod_evasive20.c>
DOSHashTableSize 3097
DOSPageCount 2
DOSSiteCount 50
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 10
DOSEmailNotify [email protected]
#DOSSystemCommand "su - someuser -c '/sbin/... %s ...'"
DOSLogDir "/var/log/mod_evasive"
</IfModule>
必須要創建日志目錄并且要賦予其與 apache 進程相同的所有者。這里創建的目錄是 /var/log/mod_evasive ,并且在 Ubuntu 上將該目錄的所有者和組設置為 www-data ,與 Apache 服務器相同:
mkdir /var/log/mod_evasive
chown www-data:www-data /var/log/mod_evasive
在編輯了 Apache 的配置之后,特別是在正在運行的網站上,在重新啟動或重新加載之前,最好檢查一下語法,因為語法錯誤將影響 Apache 的啟動從而使網站宕機。
Apache 包含一個輔助命令,是一個配置語法檢查器。只需運行以下命令來檢查您的語法:
apachectl configtest
如果您的配置是正確的,會得到如下結果:
Syntax OK
但是,如果出現問題,您會被告知在哪部分發生了什么錯誤,例如:
AH00526: Syntax error on line 6 of /etc/apache2/mods-enabled/evasive.conf:
DOSSiteInterval takes one argument, Set site interval
Action 'configtest' failed.
The Apache error log may have more information.
如果您的配置通過了 configtest 的測試,那么這個模塊可以安全地被啟用并且 Apache 可以重新加載:
a2enmod evasive
systemctl reload apache2.service
mod_evasive 現在已配置好并正在運行了。
測試
為了測試 mod_evasive,我們只需要向服務器提出足夠的網頁訪問請求,以使其超出閾值,并記錄來自 Apache 的響應代碼。
一個正常并成功的頁面請求將收到如下響應:
HTTP/1.1 200 OK
但是,被 mod_evasive 拒絕的將返回以下內容:
HTTP/1.1 403 Forbidden
以下腳本會盡可能迅速地向本地主機(127.0.0.1,localhost)的 80 端口發送 HTTP 請求,并打印出每個請求的響應代碼。
你所要做的就是把下面的 bash 腳本復制到一個文件中,例如 mod_evasive_test.sh:
#!/bin/bash
set -e
for i in {1..50}; do
curl -s -I 127.0.0.1 | head -n 1
done
這個腳本的部分含義如下:
? curl - 這是一個發出網絡請求的命令。? -s - 隱藏進度表。? -I - 僅顯示響應頭部信息。? head - 打印文件的第一部分。? -n 1 - 只顯示第一行。然后賦予其執行權限:
chmod 755 mod_evasive_test.sh
在啟用 mod_evasive 之前,腳本運行時,將會看到 50 行 “HTTP / 1.1 200 OK” 的返回值。
但是,啟用 mod_evasive 后,您將看到以下內容:
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
...
前兩個請求被允許,但是在同一秒內第三個請求發出時,mod_evasive 拒絕了任何進一步的請求。您還將收到一封電子郵件(郵件地址在選項 DOSEmailNotify 中設置),通知您有 DOS 攻擊被檢測到。
mod_evasive 現在已經在保護您的網站啦!
上一篇: 為初學者介紹 Linux whereis 命令(5個例子)
下一篇: “生物黑客”是一群怎樣的存在