在过去,很多防火墙对于DDoS攻击的检测一般是基于一个预先设定的流量阈值,超过一定的阈值,则会产生告警事件,做的细一些的可能会针对不同的流量特征设置不同的告警曲线,这样当某种攻击突然出现的时候,比如SYN flood,此时网络中SYN的报文会超过阈值,说明发生了SYN flood攻击。
但是当网络中的报文速率本身是这条曲线的时候,曲线自身就一直在震荡,在这样的曲线上如何检测异常?如何根据阈值检测攻击?真正的攻击又是哪一个点?
这个攻击几乎肉眼无法分辨。如果不是那个时间点真的出了攻击,也很难从曲线上找出来。要放大了才能看出来。
所有上述的攻击,人的肉眼可以发现出来,基本上都是因为人在观察曲线的时候对于曲线的平滑和不平滑的交界处非常敏感。攻击检测算法第一位的需求是要把人肉眼可以观察出来的波动,锯齿,突刺都检测出来。
除了上面的这些检测方法之外,还有一类,就是从整体上看历史流量情况,然后根据这个时刻的流量峰值来判断。
这种方法对历史流量进行学习,生成业务访问的流量模型,并将业务当前流量和模型作比较,出现明显偏差时就判断为DDoS攻击。这种方法对于流量比较稳定的业务比较有效。但是在我们实际的互联网业务中,发现检测效果非常的低,特别是云计算环境,每天的业务都不一样,因此检测效率较低。
看起来,要实现一个高精度的检测系统,无外乎几个条件:
1、采集目标IP的网络流量
2、对关注的指标进行存储,并描绘成曲线
3、对曲线进行攻击检测,在必要的时候告警通知运维人员
如果要对其进行量化的话则主要是两个指标:
1、误报率:在所有产生的告警中,有多少代表了真正的攻击
2、敏感度:在所有真正的攻击中,有多少被检测系统发现
为了降低误清洗率,我们又进一步的在alibeaver中提出了一种基于流量成分的检测算法,并且结合毫秒级的分光设备,实现了快速的ddos攻击检测。
实际的算法可能有N多的公式、函数和流程,我不是一个理论工作者,这里只用一个简单的例子来说明:
如下可以看到一个HTTP业务的正常情况和受攻击时的入方向流量成分。正常时的抓包:其中在协议层面上,SYN、ack、Fin、Rst、icmp等报文的比例在一定的范围之内。不管流量多大,只要业务不发生变化,其实总的比例都差不多。
而我们观察一次该业务被攻击时候的抓包,可以发现攻击发生的时候,某些成分的比例会急剧上升,也许有人会挑战我,攻击者也可以完全的模拟正常业务的请求来跟服务器进行交互,这样你的检测算法也就没用了,但是事实上是,这样做攻击者需要真正的真实IP,而且真实的交互会更快的暴露自己,虽然也没法做到像正常业务交互那样真实。
结论:这是一个典型的SYNflood攻击。通过对比正常情况和受攻击时的入口流量成分,可以看到攻击发生的时候网络中各个协议的占比发生了明显的变化。
摘自:https://xianzhi.aliyun.com/forum/mobile/read/77.html