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

ボットからのリクエストが AWS WAF Bot Control ルールグループによりブロックされる場合に、許可する方法を教えてください。

所要時間4分
0

正当なボットからのリクエストが、AWS WAF Bot Control ルールグループにより拒否されるため、そのリクエストを許可したいと考えています。

解決策

正当なボットによるリクエストが、Bot Control ルールグループによりブロックされる場合、許可するには次の手順を実行します。

注: AWS WAF Bot Control ルールグループは、ボットの検証に AWS WAF の IP アドレスを使用します。検証されたボットの一部は、リクエストを転送する際、プロキシまたは CDN 経由のルーティングを行うため、クライアントの IP アドレスは保持されません。ボットがこのようなルーティングを行う場合は、そのボットを明示的に許可する必要があります。

AWS WAF ログを参照し、リクエストをブロックする Bot Control ルールを特定する

正当なボットリクエストをブロックするルールを特定するには、AWS WAF ログを分析します。Amazon Athena クエリまたは Amazon CloudWatch Log Insights を使用します。

Athena クエリを使用して AWS WAF ログを分析する

次の手順を実行します。

  1. Athena でパーティションプロジェクションを使用し、AWS WAF ログに対応するテーブルを作成します
  2. ブロックされたリクエストの詳細を特定するには、次の Athena クエリを実行します。
    WITH waf_data AS
    (SELECT from_unixtime(waf.timestamp / 1000) as time,
    waf.terminatingRuleId,
    waf.action,
    waf.httprequest.clientip as clientip,
    waf.httprequest.requestid as requestid,
    waf.httprequest.country as country,
    rulegroup.terminatingrule.ruleid as matchedRule,
    labels as Labels,
    map_agg(LOWER(f.name),
    f.value) AS kv
    FROM waf_logs waf,
    UNNEST(waf.httprequest.headers)
    AS t(f), UNNEST(waf.rulegrouplist) AS t(rulegroup)
    WHERE rulegroup.terminatingrule.ruleid IS NOT NULL
    GROUP BY 1, 2, 3, 4, 5, 6, 7,8)
    SELECT waf_data.time,
    waf_data.action,
    waf_data.terminatingRuleId,
    waf_data.matchedRule,
    waf_data.kv['user-agent'] as UserAgent,
    waf_data.kv['user-agent'] like 'pingdom%',
    waf_data.clientip,
    waf_data.country,
    waf_data.Labels
    FROM waf_data
    Where terminatingRuleId='AWS-AWSManagedRulesBotControlRuleSet'
    and time > now() - interval '3' day
    ORDER BY time
    DESC
    注: 実際のケースに合わせて waf_logs をテーブル名に、waf_data をデータベース名に、time > now() - interval '3' day を期間に、pingdom% をボット名に置き換えてください。
    指定した期間におけるレコードをフィルターする Athena クエリ例については、「AWS WAF ログのクエリ」を参照してください。
  3. MatchedRule 列を参照し、正当なボットリクエストをブロックするルールを特定します。ステップ 2 の Athena クエリ出力例を次に示します。
    #: 1
    timestamp: 2024-04-10 15:11:18.000
    Action**:** BLOCK
    terminatingRuleId: AWS-AWSManagedRulesBotControlRuleSet
    matchedRule: CategoryMonitoring
    UserAgent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/61.0.3163.100 Chrome/61.0.3163.100 Safari/537.36 PingdomPageSpeed/1.0 (pingbot/2.0; +http://www.pingdom.com/)
    _col5: false
    clientip: 192.0.2.0
    country: US
    labels: [{name=awswaf:managed:token:absent}, {name=awswaf:managed:aws:bot-control:bot:name:pingdom}, {name=awswaf:managed:aws:bot-control:bot:unverified}, {name=awswaf:managed:aws:bot-control:bot:category:monitoring},{name=awswaf:managed:captcha:absent}, {name=awswaf:managed:aws:bot-control:signal:non_browser_user_agent}]
    注: Athena のクエリ出力は、テーブルとして表示されます。

CloudWatch Log Insights クエリを使用する

次の手順を実行します。

  1. CloudWatch コンソールを開きます。

  2. ナビゲーションペインで [ログ] を選択し、[Log Insights] を選択します。

  3. Log Insights でドロップダウン [選択基準] を開き、

  4. クエリするロググループを 1 つ以上選択するか、[ロググループを参照] を選択します。

  5. 該当するロググループを選択します。

  6. (オプション) クエリの期間を選択します。

  7. 次のクエリをクエリエディタに貼り付けます。

    fields @timestamp, @message
    | parse @message '{"name":"User-Agent","value":"*"}' as userAgent
    | filter @message like 'awswaf:managed:aws:bot-control'
    | parse @message '"labels":[*]' as Labels
    | parse @message '"httpRequest":{"clientIp":"*","country":"*"' as IP, Country
    | parse @message '"terminatingRule":{"ruleId":"*","action":"*"' as ruleID, action
    | filter action = "BLOCK"
    | display @timestamp, userAgent, IP, Country, ruleID, action, terminatingRuleId, Labels
    | sort by @timestamp DESC
    | limit 100
  8. (オプション) ボットを特定の IP アドレスで探す場合は、上記のクエリに次のフィルターを追加します。

    | filter IP = '10.0.0.0/8'

    注: 10.0.0.0/8 を目的の IP アドレスに置き換えてください。

  9. (オプション) 特定のユーザーエージェント値を持つボットを特定するには、上記のクエリに次のフィルターを追加します。

    | filter userAgent like 'user-agent value'

    注: user-agent value を目的のユーザーエージェント値に置き換えてください。

  10. ログメッセージ全体を表示するには、ログエントリを展開します。

  11. 正当なボットリクエストをブロックするルールを特定するには、terminatingRuleId および ruleGroupList.x.terminatingRule.ruleId を検索します。これらのフィールドにアタッチされたラベルは、リクエストのブロック理由を示しています。上記の例では、CategoryMonitoring が原因で ruleGroupList.0.terminatingRule.ruleID がブロックされています。

httpSourceName                             ALB
labels.0.name                              awswaf:managed:token:absent
labels.1.name                              awswaf:managed:aws:bot-control:bot:name:pingdom
labels.2.name                              awswaf:managed:aws:bot-control:bot:unverified
labels.3.name                              awswaf:managed:aws:bot-control:bot:category:monitoring
labels.4.name                              awswaf:managed:captcha:absent
ruleGroupList.0.customerConfig.0.name      InspectionLevel
ruleGroupList.0.customerConfig.0.value     COMMON
ruleGroupList.0.customerConfig.1.name      EnableMachineLearning
ruleGroupList.0.customerConfig.1.value     null
ruleGroupList.0.ruleGroupId                AWS#AWSManagedRulesBotControlRuleSet
ruleGroupList.0.terminatingRule.action     BLOCK
ruleGroupList.0.terminatingRule.ruleId     CategoryMonitoring
terminatingRuleId                          AWS-AWSManagedRulesBotControlRuleSet
terminatingRuleType                        MANAGED_RULE_GROUP

リクエストには、複数のラベルがアタッチされる場合があります。この手順の目的においては、ブロックルールに関連するリクエストのみが有効です。

リクエストをブロックする Bot Control ルールの設定をカウントに変更する

次の手順を実行します。

  1. AWS WAF コンソールを開きます。
  2. ナビゲーションペインで [AWS WAF] を選択します。
  3. [リソースと保護パック] を選択します。
  4. 目的の保護パックを探し、[ルール] の横にある [表示と編集] を選択します。
  5. 右側のペインで AWSManagedRulesBotControlRuleSet ルールグループを選択します。
  6. [ルールのオーバーライド] において、ブロックを行っているルールのアクションを [カウント] に変更します。
  7. [ルールを保存] を選択します。

注: AWS WAF は、ルールに一致するリクエストを検証してラベルをアタッチします。ただし、リクエストのブロックは行わなくなります。

許可するボット以外の、すべての一致するリクエストに対するカスタムルールを作成する

正当でないリクエストをブロックするために、ラベルを照合して特定の特徴を含むリクエストを許可し、その他のリクエストを拒否するルールを作成します。例:

Name: name of the rule
 IF (Statement 1):the request contains the label
   AND
NOT
 IF (Statement 2):the request contains the label(enter the bot label you want to allow)
Then Action: Block

注: ブロックを行うルールに awswaf:managed:aws:bot-control:bot:category ラベルが付与されている場合、Bot Control は、ボット名に追加のラベルをアタッチします。ボット名に付与された、このラベルを参照すると、正当なボットを特定できます。その他の場合は、user-agent を参照して正当なボットを特定してください。

カスタムルールを作成するには、次の手順を実行します。

  1. AWS WAF コンソールを開きます。
  2. ナビゲーションペインで [AWS WAF] を選択します。
  3. [リソースと保護パック] を選択します。
  4. 目的の保護パックを探し、[ルール] の横にある [表示と編集] を選択します。
  5. 右側のペインで [ルールを追加] を選択します。
    [カスタムルール] を選択し、[次へ] を選択します。
    [カスタムルール] を再度選択し、[次へ] を選択します。
  6. ルールの [アクション]BLOCK に設定します。
  7. [ルール名] を入力します。
  8. [リクエストが次の場合] でドロップダウンを展開し、[すべてのステートメントに一致 (AND)] を選択します。
  9. [ステートメント 1] で次の手順を実行します。
    [検査][ラベルあり] を選択します。
    [ステートメント][ラベル] を選択します。
    [マッチングキー]awswaf:managed:aws:bot-control:bot:category: category-name を選択します。
    注: category-name を目的のルールカテゴリ名に置き換えてください。
  10. [ステートメント 2] で次の手順を実行します。
    [検査][ラベルあり] を選択し、[ステートメント][ラベル] を選択します。
    [マッチングキー]awswaf:managed:aws:bot-control:bot:name: bot-name を選択します。
    注: bot-name を目的のボット名に置き換えてください。
    [ルール設定] を展開し、[ステートメントの否定 (NOT)][ステートメント結果の否定] を選択します。
  11. [ルールを作成] を選択します。
  12. ルールの優先度を設定するには、右側のペインで [ルール順序の編集] をクリックし、ルールを Bot Control ルールの下にドラッグします。
  13. [ルール順序を保存] を選択します。

ラベルを使用して正当なボットを許可し、他のすべてのボットをブロックするカスタムルールの例を次に示します。

{
  "Name": "expection-rule",
  "Priority": 2,
  "Statement": {
    "AndStatement": {
      "Statements": [
        {
          "LabelMatchStatement": {
            "Scope": "LABEL",
            "Key": "awswaf:managed:aws:bot-control:bot:category:monitoring"
          }
        },
        {
          "NotStatement": {
            "Statement": {
              "LabelMatchStatement": {
                "Scope": "LABEL",
                "Key": "awswaf:managed:aws:bot-control:bot:name:pingdom"
              }
            }
          }
        }
      ]
    }
  },
  "Action": {
    "Block": {}
  },
  "VisibilityConfig": {
    "SampledRequestsEnabled": true,
    "CloudWatchMetricsEnabled": true,
    "MetricName": "expection-rule"
  }
}

AWS WAF が正当なボットトラフィックを許可しているかどうかを確認する

AWS WAF が正当なボットトラフィックを許可していることを確認するために、AWS WAF ログを再度確認します。ボットが依然としてブロックされる場合は、ルールを追加して上記のプロセスを繰り返します。複数のルールにより正当なトラフィックがブロックされている可能性もあります。この場合、上記のプロセスを複数回繰り返す必要があります。

関連情報

Bot Control の例: 特定のブロックされるボットを許可する

Bot Control の例: ブロックされるユーザーエージェントに対する例外を作成する

保護パックまたはウェブ ACL トラフィックのログフィールド

ルールグループの動作を管理する

AWS公式更新しました 1年前
コメントはありません

関連するコンテンツ