# Implementing Cloud Waf Rules

> 部署和调优 AWS WAF、Azure WAF 和 Cloudflare 上的 Web 应用防火墙规则，保护云托管应用免受 OWASP Top 10 攻击。详细介绍配置托管规则集、创建业务逻辑保护自定义规则、实施速率限制、部署机器人管理，以及通过规则调优和日志分析减少误报。

- Skill: `killvxk/implementing-cloud-waf-rules` (Agent Skill, multi-file: 4 files)
- Install (CLI): `npx skillmds@latest add killvxk/implementing-cloud-waf-rules`
- Raw SKILL.md: https://api.skillmd.com/api/skills/killvxk/implementing-cloud-waf-rules/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: DevOps & Infra
- License: Apache-2.0
- Author: killvxk (https://skillmd.com/u/killvxk)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/killvxk/implementing-cloud-waf-rules

---


# 实施云 WAF 规则

## 适用场景

- 在云负载均衡器后部署需要 OWASP 保护的新 Web 应用或 API 时
- 应用渗透测试发现 SQL 注入、XSS 或其他注入漏洞时
- 遭受针对认证端点的暴力破解、凭据填充或机器人攻击时
- 合规要求（如 PCI-DSS）强制要求部署 WAF 时
- 调优 WAF 规则以减少阻断合法应用流量的误报时

**不适用于**：网络级 DDoS 防护（使用 AWS Shield 或 Azure DDoS Protection）、API 认证设计（参见 managing-cloud-identity-with-okta），或应用代码级安全修复（WAF 是补偿控制，不能替代安全编码）。

## 前置条件

- 已配置 AWS ALB/CloudFront、Azure Application Gateway 或 Cloudflare 作为应用入口点
- WAF 部署前的应用流量日志用于基线分析
- 用于在生产执行前验证 WAF 规则的测试环境
- 了解应用请求模式以最小化误报

## 工作流程

### 步骤 1：部署托管规则集

启用涵盖 OWASP Top 10 漏洞的云提供商托管规则集。在切换到阻断（Block）模式之前，先在计数（Count，检测）模式下运行。

```bash
# AWS WAF：使用 AWS 托管规则创建 Web ACL
aws wafv2 create-web-acl \
  --name production-waf \
  --scope REGIONAL \
  --default-action '{"Allow": {}}' \
  --visibility-config '{
    "SampledRequestsEnabled": true,
    "CloudWatchMetricsEnabled": true,
    "MetricName": "production-waf"
  }' \
  --rules '[
    {
      "Name": "AWSManagedRulesCommonRuleSet",
      "Priority": 1,
      "Statement": {
        "ManagedRuleGroupStatement": {
          "VendorName": "AWS",
          "Name": "AWSManagedRulesCommonRuleSet"
        }
      },
      "OverrideAction": {"Count": {}},
      "VisibilityConfig": {
        "SampledRequestsEnabled": true,
        "CloudWatchMetricsEnabled": true,
        "MetricName": "CommonRuleSet"
      }
    },
    {
      "Name": "AWSManagedRulesSQLiRuleSet",
      "Priority": 2,
      "Statement": {
        "ManagedRuleGroupStatement": {
          "VendorName": "AWS",
          "Name": "AWSManagedRulesSQLiRuleSet"
        }
      },
      "OverrideAction": {"Count": {}},
      "VisibilityConfig": {
        "SampledRequestsEnabled": true,
        "CloudWatchMetricsEnabled": true,
        "MetricName": "SQLiRuleSet"
      }
    },
    {
      "Name": "AWSManagedRulesKnownBadInputsRuleSet",
      "Priority": 3,
      "Statement": {
        "ManagedRuleGroupStatement": {
          "VendorName": "AWS",
          "Name": "AWSManagedRulesKnownBadInputsRuleSet"
        }
      },
      "OverrideAction": {"Count": {}},
      "VisibilityConfig": {
        "SampledRequestsEnabled": true,
        "CloudWatchMetricsEnabled": true,
        "MetricName": "KnownBadInputs"
      }
    }
  ]'
```

### 步骤 2：创建自定义速率限制规则

部署基于速率的规则，保护登录端点免受暴力破解和凭据填充攻击。

```bash
# 登录端点速率限制规则（每 IP 每 5 分钟 100 次请求）
aws wafv2 update-web-acl \
  --name production-waf \
  --scope REGIONAL \
  --id <web-acl-id> \
  --lock-token <lock-token> \
  --default-action '{"Allow": {}}' \
  --rules '[
    {
      "Name": "RateLimitLogin",
      "Priority": 0,
      "Statement": {
        "RateBasedStatement": {
          "Limit": 100,
          "AggregateKeyType": "IP",
          "ScopeDownStatement": {
            "ByteMatchStatement": {
              "FieldToMatch": {"UriPath": {}},
              "PositionalConstraint": "STARTS_WITH",
              "SearchString": "/api/auth/login",
              "TextTransformations": [{"Priority": 0, "Type": "LOWERCASE"}]
            }
          }
        }
      },
      "Action": {"Block": {"CustomResponse": {"ResponseCode": 429}}},
      "VisibilityConfig": {
        "SampledRequestsEnabled": true,
        "CloudWatchMetricsEnabled": true,
        "MetricName": "RateLimitLogin"
      }
    }
  ]'
```

### 步骤 3：配置地理封锁和 IP 声誉

阻断来自应用没有合法用户的国家的流量，并利用 IP 声誉列表阻断已知恶意来源。

```bash
# AWS WAF：地理封锁规则
# 阻断不在允许列表中的国家
aws wafv2 create-ip-set \
  --name blocked-ips \
  --scope REGIONAL \
  --ip-address-version IPV4 \
  --addresses "198.51.100.0/24" "203.0.113.0/24"

# 添加 Amazon IP 声誉规则
# AWSManagedRulesAmazonIpReputationList 阻断被 AWS 威胁情报标记的 IP
```

### 步骤 4：调优规则以减少误报

在计数模式下分析 WAF 日志，识别被标记的合法请求。为特定 URI 路径或请求模式创建规则例外。

```bash
# 启用 WAF 日志到 S3
aws wafv2 put-logging-configuration \
  --logging-configuration '{
    "ResourceArn": "arn:aws:wafv2:us-east-1:123456789012:regional/webacl/production-waf/id",
    "LogDestinationConfigs": ["arn:aws:s3:::waf-logs-bucket"],
    "RedactedFields": [{"SingleHeader": {"Name": "authorization"}}]
  }'

# 使用 Athena 查询 WAF 日志以发现误报
# 查找最频繁触发合法流量的规则
cat << 'EOF' > waf-analysis.sql
SELECT
  terminatingRuleId,
  httpRequest.uri,
  httpRequest.httpMethod,
  COUNT(*) as block_count
FROM waf_logs
WHERE action = 'BLOCK'
  AND timestamp > date_add('day', -7, now())
GROUP BY terminatingRuleId, httpRequest.uri, httpRequest.httpMethod
ORDER BY block_count DESC
LIMIT 20
EOF
```

```bash
# 从导致误报的托管规则集中排除特定规则
# 示例：为文件上传端点排除 SizeRestrictions_BODY
aws wafv2 update-web-acl \
  --name production-waf \
  --scope REGIONAL \
  --id <web-acl-id> \
  --lock-token <lock-token> \
  --rules '[{
    "Name": "AWSManagedRulesCommonRuleSet",
    "Priority": 1,
    "Statement": {
      "ManagedRuleGroupStatement": {
        "VendorName": "AWS",
        "Name": "AWSManagedRulesCommonRuleSet",
        "ExcludedRules": [{"Name": "SizeRestrictions_BODY"}]
      }
    },
    "OverrideAction": {"None": {}},
    "VisibilityConfig": {
      "SampledRequestsEnabled": true,
      "CloudWatchMetricsEnabled": true,
      "MetricName": "CommonRuleSet"
    }
  }]'
```

### 步骤 5：验证后切换到阻断模式

经过 7-14 天的计数模式且误报率可接受后，将托管规则切换到阻断模式进行主动防护。

```bash
# 将 OverrideAction 从 Count 更改为 None（使用规则组的默认阻断操作）
# 将每个托管规则组从 {"Count": {}} 更新为 {"None": {}}
# 监控 CloudWatch 指标，观察被阻断请求量的突然变化
```

## 核心概念

| 术语 | 定义 |
|------|------|
| Web ACL（Web 访问控制列表） | 定义针对受保护资源每个 HTTP 请求进行评估的规则集 |
| 托管规则组（Managed Rule Group） | 由云提供商或第三方供应商维护的预配置规则集，涵盖常见攻击模式 |
| 基于速率的规则（Rate-Based Rule） | 跟踪每 IP 地址请求速率的 WAF 规则，阻断在时间窗口内超过阈值的 IP |
| 计数模式（Count Mode） | WAF 操作，记录匹配请求但不阻断，用于执行前的规则验证 |
| 规则优先级（Rule Priority） | 确定规则评估顺序的数字排序，数字越小优先级越高 |
| 自定义响应（Custom Response） | WAF 在阻断请求时返回特定 HTTP 状态码和标头的功能 |
| 范围限定语句（Scope-Down Statement） | 将基于速率的规则缩小到特定 URI 路径、方法或标头的条件 |
| 误报（False Positive） | WAF 规则错误阻断的合法请求，需要规则调优或排除处理 |

## 工具与系统

- **AWS WAF**：与 ALB、CloudFront、API Gateway 和 AppSync 集成的云原生 WAF
- **Azure WAF**：Application Gateway 或 Front Door 上具有 OWASP CRS 规则集的 Web 应用防火墙
- **AWS Firewall Manager**：跨 Organization 中多个 AWS 账户的集中化 WAF 策略管理
- **WAF Security Automations**：基于日志分析自动更新 WAF 规则的 AWS Lambda 解决方案
- **CloudWatch 指标**：用于跟踪 WAF 规则匹配率、阻断计数和允许请求的监控仪表盘

## 常见场景

### 场景：针对认证 API 的凭据填充攻击

**场景背景**：一个电子商务应用每小时遭受来自僵尸网络使用盗取凭据列表的 5 万次登录尝试。攻击者每隔几分钟轮换源 IP 以规避简单的基于 IP 的阻断。

**方法**：
1. 部署基于速率的规则，将登录端点请求限制为每 IP 每 5 分钟 10 次
2. 启用 AWS WAF Bot Control 托管规则组，检测 IP 轮换之外的自动请求模式
3. 添加自定义规则，要求登录失败超过 5 次的请求提供有效 CAPTCHA 令牌
4. 使用 AWSManagedRulesAmazonIpReputationList 实施 IP 声誉阻断
5. 创建匹配凭据填充工具常见 User-Agent 模式的自定义规则
6. 监控被阻断请求指标，根据合法流量模式调整阈值

**常见陷阱**：设置速率限制过于激进会阻断共享 NAT IP 背后的合法用户。仅通过 User-Agent 阻断很容易被轮换代理字符串绕过。

## 输出格式

```
云 WAF 配置报告
================================
Web ACL: production-waf
范围: 区域性（us-east-1）
受保护资源: ALB（arn:aws:elasticloadbalancing:...）
报告日期: 2025-02-23

规则配置:
  [P0] RateLimitLogin          - 阻断（每 IP 每 5 分钟 100 次）
  [P1] AWSManagedRulesCommon   - 阻断（1 个排除: SizeRestrictions_BODY）
  [P2] AWSManagedRulesSQLi     - 阻断
  [P3] AWSManagedRulesKnownBad - 阻断
  [P4] AWSManagedRulesBotControl - 计数（评估阶段）
  [P5] GeoBlockRule            - 阻断（已阻断 12 个国家）

流量分析（过去 7 天）:
  请求总数:    2,847,293
  允许:        2,791,456（98.0%）
  阻断:           51,234（1.8%）
  计数:            4,603（0.2%）

TOP 阻断规则:
  RateLimitLogin:              23,456 次阻断（45.8%）
  SQLi 检测:                    8,234 次阻断（16.1%）
  CommonRuleSet（XSS）:         7,891 次阻断（15.4%）
  GeoBlockRule:                 6,543 次阻断（12.8%）
  KnownBadInputs:               5,110 次阻断（10.0%）

误报分析:
  报告的误报: 3
  确认的误报: 1（/api/upload 的 SizeRestrictions_BODY）
  已采取措施: 已应用规则排除
```

