모든 주체에게 Get 권한을 허용하는 S3 버킷 정책

S3 정책의 Get 권한을 필요한 주체와 리소스로 제한하고 실제 공개 범위를 확인하세요.

설명

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 역할로 제한합니다. 해당 역할을 사용할 수 있는 주체와 다른 정책의 권한도 검토해야 하며, 이 변경만으로 기존의 모든 공개 경로가 사라지는 것은 아닙니다.

참조