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