안녕하세요 서후아빠입니다. ^_^
이번 세션은 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 구성요소 생성하기
1단계 : ACM을 이용하여 Public 인증서 발급하여 Route 53과 ALB 연동
아래 링크에서 Public 인증서 발급부터 Route 53 등록 및 ALB 연동 작업을 진행하시기 바랍니다.
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 기능 이관은 제약이 많음
'Security' 카테고리의 다른 글
[실습] AWS Secrets Manager 실습하기 (Lambda를 이용한 RDS 비밀번호 자동 변경) (0) | 2022.08.08 |
---|---|
[이론] AWS Secrets Manager 기본 개념 (0) | 2022.08.08 |
[이론] AWS WAF 기본 개념 (0) | 2022.08.04 |
[실습] AWS Network Firewall 구성하기 (0) | 2022.08.01 |
[이론] AWS Network Firewall 기본 개념 (1) | 2022.07.27 |