CloudWatch 메트릭 필터 - 보안 이벤트 실시간 알림
학습 목표
- CloudTrail 로그를 CloudWatch Logs로 전송하는 방법을 이해한다
- CloudWatch 메트릭 필터를 사용하여 보안 이벤트를 감지하는 방법을 익힌다
- 메트릭 필터에 CloudWatch 경보를 연결하여 실시간 알림을 구성한다
- 보안 그룹 변경 시 이메일 알림을 받는 전체 파이프라인을 구축한다
왜 메트릭 필터가 필요한가?
Chapter 12에서 CloudTrail을 설정하여 AWS 계정의 모든 API 호출을 기록하고 있습니다. 하지만 CloudTrail만으로는 사건이 발생한 후에야 로그를 확인할 수 있습니다. 만약 누군가 보안 그룹을 변경하거나, 루트 계정으로 로그인한다면? 즉시 알림을 받아 빠르게 대응해야 합니다.
CloudTrail은 건물의 CCTV 녹화 시스템과 같습니다. 모든 출입 기록을 녹화하지만, CCTV만 있으면 사건이 발생한 후에야 녹화 영상을 되돌려보며 확인합니다. 이미 도둑이 물건을 훔쳐간 뒤입니다.
메트릭 필터는 CCTV에 자동 감지 시스템을 추가하는 것입니다. "수상한 사람이 감지되면 즉시 경보!"처럼, 특정 보안 이벤트가 발생하면 실시간으로 알림을 보내줍니다.
CCTV(CloudTrail) + 자동 감지(메트릭 필터) + 경보(CloudWatch 경보) = 실시간 보안 모니터링
ShopEasy 시나리오: ShopEasy 운영팀은 다음과 같은 보안 이벤트가 발생했을 때 즉시 이메일 알림을 받고 싶습니다.
| 보안 이벤트 | 왜 감시해야 하는가? | 감시 대상 API |
|---|---|---|
| 보안 그룹 변경 | 누군가 방화벽 규칙을 열면 서버가 공격에 노출됨 | AuthorizeSecurityGroupIngress, RevokeSecurityGroupIngress 등 |
| 루트 계정 로그인 | 루트 계정은 최고 권한 - 일상적으로 사용하면 안 됨 | ConsoleLogin (userIdentity.type = Root) |
| IAM 정책 변경 | 권한 변경은 보안에 직접적인 영향을 미침 | PutUserPolicy, AttachUserPolicy 등 |
| 인증 실패 | 반복적인 인증 실패는 무단 접근 시도의 징후 | errorCode = UnauthorizedAccess, AccessDenied |
이번 챕터에서는 이 중 보안 그룹 변경 감지를 직접 구현합니다. 나머지 이벤트도 같은 방식으로 추가할 수 있습니다.
실시간 보안 알림의 전체 흐름은 다음과 같습니다:
- API 호출 발생: 누군가 보안 그룹 규칙을 변경합니다.
- CloudTrail 기록: 이 API 호출이 CloudTrail에 기록됩니다.
- CloudWatch Logs 전송: CloudTrail 로그가 CloudWatch Logs로 전송됩니다.
- 메트릭 필터 감지: 메트릭 필터가 로그에서 보안 그룹 변경 이벤트를 감지하고, 커스텀 메트릭을 1 증가시킵니다.
- CloudWatch 경보 발생: 메트릭 값이 임계값(1 이상)을 초과하면 경보가 발생합니다.
- SNS 알림 전송: 경보가 SNS 주제로 전달되고, 구독된 이메일로 알림이 발송됩니다.
아키텍처 개요
IAM 변경 등
모든 API 기록
/aws/cloudtrail/ShopEasy-Trail
보안 그룹 변경 감지
Sum >= 1 (5분)
운영팀 이메일 알림
CloudWatch 메트릭 필터는 JSON 로그에서 특정 필드 값을 매칭하는 필터 패턴을 사용합니다. CloudTrail 로그는 JSON 형식이므로, $.로 시작하는 JSON 경로 표현식을 사용합니다.
# 기본 문법
{ $.필드명 = "값" }
# 여러 조건을 OR로 연결
{ ($.필드1 = "값1") || ($.필드2 = "값2") }
# 여러 조건을 AND로 연결
{ ($.필드1 = "값1") && ($.필드2 = "값2") }
# 예: 보안 그룹 변경 이벤트 감지
{ ($.eventName = AuthorizeSecurityGroupIngress) || ($.eventName = RevokeSecurityGroupIngress) }
# 예: 루트 계정 로그인 감지
{ ($.userIdentity.type = "Root") && ($.eventType = "AwsConsoleSignIn") }
CloudTrail 로그의 주요 필드:
$.eventName- API 호출 이름 (예: AuthorizeSecurityGroupIngress)$.userIdentity.type- 호출자 유형 (Root, IAMUser, AssumedRole 등)$.errorCode- 오류 코드 (UnauthorizedAccess, AccessDenied 등)$.sourceIPAddress- 호출자 IP 주소
실습: CloudWatch 메트릭 필터로 보안 알림 구성
이 실습을 시작하기 전에 Chapter 12: CloudTrail에서 ShopEasy-Trail이 생성되어 있어야 합니다. CloudTrail이 S3로만 로그를 전송하고 있다면, Step 1에서 CloudWatch Logs 전송을 추가로 설정합니다.
CloudWatch Logs 수집, 메트릭 필터, 경보는 프리 티어 범위 내에서 무료로 사용할 수 있습니다. 프리 티어 초과 시 소량의 비용이 발생할 수 있습니다.
-
Step 1: CloudTrail → CloudWatch Logs 전송 설정
현재 CloudTrail(ShopEasy-Trail)은 S3 버킷에 로그를 저장하고 있습니다. 메트릭 필터를 사용하려면 CloudWatch Logs로도 로그를 전송해야 합니다. CloudWatch Logs에 로그가 전송되어야 메트릭 필터가 실시간으로 로그를 분석할 수 있습니다.
설정할 내용
항목 값 CloudWatch Logs 활성화 로그 그룹 /aws/cloudtrail/ShopEasy-Trail(새로 생성)IAM 역할 새 역할 생성 (CloudTrail이 CloudWatch Logs에 쓰기 권한) 왜 CloudWatch Logs로 전송하나요?CloudTrail은 기본적으로 S3에 로그를 저장합니다. S3에 저장된 로그는 나중에 분석할 수 있지만, 실시간 분석이 어렵습니다.
CloudWatch Logs로 전송하면 다음이 가능합니다:
- 메트릭 필터: 특정 이벤트를 실시간으로 감지하여 커스텀 메트릭 생성
- CloudWatch Logs Insights: SQL 스타일 쿼리로 로그를 분석
- 실시간 경보: 메트릭 필터 + CloudWatch 경보 = 즉시 알림
- AWS 콘솔 → CloudTrail 서비스로 이동합니다.
- 왼쪽 메뉴에서 Trails를 클릭합니다.
- ShopEasy-Trail을 클릭하여 상세 페이지로 이동합니다.
- Edit 버튼을 클릭합니다 (General details 섹션).
- CloudWatch Logs 섹션에서:
- Enabled 체크박스를 선택합니다.
- Log group에
/aws/cloudtrail/ShopEasy-Trail을 입력합니다. (New를 선택) - IAM role에서 New를 선택하여 새 역할을 생성합니다.
- Save changes를 클릭합니다.
설정 후 CloudWatch → Log groups에서
/aws/cloudtrail/ShopEasy-Trail로그 그룹이 생성되었는지 확인합니다. -
Step 2: 보안 그룹 변경 감지 메트릭 필터 생성
CloudTrail 로그에서 보안 그룹 변경 API 호출을 감지하는 메트릭 필터를 생성합니다. 보안 그룹의 인바운드/아웃바운드 규칙이 추가되거나 삭제될 때마다 커스텀 메트릭이 1씩 증가합니다.
메트릭 필터 설정
항목 값 대상 로그 그룹 /aws/cloudtrail/ShopEasy-Trail필터 이름 ShopEasy-SG-Changes필터 패턴 { ($.eventName = AuthorizeSecurityGroupIngress) || ($.eventName = RevokeSecurityGroupIngress) || ($.eventName = AuthorizeSecurityGroupEgress) || ($.eventName = RevokeSecurityGroupEgress) }메트릭 네임스페이스 ShopEasy/Security메트릭 이름 SecurityGroupChanges메트릭 값 1필터 패턴 상세 설명위 필터 패턴은 4가지 보안 그룹 관련 API 호출을 감지합니다:
- AuthorizeSecurityGroupIngress: 인바운드 규칙 추가 (예: SSH 포트 열기)
- RevokeSecurityGroupIngress: 인바운드 규칙 삭제
- AuthorizeSecurityGroupEgress: 아웃바운드 규칙 추가
- RevokeSecurityGroupEgress: 아웃바운드 규칙 삭제
메트릭 필터는 로그에서 위 패턴이 나타날 때마다 커스텀 메트릭(SecurityGroupChanges)을 1씩 증가시킵니다. 이 메트릭에 경보를 설정하면 보안 그룹이 변경될 때마다 알림을 받을 수 있습니다.
- AWS 콘솔 → CloudWatch 서비스로 이동합니다.
- 왼쪽 메뉴에서 Logs → Log groups를 클릭합니다.
/aws/cloudtrail/ShopEasy-Trail로그 그룹을 클릭합니다.- Metric filters 탭을 클릭합니다.
- Create metric filter 버튼을 클릭합니다.
- Filter pattern에 다음을 입력합니다:
text{ ($.eventName = AuthorizeSecurityGroupIngress) || ($.eventName = RevokeSecurityGroupIngress) || ($.eventName = AuthorizeSecurityGroupEgress) || ($.eventName = RevokeSecurityGroupEgress) }- Next를 클릭합니다.
- Filter name:
ShopEasy-SG-Changes - Metric namespace:
ShopEasy/Security - Metric name:
SecurityGroupChanges - Metric value:
1 - Next → Create metric filter를 클릭합니다.
-
Step 3: CloudWatch 경보 연결
Step 2에서 생성한 메트릭 필터의 커스텀 메트릭에 CloudWatch 경보를 연결합니다. 보안 그룹 변경이 1회라도 발생하면 경보가 트리거되어 SNS를 통해 이메일 알림을 보냅니다.
경보 설정
항목 값 메트릭 네임스페이스 ShopEasy/Security메트릭 이름 SecurityGroupChanges통계(Statistic) Sum (합계) 기간(Period) 5분 조건(Condition) Greater/Equal >= 1 (1회 이상 발생 시) 알림 대상 ShopEasy-Alerts SNS 주제 경보 이름 ShopEasy-SG-Change-AlarmSNS 주제가 없는 경우ShopEasy-Alerts SNS 주제가 아직 생성되지 않은 경우(Ch23 Part 1에서 생성 예정), 이 단계에서 새로 생성합니다.
- 경보 생성 과정에서 "Create new topic"을 선택합니다.
- Topic 이름:
ShopEasy-Alerts - Email endpoint: 본인 이메일 주소를 입력합니다.
- SNS 주제 생성 후 이메일로 구독 확인(Subscription Confirmation) 메일이 옵니다.
- 반드시 "Confirm subscription" 링크를 클릭해야 이메일 알림을 받을 수 있습니다!
- AWS 콘솔 → CloudWatch → 왼쪽 메뉴에서 Alarms → All alarms를 클릭합니다.
- Create alarm 버튼을 클릭합니다.
- Select metric를 클릭합니다.
- Custom namespaces에서 ShopEasy/Security → Metrics with no dimensions를 선택합니다.
- SecurityGroupChanges 메트릭을 선택하고 Select metric을 클릭합니다.
- Metric 설정:
- Statistic: Sum
- Period: 5 minutes
- Conditions:
- Threshold type: Static
- Whenever SecurityGroupChanges is: Greater/Equal
- than: 1
- Next를 클릭합니다.
- Notification:
- Alarm state trigger: In alarm
- SNS topic: ShopEasy-Alerts 선택 (없으면 "Create new topic"으로 생성)
- Next를 클릭합니다.
- Alarm name:
ShopEasy-SG-Change-Alarm - Next → Create alarm을 클릭합니다.
SNS 구독 확인 이메일이 왔다면 반드시 "Confirm subscription" 링크를 클릭하세요!
-
Step 4: 테스트 - 보안 그룹 변경으로 알림 확인
실제로 보안 그룹을 변경하여 알림이 정상적으로 오는지 테스트합니다. EC2 보안 그룹(ShopEasy-EC2-SG)에 임시 규칙을 추가하고, 이메일 알림을 확인한 후 임시 규칙을 삭제합니다.
테스트 순서
- EC2 보안 그룹(ShopEasy-EC2-SG)에 임시 인바운드 규칙 추가:
- 타입: 사용자 지정 TCP (Custom TCP)
- 포트:
8080 - 소스: 내 IP (My IP)
- 약 5~10분 대기 (CloudTrail 로그 전송 + 메트릭 필터 처리 시간)
- 이메일 알림 확인: SNS에서 보낸 경보 알림 이메일을 확인합니다.
- CloudWatch → Alarms에서 ShopEasy-SG-Change-Alarm 상태가 "In alarm"인지 확인합니다.
- 테스트 후 임시 규칙 삭제: 포트 8080 규칙을 삭제합니다.
알림이 오지 않는 경우알림이 5~10분 후에도 오지 않는 경우 다음을 확인하세요:
- SNS 구독 확인 이메일에서 "Confirm subscription"을 클릭했는지 확인
- CloudWatch Logs에서 로그 그룹에 로그 스트림이 생성되고 있는지 확인
- 메트릭 필터의 필터 패턴에 오타가 없는지 확인
- 경보의 메트릭 네임스페이스와 이름이 메트릭 필터 설정과 일치하는지 확인
- 스팸 메일함을 확인해보세요 (AWS SNS 알림이 스팸으로 분류될 수 있습니다)
임시 규칙 추가
- EC2 → Security Groups → ShopEasy-EC2-SG 선택
- Inbound rules → Edit inbound rules
- Add rule 클릭:
- Type: Custom TCP
- Port range: 8080
- Source: My IP
- Save rules
경보 확인 (5~10분 후)
- CloudWatch → Alarms → ShopEasy-SG-Change-Alarm 클릭
- State가 "In alarm"으로 변경되었는지 확인
- 이메일 수신함에서 AWS Notification 메일 확인
임시 규칙 삭제 (테스트 후)
- EC2 → Security Groups → ShopEasy-EC2-SG 선택
- Inbound rules → Edit inbound rules
- 포트 8080 규칙의 Delete 버튼 클릭
- Save rules
- EC2 보안 그룹(ShopEasy-EC2-SG)에 임시 인바운드 규칙 추가:
실무에서는 보안 그룹 변경 외에도 여러 메트릭 필터를 설정합니다. AWS CIS (Center for Internet Security) Benchmark에서 권장하는 메트릭 필터 목록입니다:
| 감시 항목 | 필터 패턴 (핵심 이벤트) |
|---|---|
| 루트 계정 사용 | { $.userIdentity.type = "Root" && $.userIdentity.invokedBy NOT EXISTS && $.eventType != "AwsServiceEvent" } |
| 콘솔 로그인 실패 | { ($.eventName = ConsoleLogin) && ($.errorMessage = "Failed authentication") } |
| IAM 정책 변경 | { ($.eventName = PutUserPolicy) || ($.eventName = AttachUserPolicy) || ... } |
| VPC 변경 | { ($.eventName = CreateVpc) || ($.eventName = DeleteVpc) || ... } |
| S3 버킷 정책 변경 | { ($.eventName = PutBucketPolicy) || ($.eventName = DeleteBucketPolicy) } |
이번 실습에서는 보안 그룹 변경 하나만 구현했지만, 같은 방식으로 위 항목들을 추가하면 종합적인 보안 모니터링이 가능합니다.
확인 사항
- CloudTrail(ShopEasy-Trail)이 CloudWatch Logs(
/aws/cloudtrail/ShopEasy-Trail)로 로그를 전송하고 있다 - 보안 그룹 변경 감지 메트릭 필터(
ShopEasy-SG-Changes)가 생성되었다 - CloudWatch 경보(
ShopEasy-SG-Change-Alarm)가 생성되었다 - 보안 그룹을 변경했을 때 이메일 알림을 받았다 (또는 경보 상태가 "In alarm"으로 변경되었다)
- 테스트용 임시 규칙(포트 8080)을 삭제했다
- CloudTrail 로그를 CloudWatch Logs로 전송하여 실시간 분석 환경을 구축
- 메트릭 필터로 보안 그룹 변경 이벤트를 자동 감지
- CloudWatch 경보 + SNS로 이메일 알림 파이프라인 구성
- 실제 보안 그룹 변경을 통해 알림 동작을 검증
- CloudTrail(녹화) → 메트릭 필터(감지) → 경보(알림)의 실시간 보안 모니터링 체계 완성!
이번 챕터에서 보안 이벤트를 실시간으로 감지하고 알림을 받는 체계를 구축했습니다. 다음 챕터에서는 AWS Config를 사용하여 AWS 리소스의 구성(설정)이 보안 모범 사례를 준수하는지 지속적으로 평가하는 방법을 학습합니다.