DDOS学习笔记(《破坏之王-DDOS攻击与防范深度剖析》)

       最近花了点时间把《破坏之王-DDOS攻击与防范深度剖析》看了一遍,坦白来说,这本书比较浅显,可以说是入门书,当然对于我这种对DDOS一知半解的人来说,也是一本不错的书,起码我学到了一些东西。
       DDOS是分布式拒绝服务(Distributed Denial of Service, DDOS)的简写,从名字可以看出,其攻击是分布式的,即多台(可能上万台,甚至更多)电脑同时对目标进行攻击,攻击的目的是让目标无法提供服务。从根本上来说,让目标无法提供服务,办法有很多,比如侵入目标服务器,删除关键服务或程序,或者其他的物理方式,这些确实有效,但是在隐蔽性上,以及目标恢复服务的难度上,都和DDOS相去甚远。DDOS本质来说是用一些方法消耗目标服务器的资源,一台服务器提供正常的对外服务,它必须拥有足够的硬件设备,如CPU、内存、足够快的硬盘,以及系统软件,如稳定的操作系统、稳定的应用服务器以及数据库等,还需要稳定的应用服务,比如基于JavaEE和PHP的程序,还需要足够的带宽,让用户可以访问。这些是提供服务的基础,也是DDOS攻击的关键,从这个角度来看,DDOS的攻击一般分为带宽攻击、系统资源攻击和应用资源供给。简单说明如下:
      1)带宽攻击:这个很容易理解,就是向目标服务器发送大量的数据包,让其他的正常用户无法连接上服务器,这个最好理解,也最容易实现,很多压力测试的工具都可以达到这种效果。但是这种压力测试工具很容易被通过IP黑名单的办法屏蔽掉。常见的攻击方式有ICMP/IGMP洪水攻击和UDP洪水攻击,这种攻击方式比较古老,很容易过滤,并且受制于攻击电脑的性能,往往达不到想要的效果。更好的方式是反射攻击技术,所谓的反射攻击,就是攻击电脑伪装成目标主机,向某些服务器(如DNS、NTP、ACK、SNMP)发送请求,这些服务器返回的报文远大于请求内容,并且其返回的数据是指向目标主机的,这即方便了攻击隐藏,也避免了攻击主机的性能限制,因为某些情况下,其放大效果能达到700倍。
     2)攻击系统资源:主要是指攻击TCP链接和攻击CPU、内存等资源,TCP连接被设计为可靠的三次握手模式,对。于后两次而言,每当有一次出现问题,就会引起等待和重传,没有完成的连接被称为半开连接,半开连接会很快耗尽服务器的连接资源,这就是常见的SYN洪水攻击;另外客户端发送完数据之后,会设置PSH标志,服务器收到这一信息后,就会清空缓冲区,将数据提交给服务进程,如果发送大量的PSH位的数据,也会造成服务器资源的占用。另外还有RST攻击和SocketStress攻击,前者相对困难,后者是一种慢速攻击,这是通过TCP连接中的传输窗口的特性进行攻击。另外还有利用SSL的特性,让服务器端耗费大量的资源进行加解密,进而耗尽资源导致其无法服务。
     3)攻击应用资源:常见的有攻击DNS和攻击HTTP服务,攻击DNS实际上一种无目的的、针对整个网络的攻击,相当于毁掉了整个城市的站牌和路标,自然就无法通行了。攻击HTTP服务是利用HTTP服务的一些设计缺陷,如HTTP洪水攻击,其实和攻击TCP连接类似,攻击者连接服务器之后,立刻切断连接,并重新连接,这样服务器的连接在超时之前需要保存,就会耗尽服务器资源;再比如Slowloris攻击,就是利用了HTTP头部的结束标志位"\r\n\r\n",攻击者发送其他的Head字段,就是不发送"\r\n\r\n"标志,就会导致服务器的连接耗尽,IIS、Nginx进行修改,但是Apache似乎没有修改;再如慢速POST攻击,是利用了Content-Length指定了Body的传输长度这一特点,指定巨大的Content-Length值,然后缓慢的发送body信息,从而占有http连接,进而耗尽服务器资源。还有一些就是数据处理过程的攻击,如正则表达式和哈希冲突拒绝服务攻击,这些也是降低服务器的处理速度,占有关键资源,从而达到拒绝服务的目的。
      DDOS的治理:
      1)最可行的办法,其实就是杜绝IP地址伪造,其实这个处理起来并不难,只要让路由器判断这个包是否是从本网域发出来的,如果不是,则拒绝,但是由于成本和缺乏激励机制,还没有实现。还有一些类似的方案,如果能够独具IP地址伪造,那么DDOS攻击应该减少大部分。
       2)攻击流量的缓解主要是对网络流量进行清洗,清洗之前需要稀释,稀释的办法主要有CDN、AnyCast,前者是通过智能DNS,将用户的访问分布到不同的机器上,但是这种方法对指定IP的攻击无效,AnyCast可以解决针对IP攻击的问题。
      3)数据清洗的办法很多,但是并不是十分有效,常见的办法有IP信誉检查、攻击特征匹配、速度限制和检查、TCP代理和验证、协议完整性验证、客户端真实性验证等方法
上一篇:Android 自定义android控件EditText边框背景


下一篇:29. Divide Two Integers (JAVA)