Skip to content

Commit 7390742

Browse files
committed
chore: S3 관련 권한 조정
- S3관련 FullAccess 삭제 - BE 내부적으로 저장(Put), 삭제(Delete), 필요 시 불러오기(Get) 허용 - S3에서 EC2 관련 권한 명시
1 parent 6aba6e7 commit 7390742

File tree

2 files changed

+69
-11
lines changed

2 files changed

+69
-11
lines changed

infra/aws/terraform/ec2.tf

Lines changed: 38 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,45 @@ resource "aws_iam_role" "ec2_role_1" {
3232
####################
3333
# EC2 - Policy 설정
3434
####################
35-
# EC2 역할에 AmazonS3FullAccess 정책을 부착
36-
# 생성된 인스턴스는 S3에 대한 완전한 액세스 권한을 가짐.
37-
resource "aws_iam_role_policy_attachment" "s3_full_access" {
35+
resource "aws_iam_policy" "ec2_s3_access_policy" {
36+
name = "${var.prefix}-ec2-s3-access-policy"
37+
description = "EC2 instance S3 access policy"
38+
39+
policy = jsonencode({
40+
Version = "2012-10-17",
41+
Statement = [
42+
{
43+
Sid = "ListSpecificBucket",
44+
Effect = "Allow",
45+
Action = [
46+
"s3:ListBucket",
47+
"s3:GetBucketLocation"
48+
],
49+
Resource = aws_s3_bucket.s3_1.arn
50+
},
51+
{
52+
Sid = "AccessableBucketObjectsPermissions",
53+
Effect = "Allow",
54+
Action = [
55+
"s3:GetObject",
56+
"s3:DeleteObject",
57+
"s3:PutObject"
58+
],
59+
Resource = "${aws_s3_bucket.s3_1.arn}/*"
60+
}
61+
]
62+
})
63+
64+
tags = merge(local.common_tags, {
65+
Name = "${var.prefix}-ec2-s3-access-policy"
66+
})
67+
}
68+
69+
# EC2 역할에 커스텀 정책을 부착
70+
# 생성된 인스턴스는 특정 S3에 대한 읽기/쓰기/삭제 권한을 가짐.
71+
resource "aws_iam_role_policy_attachment" "s3_access" {
3872
role = aws_iam_role.ec2_role_1.name
39-
policy_arn = "arn:aws:iam::aws:policy/AmazonS3FullAccess"
73+
policy_arn = aws_iam_policy.ec2_s3_access_policy.arn
4074
}
4175

4276
# EC2 역할에 AmazonEC2RoleforSSM 정책을 부착
@@ -113,7 +147,6 @@ resource "aws_instance" "ec2_1" {
113147
volume_type = "gp2"
114148
volume_size = 30 # 볼륨 크기를 30GB로 설정
115149
encrypted = true
116-
delete_on_termination = false
117150
}
118151

119152
user_data = local.ec2_user_data

infra/aws/terraform/s3.tf

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,27 +38,52 @@ resource "aws_s3_bucket_ownership_controls" "s3_1_ownership" {
3838
# CloudFront OAI가 S3 버킷에 접근할 수 있도록 허용
3939
# EC2 인스턴스가 파일 업로드/관리 가능
4040
# AWS 계정 소유자 및 Admin 사용자 접근 허용
41-
# Presigned URL을 통한 접근 차단
41+
# 일반 사용자의 직접적인 접근 차단
4242
resource "aws_s3_bucket_policy" "s3_1_policy" {
4343
bucket = aws_s3_bucket.s3_1.id
4444
policy = jsonencode({
45-
Version = "2012-10-17",
45+
Version = "2012-10-17",
4646
Statement = [
4747
# 1. CloudFront OAI: S3 객체 읽기 (CDN 콘텐츠 제공)
4848
{
49-
Sid = "AllowCloudFrontOAIReadOnly",
50-
Effect = "Allow",
49+
Sid = "AllowCloudFrontOAIReadOnly",
50+
Effect = "Allow",
5151
Principal = {
5252
AWS = aws_cloudfront_origin_access_identity.oai_1.iam_arn
5353
},
54-
Action = [
54+
Action = [
5555
"s3:GetObject",
5656
"s3:ListBucket"
5757
],
58-
Resource = [
58+
Resource = [
5959
aws_s3_bucket.s3_1.arn,
6060
"${aws_s3_bucket.s3_1.arn}/*"
6161
]
62+
},
63+
{
64+
Sid = "AllowEC2Access",
65+
Effect = "Allow",
66+
Principal = {
67+
AWS = aws_iam_role.ec2_role_1.arn
68+
},
69+
Action = [
70+
"s3:ListBucket",
71+
"s3:GetBucketLocation"
72+
],
73+
Resource = aws_s3_bucket.s3_1.arn
74+
},
75+
{
76+
Sid = "AllowEC2ObjectAccess",
77+
Effect = "Allow",
78+
Principal = {
79+
AWS = aws_iam_role.ec2_role_1.arn
80+
},
81+
Action = [
82+
"s3:GetObject",
83+
"s3:DeleteObject",
84+
"s3:PutObject"
85+
],
86+
Resource = "${aws_s3_bucket.s3_1.arn}/*"
6287
}
6388
]
6489
})

0 commit comments

Comments
 (0)