【Security Hub修復手順】[ECR.5] ECR リポジトリはカスタマーマネージド AWS KMS keys で暗号化する必要があります
かつまたです。
本記事では、AWS Security HubによるAWS環境のセキュリティ状況スコアリングに該当する項目についての修復手順をご紹介します。
本記事の対象コントロール
[ECR.5] ECR リポジトリはカスタマーマネージド AWS KMS keys で暗号化する必要があります
[ECR.5] ECR repositories should be encrypted with customer managed AWS KMS keys
前提条件
本記事はAWS Security Hubで「AWS基礎セキュリティのベストプラクティススタンダード」を利用されている方向けの内容となります。
AWS Security Hubの詳細についてはこちらのブログをご覧ください。
対象コントロールの説明
このコントロールは、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と表示され、見分けがつきません。判別方法は後述の事前確認で紹介します。
暗号化設定は作成後に変更できません。
リポジトリの作成後にリポジトリの暗号化設定を変更することはできません。
そのため修復には、リポジトリの作り直しとイメージの移行が必要です。
対応が必要な理由
カスタマーマネージドキーにすると、キーポリシーによるアクセス制御(リポジトリポリシーと独立した二重の防御)、インシデント時のキー無効化によるアクセス遮断、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_MANAGER が CUSTOMER 以外のリポジトリがすべて修復対象です。AWS はKMS暗号化済みなのにFAILEDになっている、見落としやすいケースです。
事前準備: カスタマーマネージドキーを作成
利用可能なキーがすでにある場合は飛ばしてください。
- KMSコンソールの「カスタマー管理型のキー」から「キーの作成」を選択
- キーのタイプ「対称」、使用法「暗号化および復号化」で作成
- エイリアス(例:
ecr-encryption-key)を設定し、キーポリシーでイメージをプルする主体(ECSタスク実行ロールなど)にkms:Decryptを許可

リポジトリを作成するIAMプリンシパルには kms:CreateGrant、kms:RetireGrant、kms:DescribeKey が必要です。ECRサービスへのグラントはリポジトリ作成時に自動で作成されます。
手順A: 新しい名前のリポジトリへ移行
リポジトリ名を変更できる場合はこちらが安全です。移行完了まで元のリポジトリが残るため、切り戻しが容易です。
1. カスタマーマネージドキーを指定してリポジトリを作成
ECRコンソールの「リポジトリを作成」で「KMS暗号化」を有効にし、「カスタマイズ設定」で作成したキーを指定します。キーを指定しないとAWSマネージドキーが使われ、FAILEDのままになるためご注意ください。

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を新リポジトリに変更し、動作確認できたら旧リポジトリを削除します。

手順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_MANAGER が CUSTOMER になっていれば修復完了です。
最後に
今回は、AWS Security HubによるAWS環境のセキュリティ状況スコアリングに該当する項目についての修正手順をご紹介しました。
ECR.5は「AWSマネージドキーではPASSEDにならない」「修復にはリポジトリの作り直しが必要」という2つの落とし穴があるコントロールです。洗い出しの際はKMS側のキー管理者まで確認することをおすすめします。
ご覧いただきましてありがとうございました。




