내맘대로 개발 일기/뽀모로 Do!

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

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

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

 

1. AWS Policy Generator 접근 방법

AWS Policy Generator는 https://awspolicygen.s3.amazonaws.com/policygen.html에서 접근할 수 있으며, AWS 콘솔 로그인 없이도 사용 가능합니다.


2. 정책 생성기 구성 요소 설명

1️⃣ Step 1: 정책 유형 선택 (Select Policy Type)

Type of Policy (정책 유형)

정책 생성기에서 지원하는 정책 유형들과 각각의 사용 목적:

1. S3 Bucket Policy

  • 용도: S3 버킷과 객체에 대한 접근 권한 제어
  • 적용 대상: 특정 S3 버킷
  • 주요 사용 사례:
    • 정적 웹사이트 퍼블릭 액세스
    • 특정 사용자/역할에게만 버킷 접근 허용
    • CloudFront와 연동한 원본 버킷 보안

2. IAM Policy

  • 용도: 사용자, 그룹, 역할에 부여할 권한 정책
  • 적용 대상: IAM 엔터티
  • 주요 사용 사례:
    • 개발팀별 리소스 접근 권한 분리
    • 최소 권한 원칙 적용

3. SNS Topic Policy

  • 용도: SNS 주제에 대한 구독/발행 권한
  • 적용 대상: SNS 주제
  • 주요 사용 사례:
    • 다른 AWS 계정과 알림 공유
    • 애플리케이션 간 메시징

4. SQS Queue Policy

  • 용도: SQS 대기열 접근 권한
  • 적용 대상: SQS 대기열
  • 주요 사용 사례:
    • 서비스 간 비동기 통신 권한 관리

5. VPC Endpoint Policy

  • 용도: VPC 엔드포인트를 통한 서비스 접근 제어
  • 적용 대상: VPC 엔드포인트
  • 주요 사용 사례:
    • 프라이빗 네트워크에서 AWS 서비스 접근 제어

2️⃣ Step 2: 정책 명령문 구성 (Add Statements)

Effect (효과)

정책의 기본 동작을 결정하는 핵심 요소:

1. Allow (허용)

"Effect": "Allow"
  • 명시적으로 작업을 허용
  • 기본적으로 모든 작업이 거부되므로 필요한 작업만 허용
  • 사용 예시: 읽기 전용 액세스, 특정 폴더 업로드 권한

2. Deny (거부)

"Effect": "Deny"
  • 명시적으로 작업을 거부
  • Allow보다 우선순위가 높음
  • 사용 예시: 특정 IP 차단, 삭제 작업 금지, 민감한 폴더 접근 차단

Principal (보안 주체)

정책이 적용될 대상을 지정하는 중요한 필드:

 

1. 모든 사용자 (퍼블릭 액세스)

"Principal": "*"
  • 주의사항: 인터넷의 모든 사용자가 접근 가능
  • 사용 사례: 정적 웹사이트, 공개 다운로드 파일

 

2. 특정 AWS 계정

"Principal": {
  "AWS": "arn:aws:iam::123456789012:root"
}
  • 사용 사례: 다른 AWS 계정과 리소스 공유

 

3. 특정 IAM 사용자

"Principal": {
  "AWS": "arn:aws:iam::123456789012:user/username"
}

 

4. 특정 IAM 역할

"Principal": {
  "AWS": "arn:aws:iam::123456789012:role/rolename"
}

 

5. AWS 서비스

"Principal": {
  "Service": "cloudfront.amazonaws.com"
}

Actions (작업)

S3에서 수행할 수 있는 주요 작업들:

 

1. 객체 관련 작업

  • s3:GetObject: 객체 읽기/다운로드
  • s3:PutObject: 객체 업로드/생성
  • s3:DeleteObject: 객체 삭제
  • s3:GetObjectAcl: 객체 ACL 조회
  • s3:PutObjectAcl: 객체 ACL 설정

2. 버킷 관련 작업

  • s3:ListBucket: 버킷 내용 목록 조회
  • s3:GetBucketLocation: 버킷 위치 정보 조회
  • s3:GetBucketVersioning: 버킷 버전 관리 상태 조회

3. 와일드카드 사용

  • s3:Get*: 모든 읽기 작업
  • s3:Put*: 모든 쓰기 작업
  • s3:*: 모든 S3 작업

Amazon Resource Name (ARN)

정책이 적용될 리소스를 정확히 지정:

 

1. 버킷 자체

arn:aws:s3:::my-bucket
  • 버킷 속성 관련 작업에 사용 (ListBucket 등)

 

2. 버킷 내 모든 객체

arn:aws:s3:::my-bucket/*
  • 객체 관련 작업에 사용 (GetObject, PutObject 등)

 

3. 특정 경로의 객체

arn:aws:s3:::my-bucket/uploads/*
arn:aws:s3:::my-bucket/public/images/*

 

4. 복수 리소스 지정

arn:aws:s3:::my-bucket
arn:aws:s3:::my-bucket/*

조건 추가 (Add Conditions) - 선택사항

조건을 통해 더욱 세밀한 접근 제어가 가능합니다. Policy Generator에서는 세 개의 필드로 조건을 설정합니다:

 

조건 설정 구성 요소

1. Condition (조건 연산자)

  • StringEquals: 문자열 정확 일치
  • StringLike: 와일드카드 패턴 매칭
  • IpAddress: IP 주소 범위 내
  • DateGreaterThan: 지정 날짜 이후
  • Bool: 불린 값 (true/false)
  • NumericLessThan: 지정 값보다 작음

2. Key (조건 키)

  • aws:CurrentTime: 현재 시간
  • aws:SourceIp: 요청자 IP 주소
  • aws:SecureTransport: HTTPS 사용 여부
  • s3:x-amz-server-side-encryption: S3 암호화 방식

3. Value (조건 값)

  • 조건과 비교할 실제 값 입력
  • 복수 값은 쉼표로 구분

주요 조건 활용 예시

예시 1: IP 주소 기반 제어

  • Condition: IpAddress
  • Key: aws:SourceIp
  • Value: 192.168.1.0/24,203.0.113.0/24
"Condition": {
  "IpAddress": {
    "aws:SourceIp": ["192.168.1.0/24", "203.0.113.0/24"]
  }
}

 

예시 2: 시간 기반 제어

  • Condition: DateGreaterThan
  • Key: aws:CurrentTime
  • Value: 2024-01-01T00:00:00Z
"Condition": {
  "DateGreaterThan": {
    "aws:CurrentTime": "2024-01-01T00:00:00Z"
  }
}

 

예시 3: HTTPS 연결만 허용

  • Condition: Bool
  • Key: aws:SecureTransport
  • Value: true
"Condition": {
  "Bool": {
    "aws:SecureTransport": "true"
  }
}

 

예시 4: 특정 암호화 요구

  • Condition: StringEquals
  • Key: s3:x-amz-server-side-encryption
  • Value: AES256
"Condition": {
  "StringEquals": {
    "s3:x-amz-server-side-encryption": "AES256"
  }
}

3. 실용적인 정책 예시

1. 정적 웹사이트 호스팅 정책

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

2. CloudFront OAC (Origin Access Control) 정책 - 권장

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "cloudfront.amazonaws.com"
      },
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::my-private-bucket/*",
      "Condition": {
        "StringEquals": {
          "AWS:SourceArn": "arn:aws:cloudfront::123456789012:distribution/EDFDVBD6EXAMPLE"
        }
      }
    }
  ]
}

3. CloudFront OAI (Origin Access Identity) 정책 - 레거시

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity E123456789"
      },
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::my-private-bucket/*"
    }
  ]
}

참고: OAI는 더 이상 권장되지 않으며, OAC(Origin Access Control) 사용을 권장합니다.

4. 개발팀 전용 업로드 정책

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::123456789012:role/DeveloperRole"
      },
      "Action": [
        "s3:PutObject",
        "s3:GetObject",
        "s3:DeleteObject"
      ],
      "Resource": "arn:aws:s3:::dev-bucket/uploads/*"
    }
  ]
}

5. 읽기 전용 + IP 제한 정책

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

6. 멀티파트 업로드 지원 정책

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::123456789012:role/UploadRole"
      },
      "Action": [
        "s3:PutObject",
        "s3:PutObjectAcl",
        "s3:GetObject",
        "s3:AbortMultipartUpload",
        "s3:ListMultipartUploadParts"
      ],
      "Resource": "arn:aws:s3:::upload-bucket/*"
    },
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::123456789012:role/UploadRole"
      },
      "Action": "s3:ListBucket",
      "Resource": "arn:aws:s3:::upload-bucket"
    }
  ]
}

4. 정책 생성 및 적용 과정

  1. 정책 생성: "Generate Policy" 버튼 클릭
  2. JSON 복사: 생성된 정책 JSON을 복사
  3. S3 콘솔 이동: AWS S3 콘솔로 이동
  4. 버킷 선택: 정책을 적용할 버킷 선택
  5. 권한 탭: "Permissions" 탭 클릭
  6. 버킷 정책: "Bucket Policy" 섹션에서 "Edit" 클릭
  7. 정책 붙여넣기: 생성한 JSON 정책 붙여넣기
  8. 저장: "Save changes" 클릭

5. 보안 모범 사례

1. 최소 권한 원칙

  • 꼭 필요한 권한만 부여
  • 와일드카드(*) 사용 최소화
  • 정기적인 권한 검토

2. Principal 설정 주의사항

  • "Principal": "*"는 신중히 사용
  • 특정 계정이나 역할로 제한 권장
  • 서비스 간 통신에는 역할 기반 접근

3. 조건 활용

  • IP 주소 제한으로 보안 강화
  • SSL/HTTPS 강제로 데이터 보호
  • 시간 기반 접근 제어로 임시 권한 부여

4. 정책 테스트

  • AWS IAM Policy Simulator로 사전 테스트
  • 단계적 적용으로 영향도 확인
  • CloudTrail 로그 모니터링으로 정책 효과 검증

5. 버킷 퍼블릭 액세스 설정

  • S3 버킷의 "Block Public Access" 설정과 정책이 상충되지 않도록 주의
  • 퍼블릭 정책 적용 시 해당 설정 해제 필요

6. 문제 해결

1. 접근 거부 오류 (Access Denied)

  • 버킷 퍼블릭 액세스 차단 설정 확인: 버킷 레벨의 "Block Public Access" 설정
  • 정책 구문 오류 검사: JSON 형식 및 구문 확인
  • ARN 형식 정확성 확인: 버킷명, 경로 등 정확성 검증
  • Principal과 Actions 일치 여부 확인: 권한 주체와 작업의 논리적 일치성

2. 정책 적용 안 됨

  • 정책 저장 후 전파 대기: 정책 변경 사항 전파에 수 분 소요
  • CloudFront 캐시 무효화: CDN 캐시로 인한 이전 정책 적용
  • 브라우저 캐시 삭제: 클라이언트 측 캐시 문제

3. 조건부 정책 작동 안 함

  • 조건 키 정확성 확인: AWS에서 지원하는 조건 키인지 확인
  • 대소문자 구분: 조건 연산자와 값의 대소문자 정확성
  • 데이터 타입 일치: 문자열, 숫자, 불린 등 데이터 타입 정확성

7. 고급 사용 팁

1. 다중 명령문(Statement) 활용

하나의 정책에 여러 명령문을 포함하여 복잡한 권한 구조 구현 가능

2. 정책 크기 제한

  • 버킷 정책 최대 크기: 20KB
  • 복잡한 정책의 경우 IAM 정책 분할 고려

3. 정책 버전 관리

  • "Version": "2012-10-17" 사용 권장
  • 이전 버전 사용 시 일부 기능 제한 가능

4. 조건 연산자 활용

  • StringLike, StringNotLike: 와일드카드 패턴 매칭
  • NumericLessThan, NumericGreaterThan: 숫자 범위 조건
  • DateLessThan, DateGreaterThan: 시간 범위 조건

AWS Policy Generator를 활용하면 복잡한 S3 버킷 정책도 GUI를 통해 쉽게 생성할 수 있으며, 다양한 보안 요구사항을 효과적으로 구현할 수 있습니다. 정책 생성 후에는 반드시 테스트를 통해 의도한 대로 작동하는지 확인하는 것이 중요합니다.

728x90
반응형