AWS WAF で複雑なカスタム JSON ルールを作成する方法を教えてください。
AWS WAF で複雑なカスタム JSON ルールを作成したいと考えています。
解決策
複雑なカスタムルールを作成する
次の手順を実行します。
- AWS WAF コンソールを開く。
- ナビゲーションペインで [Rule groups] (ルールグループ) を選択する。
- ルールグループを選択します。
- [Manage rules] (ルールを管理) を選択し、次に [Add rule] (ルールを追加) を選択します。
- [Custom rule] (カスタムルール) を選択し、[Next] (次へ) を選択します。
- JSON を選択し、ルール JSON エディターを開きます。
- ルール JSON エディターをカスタムルールで更新します。
- [Add rule] (ルールを追加) を選択します。
**注: ** ネストされたステートメントを使用するカスタムルールを作成するには、JSON エディターを使用する必要があります。ネストされたステートメントは、AND、OR、または NOT ロジックを組み合わせたものです。詳細については、"Using rule statement in AWS WAF" (AWS WAF でのルールステートメントの使用) を参照してください。
次の例を参考にして、独自のカスタムルールロジックを作成してください。
例 1
次のカスタムルールステートメントを使用すると、United States - US から発信され、URI が /wp-admin/ または /wp-login/ であるリクエストが許可されます。
{ "Name": "test", "Priority": 100, "Statement": { "AndStatement": { "Statements": [ { "GeoMatchStatement": { "CountryCodes": [ "US" ] } }, { "OrStatement": { "Statements": [ { "ByteMatchStatement": { "SearchString": "/wp-admin/", "FieldToMatch": { "UriPath": {} }, "TextTransformations": [ { "Priority": 0, "Type": "NONE" } ], "PositionalConstraint": "CONTAINS" } }, { "ByteMatchStatement": { "SearchString": "/wp-login/", "FieldToMatch": { "UriPath": {} }, "TextTransformations": [ { "Priority": 0, "Type": "NONE" } ], "PositionalConstraint": "CONTAINS" } } ] } } ] } }, "Action": { "Allow": {} }, "VisibilityConfig": { "SampledRequestsEnabled": true, "CloudWatchMetricsEnabled": true, "MetricName": "test" } }
**ルールのロジック: ** リクエストは (米国から) 送信され、URI は ( /a OR /b ) ) です。
例 2
次のカスタムルールステートメントを使用すると、ボディに XSS 署名を含むリクエストがブロックされます。このルールは /test、/login、/admin URI をインスペクションから除外します。
{ "Name": "XSS_Block_Allow_Uploads", "Priority": 100, "Statement": { "AndStatement": { "Statements": [ { "XssMatchStatement": { "FieldToMatch": { "Body": {} }, "TextTransformations": [ { "Priority": 0, "Type": "NONE" } ] } }, { "NotStatement": { "Statement": { "OrStatement": { "Statements": [ { "ByteMatchStatement": { "SearchString": "/test", "FieldToMatch": { "UriPath": {} }, "TextTransformations": [ { "Priority": 0, "Type": "NONE" } ], "PositionalConstraint": "EXACTLY" } }, { "ByteMatchStatement": { "SearchString": "/admin", "FieldToMatch": { "UriPath": {} }, "TextTransformations": [ { "Priority": 0, "Type": "NONE" } ], "PositionalConstraint": "EXACTLY" } }, { "ByteMatchStatement": { "SearchString": "/login", "FieldToMatch": { "UriPath": {} }, "TextTransformations": [ { "Priority": 0, "Type": "NONE" } ], "PositionalConstraint": "EXACTLY" } } ] } } } } ] } }, "Action": { "Block": {} }, "VisibilityConfig": { "SampledRequestsEnabled": true, "CloudWatchMetricsEnabled": true, "MetricName": "XSS_Block_Allow_Uploads" } }
**ルールのロジック: ** リクエスト (ボディには XSS 署名) があり、URI にはない (/a OR /b, OR /c)。
例 3
次のカスタムルールステートメントを使用すると、カスタムラベル internal を含むリクエストがブロックされます。また、リクエストがホスト、IP アドレス、URI の特定の組み合わせを持っていることは許可されません。
{ "Name": "Block_internal_unauthorized", "Priority": 100, "Statement": { "AndStatement": { "Statements": [ { "LabelMatchStatement": { "Scope": "LABEL", "Key": "internal" } }, { "NotStatement": { "Statement": { "AndStatement": { "Statements": [ { "ByteMatchStatement": { "FieldToMatch": { "UriPath": {} }, "PositionalConstraint": "EXACTLY", "SearchString": "/test", "TextTransformations": [{ "Type": "NONE", "Priority": 0 }] } }, { "IPSetReferenceStatement": { "ARN": "arn:aws:wafv2:us-east-1:555555555555:regional/ipset/internal_IPs/###-##-###" } }, { "ByteMatchStatement": { "FieldToMatch": { "SingleHeader": { "Name": "host" } }, "PositionalConstraint": "EXACTLY", "SearchString": "example.com", "TextTransformations": [{ "Type": "NONE", "Priority": 0 }] } } ] } } } } ] } }, "Action": { "Block": {} }, "VisibilityConfig": { "SampledRequestsEnabled": true, "CloudWatchMetricsEnabled": true, "MetricName": "Block_internal_unauthorized" } }
**ルールのロジック: ** リクエストに (ラベルを含めて)、(URI、IP、ホスト) を含めていない場合、リクエストがブロックされます。
This article was reviewed and updated on 2026-03-05.
関連するコンテンツ
AWS公式更新しました 6ヶ月前