내맘대로 개발 일기/DevOps

[AWS] Amazon S3 버킷 정책(Bucket Policy) 작성 방법 (3가지)

bu119 2025. 9. 1. 15:20
728x90
반응형

Amazon S3 버킷 정책은 버킷과 객체에 대한 접근 제어를 세밀하게 설정할 수 있는 핵심 보안 기능입니다. 기본적으로 S3 버킷은 외부 접근이 차단되어 있기 때문에, 웹사이트 호스팅, 특정 사용자 권한 부여, 내부 애플리케이션 접근 제어와 같은 상황에서 반드시 버킷 정책을 적절히 구성해야 합니다.

 

이번 글에서는 S3 버킷 정책을 작성하는 3가지 방법을 비교하고, 상황별로 어떤 방식을 선택해야 하는지 실무 관점에서 정리합니다.

 

📋 목차

  1. 3가지 방법 비교 분석
  2. 방법 1: 직접 JSON 작성
  3. 방법 2: 시각적 편집기 활용
  4. 방법 3: AWS Policy Generator 활용
  5. 상황별 추천 워크플로우
  6. 실무 모범 사례

3가지 방법 비교 분석

방법 장점 단점 추천 대상 적합한 상황
직접 JSON 작성 • 빠른 작성 가능
• 세밀한 제어
• JSON 문법 숙지 필요
• 오타/구문 오류 위험
개발자, 숙련자 복잡한 정책, 빠른 수정
시각적 편집기 • 직관적인 GUI
• 실시간 JSON 미리보기
• 복잡한 조건 제한
• 다중 조건 설정 어려움
초급자, 일반 사용자 간단한 정책, 학습 목적
Policy Generator • 문법 오류 방지
• 단계별 가이드 제공
• 별도 화면에서 작성
• 일부 최신 조건 미지원
모든 사용자 정확성이 중요한 정책, 템플릿 생성

방법 1: 직접 JSON 작성

🖋️ 개요

SON 문법을 직접 작성하는 방식입니다. 가장 유연하고 빠르지만 문법 오류 발생 위험이 있으므로, 숙련된 개발자나 긴급 수정이 필요한 상황에서 권장됩니다.


📝 기본 구조

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "PolicyIdentifier",
      "Effect": "Allow|Deny",
      "Principal": "* 또는 특정 ARN",
      "Action": "허용 작업",
      "Resource": "대상 리소스",
      "Condition": {
        "조건타입": {
          "조건키": "조건값"
        }
      }
    }
  ]
}

구성 요소 설명

  • Version: "2012-10-17" (고정값)
  • Statement: 정책 규칙들의 배열
  • Effect: "Allow" 또는 "Deny"
  • Action: 허용할 작업 (예: "s3:GetObject")
  • Resource: 적용 대상 리소스 ARN
    • 버킷 자체: arn:aws:s3:::버킷명
    • 객체 전체: arn:aws:s3:::버킷명/*
  • Principal: 접근 주체 (반드시 명시해야 함)
    • * → 모든 사용자
    • 특정 사용자: arn:aws:iam::계정ID:user/이름
    • 특정 역할: arn:aws:iam::계정ID:role/역할명
  • Condition (선택): IP 제한, HTTPS 강제, 시간 제한 등
  • Sid (선택): 정책 문 단위 식별자 (관리·디버깅 목적)

🔧 실전 예제

예제 1. 웹사이트용 공개 읽기 (HTTPS 강제)

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "PublicReadOverTLS",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::my-website-bucket/*",
      "Condition": {
        "Bool": { "aws:SecureTransport": "true" }
      }
    }
  ]
}

⚠️ 주의: 퍼블릭 접근을 허용하려면 버킷의 ‘퍼블릭 액세스 차단(Block Public Access)’ 설정을 해제해야 정책이 적용됩니다. 보안상 권장되는 방식은 CloudFront + OAC(Origin Access Control)를 통한 공개입니다.

 

예제 2. 특정 사용자에게 전체 권한 부여

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "UserFullAccess",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::123456789012:user/developer"
      },
      "Action": "s3:*",
      "Resource": [
        "arn:aws:s3:::my-dev-bucket",      // 버킷 수준
        "arn:aws:s3:::my-dev-bucket/*"     // 객체 수준
      ]
    }
  ]
}

💡 버킷 수준(ListBucket)과 객체 수준(GetObject, PutObject 등)을 동시에 지정해야 정상적으로 동작합니다.

 

예제 3. 조건부 접근 제어 (보안 강화)

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowReadOnlyOverTLS",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::secure-bucket/*",
      "Condition": {
        "Bool": { "aws:SecureTransport": "true" },
        "IpAddress": { "aws:SourceIp": ["203.0.113.0/24", "198.51.100.0/24"] },
        "DateGreaterThan": { "aws:CurrentTime": "2024-01-01T00:00:00Z" }
      }
    },
    {
      "Sid": "AllowUploadFromAppRole",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::123456789012:role/WebAppRole"
      },
      "Action": "s3:PutObject",
      "Resource": "arn:aws:s3:::secure-bucket/uploads/*",
      "Condition": {
        "Bool": { "aws:SecureTransport": "true" }
      }
    }
  ]
}

⚠️ PutObject는 반드시 특정 IAM 사용자·역할로 제한해야 하며, 절대로 Principal: "*" 상태에서 허용하면 안 됩니다. (악성 업로드 위험)


⚡ 작성 팁 및 주의사항

  • ARN 형식: arn:aws:s3:::버킷명/* (콜론 3개 주의)
  • 대소문자 구분: Action, Condition 키 값은 대소문자 정확히 입력해야 함
  • 배열 문법: 단일 값이라도 배열로 작성 가능 → "Action": ["s3:GetObject"]

방법 2: 시각적 편집기 활용 (Edit statement)

🎨 개요

AWS 콘솔에 내장된 GUI 기반 편집기를 활용하여 정책을 작성하는 방법입니다. 직관적인 화면을 통해 JSON 문법을 몰라도 정책을 쉽게 작성할 수 있어, 초급자나 학습용으로 적합합니다.


📋 단계별 사용 방법

1. 버킷 정책 편집 페이지에서 [ 새 명령문 추가(Add new statement) ] 버튼을 클릭합니다.

영어 버전
한글 버전


2. 시각적 편집기에서 다음 항목들을 단계별로 입력합니다.

Step 1. 기본 정보 설정

필드 예시 설명
Sid PublicWebsiteAccess 정책 문 단위 식별자 (영문/숫자)
Effect Allow / Deny 권한 허용 또는 거부 선택

Step 2. 접근 주체(Principal) 설정

옵션 입력 형식 사용 사례
모든 사용자 * 웹사이트 공개 읽기(주의 필요)
특정 AWS 계정 arn:aws:iam::123456789012:role/PartnerAccessRole 파트너 계정 권한 부여
특정 사용자 arn:aws:iam::123456789012:user/app-user 내부 개발자 전용
특정 역할 arn:aws:iam::123456789012:role/WebAppRole 애플리케이션 권한 위임
⚠️ root 계정(:root) 사용은 보안상 지양해야 하며, 반드시 Role/User ARN을 활용하는 것이 안전합니다.

Step 3. 작업(Actions) 선택

권한 그룹 Actions 용도
읽기 권한 GetObject, GetObjectVersion 파일 다운로드 및 메타데이터 조회
쓰기 권한 PutObject 파일 업로드
목록 권한 ListBucket, ListBucketVersions 버킷 내 파일 목록 조회
삭제 권한 DeleteObject, DeleteObjectVersion 객체 및 버전 삭제
전체 권한 s3:* 모든 S3 작업 허용 (주의)
⚠️ *Acl 계열 액션은 ACL 비활성(Object Ownership: Bucket owner enforced) 환경에서는 불필요합니다.

Step 4. 리소스(Resources) 지정  

패턴 ARN 형식 적용 범위
버킷 자체 arn:aws:s3:::버킷명 ListBucket 같은 버킷 수준 작업
모든 객체 arn:aws:s3:::버킷명/* 버킷 내 모든 파일 접근
특정 폴더 arn:aws:s3:::버킷명/images/* 폴더 단위 권한 분리
특정 파일 arn:aws:s3:::버킷명/file.jpg 개별 객체 권한 지정

Step 5. 조건(Condition) 설정 (선택 사항)

조건 타입 예시 설명
IpAddress aws:SourceIp 203.0.113.0/24 특정 IP 대역 제한
Bool aws:SecureTransport true HTTPS 강제
StringLike s3:prefix user-uploads/* ListBucket 결과 필터링 전용
DateGreaterThan aws:CurrentTime 2024-01-01T00:00:00Z 시간 기반 제한
⚠️ s3:prefix 조건은 ListBucket 액션에서만 동작합니다. GetObject/PutObject 제한은 리소스 ARN을 통해 경로별로 지정해야 합니다.

 

2-1. "Sid", "Principal", "Effect"을 차례대로 입력합니다.

  • Sid: ObjectReadWriteAccesss
  • Principal: *
  • Effect: Allow

 

2-2. "Actions"에 GetObject, PutObject를 적용합니다.

  • 우측 "작업 추가"에서 GetObject을 검색한 뒤, 선택합니다.

  • 우측 "작업 추가"에서 PutObject을 검색한 뒤, 선택합니다.

 

2-3. "Resource"에 arn:aws:s3:::버킷명/*을 적용합니다.

버킷 내 모든 파일 접근할 수 있게 할 것입니다.

우측 "리소스 추가"에서 추가 버튼을 클릭하여, 아래와 같이 선택합니다.

2-4. 조건은 선택 사항이므로 추가하지 않겠습니다.


3. JSON 미리 보기에서 생성된 정책을 확인하고, 변경 사항 저장(Save changes) ] 버튼을 클릭합니다.

필요시 추가 statement를 더 생성할 수 있습니다.

4. 정책 적용이 완료됩니다.


🔍 실시간 미리 보기 활용

편집기 좌측의 JSON 미리보기 영역에서

  • 설정 즉시 JSON 코드 확인 가능
  • 문법 오류 실시간 감지
  • 완성된 JSON 코드 복사하여 재사용 가능

방법 3: AWS Policy Generator 활용

🛠️ 개요

AWS Policy Generator는 공식적으로 제공되는 정책 생성 도구로, JSON 문법에 익숙하지 않은 사용자도 쉽게 정책을 만들 수 있습니다.
문법 오류를 방지할 수 있다는 점에서 안전하지만, 최신 조건 키나 세부 기능은 모두 지원하지 않을 수 있으므로 생성 후 반드시 검증이 필요합니다.


🔗 접근 방법

  1. S3 콘솔에서: 버킷 정책 편집 화면 → 정책 생성기(Policy Generator) 버튼 클릭
  2. 직접 접근: AWS Policy Generator
 

AWS Policy Generator

 

awspolicygen.s3.amazonaws.com


📝 단계별 사용 방법

1. 버킷 정책 편집 화면에서 [ 정책 생성기(Policy Generator) ] 버튼을 클릭합니다.

2. 새 탭에서 열린 AWS Policy Generator에서 정책을 설정합니다.

Step 1. 정책 유형 선택

  • Select Type of Policy → S3 Bucket Policy 선택

Step 2. 권한 상세 설정

기본 설정

필드    설명
Effect Allow / Deny 권한 허용/거부
Principal * 또는 ARN 접근 주체 (*는 모든 사용자 공개 → 주의 필요, 일반적으로 IAM Role/User ARN 사용)

 

Actions 선택

용도 Actions
읽기 전용 GetObject
업로드 전용 PutObject
업로드+읽기 GetObject, PutObject
목록 조회 ListBucket
전체 권한 s3:* (모든 S3 작업)

 

ARN 입력 예시

범위 ARN 형식 설명
버킷 자체 arn:aws:s3:::버킷명 버킷 수준 작업
모든 객체 arn:aws:s3:::버킷명/* 버킷 내 모든 파일
특정 폴더 arn:aws:s3:::버킷명/folder/* 폴더 단위 접근 제어
특정 파일 arn:aws:s3:::버킷명/file.jpg 개별 객체 제어
 
💡 ARN을 잘못 입력하면 정책이 적용되지 않으므로, 반드시 정확한 형식으로 작성해야 합니다.

Step 3. 조건 설정 (선택 사항)

  • Generator는 제한된 조건만 제공합니다. (IP, HTTPS, Date 등)
  • 복잡한 조건은 생성된 JSON을 직접 수정해야 합니다.

예시:

  • IP 제한 → IpAddress: aws:SourceIp = 203.0.113.0/24
  • HTTPS 강제 → Bool: aws:SecureTransport = true
  • 시간 제한 → DateGreaterThan: aws:CurrentTime = 2024-01-01T09:00:00Z

3. [ Add Statement ]를 클릭하여 규칙을 추가합니다.

 

4. [ Generate Policy ]를 클릭하여 JSON 정책을 생성합니다.

5. 생성된 JSON을 복사합니다.

6. JSON을 S3 콘솔 정책 편집기에 붙여넣고, [ 변경 사항 저장 ] 버튼을 클릭합니다.

7. 정책 적용이 완료됩니다. 


✅ Policy Generator 장점과 한계

장점

  • JSON 문법 오류 방지 (완벽한 JSON 생성)
  • 단계별 가이드 제공 → 초보자도 쉽게 작성 가능
  • 생성된 정책을 템플릿으로 재사용 가능

한계

  • 최신 IAM/S3 조건 키 일부 미지원
  • 복잡한 정책은 생성 후 직접 JSON 수정 필요

정책 생성기에 대한 자세한 설명은 아래 글을 읽어보세요.

https://bu119.tistory.com/159

 

[AWS] Amazon S3 버킷 정책 생성기 사용 가이드

AWS Policy Generator는 복잡한 JSON 정책을 직접 작성하지 않고도 GUI를 통해 쉽게 AWS 정책을 생성할 수 있는 공식 도구입니다. 특히 S3 버킷 정책 생성에 매우 유용합니다. 1. AWS Policy Generator 접근 방법AW

bu119.tistory.com


상황별 추천 워크플로우

🚀 긴급 수정 (빠른 대응 필요)

  • 방법 추천: 직접 JSON 작성
  • 이유: 빠르게 정책을 수정할 수 있고, 복잡한 조건도 즉시 반영 가능

예시:

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

🎓 학습 목적 (정책 구조 이해)

  • 방법 추천: 시각적 편집기
  • 이유: JSON 문법을 몰라도 GUI로 쉽게 작성 가능, 실시간 JSON 미리보기 제공

🛡️ 프로덕션 환경 (정확성 최우선)

  • 방법 추천: Policy Generator → JSON 검증 → 동료 리뷰 후 적용
  • 이유: 문법 오류 방지 + 팀 내 표준화된 정책 관리 가능

📊 팀 작업 표준화

  1. Policy Generator로 표준 템플릿 생성
  2. 팀 정책 라이브러리 관리 (Git 저장소 등)
  3. 필요 시 직접 JSON 수정으로 커스터마이징

🔄 권장 학습 경로

수준 추천 순서  목적
초급자 Policy Generator → 시각적 편집기 → 직접 JSON 안전하게 학습, 단계적 성장
중급자 시각적 편집기 → 직접 JSON → Policy Generator(검증용) 효율성과 정확성 균형
고급자 직접 JSON → (복잡한 경우만) Policy Generator 최대 효율성 추구

실무 모범 사례

🔒 보안 기본 원칙

  • 최소 권한 원칙(Principle of Least Privilege)
  • 명시적 거부(Explicit Deny) 활용 → 불필요한 권한 확장 방지
  • HTTPS 전송 강제 (aws:SecureTransport) → 평문 HTTP 차단
  • 퍼블릭 액세스 차단(Block Public Access) 설정 확인

🏷️ 정책 관리 팁

  • Sid 규칙: 작업_대상_환경 형태 권장 (예: Allow_WebApp_Read_Prod)
  • 문서화: 정책에 주석은 불가능하므로, JSON 외부에 설명 파일을 반드시 관리
  • 버전 관리: Git 저장소에 정책 파일 보관

💡 결론

  • 초급자: Policy Generator 또는 시각적 편집기부터 시작
  • 실무 운영: Policy Generator + JSON 수동 수정 + Access Analyzer 검증
  • 항상 확인할 것: 최소 권한, HTTPS 강제, 퍼블릭 액세스 차단

 

각 방법은 고유한 장점과 적절한 사용 상황이 있습니다. 처음에는 안전한 도구를 활용해 구조를 익히고, 점차 직접 JSON 작성으로 발전하는 것을 권장합니다.


무엇보다 “보안과 정확성”을 최우선으로 두고, 상황에 맞는 방법을 선택하는 것이 S3 버킷 정책 작성의 핵심입니다.

 

728x90
반응형