CloudTrail 로그 기록을 중지하거나 삭제하려는 시도를 감지하여 이메일로 통지 받아보기
안녕하세요 클래스메소드 김재욱(Kim Jaewook) 입니다. 이번에는 CloudTrail 로그 기록을 중지하거나 삭제하려는 시도를 감지하여 이메일로 통지를 받아봤습니다.
IAM 정책 & 역할 생성
이벤트가 감지되어 Lambda가 실행되었을 때 SNS로 이메일을 전송할 생각이므로 권한을 할당합시다.
[arn:aws:sns:ap-northeast-2:123456789012:NotifyAdmin]에는 SNS 토픽의 Arn을 입력합시다.
※ 사전에 Amazon SNS의 설정은 필수입니다.
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowLogging", "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": "*" }, { "Sid": "AllowSNSTopicPublish", "Effect": "Allow", "Action": "sns:Publish", "Resource": "arn:aws:sns:ap-northeast-2:123456789012:NotifyAdmin" } ] } Lambda 함수 생성
정책과 역할을 생성했다면, Lambda 함수를 생성하고 코드를 작성합시다.
[arn:aws:sns:ap-northeast-2:123456789012:NotifyAdmin] 항목에는 SNS 토픽의 Arn을 입력합니다.
간단하게, 지정된 이메일로 CloudTrail에 대한 알람을 전송합니다.
import json import boto3 def lambda_handler(event, context): sns = boto3.client('sns') message = json.dumps(event, indent=2) sns.publish( TopicArn='arn:aws:sns:ap-northeast-2:123456789012:NotifyAdmin', Subject='⚠️ CloudTrail 변경 시도 감지', Message=message ) return {'status': 'alert sent'} EventBridge 규칙 생성
EventBridge에서는 CloudTrail 로깅을 중지하거나 삭제하려는 시도가 발생했을 때 이벤트가 트리거 되기 때문에 [StopLogging], [DeleteTrail]에 대한 이벤트 규칙을 생성합시다.
{ "source": ["aws.cloudtrail"], "detail-type": ["AWS API Call via CloudTrail"], "detail": { "eventSource": ["cloudtrail.amazonaws.com"], "eventName": ["StopLogging", "DeleteTrail"] } } 테스트용 버킷 권한 지정
먼저 테스트를 위해 S3 버킷의 로그를 생성하고 삭제하는 과정을 진행할 생각입니다. 하지만, 이 테스트를 하기 위해서는 해당 버킷에 권한을 지정해야 합니다.
CloudTrail에서 로그를 생성하고자 하는 버킷에 다음과 같은 권한을 설정합니다. [버킷 이름]에는 해당 버킷의 이름을 입력하고 [AWS 계정 이름]에는 AWS 계정 ID를 입력합니다.
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AWSCloudTrailAclCheck", "Effect": "Allow", "Principal": { "Service": "cloudtrail.amazonaws.com" }, "Action": "s3:GetBucketAcl", "Resource": "arn:aws:s3:::버킷 이름" }, { "Sid": "AWSCloudTrailWrite", "Effect": "Allow", "Principal": { "Service": "cloudtrail.amazonaws.com" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::버킷 이름/AWSLogs/AWS 계정 이름/*", "Condition": { "StringEquals": { "s3:x-amz-acl": "bucket-owner-full-control" } } } ] } 결과 확인
테스트를 위해 CloudShell에서 다음 명령어를 입력합니다.
[your-test-bucket]에는 조금 전 권한을 설정한 S3 버킷의 이름을 입력합니다.
aws cloudtrail create-trail --name TestTrail --s3-bucket-name your-test-bucket aws cloudtrail start-logging --name TestTrail aws cloudtrail stop-logging --name TestTrail aws cloudtrail delete-trail --name TestTrail 명령어를 입력했다면, CloudTrail의 로그가 생성되고 로깅 시작 → 중지 → 삭제될 것입니다. 이에 따라 이벤트가 발생할 것이고, Lambda를 통해 이메일을 받아볼 수 있습니다.

하지만, json 형식으로 이메일이 도착하기 때문에 조금 알아보기 어렵습니다.
Lambda 함수를 조금 다듬어 봅시다.
import json import boto3 sns = boto3.client('sns') def lambda_handler(event, context): # CloudTrail 이벤트에서 필요한 정보 추출 detail = event['detail'] event_name = detail.get('eventName', 'Unknown') user = detail.get('userIdentity', {}).get('arn', 'Unknown') time = event.get('time', 'Unknown') region = event.get('region', 'Unknown') # 사용자에게 보내줄 메시지 생성 message = f""" 🚨 [CloudTrail 알림] 이벤트: {event_name} 사용자: {user} 시간: {time} 리전: {region} """ # SNS에 깔끔한 메시지 전송 sns.publish( TopicArn='arn:aws:sns:ap-northeast-2:123456789012:MyTopic', Message=message.strip(), Subject='[경고] CloudTrail 이벤트 감지됨' ) return { 'status': 'success' } 결과를 확인하면 다음과 같습니다.
많이 간략화 시켰지만, CloudTrail에서 이벤트 정보를 추출해서 사용자가 원하는 이벤트를 출력해 볼 수 있습니다.

문의 사항은 클래스메소드 코리아로!
클래스메소드 코리아에서는 다양한 세미나 및 이벤트를 진행하고 있습니다.
진행중인 이벤트에 대해 아래 페이지를 참고해주세요.
AWS에 대한 상담 및 클래스 메소드 멤버스에 관한 문의사항은 아래 메일로 연락주시면 감사드립니다!
Info@classmethod.kr






