针对HTTP服务的攻击方法与防御总结
本文仅对HTTP服务器做分析,其它协议/服务可参考,UDP协议建议绕道这货太难办。
先聊点题外话,昨晚才知道,原来伟大的CC攻击名字是中国人发明的,本意是ChallengeCollapsar,也就是挑战黑洞防火墙。据说在遥远的古时代(喂喂也就03/04年而已吧),防火墙还只是挡挡DDOS的阶段,对CC这种新兴东西还不懂。其实我以前对各种攻击概念也是懵懵懂懂,到最近一两年才慢慢理解过来。在讨论之前需要掌握以下基础知识:
TCP协议的三次握手过程,当然四次握手关闭有兴趣也可以看看~传送门:http://blog.csdn.net/weiqubo/article/details/7226109
基于TCP协议的HTTP协议工作原理:http://www.php-oa.com/2008/05/27/htt.html
有了基础就好说了,先说说DDoS,一般都是用SYN Flood实现。发送假的SYN包,让服务器返回个ACK包。由于发的是假的,ACK包回了自然没人鸟服务器,一个半连接状态就占在连接池缓冲区里。这样多了,缓冲区肯定跨啊,然后服务器就歇菜了。防范方法也是有的,HTTP协议有个Cookie通常用在search的时候,保护search不会被坏人拿去CC,同理我们可以把这个机制引入TCP里。在3次握手过程中,第二次通讯时ACK包加入了一个cookie并主动关闭连接。如果用户需要继续通讯,可携带cookie再次发起SYN包,这时放行即可。优点是连接池不会被占满,缺点是计算cookie的性能损失蛮大的,不过在小型攻击里可以直接启用linux内核的syncookie模块挡一会儿,只要网站不是很吃CPU就大丈夫哒~还有一点要注意,http1.1开始有了Keep-Alive状态,也就是保持连接。在被SYN Flood的时候,最好确定你的网站按F12的内容里不会找到这个Keep-Alive字眼。
关于这个方法的详细分析:http://www.linuxbyte.org/syn-cookie-firewall.html
也许有人会问了,我查资料说常见方法有Synflood、Smurf、Land-based、Ping of Death、Teardrop、PingSweep、Pingflood这么多呢,为什么只讲SynFlood呢?因为这里主要针对HTTP协议来说的,其它的攻击可以靠打补丁、关闭UDP端口、屏蔽ICMP协议来解决。这些应该在平时运维的时候就完成,因此不在紧急处理的范围。
除了这种常规攻击,还有一种是坏人砸钱干的事,也就是第一段提到的CC攻击。一般打人的都是财大气粗的土豪啊富二代啊什么的,刚才打“smd”排第一居然是思密达...看来棒子也会打人啊呐(=@__@=)。CC攻击在没有第三方软件或者旁路/硬件防火墙保护的情况下比较难办,最好先提取出log样本分析,看攻击源有木有使用代理,如果是高匿名代理就比较难办,通常透明代理比较多,可以设置个阈值来控制访问量,超过阈值我掐掐掐死你丫的T_T敢和老娘哦不老子打,胆子不小啊。
如果log里的useragent都是伪造的,那就比较难办了,相对靠谱的办法有控制单线程速度,论坛关闭一切非会员访问之类的来处理。比较极端的情况下,可以考虑在前端完成cookie验证,在无cookie的时候301到置cookie页面,useragent考虑放行bot,如果太极端连bot都模仿只能一刀切把bot墙了。接下来就容易了,访客没cookie?去你丫的别来吃CPU。不过缺点也是有的,首次访问没cookie的得刷新一下,不过还好可以自动刷新并且给出提示,相信访客也是能接受的。手头相关文章只有一篇squid验证cookie的,只是验证是否存在,校检值什么的我不会PERL也没法给演示,有兴趣的童鞋去自学吧:http://hi.baidu.com/yuhongchun027/item/c60fd696d7dc32be83d295ff
总结:攻击方法层出不穷,这年头想伪造也很容易。对付TCP比较好办,对付UDP就头痛了。在遇到攻击的时候,有条件的话先捕获一些数据包样本和log,然后掐掉外部网络,相信聪明的童鞋一定能找出特征并且杀杀杀死攻击包的。如果攻击人玩起烧钱砸带宽把戏的话,可以使用CDN解决,如果量太大了,部署一堆廉价vps加上我上一段说的措施吧,米国一大把廉价vps你懂的...最后感谢技术圈子的大牛们把自己的研究成果公开,其实本文的目的只是自己记一下几个URL而已我会乱说么~~
最后的最后,来点无关的,查TCP资料的时候发现一个Flash教程很生动地演示了滑动窗口机制的全过程,在这里Mark下:http://histrory.visualland.net/tcp_swnd_tutorial.html
针对HTTP服务的攻击方法与防御总结 没有评论