VPC Flow Logs 조회 방법(CloudWatch Logs Insights)

CloudWatch Logs Insights를 사용한 VPC Flow Logs 조회 방법에 대해서 설명드리도록 하겠습니다.
VPC Flow Log를 활성화한 후 CloudWatch Log Group에 저장은 했는데 어떻게 활용해야하는지 막막하셨다면 필터를 사용해서 조회해보시길 바랍니다.

1. VPC Flow Logs

보안 요건으로 VPC Flow Logs는 주로 활성화하는 편이고 CloudWatch Log Group에 저장하는 편입니다.
S3가 아닌 CloudWatch Log Group에 저장하는 이유는 저는 CloudWatch Logs Insights를 사용하여 쿼리로 조회하는 경우가 종종 있기 때문입니다.

클라우드 환경 구축 및 운영을 하다보면 트래픽 로그를 확인해야할 때가 있습니다.
저는 주로 예상되는 트래픽이 방화벽에 의해서 Reject되었는지 확인하거나 Security Group 통제를 위해 아웃바운드 트래픽을 파악하기 위해서 사용합니다.

2. CloudWatch Logs Insights를 사용한 VPC Flow Log 조회 방법

2.1 쿼리 작성하기 전 생각할 부분

아래 리스트 중 필요한 부분만 고려하면된다.

  1. 네트워크 인터페이스 ID : 어떤 네트워크 인터페이스의 로그를 살펴볼 것인지
  2. Action : 트래픽이 Reject되었는지 Accept되었는지
  3. IP : Source IP, Destination IP로 필터링할 것인지
  4. Port : 아웃바운드 트래픽일 경우 Destination Port를, 인바운드 트래픽일 경우 Source Port를 사용하여 필터링할 것인지
  5. 특정 필드의 결과 값에 대해서 발생 건수를 볼 것인지 상세를 볼 것인지
  6. sort : 특정 필드를 기준으로 정렬을 할 것인지 desc(내림차순), asc(오름차순)
  7. Limit : 출력 Limit 조건을 사용할 것인지

나는 주로 count(*)을 사용하여 발생 건수로 출력하게끔 한다. 이렇게 하지 않으면 트래픽 하나하나가 출력되기 때문에 한눈에 보기 힘들다.

2.2 VPC Flow Log 조회 쿼리 작성

filter @logStream = '네트워크 인터페이스 ID-all'
| filter action='REJECT 또는 ACCEPT'
| filter srcAddr = 'Source IP'
| filter scrPort = 'Source Port'
| filter dstAddr = 'Destination IP'
| filter dstPort = 'Destination Port'
| stats count(*) as num by srcAddr, srcPort, dstAddr, dstPort
| sort num desc 또는 asc
| limit 숫자

eni-0e7ae111222111000의 Private IP가 10.0.1.10이라고 가정.

예시1

filter @logStream = 'eni-0e7ae111222111000-all'
| filter action='REJECT'
| filter srcAddr = '10.0.1.10'
| filter dstAddr = '10.0.2.15'
| filter dstPort = '22'
| stats count(*) as num by srcAddr, dstAddr, dstPort

==> eni에서 나가는 아웃바운드 트래픽이 Reject가 났는지 확인할 때 위와 같이 사용한다.
(단 이 경우 결과에서 dstPort가 동적포트일 경우는 고려하지 않음.)
쿼리 조회 범위 : eni-0e7ae111222111000에서 발생
트래픽 Reject된 항목만
10.0.1.10에서 10.0.2.15의 22번 포트로 발생한 트래픽만 보고 싶어
결과는 num/srcAddr/dstAddr/dstPort로 출력할거야
num은 srcAddr/dstAddr/dstPort에 대해서 몇번 발생했는지 건수를 알려줘

예시2

filter @logStream = 'eni-0e7ae111222111000-all'
| filter action='ACCEPT'
| filter srcAddr = '10.0.1.10'
| stats count(*) as num by srcAddr, dstAddr, dstPort
| sort num desc

==> eni에서 나가는 아웃바운드 트래픽 중 Accept되는 트래픽을 파악할 때 위와 같이 사용한다.
(단 이 경우 결과에서 dstPort가 동적포트일 경우는 고려하지 않음.)
쿼리 조회 범위 : eni-0e7ae111222111000에서 발생
트래픽 Accept된 항목만
10.0.1.10에서 발생한 트래픽만 보고 싶어
결과는 num/srcAddr/dstAddr/dstPort로 출력할거야
num은 srcAddr/dstAddr/dstPort에 대해서 몇번 발생했는지 건수를 알려줘
발생 건수(num)을 기준으로 내림차순으로 정렬해줘

이번 포스팅에서는 CloudWatch Log에 저장된 VPC Flow Log를 Insights를 사용하여 조회하는 방법에 대해서 알아봤습니다.
예시는 아웃바운드 트래픽 파악에 대해서 들었는데 인바운드 트래픽도 필터링이 가능하니 실무에서 활용해보시길 바랍니다.

참고 : VPC Flow Logs 공식 문서

Leave a Comment