Http 慢速攻击问题修复记录

Http 慢速攻击定义

HTTP 慢速攻击也叫 slow http attack,是一种 DoS 攻击的方式。由于 HTTP 请求底层使用 TCP 网络连接进行会话,因此如果中间件对会话超时时间设置不合理,并且HTTP在发送请求的时候采用慢速发 HTTP 请求,就会导致占用一个 HTTP 连接会话。如果发送大量慢速的 HTTP 包就会导致拒绝服务攻击DoS。

三种攻击方式

  1. Slow headers (也称 slowloris):Web 应用在处理 HTTP 请求之前都要先接收完所有的 HTTP 头部,Web 服务器再没接收到 2 个连续的 \r\n 时,会认为客户端没有发送完头部,而持续的等等客户端发送数据,消耗服务器的连接和内存资源。

  2. Slow body (也称 Slow HTTP POST):攻击者发送一个 HTTP POST 请求,该请求的 Content-Length 头部值很大,使得 Web 服务器或代理认为客户端要发送很大的数据。服务器会保持连接准备接收数据,但攻击客户端每次只发送很少量的数据,使该连接一直保持存活,消耗服务器的连接和内存资源。

  3. 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 测试过程中会显示如下图的执行结果:

这里主要看两行:

  1. 最后一行的 service available 是否始终处于 Yes 状态,也就是服务正常访问状态
  2. 观察第一行中的数值(即测试时间),测试连接是否在超过之前配置的超时时间之后结束。

如果 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

posted @ 2020-08-07 14:27  牧码的羊  阅读(3238)  评论(0编辑  收藏  举报