【目次】

  1. 1. はじめに
  2. 2. パターンセットとは
  3. 3. 登録方法
  4. 4. ルールグループとは
  5. 5. おわりに

1. はじめに

2019/11/25 AWS から new AWS WAF がリリースされました。今回は画面【パターンセット・ルールグループ】について解説していきます。

第1回 : 【new AWS WAF】変更点まとめ
第2回 : 【new AWS WAF】AWS マネジメントコンソール操作(マネージドルール編)
第3回 : 【new AWS WAF】AWS マネジメントコンソール操作(オリジナルルール編)
第4回 : 【new AWS WAF】AWS マネジメントコンソール操作(パターンセット・ルールグループ編)(本記事)
第5回 : 【new AWS WAF】JSON 解説

2. パターンセットとは

AWS WAF Classic で正規表現で使用されていましたパターンセットが、IP 制限にも適用出来るようになりました。パターンセットは予め定義しておいた内容(正規表現、IP 制限)をルールを構築する際に紐づけて使用するものです。
IP でも使用出来るようになったので、例えば、関連会社の IP を全て許可するパターンを作っておけば、新しく作った環境にその IP パターンセットをホワイトリストで使用し、少し絞った自社のみの IP パターンセットも用意して、サイトとの特性により、使い分けることも出来そうです。変更は、パターンセット側のみに実施すればいいので、複数の管理を行っている方には、嬉しい機能となっています。

3. 登録方法

画面左側の「 Regex pattern sets 」を選択して、画面右上の「 Create regex pattern set 」を押下します。

名前と説明を入力して、画面下部に正規表現を入力していきます。
一つの正規表現パターンを一行ずつ記載していきます。
最後に右下の「Create regex pattern set 」を押下して、終了です。


Web ACL にルールを紐付けていきます。「 Add rules 」を押下します。
「 Add my own rules and rule groups 」を選択します。


前回のオリジナルルール編と同様にルールを作成していきます。
今回選ぶ「 Match type 」が、正規表現のルールとなります。


「 Match type 」を選択すると、正規表現のパターンセットを選択する項目が、追加されました。先ほど作成されたパターンセットを選択します。


このまま進んで保存すれば、ルールの設定は終了です。

JSON 形式を見てみます。

{
    "Name": "test-regex-rule",
    "Priority": 0,
    "Action": {
        "Block": {}
    },
    "VisibilityConfig": {
        "SampledRequestsEnabled": true,
        "CloudWatchMetricsEnabled": true,
        "MetricName": "test-regex-rule"
    },
    "Statement": {
        "RegexPatternSetReferenceStatement": {
            "FieldToMatch": {
                "QueryString": {}
            },
            "ARN": "arn:aws:wafv2:ap-northeast-1:***********:regional/regexpatternset/test-regex/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
            "TextTransformations": [
                {
                    "Type": "LOWERCASE",
                    "Priority": 0
                }
            ]
        }
    }
}

パターンセットの内容が書いてあるわけではなく、ARN とのリンクのみでした。
中身を更新しても ARN が変わるわけではないので、パターンセットの更新で紐づいている対象は更新されることになります。

IP パターンセットも同様のため設定画面のみ確認します。

4. ルールグループとは

AWS WAF Classic でも使用できましたが、複数のルールをグループとしてまとめる機能も ARN で呼び出す形になります。他のルールセットと同様にルールグループを書き換えれば紐づいているルールも変わることになるので、複数 ACL を管理している場合は便利な機能です。

まずは作成してみます。

名前を入力します。


ルールとキャパシティの設定画面です。
試しにルールを入れてみます。


ルールを入れると、キャパシティが自動で更新されました。


次の画面では、ルール順の変更が出来ます。


最後に確認画面です。

設定自体は、簡単に出来ました。
キャパシティを編集しない状態で登録したルールで、自動更新された内容を利用したところ、一点問題がありました。
画面上からルールグループにルールを追加しようとすると、キャパシティを超えてしまうという注意文が出て、追加出来ませんでした。変更の発生を考えると、事前にある程度の値で、宣言しておく必要がありました。このキャパシティは、WCU でのコストとなります。独自に作成可能なマネージドルールのようなもの、とイメージすると、分かりやすいかと思います。

では実際に紐づけていきます。
ルール追加は、ACL の画面から行います。


ルールグループを選択して、登録済みのルールグループを選択するだけで完了です。
ルール全体を COUNT で登録することも出来ます。


マネージドルールと同様にルールグループ内の一部ルールのみを COUNT にする
ことも可能です。まずはルールの編集を選びます。


特定のルールを COUNT に出来ました。

JSON の状態を確認します。
正規表現のルールセット同様に ARN で呼び出されています。
また、マネージドルールと同様に一部ルールが ExcludedRules になっていることが確認出来ました。

{
    "Name": "test",
    "Id": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
    "ARN": "arn:aws:wafv2:ap-northeast-1:************:regional/webacl/test/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
    "DefaultAction": {
        "Allow": {}
    },
    "Description": "",
    "Rules": [
        {
            "Name": "test-rule-group",
            "Priority": 0,
            "Statement": {
                "RuleGroupReferenceStatement": {
                    "ARN": "arn:aws:wafv2:ap-northeast-1:************:regional/rulegroup/test-group/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
                    "ExcludedRules": [
                        {
                            "Name": "test_rule1"
                        }
                    ]
                }
            },
            "OverrideAction": {
                "None": {}
            },
            "VisibilityConfig": {
                "SampledRequestsEnabled": true,
                "CloudWatchMetricsEnabled": true,
                "MetricName": "test-rule-group"
            }
        },
        {
            "Name": "test-regex-rule",
            "Priority": 1,
            "Statement": {
                "RegexPatternSetReferenceStatement": {
                    "ARN": "arn:aws:wafv2:ap-northeast-1:************:regional/regexpatternset/test-regex/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
                    "FieldToMatch": {
                        "QueryString": {}
                    },
                    "TextTransformations": [
                        {
                            "Priority": 0,
                            "Type": "LOWERCASE"
                        }
                    ]
                }
            },
            "Action": {
                "Block": {}
            },
            "VisibilityConfig": {
                "SampledRequestsEnabled": true,
                "CloudWatchMetricsEnabled": true,
                "MetricName": "test-regex-rule"
            }
        },
        {
            "Name": "AWS-AWSManagedRulesAdminProtectionRuleSet",
            "Priority": 2,
            "Statement": {
                "ManagedRuleGroupStatement": {
                    "VendorName": "AWS",
                    "Name": "AWSManagedRulesAdminProtectionRuleSet",
                    "ExcludedRules": [
                        {
                            "Name": "AdminProtection_URIPATH"
                        }
                    ]
                }
            },
            "OverrideAction": {
                "None": {}
            },
            "VisibilityConfig": {
                "SampledRequestsEnabled": true,
                "CloudWatchMetricsEnabled": true,
                "MetricName": "AWS-AWSManagedRulesAdminProtectionRuleSet"
            }
        },
        {
            "Name": "AWS-AWSManagedRulesCommonRuleSet",
            "Priority": 3,
            "Statement": {
                "ManagedRuleGroupStatement": {
                    "VendorName": "AWS",
                    "Name": "AWSManagedRulesCommonRuleSet",
                    "ExcludedRules": [
                        {
                            "Name": "UserAgent_BadBots_HEADER"
                        },
                        {
                            "Name": "SizeRestrictions_URIPATH"
                        },
                        {
                            "Name": "EC2MetaDataSSRF_URIPATH"
                        }
                    ]
                }
            },
            "OverrideAction": {
                "None": {}
            },
            "VisibilityConfig": {
                "SampledRequestsEnabled": true,
                "CloudWatchMetricsEnabled": true,
                "MetricName": "AWS-AWSManagedRulesCommonRuleSet"
            }
        }
    ],
    "VisibilityConfig": {
        "SampledRequestsEnabled": true,
        "CloudWatchMetricsEnabled": true,
        "MetricName": "test"
    },
    "Capacity": 860
}

5. おわりに

WCU を意識すれば、独自のルールセットを作成して管理することが可能です。操作も分かりやすく JSON 形式でも認識しやすいものでした。