【目次】

  1. 1. はじめに
  2. 2. Priorityが原因でルール適用に失敗するケース
  3. 3. 対応方法1 – お客様独自ルールの場合
  4. 4. 対応方法2 – マネージドルールの場合

1. はじめに

WafCharmにてAdvanced Ruleポリシーをご利用の場合、ルールの適用に失敗した場合、Statusに「設定エラー: 適用失敗」と記載されます。

ルールの適用に失敗する要因はいくつかありますが、今回はPriorityが原因で失敗するケースと、その対応方法について詳しく見ていきます。

Statusについては、以下のヘルプページをご参考ください。
各種リソース上で表示されるエラーについて(AWS WAF Classic/AWS WAF v2) – Advanced Ruleポリシーの場合

2. Priorityが原因でルール適用に失敗するケース

以下のヘルプページに記載の通り、Advanced RuleポリシーではWafCharmルールで使用するPriorityがいくつかあらかじめ決まっています。

この使用予定のPriorityが、お客様にて追加されたルールなど、想定しているWafCharmルール以外のルールで使われている場合に、Priorityが衝突することでエラーとなり、ルールの適用に失敗します。
WafCharmルールについて (AWS WAF v2) – Advanced Ruleポリシーの場合

このPriorityですが、AWS WAFの画面上で操作している場合、知らず知らずの間にWafCharmルールで使用する予定のPriorityを使ってしまっているというケースもございます。

具体的には、AWS WAFの画面上でルールを追加する際に、Set rule priorityの画面で「Move up」や「Move down」というボタンを使ってルールの位置(Priority)を変更すると、既存のルールのPriorityに書き換わるような形で位置の入れ替えが行われる仕組みとなっています。

例えば、以下のスクリーンショットの場合、「test-original-rule」というルールは現在一番後ろに配置されており、その手前に「WafCharm_」から始まる名前のルールが配置されています。
※本記事では便宜上、「test-original-rule」というルールの手前にあるルールを「WafCharm_ルール名1」とします。

「test-original-rule」を前に移動させる場合は、「Move up」ボタンをクリックします。この時、1回「Move up」ボタンをクリックすると、AWS WAFは「test-original-rule」のPriorityを「WafCharm_ルール名1」で使用しているPriority(ここでは、421とします)に変更し、「WafCharm_ルール名1」のPriorityを422に変更します。

421は上記のヘルプページの通りWafCharmルールで使用する予定のPriorityとなりますので、仮に「test-original-rule」で使用してしまった場合、次回以降の更新のタイミングでエラーが発生します。

このようなエラーを防ぐため、WafCharmでは現時点では0〜99のPriorityをご利用いただけるようお願いしております。
以降では、ルールを適用する際にPriorityを0〜99で利用するための方法を説明します。

3. 対応方法1 – お客様独自ルールの場合

お客様にてAWS WAFの画面からルールを追加する場合、JSON Editorを使ってPriorityを明示的に指定します。
ルールの設定を終えたら、ルール編集画面の右上に「Rule JSON editor」というボタンがありますので、こちらをクリックしてください。

これにより、作成したばかりのルールがJSON形式で表示されます。
Priorityと書かれた行がありますので、その数値を0〜99に変更します。以下のスクリーンショットの場合、 "Priority": 422, と記載されていますので、「422」という数字を「0」などに変更します。

数値を変更したら、「Add rule」をクリックします。先ほどPriorityを「0」に変更したので、Set rule priorityの画面でもルールが一番前に配置されています。
この画面では何も変更せず、「Save」をクリックします。

登録されたルールを再度確認すると、Priorityのところに「0」と記載されていることがわかります。

4. 対応方法2 – マネージドルールの場合

お客様作成ルールの場合は上記の通りJSON Editorを使用してPriorityを変更できますが、マネージドルールについてはJSON Editorが使用できません。そのため、マネージドルールを使用している場合はAWS CLIを用いてPriorityを指定する必要がありますので、以下にて手順を記載します。

AWS CLIのコマンドを使用しますが、お客様のAWS環境上の内容に応じて変更が必要な値については、<> 記号で括っています(例: Web ACLの名前CLOUDFRONTかREGIONALか など)。<> 記号で括られている部分については、適宜お客様のリソースにあわせてご変更ください。

具体的なAWS CLIの使い方などについてはAWSの公式ドキュメントをご確認ください。

  1. 以下のコマンドを実行し、現在のWeb ACLの情報を取得する
    aws wafv2 get-web-acl --name <Web ACLの名前> --scope <CLOUDFRONTかREGIONALか> --region=<リージョン> --id <Web ACL ID>
  2. 取得したWeb ACLの情報から、 "Rules": [] 内に含まれる部分をコピーする
  3. エディターなどにコピーした内容をペーストしたら、前後を [] で囲う
    例:

    [
        {
            "Name": "WafCharm_AAA_XXX",
            "Priority": 101,
            "Statement": {
                "RuleGroupReferenceStatement": {
                    "ARN": "ルールグループのARN"
                }
            },
            "OverrideAction": {
                "None": {}
            },
            "VisibilityConfig": {
                "SampledRequestsEnabled": true,
                "CloudWatchMetricsEnabled": true,
                "MetricName": "WafCharm_AAA_XXX"
            }
        },
        {
            "Name": "WafCharm_BBB_XXX",
            "Priority": 111,
            "Statement": {
                "RuleGroupReferenceStatement": {
                    "ARN": "ルールグループのARN"
                }
            },
            "OverrideAction": {
                "None": {}
            },
            "VisibilityConfig": {
                "SampledRequestsEnabled": true,
                "CloudWatchMetricsEnabled": true,
                "MetricName": "WafCharm_BBB_XXX"
            }
        },
        {
            "Name": "WafCharm_CCC_XXX",
            "Priority": 301,
            "Statement": {
                "RuleGroupReferenceStatement": {
                    "ARN": "ルールグループのARN"
                }
            },
            "OverrideAction": {
                "None": {}
            },
            "VisibilityConfig": {
                "SampledRequestsEnabled": true,
                "CloudWatchMetricsEnabled": true,
                "MetricName": "WafCharm_CCC_XXX"
            }
        },
        {
            "Name": "WafCharm_DDD_XXX",
            "Priority": 421,
            "Statement": {
                "RuleGroupReferenceStatement": {
                    "ARN": "ルールグループのARN"
                }
            },
            "OverrideAction": {
                "None": {}
            },
            "VisibilityConfig": {
                "SampledRequestsEnabled": true,
                "CloudWatchMetricsEnabled": true,
                "MetricName": "WafCharm_UseCase_Regex_XXX"
            }
        }
    ]
    

  4. 適用したいルールを適切な位置にJSON形式で指定し、ファイルを保存する
    適用したいルールのJSON形式での記載方法がわからない場合には、先にWeb ACL上でマネージドルールを適用し、順序を変更せずに保存した後、その情報を get-web-acl で取得することで、JSON形式での記載方法がわかります。
    例:AWSマネージドルールの「AWS-AWSManagedRulesAdminProtectionRuleSet」を優先順位10(WafCharmルールより前)に適用したい場合

    [
        {
            "Name": "AWS-AWSManagedRulesAdminProtectionRuleSet",
            "Priority": 10,
            "Statement": {
                "ManagedRuleGroupStatement": {
                    "VendorName": "AWS",
                    "Name": "AWSManagedRulesAdminProtectionRuleSet"
                }
            },
            "OverrideAction": {
                "None": {}
            },
            "VisibilityConfig": {
                "SampledRequestsEnabled": true,
                "CloudWatchMetricsEnabled": true,
                "MetricName": "AWS-AWSManagedRulesAdminProtectionRuleSet"
            }
        },
        {
            "Name": "WafCharm_AAA_XXX",
            "Priority": 101,
            "Statement": {
                "RuleGroupReferenceStatement": {
                    "ARN": "ルールグループのARN"
                }
            },
            "OverrideAction": {
                "None": {}
            },
            "VisibilityConfig": {
                "SampledRequestsEnabled": true,
                "CloudWatchMetricsEnabled": true,
                "MetricName": "WafCharm_AAA_XXX"
            }
        },
        {
            "Name": "WafCharm_BBB_XXX",
            "Priority": 111,
            "Statement": {
                "RuleGroupReferenceStatement": {
                    "ARN": "ルールグループのARN"
                }
            },
            "OverrideAction": {
                "None": {}
            },
            "VisibilityConfig": {
                "SampledRequestsEnabled": true,
                "CloudWatchMetricsEnabled": true,
                "MetricName": "WafCharm_BBB_XXX"
            }
        },
        {
            "Name": "WafCharm_CCC_XXX",
            "Priority": 301,
            "Statement": {
                "RuleGroupReferenceStatement": {
                    "ARN": "ルールグループのARN"
                }
            },
            "OverrideAction": {
                "None": {}
            },
            "VisibilityConfig": {
                "SampledRequestsEnabled": true,
                "CloudWatchMetricsEnabled": true,
                "MetricName": "WafCharm_CCC_XXX"
            }
        },
        {
            "Name": "WafCharm_DDD_XXX",
            "Priority": 421,
            "Statement": {
                "RuleGroupReferenceStatement": {
                    "ARN": "ルールグループのARN"
                }
            },
            "OverrideAction": {
                "None": {}
            },
            "VisibilityConfig": {
                "SampledRequestsEnabled": true,
                "CloudWatchMetricsEnabled": true,
                "MetricName": "WafCharm_DDD_XXX"
            }
        }
    ]
    

  5. 以下のコマンドを実行し、Web ACLをアップデートする
    Lock tokenの値は、 get-web-acl を実行した際に返ってきた値を使用します。
    aws wafv2 update-web-acl --name <Web ACLの名前> --scope <CLOUDFRONTかREGIONALか> --region=<リージョン> --id <Web ACL ID> --lock-token <Lock tokenの値> --default-action <Block={}|Allow={}> --rules <file://example.json> --visibility-config SampledRequestsEnabled=<true|false>,CloudWatchMetricsEnabled=<true|false>,MetricName=<Web ACLのメトリック名>
    以下のような形でLock Tokenが返ってきたら、アップデートは成功しています。

    {
        "NextLockToken": "Lock Tokenの値"
    }
    

  6. Web ACLの状態が意図通りになっていることを確認する