AWS WAF:保留GenericRFI_BODY规则前提下为自有域名添加例外的实现方法
配置错误原因
你现有配置不生效主要有3个核心问题:
- 规则执行顺序错误:AWS WAF的规则优先级数值越小,执行顺序越靠前。你当前托管规则集优先级为0,自定义规则优先级为1,托管规则会先执行直接拦截命中GenericRFI_BODY的请求,自定义规则根本不会触发。
- 规则动作错误:你写的自定义规则动作是
Block,和你要放行自有域名的需求完全相反。 - ByteMatchStatement配置语法错误:
JsonBody下的MatchPattern是用来指定匹配JSON的范围(比如全量值、指定路径),不是填要匹配的字符串,目标匹配内容需要写到SearchString字段中。
正确配置方案
我们采用「托管规则打标签+自定义规则二次拦截」的逻辑实现需求,既保留GenericRFI_BODY的检测能力,又放行自有域名的合法请求:
步骤1:修改原有托管规则集配置,覆盖GenericRFI_BODY的动作为Count
修改后的AWS公共规则集配置如下,仅对命中GenericRFI_BODY的请求打标签,不直接拦截:
Priority: 0 Statement: ManagedRuleGroupStatement: VendorName: AWS Name: AWSManagedRulesCommonRuleSet # 新增规则级覆盖配置,仅把GenericRFI_BODY的动作改为Count RuleActionOverrides: - Name: GenericRFI_BODY ActionToUse: Count: {} OverrideAction: None: {} VisibilityConfig: SampledRequestsEnabled: true CloudWatchMetricsEnabled: true MetricName: AWS-AWSManagedRulesCommonRuleSet
步骤2:添加自定义拦截规则,优先级低于托管规则(数值更大)
该规则会对已经命中GenericRFI_BODY标签的请求做二次校验:如果请求JSON值中不包含自有域名,就执行拦截,包含则放行:
- Name: BlockExternalRFIExceptOwnDomain Priority: 1 Statement: AndStatement: Statements: # 匹配命中GenericRFI_BODY标签的请求 - LabelMatchStatement: Scope: LABEL Key: awswaf:managed:aws:common-rule-set:signal:genericRFI_BODY # 匹配请求JSON值中不包含自有域名的请求 - NotStatement: Statement: ByteMatchStatement: SearchString: "https://example.com" FieldToMatch: JsonBody: MatchPattern: # 匹配所有JSON值 All: {} MatchScope: VALUE PositionalConstraint: CONTAINS TextTransformations: - Priority: 0 Type: NONE # 仅拦截不符合要求的外部链接请求 Action: Block: {} VisibilityConfig: SampledRequestsEnabled: true CloudWatchMetricsEnabled: true MetricName: BlockExternalRFIExceptOwnDomain
额外注意事项
- 如果你的请求体不只有JSON格式,把
FieldToMatch下的JsonBody改为Body即可匹配全量请求体内容 - 如果有多个自有域名,在
NotStatement下新增OrStatement,把多个域名的ByteMatch规则放到Or语句里即可 - 可以新增
URL_DECODE、HTML_ENTITY_DECODE等文本转换规则,避免攻击者用编码绕过检测
内容的提问来源于stack exchange,提问作者xtra
相关产品推荐
相关产品推荐

