Skip to content

非公式本サイトは非公式の日本語ドキュメントであり、Cloudflare 公式サイトではありません。最新情報はdevelopers.cloudflare.comをご確認ください。

Terraform で WAF カスタムルールを設定する

最終更新 Markdown で表示Agent セットアップ

このページでは、Terraform を使いゾーンまたはアカウントに WAF カスタムルール を作成する例を示します。次のシナリオを扱います。

WAF のドキュメントには、ほかの Terraform の例もあります。関連リソース を参照してください。

Cloudflare API を使う場合は、WAF ドキュメントの次のリソースを参照してください。

Rulesets API を使ったカスタムルールセットのデプロイと設定については、Ruleset Engine ドキュメントの カスタムルールセットを扱う を参照してください。

開始する前に

必要なアカウント ID またはゾーン ID を取得する

このページの Terraform 設定には、ルールセットをデプロイするゾーン / アカウントのゾーン ID(またはアカウント ID)が必要です。

  • アクセスできるアカウントの一覧と ID を取得するには、List accounts 操作を使います。
  • アクセスできるゾーンの一覧と ID を取得するには、List zones 操作を使います。

既存のルールセットをインポートまたは削除する

Terraform は、アカウントとゾーンのルールセットを完全に管理していると想定します。アカウントまたはゾーンにルールセットが既にある場合は、次のいずれかを行ってください。

  • cf-terraforming ツールを使い、既存のルールセットを Terraform へインポート します。最近のバージョンでは、既存ルールセットのリソース定義を生成し、その設定を Terraform の状態へインポートできます。
  • 既存のルールセットを削除 してから(アカウントルールセットは "kind": "root"、ゾーンルールセットは "kind": "zone")、Terraform でルールセットの設定を定義し、最初から始めます。

ゾーンにカスタムルールを追加する

次の例では、ID が <ZONE_ID> のゾーンについて、http_request_firewall_custom フェーズのゾーンエントリポイントルールセットにカスタムルールを設定します。このルールは、標準以外の HTTP(S) ポートへのトラフィックをすべてブロックします。

必要な API トークン権限

次の トークン権限 のうち、少なくとも 1 つが必要です。

  • Zone WAF Write

cloudflare_ruleset リソースを設定します。

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"
  }
}

別の custom rule を作成するには、同じ cloudflare_ruleset リソースに新しい rules オブジェクトを追加します。


カスタムルールセットを作成してデプロイする

次の例では、ID が <ACCOUNT_ID> のアカウントに、カスタムルールを 1 件含む カスタムルールセット を作成します。このカスタムルールセットは、別の cloudflare_ruleset Terraform リソースでデプロイします。カスタムルールセットをデプロイしないと、実行されません。

次の設定は、ルールを 1 件持つカスタムルールセットを作成します。

必要な API トークン権限

次の トークン権限 がすべて必要です。

  • Account WAF Write
  • Account Rulesets Write

cloudflare_ruleset リソースを設定します。

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"
  }
}

別の custom rule in the custom ruleset を作成するには、同じ cloudflare_ruleset リソースに新しい rules オブジェクトを追加します。


次の設定は、アカウントレベルでカスタムルールセットをデプロイします。account_firewall_custom_ruleset リソースへの依存関係を定義し、作成したカスタムルールセットの ID を action_parameters で使います。

必要な API トークン権限

次の トークン権限 がすべて必要です。

  • Account WAF Write
  • Account Rulesets Write

cloudflare_ruleset リソースを設定します。

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

カスタムルールセットの設定とデプロイの詳細は、Ruleset Engine ドキュメントの カスタムルールセットを扱う を参照してください。

関連リソース

役に立ちましたか?