Amazon S3 Access Policy Language
Amazon S3 Access Policy Language란?
Amazon S3 Access Policy Language는
S3 버킷과 객체에 대한 접근 권한을 정의하기 위한 정책 언어입니다.
이 정책 언어는 AWS 전반에서 사용되는 IAM Policy Language를 기반으로 하며,
누가(Principal) 어떤 리소스(Resource)에
어떤 작업(Action)을
어떤 조건(Condition)에서
허용하거나 거부할지(Effect)를 정의합니다.
S3는 기본적으로 모든 접근이 차단(Deny)되어 있으며,
정책을 통해 명시적으로 허용해야만 접근이 가능합니다.
S3 접근 제어 방식 개요
S3 접근 권한은 다음과 같은 정책 조합으로 결정됩니다.
- IAM 사용자 / 역할 정책
- S3 버킷 정책 (Bucket Policy)
- 객체 ACL (Access Control List)
- S3 Access Point 정책
- Block Public Access 설정
AWS는 요청이 들어올 때 모든 관련 정책을 종합 평가하여
최종적으로 요청을 허용할지 거부할지를 결정합니다.
정책의 기본 구조
S3 정책은 JSON 형식으로 작성되며,
하나 이상의 Statement로 구성됩니다.
{
"Version": "2012-10-17",
"Id": "ExamplePolicyId",
"Statement": [
{
"Sid": "StatementDescription",
"Effect": "Allow",
"Principal": {},
"Action": [],
"Resource": [],
"Condition": {}
}
]
}
Id (Policy ID)
Id는 정책 전체를 식별하기 위한 선택적 식별자입니다. 정책 평가에는 영향을 주지 않으며, 관리 편의를 위해 사용됩니다. 일반적인 S3 버킷 정책에서는 생략하는 경우가 많습니다.
Sid
Sid는 Statement를 식별하기 위한 선택적 식별자입니다. 정책 평가에는 영향을 주지 않으며, 가독성과 관리성을 위해 사용됩니다.
Effect
Effect는 정책의 결과를 정의합니다.
- Allow: 요청 허용
- Deny: 요청 거부
정책 평가 시 명시적 Deny가 항상 우선 적용됩니다.
Principal
Principal은 권한을 부여하거나 거부할 대상을 의미합니다.
지정 가능한 대상 예:
- AWS 계정
- IAM 사용자
- IAM 역할
- AWS 서비스
- 익명 사용자 (*)
"Principal": {
"AWS": "arn:aws:iam::123456789012:user/Akua"
}
IAM 정책에서는 Principal을 사용하지 않으며,
버킷 정책과 Access Point 정책에서만 사용됩니다.
Action
Action은 허용 또는 거부할 S3 API 작업을 정의합니다.
주요 S3 Action 목록
| Action | 대상 리소스 | 설명 |
|---|---|---|
| s3:ListBucket | 버킷 | 버킷 내 객체 목록 조회 |
| s3:GetBucketLocation | 버킷 | 버킷의 리전 정보 조회 |
| s3:GetBucketPolicy | 버킷 | 버킷 정책 조회 |
| s3:PutBucketPolicy | 버킷 | 버킷 정책 설정 |
| s3:DeleteBucketPolicy | 버킷 | 버킷 정책 삭제 |
| s3:CreateBucket | 버킷 | 버킷 생성 |
| s3:DeleteBucket | 버킷 | 버킷 삭제 |
| s3:PutBucketAcl | 버킷 | 버킷 ACL 설정 |
| s3:GetBucketAcl | 버킷 | 버킷 ACL 조회 |
| s3:GetObject | 객체 | 객체 다운로드 |
| s3:PutObject | 객체 | 객체 업로드 |
| s3:DeleteObject | 객체 | 객체 삭제 |
| s3:HeadObject | 객체 | 객체 메타데이터 조회 |
| s3:GetObjectAcl | 객체 | 객체 ACL 조회 |
| s3:PutObjectAcl | 객체 | 객체 ACL 설정 |
| s3:AbortMultipartUpload | 객체 | 멀티파트 업로드 중단 |
| s3:ListBucketMultipartUploads | 버킷 | 진행 중인 멀티파트 업로드 목록 조회 |
| s3:ListMultipartUploadParts | 객체 | 멀티파트 업로드 파트 조회 |
Resource
Resource는 정책이 적용되는 S3 리소스를 지정합니다.
ARN(Amazon Resource Name) 형식을 사용합니다.
"Resource": [
"arn:aws:s3:::example-bucket",
"arn:aws:s3:::example-bucket/*"
]
Condition
Condition은 정책이 적용되는 추가 조건을 정의합니다.
자주 사용되는 조건 예:
- IP 주소 제한
- HTTPS 요청만 허용
- 특정 VPC 또는 VPC Endpoint 제한
- MFA 사용 여부
"Condition": {
"IpAddress": {
"aws:SourceIp": "1.0.1.0/24"
}
}
정책 예제
특정 IAM 사용자에게 버킷 목록 조회 및 객체 읽기 권한을 부여하는 예제입니다.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:user/Akua"
},
"Action": [
"s3:GetObject",
"s3:GetBucketLocation",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::example-bucket",
"arn:aws:s3:::example-bucket/*"
]
}
]
}
정책 평가 흐름 요약
S3 요청 처리 시 AWS는 다음 순서로 평가합니다.
- Block Public Access 설정
- 명시적 Deny 여부
- IAM 정책
- 버킷 정책
- ACL
- Condition
실무 권장 사항
- 최소 권한 원칙 적용
- 객체 수준과 버킷 수준 ARN 구분
- 퍼블릭 접근 시 조건 활용
- Block Public Access 기본 유지