ワイルドカードのプリンシパルを使用する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
}

承認済みロールに、イメージ取得に必要な操作だけを許可しています。そのロールの認証権限と、ほかに適用されるポリシーも確認してください。

参考資料