【目次】

  1. 1. はじめに
  2. 2. 記載内容
  3. 3. Statements 詳細(文字列一致)
  4. 4. Statements 詳細(文字列一致:複数フィールド指定)
  5. 5. Statements 詳細(文字列一致条件プラス国指定)
  6. 6. RegexPatternSet / IPSet
  7. 7. おわりに

1. はじめに

2019/11/25 AWS から new AWS WAF がリリースされました。ルールの記述が JSON で可能なため記述方法を解説します。

第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. 記載方法

WebACL 全体からルール部分を除いた JSON の大枠の構造です。

{
    "Name": "TEST ACL", 	#web ACLの名前を記載
    "Id": "XXXXXXXXXXXX", #発行されたID 
    "ARN": "XXXXXXX",	#発行されたARN
    "DefaultAction": { 		#デフォルトアクション(BLOCK か ALLOW)
        "Block": {} 
        "Allow": {}
    },
    "Description": "TEST", 	#web ACLの説明を記載
    "Rules": [ 				#ルールの配列
        {
            <Rule #1>
        }, {
            <Rule #2>
        }
    ],
    "VisibilityConfig": { 
        "SampledRequestsEnabled": true,#サンプルリクエスト 
        "CloudWatchMetricsEnabled": true, #CloudWatch
        "MetricName": "TestMetric"#メトリクス名
    } 
}

Rules 部分の詳細

"Rules": [
    {
        "Name": "rule1",	#ルール名
        "Priority": 1, 		#ルールの優先順位
        "Statements": {		#条件
            <Condition>
        },
        "Action": {			#アクションを一つ選択
            "Block": {} 
            "Allow": {} 
            "Count": {}
        },
        "VisibilityConfig": { 
            "SampledRequestsEnabled": true,#サンプルリクエスト
            "CloudWatchMetricsEnabled": true,#CloudWatch
            "MetricName": "rule1"#メトリクス名
        } 
    }
]

 

3. Statements 詳細(文字列一致)

Statement 内で指定できる条件は一つだけです。

"Statements": {
    "ByteMatchStatement": {
        "SearchString": "kensakumoji", 	#検索文字列
        "FieldToMatch": {		#フィールドを一つ選択
            "SingleHeader": { "Name": "foo" }, 
            "SingleQueryArgument": { "Name": "foo" }, 
            "AllQueryArguments": {},
            "UriPath": {},
            "QueryString": {}, 
            "Body": {}, 
            "Method": {}
        }, 
        "TextTransformations": [			#変換処理
            { "Priority": 1, "Type": "COMPRESS_WHITE_SPACE" },
            { "Priority": 2, "Type": "HTML_ENTITY_DECODE" }
        ],
        "PositionalConstraint": "EXACTLY"	#一致条件
    }
}

Statement を複数指定して OR 条件でいずれかに合致させたい場合は、この後説明する「OrStatement 」を使用します。Statement を複数指定して AND 条件で全てに合致させたい場合は「AndStatement 」を使用します。

例として、複数フィールドを指定して、フィールドのいずれかに文字列があった際の処理を実現する記述例を下記に示します。

4. Statements 詳細(文字列一致:複数フィールド指定)

Statements 配下に OrStatement を入れて、それぞれの条件を並べて囲む形となります。

"Statements": {
    "OrStatement": {
        "Statements": [
            "ByteMatchStatement": {
                "SearchString": "kensakumoji", 
                "FieldToMatch": {	
                    "UriPath": {},
                }, 
                "TextTransformations": [
                    { "Priority": 1, "Type": "COMPRESS_WHITE_SPACE" },
                    { "Priority": 2, "Type": "HTML_ENTITY_DECODE" }
                ],
                "PositionalConstraint": "EXACTLY"
            }, {
            "ByteMatchStatement": {
                "SearchString": "kensakumoji", 
                "FieldToMatch": {
                    "QueryString": {}, 
                }, 
                "TextTransformations": [
                    { "Priority": 1, "Type": "COMPRESS_WHITE_SPACE" },
                    { "Priority": 2, "Type": "HTML_ENTITY_DECODE" }
                ],
                "PositionalConstraint": "EXACTLY"
            }, {
            "ByteMatchStatement": {
                "SearchString": "kensakumoji", 
                "FieldToMatch": {				
                    "Body": {}, 
                }, 
                "TextTransformations": [
                    { "Priority": 1, "Type": "COMPRESS_WHITE_SPACE" },
                    { "Priority": 2, "Type": "HTML_ENTITY_DECODE" }
                ],
                "PositionalConstraint": "EXACTLY"
            }
        ]
    }
}

 

5. Statements 詳細(文字列一致条件プラス国指定)

先ほどの文字列一致条件に国の指定も加えます。

"Statements": {
    "AndStatement": {
        "Statements": [
            "ByteMatchStatement": {
                "SearchString": "kensakumoji", 
                "FieldToMatch": {
                    "UriPath": {},
                }, 
                "TextTransformations": [
                    { "Priority": 1, "Type": "COMPRESS_WHITE_SPACE" },
                    { "Priority": 2, "Type": "HTML_ENTITY_DECODE" }
                ],
                "PositionalConstraint": "EXACTLY"
            }, {
            "GeoMatchStatement": { 
                "CountryCodes": [ "US", "CN" ]		#ISO Country Codeで指定
            }
        ]
    }
}

6. RegexPatternSet / IPSet

AWS WAF Classic でも使われていましたが、正規表現は RegexPatternSet を作成して、それをルールとして当てはめることになります。またホワイトリストやブラックリストで、使用していた IP 制御に関しても IPSet に変わりました。呼び出しは、それぞれ付与される ARN にて実施します。それぞれの記載を見てみましょう。
RegexPatternSet / IPSet を登録すると、ARN が発行されます。発行された ARN を使用してStatement を作成します。

Statements 詳細( RegexPatternSet / IPSet )

・IP アドレス

"Statements": {
    "IPSetReferenceStatement": {
        "ARN": "IPset" 			#発行されたARN で指定します
    }
}

・正規表現

"Statements": {
    "RegexPatternReferenceStatement": { 
        "ARN": "Regex",			# 発行された ARN で指定します
        "FieldToMatch": {			#フィールドを一つ選択
            "SingleHeader": { "Name": "foo" },
            "SingleQueryArgument": { "Name": "foo" },
            "AllQueryArguments": {},
            "UriPath": {},
            "QueryString": {},
            "Body": {}, 
            "Method": {}
        }, 
        "TextTransformations": [
            { "Priority": 1, "Type": "COMPRESS_WHITE_SPACE" },
            { "Priority": 2, "Type": "HTML_ENTITY_DECODE" }
        ] 
    }
}

ルールグループの作成
ルールグループとして、いくつかのルールをまとめたものを作成することが、可能です。 RegexPatternSet / IPSet と同様に登録した後に、ARN を発行して Statement を作成します。グループの場合は、 OverrideAction でグループ全体の COUNT モードへの変更が可能です。個別ルールの COUNT モードは、 ExcludedRules で行います。

Statements 詳細(グループ)

"Statements": {
    "RuleGroupReferenceStatement": {
        "ARN": "TestRuleGroup", 	#発行された ARN で指定します
        "ExcludedRules": [		#除外するルールを宣言
            { "Name": "Rule1" },
            { "Name": "Rule2" }
        ] 
    }
},
"OverrideAction": {				#グループのモードへの切り替え
    "None": {}
},

 

7. おわりに

AWS WAF Classic での Condition と Filter の関係から変わって、Statement という単位になりました。文字列一致 Statement と国一致 Statement 等を論理的に組み合わせることにより、一つのルールを作成します。AWS WAF Classic より、 構造が整理され直感的にルールの作成は可能でした。