작업과 접근 주체에 와일드카드를 사용하는 S3 버킷 정책

S3 정책의 작업과 접근 주체에 와일드카드를 쓰면 필요한 범위를 넘어 권한을 부여할 수 있습니다. 실제 작업과 리소스, 조건을 확인하고 최소 권한으로 제한하세요.

설명

정책의 Action과 Principal에 와일드카드를 사용하면 의도하지 않은 작업이나 주체까지 허용할 수 있습니다. s3:*는 모든 S3 작업을 나타내지만 s3:Get*는 일부 작업만 나타냅니다. 실제 권한은 Resource, 조건, 명시적 거부와 공개 접근 차단(Block Public Access)에도 좌우됩니다. 객체 ARN만 지정한 정책이 모든 버킷 관리 작업을 허용하는 것은 아닙니다.

잠재적 영향

  • 읽기 권한이 허용되면 접근할 필요가 없는 주체에게 객체 내용이 노출될 수 있습니다.
  • 쓰기나 삭제가 허용되면 원치 않는 업로드, 객체 내용 변경이나 데이터 손실로 이어질 수 있습니다.
  • 과도한 권한은 저장소를 사용하는 배포와 서비스 운영을 방해할 수 있습니다. 영향은 실제 허용 작업과 대상 리소스에 따라 달라집니다.

해결 방법

  • 필요한 작업, 주체와 리소스 ARN을 각각 명시하고 불필요한 와일드카드를 좁히세요. 공개 읽기가 필요한 경우에도 쓰기와 관리 권한은 별도로 제한하세요.
  • 조건, 명시적 거부와 계정·버킷의 공개 접근 차단을 함께 확인하세요. private ACL은 버킷 정책이 허용하는 접근을 취소하지 않습니다.
  • 사용하는 공급자와 모듈에 맞게 정책을 적용하세요. S3 모듈 3.7.0의 사용자 지정 정책은 attach_policy = true여야 반영됩니다. 변경 후 필요한 접근은 유지되고 승인하지 않은 접근은 거부되는지 시험하세요.

이전 형식의 정책 예시

두 예시는 와일드카드의 범위 차이를 보여 주는 이전 인라인 형식입니다. AWS 공급자 4.2.0은 policy와 acl을 읽기 전용으로 문서화하므로 해당 버전에서는 별도 정책 리소스를 사용해야 합니다. 현재 새 버킷의 객체 소유권과 공개 접근 차단 요건도 확인하세요. 이름은 사용 가능한 고유한 값으로 바꾸고 두 구성을 함께 적용하지 마세요.

모든 객체 작업을 허용하는 정책

hcl
resource "aws_s3_bucket" "open_bucket" {
  bucket = "example-s3b-181355"
  acl    = "private"

  policy = <<EOF
  {
    "Id": "id113",
    "Version": "2012-10-17",
    "Statement": [
      {
        "Action": [
          "s3:*"
        ],
        "Effect": "Allow",
        "Resource": "arn:aws:s3:::example-s3b-181355/*",
        "Principal": "*"
      }
    ]
  }
  EOF
}

객체 ARN 범위에서 모든 S3 작업을 와일드카드 주체에 허용합니다. acl = "private"만으로 이 정책의 허용이 취소되지는 않습니다. 버킷 관리 작업까지 모두 허용하는 정책과는 구분해야 합니다.

객체 쓰기로 작업만 줄인 정책

hcl
resource "aws_s3_bucket" "restricted_bucket" {
  bucket = "example-s3b-181355"
  acl    = "private"

  policy = <<EOF
  {
    "Id": "id113",
    "Version": "2012-10-17",
    "Statement": [
      {
        "Action": [
          "s3:putObject"
        ],
        "Effect": "Allow",
        "Resource": "arn:aws:s3:::example-s3b-181355/*",
        "Principal": "*"
      }
    ]
  }
  EOF
}

작업 범위는 줄었지만 Principal: "*"에 객체 쓰기를 허용하는 점은 그대로입니다. AWS 작업 이름은 대소문자를 구분하지 않으므로 s3:putObject도 쓰기 권한입니다. 이는 공개 쓰기를 해결한 구성이 아니며, 승인된 주체와 필요한 객체 범위로 추가 제한해야 합니다.

참조