スキップしてコンテンツを表示

AWS WAF で複雑なカスタム JSON ルールを作成する方法を教えてください。

所要時間3分
0

AWS WAF で複雑なカスタム JSON ルールを作成したいと考えています。

解決策

複雑なカスタムルールを作成する

次の手順を実行します。

  1. AWS WAF コンソールを開く。
  2. ナビゲーションペインで [Rule groups] (ルールグループ) を選択する。
  3. ルールグループを選択します。
  4. [Manage rules] (ルールを管理) を選択し、次に [Add rule] (ルールを追加) を選択します。
  5. [Custom rule] (カスタムルール) を選択し、[Next] (次へ) を選択します。
  6. JSON を選択し、ルール JSON エディターを開きます。
  7. ルール JSON エディターをカスタムルールで更新します。
  8. [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、ホスト) を含めていない場合、リクエストがブロックされます。

AWS公式更新しました 7ヶ月前
1コメント

This article was reviewed and updated on 2026-03-05.

エキスパート

応答済み 2ヶ月前

関連するコンテンツ