Day21-04|4.7.2 拒绝服务攻击与防御
Day21-04|4.7.2 拒绝服务攻击与防御:围绕可用性建立分层韧性
本文对应《系统架构设计师教程(第2版)》第4章“信息安全技术基础知识”4.7.2“拒绝服务攻击与防御”。拒绝服务攻击的目标不是窃取数据,而是让合法用户无法正常使用服务。系统架构设计师需要从容量、协议、应用、依赖、运维和应急响应多个层面设计防御,而不是把问题简单归结为“加一台服务器”。
一、学习目标与考试定位
学习本节后,应能够解释拒绝服务攻击的基本原理,区分资源消耗型、协议缺陷型、应用请求型和分布式拒绝服务攻击;能够根据系统暴露面和业务重要性设计边界防护、流量清洗、限流、熔断、缓存、降级和应急切换方案;能够在案例分析中说明防护措施的作用边界、误伤风险和验证方法;能够在论文中把可用性目标转化为可测量的架构决策。
高级考试常把拒绝服务放在综合安全架构或大型互联网系统背景中考查。题干可能描述“首页访问缓慢”“连接数耗尽”“数据库连接池被占满”“某接口被大量重复调用”“攻击流量来自大量地址”等现象。答题时要先定位资源瓶颈,再判断是网络带宽、连接表、协议处理、线程池、CPU、缓存、数据库还是外部依赖,最后给出由近到远的分层防御。
二、什么是拒绝服务攻击
拒绝服务攻击(Denial of Service,DoS)是攻击者通过消耗系统有限资源、利用协议或程序缺陷、制造大量无效请求,阻止合法用户获得正常服务的攻击。分布式拒绝服务攻击(Distributed Denial of Service,DDoS)则利用多个被控制的主机或设备同时发起攻击,使攻击规模、来源识别和封禁难度显著增加。
可用性是一个端到端属性。用户能否完成一次下单,不仅取决于 Web 服务器是否存活,还取决于 DNS、网络链路、负载均衡、网关、应用线程池、缓存、数据库、消息系统和第三方支付等环节。因此,判断“服务器 CPU 不高,所以没有被攻击”是不可靠的。攻击可能消耗连接表、带宽、端口、内存、线程、连接池或业务配额,而不一定表现为 CPU 满载。
可以用下面的因果链理解攻击:
攻击流量或恶意请求 → 某层资源被占用 → 正常请求排队或失败 → 关键依赖被拖垮 → 服务可用性下降
防御的目标就是打断这条链条:尽早识别异常、尽早丢弃无效流量、限制单主体资源占用、保护关键依赖、保留核心业务通道,并在失效时快速恢复。
三、拒绝服务攻击的主要类型
1. 资源消耗型攻击
攻击者发送大量请求、报文或连接,直接消耗网络带宽、连接数、CPU、内存、线程和文件描述符。例如大量建立 TCP 连接会消耗服务端连接资源,大量慢请求会长期占用工作线程,大量大包或响应请求会消耗链路带宽。此类攻击看似简单,但如果系统没有容量边界和限流措施,低成本攻击也可能造成明显影响。
2. 协议和状态耗尽型攻击
网络设备和协议栈会维护各种状态,如半连接队列、会话表、NAT 表和路由缓存。攻击者通过制造大量握手未完成、异常连接或伪造源地址的报文,可能使状态表耗尽。此时后端应用可能仍然健康,但请求无法到达应用。防御需要在更靠近网络边界的位置处理,单纯在应用代码中限流已经太晚。
3. 应用层请求型攻击
攻击者模拟正常用户访问接口,但选择计算成本高、查询范围大或会触发多个下游调用的功能,例如复杂搜索、报表生成、批量导出、验证码发送和密码尝试。应用层攻击流量未必很大,却能显著消耗 CPU、数据库连接和下游配额。它要求结合身份、接口、参数、行为和业务语义识别,不能只按 IP 地址封禁。
4. 反射和放大型攻击
攻击者伪造受害者地址,向能够产生较大响应的服务发送请求,使第三方把响应集中发送给受害者。攻击流量的源头可能分散,受害者看到的是大量反射响应。防御涉及源地址校验、关闭不必要的开放服务、限制放大协议、边界清洗和运营商协同。
5. 低速率和慢连接攻击
攻击者不一定发送巨量流量,而是以很慢的速度维持连接或分段发送请求,使服务端连接和线程长期处于占用状态。此类攻击容易混入正常长连接业务,防御重点是合理设置连接超时、请求头和请求体超时、并发上限、空闲连接回收,以及将长任务改造成异步任务。
四、攻击防御的分层架构
拒绝服务防御应形成“边界—网络—传输—应用—数据—运营”的纵深体系。不同层级处理不同问题,不能期待任何单一组件识别全部攻击。
| 防护层 | 主要措施 | 主要解决的问题 | 典型限制 |
|---|---|---|---|
| 接入与运营商层 | 高防线路、流量牵引、清洗中心、黑洞策略 | 超大流量和链路拥塞 | 成本、切换时延、误封风险 |
| 网络边界层 | ACL、源地址校验、边界防火墙、DDoS 防护设备 | 明显异常报文和攻击源 | 对加密和业务语义了解有限 |
| 传输层 | SYN 防护、连接上限、超时、会话保护 | 半连接和连接资源耗尽 | 不能替代应用限流 |
| 网关与接入层 | WAF、限流、黑白名单、验证码、行为识别 | HTTP 请求洪峰和常见攻击 | 规则误报、加密流量处理成本 |
| 应用层 | 按用户和接口限流、排队、熔断、降级、幂等 | 业务型和慢请求攻击 | 需要理解业务优先级 |
| 数据与依赖层 | 缓存、读写隔离、连接池保护、异步化 | 防止依赖被拖垮 | 数据一致性和延迟权衡 |
| 运维与治理层 | 监控、告警、演练、预案、审计 | 快速发现、响应和恢复 | 需要持续投入和组织协同 |
分层的核心思想是把攻击尽可能在资源消耗较小的地方拦截。若一个恶意请求已经完成认证、进入业务服务、查询数据库并调用第三方,再被应用层拒绝,系统已经付出了大量成本。
五、容量保护与限流设计
限流不是简单地设置一个固定数字,而是根据资源容量、租户公平性和业务优先级建立控制策略。常见算法包括固定窗口、滑动窗口、令牌桶和漏桶。固定窗口实现简单,但窗口边界可能产生突发;滑动窗口更准确但存储和计算成本更高;令牌桶允许一定程度的突发,适合接口流量控制;漏桶以相对平滑的速率处理请求,适合保护后端处理能力。
限流维度可以是 IP、用户、租户、设备、接口、应用凭据、地域和全局系统。只按 IP 限流可能误伤共享出口用户,也无法限制攻击者使用大量地址;只按用户限流又可能挡不住未认证请求。因此常见做法是组合限流:边界按源地址和连接限流,网关按接口和身份限流,应用按租户和业务配额限流,数据库连接池按服务和操作类型隔离。
限流响应也要分级。非核心查询可直接拒绝或返回缓存,普通写操作可进入队列,关键交易应保留专用通道,批量任务可延迟执行。返回错误时不要暴露内部资源状态,必要时提供明确的重试时间或请求标识,避免客户端在失败后无控制地立即重试,形成重试风暴。
六、缓存、降级、熔断和异步化
缓存可以减少重复请求对数据库和下游服务的压力,但缓存本身也可能成为攻击目标。应设置容量上限、过期时间、热点保护和缓存穿透防护;对不存在的数据可以使用短期空值缓存,对恶意随机参数可以限制查询范围。缓存预热和失效策略需要防止大量键同时过期造成缓存击穿。
降级是根据业务优先级主动关闭非核心能力。例如攻击或流量洪峰期间,暂时关闭推荐、历史统计、个性化排序和大图加载,保留下单、支付状态查询和身份安全功能。降级开关必须可审计、可回滚,并且避免把所有逻辑写成不可测试的紧急分支。
熔断用于保护故障或过载的下游依赖。当某个依赖持续超时或错误达到阈值时,调用方暂时停止请求,快速失败或使用备用数据,经过探测后再恢复。熔断阈值应区分接口和业务,不能把一次短暂网络抖动直接扩大为全链路不可用。
异步化把耗时任务从同步请求链路中移出。报表、批量导出、通知和图片处理可先返回任务编号,再由消息系统和后台工作者处理。异步化需要配合幂等、消息重试、死信处理和任务状态查询,否则只是把同步故障转移到消息系统。
七、强化 TCP/IP 堆栈的思路
网络和操作系统参数能够改善协议层抗压能力,但必须基于压测和运行环境调整。常见思路包括启用 SYN Cookie 或等效的半连接保护,合理设置连接队列和超时,限制单源并发连接,避免无界增长的文件描述符和内存,丢弃明显异常或不完整报文,使用反向代理隐藏真实应用节点,并通过负载均衡分散连接压力。
参数调优不能替代架构治理。盲目增大队列可能把压力推迟到后端,盲目缩短超时可能误伤移动网络和长轮询,盲目提高连接上限可能使内存耗尽。因此每一项参数都要结合正常流量基线、峰值、连接时长、请求大小、业务 SLA 和压测数据验证。
八、案例分析:票务平台遭遇接口型 DDoS
某票务平台在热门活动开售时出现大量请求。网络带宽没有完全打满,但登录、余票查询和下单接口延迟显著上升,数据库连接池接近耗尽。分析发现攻击者大量调用复杂余票查询,并不断创建新会话。
第一步应确认攻击范围和正常流量基线,区分网络层洪峰、连接异常、接口热点和数据库慢查询。第二步在高防或边界侧清洗明显异常流量,在网关按 IP、设备指纹、会话和接口实施组合限流,对未登录的高频请求增加挑战机制。第三步将余票查询改为缓存和读库隔离,限制查询时间范围和分页深度,避免一个请求触发多个复杂计算。第四步对下单保留高优先级资源和独立连接池,对推荐、历史订单等非核心功能降级。第五步对客户端重试策略进行治理,避免超时导致重复下单,并用幂等键保护交易。
方案的权衡是:更严格的验证码和限流会影响真实用户体验;缓存可能造成短暂数据延迟;读写隔离增加数据同步复杂度;专用资源会降低普通业务的峰值利用率。因此要通过压测、灰度发布和监控指标验证,重点观察成功率、P95/P99 延迟、数据库连接使用率、误拦截率和核心交易完成率。
九、应急响应与恢复
防御体系必须配套响应流程。监控发现异常后,先确认影响范围、攻击类型和当前资源瓶颈,再根据预案启用清洗、限流、验证码、降级、扩容或流量切换。操作应保留时间线、指令、规则版本、告警截图和关键指标,便于事后复盘和合规审计。
应急预案要明确谁有权限开关策略,谁负责通知运营商和业务方,谁评估误伤,谁决定回滚。防御规则不能只在事故发生时临时编写,应预先准备并定期演练。恢复阶段要逐步放开流量,观察后端依赖是否稳定,防止攻击尚未结束或积压请求突然释放造成二次故障。
十、课后练习
练习一:单项选择
某接口单个请求会触发复杂数据库聚合,攻击流量不大但数据库连接池持续耗尽。优先措施是( )。
A. 只增加网络带宽;B. 按接口和调用主体限流,并通过缓存、异步化或查询约束降低单请求成本;C. 关闭全部防火墙;D. 将所有请求重试次数调大。
答案:B。题目描述的是应用层资源耗尽,必须限制调用速率和单请求成本;增加带宽不能解决数据库瓶颈,重试会放大压力。
练习二:简答题
为什么拒绝服务防御需要分层设计?请至少写出四个层次及其职责。
参考答案:不同攻击消耗的资源和到达位置不同,单一防护设备无法同时处理链路拥塞、连接耗尽、应用语义攻击和下游依赖过载。可在运营商或高防层清洗超大流量,在网络边界过滤异常报文,在传输层保护半连接和会话资源,在网关层实施 WAF、限流和挑战,在应用层进行按用户和接口的配额、排队、熔断和降级,在数据层使用缓存、连接池隔离和异步化,最后由监控和应急流程负责发现、响应和恢复。
练习三:案例分析
某政务查询平台被大量未认证请求访问,攻击者不断改变查询参数,导致缓存命中率下降、数据库 CPU 飙升。请给出处理方案并说明可能的误伤风险。
参考答案:边界侧限制连接和源地址异常行为;网关针对未认证接口设置更严格的频率、并发和参数范围限制,必要时使用验证码或设备挑战;应用侧限制查询时间跨度、分页深度和排序字段,对不存在结果做短期空值缓存,对高频随机参数进行风控;数据库侧使用只读副本、查询超时、资源隔离和慢查询监控;对非核心统计功能降级。风险包括共享出口用户被误限、无障碍用户难以完成验证码、缓存短暂陈旧以及真实高峰被误判为攻击,因此需要白名单、动态阈值、灰度规则、误拦截监控和人工复核。
十一、论文素材
可以在论文中这样组织:针对系统面临的突发流量和应用层攻击风险,我以可用性目标为牵引建立分层防护体系。入口侧通过高防清洗、负载均衡和连接保护削减异常流量,网关侧按来源、身份、租户和接口实施组合限流,应用侧采用缓存、熔断、降级和异步化保护核心链路,数据侧通过读写隔离、连接池分区和查询约束避免关键依赖被拖垮。同时设置监控告警、应急开关、流量切换和定期演练机制,以成功率、P99 延迟、错误率、资源使用率和误拦截率持续验证防护效果。
写论文时要补充具体项目背景、资源瓶颈和结果指标。例如不要只写“进行了限流”,而应说明哪个接口、按什么维度限流、正常峰值是多少、阈值如何确定、超过阈值后返回什么、核心业务如何保障,以及上线后延迟和成功率发生了什么变化。
十二、今日复盘
拒绝服务防御的核心是保护可用性资源:先识别被耗尽的资源,再在尽可能靠前的位置拦截;对应用层攻击,必须结合身份、接口和业务语义;对后端依赖,要用限流、缓存、熔断、降级、隔离和异步化防止级联失效;对重大攻击,还要依靠清洗、切换、预案、演练和复盘形成运营闭环。下一篇进入 4.7.3 欺骗攻击与防御,重点学习伪造身份、诱导信任和通信欺骗的防护思路。