본문 바로가기

Storage&CDN/WAF

AWS WAF Rate-based Rules 사용하기(Brute force)

WAF Rate Rules은 공격자의 악의적인 요청(Reqeust)에 대해 일정 임계치(Threshold)를 통해 공격자의 요청을 블록킹(Blocking)하는 기능이다.

(e.g 5분 간 100개가 넘는 요청들이 왔을 때, 공격자의 IP를 차단)

 

설정 방법은 매우 간단하다.

 

먼저 AWS 웹 콘솔(Web Console)에서 WAF 구성 항목으로 들어간다. 그리고 Rules 페이지에서 Craete Rule을 선택한다.

(AWS WebConsole -> WAF -> Rules)

WAF Rate Rule

 

위 그림과 같이 각 항목을 입력한다. Rate limit의 경우 현재 최소 100개의 요청까지 임계치 구성을 할 수 있다.

 

그리고 WAF ACLs 페이지에서 Create web ACL을 선택한다.

WAF ACL

위 그림과 같이 각 항목들을 채워준다. AWS resource to associate에는 매핑(mapping) 할 로드밸런서(ALB)나 클라우드프론트(CloudFront)를 선택한다.

 

다음 Step 2: Create conditions 항목은 바로 Next로 넘어간다.

 

그리고 Step 3: Create Rules에서 이전에 생성해놓은 waf-rate-based-rule을 추가한다.

WAF Create Rules

Step 4: Review and create 에서 구성을 확인하고 WAF ACLs를 생성한다. Action에서는 Block을 설정하고 Rate based rule이 동작하는지 확인해본다.

 

WAF ACLs

그럼 위 그림과 같이 구성이 완료된 것을 볼 수 있다.

 

실제로 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 Sample logs

 

또한 생성했던 waf-rate-based-rule을 확인하면 공격 IP였던 52.78.189.144/32가 블록 처리된 것을 확인할 수 있다.

IP Block

이상 간단한 설정만으로 Brute Force 공격을 막을 수 있는 WAF Rate-based Rule에 대해서 알아봤다. 참고로 현재 X-Forwarded-For 헤더를 지원하지 않는다. 또한 사무실에서 NAT를 쓴다면 Rate-based Rule 사용으로 오탐이 발생될 수도 있는 점을 숙지해야 한다.

 

더 자세한 설명은 아래 AWS Document를 확인하자.

 

3단계: 비율 기반 규칙 추가 - AWS WAF, AWS Firewall Manager 및 AWS Shield Advanced

3단계: 비율 기반 규칙 추가 비율 기반 규칙은 AWS Shield Advanced 보호에 포함시켜 추가하는 것이 좋습니다. 이 규칙은 갑자기 급증하여 잠재적 DDoS 이벤트가 될 수도 있는 트래픽을 알릴 수 있습니다. 비율 기반 규칙은 지정된 IP 주소로부터 도착하는 요청의 개수를 5분 단위로 계산합니다. 요청 수가 정의한 비율 제한을 초과할 경우 규칙에 따라 알림 전송 같은 작업이 트리거됩니다. 비율 기반 규칙에 대한 자세한 내용은 AWS WAF 작동

docs.aws.amazon.com

 

'Storage&CDN > WAF' 카테고리의 다른 글

AWS WAF 로그 수집 방법  (0) 2022.03.13