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=Block

IP set 练习:在模板 DenyIPv4.Properties.Addresses 中加入自己测试出口的 /32,重新部署;验证日志命中 DenyIPv4 后恢复 [] 并部署。不要填企业共享 NAT 出口用于生产验证。IPv6 应另建 IPV6 集合,单条地址用 /128。

本实验直接访问 ALB;如果前面还有 CDN,AggregateKeyType: IP 可能统计的是代理来源,先按 客户端 IP 原则调整。

5. 托管规则与误报处理#

  1. 在 Count 模式回放脱敏的合法请求集:登录、JSON API、富文本、文件上传、Webhook。
  2. 查询日志中的 ruleGroupList、nonTerminatingMatchingRules 和 labels,定位具体组内规则。
  3. 对合法误报,将该组内规则通过 RuleActionOverrides 改为 Count;其余规则保持默认动作。
  4. 若只允许特定路径例外,用后置 LabelMatchStatement AND NOT 业务例外条件 再阻断其他命中;不要把整个路径前置 Allow。
  5. 回放通过后,将 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、规则订阅和日志需单独清理。

搜索文档

输入关键词,搜索所有文档。

↑ ↓ 选择 · Enter 打开 · Esc 关闭