WAFカスタムルールの操作

WAFのカスタムルールは、 HTTP のトラフィックを対象とし、カスタム条件を適用して特定のリクエストをブロック、検証、記録、または許可することで、強力かつ柔軟な機能を提供します。

さまざまな種類のWAFカスタムルールを作成できます。 ただし、サイト上のアクティブなルールの数は、お客様のプランによって制限されます。 受給資格の詳細については、 「CIS プランを比較する 」を参照のこと。

プラン当たりのアクティブ・ルールの数は固定されています。 現在、アクティブなルールを追加で購入することはできません。

作業を始める前に 、「フィールド、関数、および式の使用」を 復習しておくと良いでしょう。

コンソール、CLI、API、またはTerraformを使用して、カスタムルールを作成、更新、削除できます。

コンソールでカスタムルールを作成する

コンソールでカスタムルールを作成するには、以下の手順に従ってください:

WAFカスタムルールは、既存のファイアウォールルールページを使用して設定する。 以前にドメインで作成されたレガシーファイアウォールルールは、自動的にWAFカスタムルールに変換されます。

  1. CIS コンソールで、 Security に移動する。

  2. [ カスタムルール ] タブを選択し、[ 作成 ] をクリックします。

  3. 任意で説明を入力してください。

  4. 必要に応じて、優先順位を入力します (オプション)。 優先度がゼロの場合は優先度なしとみなされ、最後に評価されます。

  5. **「着信要求 (Incoming requests)」**セクションで、UI ビルダーを使用して条件を追加します。 複数の条件を持つ式を作成するには、以下のいずれかをクリックします。

    • そして、使用状況_と_ロジックを評価する
    • あるいはOR論理(または) を用いて、条件や、以前に「 _AND」で結合された_条件のグループを評価する場合

    条件を作成すると、「式のプレビュー (Expression Preview)」にその式がプレーン・テキストで表示されます。

    「式のプレビュー (Expression Preview)」では、「ビジュアル式ビルダー (Visual Expression Builder)」を使用する代わりに式をクリックして手動で編集することも、2 つの方式を切り替えることもできます。 ただし、手動で作成された式の複雑さによっては、「ビジュアル式ビルダー (Visual Expression Builder)」で式をレンダリングできない場合があります。

  6. **「応答」**リスト・メニューからアクションを選択します。

  7. ルールを保存するには、以下のいずれかをクリックして最適なオプションを選択します。

    • ルールを保存するには「 下書きとして保存 」を選択しますが、このルールは無効のままにしておきます。
    • 保存してデプロイ: ルールを保存してアクティブ化します。

コンソールでカスタムルールを更新する

コンソールで既存のカスタムルールを更新するには、以下の手順に従ってください:

  1. CIS コンソールで、 Security に移動する。
  2. [ カスタムルール ] タブを選択します。
  3. 「カスタムルール」テーブルで、変更したいルールを探し、その行の右側にある「アクション」メニューをクリックします。
  4. **「編集」**を選択します。
  5. ルールに変更を加えます。
  6. ルールを保存するには、以下のいずれかをクリックして最適なオプションを選択します。
    • ルールを保存するには「 下書きとして保存 」を選択しますが、このルールは無効のままにしておきます。
    • 保存してデプロイ: ルールを保存してアクティブ化します。

既存のルールのリスト内のルールを一時停止またはアクティブ化するには、**「有効」**トグルをクリックします。

コンソールでカスタムルールを削除する

コンソールで既存のカスタムルールを削除するには、以下の手順に従ってください:

  1. CIS コンソールで、 Security に移動する。
  2. 「カスタムルール」テーブルで、削除したいルールを探し、その行の右側にある「アクション」メニューをクリックします。
  3. アクションメニューから「 削除 」を選択します。
  4. ルールを削除するには、 [WAFカスタムルールを削除]をクリックします。

CLIからカスタムルールを作成する

CLIからカスタムルールを作成するには、以下の手順に従う:

  1. CLI 環境をセットアップします。

  2. CLIからアカウントにログインしてください。 パスワードを入力すると、システムから、使用するアカウントと地域を入力するよう求められます:

    ibmcloud login --sso
    
  3. カスタムルールを作成するには、次のコマンドを実行してください:

    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: 実行するルールアクション。 有効な値は blockchallengejs_challengemanaged_challengelogskip
  • オプションのフィールドは、 descriptionenabledloggingaction_parameters

    • action_parameters: ルールアクションのパラメータ。
    • ruleset 残りのすべてのルールまたは 1 つ以上の WAF 管理ルールセットをスキップします。 有効な値は「 current 」です。
    • phases: 一致したリクエストに対して、WAFコンポーネントをスキップします。 有効な値は http_ratelimithttp_request_firewall_managedhttp_request_sbfm
    • products マッチング要求に対して特定のセキュリティ製品をスキップする。 有効な値は wafrateLimitsecurityLevelhotbicuaBlockzoneLockdown
    • response: block アクションに対するカスタムレスポンスを定義します。
      • status_code: 応答の HTTP ステータスコードを、 400-499 の範囲から選択してください。
      • content_type カスタムレスポンスのコンテンツタイプ。 有効なレスポンス・タイプは、text/htmltext/plainapplication/jsontext/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: 実行するルールアクション。 有効な値は blockchallengejs_challengemanaged_challengelogskip
  • オプションのフィールドは、 descriptionenabledloggingaction_parameters

    • action_parameters: ルールアクションのパラメータ。
      • ruleset 残りのすべてのルールまたは 1 つ以上の WAF 管理ルールセットをスキップします。 有効な値は current
      • phases: 一致したリクエストに対して、WAFコンポーネントをスキップします。 有効な値は http_ratelimithttp_request_firewall_managedhttp_request_sbfm
      • products マッチング要求に対して特定のセキュリティ製品をスキップする。 有効な値は wafrateLimitsecurityLevelhotbicuaBlockzoneLockdown
      • response: 「block」アクションに対するカスタムレスポンスを定義します。
        • status_code: 応答の HTTP ステータスコードを、 400-499 の範囲から選択してください。
        • content_type カスタムレスポンスのコンテンツタイプ。 有効なレスポンス・タイプは text/htmltext/plainapplication/jsontext/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

以下の手順に従って、カスタム・ルール・エントリ・ポイント・ルールセットを取得してください:

  1. 正しい変数を使用して API 環境をセットアップします。
  2. API コマンドで使用する以下の値を変数に格納します。

CRN:サービス・インスタンスの完全な URL-encoded Cloud Resource Name(CRN)。

ZONE_ID: ドメイン ID。

  1. すべての変数が開始されたら、エントリーポイントのルールセットを取得する:

    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を使用してカスタムルールを作成するには、以下の手順に従ってください:

  1. 正しい変数を使用して API 環境をセットアップします。
  2. API コマンドで使用する以下の値を変数に格納します。

CRN:サービス・インスタンスの完全な URL-encoded Cloud Resource Name(CRN)。

ZONE_ID: ドメイン ID。

RULESET_ID:カスタムルールのエントリポイントルールセットのID。

  1. すべての変数の初期化が完了したら、カスタムルールを作成します:

    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を使用して既存のカスタムルールを更新するには、以下の手順に従ってください:

  1. 正しい変数を使用して API 環境をセットアップします。
  2. API コマンドで使用する以下の値を変数に格納します。

CRN:サービス・インスタンスの完全な URL-encoded Cloud Resource Name(CRN)。

ZONE_ID: ドメイン ID。

RULESET_ID:カスタムルールのエントリポイントルールセットのID。

RULE_ID:変更するカスタムルールのID。

  1. すべての変数の初期化が完了したら、カスタムルールを更新します:

    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を使用して既存のカスタムルールを削除するには、以下の手順に従ってください:

  1. 正しい変数を使用して API 環境をセットアップします。
  2. API コマンドで使用する以下の値を変数に格納します。

CRN:サービス・インスタンスの完全な URL-encoded Cloud Resource Name(CRN)。

ZONE_ID: ドメイン ID。

RULESET_ID:カスタムルールのエントリポイントルールセットのID。

RULE_ID:変更するカスタムルールのID。

  1. すべての変数の初期化が完了したら、カスタムルールを削除してください:

    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でカスタムルールを作成する

カスタム・ルールを作成するには、まずエントリー・ポイントを作成し、それからカスタム・ルールを作成する。 これを行うには、以下の手順を実行します。

  1. エントリーポイント・ルールセットを作成するには、以下のコマンドを実行する:

    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
          ]
      }
    }
    
  2. カスタムルールを作成するには、次のコマンドを実行してください:

       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 を実行するだけです。