와일드카드 주체를 사용하는 ECR 리포지토리 정책

ECR 리포지토리의 와일드카드 주체가 의도하지 않은 계정에 권한을 부여하지 않는지 확인하고 필요한 역할과 작업으로 제한하세요.

설명

ECR 리포지토리 정책의 Principal: "*"는 접근 주체를 특정 계정이나 역할로 제한하지 않습니다. Effect: "Allow"와 넓은 작업 범위를 함께 사용하면 의도하지 않은 주체에게 이미지나 리포지토리 관리 권한을 부여할 수 있습니다. 실제 권한은 정책 조건, 관련 IAM 정책과 명시적 거부도 함께 고려해야 합니다.

프라이빗 ECR 리포지토리는 Amazon ECR Public과 다릅니다. 이미지를 가져오거나 올리려면 인증과 IAM 정책의 ecr:GetAuthorizationToken 권한이 필요하므로, 와일드카드 주체가 익명 이미지 접근을 뜻하지는 않습니다.

잠재적 영향

  • 읽기 권한이 필요 없는 외부 주체가 내부용 이미지를 가져갈 수 있습니다.
  • 불필요한 업로드, 이미지 삭제나 정책 관리 권한은 배포 중단 또는 의도하지 않은 접근 권한 확대로 이어질 수 있습니다. 영향은 실제 허용된 작업에 따라 달라집니다.

해결 방법

  • 필요한 계정과 역할을 명시하고 이미지 가져오기, 업로드, 삭제, 정책 관리 권한을 각각 필요한 주체에만 부여하세요. 조건으로 제한하는 정책은 그 조건도 검토하세요.
  • 전체 리포지토리 정책과 관련 IAM 정책을 함께 확인하세요. 계정의 :root ARN은 해당 계정에 권한을 위임하며 루트 사용자에게만 접근을 제한하지 않습니다.
  • 변경 후 배포 시스템의 필요한 접근이 유지되고 승인하지 않은 주체의 접근은 거부되는지 확인하세요.

예시

아래 예시는 넓은 권한을 특정 역할의 이미지 읽기로 줄이는 구성을 보여 줍니다. trusted_role_arn 변수를 정의하고 실제로 존재하는 승인된 역할의 ARN을 지정하세요.

변경 전

hcl
resource "aws_ecr_repository" "public_example" {
  name = "public-example"
}

resource "aws_ecr_repository_policy" "public_policy" {
  repository = aws_ecr_repository.public_example.name

  policy = <<EOF
{
    "Version": "2008-10-17",
    "Statement": [
        {
            "Sid": "RepositoryAccess",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "ecr:GetDownloadUrlForLayer",
                "ecr:BatchGetImage",
                "ecr:BatchCheckLayerAvailability",
                "ecr:PutImage",
                "ecr:InitiateLayerUpload",
                "ecr:UploadLayerPart",
                "ecr:CompleteLayerUpload",
                "ecr:DescribeRepositories",
                "ecr:GetRepositoryPolicy",
                "ecr:ListImages",
                "ecr:DeleteRepository",
                "ecr:BatchDeleteImage",
                "ecr:SetRepositoryPolicy",
                "ecr:DeleteRepositoryPolicy"
            ]
        }
    ]
}
EOF
}

모든 주체에 이미지 읽기뿐 아니라 업로드, 삭제와 정책 관리 작업도 허용합니다. 프라이빗 레지스트리의 인증 요건은 그대로 적용됩니다.

변경 후

hcl
resource "aws_ecr_repository" "private_example" {
  name = "private-example"
}

resource "aws_ecr_repository_policy" "private_policy" {
  repository = aws_ecr_repository.private_example.name

  policy = <<EOF
{
    "Version": "2008-10-17",
    "Statement": [
        {
            "Sid": "ImageRead",
            "Effect": "Allow",
            "Principal": {
                "AWS": "${var.trusted_role_arn}"
            },
            "Action": [
                "ecr:GetDownloadUrlForLayer",
                "ecr:BatchGetImage",
                "ecr:BatchCheckLayerAvailability"
            ]
        }
    ]
}
EOF
}

승인된 역할에 이미지 가져오기에 필요한 작업만 부여합니다. 이 역할의 인증 권한과 다른 정책도 함께 확인하세요.

참조