내용으로 건너뛰기

AWS WAF 봇 컨트롤 규칙 그룹에 의해 차단된 봇의 요청을 허용하려면 어떻게 해야 합니까?

6분 분량
0

AWS WAF 봇 컨트롤 규칙 그룹에 의해 차단된 정상적인 봇의 요청을 허용하고 싶습니다.

해결 방법

봇 컨트롤 규칙 그룹에 의해 차단된 정상적인 봇의 요청을 허용하려면 다음 단계를 완료하십시오.

참고: AWS WAF 봇 컨트롤 규칙 그룹은 AWS WAF의 IP 주소를 사용하여 봇을 확인합니다. 확인된 일부 봇은 요청을 전달할 때 클라이언트 IP 주소를 보존하지 않는 프록시 또는 CDN을 통해 라우팅됩니다. 봇이 이런 방식으로 라우팅되는 경우 해당 봇을 특별히 허용해야 합니다.

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. 탐색 창에서로그를 선택하고 Log Insights를 선택합니다.

  3. Log Insights에서 선택 기준 드롭다운을 엽니다.

  4. 쿼리할 로그 그룹을 하나 이상 선택하거나 로그 그룹 찾아보기를 선택합니다.

  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를 검색하십시오. 이러한 필드에 연결된 레이블은 요청이 차단된 이유를 보여줍니다. 다음 예에서는 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

요청에는 여러 레이블이 연결될 수 있습니다. 이 지침에서는 차단 규칙과 관련된 요청만 해당됩니다.

카운트 요청을 차단하는 봇 컨트롤 규칙 설정

다음 단계를 완료합니다.

  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 레이블이 있는 경우 봇 컨트롤은 봇 이름에 다른 레이블을 연결합니다. 이 봇 이름 레이블을 사용하여 정상적인 봇을 식별할 수 있습니다. 그렇지 않으면 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. 규칙 우선 순위를 설정하려면 오른쪽 창에서 규칙 순서 편집을 클릭하고 규칙을 봇 컨트롤 규칙 아래로 드래그합니다.
  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 로그를 다시 확인하십시오. 봇이 여전히 차단된 경우 추가 규칙을 사용하여 이전 프로세스를 반복하십시오. 둘 이상의 규칙이 정상적인 트래픽을 차단하는 경우도 있습니다. 이 경우 이전 프로세스를 여러 번 반복해야 합니다.

관련 정보

봇 컨트롤 예시: 차단된 특정 봇 허용

봇 컨트롤 예시: 차단된 사용자 에이전트에 대한 예외 생성

보호 팩 또는 웹 ACL 트래픽에 대한 로그 필드

규칙 그룹 동작 관리

AWS 공식업데이트됨 7달 전