説明
プライベート ECR リポジトリの許可ステートメントで Principal に * を指定すると、イメージを操作できる主体の範囲が広がるおそれがあります。実際の権限は、Action、Condition、明示的な拒否、適用される IAM ポリシーによって決まります。別のアカウントとの共有が必要な場合も、対象の主体と操作を必要な範囲に限定する必要があります。
AWS::ECR::Repository はプライベートリポジトリです。ワイルドカードのプリンシパルを使っても、公開 ECR リポジトリになったり、匿名でダウンロードできるようになったりするわけではありません。プライベートレジストリへの認証には、IAM ポリシーによる ecr:GetAuthorizationToken の許可が必要です。
想定される影響
- 意図しない主体にイメージの読み取りを許可すると、イメージ内のアプリケーションコードや構成情報が漏えいするおそれがあります。
- アップロードや削除も許可している場合、デプロイに使うイメージが変更されたり、必要なイメージを利用できなくなったりするおそれがあります。影響は実際に許可された操作によって異なります。
対処方法
- 必要な IAM ロール、ユーザー、アカウントだけをプリンシパルに指定し、
Actionを必要なリポジトリ操作に限定してください。ワイルドカードとConditionを組み合わせる場合は、意図したアクセス範囲に十分制限できているか確認してください。 - レジストリの認証権限や明示的な拒否を含め、適用されるポリシーをまとめて確認してください。クロスアカウントアクセスでは、呼び出し元の IAM 権限も確認してください。
- 既存リソースの論理 ID と更新の影響を確認してからポリシーを変更してください。必要なイメージ操作が成功し、意図しない主体からの要求が拒否されることをテストしてください。
例
以下は、リポジトリポリシーで許可する主体を比較する例です。論理 ID が異なるため、既存のスタックを更新する際は対象リソースの ID を維持してください。アカウントとユーザーの ARN は、実際に許可する主体に置き換えてください。Sid は AllowPushPull ですが、列挙された 3 つの操作はイメージの読み取りに使われます。認証権限と他のポリシーは別途構成する必要があります。
変更前
yaml
Resources:
MyRepository3:
Type: AWS::ECR::Repository
Properties:
RepositoryName: "test-repository"
RepositoryPolicyText:
Version: "2012-10-17"
Statement:
- Sid: AllowPushPull
Effect: Allow
Principal: "*"
Action:
- "ecr:GetDownloadUrlForLayer"
- "ecr:BatchGetImage"
- "ecr:BatchCheckLayerAvailability"
変更後
yaml
Resources:
MyRepository1:
Type: AWS::ECR::Repository
Properties:
RepositoryName: "test-repository"
RepositoryPolicyText:
Version: "2012-10-17"
Statement:
- Sid: AllowPushPull
Effect: Allow
Principal:
AWS:
- "arn:aws:iam::123456789012:user/Bob"
- "arn:aws:iam::123456789012:user/Alice"
Action:
- "ecr:GetDownloadUrlForLayer"
- "ecr:BatchGetImage"
- "ecr:BatchCheckLayerAvailability"
説明:
- 変更前: ステートメントのプリンシパルに
*を指定し、イメージの読み取りを許可する範囲を広げています。プライベートレジストリの認証と、他のポリシーによる制限は引き続き適用されます。 - 変更後: このステートメントのプリンシパルを 2 人の IAM ユーザーに限定します。ARN が意図したユーザーを指しているか、他のポリシーが不要な権限を追加していないか確認してください。