AWS Lambda를 활용하여 S3 퍼블릭 접근을 자동으로 차단하는 구성을 만들어봤습니다.
안녕하세요 클래스메소드 김재욱(Kim Jaewook) 입니다. 이번에는 AWS Lambda를 활용하여 S3 퍼블릭 접근을 자동으로 차단하는 구성을 만들어봤습니다.
IAM 정책 & 역할 준비
먼저 Lambda 함수에서 S3 버킷에 접근하여 퍼블릭 접근을 차단하기 위해 [s3:PutBucketPublicAccessBlock] 권한을 할당할 필요가 있습니다.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:PutBucketPublicAccessBlock"
],
"Resource": "arn:aws:s3:::*"
}
]
}
Lambda 함수 생성
IAM 정책과 역할을 생성했다면, Lambda 함수를 생성합시다. Lambda 함수의 런타임은 [Python 3.13]입니다. 그리고 역할은 조금 전 생성한 IAM 역할을 선택합시다. 자세한 Python 코드는 다음과 같습니다.
import json
import boto3
s3 = boto3.client('s3')
def lambda_handler(event, context):
print("Received event:", json.dumps(event))
# 버킷 이름 추출
try:
bucket_name = event['detail']['requestParameters']['bucketName']
except KeyError:
print("버킷 이름이 이벤트에 없음")
return
try:
# S3 퍼블릭 접근 차단 설정
s3.put_public_access_block(
Bucket=bucket_name,
PublicAccessBlockConfiguration={
'BlockPublicAcls': True,
'IgnorePublicAcls': True,
'BlockPublicPolicy': True,
'RestrictPublicBuckets': True
}
)
print(f"✅ 퍼블릭 접근 차단 완료: {bucket_name}")
except Exception as e:
print(f"❌ 퍼블릭 접근 차단 실패: {str(e)}")
한 가지 주의할 점은 CloudTrail의 이벤트가 발생한 것을 바탕으로 EventBirdge가 인지하여 Lambda 함수를 실행시키는 것이므로 Lambda 함수를 수동으로 실행시키면 퍼블릭 접근을 차단하지 않습니다.
※ 해당 구성을 만든 이후의 S3 버킷에 대해서만 이벤트를 감지하여 퍼블릭 접근을 차단합니다.
EventBridge 규칙 생성
이제 Lambda 함수 생성이 끝났다면, EventBridge로 넘어가 규칙을 생성합시다. 해당 규칙에는 CloudTrail에서 발생하는 이벤트가 포함되며 [PutBucketAcl], [PutBucketPolicy], [CreateBucket] 이벤트를 감지합니다.
{
"source": ["aws.s3"],
"detail-type": ["AWS API Call via CloudTrail"],
"detail": {
"eventName": ["PutBucketAcl", "PutBucketPolicy", "CreateBucket"]
}
}
결과 테스트
테스트는 S3 버킷을 생성할 때 [모든 퍼블릭 액세스 차단]을 비활성화한 상태로 S3 버킷을 생성합니다.
S3 버킷을 생성하면, 곧 이벤트가 발생하여 [모든 퍼블릭 액세스 차단]이 활성화로 변경됩니다.
CloudTrail에서 확인해 보면, S3 버킷 생성 이벤트가 발생한 다음, Lambda를 통해 퍼블릭 액세스 차단을 활성화하고 있는 것을 확인할 수 있습니다.
본 블로그 게시글을 읽고 궁금한 사항이 있으신 분들은 jaewookkim533@yahoo.com로 보내주시면 감사하겠습니다.