DOS/DDOS(这里针对DOS和DDOS我不做区分,因为在我来看其本质与目的是一样的,只是主体不同,就不再做区分,而DDOS相对于DOS更高阶,包括僵尸网络、耗费资源等,所以下文统一以DDOS为主体做分享)似乎离公司很遥远,似乎除了一些顶级互联网公司或者高量级2C的公司,似乎不用担心DDOS的威胁,毕竟这是一个攻击成本很高的行为,这里我想系统聊一聊一下DDOS的攻击,因为我认为ddos是一个零和博弈的过程,平时可以不用或者用不上,但是这是一个兜底的防御措施,即当流量过载时依然能够提供服务,同时按照内生安全的理念,在做DDOS防御体系的过程中,不仅只是流量迁移,更应该是嵌入在整体系统设计的各个步骤,如网络层的负载均衡,主机层的冗余与灾备,同时还包括了应用层的ddos漏洞等,后续我将分层详细和各位师傅们共同讨论学习。
首先要纠正一个防御DDOS的常规错误理念,DDOS并不是买DDOS高防或者运营商解决方案就能一劳永逸的,原因上文也提到过,DDOS包括了不同的层级,需要在不同的场景下分析、组织内各个成员共同参与,以评估实际情况并相应地应用防御措施。
DDOS原理
接下来来分析DDOS的原理,根据CIA原则,DDOS主要影响的是可用性。其攻击的核心是以任何手段影响实例或对象的可用性,并最终使其无法访问。因此,任何信息系统要发挥其作用,就必须随时可用。举个例子:DDoS攻击可以比喻为网络世界的交通堵塞,其中攻击者派发的虚假请求就像阻塞了主要道路,使得合法流量无法进入。这种拒绝服务的攻击不仅损害了服务的可用性,也可能导致业务中断、数据泄露以及财务损失。
DDoS(分布式拒绝服务)攻击之所以强大和具有破坏性,是因为它们利用了大量计算机或设备,将它们组织成一个庞大的网络,通过协同作战向目标发动攻击。
- 感染设备成为僵尸机器人: 攻击者通过各种手段感染大量计算机、服务器或物联网设备,将它们变成僵尸机器人。这通常是通过漏洞利用、弱密码实现的。这些受感染的设备被远程控制,成为攻击者的一部分。参考各类僵尸网络病毒,如Mirai病毒就是扫描各类弱密码、Nday漏洞的物联网设备不断扩充攻击源
- 创建僵尸网络: 一旦设备被感染,攻击者将它们组织成一个庞大的网络,通常被称为僵尸网络或者botnet。这个网络中的每个受感染设备都可以执行攻击者指定的任务,而这通常是同时向特定的目标发动攻击。
- 远程指令和控制: 攻击者通过远程指令和控制(C&C)服务器远程操纵僵尸网络。这些指令可能包括发起DDoS攻击、更改攻击策略或切换目标。攻击者可以随时调整攻击的强度和方式。
- 发起网络攻击: 一旦攻击者下达命令,僵尸网络中的设备开始向特定的目标发动网络攻击。攻击的方式和类型可以多种多样,包括UDP Flood、TCP/IP Exhaustion、ICMP Echo Request、HTTP Flood、SYN/ACK Flood等。
- 服务崩溃: 大量的虚假请求和恶意流量同时涌入目标系统,超过其处理能力,导致服务崩溃或变得极其缓慢。这会使合法用户无法正常访问目标的网络服务,造成服务不可用。
- 持续攻击和难以追踪: DDoS攻击通常持续较长时间,可能会持续数小时甚至数天。攻击者经常采取措施使攻击难以追踪,例如通过使用代理服务器、操纵源IP地址等手段,增加防御的难度。
DDOS攻击类型
攻击层级: DDoS攻击通常发生在网络连接的不同层级,具体如下:
前面提到,DDOS本质是让资源耗尽而无法提供服务,以下即为具体的表现形式:
网络层攻击:
- ICMP洪水攻击:攻击者向目标网络发送大量ICMP(Internet Control Message Protocol)数据包,通常是“Ping Flood”。服务器收到之后会回复一个icmp echo给源地址。这种攻击和udp flood攻击类似,可以看到攻击请求和服务器响应流量是1:1的关系,属于是伤敌1000自损1000,现在已经很少看到了。
- UDP洪水攻击:攻击者利用udp无状态的特点,向服务器的不同端口发送udp报文,服务器收到之后会寻找对应端口的应用程序,如果没有找到,会返回“目标不可达”的消息。攻击者往往会通过伪造源ip来达到隐藏自己身份的目的。这种攻击方法以量取胜,一旦服务器被攻击流量淹没,那就无法响应正常用户的请求
传输层攻击:
- TCP SYN洪水攻击:攻击者利用了三次握手的机制,发送大量第一次握手的syn包给服务器,并且无视服务器返回第二次握手的synack包,故意不发送第三次握手,导致服务器大量端口处于SYN_RECV状态。由于服务器收不到第二次握手的报文,超时重传,重传一定次数之后,才会释放连接。服务器的这个状态我们一般称为半连接,要知道服务器能每收到一个syn包时,都会将连接信息储存到一个队列中,这个队列肯定也是有长度的,当超过队列长度时,新来的syn包就无法被响应,服务器也就无法响应正常的tcp请求了。
- TCP连接洪水攻击:攻击者建立大量完整的TCP连接,并保持连接打开状态,消耗服务器资源。
- TCP碎片攻击:攻击者发送大量小片段的TCP数据包,增加服务器处理负担。
会话层攻击:
- TCP洪水攻击:攻击者建立大量完整的TCP连接,消耗服务器资源。
- 会话劫持攻击:攻击者尝试控制合法用户的会话。
表示层攻击:
- SSL/TLS握手洪水攻击:攻击者发送大量的SSL/TLS握手请求,ssl握手的过程中,在协商加密算法时服务器CPU的开销很大。攻击者利用这一特点,在一个TCP连接中不停地快速重新协商,从而达到耗尽服务器CPU资源的目的。ssl客户端发送一条ClientHello消息来初始化一次新的握手,该消息大约100字节左右,不需要加密。服务器端响应ClientHello消息,需要连续发出3个消息,ServerHello、Certificate、ServerHelloDone,这3个消息一般在3000字节左右,需要用高级加密标准AES或流加密算法簇RC-4进行加密后再发送。每次ssl握手,ssl服务端发送的数据比客户端多了30倍,还要进行加密,从而导致服务端CPU计算资源大量占用。
- 心跳检测洪水攻击:利用心跳检测机制发送大量心跳包。
应用层攻击:
- HTTP洪水攻击:攻击者发送大量HTTP请求到Web服务器,可能是GET或POST请求,导致Web服务器资源耗尽。
- 慢速攻击:攻击者以极慢的速度发送请求,使得服务器长时间保持连接打开,耗尽服务器资源。
- XML炸弹攻击:攻击者发送包含大量嵌套标签的XML数据,导致解析器需要消耗大量资源来解析。
- JSON炸弹攻击:与XML炸弹类似,攻击者发送大量复杂或冗长的JSON数据,消耗服务器资源。
- 水坑攻击:攻击者利用已知漏洞,攻击访问特定网站的用户。
- 反射型DDoS攻击:攻击者利用第三方服务(如DNS服务器)作为反射器,发送伪造的请求到目标服务器,放大攻击流量。
- 放大型DDoS攻击:攻击者利用第三方服务(如NTP服务器)的特性,发送小的数据包请求大量数据的响应,放大攻击流量。应用层状态耗尽攻击:攻击者利用应用程序逻辑,消耗服务器状态资源。
- API滥用:攻击者滥用Web API,进行大量请求,消耗资源。
- 僵尸网络驱动的攻击:利用大量感染的设备发起攻击。
其他类型的DDoS攻击
- DNS洪水攻击:攻击者发送大量DNS查询请求,可能利用开放的DNS服务器反射大量流量到目标。
- NTP洪水攻击:攻击者发送伪造的NTP查询请求,利用NTP服务器的响应机制放大流量。
- SSDP洪水攻击:针对简单服务发现协议的攻击,攻击者发送伪造的SSDP请求,利用SSDP服务放大流量。
- MEMCACHE洪水攻击:攻击者利用开放的MEMCACHE服务,发送小的数据包请求大量数据的响应。
- CLDAP洪水攻击:攻击者发送伪造的CLDAP查询请求,利用CLDAP服务的特性放大流量。
- QUIC洪水攻击:针对基于UDP的QUIC协议的攻击,常见于TLS/SSL流量。
- WebSocket洪水攻击:攻击者通过WebSocket协议建立大量连接,消耗服务器资源。
- SMB/NetBIOS洪水攻击:针对Windows网络的SMB协议,攻击者发送大量SMB请求,可能导致服务拒绝。
- FTP洪水攻击:攻击者发送大量FTP命令,消耗FTP服务器资源。
- SSH洪水攻击:攻击者尝试大量SSH登录请求,消耗SSH服务器资源
DDoS攻击之所以对服务造成巨大威胁,是因为攻击者利用了分布式网络的规模和协同作战的能力,使得防御变得更为复杂和困难。
如何识别DDOS攻击
识别DDoS攻击是保护网络和服务免受攻击的关键一步。
- 服务性能下降: DDoS攻击通常导致目标服务变得缓慢或无法使用。用户可能会感觉到访问网站或应用程序的速度明显下降,或者完全无法连接到服务。——用户侧感知
- HTTP错误码增加: 攻击可能导致服务器返回大量HTTP错误码,例如502(Bad Gateway)或503(Service Unavailable)。这些错误码表明服务器无法正常处理请求,可能是由于DDoS攻击导致的资源不足。——用户侧与监控侧感知
- 异常的流量模式: 监测网络流量模式是识别DDoS攻击的关键。如果在监控中发现来自单个IP地址的异常大量流量,尤其是对特定端口或协议的流量,可能是DDoS攻击的迹象。——监控侧感知
- 流量峰值: 在一天中的某个时间,如果涉及不寻常的流量峰值,特别是在没有什么营销活动情况下,这可能表明正在受到DDoS攻击。——监控侧感知
- 异常的请求激增: 如果某个特定页面、API端点或资源突然出现了大量无法解释的请求激增,这可能是DDoS攻击的迹象。攻击者可能有意地集中攻击力量以达到瘫痪特定部分的目的。——监控侧感知
- 流量特征不同: DDoS攻击可能具有不同的流量特征,例如大量的小型数据包(SYN Flood攻击)或大量的无效HTTP请求(HTTP Flood攻击)。通过分析流量模式,您可以更好地了解攻击的类型。——监控侧感知
如何进行DDOS攻击防御
前面提到,DDOS的攻击本质是不可服务,无论是通过资源耗尽的方式,还是通过通道阻塞的方式,其目的是不可服务,那么整体的防御逻辑即针对不同的层级,确保可服务的状态,而可服务的核心为:扩展
具体逻辑为:先于功能、架构和性能(例如,应用层面、基础设施和网络相关)进行现状分析,识别出可能会导致DDOS的潜在风险,同步进行扩展,包括但不限于网络带宽增加、CDN、灾备等,接下来我仍然进行分层级分析DDOS的防御举措
建议:将防御举措整体融入内部安全基线中,不要针对DDOS防御出具专门的安全基线,而是将DDOS防御融入不同层级的安全基线中。
防御措施如下:——注:以下仅为防御基线,具体内容可以在内部安全文档中详细写出,并整合进安全基线中,如安全运维基线可以将传输层防御整合进来等。
网络层防御:
- 增加带宽:增加网络带宽,例如,从1 Gbps增加到10 Gbps。
- 路由器/防火墙配置:在路由器上使用access-list和route-map来限制特定IP的流量。发现流量过大且为非正常IP时可以进行封建,
- 使用黑洞路由:配置路由器将特定流量导向一个不可达的地址ip prefix-list。
- 外部运营商/云服务提供商合作:运营商合作,利用其DDoS防护服务,如AT&T的Proactive Defense Services。
传输层防御:
- SYN Cookies:一种cookie机制,当服务器接收到一个SYN包时,它不会立即分配资源来建立连接,而是生成一个特殊的SYN Cookie。这个Cookie包含了一些信息,如源IP地址、源端口号、时间戳等,然后将其发送给客户端。当客户端收到SYN-ACK包时,它需要在发送ACK包时包含这个Cookie。服务器收到ACK包后,会验证Cookie中的信息是否与原始SYN包匹配,以及时间戳是否在合理范围内。在Linux服务器上启用SYN Cookies,通过修改/proc/sys/net/ipv4/tcp_syncookies。
- 连接限制:使用iptables设置连接数限制,如iptables -A INPUT -p tcp --syn -m limit --limit 1/s -j ACCEPT。
- 连接超时:减少TCP连接的超时时间,如在Nginx配置文件中设置tcp_timeout。
- 防火墙规则:在防火墙上设置规则来过滤恶意TCP流量。
会话层防御:
- 会话超时设置:在Web服务器上设置会话超时,例如,在Apache中设置SessionCookieTimeout。
- 限制会话存储:在应用程序中限制会话存储的数据量,例如,使用PHP的gc_maxlifetime。
- 会话识别:使用令牌如JWT(JSON Web Tokens)来识别和验证用户会话。
表示层防御:
- SSL/TLS速率限制:在Nginx中使用limit_req模块来限制SSL握手请求的速率。
- 心跳检测限制:在使用CoAP(Constrained Application Protocol)的物联网设备上设置心跳检测的频率限制。
应用层防御:
- Web应用防火墙(WAF):过滤恶意HTTP请求。
- API速率限制:在API网关上实施速率限制
- 输入验证:包括但不限于:限制文件上传大小和扩展名以防止对文件空间存储或其他使用上传作为输入的Web应用程序功能的DoS(例如图像调整大小、PDF创建等)。限制总请求大小使资源消耗DoS攻击更难以成功。防止基于输入的资源分配。防止基于输入的函数和线程交互。用户输入可能会影响需要执行多少次函数或CPU消耗有多密集。根据(未经过滤的)用户输入进行资源分配可能会通过资源耗尽而造成DDOS。
- 资源访问控制:在RESTful API中使用OAuth 2.0进行访问控制。
- 限制请求大小:在Web服务器上设置请求大小限制,例如,在Nginx中设置client_max_body_size。
- 使用CDN:使用CDN服务来分散流量。
- 分布式架构:采用微服务分布式部署。
- 及时修复各类DDOS的应用层漏洞,防止程序崩溃
反射型和放大型DDoS攻击防御措施
- 源IP验证:在应用程序中实现IP地址验证逻辑,以确保请求来自可信源。
- 第三方服务配置:配置DNS服务器以禁用递归查询,以减少DNS放大攻击的风险。
- 任何源IP过滤:使用路由器或防火墙规则过滤来自任何未知源IP的流量。
- 使用第三方DDoS防护服务:利用Radware或Akamai等专业DDoS防护服务。
DNS和NTP放大攻击防御措施
- DNS查询速率限制:在BIND DNS服务器上使用rate-limit指令来限制查询速率。
- NTP服务器访问控制:在NTP服务器上配置访问控制列表,只允许特定IP或网络访问。
- ISP支持:利用ISP提供的DDoS清洗服务,如Comcast的DDoS Protection。
SSDP、MEMCACHE、CLDAP放大攻击防御措施
- 服务配置:在SSDP服务上禁用UPnP(Universal Plug and Play)功能。
- 访问控制:在MEMCACHE服务上设置访问控制,只允许特定IP访问。
- 服务禁用:如果不需要CLDAP服务,禁用或删除相关配置。
WebSocket和其他应用协议攻击防御措施
- 连接监控:使用ELK Stack(Elasticsearch, Logstash, Kibana)监控WebSocket连接。
- 速率限制:在Nginx或Apache中设置速率限制,例如,使用Nginx的limit_req_zone。
- 协议特定防护:对于FTP服务,使用FTPS(FTP over SSL/TLS)来加密传输。
同时结合内部安全管理手段,如安全培训、应急响应流程等,即使发现、处理DDOS攻击。
DDOS防护个人心得:
DDOS防护和日常的漏洞还不太一样,常规来说一旦发生了DDOS攻击,一定是恶意的行为,和日常SRC测试、渗透测试不太一样,尤其是2C应用,如果防不住,企业会遭受重创且用户可感知,针对客群及品牌商誉会有极大伤害,而DDOS防御并不能借助一台设备、或某个部位进行扩容,而是融入到整体安全建设中,在设计初期即将DDOS安全需求纳入,才能够确保针对不同层级的DDOS都有盾可用。