본문 바로가기

블로그

LG CNS 기술블로그 DX Lounge에서 최신 IT 소식을 만나보세요!

AWS Ambassador

AWS WAFv2 in Terraform

2023.02.01

1. 개요

AWS WAF는 CloudFront / ALB / API Gateway에 전달되는 HTTP 및 HTTPS 요청을 모니터링할 수 있게 해주고 콘텐츠에 대한 액세스를 제어할 수 있게 해주는 웹 애플리케이션 방화벽입니다.
요청이 시작되는 IP 주소 또는 쿼리 문자열의 값과 같이 사용자가 지정하는 조건에 따라 CloudFront는 요청된 콘텐츠 또는 HTTP 403 상태 코드(사용 권한 없음)로 요청에 응답합니다.
또한 요청이 차단될 때 사용자 지정 오류 페이지를 반환하도록 CloudFront를 구성할 수 있습니다.
AWS WAFv2 가 19년 11월에 출시되었습니다.
구 버전인 WAF Classic 과의 차이점은 aws WAF Version 2 소개(개선 사항)에서 확인 가능합니다.
크게는 Web ACLs 포함 가능한 Rule 개수 제한이 사라지고 WCU 개념으로 변화, AND 조건뿐만 아니라 OR 조건도 사용 가능, Managed Rules 출시 등이 있습니다.

2. 구성 방안

2.1 Resource: aws_wafv2_ip_set
WAF에는 Web ACLs, IP sets, Regex pattern sets, Rule groups 메뉴가 존재합니다.

1) Web ACLs
WAF 설정의 최종 형태로 이 안에 rule 혹은 Rule group을 포함시킬 수 있습니다.

2) IP sets
해당 IP set에서 발생하는 웹 요청을 식별해 차단하거나 허용하는 것이 가능합니다.
예를 들어 특정 IP 주소(대역)에서 과도한 요청을 수신하는 경우, 해당 IP 주소를 포함하는 IP set을 만들어서 WAF가 이를 차단하도록 구성할 수 있습니다.

개별 IP 주소(대역)을 IP set으로 묶어놓고 .tf 파일로 만든 후에 이를 Rule 하위의 statement에서 참조해서 사용 가능합니다. 현재 wafv2 테라폼 버전에서는 참조를 사용하는 유일한 부분입니다.

3) Regex pattern sets
Regular Expression(정규식)으로 패턴을 지정할 수 있습니다.

4) Rule groups
Rule들의 집합입니다.

2.2 Differences between Rule groups and web ACLs
먼저 Rule group 과 web ACL 은 동일한 방식으로 생성된 rule 들을 포함하고 있습니다. 다만 아래의 항목들에서 그 둘은 구분됩니다.
● Rule group은 아래와 같은 rule 유형을 포함할 수 없습니다.
-Rule group reference statements (Rule group 안에 Rule group)
-Rate-based rule statements
→ IP 주소에 대한 5분 간격의 요청 수를 감시하고, 지정한 제한 요청 수를 초과할 때 rule action을 트리거 합니다. 이를 통해 과도한 요청을 보내는 IP 주소의 요청을 임시 차단할 수 있습니다.
● 생성한 rule group 을 arn 형태로 다수의 web ACL에서 사용할 수 있습니다. 다만 web ACL은 다른 곳에서 참조하는 것이 불가합니다.
다만 이를 사용하기 위해서는 귀찮게도 override_action, rule_group_reference_statement 등의 선언이 필요합니다.
example)
statement { rule_group_reference_statement { arn = aws_wafv2_rule_group.example.arn

● web ACL에는 default action 항목이 반드시 필요하고 (Required) Rule group 은 default action이 존재하지 않습니다.
● aws WAF에서 rule group 은 aws 리소스와 직접 연결하지 않습니다. 웹 ACL에 rule group을 넣어서 사용합니다.
● WAF Classic에서는 하나의 WebACL에 적용 가능한 Rule 개수가 10개로 제한이 되었습니다.
따라서 Rule 개수 10개를 기준으로 WebACL 을 여러 개 생성해야 했습니다. WAFv2에서는 Rule 개수 제한이 사라진 대신 WAF Capacity Unit(WCU)이라는 개념을 기준으로 WebACL에 적용 가능한 최대 Rule 을 계산합니다.
WCU는 1,500 Soft Limit 값을 가지며 그 이상의 Rule 설정이 필요한 경우 Support Team에 Limit 증가를 요청하실 수 있습니다.

2.3 Associating a Web ACL with an AWS resource
WAF는 CloudFront, ALB, API Gateway 3개 자원에 배치할 수 있는데
ALB와 API Gateway는 WAF 메뉴의 Web ACL Association 을 통해 연동하고
CloudFront는 하위 메뉴의 Distributions Edit에서 설정 가능합니다.
(정확히는 Web ACL과 aws 자원을 연결하는 작업입니다.)

테라폼의 경우는 aws_cloudfront_distribution → web_acl_id에서 설정 가능한데
Classic WAF에서는 Web ACL의 ID를 사용했지만 WAFV2부터는 ARN 을 사용합니다.
문서 하단 참조 링크 1번 참고.
요약 내용 : CloudFormation 같은 경우는 WebACLId를 사용합니다.
최신 버전 WAF를 사용하여 생성된 Web ACL을 지정하려면 ACL ARN을 사용합니다.
WAF Classic을 사용하여 생성된 Web ACL을 지정하려면 ACL ID를 사용합니다.

2.4 Terraform을 이용한 WAFv2 생성
아래의 코드를 이용하여 WAF를 구성했습니다.
Rule은 AWS Managed로 제공하는 Rule을 사용했습니다.
ip_sets은 허용할 IP를 입력하는 데 사용을 했습니다.
관리자가 사용하는 IP 등을 할당할 수 있습니다. 여기서는 all로 할당했습니다.

2.5 생성 결과
아래와 같이 ip_sets 이 allowd_ips로 생성되었고, Managed Rule 기반으로 5개의 Rule이 추가로 생성되었습니다.

Dashboard로 WAF에서 탐지된 항목들을 확인할 수 있습니다.

3. 마무리

지금까지 AWS에서 제공하는 WAF의 특징 및 생성 방법에 대해서 알아봤습니다.
WAFv2에서 제공되기 시작한 Managed Rule 이 회사의 정책과 맞는지 확인하는 과정은 필요합니다.
회사의 표준화된 Rule set만 갖춰진다면, AWS WAF 적용이 좀 더 쉽게 될 수 있습니다.
AWS WAF를 사용하여 AWS의 다른 자원들과 쉽게 integration 이 되기 때문에 너무 편리하게 적용이 가능했습니다.

챗봇과 대화를 할 수 있어요