반응형
S3를 다루는 사용자·역할(예: 개발자, CI/CD 러너)에게 모든 S3 버킷을 목록에서 보이게 하고, 각 버킷의 객체 업/다운로드 및 삭제까지 가능하도록 권한을 부여하는 방법을 정리했습니다.
실무에서 바로 쓸 수 있는 정책(JSON), 콘솔/CLI/Terraform 적용 예시, 보안 팁(최소권한 설계)까지 포함합니다.
1) 권한 설계 요점
- 버킷 목록 보기: s3:ListAllMyBuckets (계정 단위 동작 → Resource는 반드시 "*").
- 버킷 내부 탐색: s3:ListBucket (버킷 리소스 ARN 필요, 콘솔/CLI에서 객체 키 목록 조회).
- 객체 작업: s3:GetObject, s3:PutObject, s3:DeleteObject (객체 ARN 필요 → /* 포함).
- 콘솔 편의: s3:GetBucketLocation (버킷 지역 조회 없으면 콘솔에서 일부 동작 제한).
2) 정책 예시 – 모든 버킷/객체 대상(빠르게 시작)
운영 환경에서는 아래 와일드카드 대신 특정 버킷/경로로 제한하는 것을 권장합니다(아래 §3 참고).
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ListAllBuckets",
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": "*"
},
{
"Sid": "BucketListAndLocation",
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetBucketLocation"
],
"Resource": "arn:aws:s3:::*"
},
{
"Sid": "ObjectCRUD",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject"
],
"Resource": "arn:aws:s3:::*/*"
}
]
}
선택적으로 자주 추가하는 권한
- 멀티파트 업로드: "s3:AbortMultipartUpload", "s3:ListBucketMultipartUploads"
- 객체 태깅/메타 변경: "s3:PutObjectTagging", "s3:GetObjectTagging"
- 버전 관리 사용 시: "s3:ListBucketVersions", "s3:GetObjectVersion*", "s3:DeleteObjectVersion"
- SSE-KMS 암호화 버킷이라면: 관련 KMS 키에 "kms:Encrypt", "kms:Decrypt", "kms:GenerateDataKey" 등도 별도 부여 필요
3) 최소권한 설계 – 특정 버킷/경로만 허용(권장)
특정 버킷만
{
"Version": "2012-10-17",
"Statement": [
{ "Effect": "Allow", "Action": "s3:ListAllMyBuckets", "Resource": "*" },
{ "Effect": "Allow", "Action": ["s3:ListBucket", "s3:GetBucketLocation"], "Resource": "arn:aws:s3:::my-bucket" },
{ "Effect": "Allow", "Action": ["s3:GetObject", "s3:PutObject", "s3:DeleteObject"], "Resource": "arn:aws:s3:::my-bucket/*" }
]
}
특정 경로(prefix)만
{
"Version": "2012-10-17",
"Statement": [
{ "Effect": "Allow", "Action": "s3:ListAllMyBuckets", "Resource": "*" },
{
"Effect": "Allow",
"Action": ["s3:ListBucket", "s3:GetBucketLocation"],
"Resource": "arn:aws:s3:::my-bucket",
"Condition": { "StringLike": { "s3:prefix": [ "projectX/*" ] } }
},
{
"Effect": "Allow",
"Action": ["s3:GetObject", "s3:PutObject", "s3:DeleteObject"],
"Resource": "arn:aws:s3:::my-bucket/projectX/*"
}
]
}
4) 정책 적용 방법
A. 콘솔에서 정책 만들기/연결
- IAM → 정책 → 정책 생성 → JSON 탭에 위 정책 붙여넣기 → 검토/생성.
- IAM → 사용자(또는 역할/그룹) 선택 → 권한 추가 → 정책 연결에서 방금 만든 정책 선택.
- (역할 사용 시) 해당 역할을 Assume하도록 IDP/SAML/STS(콘솔 스위치 롤) 흐름 구성.
B. AWS CLI
# 1) 정책 생성
aws iam create-policy \
--policy-name S3ListAndObjectCRUDAllBuckets \
--policy-document file://policy.json
# 2) 사용자에 연결
aws iam attach-user-policy \
--user-name dev-user \
--policy-arn arn:aws:iam::<ACCOUNT_ID>:policy/S3ListAndObjectCRUDAllBuckets
C. Terraform (예시)
resource "aws_iam_policy" "s3_list_crud" {
name = "S3ListAndObjectCRUDAllBuckets"
policy = file("${path.module}/policy.json")
}
resource "aws_iam_user_policy_attachment" "attach" {
user = aws_iam_user.dev_user.name
policy_arn = aws_iam_policy.s3_list_crud.arn
}
5) 동작 확인(검증 커맨드)
# 자격 증명 확인
aws sts get-caller-identity
# 버킷 목록 조회
aws s3api list-buckets --query 'Buckets[].Name'
# 특정 버킷 지역/목록/업로드/다운로드/삭제
aws s3api get-bucket-location --bucket <bucket>
aws s3 ls s3://<bucket>/
echo "hello" > test.txt
aws s3 cp test.txt s3://<bucket>/tmp/test.txt
aws s3 cp s3://<bucket>/tmp/test.txt ./test-downloaded.txt
aws s3 rm s3://<bucket>/tmp/test.txt
6) 실무 체크포인트(보안/거버넌스)
- 최소 권한 원칙: 가능하면 와일드카드 대신 정해진 버킷/경로만 허용.
- SSE-KMS: KMS 키 권한까지 포함되어야 업/다운로드가 정상 동작.
- 조직 정책(SCP)/Permission Boundary/세션 정책: 상위 정책이 막으면 IAM 정책이 있어도 동작하지 않음.
- 크로스-계정: 버킷 목록은 현재 계정만. 다른 계정 버킷은 역할 전환(AssumeRole) 로 접근(목록에 자동 노출되지 않음).
- 임시 자격 증명 선호: 사용자보다 역할 + STS를 권장(키 유출 위험 감소).
- 감사/로깅: CloudTrail, S3 서버 액세스 로그/CloudWatch Logs 연동으로 액세스 추적.
반응형
'CLOUD > AWS' 카테고리의 다른 글
| AWS Network Loadbalancer의 ALPN이란? (0) | 2025.09.09 |
|---|---|
| CORS “보여주기 vs 읽기”, 프리플라이트, S3·CloudFront 정리 (1) | 2025.08.28 |
| CloudFront + S3로 이미지 서빙하기: 한 배포, 여러 도메인, 경로 기반 라우팅 (3) | 2025.08.25 |
| AWS CloudFront 대체 도메인(Alternate Domain Names)와 Route 53 A 레코드 정리 (0) | 2025.08.20 |
| AWS Route 53 도메인에 SSL 인증서 발급 및 여러 리전 관리 방법 (0) | 2025.08.14 |
댓글