跳至内容

如何允许被 AWS WAF 机器人控制功能规则组阻止的机器人发出的请求?

4 分钟阅读
0

我想允许被 AWS WAF 机器人控制功能规则组阻止的合法机器人发出的请求。

解决方法

要允许被机器人控制功能规则组阻止的合法机器人的请求,请完成以下步骤。

注意:AWS WAF 机器人控制功能规则组使用 AWS WAF 的 IP 地址来验证机器人。一些经过验证的机器人通过代理或 CDN 进行路由,这些代理或 CDN 在转发请求时不保留客户端 IP 地址。如果您的机器人以这种方式路由,则您必须明确允许该机器人。

确定阻止您的 AWS WAF 日志请求的机器人控制功能规则

要确定阻止合法机器人请求的规则,请分析您的 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. 在导航窗格中,选择 Logs(日志),然后选择 Log Insights

  3. 在 Log Insights 下,打开下拉菜单 Selection criteria(选择条件),

  4. 选择一个或多个要查询的日志组,或选择 Browse log groups(浏览日志组)。

  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. 要找到阻止合法机器人请求的规则,请搜索 terminatingRuleIdruleGroupList.x.terminatingRule.ruleId。这些字段的标签显示了请求被阻止的原因。在以下示例中,ruleGroupList.0.terminatingRule.ruleID 因为 CategoryMonitoring 而被屏蔽:

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

一个请求可以附上多个标签。就这些说明而言,只有与块规则相关的请求才是相关的。

设置阻止计数请求的机器人控制功能规则

完成以下步骤:

  1. 打开 AWS WAF 控制台
  2. 在导航窗格中,选择 AWS WAF
  3. 选择 Resources & protection packs(资源和保护包)。
  4. 找到您的保护包,然后选择 Rules(规则)旁边的 View and edit(查看和编辑)。
  5. 在右侧窗格中,选择 AWSManagedRulesBotControlRuleSet 规则组。
  6. Rule Overrides(规则覆盖)下,将阻塞规则的操作更改为 Count(计数)。
  7. 选择 Save Rule(保存规则)。

**注意:**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,则机器人控制功能会在机器人名称上附加另一个标签。您可以使用此机器人名称标签来识别合法的机器人。否则,请使用 user-agent 标头来识别合法的机器人。

要创建此自定义规则,请完成以下步骤:

  1. 打开 AWS WAF 控制台
  2. 在导航窗格中,选择 AWS WAF
  3. 选择 Resources & protection packs(资源和保护包)。
  4. 找到您的保护包,然后选择 Rules(规则)旁边的 View and edit(查看和编辑)。
  5. 在右侧窗格中,选择 Add rules(添加规则)。
    选择 Custom rule(自定义规则),然后选择 Next(下一步)。
    再次选择 Custom rule(自定义规则),然后选择 Next(下一步)。
  6. 将规则 Action(操作)设置为 BLOCK
  7. 输入您的 Rule name(规则名称)。
  8. 对于 If a request(如果请求),展开下拉列表并选择 matches all the statements (AND)(匹配所有语句 (AND))。
  9. 对于 Statement 1(语句 1),完成以下步骤:
    对于 Inspect(检查),选择 Has a label(有标签)。
    对于 Statement(声明),选择 Label(标签)。
    对于 Match key(匹配密钥),选择 awswaf:managed:aws:bot-control:bot:category: category-name
    **注意:**将 category-name 替换为您的规则类别名称。
  10. 对于 Statement 2(语句 2),完成以下步骤:
    对于 Inspect(检查),选择 Has a label(有标签)。对于 Statement(语句),选择 Label(标签)”。
    对于 Match key(匹配密钥),选择 awswaf:managed:aws:bot-control:bot:name: bot-name
    **注意:**将 bot-name 替换为您的机器人名称。
    展开 Rule configuration(规则配置),在 Negate statement (NOT)(否定语句 (NOT))下,选择 Negate statement results(否定语句结果)。
  11. 选择 Create rule(创建规则)。
  12. 要设置规则优先级,请在右侧窗格中单击 Edit Rule Order(编辑规则顺序),然后将规则拖到 Bot Control Rule(机器人控制功能规则)下方。
  13. 选择 Save Rule order(保存规则顺序)。

以下示例是一条自定义规则,它使用标签允许机器人使用合法机器人并屏蔽所有其他机器人:

{
  "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 日志。如果机器人仍被屏蔽,请使用其他规则重复前面的过程。有时,多条规则会阻止合法流量。在这种情况下,您必须多次重复前面的过程。

相关信息

机器人控制功能示例: 允许特定的被阻止机器人

机器人控制功能示例: 为被阻止的用户代理创建例外

保护包或 Web ACL 流量的日志字段

管理规则组行为

AWS 官方已更新 1 年前