본문 바로가기
CLOUD/AWS

[AWS IAM] 사용자에게 S3 전체 버킷 조회 + 객체 Get/Put/Delete 권한 부여하기

by Rainbound-IT 2025. 8. 26.
반응형

 

 

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. 콘솔에서 정책 만들기/연결

  1. IAM → 정책 → 정책 생성 → JSON 탭에 위 정책 붙여넣기 → 검토/생성.
  2. IAM → 사용자(또는 역할/그룹) 선택 → 권한 추가 → 정책 연결에서 방금 만든 정책 선택.
  3. (역할 사용 시) 해당 역할을 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 연동으로 액세스 추적.
반응형

댓글