本页提供使用 Terraform 在区域或账户中创建 WAF 自定义规则的示例。这些示例涵盖以下场景:
WAF 文档包含其他 Terraform 示例 — 请参考更多资源。
如果您使用 Cloudflare API,请参考 WAF 文档中的以下资源:
有关使用规则集 API 部署和配置自定义规则集的更多信息,请参考规则集引擎(Ruleset Engine)文档中的使用自定义规则集。
本页提供的 Terraform 配置需要您将部署规则集的区域 ID(或账户 ID)。
Terraform 假定其对账户和区域规则集拥有完全控制权。如果您的账户或区域中已配置了规则集,请执行以下操作之一:
- 使用
cf-terraforming工具将现有规则集导入 Terraform。该工具的最新版本可以为现有规则集生成资源定义,并将其配置导入 Terraform 状态。 - 通过删除现有规则集(分别为
"kind": "root"的账户规则集和"kind": "zone"的区域规则集)从头开始,然后在 Terraform 中定义您的规则集配置。
以下示例在 ID 为 <ZONE_ID> 的区域中,在 http_request_firewall_custom 阶段的区域入口点规则集中配置一条自定义规则。该规则将阻止非标准 HTTP(S) 端口上的所有流量:
配置 cloudflare_ruleset ↗ resource:
resource "cloudflare_ruleset" "zone_custom_firewall" {
zone_id = var.cloudflare_zone_id
name = "Phase entry point ruleset for custom rules in my zone"
description = ""
kind = "zone"
phase = "http_request_firewall_custom"
rules = [{
ref = "block_non_default_ports"
description = "Block ports other than 80 and 443"
expression = "(not cf.edge.server_port in {80 443})"
action = "block"
}]
}resource "cloudflare_ruleset" "zone_custom_firewall" {
zone_id = "<ZONE_ID>"
name = "Phase entry point ruleset for custom rules in my zone"
description = ""
kind = "zone"
phase = "http_request_firewall_custom"
rules {
ref = "block_non_default_ports"
description = "Block ports other than 80 and 443"
expression = "(not cf.edge.server_port in {80 443})"
action = "block"
}
}要创建另一个 自定义规则,请在同一个 cloudflare_ruleset 资源中添加一个新的 rules 对象。
以下示例在 ID 为 <ACCOUNT_ID> 的账户中创建了一个包含单条自定义规则的自定义规则集。然后,使用单独的 cloudflare_ruleset Terraform 资源部署此自定义规则集。如果您不部署自定义规则集,它将不会执行。
以下配置创建了包含单条规则的自定义规则集:
配置 cloudflare_ruleset ↗ resource:
resource "cloudflare_ruleset" "account_firewall_custom_ruleset" {
account_id = var.cloudflare_account_id
name = "Custom ruleset blocking traffic in non-standard HTTP(S) ports"
description = ""
kind = "custom"
phase = "http_request_firewall_custom"
rules = [{
ref = "block_non_default_ports"
description = "Block ports other than 80 and 443"
expression = "(not cf.edge.server_port in {80 443})"
action = "block"
}]
}resource "cloudflare_ruleset" "account_firewall_custom_ruleset" {
account_id = "<ACCOUNT_ID>"
name = "Custom ruleset blocking traffic in non-standard HTTP(S) ports"
description = ""
kind = "custom"
phase = "http_request_firewall_custom"
rules {
ref = "block_non_default_ports"
description = "Block ports other than 80 and 443"
expression = "(not cf.edge.server_port in {80 443})"
action = "block"
}
}要创建另一个 自定义规则集中的自定义规则,请在同一个 cloudflare_ruleset 资源中添加一个新的 rules 对象。
以下配置在账户级别部署自定义规则集。它定义了对 account_firewall_custom_ruleset 资源的依赖项,并在 action_parameters 中使用了创建的自定义规则集的 ID:
配置 cloudflare_ruleset ↗ resource:
resource "cloudflare_ruleset" "account_firewall_custom_entrypoint" {
account_id = var.cloudflare_account_id
name = "Account-level entry point ruleset for the http_request_firewall_custom phase deploying a custom ruleset"
description = ""
kind = "root"
phase = "http_request_firewall_custom"
depends_on = [cloudflare_ruleset.account_firewall_custom_ruleset]
rules = [{
ref = "deploy_custom_ruleset_example_com"
description = "Deploy custom ruleset for example.com"
expression = "(cf.zone.name eq \"example.com\") and (cf.zone.plan eq \"ENT\")"
action = "execute"
action_parameters = {
id = cloudflare_ruleset.account_firewall_custom_ruleset.id
}
}]
}resource "cloudflare_ruleset" "account_firewall_custom_entrypoint" {
account_id = "<ACCOUNT_ID>"
name = "Account-level entry point ruleset for the http_request_firewall_custom phase deploying a custom ruleset"
description = ""
kind = "root"
phase = "http_request_firewall_custom"
depends_on = [cloudflare_ruleset.account_firewall_custom_ruleset]
rules {
ref = "deploy_custom_ruleset_example_com"
description = "Deploy custom ruleset for example.com"
expression = "(cf.zone.name eq \"example.com\") and (cf.zone.plan eq \"ENT\")"
action = "execute"
action_parameters {
id = cloudflare_ruleset.account_firewall_custom_ruleset.id
}
}
}有关配置和部署自定义规则集的更多信息,请参考规则集引擎文档中的使用自定义规则集。