WAF Rate Rules은 공격자의 악의적인 요청(Reqeust)에 대해 일정 임계치(Threshold)를 통해 공격자의 요청을 블록킹(Blocking)하는 기능이다.
(e.g 5분 간 100개가 넘는 요청들이 왔을 때, 공격자의 IP를 차단)
설정 방법은 매우 간단하다.
먼저 AWS 웹 콘솔(Web Console)에서 WAF 구성 항목으로 들어간다. 그리고 Rules 페이지에서 Craete Rule을 선택한다.
(AWS WebConsole -> WAF -> Rules)
위 그림과 같이 각 항목을 입력한다. Rate limit의 경우 현재 최소 100개의 요청까지 임계치 구성을 할 수 있다.
그리고 WAF ACLs 페이지에서 Create web ACL을 선택한다.
위 그림과 같이 각 항목들을 채워준다. AWS resource to associate에는 매핑(mapping) 할 로드밸런서(ALB)나 클라우드프론트(CloudFront)를 선택한다.
다음 Step 2: Create conditions 항목은 바로 Next로 넘어간다.
그리고 Step 3: Create Rules에서 이전에 생성해놓은 waf-rate-based-rule을 추가한다.
Step 4: Review and create 에서 구성을 확인하고 WAF ACLs를 생성한다. Action에서는 Block을 설정하고 Rate based rule이 동작하는지 확인해본다.
그럼 위 그림과 같이 구성이 완료된 것을 볼 수 있다.
실제로 CloudFront 설정 화면을 보면 AWS WAF Web ACL 항목에 생성한 WAF ACL(waf-test-acls)이 매핑되어 있는 것을 확인할 수 있다.
그럼 리눅스의 AB 프로그램을 이용하여 다량의 요청을 WAF와 연결된 URL에 요청해보도록 하겠다.
아래는 동시 50개의 요청으로 10,000개의 요청들을 보내는 명령어다.
ab -n 10000 -c 50 https://blog.leedoing.com/
전체 10,000의 요청 중 8,712개의 요청 실패가 발생되었고, Non-2xx responses: 7,622개의 403 에러코드가 발생됐다.
[root@ip-10-0-0-19 ~]# ab -n 10000 -c 50 https://blog.leedoing.com/
This is ApacheBench, Version 2.3 <$Revision: 1843412 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking blog.leedoing.com (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests
Server Software: Apache
Server Hostname: blog.leedoing.com
Server Port: 443
SSL/TLS Protocol: TLSv1.2,ECDHE-RSA-AES128-GCM-SHA256,2048,128
Server Temp Key: ECDH P-256 256 bits
TLS Server Name: blog.leedoing.com
Document Path: /
Document Length: 42523 bytes
Concurrency Level: 50
Time taken for tests: 21.307 seconds
Complete requests: 10000
Failed requests: 8712
(Connect: 0, Receive: 0, Length: 8712, Exceptions: 0)
Non-2xx responses: 7622
Total transferred: 189237907 bytes
HTML transferred: 185585475 bytes
Requests per second: 469.32 [#/sec] (mean)
Time per request: 106.537 [ms] (mean)
Time per request: 2.131 [ms] (mean, across all concurrent requests)
Transfer rate: 8673.17 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 4 10 5.2 9 126
Processing: 3 94 152.9 10 518
Waiting: 3 91 152.5 7 510
Total: 8 104 152.4 21 526
Percentage of the requests served within a certain time (ms)
50% 21
66% 28
75% 47
80% 335
90% 377
95% 400
98% 434
99% 459
100% 526 (longest request)
WAF ACLs 화면에서 아래와 같이 샘플 로그를 확인할 수 있다.
또한 생성했던 waf-rate-based-rule을 확인하면 공격 IP였던 52.78.189.144/32가 블록 처리된 것을 확인할 수 있다.
이상 간단한 설정만으로 Brute Force 공격을 막을 수 있는 WAF Rate-based Rule에 대해서 알아봤다. 참고로 현재 X-Forwarded-For 헤더를 지원하지 않는다. 또한 사무실에서 NAT를 쓴다면 Rate-based Rule 사용으로 오탐이 발생될 수도 있는 점을 숙지해야 한다.
더 자세한 설명은 아래 AWS Document를 확인하자.
'Storage&CDN > WAF' 카테고리의 다른 글
AWS WAF 로그 수집 방법 (0) | 2022.03.13 |
---|