生产环境 P0 级事故复盘:核心 API 深夜被刷,靠这个工具极限救场

0 阅读4分钟

对于SRE和运维老兵来说,最怕的不是写不出代码,而是深夜突如其来的 P0 级告警。

上周,我们业务线搞了一场春季促销活动。活动刚预热,监控大屏上数据库的CPU使用率直接飙红到 90% 以上,短信网关的余额也在以肉眼可见的速度疯狂流失。很明显,我们被黑产盯上了,核心 API 正在遭受海量的自动化 CC 攻击和恶意请求。

紧急关头,靠改 Nginx 配置重启已经来不及了(而且容易导致连接中断)。我们果断切到了前置部署的gmssh WAF 防火墙控制台进行应急响应。今天,就借着这次真实的攻防演练,给大家复盘一下,在业务生死存亡的 10 分钟里,我们是如何利用这套 WAF 完成极限救场的。

截屏2026-03-30 16.43.08.png

步骤一:研判局势,通过“防护事件”锁定攻击特征

出事后的第一反应绝对不能是盲目封 IP,必须先看日志找特征。打开 gmssh WAF 的“防护事件”面板,攻击者的底牌瞬间暴露无遗:

  • 攻击源高度分散: 看着那一排排来自立陶宛、葡萄牙以及国内混杂的 IP,确认这是一次典型的僵尸网络(Botnet)分布式攻击,单纯靠拉黑几个源 IP 根本无济于事。
  • 攻击手段混合: 日志显示,除了针对业务接口的高频访问,这群人甚至还在顺手用自动化工具扫我们的漏洞。从 22:59 到 23:01,短短两分钟内,WAF 就拦截了 XSS防御命令执行拦截(试图 RCE)以及大量的 恶意扫描器防御
  • WAF 的第一波自动防御: 庆幸的是,gmssh 的底层引擎足够敏锐。注意看截图中 22:59:56 的那条记录,WAF 的 机器人防护 模块已经自动识别到了异常的高频爬虫行为,并果断触发了**“临时封锁”**状态,帮后端数据库抗下了第一波最致命的洪峰。

步骤二:止血操作,利用“全局配置”精准阻击

看懂了攻击手法,接下来就是“对症下药”。在不断流血的业务面前,我们需要的是秒级生效的策略。我们切到“全局配置”模块,打出了三张底牌:

waf全局配置.png

  1. 开启 API CC 防御(定向限流): 黑产的目标很明确,就是我们的 /api/v1/activity/draw(抽奖接口)和发短信接口。传统 WAF 的全局限流容易误伤首页正常用户。我们在 API CC 防御 中,针对这两个重灾区接口单独设置了极其严格的令牌桶限流策略。由于规则与业务代码解耦,配置下发后瞬间生效,数据库的 QPS 压力直线下降。
  2. 祭出 URL 人机验证(绝杀自动化脚本): 部分高级爬虫使用了动态代理池,请求频率卡得很精妙,恰好绕过了 CC 阈值。对付这种“拟人化”脚本,我们直接针对核心交互 URL 开启了 URL人机验证。这一招属于降维打击:真实用户只需无感点一下验证码即可放行,而那些 Python 写的自动化发包脚本瞬间抓瞎,全部被拦截在边缘节点。
  3. 封堵资源消耗点:开启目录扫描防御 从日志里我们发现黑客在疯狂请求不存在的路径,试图爆破后台地址,产生了大量的 404 错误。这极大地消耗了 Nginx 的 Worker 线程。开启 目录扫描防御 后,WAF 自动将这种恶意产生 404 链接的访问者拉黑,极大地释放了服务器的连接数。

步骤三:战后观察,大屏监控验证“战果”

一顿操作猛如虎,到底有没有真正止血?这时候就轮到首页的“WAF大屏”出场了。

在应急响应的后半段,我们团队紧盯着这个可视化看板:

  • 看着“实时拦截监控”的曲线上,红色的“攻击数”飙升,而蓝色的后端“请求数”恢复到平稳健康的水平;
  • 看着“今日清洗流量”的数据不断上涨,我们悬着的心终于放了下来。

这个大屏不仅是我们排障时的“定心丸”,更是第二天写事故复盘报告、向技术总监汇报挽回了多少业务损失的直接数据图表来源。

总结与反思

经历了那个惊魂的夜晚,我最大的感触是:在云原生和微服务时代,业务的安全防线必须前置。

不要指望在业务代码里写那些脆弱的防刷逻辑,也不要再靠运维手敲 Nginx Lua 脚本来应急。像 gmssh WAF 这样,具备细粒度 API 管控、智能人机识别,且能够可视化溯源的专业安全基建,才是保障 SRE 团队不脱发、保障业务高可用(SLA)的真正利器。