doctena-org/octorules-cloudflare

GitHub: doctena-org/octorules-cloudflare

这是一个通过 YAML 声明式配置来管理 Cloudflare 防火墙规则、列表及 Page Shield 策略的自动化工具。

Stars: 1 | Forks: 0

# octorules-cloudflare [octorules](https://github.com/doctena-org/octorules) 的 Cloudflare 提供程序 — 以 YAML 格式管理 23 个 Cloudflare 规则阶段、自定义规则集、列表和 Page Shield 策略。 ## 安装 ``` pip install octorules-cloudflare ``` 或通过 octorules 额外包安装: ``` pip install octorules[cloudflare] ``` 这将安装 octorules(核心)、octorules-cloudflare 和 [octorules-wirefilter](https://github.com/doctena-org/octorules-wirefilter) (Cloudflare wirefilter 引擎的 Rust FFI 桥接器,用于权威表达式解析和完整的 linter 覆盖)。 预构建的 wirefilter wheels 可用于 Linux(x86_64、aarch64;glibc 和 musl/Alpine)、macOS(x86_64、ARM64)和 Windows(x86_64)。 ## 配置 ``` providers: cloudflare: token: env/CLOUDFLARE_API_TOKEN rules: directory: ./rules zones: example.com: sources: - rules ``` `env/` 前缀在运行时从环境变量中解析值。 provider 部分下的所有键都作为关键字参数转发给 provider 构造函数 (octodns 风格的透传)。 ### 身份验证 需要 [Cloudflare API token](https://developers.cloudflare.com/fundamentals/api/get-started/create-token/) 。该 token 需要以下权限: - **Zone > Firewall Services > Edit** — 用于 ruleset 阶段操作 - **Account > Account Rulesets > Edit** — 用于账户级别规则和自定义规则集 - **Account > Account Filter Lists > Edit** — 用于列表管理 - **Zone > Page Shield > Edit** — 用于 Page Shield 策略管理 有关 API token 权限与 octorules 功能的详细映射,请参阅 [docs/permissions.md](docs/permissions.md)。 ### Provider 设置 以下所有设置均位于 provider 部分下(例如 `providers.cloudflare`)。 | Key | 默认值 | 说明 | |-----|---------|-------------| | `token` | *(必填)* | Cloudflare API token(支持 `env/` 前缀) | | `max_retries` | `2` | API 重试次数(0-10) | | `timeout` | `30` | API 超时时间(秒),最大 300 | 安全阈值配置在 `safety:` 下(归框架所有,不转发给 provider): | Key | 默认值 | 说明 | |-----|---------|-------------| | `safety.delete_threshold` | `30.0` | 可删除的最大规则百分比 | | `safety.update_threshold` | `30.0` | 可更新的最大规则百分比 | | `safety.min_existing` | `3` | 阈值生效前的最少规则数 | ## 支持的功能 | 功能 | 状态 | |---------|--------| | Phase 规则(23 个阶段) | 已支持 | | 自定义规则集(账户级别) | 已支持 | | 列表(IP、ASN、主机名、重定向) | 已支持 | | Page Shield 策略(Zone 级别) | 已支持 | | Zone 发现 (`list_zones`) | 已支持 | | 账户级别作用域 | 已支持 | | 审计 IP 提取 (`octorules audit`) | 已支持 | | Bot Management 设置 (`cloudflare_bot_management`) | 已支持 | | URL normalization 设置 (`cloudflare_url_normalization`) | 已支持 | | Zone security defaults (`cloudflare_zone_security`) | 已支持 | | Leaked Credential Check (`cloudflare_leaked_credential_check`) | 已支持 | | Content Scanning / 反恶意软件 (`cloudflare_content_scanning`) | 已支持 | ## 支持的阶段 23 个 Cloudflare 阶段 — 18 个 HTTP 请求/响应阶段和 5 个网络级别(Magic Transit)阶段。阶段按固定顺序执行: ``` Request -> url_normalization -> redirect_rules -> url_rewrite_rules -> request_header_rules -> origin_rules -> config_rules -> cache_rules -> waf_custom_rules -> waf_managed_rules -> rate_limiting_rules -> bot_fight_rules -> http_ddos_rules -> Origin fetch <- -> custom_error_rules -> response_header_rules -> compression_rules -> sensitive_data_detection -> log_custom_fields -> Response ``` 具有默认操作的阶段(例如 `redirect_rules` -> `redirect`)不需要在 YAML 中指定 `action` — 它会自动注入。对于没有默认值的阶段(例如 `waf_custom_rules`),必须显式指定 `action`。 标记为同时适用于 Zone 和 Account 的阶段可在任一作用域下工作。仅限 Account 的阶段在 Zone 作用域下会被跳过,反之亦然,从而避免浪费 API 调用。 有关完整的阶段参考信息 — 执行顺序图、每个阶段的有效操作、字段/函数可用性以及关键行为 — 请参阅 [docs/lint/README.md](docs/lint/README.md)。 ## 表达式语法 规则表达式使用 [Cloudflare 的 ruleset 表达式语言](https://developers.cloudflare.com/ruleset-engine/rules-language/expressions/)。当安装了 [octorules-wirefilter](https://github.com/doctena-org/octorules-wirefilter)(随 `octorules-cloudflare` 自动包含)时,表达式由 Cloudflare 实际的 wirefilter 引擎解析,提供权威的类型检查、字段验证和语法验证。如果没有它,基于正则的回退解析器会提取字段、函数、运算符和字面量,但无法执行类型检查。 Linter 会在启动时记录处于活动状态的解析器(`Expression parser: wirefilter` 或 `Expression parser: regex fallback`)。 ## 自定义规则集(账户级别) 在账户级别,WAF 自定义规则和速率限制规则使用双层结构:阶段入口点包含 **部署规则**(`action: execute`),这些规则通过 ID 引用子级 **自定义规则集**。单独的阻止/日志记录规则位于这些子级规则集内部。 octorules 管理这两个层级。部署规则通过常规的阶段部分(`waf_custom_rules`、`rate_limiting_rules`)进行管理。每个自定义规则集内部的单独规则通过单独的 `custom_rulesets` 部分进行管理: ``` # Account rules file (e.g. rules/my-account.yaml) # Deploy rules (phase entrypoint — references child rulesets by ID) waf_custom_rules: - ref: deploy-known-attackers description: Deploy known attackers ruleset action: execute action_parameters: id: abc12345def67890abc12345def67890 version: latest enabled: true expression: (http.host eq "api.example.com") # Individual rules inside each custom ruleset custom_rulesets: - id: abc12345def67890abc12345def67890 name: Known attackers phase: http_request_firewall_custom rules: - ref: block-bad-asn description: Block by AS number action: block expression: (ip.geoip.asnum in {12345 67890}) - ref: block-bad-ua description: Block by user-agent action: block expression: (http.user_agent contains "BadBot") ``` 每个 `custom_rulesets` 条目中的 `id` 字段将其链接到部署规则的 `action_parameters.id`。内部规则使用 `ref` 进行标识(与阶段规则的模式相同)。每个规则必须显式指定 `action`。 使用 `octorules dump --scope account` 将现有的自定义规则集导出为 YAML。 ## 列表(账户级别) Cloudflare 账户级别的 [Lists](https://developers.cloudflare.com/waf/tools/lists/)(IP 列表、ASN 列表、主机名列表、重定向列表)可以通过 `$list_name` 语法在规则表达式中引用。octorules 以声明方式管理列表的完整生命周期:创建、删除、更新元数据以及管理项目。 在您的账户规则文件中添加顶级 `lists` 键: ``` # rules/my-account.yaml lists: - name: blocked_ips kind: ip description: "Known bad IPs" items: - ip: "1.2.3.4" comment: "Scanner" - ip: "5.6.7.0/24" comment: "Botnet range" - name: partner_asns kind: asn description: "Partner AS numbers" items: - asn: 12345 comment: "Partner A" - asn: 67890 comment: "Partner B" ``` 每个列表条目需要: | 字段 | 说明 | |-------|-------------| | `name` | 列表名称 — 匹配 CF 列表名称和表达式中的 `$list_name` | | `kind` | `ip`、`asn`、`hostname`、`redirect` 之一 | | `description` | 可选 — 如果更改则更新 | | `items` | 项目列表(可以为空 `[]` 以清除所有项目) | **工作原理:** - 存在 `lists:` 键意味着管理所有列表 — Cloudflare 中不在 YAML 中的列表计划删除(受安全阈值限制)。 - 如果缺少 `lists:` 键,则完全忽略列表。 - 项目更新是异步的 — octorules 轮询批量操作直到完成。 - 同步期间,列表在规则集和阶段**之前**应用,因此新创建的列表可供引用它们的规则表达式使用。 - 使用 `octorules dump --scope account` 将现有列表导出为 YAML。dump 会将列表项目外部化到单独的文件中(通过 `!include` 标签引用),位于 `providers.lists.directory` 下(默认:`{rules_dir}/custom_lists`)。 在规则表达式中引用列表: ``` waf_custom_rules: - ref: block-bad-ips description: Block IPs from blocklist action: block expression: (ip.src in $blocked_ips) ``` ## Page Shield 策略(Zone 级别) Cloudflare [Page Shield](https://developers.cloudflare.com/page-shield/) 在 Zone 级别管理内容安全策略(CSP)。octorules 以声明方式管理 Page Shield 策略的完整生命周期:创建、更新和删除。 在您的 Zone 规则文件中添加顶级 `page_shield_policies` 键: ``` # rules/example.com.yaml page_shield_policies: - description: "CSP on all example.com" action: allow expression: "true" enabled: true value: >- script-src 'self' 'unsafe-inline' 'unsafe-eval' https:; worker-src 'self' blob: - description: "Log CSP on staging" action: log expression: '(http.host eq "staging.example.com")' enabled: true value: "default-src 'self'" ``` 每个策略条目需要: | 字段 | 说明 | |-------|-------------| | `description` | 策略描述 — 用作匹配的身份键 | | `action` | `allow` 或 `log` | | `expression` | Cloudflare 过滤器表达式 | | `enabled` | 布尔值 | | `value` | CSP 指令字符串 | **工作原理:** - `description` 字段是身份键(类似于规则的 `ref` 和列表的 `name`)。策略通过描述在 YAML 和 Cloudflare 之间进行匹配。 - 存在 `page_shield_policies:` 键意味着管理所有策略 — Cloudflare 中不在 YAML 中的策略计划删除。 - 如果缺少 `page_shield_policies:` 键,则完全忽略策略。 - 同步期间,策略在列表**之后**以及自定义规则集和阶段**之前**应用。 - 使用 `octorules dump` 将现有 Page Shield 策略导出为 YAML。 **CSP 源规范化:** CSP 指令中源的顺序并不重要 — `script-src 'self' example.com` 和 `script-src example.com 'self'` 在语义上是相同的。octorules 在比较 `value` 字段之前规范化源顺序(在每个指令内按字母顺序排序),因此在 YAML 中重新排序源不会触发 Cloudflare 上的上游更改。您可以为了可读性自由地重新组织源,而不会引起同步。 ## Linting 141 条 Cloudflare 特定的 lint 规则(CF 前缀),跨越 6 个范围: | 范围 | 类别 | 规则数 | |-------|----------|-------| | CF001–CF026 | 结构与解析 | 26 | | CF100–CF104 | 跨规则排序 | 5 | | CF200–CF222 | 操作验证 | 23 | | CF300–CF309 | 表达式、函数与类型 | 10 | | CF400–CF476 | 领域特定(速率限制、缓存、配置、重定向、转换、源、page shield、列表) | 42 | | CF500–CF545 | 计划限制、样式与值约束 | 35 | 有关完整的规则参考,请参阅 [docs/lint/README.md](docs/lint/README.md)。 ## 开发 ``` git clone git@github.com:doctena-org/octorules-cloudflare.git cd octorules-cloudflare python -m venv .venv source .venv/bin/activate pip install -e ".[dev]" ln -sf ../../scripts/hooks/pre-commit .git/hooks/pre-commit ``` Pre-commit hook 会在 `overlay.toml` 或 `pyproject.toml` 更改时自动重新生成 `schemas.json`(针对没有 wirefilter 的用户的冻结模式回退)。 有关完整的模式架构,请参阅 [docs/schemas.md](docs/schemas.md)。 ## 许可证 octorules-cloudflare 采用 [Apache License 2.0](LICENSE) 许可。
标签:API集成, Cloudflare, DNS管理, MITRE ATT&CK, Page Shield, Python, Rust FFI, WAF, YAML配置, 可观测性, 可视化界面, 安全策略, 提示词设计, 无后门, 网络安全, 自动化运维, 规则集管理, 逆向工具, 防火墙规则, 隐私保护