DDoS简介
DDoS又称为分布式拒绝服务,全称是Distributed Denial of Service。利用合理的请求造成资源过载,导致服务不可用。
应用层DDoS
发生在应用层,TCP三次握手已经完成,连接已经建立。
CC攻击
Challenge Collapasar(简称CC),意指在黑洞的防御下,仍然能有效完成拒绝服务攻击。
CC攻击的原理非常简单,就是对一些消耗资源较大的应用页面不断发起正常的请求,已达到消耗服务端资源的目的。
限制请求频率
最常见的针对应用层DDoS攻击的防御措施,是在应用中针对每个“客户端”做一个请求频率的限制。
比如,通过IP地址与Cookie定位一个客户端,如果客户端的请求在一定时间内过于频繁,则对之后来自该客户端的所有请求都重定向到一个出错页面。
代理服务器
攻击者经常使用代理服务器或傀儡机来隐藏攻击者的真实IP地址。解决方式如下:
- 应用代码要做好代码优化。
- 在网络架构上做好优化。
- 实现一些对抗手段,比如限制每个IP地址的请求频率。
验证码
验证码可以有效地阻止自动化的重放行为。但验证码如果设计得过于复杂,那么人也很难辨识出来。
随着技术的发展,直接通过算法破解验证码的方法也变得越来越成熟。通过一些图像处理技术,可以将验证码逐步变化成可识别的图片。
防御应用层DDoS
由于大部分的自动化脚本都是直接构造HTTP包完成的,并非在一个浏览器环境中发起的请求。因此让客户端解析一段JavaScript,并给出正确的运行结果,可以判断出客户端到底是不是浏览器。
除了人机识别外,还可以在Web Server这一层做些防御。
在Apache的配置文件中,有一些参数可以缓解DDoS攻击。 比如调小Timeout、KeepAliveTimeout值,增加MaxClients值。Apache提供的模块接口为我们扩展Apache、设计防御措施提供了可能。目前已经有一些开源的Module全部或部分实现了针对应用层DDoS攻击的保护。
资源耗尽攻击
Slowloris攻击
以极低的速度往服务器发送HTTP请求。由于Web Server对于并发的连接数都有一定的上限,因此若是恶意地占用住这些连接不释放,那么Web Server的所有连接都将被恶意连接占用,从而无法接受新的请求,导致拒绝请求。
HTTP POST DoS
发送HTTP POST包时,指定一个非常大的Content-Length值,然后以很低的速度发包,比如10~100s发一个字节,保持住这个连接不断开。这样当客户端连接数多了以后,占用住了Web Server的所有可用连接,从而导致DoS。
Server Limit DoS
Web Server对HTTP包头都有长度限制。假如攻击者通过XSS攻击,恶意地往客户端写入了一个超长的Cookie,则该客户端在清空Cookie之前,将无法再访问该Cookie所在域的任何页面。要解决此问题,需要调整Apache配置参数LimitRequestFieldSize,这个参数设置为0时,对HTTP包头的大小没有限制。
ReDoS
正则表达式是基于NFA(Nondeterministic Finite Automaton)的,它是一个状态机,每个状态和输入符号都可能有许多不同的下一个状态。正则解析引擎将遍历所有可能的路径直到最后。由于每个状态都有若干个“下一个状态”,因此决策算法将逐个尝试每个“下一个状态“,直到找到一个匹配的。
当用户恶意构造输入时,这些有缺陷的正则表达式就会消耗大量的系统资源(比如CPU和内存),从而导致整台服务器的性能下降。