AWS WAF Hands-on
验证:未记录
- 适用版本
- 未记录
- 验证范围
- 尚未登记验证记录。
本文缩写(英文全称与中文含义)
| 缩写 | 英文全称/名称 | 中文含义 |
|---|---|---|
| ACFP | Account Creation Fraud Prevention | AWS WAF 账号创建欺诈防护 |
| ALB | Application Load Balancer | 应用负载均衡器 |
| API | Application Programming Interface | 应用程序编程接口 |
| ARN | Amazon Resource Name | AWS 资源名称,用于唯一标识资源 |
| ASN | Autonomous System Number | 自治系统编号 |
| ATP | Account Takeover Prevention | AWS WAF 账号接管防护 |
| AWS | Amazon Web Services | 亚马逊云服务 |
| CAPTCHA | Completely Automated Public Turing test to tell Computers and Humans Apart | 区分人与机器的自动化验证 |
| CDN | Content Delivery Network | 内容分发网络 |
| CLI | Command-Line Interface | 命令行接口 |
| DDoS | Distributed Denial of Service | 分布式拒绝服务攻击 |
| HTTP | Hypertext Transfer Protocol | 超文本传输协议 |
| IaC | Infrastructure as Code | 基础设施即代码 |
| IP | Internet Protocol | 网际协议;IP 地址是网络寻址标识 |
| JS | JavaScript | JavaScript 编程语言 |
| JSON | JavaScript Object Notation | 一种结构化数据格式 |
| NAT | Network Address Translation | 网络地址转换 |
| OU | Organizational Unit | 组织单元 |
| REST | Representational State Transfer | 表述性状态转移,一种接口架构风格 |
| SDK | Software Development Kit | 软件开发工具包 |
| WAF | Web Application Firewall | Web 应用防火墙 |
1. 实验范围#
使用独立测试 ALB,完成:部署 WebACL、确定性阻断、限速观察、托管规则调优、日志查询、回滚和清理。高级场景按第 7 节逐项练习。
前提:AWS CLI v2、Bash、同 Region 的测试 ALB;ALB 已有可访问路由 /waf-lab,返回固定 200。执行身份需有 CloudFormation、WAFv2、ALB 关联、CloudWatch Logs 及日志投递策略配置权限。使用专门实验角色,不授予长期管理员权限。
本实验创建收费 WAF 和日志资源,不创建 ALB,不启用 Shield Advanced。测试 ALB 不能已有 WebACL;替换现有生产关联会影响防护。
2. 部署#
下载 waf-alb-lab.yaml,保存到当前目录。模板默认:托管规则 Count、限速 Count;只有实验 Header 和非空拒绝 IP 集合会阻断。
export AWS_PROFILE=lab
export AWS_REGION=ap-southeast-1
export WAF_LAB_STACK=waf-alb-lab
export WAF_LAB_ALB_ARN='arn:aws:elasticloadbalancing:ap-southeast-1:123456789012:loadbalancer/app/lab/REPLACE_ME'
export WAF_LAB_URL='https://lab.example.com'
aws sts get-caller-identity
aws wafv2 get-web-acl-for-resource --resource-arn "$WAF_LAB_ALB_ARN"核对账号、Region 和 ARN,确认没有已有 WebACL 后部署。
aws cloudformation deploy --stack-name "$WAF_LAB_STACK" --template-file waf-alb-lab.yaml --parameter-overrides AlbArn="$WAF_LAB_ALB_ARN" ManagedMode=Count RateMode=Count
aws cloudformation describe-stacks --stack-name "$WAF_LAB_STACK" --query 'Stacks[0].Outputs'
aws wafv2 get-web-acl-for-resource --resource-arn "$WAF_LAB_ALB_ARN"等待关联传播后再验证。若部署失败,查看 stack events;常见原因是 Region 不一致、关联已有 WebACL、权限不足或日志资源策略创建失败。
3. 确定性验证#
# 正常请求:预期 200。
curl -sS -o /dev/null -w '%{http_code}\n' "$WAF_LAB_URL/waf-lab"
# 带实验 Header:预期 403。
curl -sS -o /dev/null -w '%{http_code}\n' -H 'x-waf-lab: block' "$WAF_LAB_URL/waf-lab"
aws logs tail "aws-waf-logs-$WAF_LAB_STACK" --since 10m日志应显示 action=BLOCK、terminatingRuleId=LabHeaderBlock。单看 HTTP 403 不足以证明 WAF 命中,源站也可能返回 403。
4. Rate-based 与 IP set#
模板仅对 /waf-lab 统计同一来源 IP 的请求:100 次 / 60 秒,初始 Count。先检查业务基线,再在自己的测试入口用有界请求观察命中:
for i in $(seq 1 150); do
curl -sS --max-time 3 -o /dev/null "$WAF_LAB_URL/waf-lab"
sleep 0.2
done有延迟或窗口内未达到阈值时,可能看不到命中;通过日志和指标判断,不要求第 101 次必定阻断。确认后把限速改为 Block,托管规则仍保持 Count:
aws cloudformation deploy --stack-name "$WAF_LAB_STACK" --template-file waf-alb-lab.yaml --parameter-overrides AlbArn="$WAF_LAB_ALB_ARN" ManagedMode=Count RateMode=BlockIP set 练习:在模板 DenyIPv4.Properties.Addresses 中加入自己测试出口的 /32,重新部署;验证日志命中 DenyIPv4 后恢复 [] 并部署。不要填企业共享 NAT 出口用于生产验证。IPv6 应另建 IPV6 集合,单条地址用 /128。
本实验直接访问 ALB;如果前面还有 CDN,AggregateKeyType: IP 可能统计的是代理来源,先按 客户端 IP 原则调整。
5. 托管规则与误报处理#
- 在 Count 模式回放脱敏的合法请求集:登录、JSON API、富文本、文件上传、Webhook。
- 查询日志中的
ruleGroupList、nonTerminatingMatchingRules和labels,定位具体组内规则。 - 对合法误报,将该组内规则通过
RuleActionOverrides改为 Count;其余规则保持默认动作。 - 若只允许特定路径例外,用后置
LabelMatchStatement AND NOT 业务例外条件再阻断其他命中;不要把整个路径前置 Allow。 - 回放通过后,将
ManagedMode=Enforce部署,按业务错误率持续观察;需要回滚时重新部署ManagedMode=Count。
以下片段放在模板 CommonRules.Statement.ManagedRuleGroupStatement 下,仅示范如何覆盖上传尺寸规则;生产先确认实际命中的规则名称:
RuleActionOverrides:
- Name: SizeRestrictions_BODY
ActionToUse:
Count: {}正式切为 Enforce 的完整命令:
aws cloudformation deploy --stack-name "$WAF_LAB_STACK" --template-file waf-alb-lab.yaml --parameter-overrides AlbArn="$WAF_LAB_ALB_ARN" ManagedMode=Enforce RateMode=Block控制台临时修改后应回写 IaC。直接调用 update-web-acl / update-ip-set 时先 GET 当前对象并使用最新 LockToken,保留完整现有配置;不要用残缺 JSON 覆盖生产规则。
6. 查询与告警#
在 CloudWatch Logs Insights 选择实验日志组,统计动作和终止规则:
fields @timestamp, action, terminatingRuleId, httpRequest.clientIp, httpRequest.uri
| stats count(*) as requests by action, terminatingRuleId
| sort requests desc定位被阻断路径和来源:
fields @timestamp, action, httpRequest.clientIp, httpRequest.uri
| filter action = "BLOCK"
| stats count(*) as blocked by httpRequest.clientIp, httpRequest.uri
| sort blocked desc
| limit 20以 BlockedRequests 突增、允许流量骤降、ALB 5xx 和关键业务失败率组合告警。Count 规则可能产生非终止命中,不能仅按日志顶层 action=COUNT 查找所有 Count 命中。
7. 高级功能练习#
每项先在独立实验 WebACL 中 Count 或仅作用于实验路径,验证后再推广。
| 场景 | 配置步骤 | 验收 |
|---|---|---|
| CloudFront | 在 us-east-1 建 CLOUDFRONT WebACL;更新 distribution 的 WebACL ARN |
CloudFront 域名命中;直接访问源站被限制 |
| API Gateway | 创建同区 Regional WebACL,关联 REST API stage | 经实际 stage 域名访问时有日志;HTTP API 不直接套用 |
| Geo / ASN / 正则 | Rule builder 选择条件,scope 到测试路径,设置 Count | 命中标签、来源和转换结果符合预期 |
| JSON / Oversize | 指定 JSON 字段,配置解析失败和超长处理;提交合法、异常 JSON 及超长正文 | 规则与应用行为一致,无上传误拦 |
| 自定义阻断 | 给实验规则设置 429、自定义 JSON 响应和必要响应头 | 客户端识别限流,响应不暴露规则细节 |
| CAPTCHA / Challenge | 测试浏览器路径添加动作,配置 token domain 和免验证时长;按需集成 JS / CAPTCHA SDK | 无 token 触发验证,有效 token 后继续检查;curl 不作为浏览器通过标准 |
| Bot Control | 添加 Common,查看分类 labels;需要时试 Targeted,scope 到抓取敏感路径 | 已验证搜索引擎与真实用户正常,恶意自动化被识别 |
| ATP | 配置登录路径、凭据字段、受支持的结果反馈 | 使用合成测试账号验证正常登录与失败登录指标 |
| ACFP | 配置注册路径及用户字段、客户端集成和受支持的响应检查 | 正常注册不误拦,异常注册可定位 |
| Anti-DDoS | 添加 AWSManagedRulesAntiDDoSRuleSet,先 Count;按客户端类型设置 Block / Challenge 与路径例外 |
正常流量与标签可见,机器 API 不被浏览器验证破坏 |
| Labels / 自定义组 | 前置规则产生标签,后置标签规则执行动作;建 rule group 复用 | 顺序正确,例外不绕过其他组 |
| 多账号基线 | Firewall Manager 在实验 OU 下发策略,先观察合规再启用自动修复 | 新建测试入口自动纳管,例外标签可审计 |
这些练习不需要发送真实攻击流量。ATP、ACFP、Bot、Anti-DDoS 和验证码类能力可能单独计费,添加前核对对应定价及支持入口。托管规则、Anti-DDoS 配置
8. 清理与生产迁移#
只删除本实验 stack:它会删除关联、WebACL、IP set 和实验日志,不删除已有 ALB。先导出需要保留的日志,并确认该 WebACL 没有关联其他资源。
aws cloudformation delete-stack --stack-name "$WAF_LAB_STACK"
aws cloudformation wait stack-delete-complete --stack-name "$WAF_LAB_STACK"
aws wafv2 get-web-acl-for-resource --resource-arn "$WAF_LAB_ALB_ARN"生产迁移时删除 LabHeaderBlock,用真实接口和基线替换实验限速,补齐 IPv6、告警、日志留存、规则版本和误报回滚流程。高级练习中额外建立的 WebACL、规则订阅和日志需单独清理。