このページでは、Terraform を使いゾーンまたはアカウントに WAF カスタムルール を作成する例を示します。次のシナリオを扱います。
WAF のドキュメントには、ほかの Terraform の例もあります。関連リソース を参照してください。
Cloudflare API を使う場合は、WAF ドキュメントの次のリソースを参照してください。
Rulesets API を使ったカスタムルールセットのデプロイと設定については、Ruleset Engine ドキュメントの カスタムルールセットを扱う を参照してください。
このページの 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) ポートへのトラフィックをすべてブロックします。
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 件持つカスタムルールセットを作成します。
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 で使います。
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 ドキュメントの カスタムルールセットを扱う を参照してください。