跳转到内容
搜索文档

使用 Terraform 配置 WAF 自定义规则

最后更新 查看 MarkdownAgent 设置

本页提供使用 Terraform 在区域或账户中创建 WAF 自定义规则的示例。这些示例涵盖以下场景:

WAF 文档包含其他 Terraform 示例 — 请参考更多资源

如果您使用 Cloudflare API,请参考 WAF 文档中的以下资源:

有关使用规则集 API 部署和配置自定义规则集的更多信息,请参考规则集引擎(Ruleset Engine)文档中的使用自定义规则集

开始之前

获取必要的账户或区域 ID

本页提供的 Terraform 配置需要您将部署规则集的区域 ID(或账户 ID)。

  • 要检索您有权访问的账户列表(包括其 ID),请使用列出账户操作。
  • 要检索您有权访问的区域列表(包括其 ID),请使用列出区域操作。

导入或删除现有规则集

Terraform 假定其对账户和区域规则集拥有完全控制权。如果您的账户或区域中已配置了规则集,请执行以下操作之一:

  • 使用 cf-terraforming 工具将现有规则集导入 Terraform。该工具的最新版本可以为现有规则集生成资源定义,并将其配置导入 Terraform 状态。
  • 通过删除现有规则集(分别为 "kind": "root" 的账户规则集和 "kind": "zone" 的区域规则集)从头开始,然后在 Terraform 中定义您的规则集配置。

向区域添加自定义规则

以下示例在 ID 为 <ZONE_ID> 的区域中,在 http_request_firewall_custom 阶段的区域入口点规则集中配置一条自定义规则。该规则将阻止非标准 HTTP(S) 端口上的所有流量:

必需的 API 令牌权限

至少需要以下令牌权限之一:

  • Zone WAF Write

配置 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 资源部署此自定义规则集。如果您不部署自定义规则集,它将不会执行。

以下配置创建了包含单条规则的自定义规则集:

必需的 API 令牌权限

需要所有以下令牌权限

  • Account WAF Write
  • Account Rulesets Write

配置 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:

必需的 API 令牌权限

需要所有以下令牌权限

  • Account WAF Write
  • Account Rulesets Write

配置 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
    }
  }
}

有关配置和部署自定义规则集的更多信息,请参考规则集引擎文档中的使用自定义规则集

更多资源

这篇文档对您有帮助吗?