WAFカスタムルールの操作
WAFのカスタムルールは、 HTTP のトラフィックを対象とし、カスタム条件を適用して特定のリクエストをブロック、検証、記録、または許可することで、強力かつ柔軟な機能を提供します。
さまざまな種類のWAFカスタムルールを作成できます。 ただし、サイト上のアクティブなルールの数は、お客様のプランによって制限されます。 受給資格の詳細については、 「CIS プランを比較する 」を参照のこと。
プラン当たりのアクティブ・ルールの数は固定されています。 現在、アクティブなルールを追加で購入することはできません。
作業を始める前に 、「フィールド、関数、および式の使用」を 復習しておくと良いでしょう。
コンソール、CLI、API、またはTerraformを使用して、カスタムルールを作成、更新、削除できます。
コンソールでカスタムルールを作成する
コンソールでカスタムルールを作成するには、以下の手順に従ってください:
WAFカスタムルールは、既存のファイアウォールルールページを使用して設定する。 以前にドメインで作成されたレガシーファイアウォールルールは、自動的にWAFカスタムルールに変換されます。
-
CIS コンソールで、 Security に移動する。
-
[ カスタムルール ] タブを選択し、[ 作成 ] をクリックします。
-
任意で説明を入力してください。
-
必要に応じて、優先順位を入力します (オプション)。 優先度がゼロの場合は優先度なしとみなされ、最後に評価されます。
-
**「着信要求 (Incoming requests)」**セクションで、UI ビルダーを使用して条件を追加します。 複数の条件を持つ式を作成するには、以下のいずれかをクリックします。
- そして、使用状況_と_ロジックを評価する
- あるいは、 OR論理(または) を用いて、条件や、以前に「 _AND」で結合された_条件のグループを評価する場合
条件を作成すると、「式のプレビュー (Expression Preview)」にその式がプレーン・テキストで表示されます。
「式のプレビュー (Expression Preview)」では、「ビジュアル式ビルダー (Visual Expression Builder)」を使用する代わりに式をクリックして手動で編集することも、2 つの方式を切り替えることもできます。 ただし、手動で作成された式の複雑さによっては、「ビジュアル式ビルダー (Visual Expression Builder)」で式をレンダリングできない場合があります。
-
**「応答」**リスト・メニューからアクションを選択します。
-
ルールを保存するには、以下のいずれかをクリックして最適なオプションを選択します。
- ルールを保存するには「 下書きとして保存 」を選択しますが、このルールは無効のままにしておきます。
- 保存してデプロイ: ルールを保存してアクティブ化します。
コンソールでカスタムルールを更新する
コンソールで既存のカスタムルールを更新するには、以下の手順に従ってください:
- CIS コンソールで、 Security に移動する。
- [ カスタムルール ] タブを選択します。
- 「カスタムルール」テーブルで、変更したいルールを探し、その行の右側にある「アクション」メニューをクリックします。
- **「編集」**を選択します。
- ルールに変更を加えます。
- ルールを保存するには、以下のいずれかをクリックして最適なオプションを選択します。
- ルールを保存するには「 下書きとして保存 」を選択しますが、このルールは無効のままにしておきます。
- 保存してデプロイ: ルールを保存してアクティブ化します。
既存のルールのリスト内のルールを一時停止またはアクティブ化するには、**「有効」**トグルをクリックします。
コンソールでカスタムルールを削除する
コンソールで既存のカスタムルールを削除するには、以下の手順に従ってください:
- CIS コンソールで、 Security に移動する。
- 「カスタムルール」テーブルで、削除したいルールを探し、その行の右側にある「アクション」メニューをクリックします。
- アクションメニューから「 削除 」を選択します。
- ルールを削除するには、 [WAFカスタムルールを削除]をクリックします。
CLIからカスタムルールを作成する
CLIからカスタムルールを作成するには、以下の手順に従う:
-
CLI 環境をセットアップします。
-
CLIからアカウントにログインしてください。 パスワードを入力すると、システムから、使用するアカウントと地域を入力するよう求められます:
ibmcloud login --sso -
カスタムルールを作成するには、次のコマンドを実行してください:
ibmcloud cis custom-waf rule-create DNS_DOMAIN_ID --match EXPRESSION --action ACTION [--description DESCRIPTION] [--enabled true|false] [-i, --instance INSTANCE] [--output FORMAT]JSONファイルまたはJSON文字列を直接指定して、カスタム・ルールを作成することもできる:
ibmcloud cis custom-waf rule-create DNS_DOMAIN_ID (--json @JSON_FILE | JSON_STRING) [-i, --instance INSTANCE] [--output FORMAT]
コマンド・オプション
DNS_DOMAIN_ID-
DNSドメインのID。
--match-
ルールを実行するために一致する必要がある条件を指定します。 マッチ値については、 フィールド、関数、式の使用を 参照してください。
--action-
実行するルール・アクション。 有効な値:"block"、"challenge"、"js_challenge"、"managed_challenge"、"log"、"skip"。 「block」および「skip」アクションについては、代わりにJSONファイルまたはJSON文字列を使用してください。
--enabled-
ルールがアクティブかどうかを示します。 デフォルトは "false "である。
--description-
このルールの概要。
--json-
カスタムルールを記述するために使用されるJSONファイルまたはJSON文字列。
-
JSONデータで必須のフィールドは、
expressionおよびactionです。expression: ルールが実行されるために満たすべき条件を指定します。action: 実行するルールアクション。 有効な値はblock、challenge、js_challenge、managed_challenge、log、skip。
-
オプションのフィールドは、
description、enabled、logging、action_parameters。action_parameters: ルールアクションのパラメータ。ruleset残りのすべてのルールまたは 1 つ以上の WAF 管理ルールセットをスキップします。 有効な値は「current」です。phases: 一致したリクエストに対して、WAFコンポーネントをスキップします。 有効な値はhttp_ratelimit、http_request_firewall_managed、http_request_sbfm。productsマッチング要求に対して特定のセキュリティ製品をスキップする。 有効な値はwaf、rateLimit、securityLevel、hot、bic、uaBlock、zoneLockdown。response:blockアクションに対するカスタムレスポンスを定義します。status_code: 応答の HTTP ステータスコードを、400-499の範囲から選択してください。content_typeカスタムレスポンスのコンテンツタイプ。 有効なレスポンス・タイプは、text/html、text/plain、application/json、text/xml。content: レスポンス本文。
descriptionルールを簡単に説明する。enabled: ルールが有効かどうかを示します。 このフィールドを無効にすると、マッチしたリクエストはファイアウォールリクエストに表示されません。logging: スキップルールに一致するリクエストをログに記録します。 このフィールドは「skip」アクションの場合のみ利用可能です。
-
サンプル JSON データ:
{
"description": "test-custom-rule",
"expression": "(http.cookie contains \"test\")",
"action": "skip",
"logging": {
"enabled": true
},
"action_parameters": {
"ruleset": "current",
"phases": [
"http_ratelimit",
"http_request_firewall_managed",
"http_request_sbfm"
],
"products": [
"waf",
"rateLimit",
"securityLevel",
"hot",
"bic",
"uaBlock",
"zoneLockdown"
]
},
"enabled": true
}
-i, --instance- インスタンスの名前または ID。 設定されていない場合は、
ibmcloud cis instance-set INSTANCEで指定されたコンテキストインスタンスが使用されます。 --output- 出力形式を指定してください。
JSONのみがサポートされています。
CLIからのカスタムルールの更新
カスタムルールをCLIから更新するには、次のコマンドを実行します:
ibmcloud cis custom-waf rule-update DNS_DOMAIN_ID [--match EXPRESSION] [--action ACTION] [--description DESCRIPTION] [--enabled true|false] [-i, --instance INSTANCE] [--output FORMAT]
JSONファイルまたはJSON文字列を直接指定して、カスタムルールを更新することもできる:
ibmcloud cis custom-waf rule-update DNS_DOMAIN_ID (--json @JSON_FILE | JSON_STRING) [-i, --instance INSTANCE] [--output FORMAT]
コマンド・オプション
DNS_DOMAIN_ID-
DNSドメインのID。
RULE_ID-
ルールのID。
--match-
ルールを実行するために一致する必要がある条件を指定します。 マッチ値については、 フィールド、関数、式の使用を 参照してください。
--action-
実行するルール・アクション。 有効な値:「block"、"challenge"、"js_challenge"、"managed_challenge"、"log"、"skip"。"block "と "skip "アクションでは、代わりにJSONファイルまたはJSON文字列を使用する。
--enabled-
ルールがアクティブかどうかを示します。 デフォルト値は「false」です。
--description-
このルールの概要。
--json-
カスタムルールを記述するために使用されるJSONファイルまたはJSON文字列。
-
JSONデータで必須のフィールドは、
expressionおよびactionです。expression: ルールが実行されるために満たすべき条件を指定します。action: 実行するルールアクション。 有効な値はblock、challenge、js_challenge、managed_challenge、log、skip。
-
オプションのフィールドは、
description、enabled、logging、action_parameters。action_parameters: ルールアクションのパラメータ。ruleset残りのすべてのルールまたは 1 つ以上の WAF 管理ルールセットをスキップします。 有効な値はcurrentphases: 一致したリクエストに対して、WAFコンポーネントをスキップします。 有効な値はhttp_ratelimit、http_request_firewall_managed、http_request_sbfm。productsマッチング要求に対して特定のセキュリティ製品をスキップする。 有効な値はwaf、rateLimit、securityLevel、hot、bic、uaBlock、zoneLockdown。response: 「block」アクションに対するカスタムレスポンスを定義します。status_code: 応答の HTTP ステータスコードを、400-499の範囲から選択してください。content_typeカスタムレスポンスのコンテンツタイプ。 有効なレスポンス・タイプはtext/html、text/plain、application/json、text/xmlである。content: レスポンス本文。
descriptionルールを簡単に説明する。enabled: ルールが有効かどうかを示します。 このフィールドを無効にすると、マッチしたリクエストはファイアウォールリクエストに表示されません。logging: スキップルールに一致するリクエストをログに記録します。 このフィールドは「skip」アクションの場合のみ利用可能です。
-
サンプル JSON データ:
{
"description": "test-custom-rule",
"expression": "(http.cookie contains \"test\")",
"action": "block",
"action_parameters": {
"response": {
"status_code": 429,
"content_type": "text/xml",
"content": "reject"
}
},
"enabled": true
}
-i, --instance- インスタンスの名前または ID。 設定されていない場合は、
ibmcloud cis instance-set INSTANCEで指定されたコンテキストインスタンスが使用されます。 --output- 出力形式を指定してください。
JSONのみがサポートされています。
CLIからカスタムルールを削除する
CLIからカスタムルールを削除するには、次のコマンドを実行します:
ibmcloud cis custom-waf rule-delete DNS_DOMAIN_ID RULE_ID [-f, --force] [-i, --instance INSTANCE] [--output FORMAT]
コマンド・オプション
DNS_DOMAIN_ID- DNSドメインのID。
RULE_ID- カスタムルールのID。
-i, --instance- インスタンスの名前または ID。 設定されていない場合は、
ibmcloud cis instance-set INSTANCEで指定されたコンテキストインスタンスが使用されます。 -f, --force- 確認のメッセージを表示せずに、カスタムルールを削除しようとします。
--output- 出力形式を指定してください。
JSONのみがサポートされています。
コマンドの例
- カスタムルールを作成するには:
ibmcloud cis custom-waf rule-create 601b728b86e630c744c81740f72570c3 --action challenge --description "rule 1" --enabled true --match "(http.host eq \"www.example.com\")"
- カスタムルールを更新するには:
ibmcloud cis custom-waf rule-update 601b728b86e630c744c81740f72570c3 4d37cb6f87654e96a18bc531628a4d27 --enabled true
- カスタムルールを削除するには:
ibmcloud cis custom-waf rule-delete 601b728b86e630c744c81740f72570c3 4d37cb6f87654e96a18bc531628a4d27
APIのカスタム・ルール・エントリー・ポイントの取得
すべてのカスタムルールAPI操作は、カスタムルール段階のエントリポイントルールセットの RULESET_ID。
以下の手順に従って、カスタム・ルール・エントリ・ポイント・ルールセットを取得してください:
- 正しい変数を使用して API 環境をセットアップします。
- API コマンドで使用する以下の値を変数に格納します。
CRN:サービス・インスタンスの完全な URL-encoded Cloud Resource Name(CRN)。
ZONE_ID: ドメイン ID。
-
すべての変数が開始されたら、エントリーポイントのルールセットを取得する:
curl -X GET "https://api.cis.cloud.ibm.com/v1/$CRN/zones/$ZONE_ID/rulesets/phases/http_request_firewall_custom/entrypoint" \ --header "X-Auth-User-Token: Bearer <API_TOKEN>" \ --header "Content-Type: application/json"ルールセットIDは、成功したリクエストのレスポンスにある。 前述の呼び出しで404 Not Found応答が返された場合は、以下のAPIを使用してカスタムルールフェーズのエントリポイントルールセットを作成します:
curl -X POST https://api.cis.cloud.ibm.com/v1/$CRN/zones/$ZONE_ID/rulesets \ --header "X-Auth-User-Token: Bearer <API_TOKEN>" \ --header "Content-Type: application/json" \ --data '{ "name": "Zone-level phase entry point", "kind": "zone", "description": "Custom rule entry point ruleset.", "phase": "http_request_firewall_custom" }'
API を使用したカスタムルールの作成
APIを使用してカスタムルールを作成するには、以下の手順に従ってください:
- 正しい変数を使用して API 環境をセットアップします。
- API コマンドで使用する以下の値を変数に格納します。
CRN:サービス・インスタンスの完全な URL-encoded Cloud Resource Name(CRN)。
ZONE_ID: ドメイン ID。
RULESET_ID:カスタムルールのエントリポイントルールセットのID。
-
すべての変数の初期化が完了したら、カスタムルールを作成します:
curl -X POST "https://api.cis.cloud.ibm.com/v1/$CRN/zones/$ZONE_ID/rulesets/$RULESET_ID/rules" \ --header "X-Auth-User-Token: Bearer <API_TOKEN>" \ --header "Content-Type: application/json" \ --data '{ "description": "My custom rule with plain text response", "expression": "(ip.src.country eq \"GB\" or ip.src.country eq \"FR\") and cf.waf.score lt 20", "action": "block", "action_parameters": { "response": { "status_code": 403, "content": "Your request was blocked.", "content_type": "text/plain" } } }'
APIによるカスタムルールの更新
APIを使用して既存のカスタムルールを更新するには、以下の手順に従ってください:
- 正しい変数を使用して API 環境をセットアップします。
- API コマンドで使用する以下の値を変数に格納します。
CRN:サービス・インスタンスの完全な URL-encoded Cloud Resource Name(CRN)。
ZONE_ID: ドメイン ID。
RULESET_ID:カスタムルールのエントリポイントルールセットのID。
RULE_ID:変更するカスタムルールのID。
-
すべての変数の初期化が完了したら、カスタムルールを更新します:
curl -X PATCH "https://api.cis.cloud.ibm.com/v1/$CRN/zones/$ZONE_ID/rulesets/$RULESET_ID/rules/$RULE_ID" \ --header "X-Auth-User-Token: Bearer <API_TOKEN>" \ --header "Content-Type: application/json" \ --data '{ "enabled": false, "description": "block GB and FR or based on IP Reputation (temporarily disabled)" }'
APIによるカスタムルールの削除
APIを使用して既存のカスタムルールを削除するには、以下の手順に従ってください:
- 正しい変数を使用して API 環境をセットアップします。
- API コマンドで使用する以下の値を変数に格納します。
CRN:サービス・インスタンスの完全な URL-encoded Cloud Resource Name(CRN)。
ZONE_ID: ドメイン ID。
RULESET_ID:カスタムルールのエントリポイントルールセットのID。
RULE_ID:変更するカスタムルールのID。
-
すべての変数の初期化が完了したら、カスタムルールを削除してください:
curl -X DELETE "https://api.cis.cloud.ibm.com/v1/$CRN/zones/$ZONE_ID/rulesets/$RULESET_ID/rules/$RULE_ID" \ --header "X-Auth-User-Token: Bearer <API_TOKEN>" \ --header "Content-Type: application/json"
Terraformでカスタムルールを作成する
カスタム・ルールを作成するには、まずエントリー・ポイントを作成し、それからカスタム・ルールを作成する。 これを行うには、以下の手順を実行します。
-
エントリーポイント・ルールセットを作成するには、以下のコマンドを実行する:
resource "ibm_cis_ruleset_entrypoint_version" "test" { cis_id = "<cis-id>" domain_id = "<domain-id>" phase = "http_request_firewall_custom" rulesets { description = "Entry point ruleset for custom ruleset" } lifecycle { ignore_changes = [ rulesets ] } } -
カスタムルールを作成するには、次のコマンドを実行してください:
resource ibm_cis_ruleset_rule "config" { cis_id = ibm_cis.instance.id domain_id = data.ibm_cis_domain.cis_domain.domain_id ruleset_id = resource.ibm_cis_ruleset_entrypoint_version.rulesets[0].ruleset_id rule { action = "block" description = "var.description" expression = "true" enabled = "false" action_parameters { response { status_code = var.status_code content = var.content content_type = "text/plain" } } position { index = var.index after = <id of any existing rule> before = <id of any existing rule> } } }
次の例は、エントリーポイントとWAFカスタムルールを作成する方法を示している:
resource ibm_cis_ruleset_entrypoint_version test {
cis_id = ibm_cis.instance.id
domain_id = data.ibm_cis_domain.cis_domain.domain_id
phase = "http_request_firewall_custom"
rulesets {
description = "Entrypoint ruleset for custom ruleset"
}
lifecycle {
ignore_changes = [
rulesets
]
}
}
data ibm_cis_ruleset_entrypoint_versions custom_rule_ep {
cis_id = ibm_cis.instance.id
domain_id = data.ibm_cis_domain.cis_domain.domain_id
phase = "http_request_firewall_custom"
depends_on = [
ibm_cis_ruleset_entrypoint_version.test
]
}
resource ibm_cis_ruleset_rule "custom_rule1" {
cis_id = ibm_cis.instance.id
domain_id = data.ibm_cis_domain.cis_domain.domain_id
ruleset_id = data.ibm_cis_ruleset_entrypoint_versions.custom_rule_ep.rulesets[0].ruleset_id
rule {
action = "skip"
description = "adding custom rule via terraform"
expression = "true"
enabled = "true"
action_parameters{
ruleset = "current"
phases = ["http_ratelimit", "http_request_sbfm","http_request_firewall_managed"]
products = ["zoneLockdown","uaBlock", "bic", "hot", "securityLevel", "rateLimit","waf"]
}
}
}
resource ibm_cis_ruleset_rule "custom_rule2" {
cis_id = ibm_cis.instance.id
domain_id = data.ibm_cis_domain.cis_domain.domain_id
ruleset_id = data.ibm_cis_ruleset_entrypoint_versions.custom_rule_ep.rulesets[0].ruleset_id
rule {
action = "block"
description = "adding custom rule via terraform2"
expression = "(http.request.uri.path eq \"/path1\")"
enabled = "false"
}
}
詳細については、Terraformレジストリの ibm_cis_ruleset_rule を参照してください。
Terraformでカスタムルールを更新するには、前述の例を修正して terraform apply。 ルールを削除するには、設定を削除して terraform apply を実行するだけです。