설명
S3 버킷 정책이 모든 주체에게 Get 계열 작업을 허용하면 의도하지 않은 사용자나 익명 요청에 정보가 공개될 수 있습니다. 실제 영향은 허용한 작업과 리소스에 따라 다릅니다. 예를 들어 s3:GetObject는 객체 내용을 읽고, s3:GetBucketLocation은 버킷의 리전 정보를 조회합니다.
조건, 명시적 거부, 퍼블릭 액세스 차단과 필요한 KMS 권한도 실제 접근을 제한할 수 있습니다. 읽기 허용 자체가 객체 수정이나 삭제 권한을 부여하는 것은 아닙니다.
잠재적 영향
- 객체 읽기가 실제로 허용되면 로그, 백업이나 배포 파일의 내용이 외부에 노출될 수 있습니다.
- 구성 정보 조회가 허용되면 내부 리소스에 관한 정보가 공개될 수 있습니다.
해결 방법
- 불필요한 전체 주체 허용을 제거하고 필요한 계정, 역할 또는 서비스 주체만 지정하세요.
- 작업에 맞는 리소스 ARN과 필요한 조건으로 범위를 제한하세요. 데이터를 의도적으로 공개하더라도 필요한 객체에 대한 읽기 작업만 허용하세요.
- 퍼블릭 액세스 차단과 다른 정책을 함께 검토하고, 필요한 접근은 성공하며 원하지 않는 접근은 거부되는지 확인하세요. 이미 공개되었다면 데이터와 접근 기록을 조사하세요.
예시
객체 읽기 권한을 비교하는 예제입니다. 실제로 사용할 수 있는 버킷 이름과 유효한 역할 ARN으로 바꾸고 다른 공개 접근 제어도 함께 구성하세요.
변경 전
hcl
resource "aws_s3_bucket" "data_bucket" {
bucket = "my-tf-test-bucket"
}
resource "aws_s3_bucket_policy" "data_bucket_policy" {
bucket = aws_s3_bucket.data_bucket.id
policy = <<POLICY
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my-tf-test-bucket/*"
}
]
}
POLICY
}
이 허용문은 버킷 안의 객체에 대한 s3:GetObject를 모든 주체에 부여합니다. 다른 제어가 막지 않으면 익명 요청에도 객체 내용이 공개될 수 있습니다.
변경 후
hcl
resource "aws_s3_bucket" "data_bucket" {
bucket = "my-tf-test-bucket"
}
resource "aws_s3_bucket_policy" "data_bucket_policy" {
bucket = aws_s3_bucket.data_bucket.id
policy = <<POLICY
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:role/app-reader"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my-tf-test-bucket/*"
}
]
}
POLICY
}
이 허용문의 주체를 app-reader 역할로 제한합니다. 해당 역할을 사용할 수 있는 주체와 다른 정책의 권한도 검토해야 하며, 이 변경만으로 기존의 모든 공개 경로가 사라지는 것은 아닙니다.