コンテンツにスキップ

WAF管理ルール

このページでは、Terraformを使用してゾーンまたはアカウントにWAF管理ルールをデプロイおよび構成する例を提供します。以下の構成をカバーしています:

WAF管理ルールに関する詳細は、Cloudflare WAFドキュメントのWAF管理ルールを参照してください。ルールセットAPIを使用してルールセットをデプロイおよび構成する方法については、Ruleset Engineドキュメントの管理ルールセットを操作するを参照してください。

始める前に

必要なアカウント、ゾーン、および管理ルールセットIDを取得する

The Terraform configurations provided in this page need the zone ID (or account ID) of the zone/account where you will deploy the managed rulesets.

  • To retrieve the list of accounts you have access to, including their IDs, use the List accounts operation.
  • To retrieve the list of zones you have access to, including their IDs, use the List zones operation.

The deployment of managed rulesets via Terraform requires that you use the ruleset IDs. To find the IDs of managed rulesets, use the List account rulesets operation. The response will include the description and IDs of existing managed rulesets.

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

Terraform assumes that it has complete control over account and zone rulesets. If you already have rulesets configured in your account or zone, do one of the following:

  • Import existing rulesets to Terraform using the cf-terraforming tool. Recent versions of the tool can generate resource definitions for existing rulesets and import their configuration to Terraform state.
  • Start from scratch by deleting existing rulesets (account and zone rulesets with "kind": "root" and "kind": "zone", respectively) and then defining your rulesets configuration in Terraform.

管理ルールセットのデプロイ

以下の例では、Terraformを使用してIDが<ZONE_ID>のゾーンに2つの管理ルールセットをデプロイします。cloudflare_rulesetリソースを使用し、管理ルールセットを実行する2つのルールを含みます。

# "http_request_firewall_managed"フェーズのゾーンレベルでルールセットを構成する
resource "cloudflare_ruleset" "zone_level_managed_waf" {
zone_id = "<ZONE_ID>"
name = "Managed WAFエントリポイントルールセット"
description = "ゾーンレベルのWAF管理ルール構成"
kind = "zone"
phase = "http_request_firewall_managed"
# Cloudflare管理ルールセットを実行する
rules {
action = "execute"
action_parameters {
id = "efb7b8c949ac4650a09736fc376e9aee"
version = "latest"
}
expression = "true"
description = "私のゾーンレベルフェーズエントリポイントルールセットでCloudflare管理ルールセットを実行する"
enabled = true
}
# Cloudflare OWASPコアルールセットを実行する
rules {
action = "execute"
action_parameters {
id = "4814384a9e5d4991b9815dcfc25d2f1f"
version = "latest"
}
expression = "true"
description = "私のゾーンレベルフェーズエントリポイントルールセットでCloudflare OWASPコアルールセットを実行する"
enabled = true
}
}

アカウントレベルの例の構成

以下の例では、Terraformを使用してIDが<ACCOUNT_ID>のアカウントに2つの管理ルールセットをデプロイします。cloudflare_rulesetリソースを使用し、エンタープライズゾーンに属する2つのホスト名のために管理ルールセットを実行する2つのルールを含みます。

resource "cloudflare_ruleset" "account_level_managed_waf" {
account_id = "<ACCOUNT_ID>"
name = "Managed WAFエントリポイントルールセット"
description = "アカウントレベルのWAF管理ルール構成"
kind = "root"
phase = "http_request_firewall_managed"
# Cloudflare管理ルールセットを実行する
rules {
action = "execute"
action_parameters {
id = "efb7b8c949ac4650a09736fc376e9aee"
}
expression = "http.host in {\"api.example.com\" \"store.example.com\"} and cf.zone.plan eq \"ENT\""
description = "私のアカウントレベルフェーズエントリポイントルールセットでCloudflare管理ルールセットを実行する"
enabled = true
}
# Cloudflare OWASPコアルールセットを実行する
rules {
action = "execute"
action_parameters {
id = "4814384a9e5d4991b9815dcfc25d2f1f"
}
expression = "http.host in {\"api.example.com\" \"store.example.com\"} and cf.zone.plan eq \"ENT\""
description = "私のアカウントレベルフェーズエントリポイントルールセットでCloudflare OWASPコアルールセットを実行する"
enabled = true
}
}

スキップルールの構成

以下の例では、Cloudflare管理ルールセットのために2つのスキップルール(または例外)を追加します:

  • 最初のルールは、特定のURLに対してCloudflare管理ルールセット全体(ID ...376e9aee )の実行をスキップします。
  • 2番目のルールは、特定のURLに対してCloudflare管理ルールセットに属する2つのルールの実行をスキップします。

Cloudflare管理ルールセットをデプロイするルールの前に、2つのスキップルールをcloudflare_rulesetリソースに追加します:

resource "cloudflare_ruleset" "account_level_managed_waf" {
# (...)
# 特定のURLに対してCloudflare管理ルールセット全体の実行をスキップする
rules {
action = "skip"
action_parameters {
rulesets = ["efb7b8c949ac4650a09736fc376e9aee"]
}
expression = "(cf.zone.name eq \"example.com\" and http.request.uri.query contains \"skip=rulesets\")"
description = "Cloudflare管理ルールセットをスキップする"
enabled = true
}
# 特定のURLに対してCloudflare管理ルールセット内の2つのルールの実行をスキップする
rules {
action = "skip"
action_parameters {
rules = {
# フォーマット: "<RULESET_ID>" = "<RULE_ID_1>,<RULE_ID_2>,..."
"efb7b8c949ac4650a09736fc376e9aee" = "5de7edfa648c4d6891dc3e7f84534ffa,e3a567afc347477d9702d9047e97d760"
}
}
expression = "(cf.zone.name eq \"example.com\" and http.request.uri.query contains \"skip=rules\")"
description = "WordPressおよびSQLiルールをスキップする"
enabled = true
}
# Cloudflare管理ルールセットを実行する
rules {
action = "execute"
action_parameters {
id = "efb7b8c949ac4650a09736fc376e9aee"
version = "latest"
}
expression = "true"
description = "私のゾーンレベルフェーズエントリポイントルールセットでCloudflare管理ルールセットを実行する"
enabled = true
}
# (...)
}

オーバーライドの構成

以下の例では、Cloudflare管理ルールセットのために3つのオーバーライドを追加します:

  • ルールID 5de7edfa648c4d6891dc3e7f84534ffaのルールオーバーライドで、アクションをlogに設定します。
  • ルールID 75a0060762034a6cb663fd51a02344cbのルールオーバーライドで、そのルールを無効にします。
  • wordpressタグのタグオーバーライドで、このタグを持つすべてのルールのアクションをjs_challengeに設定します。

以下の構成では、Cloudflare管理ルールセットを実行するルールに3つのオーバーライドを含めています:

# (...)
# Cloudflare管理ルールセットを実行する
rules {
action = "execute"
action_parameters {
id = "efb7b8c949ac4650a09736fc376e9aee"
version = "latest"
overrides {
rules {
id = "5de7edfa648c4d6891dc3e7f84534ffa"
action = "log"
enabled = true
}
rules {
id = "75a0060762034a6cb663fd51a02344cb"
enabled = false
}
categories {
category = "wordpress"
action = "js_challenge"
enabled = true
}
}
}
expression = "true"
description = "私のゾーンレベルフェーズエントリポイントルールセットでCloudflare管理ルールセットを実行する"
enabled = true
}
# (...)

ペイロードロギングの構成

この例では、Cloudflare管理ルールセットの一致したルールのためにペイロードロギングを有効にし、ログされたペイロードを暗号化するために使用される公開鍵を設定します。

Cloudflare管理ルールセットをデプロイするルールに基づいて、以下のルール構成では、ペイロードを暗号化するために使用される公開鍵を持つmatched_dataオブジェクトを追加します:

# (...)
# Cloudflare管理ルールセットを実行する
rules {
action = "execute"
action_parameters {
id = "efb7b8c949ac4650a09736fc376e9aee"
version = "latest"
matched_data {
public_key = "Ycig/Zr/pZmklmFUN99nr+taURlYItL91g+NcHGYpB8="
}
}
expression = "true"
description = "私のゾーンレベルフェーズエントリポイントルールセットでCloudflare管理ルールセットを実行する"
enabled = true
}
# (...)

OWASPのパラノイアレベル、スコア閾値、およびアクションの構成

OWASP管理ルールセットは、以下の構成をサポートしています:

  • 特定のパラノイアレベルまでのすべてのルールを有効にするために、より高いパラノイアレベルに関連するすべてのルールを無効にするタグオーバーライドを作成します。

  • 計算された脅威スコアがスコア閾値を超えたときに実行するアクションを設定するために、Cloudflare OWASPコアルールセットの最後のルールに対してルールオーバーライドを作成し、actionプロパティを含めます。

  • スコア閾値を設定するために、Cloudflare OWASPコアルールセットの最後のルールに対してルールオーバーライドを作成し、score_thresholdプロパティを含めます。

利用可能な構成値の詳細については、WAFドキュメントのCloudflare OWASPコアルールセットページを参照してください。

以下の例のcloudflare_ruleset Terraformリソースのルールは、次の構成を実行します:

  • OWASP管理ルールセットをデプロイします。
  • OWASPパラノイアレベルを_PL2_に設定します。
  • スコア閾値を60)に設定します。
  • ルールセットアクションをlogに設定します。
# (...)
# Cloudflare OWASPコアルールセットを実行する
rules {
action = "execute"
action_parameters {
id = "4814384a9e5d4991b9815dcfc25d2f1f"
overrides {
# デフォルトでは、すべてのPL1からPL4ルールが有効です。
# "paranoia-level-3"および"paranoia-level-4"タグを持つルールを無効にすることで
# パラノイアレベルをPL2に設定します。
categories {
category = "paranoia-level-3"
enabled = false
}
categories {
category = "paranoia-level-4"
enabled = false
}
rules {
id = "6179ae15870a4bb7b2d480d4843b323c"
action = "log"
score_threshold = 60
}
}
}
expression = "true"
description = "ゾーン"
enabled = true
}
# (...)