AWS

[AWS] AWS WAF (v2) 알아보기

Always-Try 2022. 2. 13. 16:42

AWS WAF는 CloudFront, API Gateway, Load Balancer 에 연결 가능하다. 각자 운영하는 환경에 맞도록 구축하면 되고, 설정하는 것은 딱히 어려운 점이 없으며 본 포스팅은 간단하게 WAF에서 어떤 기능들을 제공해주는지 확인해본다.

 

웹 트래픽 필터링

IP 주소, HTTP 헤더 및 본문 또는 사용자 정의 URI와 같은 조건을 기준으로 웹 트래픽을 필터링(rate based rule 포함)하도록 규칙을 생성할 수 있으며, SQL 명령어 주입과 교차 사이트 스크립팅 같은 일반적인 웹 취약점 공격을 차단하는 규칙을 손쉽게 생성할 수 있다. 당연히 아래와 같이 필터링 된 트래픽에 대한 상세 정보도 확인 가능하다. (Body 값 제외)

Rule Set을 무한정 사용할 수는 없고 기본적으로 1500 capacity 까지만 사용할 수 있다. 따라서 1500 capacity 내에 AWS가 제공하는 managed rule set, 마켓플레이스에서 구매 가능한 3rd party rule set 그리고 사용자가 만든 사용자 정의 rule을 적절한 비율로 나눠서 사용해야 한다. 만약 1500 capacity를 넘게 사용하고 싶으면 AWS 측에 따로 문의하면 된다고 한다.

기본적으로 생성한 필터링 규칙에 대한 action은 아래 4가지 모드로 필터링 규칙을 생성할 수 있다.

  • BLOCK


  • ALLOW
  • COUNT(모니터링 모드)
  • CAPTCHA

또한 차단 응답에 대한 페이지 및 HTTP Error 코드 또한 변조가 가능하다.

  • 아래와 같이 Rate Based Rule 설정을 통한 대응도 가능하다. (기준 시간 5분)
    • 예제1) 미국 공격자로부터 최근 지속적인 공격(User-Agent는 BadBot으로 확인)이 발생하여, 해당 공격자로부터 발생한 요청에 limit을 설정하려고 하는 경우
      • 다음과 같은 두 번째 수준의 중첩된 문이 포함된 AND 규칙 문 생성
        • 미국에서 발생한 요청을 지정하는 지리적 일치 규칙 
        • User-Agent 헤더에서 문자열 BadBot를 검색하는 문자열 일치 규칙
    • 예제2) 웹 사이트 로그인 페이지의 요청을 제한하고 싶은 경
      • Request option(요청 옵션)은 URI 
      • [Match Type]은 [Starts with]
      • Strings to match(일치하는 문자열)는 login

 

그리고 AWS WAF를 적용하고, 아무런 Rule Set을 선택하지 않고 모니터링 하고 있었는데 아래와 같은 공격 시도를 발견할 수 있다.

어떻게 차단할 수 있을까? URI에 대한 필터링을 지정하면 될 것이며, 어려운 부분은 아니니 고민해보길 바란다. 참고로 필터링 하기 전에는 실제로 공격이 인입되었을 것이므로 서버의 access.log 를 보면 아래와 같은 공격 흔적을 발견할 수 있다.

 

 

AWS WAF Bot Control

AWS WAF Bot Control 기능을 통해 스크래퍼, 스캐너 및 크롤러와 같은 널리 사용되는 봇을 쉽게 차단하거나 비율을 제한할 수 있습니다. 또는 상태 모니터 및 검색 엔진과 같은 일반적인 봇을 허용할 수도 있다.

기본적으로 아래과 같이 Bot Control 메뉴에서 Bot으로 추정되는 트래픽에 대한 비율을 나타내주는데, 보여주기만 할 뿐 상세 정보를 확인하거나 차단할 수는 없고, 상세 정보를 확인하기 위해서는 별도로 AWS에 요청 후 해당 정보를 가지고 관련된 Rule을 제작 해야 되는 것으로 알고 있다. 이를 통해 초과 리소스를 사용하거나 지표가 왜곡되거나 가동 중단이 발생하거나 기타 원하지 않는 활동을 수행할 수 있는 널리 사용되는 일반적인 봇 트래픽을 제어하고 가시성을 확보할 수 있다. 

 

실시간 가시성

IP 주소, 지리적 위치, URI, 사용자 에이전트 및 참조자에 관한 세부 정보를 포함하는 원시 요청을 캡처하고 실시간 지표를 제공한다. AWS WAF는 Amazon CloudWatch와 완전히 통합되어 임계값이 초과하거나 특정 공격이 발생하는 경우 알려주도록 손쉽게 사용자 지정 경보를 설정할 수 있다. 또한, 로그를 S3, Kinesis Firehouse를 통해 별도로 저장 가능하며,  이때 Allow/Block/Count/Captcha 각각에 대해 남기고 싶은 유형의 로그만 남길 수 있도록 개선되었다.

개인적으로 가능하면 저장 공간에 대한 이슈로 인해 Block에 대한 로그만 남기고, Allow(일반 웹 접속 로그)는 서버 단에서 별도로 남겨서 필요할 때 찾아볼 수 있도록 하면 좋다고 생각한다.

 

AWS Firewall Manager와 통합

AWS Firewall Manager를 사용하여 여러 AWS 계정에 걸친 AWS WAF 배포를 중앙에서 구성 및 관리할 수 있다. 다만, 이렇게 관리할 경우 각각 도메인들에 대한 예외처리가 불가능하고 일괄적인 룰 적용을 해야한다. 따라서 오탐 및 예외 처리에 대한 리스크가 있으므로 잘 고려해야 한다. (추후 각각 예외처리 할 수 있도록 개선될 수도..)