【Security Hub修復手順】[ECR.5] ECR リポジトリはカスタマーマネージド AWS KMS keys で暗号化する必要があります

【Security Hub修復手順】[ECR.5] ECR リポジトリはカスタマーマネージド AWS KMS keys で暗号化する必要があります

AWS Security HubのECR.5コントロール対応について、カスタマーマネージドキーによる暗号化が必須な理由と、見落としやすいAWSマネージドキーとの判別方法から修復手順まで、実践的な対応策をご紹介します。
2026.08.30

かつまたです。

本記事では、AWS Security HubによるAWS環境のセキュリティ状況スコアリングに該当する項目についての修復手順をご紹介します。

本記事の対象コントロール

[ECR.5] ECR リポジトリはカスタマーマネージド AWS KMS keys で暗号化する必要があります

[ECR.5] ECR repositories should be encrypted with customer managed AWS KMS keys

https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/ecr-controls.html#ecr-5

前提条件

本記事はAWS Security Hubで「AWS基礎セキュリティのベストプラクティススタンダード」を利用されている方向けの内容となります。
AWS Security Hubの詳細についてはこちらのブログをご覧ください。

https://dev.classmethod.jp/articles/lets-learn-aws-security-hub/

https://dev.classmethod.jp/articles/aws-security-operation-with-securityhub-2021/

対象コントロールの説明

このコントロールは、ECRプライベートリポジトリがカスタマーマネージドキーで暗号化されているかチェックします。
カスタマーマネージドキーを指定してリポジトリを作成すると、このコントロールは成功します。

暗号化タイプ 使用するキー ECR.5の判定
SSE-S3(デフォルト) Amazon S3マネージドキー(AES-256) FAILED
SSE-KMS AWSマネージドキー(aws/ecr FAILED
SSE-KMS カスタマーマネージドキー PASSED

注意点は2つです。

AWSマネージドキーで暗号化してもFAILEDになります。 「KMSで暗号化しているから大丈夫」とはならず、カスタマーマネージドキーであることが要件です。しかもECRの設定表示ではどちらも encryptionType: KMS +キーARNと表示され、見分けがつきません。判別方法は後述の事前確認で紹介します。

暗号化設定は作成後に変更できません。

リポジトリの作成後にリポジトリの暗号化設定を変更することはできません。

https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/encryption-at-rest.html

そのため修復には、リポジトリの作り直しとイメージの移行が必要です。

対応が必要な理由

カスタマーマネージドキーにすると、キーポリシーによるアクセス制御(リポジトリポリシーと独立した二重の防御)、インシデント時のキー無効化によるアクセス遮断、CloudTrailによる復号操作の監査が可能になります。
コンテナイメージにはソースコードや設定ファイルが含まれるため、本番環境では対応が必須です。

本番以外の環境では、キーの料金(1キーあたり月額1USD)と作り直しの手間を考慮し、対応は必須ではありません。

修復手順

事前確認: 修復対象のリポジトリを洗い出す

AWSマネージドキーとカスタマーマネージドキーは、KMS側のキー管理者(KeyManager)で判別します。AWS CloudShellで以下を実行します。

export AWS_PAGER=""
REGION="ap-northeast-1"

printf "%-30s %-10s %s\n" "REPOSITORY" "TYPE" "KEY_MANAGER"
for r in $(aws ecr describe-repositories --region $REGION --query 'repositories[].repositoryName' --output text); do
  enc=$(aws ecr describe-repositories --repository-names "$r" --region $REGION \
        --query 'repositories[0].encryptionConfiguration.[encryptionType,kmsKey]' --output text)
  type=$(echo "$enc" | awk '{print $1}'); key=$(echo "$enc" | awk '{print $2}')
  if [ "$key" = "None" ]; then mgr="-"; else
    mgr=$(aws kms describe-key --key-id "$key" --region $REGION --query 'KeyMetadata.KeyManager' --output text); fi
  printf "%-30s %-10s %s\n" "$r" "$type" "$mgr"
done
REPOSITORY                     TYPE       KEY_MANAGER
ecr5-default                   AES256     -
ecr5-awsmanaged                KMS        AWS
ecr5-cmk                       KMS        CUSTOMER

KEY_MANAGERCUSTOMER 以外のリポジトリがすべて修復対象です。AWS はKMS暗号化済みなのにFAILEDになっている、見落としやすいケースです。

事前準備: カスタマーマネージドキーを作成

利用可能なキーがすでにある場合は飛ばしてください。

  1. KMSコンソールの「カスタマー管理型のキー」から「キーの作成」を選択
  2. キーのタイプ「対称」、使用法「暗号化および復号化」で作成
  3. エイリアス(例: ecr-encryption-key)を設定し、キーポリシーでイメージをプルする主体(ECSタスク実行ロールなど)に kms:Decrypt を許可

image.png

リポジトリを作成するIAMプリンシパルには kms:CreateGrantkms:RetireGrantkms:DescribeKey が必要です。ECRサービスへのグラントはリポジトリ作成時に自動で作成されます。

手順A: 新しい名前のリポジトリへ移行

リポジトリ名を変更できる場合はこちらが安全です。移行完了まで元のリポジトリが残るため、切り戻しが容易です。

1. カスタマーマネージドキーを指定してリポジトリを作成

ECRコンソールの「リポジトリを作成」で「KMS暗号化」を有効にし、「カスタマイズ設定」で作成したキーを指定します。キーを指定しないとAWSマネージドキーが使われ、FAILEDのままになるためご注意ください。

image.png

CLIの場合は以下です。

aws ecr create-repository \
  --repository-name my-app-encrypted \
  --region $REGION \
  --encryption-configuration encryptionType=KMS,kmsKey=<キーID または キーARN>

2. イメージを移行

CloudShellにはDockerが導入済みのため、そのまま実行できます。

ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
REGISTRY="$ACCOUNT_ID.dkr.ecr.$REGION.amazonaws.com"
SRC="my-app"
DST="my-app-encrypted"

aws ecr get-login-password --region $REGION | docker login --username AWS --password-stdin $REGISTRY

for tag in $(aws ecr list-images --repository-name $SRC --region $REGION \
             --filter tagStatus=TAGGED --query 'imageIds[].imageTag' --output text); do
  docker pull $REGISTRY/$SRC:$tag
  docker tag $REGISTRY/$SRC:$tag $REGISTRY/$DST:$tag
  docker push $REGISTRY/$DST:$tag
done

移行後、aws ecr describe-images でイメージダイジェストが移行元と一致することを確認します。暗号化方式が変わってもイメージの中身は変わらないため、ダイジェストは完全に一致します。

3. 参照元を切り替えて旧リポジトリを削除

タスク定義やCI/CDのイメージURIを新リポジトリに変更し、動作確認できたら旧リポジトリを削除します。

image.png

手順B: 同じリポジトリ名を維持したい場合

リポジトリ名を変えられない場合は、一時リポジトリへ退避してから同名で作り直します。
削除から書き戻し完了までイメージをプルできません。 メンテナンスウィンドウを確保して実施してください。

SRC="my-app"
TMP="my-app-temp"

# 1. 一時リポジトリへ全タグを退避
aws ecr create-repository --repository-name $TMP --region $REGION
for tag in $(aws ecr list-images --repository-name $SRC --region $REGION \
             --filter tagStatus=TAGGED --query 'imageIds[].imageTag' --output text); do
  docker pull $REGISTRY/$SRC:$tag
  docker tag $REGISTRY/$SRC:$tag $REGISTRY/$TMP:$tag
  docker push $REGISTRY/$TMP:$tag
done

# 2. 退避を確認してから削除し、同名+カスタマーマネージドキーで再作成
aws ecr list-images --repository-name $TMP --region $REGION --query 'imageIds[].imageTag' --output text
aws ecr delete-repository --repository-name $SRC --force --region $REGION
aws ecr create-repository \
  --repository-name $SRC \
  --region $REGION \
  --encryption-configuration encryptionType=KMS,kmsKey=<キーID または キーARN>

# 3. 書き戻し
for tag in $(aws ecr list-images --repository-name $TMP --region $REGION \
             --filter tagStatus=TAGGED --query 'imageIds[].imageTag' --output text); do
  docker tag $REGISTRY/$TMP:$tag $REGISTRY/$SRC:$tag
  docker push $REGISTRY/$SRC:$tag
done

# 4. 一時リポジトリを削除
aws ecr delete-repository --repository-name $TMP --force --region $REGION

修復後の確認

事前確認のコマンドを再実行し、対象リポジトリの KEY_MANAGERCUSTOMER になっていれば修復完了です。

最後に

今回は、AWS Security HubによるAWS環境のセキュリティ状況スコアリングに該当する項目についての修正手順をご紹介しました。

ECR.5は「AWSマネージドキーではPASSEDにならない」「修復にはリポジトリの作り直しが必要」という2つの落とし穴があるコントロールです。洗い出しの際はKMS側のキー管理者まで確認することをおすすめします。

ご覧いただきましてありがとうございました。


AWS Security Hub 「基礎セキュリティのベストプラクティス」シリーズをご覧のあなたに特報!

本シリーズで紹介している各チェック項目(コントロール)について、推奨される対応方法や見解のまとめは、クラスメソッド経由でAWSをご活用されているお客様向けに特別公開しております。この機会にぜひ併せてご検討ください。

クラスメソッドのAWS総合支援を見る

何が提供されるの?

この記事をシェアする

AWSのお困り事はクラスメソッドへ

関連記事