doctena-org/octorules-aws

GitHub: doctena-org/octorules-aws

这是一个基于 YAML 配置文件管理 AWS WAF v2 Web ACL 规则、规则组及 IP 集的 Python 提供程序。

Stars: 1 | Forks: 0

# octorules-aws [octorules](https://github.com/doctena-org/octorules) 的 AWS WAF v2 提供程序 — 以 YAML 格式管理 AWS WAF Web ACL 规则、规则组和 IP 集。 ## 安装 ``` pip install octorules-aws ``` 这将安装 octorules(核心)和 octorules-aws。提供程序会被自动发现 — 配置中不需要 `class:`。 ## 配置 ``` providers: aws: region: us-east-1 waf_scope: REGIONAL rules: directory: ./rules zones: my-web-acl: sources: - rules ``` 每个区域名称映射到一个 AWS WAF Web ACL 名称。提供程序在运行时将 Web ACL 名称解析为 ID。 ### 身份验证 AWS 凭证通过标准的 [boto3 凭证链](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/credentials.html) 进行解析 — 配置文件中不需要 token。常用选项: - **环境变量**:`AWS_ACCESS_KEY_ID` + `AWS_SECRET_ACCESS_KEY` - **共享凭证文件**:`~/.aws/credentials` - **IAM 角色**(EC2、ECS、Lambda):自动 所需的 IAM 权限: - `wafv2:GetWebACL`、`wafv2:UpdateWebACL` — 用于阶段规则操作 - `wafv2:ListWebACLs` — 用于区域 ID 解析和区域发现 - `wafv2:GetRuleGroup`、`wafv2:UpdateRuleGroup`、`wafv2:ListRuleGroups` — 用于自定义规则集(规则组) - `wafv2:GetIPSet`、`wafv2:UpdateIPSet`、`wafv2:CreateIPSet`、`wafv2:DeleteIPSet`、`wafv2:ListIPSets` — 用于列表(IP 集) ### 提供程序设置 以下所有设置均位于提供程序部分下(例如 `providers.aws`)。 | 键 | 默认值 | 描述 | |-----|---------|-------------| | `region` | `AWS_DEFAULT_REGION` 或 `us-east-1` | AWS 区域 | | `waf_scope` | `AWS_WAF_SCOPE` 或 `REGIONAL` | `REGIONAL` 或 `CLOUDFRONT` | | `max_retries` | `2` | API 重试次数 | | `timeout` | `30` | API 超时时间(秒) | | `wcu_limit` | `1500` | 用于 WA340 lint 检查的 Web ACL WCU 容量。对于具有自定义限制的账户(最高 5,000),请覆盖此值。 | 安全阈值在 `safety:` 下配置(由框架拥有,不转发给提供程序): | 键 | 默认值 | 描述 | |-----|---------|-------------| | `safety.delete_threshold` | `30.0` | 可删除的规则最大百分比 | | `safety.update_threshold` | `30.0` | 可更新的规则最大百分比 | | `safety.min_existing` | `3` | 阈值生效前的最小规则数 | ## 支持的功能 | 功能 | 状态 | AWS 概念 | |---------|--------|-------------| | 阶段规则(4 个阶段) | 支持 | Web ACL 规则 | | 自定义规则集 | 支持 | 规则组 | | 列表(IP) | 支持 | IP 集 | | 列表(regex) | 支持 | Regex 模式集 | | Web ACL 设置 | 支持 | DefaultAction、ChallengeConfig、CaptchaConfig、TokenDomains、AssociationConfig、CustomResponseBodies | | Page Shield | 不支持 | — | | 区域发现 (`list_zones`) | 支持 | 列出 Web ACL | | 账户级范围 | 不支持 | — | | 审计 IP 提取 (`octorules audit`) | 支持 | IPSet 引用解析 | ## 阶段映射 | octorules 阶段 | AWS WAF 概念 | |---|---| | `aws_waf_custom_rules` | 自定义规则(IP 匹配、地理位置匹配、字节匹配等) | | `aws_waf_rate_rules` | 基于速率的规则 | | `aws_waf_managed_rules` | 托管规则组引用 | | `aws_waf_rule_group_rules` | 规则组引用 | 所有阶段都需要显式指定 `action`(没有默认操作)。 ## 自定义规则集(规则组) AWS WAF 规则组映射到 octorules 自定义规则集。octorules 管理完整的 生命周期:创建、更新规则和删除。 ### 管理现有规则组 ``` # rules/my-web-acl.yaml custom_rulesets: - id: abcd1234-5678-9012-3456-789012345678 name: My Rule Group phase: aws_waf_custom rules: - ref: block-bad-ips action: Block: {} Statement: IPSetReferenceStatement: ARN: arn:aws:wafv2:us-east-1:123456789012:regional/ipset/blocked/efgh5678 VisibilityConfig: SampledRequestsEnabled: true CloudWatchMetricsEnabled: true MetricName: BlockBadIPs ``` ### 创建新规则组 省略 `id` 字段并添加 `capacity` 以创建新规则组: ``` custom_rulesets: - name: Block Bad Actors capacity: 100 phase: aws_waf_custom rules: - ref: block-scanner action: Block: {} Statement: ByteMatchStatement: SearchString: "BadBot" FieldToMatch: SingleHeader: Name: user-agent PositionalConstraint: CONTAINS TextTransformations: - Priority: 0 Type: LOWERCASE VisibilityConfig: SampledRequestsEnabled: true CloudWatchMetricsEnabled: true MetricName: BlockScanner ``` `capacity` 是一个 AWS WAF 概念 — 一个不可变的预算(1-5000),用于限制规则组 内的规则复杂度。创建后无法更改。如果需要 更多容量,请删除并使用更高的值重新创建规则组。 **工作原理:** - `name` 字段是身份键。规则组通过名称在 YAML 和 AWS 之间进行匹配。 - 存在 `custom_rulesets:` 键意味着所有规则组均受管理 — AWS 中存在但 YAML 中不存在的规则组将被计划删除。 - 如果缺少 `custom_rulesets:` 键,则完全忽略规则组。 - `id` 是可选的:现有规则组存在,新规则组不存在。 - 创建后,使用 `octorules dump` 将分配的 `id` 导出回 YAML。 ## 列表(IP 集和 Regex 模式集) AWS WAF IP 集和 Regex 模式集映射到 octorules 列表。在规则文件中添加 `lists` 部分: ``` # rules/my-web-acl.yaml lists: - name: blocked-ips kind: ip description: "Known bad IPs" items: - ip: "1.2.3.4/32" - ip: "10.0.0.0/8" - name: bad-ua-patterns kind: regex description: "Bad user-agent patterns" items: - pattern: "BadBot.*" - pattern: "EvilCrawler/\\d+" ``` IP 列表(`kind: ip`)映射到 AWS WAF IP 集。Regex 列表(`kind: regex`)映射到 AWS WAF Regex 模式集,并通过 `RegexPatternSetReferenceStatement` 引用。 ## Linting 80 条 AWS 特定的 lint 规则(WA 前缀),涵盖结构、操作、语句和跨规则分析: | 前缀 | 类别 | 规则 | |--------|----------|-------| | WA001-WA005, WA010, WA020-WA024, WA154 | 结构与 YAML | 12 | | WA100-WA102 | 优先级 | 3 | | WA200-WA201 | 操作类型 | 2 | | WA156-WA161, WA300-WA343 | 语句深度验证 | 42 | | WA350-WA357 | 操作参数 | 8 | | WA400-WA402 | VisibilityConfig | 3 | | WA158, WA326-WA327, WA340, WA500-WA501, WA520 | 跨规则 | 7 | | WA600-WA602 | 最佳实践 | 3 | ``` octorules lint --config config.yaml ``` 安装 octorules-aws 时会自动注册 lint 规则。有关包含示例的完整规则参考,请参阅 [docs/lint.md](docs/lint.md)。 ## 已知限制 - **Web ACL 创建/删除**:octorules-aws 管理现有 Web ACL 内的规则和规则组。创建或删除 Web ACL 必须通过 AWS 控制台、CLI 或 Terraform 完成。 - **并发更新**:规则更新使用 AWS WAF 乐观锁定(LockToken)。过期的锁错误会自动重试(最多 3 次,线性退避)。如果同一个 Web ACL 被多个针对**同一阶段**的写入者同时更新,则最后一个写入者获胜。 - **规则组容量不可变**:AWS WAF 在创建时设置规则组容量。要更改容量,请删除并使用新值重新创建规则组。 ## 开发 ``` git clone git@github.com:doctena-org/octorules-aws.git cd octorules-aws python -m venv .venv source .venv/bin/activate pip install -e ".[dev]" ln -sf ../../scripts/hooks/pre-commit .git/hooks/pre-commit ``` ## 许可证 Apache License 2.0 — 请参阅 [LICENSE](LICENSE)。
标签:AWS, AWS WAF, boto3, CloudFront, DevSecOps, DPI, IP集合, octorules, Python, WAF v2, Web ACL, Web防火墙, YAML, 上游代理, 区域资源, 安全库, 安全策略, 安全规则管理, 提示词设计, 无后门, 网络安全, 自动化运维, 规则组, 逆向工具, 隐私保护