Cloud Armor同一后端WAF规则与速率限制规则共存配置问题咨询
问题描述
我为某后端服务配置了包含多条预配置WAF规则和一条速率限制规则的Cloud Armor策略,但遇到了优先级冲突问题:
- 若将预配置WAF规则设为更高优先级,即便遭遇大量合法请求的洪水攻击,速率限制规则也不会被触发;
- 若将速率限制规则设为更高优先级,虽能拦截洪水攻击,但低优先级的预配置WAF规则无法生效。
我使用siege和GoTestWaf进行了测试,结果如下:
- 当速率限制规则优先级更高时,siege请求达到阈值后会被拦截,但GoTestWaf报错提示:
WAF was not detected. Please use the '--blockStatusCodes' or '--blockRegex' flags. Use '--help' for additional info. Baseline attack status code: 200 - 当预配置WAF规则优先级更高时,siege请求始终不会被拦截,但GoTestWaf可正常检测到防火墙,完成测试并按预期拦截恶意请求。
预配置WAF规则为Cloud Armor的CRS 3.3规则,速率限制规则通过以下gcloud命令创建:
gcloud compute security-policies rules create 10000 \ --project=<GCP project> \ --security-policy=<Policy name> \ --expression="true" \ --action=rate-based-ban \ --rate-limit-threshold-count=120 \ --rate-limit-threshold-interval-sec=60 \ --ban-duration-sec=300 \ --conform-action=allow \ --exceed-action=deny-404 \ --enforce-on-key=IP
请问该现象的原因是什么?是否有其他方法可让两类规则作用于同一后端服务?
原因分析
Cloud Armor规则执行逻辑的核心限制:Cloud Armor规则按优先级从高到低匹配,一旦某条规则触发了终止性动作(如
allow、deny系列),后续低优先级规则会直接跳过,不再评估。- 预配置WAF规则优先级更高时:合法请求会被WAF规则直接
allow,速率限制规则根本没机会处理这些请求,自然无法触发限流。 - 速率限制规则优先级更高时:其
conform-action=allow会直接放行所有未超阈值的请求,低优先级的WAF规则得不到执行,GoTestWaf发送的恶意请求被直接放行,因此检测不到WAF存在。
- 预配置WAF规则优先级更高时:合法请求会被WAF规则直接
速率限制规则的表达式过于宽泛:你用
expression="true"意味着所有请求都会先经过这条规则,只要速率合规就直接放行,完全绕过了后续的WAF检测。
解决方案
要让两类规则同时生效,核心是打破“单规则终止后续评估”的逻辑,让合法请求既经过WAF检测,又接受速率限制,以下是可行方案:
方案1:修改速率限制规则的触发条件
调整速率限制规则的表达式,让它只对通过WAF检测的合法请求生效,同时把WAF规则优先级设为更高:
gcloud compute security-policies rules create 10000 \ --project=<GCP project> \ --security-policy=<Policy name> \ --expression="evaluatePreconfiguredExpr('crs-v33-strict')" \ --action=rate-based-ban \ --rate-limit-threshold-count=120 \ --rate-limit-threshold-interval-sec=60 \ --ban-duration-sec=300 \ --conform-action=allow \ --exceed-action=deny-404 \ --enforce-on-key=IP
这样:
- 恶意请求会被高优先级的WAF规则直接拦截;
- 合法请求通过WAF检测后,才会进入速率限制规则接受流量控制。
方案2:使用continue动作实现规则串联(推荐)
Cloud Armor支持continue动作,允许规则执行后继续评估后续低优先级规则,配置方式:
- 预配置WAF规则:将规则的动作设置为
continue(仅对恶意请求执行deny等终止动作,合法请求走continue); - 速率限制规则:保持现有配置,将优先级设为低于WAF规则。
这种方式下,合法请求会依次经过WAF检测和速率限制,恶意请求则在WAF阶段被拦截,两类规则互不干扰。
方案3:分层配置安全策略
创建两个独立的Cloud Armor策略,分别绑定到不同的防护节点:
- 第一个策略仅包含预配置WAF规则,绑定到负载均衡器的前端,负责恶意请求拦截;
- 第二个策略仅包含速率限制规则,绑定到后端服务的入口,负责流量限流。
通过分层防护,让两类规则在请求的不同阶段生效,从根源上避免优先级冲突。
验证建议
- 用siege发送超阈值的合法请求,确认速率限制规则正常触发拦截;
- 用GoTestWaf发送恶意请求,确认WAF规则正常拦截,工具不再报“未检测到WAF”的错误。
内容的提问来源于stack exchange,提问作者Gonzalo Aspee
相关产品推荐
相关产品推荐

