Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Archives
Today
Total
관리 메뉴

csct3434

AWS WAF를 활용한 봇 공격 차단 (feat. web ACL) 본문

개발 일지

AWS WAF를 활용한 봇 공격 차단 (feat. web ACL)

csct3434 2024. 6. 4. 14:57

도입

플랫폼을 운영하며 액세스 로그를 분석하던 중, API 서버에서 제공하지 않는 엔드포인트로 다수의 요청이 들어오는 것을 발견했습니다. 해당 요청에 대해 검색해보니, 원격 코드 실행 혹은 Credential 탈취를 목적으로 한 공격이었습니다.

요청이 들어오는 IP를 확인해보니, 글로벌 서비스가 아님에도 다양한 국가에서 요청이 발생하는 것으로 보아 봇에 의한 공격이 의심되었습니다.

다행히 Nginx와 같은 웹서버를 사용하고 있지 않았기에 이러한 공격들은 WAS의 필터에서 전부 막히고 있었습니다.

하지만 불필요한 요청으로 인해 서버의 부하가 증가하고 액세스 로그가 더럽혀지기에, 이러한 공격을 아예 차단하고자 AWS WAF를 통해 화이트리스트 방식의 ACL을 도입했습니다.


AWS WAF 구성

https://sessin.github.io/awswafhol/pre/module4.html

 

AWS WAF Workshop

AWS WAF Web ACL 구성 이번에는 웹 공격을 방어하기 위한 AWS WAF 를 구성해보도록 하겠습니다. AWS WAF 를 구성하는 방법은 여러가지가 있지만 본 실습에서는 Web ACL 을 먼저 생성한 후 이후 모듈 3.과 모

sessin.github.io

위의 글을 참고하며 ALB와 연동할 web ACL을 생성한 후, [Rules] 탭으로 이동하여 JSON 편집기를 통해 아래와 같은 Custom Rule을 추가해주었습니다.


{
  "Name": "whitelist_url",
  "Priority": 0,
  "Statement": {
    "OrStatement": {
      "Statements": [
        {
          "ByteMatchStatement": {
            "SearchString": "/article",
            "FieldToMatch": {
              "UriPath": {}
            },
            "TextTransformations": [
              {
                "Priority": 0,
                "Type": "NONE"
              }
            ],
            "PositionalConstraint": "STARTS_WITH"
          }
        },
        {
          "ByteMatchStatement": {
            "SearchString": "/notification",
            "FieldToMatch": {
              "UriPath": {}
            },
            "TextTransformations": [
              {
                "Priority": 0,
                "Type": "NONE"
              }
            ],
            "PositionalConstraint": "STARTS_WITH"
          }
        },
        
        // 중간 생략
        
        {
          "ByteMatchStatement": {
            "SearchString": "/user",
            "FieldToMatch": {
              "UriPath": {}
            },
            "TextTransformations": [
              {
                "Priority": 0,
                "Type": "NONE"
              }
            ],
            "PositionalConstraint": "STARTS_WITH"
          }
        }
      ]
    }
  },
  "Action": {
    "Allow": {}
  },
  "VisibilityConfig": {
    "SampledRequestsEnabled": true,
    "CloudWatchMetricsEnabled": true,
    "MetricName": "whitelist_url"
  }
}

해당 규칙은 Request URI가 특정 문자열(SearchString)로 시작하는 요청만을 허용(Allow)합니다.

API 서버가 제공하는 엔드포인트 외의 요청은 전부 차단할 생각이기에, SearchString에는 API Endpoint를 적어주었습니다.


이후 [Default web ACL action for requests that don't match any rules]에서 기본 동작(Action)을 Block으로 변경하여, 규칙과 일치하지 않는 요청은 전부 차단하도록 구성했습니다.


 

마지막으로 WAF에서 요청을 차단할 경우, 관련 로그가 CloudWatch에 기록되도록 구성했습니다.


결과 확인

24시간 동안 498건의 요청이 차단되었고, CloudWatch 로그를 통해 Github Credential에 대한 탈취 시도가 차단되었음을 확인할 수 있었습니다.


이로써 공격 요청이 WAF에 의해 차단되어 API 서버의 부하가 감소하고 액세스 로그 분석이 용이해졌습니다.

하지만 WAF가 로드밸런서 뒤쪽에 위치하기 때문에 여전히 DDOS 공격에는 취약합니다. 다음에는 속도제한 규칙을 통해 DDOS 공격을 완화시키는 방법에 대해 알아보겠습니다.