最近,有朋友反映自家網站訪問速度明顯慢了許多,用
top
命令查看發現 CPU 快被占滿了,HTTP 連接數不斷攀升,愈演愈烈,了解后得知,這已經不是網站第一次遭受 CC 攻擊了,之前試過使用 Apache 做反向代理配置,可是 Apache 也沒扛住,
一、何為CC攻擊
那么,什么是 CC 攻擊呢?
這里用一個段子做引,顧客點了份魚香肉絲沒有肉絲,找店家理論,店家矢口否認,于是第二天顧客找了 N 多閑雜人等把小飯館全部坐滿,還不消費,正常顧客無法消費就餐,店主損失巨大,
這,就是店家不懂 CC 攻擊的下場,
CC 攻擊/Challenge Collapsar 是指攻擊者控制某些主機,不斷發送大量資料包給網站服務器,造成服務器資源耗盡,直到宕機崩潰,大家或多或少都有過網頁訪問人數過多導致網頁打不開或者打開非常慢的經歷,CC 攻擊就會造成如此結果,CC 攻擊由 DDoS 攻擊而生出,是 DDoS 的子集,它的攻擊物件是網站頁面,會模擬多個用戶 (多少執行緒就是多少用戶) 不停地訪問那些需要大量資料操作 (意味著需要大量 CPU 時間) 的頁面,造成服務器資源浪費,CPU 長時間處于 100% 的狀態,處理不盡的連接導致網路擁塞,正常訪問便會被中止,
CC攻擊的特點
- 攻擊的 IP 都是真實的、有效的,無法拒絕;
- 發送的資料包都是正常的資料包;
- 攻擊的是網頁,服務器可以連接,就是網頁訪問不了;
- 攻擊成本低、技術含量低、容易實施,主機影響巨大,
二、如何判斷CC攻擊
CC 攻擊發生時,經常出現帶寬資源被嚴重消耗,網站癱瘓;CPU、記憶體利用率飆升,主機癱瘓;瞬間快速打擊,無法快速回應這些現象,這時,比較簡單直接的判斷方法就是查看 80 埠的連接數,對比正常情況,如果相差懸殊,甚至無法統計,基本可以斷定是 CC 攻擊了,
netstat -an|grep ':80' -c
三、測驗&防御
我們使用 Apache 自帶的壓力測驗工具 ab
做并發測驗,可以模擬多用戶訪問,
環境:VMware、CentOS Linux release 7.7、Apache/2.4.38 (event 加載方式) 和 Nginx/1.16.0,
測驗 I
模擬 600 個用戶同時訪問,共訪問 10000 次,執行:
ab.exe -n 10000 -c 600 -r http://www.cc.com/test.html
ab
回傳的結果如下:
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests
Server Software: Apache/2.4.38
Server Hostname: 10.232.16.55
Server Port: 80
Document Path: /test.html
Document Length: 24738 bytes
Concurrency Level: 600
Time taken for tests: 56.949 seconds
Complete requests: 10000
Apache 日志:
10.232.18.53 - - [04/Dec/2019:20:51:04 +0800] "GET /test.html HTTP/1.0" 200 24738
10.232.18.53 - - [04/Dec/2019:20:51:05 +0800] "GET /test.html HTTP/1.0" 200 24738
10.232.18.53 - - [04/Dec/2019:20:51:05 +0800] "GET /test.html HTTP/1.0" 200 24738
10.232.18.53 - - [04/Dec/2019:20:51:06 +0800] "GET /test.html HTTP/1.0" 200 24738
10.232.18.53 - - [04/Dec/2019:20:51:07 +0800] "GET /test.html HTTP/1.0" 200 24738
10.232.18.53 - - [04/Dec/2019:20:51:07 +0800] "GET /test.html HTTP/1.0" 200 24738
10.232.18.53 - - [04/Dec/2019:20:51:08 +0800] "GET /test.html HTTP/1.0" 200 24738
10.232.18.53 - - [04/Dec/2019:20:51:10 +0800] "GET /test.html HTTP/1.0" 200 24738
10.232.18.53 - - [04/Dec/2019:20:51:10 +0800] "GET /test.html HTTP/1.0" 200 24738
10.232.18.53 - - [04/Dec/2019:20:51:10 +0800] "GET /test.html HTTP/1.0" 200 24738
可以看到,Apache 可以綽綽有余地應付,訪問一切正常,
測驗 II
將并發數提高到 900,再來看 Apache 的反應,執行:
ab.exe -n 10000 -c 900 -r http://www.cc.com/test.html
ab
回傳的結果為:
Total of 1 requests completed
Apache 錯誤日志:
[Wed Dec 04 21:08:25.654731 2019] [mpm_event:error] [pid 46995:tid 139688010909504] AH00484: server reached MaxRequestWorkers setting, consider raising the MaxRequestWorkers setting
這一次的訪問量,Apache 已無法應對,頁面出現無法訪問的情況:
Apache 防御模塊
Apache 可以通過加載 mod_evasive
模塊緩解 CC 攻擊,mod_evasive
模塊提供多個可選引數,通過簡單設定這些引數,可以在遭受攻擊期間規避操作,并可通過電子郵件和系統日志工具報告濫用行為,如匹配設定引數則發送 403 回應并記錄 IP 地址 ,
可選引數:
<IfModule mod_evasive20.c>
DOSHashTableSize 3097
DOSPageCount 2
DOSSiteCount 50
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 60
DOSEmailNotify <[email protected]>
</IfModule>
DOSPageCount
和 DOSSiteCount
是比較溫和的兩個值,以避免客戶端被不必要地阻塞,
DOSPageCount
是對每個 IP 地址單位時間 (通常為 1s) 內對同一個 URL 頁面的請求數量限制,超過該時間間隔的閾值,客戶端的 IP 地址會自動被加到阻止串列中,
DOSSiteCount
是對每個 IP 地址單位時間 (通常為 1s) 內對整個網站的請求總數限制,可以酌情修改為更大的值,
如下例子中,Apache 組態檔 httpd.conf
中設定以下引數:
LoadModule evasive20_module /usr/lib64/httpd/modules/mod_evasive24.so
<IfModule evasive20_module>
DOSPageCount 2
DOSSiteCount 100
DOSLogDir /var/log
</IfModule>
再次測驗 900 的并發數,執行 ab.exe-n10000-c900-r http://www.cc.com/test.html
,看 Apache 作何反應,在前面完全沒有防護措施的場景中,Apache 無法應對這種測驗,
Apache 日志:
[Wed Dec 04 21:52:40.582741 2019] [:error] [pid 49596:tid 139700899661568] [client 10.232.18.53:58234] client denied by server configuration: /usr/local/apache2.4/htdocs/test.html
[Wed Dec 04 21:52:40.583081 2019] [:error] [pid 49596:tid 139700899661568] [client 10.232.18.53:58235] client denied by server configuration: /usr/local/apache2.4/htdocs/test.html
[Wed Dec 04 21:52:40.583323 2019] [:error] [pid 49596:tid 139700899661568] [client 10.232.18.53:58236] client denied by server configuration: /usr/local/apache2.4/htdocs/test.html
可以看出,mod_evasive
模塊已生效,阻止同一用戶非正常的大量并發訪問,而其他用戶訪問正常,
Nginx 防御模塊
當 Web 服務器軟體切換為 Nginx,測驗內容與 Apache 相同,雖然 Nginx 處理并發的能力遠遠大過 Apache,但并發量不斷增加,同樣會耗盡資源,我們不禁會問,Apache 有 mod_evasive
模塊,那 Nginx 呢?
Nginx 主要通過 ngx_http_limit_conn_module
、ngx_http_limit_req_module
這兩個內置模塊來防御 CC 攻擊,
ngx_http_limit_conn_module
可以限制單個 IP 地址的連接數,但并不是所有的連接都會被計數,只有當一個請求的整個請求頭都已經被讀取并且正在被服務器處理,這個請求所在的連接才會被計數,
ngx_http_limit_req_module
則可以限制單個 IP 每秒請求數,通過漏斗演算法,限制每秒固定處理請求數,推遲過多請求,
nginx.conf
中的配置如下:
http {
limit_conn_zone $binary_remote_addr zone=cc_conn:10m;
limit_req_zone $binary_remote_addr zone=cc_req:10m rate=1r/s;
...
server {
limit_conn cc_test 20; #同一個ip并發連接數不能超過20個
...
location / {
limit_req zone=cc_req burst=20 nodelay; #限制平均每秒不超過一個請求,同時允許超過頻率限制的請求數不多于20個,用nodelay引數表示不希望超過的請求被延遲,
...
}
}
}
再次測驗 1000 的并發數,執行:
ab.exe -n 10000 -c 1000 http://www.cc.com/test.html
結果是這樣的:
10.232.18.153 - - [05/Dec/2019:22:42:19 +0800] "GET /test.html HTTP/1.0" 200 24738 "-" "ApacheBench/2.3"
10.232.18.153 - - [05/Dec/2019:22:42:19 +0800] "GET /test.html HTTP/1.0" 503 494 "-" "ApacheBench/2.3"
10.232.18.153 - - [05/Dec/2019:22:42:20 +0800] "GET /test.html HTTP/1.0" 503 494 "-" "ApacheBench/2.3"
10.232.18.153 - - [05/Dec/2019:22:42:20 +0800] "GET /test.html HTTP/1.0" 503 494 "-" "ApacheBench/2.3"
10.232.18.153 - - [05/Dec/2019:22:42:20 +0800] "GET /test.html HTTP/1.0" 503 494 "-" "ApacheBench/2.3"
10.232.18.153 - - [05/Dec/2019:22:42:20 +0800] "GET /test.html HTTP/1.0" 503 494 "-" "ApacheBench/2.3"
10.232.18.153 - - [05/Dec/2019:22:42:20 +0800] "GET /test.html HTTP/1.0" 503 494 "-" "ApacheBench/2.3"
10.232.18.153 - - [05/Dec/2019:22:42:20 +0800] "GET /test.html HTTP/1.0" 503 494 "-" "ApacheBench/2.3"
10.232.18.153 - - [05/Dec/2019:22:42:20 +0800] "GET /test.html HTTP/1.0" 503 494 "-" "ApacheBench/2.3"
回傳 503 (limit_conn和limit_req 的默認回傳碼),說明大量非正常并發連接已被攔截,
通過以上測驗可以看出,Apache 通過加載 mod_evasive
模塊、Nginx 通過加載內置 ngx_http_limit_conn_module
和 ngx_http_limit_req_module
模塊都可以實作防御 CC 攻擊的效果,當然如果配合 iptables 等機制限制 IP 黑名單,效果會更好,
以上方法都是通過限制并發連接數量的手段,達到防止 CC 攻擊的目的,當然還有另外的方法,如接入 CDN,多臺做負載均衡,擴大帶寬等,(盧巖 | 天存資訊)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/296060.html
標籤:其他
下一篇:網路滲透測驗流程和專業術語