본문 바로가기

Storage&CDN/WAF

AWS WAF 로그 수집 방법

AWS WAF에서 로그 확인 방법은 세 가지가 있다.

 

1. AWS WAF 화면에서 Get new samples를 통해 샘플링 된 로그 확인 방법

 

2. Application Load Balancer 로그에서 WAF 관련 로그 확인

(ALB의 로그 target:port 필드에서 WAF로 차단된 요청의 경우 "-"로 표시되며 상태코드는 403으로 분류)

 

 

Access Logs for Your Application Load Balancer - Elastic Load Balancing

The AWS Documentation website is getting a new look! Try it now and let us know what you think. Switch to the new look >> You can return to the original look by selecting English in the language selector above. Access Logs for Your Application Load Balance

docs.aws.amazon.com

3. Kinesis Data Firehose를 통해 WAF Full 로그 확인

기존 Sample 로그나 ALB 로그와 다르게 HTTP 헤더 등 요청에 관련된 모든 로그 정보를 확인할 수 있다.

 

그러나 기존 SIEM과 같은 황경에서 볼 수 있는 AWS WAF 서비스는 별도로 존재하지 않는다.

따라서 ELK(Elastic Serach, Log stash, Kibana)와 같은 형태의 스택을 구성해서 AWS WAF 로그를 분석/필터링 해야 한다. AWS 환경에서는 대부분 S3로 로그 데이터를 저장하기 때문에 AWS의 ELK 스택을 이용하는 것을 권장한다. 추가로 AWS Athena와 같은 서비스를 이용해서 로그 분석이 가능하다.

 

Athena를 사용하여 Load Balancer 액세스 로그 분석

기본적으로 Elastic Load Balancing은 액세스 로깅을 활성화하지 않습니다. 액세스 로깅을 활성화할 때 Amazon Simple Storage Service(Amazon S3) 버킷을 지정합니다. 모든 Application Load Balancer 및 Classic Load Balancer 액세스 로그는 해당 S3 버킷에 저장됩니다. 그런 다음 로드 밸런서의 문제를 해결하거나 성능을 분석하려는 경우 Athena를 사용하여 S3의 액세스 로그를

aws.amazon.com

 

이번 글은 세 번째 방법에 대해서 서술한다.

각 Web ACL이 매핑된 객체(CloudFront, ALB, API G/W 등) 요청에 대한 트래픽 로그를 제공한다.

 

로그를 수집하는 과정에서 Kinesis Data Firehose 서비스 설정이 필요하며, Kinesis Data Firehose의 제약사항(초당 레코드 수)를 고려해야 한다.

 

Firehose delivery stream으로 전달된 레코드는 아래 4개의 Destination 중 원하는 객체에 적재할 수 있다.

- Amazon S3

- Amazon Redshift

- Amazon Elasticsearch Service

- Splunk

 

또한 위 과정을 통해 일부 레코드 포맷이나 일부 형식을 수정하는 것이 제한적으로 가능하다.

추가로 Kinesis에 적재된 로그 데이터량에 따라 추가 과금이 발생된다.

 

그럼 실제로 AWS 콘솔을 통해 진행해보도록 하자.

[AWS Management Console] -> [Kinesis] -> [Dashboard] -> [Create delivery stream]

Kinesis Data Firehose

이 때 리전 선택에 주의해야 한다. Web ACL이 Global 타입인 경우 버지니아 리전을 선택해야 하고, Reginal 타입인 경우 동일한 위치의 리전을 선택해야 한다.

 

그 다음 스트리명을 지정한다.

Kinesis Data Firehose

이름은 규칙에 따라 반드시 "aws-waf-logs-"로 시작해야 한다.

 

레코드 프로세스 규칙을 정의한다.

Kinesis Data Firehose

필요 시 전달 과정에서 원본 레코드를 Lambda 함수를 통해 수정하거나 포맷 등을 변경할 수 있다.

 

저장될 스토리지를 선택한다. 

Kinesis Data Firehose

S3부터 Splunk 등 다양한 데이터 저장소를 지원하며, 이번 테스트는 S3를 지정한다.

 

 

로그의 Prefix를 지정한다. 

Kinesis Data Firehose

설정한 경로 하위로 "YYYY/MM/DD/HH" 형슥(기본값)으로 키값이 추가된다.

 

 

그리고 S3의 버퍼 크기나 주기, 압축/암호화 설정을 한다.

Kinesis Data Firehose

버퍼 크기의 경우 WAF 로그가 쌓이는 수준을 고려하여 설정한다. 또한 로그임으로 GZIP 형태를 권장하고 암호화는 선택하지 않았다.

 

 

그리고 IAM role을 설정해야 한다.

Kinesis Data Firehose

IAM role의 경우 "Create new or choose" 버튼을 선택하면, AWS에서 알맞은 Policy를 갖고 있는 Role을 생성해준다.

 

객체 생성이 완료된 후에 Status 값이 Active가 될 때까지 기다린다.

Kinesis Data Firehose

보통 해당 과정은 약 1분 전후로 완료된다. 

 

그럼 다시 [AWS Management Console] -> [WAF & Shield] -> [Web ACLs] 로 WAF 화면으로 돌아간다.

WAF ACls Logging

"Logging" 탭으로 이동한 뒤에 Enalbe Logging을 선택해준다.

 

그럼 이제 이전에 생성한 Kinesis Data Firehose 객체와 매핑한다.

WAF Logging

혹시 객체의 목록이 표시되지 않는 경우 이름이 "aws-waf-logs-"로 시작하는 지 다시 한 번 확인한다.

또한 원하는 경우 로그에서 제외될 필드를 지정할 수 있다.

 

 

그럼 WAF 풀 로깅 설정을 완료할 수 있다.

WAF 로깅 설정

이후에 선택적으로 해당 로그를 "Disable" 할 수 있다.

 

그럼 Kinesis Data Firehose의 모니터링 탭에서 로그 데이터가 정상적으로 유입되는 지 확인할 수 있다.

Kinesis Data Firehose

또한 S3에서도 정상적으로 로그 파일이 저장되는 지 확인하자.

S3 WAF LOG

아래와 같은 형태의 로그를 확인할 수 있다.

{
"timestamp":1570770782134,
"formatVersion":1,
"webaclId":"cdedc3c5-609c-4c01-9813-21a87409a55b",
"terminatingRuleId":"Default_Action",
"terminatingRuleType":"REGULAR",
"action":"ALLOW",
"httpSourceName":"ALB",
"httpSourceId":"575930131594-app/demo/c6ca3914c8d05420",
"ruleGroupList":[
],
"rateBasedRuleList":[
],
"nonTerminatingMatchingRules":[
{
"ruleId":"b17bd560-7a1f-46ed-929c-d3ec7e3632e9",
"action":"COUNT"
},
{
"ruleId":"aa67843d-dcc3-49f4-aada-375f178e532c",
"action":"COUNT"
}
],
"httpRequest":{
"clientIp":“111.222.333.444",
"country":"KR",
"headers":[ ... ]
...
}

 

자세한 로그 내역은 아래 링크를 통해 확인할 수 있다.

 

Logging Web ACL Traffic Information - AWS WAF, AWS Firewall Manager, and AWS Shield Advanced

The AWS Documentation website is getting a new look! Try it now and let us know what you think. Switch to the new look >> You can return to the original look by selecting English in the language selector above. Logging Web ACL Traffic Information You can e

docs.aws.amazon.com

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

AWS WAF 로그 수집 방법  (0) 2019.12.24
AWS WAF Rate-based Rules 사용하기(Brute force)  (0) 2019.12.24

태그