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


























