説明
ECR のリポジトリポリシーでは、リポジトリにアクセスできる主体と、許可する操作を指定します。許可するステートメントで Principal: "*" を使うと対象が広がるため、イメージを必要とするアカウントやロールにアクセスが十分に限定されているか確認してください。Ansible では、community.aws.ecs_ecr の policy パラメーターでこのポリシーを管理できます。
対象は ECR プライベートリポジトリのアクセスポリシーです。ワイルドカードを使っても ECR Public のリポジトリに変わるわけではなく、匿名でイメージをダウンロードできるわけでもありません。レジストリへの認証には IAM ポリシーによる ecr:GetAuthorizationToken の権限が必要です。実行できる操作は、適用されるポリシーと条件によって決まります。
想定される影響
- 意図しないプリンシパルが認証とポリシーの条件を満たし、イメージの読み取りを許可されると、コードや内部構成が露出する可能性があります。
- イメージのアップロードや削除も許可されていれば、不正な変更やサービスの運用に支障が生じる可能性があります。
対処方法
- 必要なアカウント、ロール、サービスプリンシパルを明示し、操作の範囲と条件を確認してください。イメージを取得するだけのロールに、アップロードや削除の権限まで与えないでください。
- レジストリへの認証権限とリポジトリでの操作権限を合わせて確認してください。クロスアカウントアクセスでは、呼び出し元側の権限も確認が必要です。
- 条件でアクセスを制限する場合は、想定したリクエストやアクセス主体にその条件が適用されるか確認してください。変更後は、必要なイメージの取得やデプロイが引き続き動作することをテストしてください。
例
以下はプリンシパルの範囲の違いを示す例です。アカウントとロールの ARN は実際の値に置き換え、呼び出し元の権限を別途設定してください。既存の例にある 2008-10-17 は古いポリシー言語バージョンです。新規作成や更新時には 2012-10-17 を使用してください。
変更前
yaml
- name: set-policy as object
community.aws.ecs_ecr:
name: needs-policy-object
policy:
Version: "2008-10-17"
Statement:
- Sid: read-only
Effect: Allow
Principal: "*"
Action:
- ecr:GetDownloadUrlForLayer
- ecr:BatchGetImage
- ecr:BatchCheckLayerAvailability
変更後
yaml
- name: set restricted policy
community.aws.ecs_ecr:
name: backend-api
policy:
Version: "2008-10-17"
Statement:
- Sid: ci-read-only
Effect: Allow
Principal:
AWS: "arn:aws:iam::123456789012:role/ci-ecr-reader"
Action:
- ecr:GetDownloadUrlForLayer
- ecr:BatchGetImage
- ecr:BatchCheckLayerAvailability
補足:
- 変更前:
Principal: "*"とイメージの読み取り操作を指定しています。実際のダウンロードには、認証と関連する権限が必要です。 - 変更後: 特定の IAM ロールを指定し、イメージの読み取り操作だけを許可しています。このポリシーと合わせて適用される IAM ポリシーや条件を確認し、実際のアクセス範囲が意図したとおりか検証してください。