2. AWS WAF核心概念与架构

理解 AWS WAF 的关键,不是记住一堆名词,而是搞清楚这些对象在请求处理链路上各自站在什么位置、谁引用谁、谁产生什么数据。AWS WAF 的防护逻辑可以概括为一句话:Web ACL 是入口与总调度,规则是判断单元,规则组是可复用的规则集合,IP 集与正则模式集是规则可引用的匹配素材,标签是规则命中后向下游传递的标记,日志与指标是观察整个判断过程的两个窗口。

一、Web ACL:请求进入 WAF 的唯一入口

Web ACL(Web Access Control List)是 AWS WAF 的顶层资源,也是唯一可以关联到受保护资源的对象。它通过 AssociateWebACL 关联到 Amazon CloudFront 分配、Application Load Balancer、API Gateway REST API、AppSync GraphQL API 或 AWS App Runner 等资源。一个 Web ACL 只能关联到同一区域内的资源(CloudFront 使用 CLOUDFRONT 作用域,其余使用 REGIONAL 作用域)。

Web ACL 内部维护一个有序的规则列表,请求按顺序逐条评估。每条规则可以配置 Allow、Block、Count、CAPTCHA 或 Challenge 动作。默认动作(Default Action)在没有任何规则命中时生效,通常设为 Allow。这里有一个容易被忽略的细节:Allow 与 Block 都会终止后续规则评估,而 Count 只记录不终止,因此 Count 常被用于灰度上线前的观察阶段。

二、规则、规则组与匹配素材

规则(Rule)是判断的最小单元,由 Statement(匹配条件) 与 Action(动作) 组成。Statement 可以基于 IP 地址、地理来源、URI 路径、查询字符串、HTTP 头、Body、HTTP 方法等字段进行匹配,并支持 AND、OR、NOT 组合。

规则组(Rule Group)是规则的可复用容器,分为两类:托管规则组(如 AWSManagedRulesCommonRuleSet、AWSManagedRulesSQLiRuleSet)由 AWS 维护并持续更新;自定义规则组由用户创建,可在多个 Web ACL 中引用。规则组在 Web ACL 中以 RuleGroupReferenceStatement 形式出现,并可通过 ExcludedRules 排除其中个别规则,或通过 RuleActionOverrides 覆盖动作。

IP 集(IP Set)与正则模式集(Regex Pattern Set)是规则的“素材库”。IP 集存储 CIDR 列表(如 203.0.113.0/24),供 IPSetReferenceStatement 引用;正则模式集存储正则表达式(如 ^/admin/.*),供 RegexPatternSetReferenceStatement 引用。两者独立于规则存在,修改后所有引用它的规则立即生效,无需重新部署 Web ACL。

三、标签:规则之间的“信号传递”

标签(Label)是 AWS WAF 中实现规则联动的机制。当一条规则命中时,可以为其添加标签,格式形如 awswaf:managed:aws:common:untrusted 或自定义的 tenant:highrisk。后续规则可以通过 LabelMatchStatement 判断“前面是否打过某个标签”,从而做出更精细的决策。例如:先让托管规则组以 Count 模式运行并打标签,再用自定义规则对带特定标签的请求执行 Block。标签是请求级、单次评估内有效的,不会跨请求保留。

四、日志与指标:两个观察窗口

指标(Metrics)通过 CloudWatch 暴露,包括 AllowedRequests、BlockedRequests、CountedRequests、PassedRequests,可按 Web ACL、规则、规则组维度查看,适合做趋势监控与告警。日志(Logging)则记录每个请求的完整评估轨迹,包括命中规则、动作、标签、请求头、URI 等,可投递到 CloudWatch Logs、S3 或 Kinesis Data Firehose。日志用于事后取证与规则调优,指标用于实时感知。

客户端请求 HTTP/HTTPS 关联资源 CloudFront / ALB API Gateway Web ACL(有序规则列表) 规则1:IP 集匹配 Action: Block | 命中打标签 tenant:badip 规则2:正则模式集匹配 Action: Count | 命中打标签 tenant:sqli 规则3:标签匹配 LabelMatch: tenant:sqli → Block 规则4:托管规则组引用 AWSManagedRulesCommonRuleSet 默认动作:Allow(无规则命中时) IP 集 203.0.113.0/24 正则模式集 ^/admin/.* 自定义规则组 可跨 ACL 复用 日志 Logging S3 / CW Logs / Firehose 指标 Metrics CloudWatch 告警 标签传递 请求按规则顺序评估:Allow/Block 终止评估,Count 仅记录并继续;标签在单次评估内向下游规则传递

五、对象之间的引用关系与工程含义

把这些对象串起来看,引用关系是单向的:Web ACL 引用规则与规则组,规则引用 IP 集、正则模式集与标签条件,规则命中产生标签,整个评估过程产生日志与指标。这种设计带来两个工程上的好处:

  • 素材与逻辑解耦:IP 集和正则模式集可以独立更新,适合把“经常变的黑名单”与“相对稳定的判断逻辑”分开维护。
  • 规则组可复用:同一套自定义规则组可以挂到多个 Web ACL 上,配合 RuleActionOverrides 在不同环境(如测试环境 Count、生产环境 Block)使用不同动作。
实践建议:新上线规则时,先用 Count 模式运行 24~48 小时,通过 CloudWatch 的 CountedRequests 指标和 WAF 日志确认误报率,再切换为 Block。对于托管规则组,可先用 ExcludedRules 排除误报严重的单条规则,而不是整体关闭规则组。

六、一个可参考的规则编排示例

假设某公网业务需要防护 SQL 注入与恶意 IP,同时保留观察能力,可以按以下顺序组织 Web ACL 内的规则:

优先级规则/规则组匹配对象动作标签
1IP 集规则IPSet: bad-ip-setBlocktenant:badip
2正则规则RegexSet: sqli-patternCounttenant:sqli
3标签规则LabelMatch: tenant:sqliBlock—
4托管规则组AWSManagedRulesCommonRuleSetBlock—
—默认动作无命中Allow—

这个编排体现了标签的价值:第 2 条规则只做 Count 并打标签,第 3 条规则根据标签决定是否 Block。这样可以在不直接阻断的情况下,先观察正则规则的命中情况,再决定是否收紧。日志中会记录每条规则的命中与标签信息,指标中 CountedRequests 与 BlockedRequests 的比值就是判断规则是否过于激进的直接依据。

注意:Web ACL 的规则数量有配额限制(默认每条 Web ACL 最多 100 条规则引用,可通过 Service Quotas 申请提升)。规则组内的规则也计入总配额。设计时应优先使用规则组聚合逻辑,避免把大量单条规则直接堆在 Web ACL 中。

掌握这些对象的关系后,后续配置 WAF 时就能清楚每一步在操作哪个资源、影响哪条链路、应该去哪个窗口验证结果。Web ACL 决定“谁被保护”,规则与规则组决定“怎么判断”,IP 集与正则模式集提供“判断依据”,标签实现“规则联动”,日志与指标则回答“判断得对不对”。