Http 慢速攻擊問題修復記錄
Http 慢速攻擊定義
HTTP 慢速攻擊也叫 slow http attack,是一種 DoS 攻擊的方式。由於 HTTP 請求底層使用 TCP 網路連線進行會話,因此如果中介軟體對會話超時時間設定不合理,並且HTTP在傳送請求的時候採用慢速發 HTTP 請求,就會導致佔用一個 HTTP 連線會話。如果傳送大量慢速的 HTTP 包就會導致拒絕服務攻擊DoS。
三種攻擊方式
-
Slow headers (也稱 slowloris):Web 應用在處理 HTTP 請求之前都要先接收完所有的 HTTP 頭部,Web 伺服器再沒接收到 2 個連續的
\r\n
時,會認為客戶端沒有傳送完頭部,而持續的等等客戶端傳送資料,消耗伺服器的連線和記憶體資源。 -
Slow body (也稱 Slow HTTP POST):攻擊者傳送一個 HTTP POST 請求,該請求的 Content-Length 頭部值很大,使得 Web 伺服器或代理認為客戶端要傳送很大的資料。伺服器會保持連線準備接收資料,但攻擊客戶端每次只發送很少量的資料,使該連線一直保持存活,消耗伺服器的連線和記憶體資源。
-
Slow read (也稱 Slow Read attack):客戶端與伺服器建立連線併發送了一個 HTTP 請求,客戶端傳送完整的請求給伺服器端,然後一直保持這個連線,以很低的速度讀取 Response,比如很長一段時間客戶端不讀取任何資料,通過傳送 Zero Window 到伺服器,讓伺服器誤以為客戶端很忙,直到連線快超時前才讀取一個位元組,以消耗伺服器的連線和記憶體資源。
解決方案
1. SpringBoot
springboot 配置檔案中新增如下配置:
server.connection-timeout=20000
2. Tomcat
tomcat 配置檔案 server.xml 中修改 Connector 中的 connectiontimeout 的值:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
3. Nginx
nginx 上可以增加如下配置來解決此問題:
# 指定客戶端與服務端建立連線後傳送 request body 的超時時間,配置段:http,server,location
client_body_timeout 20s;
# 指定客戶端向服務端傳送一個完整的 request header 的超時時間,配置段:http,server,location
client_header_timeout 10s;
# 服務端向客戶端傳輸資料的超時時間,配置段:http,server,location
send_timeout 30s;
測試
使用 slowhttptest 測試,具體測試方式可以參照下面的參考連結。
這裡主要說一下測試結果的驗證,slowhttptest 測試過程中會顯示如下圖的執行結果:
這裡主要看兩行:
- 最後一行的
service available
是否始終處於Yes
狀態,也就是服務正常訪問狀態 - 觀察第一行中的數值(即測試時間),測試連線是否在超過之前配置的超時時間之後結束。
如果 slowhttptest 執行期間,服務始終正常訪問,訪問超時之後就結束,則證明配置生效。
參考來源
https://blog.csdn.net/weixin_39934520/article/details/107707268
https://www.cnblogs.com/endust/p/11960901.html
https://www.cnblogs.com/52py/p/10931089.html