내맘대로 개발 일기/DevOps

[AWS] Amazon S3 버킷 정책(Bucket Policy) 이해하기

bu119 2025. 8. 23. 19:00
728x90
반응형

Amazon S3는 파일(객체)을 저장하는 AWS의 대표적인 클라우드 스토리지 서비스입니다. 하지만 기본적으로 S3 버킷은 보안을 위해 외부에서 접근할 수 없도록 잠겨 있습니다.

실제 서비스 운영에서는 상황에 따라 접근 권한을 세밀하게 제어해야 할 때가 있습니다. 이때 필요한 것이 바로 S3 버킷 정책(Bucket Policy)입니다.

 

https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucket-policies.html

 

Bucket policies for Amazon S3 - Amazon Simple Storage Service

You can't use a bucket policy to prevent deletions or transitions by an S3 Lifecycle rule. For example, even if your bucket policy denies all actions for all principals, your S3 Lifecycle configuration still functions as normal.

docs.aws.amazon.com


🎯 언제 버킷 정책이 필요할까요?

  • 정적 웹사이트 호스팅: 이미지, CSS, JS 파일을 누구나 볼 수 있게 공개
  • 팀 협업: 특정 IAM 사용자나 그룹에게만 업로드/다운로드 권한 부여
  • 보안 강화: 특정 IP 주소나 VPC에서만 접근 가능하도록 제한
  • 교차 계정 액세스: 다른 AWS 계정과 안전하게 리소스 공유

📚 S3 버킷 정책이란?

Amazon S3를 인터넷상의 거대한 창고라고 생각해보세요.

여기서 버킷(Bucket)은 창고 안의 각각의 방이고, 버킷 정책(Bucket Policy)은 누가 이 방에 들어올 수 있는지, 무엇을 할 수 있는지를 정하는 세부 규칙입니다.

핵심 특징

  • JSON 형식으로 작성되는 권한 제어 문서
  • 버킷 단위로 적용되는 보안 규칙
  • "누가" → "어떤 작업" → "어떤 리소스"에 → "허용/거부"할지를 정의
  • IAM 정책과 유사하지만 버킷 자체에 직접 연결되는 정책

왜 버킷 정책이 중요한가?

  • 보안: 민감한 데이터를 무단 접근으로부터 보호
  • 접근 제어: 세밀한 권한 관리로 최소 권한 원칙 구현
  • 비용 최적화: 불필요한 접근 차단으로 데이터 전송 비용 절약
  • 규정 준수: 기업 보안 정책 및 컴플라이언스 요구사항 충족

🏗️ 버킷 정책의 구조

S3 버킷 정책은 JSON 형식으로 작성되며, 다음과 같은 기본 구조를 가집니다:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::your-bucket-name/*"
    }
  ]
}

주요 구성 요소

요소 역할 설명 예시
Version 정책 언어 버전 AWS 정책 문법 버전 지정 "2012-10-17" (고정값)
Statement 규칙 집합 하나 이상의 권한 규칙 포함 배열 형태
Effect 허용/거부 명령의 최종 결과 "Allow" 또는 "Deny"
Principal 접근 주체 누가 접근할 수 있는지 "*" (모든 사용자)
Action 허용할 작업 어떤 S3 작업을 허용할지 "s3:GetObject"
Resource 대상 리소스 어떤 버킷/객체에 적용할지 "arn:aws:s3:::bucket/*"
Condition 추가 조건 언제, 어떤 상황에서 적용할지 IP 제한, 시간 제한 등

🔧 각 요소 상세 설명

Version (버전)

  • 항상 "2012-10-17" 사용 (최신 정책 언어 버전)
  • 다른 값 사용 시 일부 기능 제한 가능

Effect (효과)

  • "Allow": 권한 허용 (일반적 사용)
  • "Deny": 권한 거부 (명시적 차단)

⚠️ 중요: Deny가 Allow보다 항상 우선순위가 높음

Principal (주체)

// 모든 사용자 (공개 액세스)
"Principal": "*"

// 특정 AWS 계정
"Principal": {"AWS": "arn:aws:iam::123456789012:root"}

// 특정 IAM 사용자
"Principal": {"AWS": "arn:aws:iam::123456789012:user/username"}

// 특정 IAM 역할
"Principal": {"AWS": "arn:aws:iam::123456789012:role/rolename"}

Action (작업)

읽기 권한

  • s3:GetObject: 파일 다운로드
  • s3:ListBucket: 버킷 내용 목록 조회

쓰기 권한

  • s3:PutObject: 파일 업로드
  • s3:DeleteObject: 파일 삭제

관리 권한

  • s3:*: 모든 S3 작업 (주의해서 사용)

Resource (리소스)

// 버킷 자체 (ListBucket 등)
"Resource": "arn:aws:s3:::your-bucket-name"

// 버킷 내 모든 객체
"Resource": "arn:aws:s3:::your-bucket-name/*"

// 특정 폴더만
"Resource": "arn:aws:s3:::your-bucket-name/images/*"

// 여러 리소스
"Resource": [
  "arn:aws:s3:::your-bucket-name",
  "arn:aws:s3:::your-bucket-name/*"
]

Condition (조건)

IP 주소 제한

"Condition": {
  "IpAddress": {
    "aws:SourceIp": "203.0.113.0/24"
  }
}

 

시간 제한

"Condition": {
  "DateGreaterThan": {"aws:CurrentTime": "2025-01-01T00:00:00Z"},
  "DateLessThan": {"aws:CurrentTime": "2025-12-31T23:59:59Z"}
}

 

HTTPS 강제

"Condition": {
  "Bool": {
    "aws:SecureTransport": "true"
  }
}

📋 실무에서 자주 사용하는 정책 예제

https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-bucket-policies.html

 

Examples of Amazon S3 bucket policies - Amazon Simple Storage Service

We recommend that you use caution when using the aws:Referer condition key. It is dangerous to include a publicly known HTTP referer header value. Unauthorized parties can use modified or custom browsers to provide any aws:Referer value that they choose. T

docs.aws.amazon.com

1. 정적 웹사이트 공개 정책

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "PublicReadGetObject",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::your-website-bucket/*"
    }
  ]
}

2. 특정 IP에서만 접근 허용

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::your-bucket/*",
      "Condition": {
        "IpAddress": {
          "aws:SourceIp": ["203.0.113.0/24", "198.51.100.0/24"]
        }
      }
    }
  ]
}

3. HTTPS 연결 강제

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Deny",
      "Principal": "*",
      "Action": "s3:*",
      "Resource": [
        "arn:aws:s3:::your-bucket",
        "arn:aws:s3:::your-bucket/*"
      ],
      "Condition": {
        "Bool": {
          "aws:SecureTransport": "false"
        }
      }
    }
  ]
}

4. 특정 사용자에게 전체 권한 부여

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::123456789012:user/developer"
      },
      "Action": [
        "s3:GetObject",
        "s3:PutObject",
        "s3:DeleteObject",
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::your-bucket",
        "arn:aws:s3:::your-bucket/*"
      ]
    }
  ]
}

⚠️ 주의사항 및 베스트 프랙티스

보안 주의사항

  • 공개 액세스 최소화: "Principal": "*" 사용 시 신중하게 검토
  • 최소 권한 원칙: 필요한 최소한의 권한만 부여
  • Deny 정책 우선: 보안상 중요한 리소스는 명시적으로 Deny 규칙 추가

정책 작성 팁

  • Sid 추가: 각 Statement에 설명적인 Sid(Statement ID) 포함
  • 조건 활용: IP, 시간, 암호화 등 추가 보안 조건 적극 활용
  • 정기 검토: 정책을 주기적으로 검토하여 불필요한 권한 제거

문제 해결

  • 정책 충돌: IAM 정책과 버킷 정책이 충돌할 때는 더 제한적인 정책이 우선
  • JSON 문법 오류: AWS Policy Generator 활용으로 문법 오류 방지
  • 권한 테스트: 정책 적용 후 실제 접근 테스트로 동작 확인

마무리

S3 버킷 정책은 클라우드 보안의 핵심 요소입니다. 올바른 정책 설정을 통해 데이터를 안전하게 보호하면서도 필요한 접근성을 확보할 수 있습니다.

이 글에서 다룬 기본 구조와 예제들을 참고하여 여러분의 요구사항에 맞는 버킷 정책을 작성해보세요. 항상 최소 권한 원칙을 기억하고, 정기적인 정책 검토를 통해 안전한 AWS 환경을 유지하시기 바랍니다.


다음 글에서는 AWS 콘솔에서 실제로 이러한 정책들을 설정하는 방법을 스크린샷과 함께 자세히 알아보겠습니다.

https://bu119.tistory.com/132

 

[AWS] Amazon S3 버킷 정책(Bucket Policy) 설정하기

Amazon S3는 파일(객체)을 저장하는 AWS의 대표적인 클라우드 스토리지 서비스입니다. 하지만 기본적으로 S3 버킷은 보안을 위해 외부에서 접근할 수 없도록 잠겨 있습니다.실제 서비스 운영에서는

bu119.tistory.com


📚 참고 문서

 

728x90
반응형