설명
정책의 Action과 Principal에 와일드카드를 사용하면 의도하지 않은 작업이나 주체까지 허용할 수 있습니다. s3:*는 모든 S3 작업을 나타내지만 s3:Get*는 일부 작업만 나타냅니다. 실제 권한은 Resource, 조건, 명시적 거부와 공개 접근 차단(Block Public Access)에도 좌우됩니다. 객체 ARN만 지정한 정책이 모든 버킷 관리 작업을 허용하는 것은 아닙니다.
잠재적 영향
- 읽기 권한이 허용되면 접근할 필요가 없는 주체에게 객체 내용이 노출될 수 있습니다.
- 쓰기나 삭제가 허용되면 원치 않는 업로드, 객체 내용 변경이나 데이터 손실로 이어질 수 있습니다.
- 과도한 권한은 저장소를 사용하는 배포와 서비스 운영을 방해할 수 있습니다. 영향은 실제 허용 작업과 대상 리소스에 따라 달라집니다.
해결 방법
- 필요한 작업, 주체와 리소스 ARN을 각각 명시하고 불필요한 와일드카드를 좁히세요. 공개 읽기가 필요한 경우에도 쓰기와 관리 권한은 별도로 제한하세요.
- 조건, 명시적 거부와 계정·버킷의 공개 접근 차단을 함께 확인하세요.
privateACL은 버킷 정책이 허용하는 접근을 취소하지 않습니다. - 사용하는 공급자와 모듈에 맞게 정책을 적용하세요. S3 모듈 3.7.0의 사용자 지정 정책은
attach_policy = true여야 반영됩니다. 변경 후 필요한 접근은 유지되고 승인하지 않은 접근은 거부되는지 시험하세요.
이전 형식의 정책 예시
두 예시는 와일드카드의 범위 차이를 보여 주는 이전 인라인 형식입니다. AWS 공급자 4.2.0은 policy와 acl을 읽기 전용으로 문서화하므로 해당 버전에서는 별도 정책 리소스를 사용해야 합니다. 현재 새 버킷의 객체 소유권과 공개 접근 차단 요건도 확인하세요. 이름은 사용 가능한 고유한 값으로 바꾸고 두 구성을 함께 적용하지 마세요.
모든 객체 작업을 허용하는 정책
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"만으로 이 정책의 허용이 취소되지는 않습니다. 버킷 관리 작업까지 모두 허용하는 정책과는 구분해야 합니다.
객체 쓰기로 작업만 줄인 정책
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도 쓰기 권한입니다. 이는 공개 쓰기를 해결한 구성이 아니며, 승인된 주체와 필요한 객체 범위로 추가 제한해야 합니다.