CloudTrail 로그 기록을 중지하거나 삭제하려는 시도를 감지하여 이메일로 통지 받아보기

CloudTrail 로그 기록을 중지하거나 삭제하려는 시도를 감지하여 이메일로 통지 받아보기

CloudTrail 로그 기록을 중지하거나 삭제하려는 시도를 감지하여 이메일로 통지를 받아봤습니다.
Clock Icon2025.06.12

안녕하세요 클래스메소드 김재욱(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를 통해 이메일을 받아볼 수 있습니다.

jw-cloudtrail-test-1

하지만, 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에서 이벤트 정보를 추출해서 사용자가 원하는 이벤트를 출력해 볼 수 있습니다.

jw-cloudtrail-test-2

문의 사항은 클래스메소드 코리아로!

클래스메소드 코리아에서는 다양한 세미나 및 이벤트를 진행하고 있습니다.
진행중인 이벤트에 대해 아래 페이지를 참고해주세요.

https://classmethod.kr/board/library

AWS에 대한 상담 및 클래스 메소드 멤버스에 관한 문의사항은 아래 메일로 연락주시면 감사드립니다!
Info@classmethod.kr

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.