WRITE_ACP 권한을 지정한 S3 버킷 ACL

S3 버킷 ACL의 WRITE_ACP는 ACL 변경 권한입니다. 권한 수신자와 관리 필요성을 확인하고, 불필요한 권한을 제거하면서 필수 접근을 유지하세요.

설명

버킷 ACL의 WRITE_ACP는 그 버킷의 ACL을 수정하는 권한입니다. 객체 업로드나 내용 변경 권한과는 다르며, ACL 관리가 필요 없는 계정이나 그룹에 부여하면 의도하지 않은 권한 변경을 허용할 수 있습니다. 권한 수신자가 버킷 소유자인지, 외부 계정인지, S3 서비스 그룹인지 확인해야 합니다.

ACL은 AWS 계정이나 미리 정의된 S3 그룹에 권한을 부여하며, 개별 IAM 사용자에게 직접 부여하는 방식은 아닙니다. 권한을 받은 계정은 계정 내 사용자에게 그 권한을 위임할 수 있습니다. FULL_CONTROL에도 ACL 변경 권한이 포함되므로 전체 권한을 함께 검토하세요. 새 버킷의 기본값인 BucketOwnerEnforced에서는 ACL이 비활성화되어 정책으로 접근을 관리합니다.

잠재적 영향

  • 불필요한 ACL 관리 권한으로 추가 접근을 허용하거나 기존 권한을 변경할 수 있습니다. 실제 영향은 권한 수신자, 관련 정책과 공개 접근 차단에 따라 달라집니다.
  • 잘못된 ACL 변경은 정상 사용자의 접근이나 로그 전달을 방해할 수 있습니다. 특정 서비스 그룹에 부여한 권한을 모든 익명 사용자에게 부여한 권한으로 해석해서는 안 됩니다.

해결 방법

  • 각 권한 수신자의 업무상 필요를 확인하고 불필요한 WRITE_ACP를 제거하세요. 소유자에게 필요한 관리 권한은 유지하고, 다른 수신자에게 더 넓은 FULL_CONTROL을 대신 부여하지 마세요.
  • 가능하면 ACL에 의존하는 접근을 정책으로 옮기고 BucketOwnerEnforced로 ACL을 비활성화하세요. 기존 버킷은 먼저 ACL의 외부 권한을 정리해야 합니다.
  • S3 서버 액세스 로그는 버킷 정책으로 로그 전달 서비스에 필요한 권한을 부여하는 방식을 우선 사용하세요. ACL 방식이 계속 필요한 경우 LogDelivery에는 WRITE와 READ_ACP가 필요하며, WRITE_ACP는 로그 업로드 권한을 대신하지 못합니다.

예시

다음은 ACL을 유지해야 하는 환경의 대안 구성이며, 둘을 함께 적용하지 않습니다. 버킷 이름을 사용 가능한 고유한 이름으로 바꾸세요. 로그를 보내는 버킷과 로그 설정은 별도로 필요합니다. 새 구성을 설계할 때는 ACL 비활성화와 버킷 정책 방식을 우선 선택하세요.

로그 전달 그룹에 ACL 변경 권한 부여

hcl
data "aws_canonical_user_id" "current" {}

resource "aws_s3_bucket" "example" {
  bucket = "my-tf-example-bucket"
}

resource "aws_s3_bucket_ownership_controls" "example" {
  bucket = aws_s3_bucket.example.id
  rule {
    object_ownership = "BucketOwnerPreferred"
  }
}

resource "aws_s3_bucket_acl" "example" {
  depends_on = [aws_s3_bucket_ownership_controls.example]
  bucket     = aws_s3_bucket.example.id
  access_control_policy {
    grant {
      grantee {
        id   = data.aws_canonical_user_id.current.id
        type = "CanonicalUser"
      }
      permission = "FULL_CONTROL"
    }

    grant {
      grantee {
        type = "Group"
        uri  = "http://acs.amazonaws.com/groups/s3/LogDelivery"
      }
      permission = "WRITE_ACP"
    }

    owner {
      id = data.aws_canonical_user_id.current.id
    }
  }
}

LogDelivery는 모든 익명 사용자가 아니라 S3 로그 전달 그룹입니다. 이 구성은 그 그룹에 불필요한 ACL 변경 권한을 부여하지만 실제 로그 쓰기에 필요한 WRITE와 READ_ACP는 제공하지 않습니다.

로그 전달에 필요한 ACL 권한

hcl
data "aws_canonical_user_id" "current" {}

resource "aws_s3_bucket" "example" {
  bucket = "my-tf-example-bucket"
}

resource "aws_s3_bucket_ownership_controls" "example" {
  bucket = aws_s3_bucket.example.id
  rule {
    object_ownership = "BucketOwnerPreferred"
  }
}

resource "aws_s3_bucket_acl" "example" {
  depends_on = [aws_s3_bucket_ownership_controls.example]
  bucket     = aws_s3_bucket.example.id
  access_control_policy {
    grant {
      grantee {
        id   = data.aws_canonical_user_id.current.id
        type = "CanonicalUser"
      }
      permission = "FULL_CONTROL"
    }

    grant {
      grantee {
        type = "Group"
        uri  = "http://acs.amazonaws.com/groups/s3/LogDelivery"
      }
      permission = "WRITE"
    }

    grant {
      grantee {
        type = "Group"
        uri  = "http://acs.amazonaws.com/groups/s3/LogDelivery"
      }
      permission = "READ_ACP"
    }

    owner {
      id = data.aws_canonical_user_id.current.id
    }
  }
}

소유자의 FULL_CONTROL을 유지하고 로그 전달 그룹에는 WRITE와 READ_ACP만 부여합니다. 객체 소유권 설정과 명시적 의존성으로 ACL 활성화를 먼저 적용합니다. 이는 권한 구성 예시이며 로그 전달을 활성화하는 전체 구성은 아닙니다. 원본과 대상 버킷은 같은 계정과 리전에 있어야 하며, 대상 버킷의 암호화와 기타 로그 전달 요건도 확인하세요.

참조