CloudWatch Logs Insights를 사용하여 사용자 지정 VPC 흐름 로그를 분석하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2022년 4월 27일

사용자 지정 VPC 흐름 로그를 구성했습니다. Amazon CloudWatch Logs Insights로 패턴과 트렌드를 찾으려면 어떻게 해야 합니까?

간략한 설명

CloudWatch Logs Insights를 사용하여 VPC 흐름 로그를 분석할 수 있습니다. CloudWatch Log Insights는 JSON 형식의 로그 이벤트뿐만 아니라 Amazon에서 제공하는 여러 로그의 필드를 자동으로 검색하므로 쉽게 쿼리를 구성하고 로그를 탐색할 수 있습니다. 기본 형식의 VPC 흐름 로그는 CloudWatch Logs Insights에 의해 자동으로 검색됩니다.

하지만 VPC 흐름 로그는 사용자 지정 형식으로 배포됩니다. 이에 따라, 자동으로 검색되지 않으므로 쿼리를 수정해야 합니다. 이 문서에서는 사용 사례에 맞게 사용자 지정하고 확장할 수 있는 쿼리의 몇 가지 예를 제공합니다.

다음 사용자 지정 VPC 흐름 로그 형식이 사용됩니다.

${account-id} ${vpc-id} ${subnet-id} ${interface-id} ${instance-id} ${srcaddr} ${srcport} ${dstaddr} ${dstport} ${protocol} ${packets} ${bytes} ${action} ${log-status} ${start} ${end} ${flow-direction} ${traffic-path} ${tcp-flags} ${pkt-srcaddr} ${pkt-src-aws-service} ${pkt-dstaddr} ${pkt-dst-aws-service} ${region} ${az-id} ${sublocation-type} ${sublocation-id}

해결 방법

최신 VPC 흐름 로그 검색

로그 필드는 CloudWatch Logs Insights에서 자동으로 검색되지 않으므로 parse 키워드를 사용하여 원하는 필드를 격리해야 합니다. 이 쿼리에서 결과는 흐름 로그 이벤트 시작 시간을 기준으로 정렬되며 가장 최근의 두 로그 항목으로 제한됩니다.

쿼리

#Retrieve latest custom VPC Flow Logs
parse @message "* * * * * * * * * * * * * * * * * * * * * * * * * * *" as account_id, vpc_id, subnet_id, interface_id,instance_id, srcaddr, srcport, dstaddr, dstport, protocol, packets, bytes, action, log_status, start, end, flow_direction, traffic_path, tcp_flags, pkt_srcaddr, pkt_src_aws_service, pkt_dstaddr, pkt_dst_aws_service, region, az_id, sublocation_type, sublocation_id
| sort start desc
| limit 2

결과


account_id  vpc_id   subnet_id  interface_id instance_id srcaddr srcport
123456789012  vpc-0b69ce8d04278ddd  subnet-002bdfe1767d0ddb0 eni-0435cbb62960f230e 172.31.0.104 55125
123456789012  vpc-0b69ce8d04278ddd1  subnet-002bdfe1767d0ddb0 eni-0435cbb62960f230e 91.240.118.81 49422

소스/대상 IP 주소 쌍에 따라 데이터 전송 요약

다음으로, 소스/대상 IP 주소 쌍에 따라 네트워크 트래픽을 요약합니다. 이 예에서 sum 통계는 바이트 필드에 대한 집계를 수행하는 데 사용됩니다. 그러면 호스트 간에 전송된 데이터의 누적 합계가 계산됩니다. 더 많은 컨텍스트를 위해 flow_direction이 포함되어 있습니다. 그런 다음 이 집계의 결과가 일시적으로 Data_Transferred 필드에 할당됩니다. 그런 다음 Data_Tannered를 기준으로 결과가 내림차순으로 정렬되며 가장 큰 두 쌍이 반환됩니다.

쿼리

parse @message "* * * * * * * * * * * * * * * * * * * * * * * * * * *" as account_id, vpc_id, subnet_id, interface_id,instance_id, srcaddr, srcport, dstaddr, dstport, protocol, packets, bytes, action, log_status, start, end, flow_direction, traffic_path, tcp_flags, pkt_srcaddr, pkt_src_aws_service, pkt_dstaddr, pkt_dst_aws_service, region, az_id, sublocation_type, sublocation_id
| stats sum(bytes) as Data_Transferred by srcaddr, dstaddr, flow_direction
| sort by Data_Transferred desc
| limit 2

결과

srcaddr dstaddr flow_direction Data_Transferred
172.31.1.247 3.230.172.154 egress 346952038
172.31.0.46 3.230.172.154 egress 343799447

EC2 인스턴스 ID에 따라 데이터 전송 분석

사용자 지정 VPC 흐름 로그를 사용하여 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스 ID를 직접 분석할 수 있습니다. 이전 쿼리를 통해 이제 instance_id 필드를 사용하여 가장 활성화된 EC2 인스턴스를 확인할 수 있습니다.

쿼리

parse @message "* * * * * * * * * * * * * * * * * * * * * * * * * * *" as account_id, vpc_id, subnet_id, interface_id,instance_id, srcaddr, srcport, dstaddr, dstport, protocol, packets, bytes, action, log_status, start, end, flow_direction, traffic_path, tcp_flags, pkt_srcaddr, pkt_src_aws_service, pkt_dstaddr, pkt_dst_aws_service, region, az_id, sublocation_type, sublocation_id
| stats sum(bytes) as Data_Transferred by instance_id
| sort by Data_Transferred desc
| limit 5

결과

instance_id Data_Transferred
- 1443477306
i-03205758c9203c979 517558754
i-0ae33894105aa500c 324629414
i-01506ab9e9e90749d 198063232
i-0724007fef3cb06f3 54847643

거부된 SSH 트래픽 필터링

보안 그룹 및 네트워크 액세스 제어 목록(ACL)에서 거부된 트래픽을 더 잘 이해하려면 reject VPC 흐름 로그에서 필터링합니다. 프로토콜 및 대상 포트를 포함하도록 이 필터의 범위를 더 좁힐 수 있습니다. SSH 트래픽에서 거부되는 호스트를 식별하려면 TCP 프로토콜(예: 프로토콜 6)과 대상 포트가 22인 트래픽을 포함하도록 필터를 확장합니다.

쿼리

parse @message "* * * * * * * * * * * * * * * * * * * * * * * * * * *" as account_id, vpc_id, subnet_id, interface_id,instance_id, srcaddr, srcport, dstaddr, dstport, protocol, packets, bytes, action, log_status, start, end, flow_direction, traffic_path, tcp_flags, pkt_srcaddr, pkt_src_aws_service, pkt_dstaddr, pkt_dst_aws_service, region, az_id, sublocation_type, sublocation_id
| filter action = "REJECT" and protocol = 6 and dstport = 22
| stats sum(bytes) as SSH_Traffic_Volume by srcaddr
| sort by SSH_Traffic_Volume desc
| limit 2

결과

srcaddr SSH_Traffic_Volume
23.95.222.129 160
179.43.167.74 80

특정 소스/대상 쌍에 대한 HTTP 데이터 스트림 격리

CloudWatch Logs Insights를 사용하여 데이터의 추세를 자세히 조사하려면 두 IP 주소 간의 양방향 트래픽을 격리합니다. 이 쿼리에서 ["172.31.1.247","172.31.11.212"]는 IP 주소를 소스 또는 대상 IP 주소로 사용하여 흐름 로그를 반환합니다. HTTP 트래픽을 격리하기 위해 filter 문은 VPC 흐름 로그 이벤트를 프로토콜 6(TCP) 및 포트 80과 일치시킵니다. display 키워드를 사용하여 사용 가능한 모든 필드의 하위 집합을 반환합니다.

쿼리

#HTTP Data Stream for Specific Source/Destination Pair
parse @message "* * * * * * * * * * * * * * * * * * * * * * * * * * *" as account_id, vpc_id, subnet_id, interface_id,instance_id, srcaddr, srcport, dstaddr, dstport, protocol, packets, bytes, action, log_status, start, end, flow_direction, traffic_path, tcp_flags, pkt_srcaddr, pkt_src_aws_service, pkt_dstaddr, pkt_dst_aws_service, region, az_id, sublocation_type, sublocation_id
| filter srcaddr in ["172.31.1.247","172.31.11.212"] and dstaddr in ["172.31.1.247","172.31.11.212"] and protocol = 6 and (dstport = 80 or srcport=80)
| display interface_id,srcaddr, srcport, dstaddr, dstport, protocol, bytes, action, log_status, start, end, flow_direction, tcp_flags
| sort by start desc
| limit 2

결과

interface_id srcaddr srcport dstaddr destport protocol bytes action log_status
eni-0b74120275654905e 172.31.11.212 80 172.31.1.247 29376 6 5160876 수락 확인
eni-0b74120275654905e 172.31.1.247 29376 172.31.11.212 80 6 97380 수락 확인

특정 소스/대상 쌍에 대한 HTTP 데이터 스트림 격리

CloudWatch Logs Insights를 사용하여 결과를 막대형 또는 원형 차트로 시각화할 수 있습니다. 결과에 bin () 함수가 포함된 경우 쿼리 결과가 타임스탬프와 함께 반환됩니다. 그런 다음 시계열(timeseries)을 선 또는 누적 영역 그래프로 시각화할 수 있습니다.

이전 쿼리를 기반으로 stats sum(bytes) as Data_Trasferred by bin(1m)를 사용하여 1분 간격으로 전송된 누적 데이터를 계산할 수 있습니다. 이 시각화를 보려면 CloudWatch Logs Insights 콘솔에서 로그(Logs)시각화(Visualization) 테이블 간을 전환하세요.

쿼리

parse @message "* * * * * * * * * * * * * * * * * * * * * * * * * * *" as account_id, vpc_id, subnet_id, interface_id,instance_id, srcaddr, srcport, dstaddr, dstport, protocol, packets, bytes, action, log_status, start, end, flow_direction, traffic_path, tcp_flags, pkt_srcaddr, pkt_src_aws_service, pkt_dstaddr, pkt_dst_aws_service, region, az_id, sublocation_type, sublocation_id
| filter srcaddr in ["172.31.1.247","172.31.11.212"] and dstaddr in ["172.31.1.247","172.31.11.212"] and protocol = 6 and (dstport = 80 or srcport=80)
| stats sum(bytes) as Data_Transferred by bin(1m)

결과

bin(1m) Data_Transferred
2022-04-01 15:23:00.000 17225787
2022-04-01 15:21:00.000 17724499
2022-04-01 15:20:00.000 1125500
2022-04-01 15:19:00.000 101525
2022-04-01 15:18:00.000 81376