와일드카드 주체와 Put 작업을 지정한 S3 버킷 정책

와일드카드 주체에 S3 Put 작업을 허용하면 불필요한 업로드나 설정 변경을 허용할 수 있습니다. 작업별로 필요한 역할과 리소스를 제한하고 실제 접근 제어를 확인하세요.

설명

와일드카드 주체에 Put 작업을 허용하면 의도한 사용자나 서비스보다 넓은 범위에 쓰기 권한을 줄 수 있습니다. Put 작업에는 객체 업로드뿐 아니라 ACL 등 설정 변경도 포함됩니다. 실제 접근은 작업, 리소스 ARN, 조건, 명시적 거부와 공개 접근 차단(Block Public Access)에 따라 달라집니다.

PutObject가 허용되면 새 객체를 추가하거나 같은 키의 현재 내용을 바꿀 수 있습니다. 버전 관리가 활성화된 버킷에서는 같은 키에 새 버전이 만들어집니다. 이전 버전이 남더라도 현재 내용을 사용하는 애플리케이션은 변경된 데이터를 읽을 수 있습니다.

잠재적 영향

  • 업로드 권한이 필요 없는 주체가 객체를 추가하여 저장 비용이 늘거나 원치 않는 콘텐츠가 유입될 수 있습니다.
  • 같은 키에 쓰기가 허용되면 애플리케이션이나 배포 시스템이 읽는 현재 내용이 바뀔 수 있습니다.
  • 설정 변경 작업까지 허용하면 접근 제어나 운영 설정이 달라질 수 있습니다. 단순 업로드 권한과 관리 권한을 구분해야 합니다.

해결 방법

  • 업로드와 설정 변경을 각각 필요한 역할과 작업으로 제한하고, 적절한 버킷 또는 객체 ARN을 지정하세요. 공개 읽기가 필요하다고 쓰기까지 공개하지 마세요.
  • 전체 정책의 조건과 명시적 거부, ACL, 공개 접근 차단을 함께 검토하세요. 모듈이 실제로 정책을 적용하는지도 확인하세요. S3 모듈 3.7.0의 사용자 지정 정책에는 attach_policy = true가 필요합니다.
  • 정상 업로드와 승인하지 않은 쓰기 요청을 시험하고, 버전 관리와 복구 절차를 확인하세요. 업로드만 필요한 역할에 ACL이나 버킷 정책 관리 권한을 부여하지 마세요.

예시

aws_s3_bucket.example은 별도로 정의해야 합니다. 203.0.113.10/32는 설명용 주소이며 실제 출발지 주소로 바꾸세요. 두 예시는 서로 다른 정책 구성이므로 같은 버킷에 함께 적용하지 않습니다.

IP 조건이 있는 객체 쓰기 허용

hcl
resource "aws_s3_bucket_policy" "put_open_policy" {
  bucket = aws_s3_bucket.example.id

  policy = <<POLICY
{
  "Version": "2012-10-17",
  "Id": "MYBUCKETPOLICY",
  "Statement": [
    {
      "Sid": "IPAllow",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:PutObject",
      "Resource": "${aws_s3_bucket.example.arn}/*",
      "Condition": {
         "IpAddress": {"aws:SourceIp": "203.0.113.10/32"}
      }
    }
  ]
}
POLICY
}

IP 조건은 적용되는 요청을 제한하지만 업로드 주체를 특정 역할로 제한하지는 않습니다. 같은 출발지 주소를 공유하는 사용자에게도 불필요한 쓰기를 허용할 수 있으므로 승인된 역할을 지정하세요.

IP 조건이 있는 명시적 거부

hcl
resource "aws_s3_bucket_policy" "put_restricted_policy" {
  bucket = aws_s3_bucket.example.id

  policy = <<POLICY
{
  "Version": "2012-10-17",
  "Id": "MYBUCKETPOLICY",
  "Statement": [
    {
      "Sid": "IPDeny",
      "Effect": "Deny",
      "Principal": "*",
      "Action": "s3:*",
      "Resource": "${aws_s3_bucket.example.arn}/*",
      "Condition": {
         "IpAddress": {"aws:SourceIp": "203.0.113.10/32"}
      }
    }
  ]
}
POLICY
}

이 거부는 지정한 IP에서 오는 객체 작업에만 적용되며 다른 출발지의 쓰기 권한을 제한하지 않습니다. 필요한 업로드 주체를 지정하는 조치를 대신하지 않으며, 정상 요청도 막을 수 있으므로 전체 허용·거부 정책과 함께 검토하세요.

참조