对于SRE和运维老兵来说,最怕的不是写不出代码,而是深夜突如其来的 P0 级告警。
上周,我们业务线搞了一场春季促销活动。活动刚预热,监控大屏上数据库的CPU使用率直接飙红到 90% 以上,短信网关的余额也在以肉眼可见的速度疯狂流失。很明显,我们被黑产盯上了,核心 API 正在遭受海量的自动化 CC 攻击和恶意请求。
紧急关头,靠改 Nginx 配置重启已经来不及了(而且容易导致连接中断)。我们果断切到了前置部署的gmssh WAF 防火墙控制台进行应急响应。今天,就借着这次真实的攻防演练,给大家复盘一下,在业务生死存亡的 10 分钟里,我们是如何利用这套 WAF 完成极限救场的。
步骤一:研判局势,通过“防护事件”锁定攻击特征
出事后的第一反应绝对不能是盲目封 IP,必须先看日志找特征。打开 gmssh WAF 的“防护事件”面板,攻击者的底牌瞬间暴露无遗:
- 攻击源高度分散: 看着那一排排来自立陶宛、葡萄牙以及国内混杂的 IP,确认这是一次典型的僵尸网络(Botnet)分布式攻击,单纯靠拉黑几个源 IP 根本无济于事。
- 攻击手段混合: 日志显示,除了针对业务接口的高频访问,这群人甚至还在顺手用自动化工具扫我们的漏洞。从 22:59 到 23:01,短短两分钟内,WAF 就拦截了
XSS防御、命令执行拦截(试图 RCE)以及大量的恶意扫描器防御。 - WAF 的第一波自动防御: 庆幸的是,gmssh 的底层引擎足够敏锐。注意看截图中 22:59:56 的那条记录,WAF 的
机器人防护模块已经自动识别到了异常的高频爬虫行为,并果断触发了**“临时封锁”**状态,帮后端数据库抗下了第一波最致命的洪峰。
步骤二:止血操作,利用“全局配置”精准阻击
看懂了攻击手法,接下来就是“对症下药”。在不断流血的业务面前,我们需要的是秒级生效的策略。我们切到“全局配置”模块,打出了三张底牌:
- 开启 API CC 防御(定向限流):
黑产的目标很明确,就是我们的
/api/v1/activity/draw(抽奖接口)和发短信接口。传统 WAF 的全局限流容易误伤首页正常用户。我们在API CC 防御中,针对这两个重灾区接口单独设置了极其严格的令牌桶限流策略。由于规则与业务代码解耦,配置下发后瞬间生效,数据库的 QPS 压力直线下降。 - 祭出 URL 人机验证(绝杀自动化脚本):
部分高级爬虫使用了动态代理池,请求频率卡得很精妙,恰好绕过了 CC 阈值。对付这种“拟人化”脚本,我们直接针对核心交互 URL 开启了
URL人机验证。这一招属于降维打击:真实用户只需无感点一下验证码即可放行,而那些 Python 写的自动化发包脚本瞬间抓瞎,全部被拦截在边缘节点。 - 封堵资源消耗点:开启目录扫描防御
从日志里我们发现黑客在疯狂请求不存在的路径,试图爆破后台地址,产生了大量的 404 错误。这极大地消耗了 Nginx 的 Worker 线程。开启
目录扫描防御后,WAF 自动将这种恶意产生 404 链接的访问者拉黑,极大地释放了服务器的连接数。
步骤三:战后观察,大屏监控验证“战果”
一顿操作猛如虎,到底有没有真正止血?这时候就轮到首页的“WAF大屏”出场了。
在应急响应的后半段,我们团队紧盯着这个可视化看板:
- 看着“实时拦截监控”的曲线上,红色的“攻击数”飙升,而蓝色的后端“请求数”恢复到平稳健康的水平;
- 看着“今日清洗流量”的数据不断上涨,我们悬着的心终于放了下来。
这个大屏不仅是我们排障时的“定心丸”,更是第二天写事故复盘报告、向技术总监汇报挽回了多少业务损失的直接数据图表来源。
总结与反思
经历了那个惊魂的夜晚,我最大的感触是:在云原生和微服务时代,业务的安全防线必须前置。
不要指望在业务代码里写那些脆弱的防刷逻辑,也不要再靠运维手敲 Nginx Lua 脚本来应急。像 gmssh WAF 这样,具备细粒度 API 管控、智能人机识别,且能够可视化溯源的专业安全基建,才是保障 SRE 团队不脱发、保障业务高可用(SLA)的真正利器。