본문 바로가기

Security

[실습] AWS WAF 구성하기

반응형

안녕하세요 서후아빠입니다. ^_^

이번 세션은 AWS WAF를 ALB에 연결하여 탐지 및 차단하는 실습을 해보겠습니다. 

써 보시면 아시겠지만, AWS WAF는 특정 서브넷에서 동작하는 것이 아니라 Region이나 Global에서 동작합니다.

즉, 정책(Web ACL)만 생성하여 해당 서비스에 연결(Associated AWS resources)해서 사용하는 개념입니다. 


구성도

인터넷에서 Domain(https://www.gtek.com)으로 접속을 시도하면 아래처럼 동작됩니다.
① Route 53에 등록된 CNAME을 통해서 albA로 패킷을 전달합니다. 
② albA에 연결된 wafA에서 패킷을 탐지 및 차단합니다. 이때, wafA는 albA에 등록된 ACM 인증서를 사용하며, 로그는 지정된 위치(S3 or CloudWatch)로 전달합니다. wafA를 통과한 패킷은 albA의 부하분산 처리에 따라 priA-ec2-1 or priA-ec2-2로 전달됩니다.

만약 CloudFront를 구성한다면 igwA와 Route 53 사이에 위치하게 됩니다. 
  - albA를 CloudFront에 Origin으로 등록을 합니다.
  - CloudFront에 생성된 도메인을 Route 53에 CNAME으로 등록합니다.

사전 작업

인프라 생성 : vpc, subnet, igw, routing table, ec2, s3 bucket or Cloudwatch log group  등은 설명 생략합니다. 

※ priA-ec2-1, priA-ec2-2는 wordpress 설치하여 HTTP 준비

# AMI 중 WordPress로 인스턴스를 생성하거나 아래처럼 직접 WordPress를 설치 
sudo yum install httpd -y 

cat /var/www/html/index.html 
<html><body>hello World1</body></html>   // priA-ec2-1 
<html><body>hello World2</body></html>   // priA-ec2-2 

sudo systemctl start httpd.service 

# HTTP 서비스 Listen 상태 확인 
netstat -tupan | grep 80

2022.07.02 - [Networking] - [실습] Amazon VPC 구성요소 생성하기

 

[실습] Amazon VPC 구성요소 생성하기

안녕하세요 서후아빠입니다. ^_^ 이번 세션은 VPC 관련 구성요소에 대해서 실습을 해보겠습니다. 구성도 1단계 : VPC 생성 VPC > Your VPCs > Create VPC 구분 VPC settings (VPC Only 방식) VPC settings (VPC a..

sh-t.tistory.com

1단계 : ACM을 이용하여 Public 인증서 발급하여 Route 53과 ALB 연동

아래 링크에서 Public 인증서 발급부터 Route 53 등록 및 ALB 연동 작업을 진행하시기 바랍니다.

2022.07.26 - [Security] - [실습] AWS Certificate Manager (ACM)을 이용하여 인증서(Public, Private) 발급하여 Route 53과 ELB 연동하기-1편

 

[실습] AWS Certificate Manager (ACM)을 이용하여 인증서(Public, Private) 발급하여 Route 53과 ELB 연동하기-1편

안녕하세요 서후아빠입니다. ^_^ 이번 세션은 ACM에서 Public 도메인을 구매하고 Public 인증서를 발급하여 ALB에 연결하는 과정을 실습해보겠습니다. 이어서 진행되는 Private 도메인 등록과 인증서 발

sh-t.tistory.com

2단계 : IP set 생성 (옵션)

WAF > IP sets > Create IP set

구분 IP set details
Black List IP set name : black_list
Region : Asia Pacific (Seoul)
IP version : IPv4
IP addresses : 노트북의 Public IP
White List IP set name : white_list
Region : Asia Pacific (Seoul)
IP version : IPv4
IP addresses : 노트북의 Public IP

3단계 : Web ACL 생성 (=WAF)

AWS WAF > Web ACLs > Create web ACL 

Describe web ACL and associate it to AWS resources Add rules and rule groups Set rule priority Configure metrics
Name : wafA
CloudWatch metric name : 자동입력
Resource type : Regional resources (Application Load Balancer, API Gateway, AWS AppSync)
Region : Asia Pacific (Seoul)
Associated AWS resources > Add AWS resources
  - Resource type : Application Load Balancer
  - Select : albA
Rules에서 Add rules  > Add managed rule groups 
  - AWS managed rule groups : disabled
  - Free rule groups : 필요항목 선택하여 enable
Default web ACL action for requests that don't match any rules
  - Default action : Allow
  - custom request(옵션) : - 
- metric명 : 자동 입력
Request sampling options : Enable sampled requests 
CloudWatch metric name : 자동으로 입력되며, 수동으로 변경 가능
Resource type을 CloudFront distributions으로 선택할 경우, Region은 선택할 필요없고, Associated AWS resources에서 CloudFron를 선택하면 됩니다.
Add AWS resources : Web ACL 생성 후 등록 가능, 하나의 Web ACL에 ALB/API Gateway/AWS AppSync 함께 등록도 가능
Add managed rule groups의 3rd party rule은 marketplace에서 구매한 WAF에서만 설정 가능
AWS managed rule groups : 옵션(AWS WAF Bot Control, AWS WAF Fraud Control), 유료
Free rule groups
  - 11개 모두 선택하면 Max Capacity 1500 초과되어 오류 발생하므로 필요한 항목만 선택하여 Enable
  - Edit 클릭해서 Version, Scope-down statement 등 변경 가능
Default action 
  - Allow : rule에 매치되지 않는 것은 허용
  - Block : rule에 매치되지 않는 것은 차단, Custom response(옵션) 설정 가능
Set rule priority : Rule을 선택하여 Move up/down으로 우선순위 설정 가능
Configure metrics : 각 rule별 CloudWatch에 기록되는 metric명을 설정 (수동으로 metric명 변경 가능)
Request sampling options : 비활성화하면 Web ACL에 매치되는 request sampling을 볼수 없음, request smpling을 이용하여 패킷 분석할 수 있음

4단계 : Web ACL logging 설정 (옵션)

AWS WAF > Web ACLs > wafA 선택 > Logging and metrics (tab) > Logging의 Enable  

Logging destination Redacted fields
S3 bucket (or CloudWatch Logs log group or Kinesis Data Firehose stream) 
경로 : aws-waf-logs-wafA
-
Logging destination의 cloudwatch log group이나 S3 버킷은 꼭 ‘aws-waf-logs-’로 시작해야 합니다.
Redacted fields(로그에서 제외할 데이터 필드)에는 HTTP Method, Query string, URI path, single header가 있으며, 분석을 위해 생략하지 말고, 분석 완료 후 검토 후 생략하도록 합니다.

5단계 : WAF 테스트 (기본 정책)

노트북에서 Route 53에 등록된 Domain으로 접속 시도

  - https://www.gtek.com : Success

  - https://www.gtek.com/and%201=(select%20@@VERSION) : 403 Forbidden

  - https://www.gtek.com/'or 1=1-- : 403 Forbidden

and 1=(select @@VERSION) : DB 정보조회하는 쿼리 구문
' or 1=1-- : 로그인 인증 우회하는 쿼리 구문

6단계 : Web ACL 수정

AWS WAF > Web ACLs > wafA 선택 > Rules (tab)의 Add rules >Add my own rules and rule groups

Rule type Rule IP set Set rule priority
Rule type : IP set Name : block_IPset IP set : black_list (2단계에서 생성)
IP address to use as the originating address : Source IP address ( or IP address in header)
Action : Block (or Allow or Count or CAPTCHA)
Custom response(옵션) : -
Add label(옵션) : -
가장 위로(Move up) 이동하여 우선순위 적용
IP address in header : Cloudfront or Proxy 등 중간에 Source IP가 변경되는 경우 X-forwarded-For에 Origin Source IP가 기록되며, 이를 탐지하여 동작하도록 합니다.

7단계 : WAF 테스트 (block_IPset 정책)

노트북에서 Route 53에 등록된 Domain으로 접속 시도 (몇번 시도해 보세요)

  - https://www.gtek.com : 403 Forbidden (모든 요청 차단)

WAF에서 무조건 차단시킵니다.

8단계 : Web ACL 수정

AWS WAF > Web ACLs > wafA 선택 > Rules (tab)의 Add rules > Add my own rules and rule groups

Rule type Rule IP set Set rule priority
Rule type : IP set Name : allow_IPset IP set : white_list (2단계에서 생성)
IP address to use as the originating address : Source IP address ( or IP address in header)
Action : Allow
Custom response(옵션) : -
Add label(옵션) : -
가장 위로(Move up) 이동하여 우선순위 적용

9단계 : WAF 테스트 (allow_IPset 정책)

노트북에서 Route 53에 등록된 Domain으로 접속 시도 (몇번 시도해 보세요)

  - https://www.gtek.com : Success (block_IPset 정책보다 우선순위 높기 때문에 통과)

  - https://www.gtek.com/and%201=(select%20@@VERSION) : 사이트에 연결할 수 없음

  - https://www.gtek.com/'or 1=1-- : 사이트에 연결할 수 없음

DB가 없기 때문에 출력되는 메시지이며, 5단계 테스트처럼 WAF에서 차단하지 않고, WAF에서 무조건 통과시킵니다.

10단계 : Web ACL 수정

AWS WAF > Web ACLs > wafA 선택 > Rules (tab)의 Add rules > Add my own rules and rule groups

Rule type Rule builder If a request (matches the statement) Then Set rule priority
Rule type : Rule builder Name : block_GET 
Type : Regular rule
Inspect : HTTP method
Match type : Exactly matches string
String to match : GET
Text transformation : None
Action : Block (or Allow or Count or CAPTCHA)
Custom response(옵션) : -
Add label(옵션) : -
가장 위로(Move up) 이동하여 우선순위 적용

11단계 : WAF 테스트 (block_GET 정책)

노트북에서 Route 53에 등록된 Domain으로 접속 시도 (몇번 시도해 보세요)

  - https://www.gtek.com : 403 Forbidden (white_Ipset 정책보다 우선순위 높기 때문에 모든 요청 차단)

WAF에서 무조건 차단시킵니다.

12단계 : Web ACL 수정

AWS WAF > Web ACLs > wafA 선택 > Rules (tab)의 Add rules > Add my own rules and rule groups

Rule type Rule builder Request rate details Then Set rule priority
Rule type : Rule builder Name : block_100
Type : Rate-based rule
Rate limit : 100 (5분동안 100회 요청 시 차단)
IP address to use for rate limiting : Source IP address (or IP address in header)
Criteria to count request towards rate limit : Consider all requests ( or Only consider requests that match the criteria in a rule statement)
Action : Block (or Allow or Count or CAPTCHA)
Custom response(옵션) : -
Add label(옵션) : -
가장 위로(Move up) 이동하여 우선순위 적용

AWS WAF > Web ACLs > wafA 선택 > Rules (tab) > block_GET 선택 > Delete

block_100 정책 테스트 위해 삭제 필요합니다.

13단계 : WAF 테스트 (block_100 정책)

노트북에서 Route 53에 등록된 Domain으로 접속 시도 (몇번 시도해 보세요)

  - https://www.gtek.com : Success (5분 이내 100회 이상 시도 시 403 Forbidden)

임계치를 초과하면 차단됩니다. 차단 후, 임계치 미만(ex : 5분 이내 100회)으로 떨어지면 다시 통과됩니다.

14단계 : Requests Monitoring, Logging

AWS WAF > Web ACLs > wafA 선택 > Overview (tab)

Requests per 5 minute period : 과거 5분간 요청한 정보를 그래프 표현
Sampled requests : 과거 3시간 Request sampling을 테이블 표현, 검색 기능 (Metric name, Source IP, URI, Action, Time, Rule inside rule group)

S3 > Buckets > aws-waf-logs-wafA : 로그 파일 다운로드하여 분석 가능  

WAF에서 Block 시 403 Forbidden이 아닌 특정 문구 출력 설정

AWS WAF > Web ACLs > wafA 선택 > Rules (tab) >  수동으로 생성한 정책(ex : block_100) 선택해서 수정

Custom response Response code Choose how you would like to specify the response body(HTML, JSON, Plain text)
Enable 200 HTML not good
WAF에서 차단되면 브라우저에 "not good"이 출력됩니다.

Rules 설정 가이드 

내용 (Name) 설명 및 경로 예시
UploadPathAllowGroup 그룹 생성 > Rule 생성(필요 시 Capacity 조정) > 여러 Rule에 대한 우선순위 설정

AWS WAF > Rule groups
Type : Regular rule 
If(Statement) 
  - Field to match : URI path
  - Positional constraint : Exactly matches string
  - Search string : /app/common/image/upload
Then
  - Action : Allow
HttpMethodBlockRule Rule 생성하면서 단독을 동작하거나 기존 그룹에 포함시킬 수 있음

AWS WAF > Web ACLs > WAF 선택 > Rules (tab) > Add rules > Add my own rues and rule groups
Type : Regular rule 
If(Statement 1) 
  - Field to match : HTTP method
  - Positional constraint : Exactly matches string
  - Search string : DELETE
  (or Statement 2) 
  - Field to match : HTTP method
  - Positional constraint : Exactly matches string
  - Search string : PATCH
  (or Statement 3) 
  - Field to match : HTTP method
  - Positional constraint : Exactly matches string
  - Search string : OPTIONS
Then
  - Action : Block
HttpFloodRateBasedRule DDoS 공격 형태의 Flooding 차단

AWS WAF > Web ACLs > WAF 선택 > Rules (tab) > Add rules > Add my own rues and rule groups
Type : Rate-based rule
If(Statement 1) 
  - IP address to use for rate limiting : Source IP address
  - Rate limit : 1,000,000
Then

  - Action : Block
기타 관리형 Rule 중 설정할만한 정책

AWS WAF > Web ACLs > WAF 선택 > Rules (tab) > Add rules >  Add managed rule groups
Admin protection : Enable
Amazon IP reputation list : Enable
Core rule set : Enable
Known bad inputs : Enable
Linux operating system : Enable
SQL database : Enable
Rule groups에서 그룹만 생성하고 Add my own rues and rule groups에서 Rule을 생성하면서 기존 그룹을 선택해도 되고, Rule groups에서 그룹과 Rule을 동시에 생성해도 됩니다.

3rd Party(EC2 type) WAF에서 AWS WAF 전환 시 고려사항

WAF 구성

 - 하나의 Account에 AWS WAF를 구성하여 모든 서비스 트래픽을 통제할지?

 - 개별 Account에 AWS WAF를 구성하여 개별 서비스 트래픽을 통제할지?

Managed Rule Set Migration 
  -  접근제어 IP, Regex pattern sets, IP Sets 등은 수동으로 추가 가능

  - 기존 WAF의 시그니처 or 기능 이관은 제약이 많음

반응형