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