AWS WAF の HTTP リクエストの XSS または SQLi 検査から特定の URI を除外する方法を教えてください。

所要時間3分
0

AWS WAF を使用すると、特定の HTTP リクエストで SQL インジェクション (SQLi) またはクロスサイトスクリプティング (XSS) の誤検出が発生します。HTTP リクエストの XSS または SQLi 検査から特定の URI を除外したいです。

簡単な説明

AWS マネージドルールとカスタムルールの XSS および SQLi ルール検査中に、誤検出が発生することがあります。誤検出を防ぐには、XSS および SQLi 検査から特定の URI パスを除外してください。そのためには、ネストされたステートメントを使用して例外を含むブロッキングルールを記述し、AWS WAF がリクエストを他のすべてのルールと照合して評価するようにします。

解決策

HTTP または HTTPS リクエストの例

http://www.amazon.com/path/string1?xss=%3Cscript%3E%3Cscript%3E&sql=UNION%20ALL%20SELECT%201

このリクエストでは、URI パスは**/path/string1** です。疑問符 (?) に続く文字列はクエリ文字列です。この例では、クエリ文字列は xss=%3Cscript%3E%3Cscript%3E&sql=UNION%20ALL%20SELECT%201 です。

XSS または SQLi 検査からの特定の URI を許可するルールの例

**注:**以下のルール構成例は参照用です。PositionalConstraintSearchString、****TextTransformationsなどのルールをカスタマイズします。同様のロジックを使用して、特定のヘッダー、クエリパラメータなどを許可できます。

ケース 1: AWS マネージドルールを使用する

AWS マネージドルールグループ AWSManagedRulesCommonRuleSet には、以下のルールが含まれています。

  • CrossSiteScripting_COOKIE
  • CrossSiteScripting_QUERYARGUMENTS
  • CrossSiteScripting_BODY
  • CrossSiteScripting_URIPATH

**AWSManagedRulesCommonRuleSet ** ルールグループには、リクエストの対応する部分に XSS 攻撃文字列がないか検査する BLOCK アクションがあります。詳細については、「コアルールセット (CRS) マネージドルールグループ」を参照してください。

同様に、ルールグループ awsManagedRulesSqliRuleSet には、クエリパラメータ、本文、URI パス、および SQLi インジェクション攻撃パターンに関する cookie を検査するルールがあります。詳細については、「ユースケース固有のルールグループ」を参照してください。

リクエストがこれらのルールに一致すると、AWS WAF は対応するラベルを生成します。次に、ウェブ ACL のカスタムルールは、これらの AWS マネージドルールラベルを使用して、一致したルール署名から特定のリクエストを選択的に除外できます。

特定の URI を許可するには、次の手順を実行します。

1.AWSManagedRulesCommonRuleSet ルールグループの以下のルールを Count モードのままにしておきます。

  • CrossSiteScripting_COOKIE
  • CrossSiteScripting_QUERYARGUMENTS
  • CrossSiteScripting_BODY
  • CrossSiteScripting_URIPATH

2.URI パスの例外を含むブロックアクションを含むルールを作成します。AWSManagedRulesCommonRuleSet の優先順位よりも低い優先度でルールを設定します。AWS WAF コンソールで優先度を低く設定するには、ルールをリストの下位に配置します。JSON の優先度を低く設定するには、大きい優先度の値を使用してください。

このルールは次のロジックを使用します。

(XSS_URIPATH or XSS_Cookie or XSS_Body or XSS_QueryArguments) AND (NOT allowlisted URIString) = BLOCK

次の設定を使用してください。

{
  "Name": "whitelist-xss",
  "Priority": 10,
  "Statement": {
    "AndStatement": {
      "Statements": \[
        {
          "OrStatement": {
            "Statements": \[
              {
                "LabelMatchStatement": {
                  "Scope": "LABEL",
                  "Key": "awswaf:managed:aws:core-rule-set:CrossSiteScripting\_URIPath"
                }
              },
              {
                "LabelMatchStatement": {
                  "Scope": "LABEL",
                  "Key": "awswaf:managed:aws:core-rule-set:CrossSiteScripting\_Cookie"
                }
              },
              {
                "LabelMatchStatement": {
                  "Scope": "LABEL",
                  "Key": "awswaf:managed:aws:core-rule-set:CrossSiteScripting\_Body"
                }
              },
              {
                "LabelMatchStatement": {
                  "Scope": "LABEL",
                  "Key": "awswaf:managed:aws:core-rule-set:CrossSiteScripting\_QueryArguments"
                }
              }
            \]
          }
        },
        {
          "NotStatement": {
            "Statement": {
              "ByteMatchStatement": {
                "SearchString": "/path/string1",
                "FieldToMatch": {
                  "UriPath": {}
                },
                "TextTransformations": \[
                  {
                    "Priority": 0,
                    "Type": "NONE"
                  }
                \],
                "PositionalConstraint": "CONTAINS"
              }
            }
          }
        }
      \]
    }
  },
  "Action": {
    "Block": {}
  },
  "VisibilityConfig": {
    "SampledRequestsEnabled": true,
    "CloudWatchMetricsEnabled": true,
    "MetricName": "whitelist-xss"
  }
}

注: この例では、OrStatement は、ウェブリクエストのすべてのラベルと部分 (本文、ヘッダー、URI パス、クエリ引数) から特定の URI を除外します。この例では、ウェブリクエストのすべての部分で同じ URI に対して誤検出が発生したことを前提としています。ただし、クエリの引数など、ウェブリクエストの一部でのみ誤検出が発生する可能性があります。この場合、ウェブリクエストの一部とそれに対応するラベルにのみ個別のルールを作成するのがセキュリティのベストプラクティスです。この個別のルールでは、ウェブリクエストのすべての部分から特定の URI パスを除外しないでください。

AWSManagedRulesSQLiRuleSet についても同じ手順を使用しますが、ラベルを AWSManagedRulesSQLiRuleSet が生成したラベルに置き換えてください。

検査から除外したい URI が複数ある場合は、NotStatement ステートメント内で OrStatementを使用してください。たとえば、**/path/string1 ** と /path/string2 を除外するには、次の NotStatement を使用します。

{
  "NotStatement": {
    "Statement": {
      "OrStatement": {
        "Statements": \[
          {
            "ByteMatchStatement": {
              "SearchString": "/path/string1",
              "FieldToMatch": {
                "UriPath": {}
              },
              "TextTransformations": \[
                {
                  "Priority": 0,
                  "Type": "NONE"
                }
              \],
              "PositionalConstraint": "CONTAINS"
            }
          },
          {
            "ByteMatchStatement": {
              "SearchString": "/path/string2",
              "FieldToMatch": {
                "UriPath": {}
              },
              "TextTransformations": \[
                {
                  "Priority": 0,
                  "Type": "NONE"
                }
              \],
              "PositionalConstraint": "CONTAINS"
            }
          }
        \]
      }
    }
  }
}

ケース 2: カスタムの XSS ルールと SQLi ルールを使用する

このルールは次のロジックを使用します。

(XSS_URIPATH or XSS_Cookie or XSS_Body or XSS_QueryArguments) AND (NOT allowlisted URIString) = BLOCK

次のルール設定を使用してリクエストの XSS 攻撃文字列を検査しますが、特定の URI_PATH を選択的に除外することもできます。

{
  "Name": "xss-URI",
  "Priority": 10,
  "Action": {
    "Block": {}
  },
  "VisibilityConfig": {
    "SampledRequestsEnabled": true,
    "CloudWatchMetricsEnabled": true,
    "MetricName": "xss-URI"
  },
  "Statement": {
    "AndStatement": {
      "Statements": \[
        {
          "OrStatement": {
            "Statements": \[
              {
                "XssMatchStatement": {
                  "FieldToMatch": {
                    "UriPath": {}
                  },
                  "TextTransformations": \[
                    {
                      "Priority": 0,
                      "Type": "NONE"
                    }
                  \]
                }
              },
              {
                "XssMatchStatement": {
                  "FieldToMatch": {
                    "Cookies": {
                      "MatchPattern": {
                        "All": {}
                      },
                      "MatchScope": "ALL",
                      "OversizeHandling": "CONTINUE"
                    }
                  },
                  "TextTransformations": \[
                    {
                      "Priority": 0,
                      "Type": "NONE"
                    }
                  \]
                }
              },
              {
                "XssMatchStatement": {
                  "FieldToMatch": {
                    "Body": {
                      "OversizeHandling": "CONTINUE"
                    }
                  },
                  "TextTransformations": \[
                    {
                      "Priority": 0,
                      "Type": "NONE"
                    }
                  \]
                }
              },
              {
                "XssMatchStatement": {
                  "FieldToMatch": {
                    "AllQueryArguments": {}
                  },
                  "TextTransformations": \[
                    {
                      "Priority": 0,
                      "Type": "NONE"
                    }
                  \]
                }
              }
            \]
          }
        },
        {
          "NotStatement": {
            "Statement": {
              "ByteMatchStatement": {
                "FieldToMatch": {
                  "UriPath": {}
                },
                "PositionalConstraint": "CONTAINS",
                "SearchString": "/path/string1",
                "TextTransformations": \[
                  {
                    "Type": "NONE",
                    "Priority": 0
                  }
                \]
              }
            }
          }
        }
      \]
    }
  }
}

**SQLi ** ステートメントを使用するときは、次の手順に従ってください。

注: URI だけを許可する優先度の高いルールを設定するのはベストプラクティスではありません。これにより、許可された URI_PATH のリクエストが、ウェブ ACL で定義された他のすべてのルールと照合されなくなります。

関連情報

ルールステートメントの基本

クロスサイトスクリプティング攻撃ルールステートメント

SQL インジェクション攻撃ルールステートメント

AWS公式
AWS公式更新しました 9ヶ月前
コメントはありません

関連するコンテンツ