티스토리 뷰

develop

AWS WAFv2(terraform 작성 예시)

yogae 2020. 8. 27. 18:50

AWS WAF는 CloudFront, API Gateway, ALB에 전달되는 요청을 모니터링하는 웹 애플리케이션 방화벽이다.

 

기존에 제공되던 AWS WAF는 AWS WAF Classic 이라는 이름으로 변경되었고 새롭게 나온 WAF는 AWS WAF version 2가 되었다. WAF Classic과 WAF version 2는 독립적인 서비스이며 연관된 작업을 할 수 없다.

WAF 구성

  • Web ACLs: 규칙을 추가하여 웹 ACL을 생성하고 보호전략을 정의한다.
  • 규칙: 각 규칙에는 검사 기준을 정의하는 문과 웹 요청이 기준을 충족하는 경우 수행할 작업이 포함된다. 일치하는 요청의 개수를 세기 위해 사용할 수도 있습니다.
  • 규칙 그룹: 규칙을 개별적으로 사용하거나 재사용 가능한 규칙 그룹에서 사용할 수 있다. AWS Managed Rules 및 AWS Marketplace 판매자가 사용할 수 있는 관리형 규칙 그룹을 제공한다. 사용자 고유의 규칙 그룹을 정의할 수도 있다.

WAF와 WAFv2 차이점

WAF Classic 에서는 하나의 WebACL 에 적용 가능한 Rule 의 갯수가 10개로 제한이 되어 있었다. WAFv2 에서는 Rule 개수의 제한이 사라지고 WAF Capacity Unit(WCU)이라는 개념이 생겼다. WCU을 기준으로 WebACL에 적용가능한 최대 Rule 을 계산한다. ACL 당 1,500 WCU Soft Limit가 있다.

 

WAF Classic에서는 AWS 보안 파트너사에서 제공하는 Managed rule 만 사용이 가능했다. WAFv2에서는 파트너사에서 제공하는 Managed Rule 이외에 AWS에서 제공하는 Managed Rule 의 사용이 가능하다. AWS Managed Rule은 따로 추가 요금이 발생하지 않는다. Managed Rule마다 다른 WCU를 가지고 있어 추가 rule을 설정할 때는 WCU를 확인해야한다.

AWS Managed Rules

많이 사용되는 보안 rule을 AWS Managed Rule에서 제공한다.

 

AWSManagedRulesCommonRuleSet은 OWASP 게시물에 설명된 자주 발생하고 위험성 높은 취약성을 비롯한 광범위한 취약성 도용을 막을 수 있다.

 

AWSManagedRulesAmazonIpReputationList은 일반적으로 봇이나 다른 위협과 연결된 IP 주소를 차단하려는 경우에 유용하다. 이러한 IP 주소를 차단하면 봇을 완화하고 악성 액터가 취약한 애플리케이션을 발견하는 위험을 줄일 수 있다.

 

AWS Managed Rules rule groups 계정의 - AWS WAF, AWS Firewall Manager, 및 AWS Shield Advanced

WAFv2 Terraform 설정

AWS에서 제공하는 rule을 사용하는 terraform을 작성할 때는 아래 link를 참고해라.

 

AWS Managed Rules Terraform module

 

특정 IP에서 요청이 과도하게 들어오는 것을 막는 rule을 아래와 같이 구성해 보았다.

resource "aws_wafv2_ip_set" "white_list_ip_list" {
  name               = "test-name"
  description        = "white ip set"
  scope              = "CLOUDFRONT"
  ip_address_version = "IPV4"
  addresses          = ["127.0.0.1/32"] # 조건에서 제외시킬 ip 추가
}

resource "aws_wafv2_web_acl" "main" {
  name  = "test-acl"
  scope = "CLOUDFRONT"

  rule {
    name     = "test-rule"
    priority = 1
    action {
      block {}
    }

    statement {
      rate_based_statement {
        limit              = 1000 # 5분에 1000개의 request가 들어오면 조건에 성립한다.
        aggregate_key_type = "IP"
        scope_down_statement {
          not_statement {
            statement { 
              ip_set_reference_statement {
                arn = aws_wafv2_ip_set.white_list_ip_list.arn
              }
            }
          }
        }
      }
    }
  }
}

scope는 CloudFront에 사용할 ACL이라면 CLOUDFRONT로 설정하고 그 외에 ALB, API Gateway에서 사용하는 ACL이라면 REGIONAL로 설정한다.

Reference

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함