VPC Flow Logs - 네트워크 트래픽 기록 및 분석
학습 목표
- VPC Flow Logs의 역할과 필요성을 이해한다
- ShopEasy-VPC에 Flow Logs를 활성화하고 CloudWatch Logs에 기록한다
- Flow Log 레코드를 읽고 ACCEPT/REJECT 트래픽을 구분한다
- CloudWatch Logs Insights를 활용하여 트래픽을 분석한다
왜 VPC Flow Logs가 필요한가?
Chapter 07에서 보안 그룹을, Chapter 14에서 Network ACL(NACL)을 설정했습니다. 보안 그룹과 NACL은 트래픽을 허용하거나 차단합니다. 하지만 "누가 언제 어디서 접근을 시도했는지"는 기록하지 않습니다.
ShopEasy 서버에 의심스러운 접근이 있었는지, 차단된 트래픽은 어떤 것이 있었는지 알려면 네트워크 트래픽을 기록하고 분석할 수 있어야 합니다. 이것이 바로 VPC Flow Logs의 역할입니다.
보안 그룹과 NACL은 건물의 출입 통제 시스템입니다. 허가된 사람은 들여보내고, 허가되지 않은 사람은 출입을 거부합니다.
하지만 출입 통제만으로는 충분하지 않습니다. "어제 밤에 누가 건물에 침입을 시도했나요?"라는 질문에 답할 수 없습니다.
VPC Flow Logs는 건물의 CCTV 녹화기와 같습니다. 누가 언제 어디서 출입을 시도했는지, 성공했는지 거부되었는지를 모두 기록합니다. 침입 사건이 발생하면 CCTV 녹화를 되감아 확인하듯, Flow Logs로 네트워크 트래픽을 분석할 수 있습니다.
- 보안 그룹 / NACL = 출입 통제 (허용/차단)
- VPC Flow Logs = CCTV 녹화기 (누가 언제 어디서 출입을 시도했는지 기록)
ShopEasy 서버는 인터넷에 공개되어 있습니다. 다양한 접근 시도가 발생할 수 있습니다:
- 정상 사용자가 포트 5000(API)으로 상품을 조회하는 트래픽
- 관리자가 SSH(포트 22)로 서버에 접속하는 트래픽
- 알 수 없는 IP에서 포트 3389(RDP), 포트 23(Telnet) 등으로 침입을 시도하는 트래픽
- EC2에서 RDS(포트 3306)로 향하는 데이터베이스 연결 트래픽
VPC Flow Logs를 활성화하면 이 모든 트래픽이 기록되어, "누가 ShopEasy 서버에 접근을 시도했는지, 거부된 트래픽은 무엇인지" 분석할 수 있습니다.
Flow Log 레코드 형식
VPC Flow Logs는 네트워크 트래픽 정보를 레코드 단위로 기록합니다. 각 레코드는 하나의 네트워크 연결 시도를 나타내며, 공백으로 구분된 필드로 구성됩니다.
2 123456789012 eni-0abc1234def56789 203.0.113.50 10.0.1.100 49152 5000 6 10 840 1625000000 1625000060 ACCEPT OK
| 필드 | 예시 값 | 설명 |
|---|---|---|
| version | 2 | Flow Log 버전 |
| account-id | 123456789012 | AWS 계정 ID |
| interface-id | eni-0abc1234... | ENI(네트워크 인터페이스) ID |
| srcaddr | 203.0.113.50 | 출발지 IP 주소 |
| dstaddr | 10.0.1.100 | 목적지 IP 주소 |
| srcport | 49152 | 출발지 포트 |
| dstport | 5000 | 목적지 포트 |
| protocol | 6 | 프로토콜 번호 (6=TCP, 17=UDP, 1=ICMP) |
| packets | 10 | 전송된 패킷 수 |
| bytes | 840 | 전송된 바이트 수 |
| start | 1625000000 | 시작 시간 (Unix timestamp) |
| end | 1625000060 | 종료 시간 (Unix timestamp) |
| action | ACCEPT | ACCEPT = 허용됨, REJECT = 거부됨 |
| log-status | OK | 로그 기록 상태 (OK, NODATA, SKIPDATA) |
Flow Log에서 가장 중요한 필드는 action입니다:
- ACCEPT: 보안 그룹 또는 NACL에 의해 허용된 트래픽
- REJECT: 보안 그룹 또는 NACL에 의해 거부된 트래픽
REJECT 트래픽을 분석하면 누군가 허용되지 않은 포트로 접근을 시도한 흔적을 찾을 수 있습니다.
Flow Logs는 세 가지 수준에서 활성화할 수 있습니다:
- VPC 수준: VPC 내 모든 서브넷, 모든 ENI의 트래픽을 기록 (가장 포괄적)
- 서브넷 수준: 특정 서브넷의 ENI 트래픽만 기록
- ENI 수준: 특정 네트워크 인터페이스의 트래픽만 기록 (가장 세밀)
이번 실습에서는 VPC 수준으로 설정하여 ShopEasy-VPC의 모든 트래픽을 기록합니다.
실습: VPC Flow Logs 설정 및 분석
VPC Flow Logs 자체는 무료이지만, 로그를 저장하는 CloudWatch Logs에 비용이 발생합니다. 실습 후 불필요한 로그 그룹을 삭제하면 비용을 절약할 수 있습니다. 실습 규모에서는 비용이 매우 적습니다 (월 수 센트 이하).
-
VPC Flow Logs 활성화
ShopEasy-VPC에 Flow Logs를 생성하여 모든 네트워크 트래픽(허용 + 거부)을 CloudWatch Logs에 기록합니다.
설정 값
항목 값 이름 ShopEasy-VPC-FlowLogs필터 전체 (ALL) - ACCEPT와 REJECT 모두 대상 CloudWatch Logs 로그 그룹 /shopeasy/vpc-flow-logs(새로 생성)IAM 역할 새 IAM 역할 자동 생성 최대 집계 간격 1분 Flow Logs 대상: CloudWatch Logs vs S3Flow Logs는 두 가지 대상에 저장할 수 있습니다:
- CloudWatch Logs: 실시간 검색, 필터링, 대시보드 구성이 가능합니다. Logs Insights로 강력한 쿼리를 실행할 수 있습니다. 이번 실습에서 사용합니다.
- S3 버킷: 장기 보관에 적합하고, Athena로 대규모 분석이 가능합니다. 비용이 더 저렴합니다.
필터 선택 팁필터를 "거부(REJECT)"만 선택하면 차단된 트래픽만 기록되어 비용을 절약할 수 있습니다. 하지만 실습에서는 학습을 위해 "전체(ALL)"를 선택하여 허용된 트래픽과 거부된 트래픽을 모두 확인합니다.
AWS 콘솔 → VPC → 왼쪽 메뉴 Your VPCs → ShopEasy-VPC 선택 → 하단의 Flow logs 탭 → Create flow log 클릭
설정 항목:
- Name: ShopEasy-VPC-FlowLogs
- Filter: All
- Maximum aggregation interval: 1 minute
- Destination: Send to CloudWatch Logs
- Destination log group: /shopeasy/vpc-flow-logs (입력하면 자동으로 새 로그 그룹이 생성됩니다)
- IAM Role: "Set Up Permissions" 링크를 클릭하여 새 IAM 역할을 생성하거나, 드롭다운에서 기존 역할을 선택합니다
-
트래픽 생성
Flow Logs에 기록될 트래픽을 생성합니다. EC2에 SSH로 접속한 후 여러 가지 트래픽을 발생시킵니다.
EC2에서 실행할 명령어
bash# EC2에 SSH 접속 ssh -i "ShopEasy-Key.pem" ec2-user@EC2_PUBLIC_IP # 정상 API 호출 (localhost에서) curl http://localhost:5000/api/health # 상품 목록 조회 curl http://localhost:5000/api/products외부에서 접속 (내 PC 브라우저에서)
texthttp://EC2_PUBLIC_IP:5000/api/health브라우저에서 EC2의 퍼블릭 IP와 포트 5000으로 접속합니다. 이 트래픽은 Flow Logs에 ACCEPT로 기록됩니다.
로그 기록 지연Flow Logs는 약 1~2분의 지연이 있습니다. 트래픽을 생성한 후 잠시 기다린 다음 로그를 확인합니다. 최대 집계 간격을 1분으로 설정했으므로, 최소 1~2분 후에 로그가 나타납니다.
-
CloudWatch Logs에서 Flow Logs 확인
CloudWatch Logs에 기록된 Flow Log 레코드를 직접 확인합니다. 각 ENI(네트워크 인터페이스)별로 로그 스트림이 생성됩니다.
확인 방법
- AWS 콘솔 → CloudWatch → 왼쪽 메뉴 Log groups (로그 그룹)
/shopeasy/vpc-flow-logs로그 그룹을 클릭합니다.- Log streams (로그 스트림) 목록을 확인합니다.
- 각 스트림은
eni-xxxxxxxx형식의 ENI ID로 이름이 지정됩니다. - EC2, RDS, NAT Gateway 등 각 네트워크 인터페이스별로 스트림이 생성됩니다.
- 각 스트림은
- 로그 스트림 하나를 클릭하여 Log events를 확인합니다.
레코드 읽는 방법
text# ACCEPT 예시: 외부 IP에서 포트 5000으로 접속 성공 2 123456789012 eni-0abc1234 203.0.113.50 10.0.1.100 49152 5000 6 10 840 1625000000 1625000060 ACCEPT OK # REJECT 예시: 알 수 없는 IP에서 포트 3389(RDP)로 접속 시도 거부 2 123456789012 eni-0abc1234 198.51.100.20 10.0.1.100 55432 3389 6 1 40 1625000000 1625000060 REJECT OK주요 확인 포인트
- ACCEPT + dstport 22: SSH 접속이 허용된 트래픽 (내 IP에서 접속)
- ACCEPT + dstport 5000: API 서비스에 접속한 트래픽
- ACCEPT + dstport 3306: EC2에서 RDS로 연결한 트래픽
- REJECT: 보안 그룹 또는 NACL에 의해 차단된 트래픽
로그 스트림이 보이지 않는 경우Flow Logs를 활성화한 직후에는 로그 스트림이 아직 생성되지 않았을 수 있습니다. 2~3분 정도 기다린 후 페이지를 새로고침하세요. 그래도 보이지 않으면 Flow Logs 설정의 IAM 역할 권한이 올바른지 확인합니다.
CloudWatch 콘솔 → 왼쪽 메뉴 Logs → Log groups →
/shopeasy/vpc-flow-logs클릭 → 로그 스트림 하나를 클릭하여 이벤트를 확인합니다.레코드에서 dstport(7번째 필드)와 action(13번째 필드)을 중심으로 읽으면 이해하기 쉽습니다.
-
CloudWatch Logs Insights로 로그 분석
CloudWatch Logs Insights를 사용하면 SQL과 유사한 쿼리 언어로 Flow Logs를 분석할 수 있습니다. 거부된 트래픽, 포트별 통계 등을 빠르게 조회할 수 있습니다.
Logs Insights 접근
- AWS 콘솔 → CloudWatch → 왼쪽 메뉴 Logs Insights (로그 인사이트)
- 로그 그룹 선택:
/shopeasy/vpc-flow-logs - 시간 범위: 최근 1시간 (또는 적절한 범위)
쿼리 1: 거부된 트래픽 조회
textfilter action = "REJECT" | stats count(*) as requestCount by srcAddr, dstPort | sort requestCount desc | limit 10이 쿼리는 거부된 트래픽을 출발지 IP와 목적지 포트별로 집계합니다. 어떤 IP에서 어떤 포트로 접근을 시도했는지 한눈에 파악할 수 있습니다.
쿼리 2: 포트별 트래픽 통계
textstats count(*) as requestCount by dstPort | sort requestCount desc | limit 20어떤 포트로 가장 많은 트래픽이 발생했는지 확인합니다. 예상되는 포트(22, 5000, 3306)와 예상치 못한 포트를 비교합니다.
쿼리 3: 특정 IP에서 온 트래픽
textfilter srcAddr = "x.x.x.x" | sort @timestamp desc | limit 20x.x.x.x를 확인하고 싶은 IP 주소로 변경합니다. 특정 IP에서 발생한 모든 트래픽을 시간순으로 확인할 수 있습니다.실무 활용: REJECT 트래픽 분석실무에서는 REJECT 트래픽을 주기적으로 분석하여 다음과 같은 위협을 탐지합니다:
- 포트 스캔: 하나의 IP에서 여러 포트로 접근을 시도하면 포트 스캔일 가능성이 높습니다
- 무차별 대입 공격(Brute Force): 특정 포트(SSH 22, RDP 3389)로 반복 접근 시도
- 비정상 트래픽 패턴: 새벽 시간대의 대량 접근 시도 등
GuardDuty(Chapter 13)도 Flow Logs를 데이터 소스로 활용하여 자동으로 위협을 탐지합니다.
CloudWatch → 왼쪽 메뉴 Logs Insights → 상단의 로그 그룹 선택 드롭다운에서
/shopeasy/vpc-flow-logs를 선택합니다.쿼리 입력란에 위 쿼리를 붙여넣고 Run query 버튼을 클릭합니다. 결과가 하단에 표로 표시됩니다.
시간 범위가 너무 짧으면 결과가 없을 수 있으니, 최근 1시간 이상으로 설정합니다.
확인 사항
- ShopEasy-VPC에 Flow Logs가 활성화되었다
- CloudWatch Logs에 /shopeasy/vpc-flow-logs 로그 그룹이 생성되었다
- 로그 스트림에서 ACCEPT/REJECT 레코드를 확인했다
- CloudWatch Logs Insights로 트래픽 분석 쿼리를 실행했다
- VPC Flow Logs의 역할과 필요성을 이해 (CCTV 녹화기 비유)
- ShopEasy-VPC에 Flow Logs를 활성화하고 CloudWatch Logs에 기록
- Flow Log 레코드의 각 필드(srcaddr, dstaddr, dstport, action 등)를 해석
- CloudWatch Logs Insights로 거부된 트래픽, 포트별 통계 등을 분석
- 네트워크 가시성(Visibility) 확보 - 보안의 핵심 원칙!
지금까지 네트워크 보안의 세 가지 계층을 모두 다루었습니다:
- 보안 그룹 (Chapter 07): 인스턴스 수준의 방화벽 - 허용 규칙만
- NACL (Chapter 14): 서브넷 수준의 방화벽 - 허용/거부 규칙
- VPC Flow Logs (Chapter 15): 네트워크 트래픽 기록 및 분석
다음 챕터에서는 EC2 인스턴스 메타데이터 서비스(IMDS)의 보안을 강화합니다.