AWS 기술 블로그

AWS WAF 고급 속도 기반 규칙의 이점 살펴보기

이 글은 AWS Security Blog에 게시된 Discover the benefits of AWS WAF advanced rate-based rules by Rodrigo Ferroni and Maksim Akifev을 한국어 번역 및 편집하였습니다.

AWS는 2017년에 분산 서비스 거부(DDoS) 공격, 무차별 대입 로그인 시도, 악성 봇과 같은 애플리케이션 수준의 위협으로부터 웹사이트와 API를 보호하는 데 도움이 되는, 새로운 규칙 유형인 AWS WAF 속도 기반 규칙을 출시했습니다. 속도 기반 규칙은 각 발신 IP 주소의 요청수를 추적하여 설정된 한도를 초과하는 속도를 가진 IP에 대해 차단과 같은 규칙 동작을 수행할 수 있습니다.

속도 기반 규칙은 다양한 악성 행위자를 탐지하고 완화하는 데 유용하지만, 위협은 요청 속도 제한 규칙을 우회하기 위해 진화하고 있습니다. 예를 들어, 한 가지 우회 기법은 대량의 요청을 수천 개의 고유 IP 주소에 분산하여 전송하는 것입니다.

2023년 5월, AWS는 요청 속도 제한을 위해 추가 HTTP 요청 속성을 사용하여 보다 동적이고 지능적인 규칙을 생성하는 데 사용할 수 있는 AWS WAF 속도 기반 규칙 개선 사항을 발표했습니다. 예를 들어, 이제 다음과 같이 미리 정의된 키들을 활용하여 속도 기반 규칙을 더 세밀하게 구성할 수 있습니다.

  • 레이블 네임스페이스, 헤더, 쿠키, 쿼리 매개변수, 쿼리 문자열, HTTP 메서드, URI 경로, 소스 IP 주소 또는 헤더의 IP 주소

또한 최대 5개의 복합 키를 매개변수로 결합하여 더욱 강력한 규칙을 구현할 수도 있습니다. 이러한 규칙 정의 기능의 향상은 AWS WAF를 사용하여 정교한 애플리케이션 계층 DDoS 공격에 대한 경계 보안 조치를 개선하는 데 도움이 됩니다. 지원되는 요청 속성에 대한 자세한 내용은, AWS WAF 개발자 가이드에서 속도 기반 규칙을 참조하세요.

이 블로그에서는 이러한 새로운 AWS WAF 기능 개선 사항 및 대체 요청 속성들을 활용하여 더욱 강력하고 세분화된 규칙 집합을 만드는 방법에 대해 자세히 알아봅니다. 또한 여러개의 키가 결합된 복합 집계 키를 생성하여 특정 요소 조합을 고유하게 식별하여 요청 속도 추적을 개선하는 방법도 알아볼 것입니다.

시작하기

고급 속도 기반 규칙 구성은 단순 속도 기반 규칙 구성과 유사합니다. 구성 절차는 속도 기반 규칙 유형을 기반으로, 새 사용자 정의 규칙을 만드는 것으로 시작합니다. 그리고 해당 규칙에서 속도 제한 값을 입력하고, 사용자 정의 키를 선택하고, 요청 집계 키 드롭다운 메뉴에서 키를 선택한 다음, 그림 1과 같이 요청 집계 키 추가를 선택하여 복합 키를 추가합니다.


그림 1: 두 개의 집계 키를 사용하여 고급 속도 기반 규칙 만들기

기존 규칙의 경우 해당 속도 기반 규칙을 편집하여 새 기능을 사용하도록 업데이트할 수 있습니다. 예를 들어 그림 2와 같이 소스 IP 주소와 함께 집계하길 원하는 헤더를 키로 추가할 수 있습니다.


그림 2: 기존 속도 기반 규칙에 두 번째 키 추가하기

기존과 같이 차단, 카운트, 캡차(CAPTCHA) 또는 챌린지와 같은 규칙 동작을 동일하게 계속 설정할 수 있습니다. 원하는 경우 범위 축소 문을 적용하여 규칙 동작이 적용되는 범위를 제한할 수 있습니다. 예를 들어 특정 애플리케이션 경로 또는 지정된 헤더가 있는 요청으로 범위를 제한할 수 있습니다. 즉, 검사 범위를 좁혀서 특정 요청만 속도 제한에 포함되도록 구성할 수 있으며, 해당 요청들을 집계할 때 특정 키를 사용하여 집계 기준을 변경할 수도 있습니다. 이와 관련된 한가지 방법은 URI 시작 부분에 /api가 있는 요청만 카운트하고, 각 요청의 SessionId 쿠키 값을 기준으로 집계하는 것입니다.

대상 사용 사례

이제 고급 속도 기반 규칙의 기초에 익숙해졌으니 다음 사용 사례를 통해 보안 태세를 개선하는 방법을 살펴보겠습니다.

  • 애플리케이션(레이어 7) DDoS 보호 강화
  • 향상된 API 보안
  • 강화된 요청 제한(throttling)

사용 사례 1: 레이어 7 DDoS 방어 강화

가장 먼저 도움이 될 수 있는 사용 사례는 레이어 7 DDoS 방어 기능을 강화하는 것입니다. HTTP request flood는 DDoS 공격의 가장 일반적인 유형입니다. 이 공격 유형은 애플리케이션을 실행하는 데 사용 가능한 리소스를 고갈시켜 애플리케이션 가용성에 영향을 미치는 것을 목표로 합니다.

이번 AWS WAF 속도 기반 규칙 개선 사항이 발표되기 전에는, 요청 발신지의 IP 주소 또는 X-Forwarded-For와 같은 HTTP 헤더에 전달된 IP 주소에 한정하여 요청을 집계할 수 있었습니다. 하지만 이제는 IP 외에 다른 키 또는 여러 개의 키 조합을 기반으로 요청을 추적함으로서, DDoS 공격으로부터 웹 애플리케이션을 보호할 수 있는 보다 강력한 속도 기반 규칙을 만들 수 있습니다. 몇 가지 예를 살펴보겠습니다.

스크레이퍼(scrapers), 스캐너(scanners), 크롤러(crawlers)와 같이 널리 퍼져 있는 봇이나 여러 고유 IP 주소에 분산되어 있는 일반적인 봇을 탐지하기 위해 속도 기반 규칙은 사용자 정의 헤더와 같은 정적 요청 데이터(예: User-Agent)를 찾을 수 있습니다.

Key 1: 사용자 정의 헤더 (User-Agent)

{
  "Name": "test-rbr",
  "Priority": 0,
  "Statement": {
    "RateBasedStatement": {
      "Limit": 2000,
      "AggregateKeyType": "CUSTOM_KEYS",
      "CustomKeys": [
        {
          "Header": {
            "Name": "User-Agent",
            "TextTransformations": [
              {
                "Priority": 0,
                "Type": "NONE"
              }
            ]
          }
        }
      ]
    }
  },
  "Action": {
    "Block": {}
  },
  "VisibilityConfig": {
    "SampledRequestsEnabled": true,
    "CloudWatchMetricsEnabled": true,
    "MetricName": "test-rbr"
  }
}

집계 키에서 활용할 고유 키를 결정하기 위하여 AWS WAF 로그를 분석할 수 있습니다. 자세한 내용은 블로그 Amazon CloudWatch 로그에서 AWS WAF 로그 분석하기에서 예제 2와 3을 검토하세요.

NAT (Network address translation) 게이트웨이 뒤에 있는 사용자를 고유하게 식별하려면 IP 주소 외에 쿠키를 사용할 수 있습니다. 이번 사용자 정의 집계 키 기능이 발표되기 전에는 단일 IP 주소에서 접속한 사용자를 식별하기가 어려웠습니다. 이제 세션 쿠키를 사용하여 세션 식별자와 IP 주소로 요청을 집계할 수 있습니다.

레이어 7 DDoS 방어의 경우, 봇이 임의의 값을 보내거나 쿠키를 전혀 보내지 않을 수 있기 때문에, 쿠키의 세션 ID를 통한 추적을 우회할 수 있다는 점에 유의하세요. 요청 속성에 관계없이 특정의 높은 비율에 도달하는 위반 IP 주소를 차단하기 위해 IP 기반 포괄적 비율 제한 규칙을 유지하는 것이 좋습니다. 이 경우 집계 키는 다음과 같습니다:

  • Key 1: 세션 쿠키
  • Key 2: IP 주소

그리고 AWS 관리형 규칙(AMR) IP 평판 목록을 사용할 때에 레이블 네임스페이스에 기반한 속도 제한을 통해 오탐을 줄일 수 있습니다. 레이블 기능은 특정 패턴과 일치하는 요청을 매핑하고 사용자 정의 규칙을 적용할 수 있는 강력한 기능입니다. 이 경우에는 AMR IP 평판 목록에서 제공하는 레이블 네임스페이스를 활용하여, DDoS 활동에 적극적으로 관여하는 것으로 확인된 IP 주소 목록인 AWSManagedIPDDoSList와 일치되는 요청들을 판별할 수 있습니다.

만약 이 IP 주소 목록을 차단 모드에서 사용하는 경우 합법적인 사용자를 차단할 가능성이 있으므로 주의해야 합니다. 이를 완화하려면 이 목록을 카운트 모드로 변경하고 고급 속도 기반 규칙을 만들어 모든 요청을 awswaf:managed:aws:amazon-ip-list: 레이블 네임스페이스를 기준으로 집계할 수 있으며, 규칙 동작으로 캡차를 지정할 수 있습니다. 이렇게 하면 보안을 손상시키지 않으면서 오탐을 줄일 수 있습니다. 속도 기반 규칙에 대하여 캡차를 적용하면 모든 사용자에게 캡차를 제공하는 대신 요청 속도가 정의된 한도를 초과하는 경우에만 캡차를 적용합니다. 이 규칙에서의 집계 키는 다음과 같습니다:

  • Labels (AMR IP reputation lists).

사용 사례 2: API 보안

두 번째 사용 사례에서는 고급 속도 기반 규칙을 사용하여 API의 보안을 강화하는 방법을 알아보겠습니다. 속도 기반 규칙으로 API를 보호하면 짧은 시간 안에 발생하는 매우 빈번한 요청들로 부터 워크로드를 보호할 수 있습니다. API 오용으로 인한 위험을 줄이는 것은 합법적인 요청들이 요청 과부하로 인해 거부되지 않고 정상적으로 처리되는 데 도움이 됩니다.

이제 두 개의 집계 키를 기반으로 API 요청을 추적하는 고급 속도 기반 규칙을 만들 수 있습니다. 예를 들어, HTTP 메서드를 사용하여 GET, POST 및 기타 요청을 구별하고 Authorization과 같은 사용자 정의 헤더를 결합하여 JSON 웹 토큰(JWT)과 일치시킬 수 있습니다. JWT는 AWS WAF에 의해 해독되지 않으며, AWS WAF는 동일한 토큰을 기준으로 요청들을 집계합니다. 이는 토큰이 악의적으로 사용되거나 속도 제한 규칙을 우회하는 것을 방지하는 데 도움이 될 수 있습니다. 이 구성의 또 다른 이점은 authorization 헤더가 없는 요청도 속도 제한 임계값에 맞춰 함께 집계된다는 것입니다. 이 사용 사례의 집계 키는 다음과 같습니다:

  • Key 1: HTTP method
  • Key 2: 사용자 정의 헤더 (Authorization)

또한 요청 제한에 도달하면 차단 동작을 적용하고 사용자 정의 응답을 추가하는 규칙을 구성할 수 있습니다. 예를 들어 요청자가 새 요청을 하기 전에 900초(15분)를 기다려야 함을 나타내는 Retry-After 헤더와 함께 HTTP 오류 코드 429(too many requests)를 반환하는 접근입니다.

{
  "Name": "test-rbr",
  "Priority": 0,
  "Statement": {
    "RateBasedStatement": {
      "Limit": 2000,
      "AggregateKeyType": "CUSTOM_KEYS",
      "CustomKeys": [
        {
          "Header": {
            "Name": "User-Agent",
            "TextTransformations": [
              {
                "Priority": 0,
                "Type": "NONE"
              }
            ]
          }
        }
      ]
    }
  },
  "Action": {
    "Block": {}
  },
  "VisibilityConfig": {
    "SampledRequestsEnabled": true,
    "CloudWatchMetricsEnabled": true,
    "MetricName": "test-rbr"
  }
}

사용 사례 3: 요청 제한(Throttling) 구현하기

요청 제한을 고려해야 하는 상황은 여러 가지가 있습니다. 예를 들어 모든 사용자에게 공평한 사용량을 제공하여 API 서비스의 성능을 유지하려는 경우, API의 유형이나 목적(예를 들면, 변경 가능한 요청 매개변수 기반의 API 요청 혹은 변경이 불가능한 요청 매개변수 기반의 API 요청)에 따라 속도 제한을 다르게 설정할 수 있습니다. 이를 구현하기 위해서는 변경 가능한 혹은 변경이 불가능한 요청 유형을 나타내는 HTTP 요청 매개변수 및 IP를 집계키로 결합할 수 있으며, 매개변수 유형 별로 두 가지의 고급 속도 기반 규칙을 만들 수 있습니다. 각 규칙에는 고유한 HTTP 요청 매개변수가 있으며, 속도 제한의 최대값을 다르게 설정할 수 있습니다. 이 사용 사례의 집계 키는 다음과 같습니다:

  • Key 1: HTTP 요청 매개변수
  • Key 2: IP 주소

요청 제한이 도움이 될 수 있는 또 다른 예는 멀티테넌트 애플리케이션 환경에서 각 테넌트 별 사용자의 요청을 추적하려는 경우입니다. 무료 티어와 더 높은 요청 속도를 허용하려는 유료 구독 모델이 있다고 가정해 보겠습니다. 이 사용 사례의 경우 두 개의 다른 URI 경로를 사용하여 두 테넌트가 분리되어 있는지 확인하는 것이 좋습니다. 또한 tenant-id와 같이 각 테넌트에 대한 고유 식별자를 포함하는 사용자 정의 헤더 또는 쿼리 문자열 매개변수를 사용하여 두 테넌트를 구분하는 것이 좋습니다. 고급 속도 기반 규칙을 사용하여 이러한 유형의 제한을 구현하려면 사용자 정의 헤더와 함께 IP 주소를 집계 키로 사용하여 두 개의 규칙을 만들 수 있습니다. 각 규칙에는 속도 제한에 대한 자체 최대값과 각 URI 경로에 대한 요청을 일치시키는 범위 축소 문이 포함될 수 있습니다. 이 사용 사례의 집계 키와 범위 축소 문은 다음과 같습니다:

  • Key 1: 사용자 정의 헤더 (tenant-id)
  • Key 2: IP 주소
  • 범위 축소 문 (URI 경로)

세 번째 예로, 처리할 수 있는 총 요청 수를 기준으로 웹 애플리케이션의 속도를 제한할 수 있습니다. 이 사용 사례에서는 요청 집계 옵션에서 새로운 Count all 옵션을 사용할 수 있습니다. 이 옵션은 규칙의 범위 축소 문과 일치하는 요청을 카운트하고 비율을 제한합니다. 한 가지 사례는 범위를 URI 경로 기반으로 좁혀서 /history-search 페이지와 같은 특정 기능을 대상으로 요청을 집계하는 것입니다. 특정 도메인으로 전송되는 요청 수를 제어해야 하는 경우 단일 헤더를 기반으로 특정 호스트로 범위를 좁혀서 a.example.com에 대한 하나의 규칙과 b.example.com에 대한 또 다른 규칙을 만들 수도 있습니다.

  • 요청 집계: Count all
  • 범위 축소 문 (URI 경로 | 단일헤더)

이러한 예시에서 요청이 한도를 초과할 때 사용자 정의 응답을 기반으로 차단을 수행할 수 있습니다. 예를 들어 동일한 HTTP 오류 코드와 헤더를 반환하되 “허용된 최대 요청 수에 도달했습니다.”와 같은 메시지가 포함된 사용자 정의 응답 본문을 추가할 수 있습니다.

로깅

이제 AWS WAF 로그에도 요청 속도 추적에 사용되는 집계 키와 일치하는 요청 키의 값에 대한 정보가 추가적으로 포함됩니다. 기존 IP 또는 Forwarded_IP 값 외에 업데이트된 로그 필드들인 limitKey 및 customValues를 확인할 수 있으며, 이제 limitKey 필드에는 사용자 정의 집계 키 설정에 대한 CustomKeys 또는 모든 요청 수에 대한 Constant가 표시됩니다. CustomValues에는 키, 이름, 값의 배열이 표시됩니다.


그림 3: 업데이트된 limitKey 및 customValues 필드를 보여주는 고급 속도 기반 규칙의 로그 출력 예시

첫 번째 사용 사례에서 언급했듯이 웹 ACL이 분석하는 트래픽에 대한 자세한 정보를 얻으려면 로깅을 활성화하는 것을 고려하십시오. Amazon CloudWatch Logs를 로그 목적지로 선택하면 CloudWatch Logs Insights 및 고급 쿼리를 사용하여 대화형으로 로그를 검색하고 분석할 수 있습니다.

예를 들어, 업데이트된 키 및 값을 포함한 다음 쿼리를 사용하여 속도 기반 규칙과 일치하는 요청 정보를 AWS WAF 콘솔에서 직접 가져올 수 있습니다.

| fields terminatingRuleId as RuleName 
| filter terminatingRuleType ="RATE_BASED" 
| parse @message ',"customValues":[*],' as customKeys 
| limit 100

그림 4는 CloudWatch Log Insights 쿼리와 사용자 정의 키, 이름 및 값 필드를 포함한 로그 출력을 보여줍니다.


그림 4: CloudWatch Log Insights 쿼리 및 로그 출력

비용

고급 속도 기반 규칙을 사용하는 데 추가 비용은 없으며, 표준 AWS WAF 요금을 기반으로 해당 기능을 적용할 수 있습니다. AWS WAF 비용에 대한 자세한 내용은 AWS WAF 요금을 참조하세요. 집계 키를 사용하면 규칙에 대한 AWS WAF 웹 ACL 용량 단위(WCU) 사용량이 증가한다는 점만 알아두면 됩니다. WCU 사용량은 속도 제한에 사용하려는 집계 키 수에 따라 계산되며, 기본 2 WCU와 지정되는 각 사용자 정의 집계 키에 대한 30 WCU로 산정됩니다. 예를 들어 세션 쿠키와 함께 IP 주소가 포함된 집계 키를 생성하려는 경우 62 WCU가 사용되며, IP 주소, 세션 쿠키 및 고객 헤더가 포함된 집계 키는 92 WCU를 사용합니다. WCU 기반 비용 구조에 대한 자세한 내용은 AWS WAF 개발자 가이드의 속도 기반 규칙 문을 참조하세요.

결론

이 블로그에서는 IP 주소 외에 요청 매개변수를 지원하는 AWS WAF 속도 기반 규칙에 대한 개선 사항에 대하여 알아보았습니다. 또한 이러한 개선 사항을 통해 최대 5개의 요청 매개변수를 기반으로 복합 키를 생성할 수 있습니다. 이 새로운 기능을 사용하면 요청 유형별로 더 대략적으로 집계(예: IP 평판 레이블이 연결된 모든 요청)하거나 혹은 반대로 더 세밀하게 집계(예: IP 주소가 아닌 특정 세션 ID에 대한 요청 집계)할 수 있습니다.

JSON 규칙 구성을 포함하는 더 많은 규칙 예제는 AWS WAF 개발자 가이드의 속도 기반 규칙 예제를 참조하세요.

이 블로그에 대한 의견이 있으시면 아래 댓글 섹션에 의견을 제출하세요. 이 블로그에 대한 질문이 있는 경우 AWS 지원팀에 문의하세요.

Gabin Lee

Gabin Lee

이갑인 솔루션즈 아키텍트는 다양한 AWS 엣지 서비스를 활용하여 확장 가능하고 탄력적이며 안전한 아키텍처를 구축하는 것에 열정적이며, 특히 CloudFront, Global Accelerator, WAF, Shield 등과 같은 AWS 엣지 서비스를 활용하고 있는 한국 고객들을 집중적으로 지원하고 있습니다.