ECRのプライベートリポジトリにおけるイメージスキャニングの設定について

このブログシリーズ 「クラウドセキュリティ 実践集」 では、一般的なセキュリティ課題を取り上げ、「なぜ危険なのか?」 というリスクの解説から、「どうやって直すのか?」 という具体的な修復手順(コンソール、AWS CLI、Terraformなど)まで、分かりやすく解説します。
今回は、Amazon ECR (Elastic Container Registry) のプライベートリポジトリで イメージプッシュ時の自動脆弱性スキャンが有効になっていない 状態について、そのリスクと対策を解説します。

ポリシーの説明
Amazon ECR の Security Hub コントロール – AWS Security Hub
[ECR.1] ECR プライベートリポジトリでは、イメージスキャニングが設定されている必要があります
このコントロールは、プライベート Amazon ECR リポジトリでイメージスキャニングが設定されているかどうかをチェックします。プライベート ECR リポジトリがプッシュ時スキャンまたは連続スキャン用に設定されていない場合、コントロールは失敗します。
リスク
Amazon ECRは、Dockerコンテナイメージを簡単に保存、管理、デプロイできるフルマネージド型のDockerコンテナレジストリサービスです。ECRに保存されるコンテナイメージは、アプリケーションの基盤となることが多いため、そのイメージにソフトウェアの脆弱性が含まれていると、以下のような重大なセキュリティリスクが発生します。
- 既知の脆弱性を含むコンテナのデプロイ: 自動脆弱性スキャンが有効になっていない場合、開発者が意図せず、または認識せずに、既知の脆弱性(Common Vulnerabilities and Exposures, CVE)を含むライブラリやコンポーネントが組み込まれたコンテナイメージをプッシュしてしまう可能性があります。これにより、本番環境にデプロイされたアプリケーションが、これらの脆弱性を悪用した攻撃の対象となり、データ漏洩、システム侵害、サービス停止につながるリスクが高まります。
- サプライチェーン攻撃の起点: コンテナイメージは、複数のレイヤー(OS、ミドルウェア、アプリケーションコード、依存関係)で構成されます。これらのレイヤーのいずれかに脆弱性が存在すると、それがサプライチェーン攻撃の起点となる可能性があります。スキャンがなければ、このリスクを早期に特定できません。
- 手動スキャンの漏れと非効率性: 自動スキャンがない場合、脆弱性のチェックは手動プロセスに依存することになります。これは、手間がかかり、見落としが発生しやすく、コンテナイメージの更新頻度が高い環境では非効率的です。結果として、既知の脆弱性が長期間放置されることになりかねません。
- セキュリティ状況の可視性不足: コンテナイメージの脆弱性に関する詳細なレポートがないため、組織全体のセキュリティ状況を正確に把握できません。これにより、セキュリティリスクの優先順位付けや、脆弱性に対する効果的な修正計画の策定が困難になります。
対策
ECRプライベートリポジトリでイメージプッシュ時の自動脆弱性スキャンを有効にすることは、コンテナイメージのセキュリティを確保し、本番環境への安全なデプロイを促進するための重要なベストプラクティスです。
- 基本的なスキャンの有効化: ECRは、オープンソースのClairプロジェクトを活用し、CVEデータベースに基づいて脆弱性スキャンを実行します。リポジトリ設定でこれを有効にするだけで、イメージがプッシュされるたびに自動的にスキャンが実行されます。
- スキャン結果の確認と対応: スキャンが完了すると、ECRは検出された脆弱性のリスト(CVE-ID、深刻度、修正バージョンなど)を表示します。これらの結果を定期的に確認し、高深刻度の脆弱性から優先的に修正計画を立て、対応するイメージを再ビルド・再プッシュすることが重要です。
- ライフサイクルポリシーとの連携: 古い、または脆弱性のあるイメージが不要にリポジトリに残り続けないよう、ECRライフサイクルポリシーを設定して、一定期間経過後やタグに基づいてイメージを自動的にクリーンアップすることを検討します。
- 継続的インテグレーション/デリバリー (CI/CD) パイプラインへの組み込み: CI/CDパイプラインにECRスキャン結果のチェックを組み込むことで、脆弱性が検出されたイメージが本番環境にデプロイされるのを防ぐことができます。例えば、高深刻度の脆弱性が検出された場合はデプロイをブロックする、といったルールを設定できます。
- 拡張スキャン (Enhanced scanning) の検討: より高度な脆弱性管理が必要な場合、ECRはAmazon Inspectorを活用した拡張スキャンを提供します。これにより、OSパッケージだけでなく、プログラミング言語パッケージ(Java、Pythonなど)の脆弱性もスキャンでき、継続的な再スキャン機能も利用できます。
修復方法
AWSコンソールでの修復手順
ECRプライベートリポジトリでイメージプッシュ時の自動脆弱性スキャンを有効にする方法は、AWSコンソールとTerraformのいずれでも可能です。
AWSコンソールでの修復手順
AWSコンソールを使用して、ECRプライベートリポジトリへのイメージプッシュ時に自動脆弱性スキャンを有効にします。
- ECRサービスへ移動: AWSコンソールにログインし、Amazon ECR サービスを開きます。
- プライベートレジストリへ移動: 左側のナビゲーションペインで「プライベートレジストリ」の下にある「リポジトリ」を選択します。
- 対象のリポジトリを選択: 自動脆弱性スキャンを有効にしたいプライベートリポジトリを選択します。
- スキャン設定の編集: リポジトリの詳細ページで、「スキャン設定」タブ(または「設定」タブ内の「イメージスキャン」セクション)を見つけ、「編集」または「スキャン設定を編集」をクリックします。
- イメージスキャンの有効化:
- 「プッシュ時に基本スキャンを有効にする」のチェックボックスをオンにします。
- 注意: 既に「拡張スキャン」が有効になっている場合は、このオプションは表示されないか、変更できません。拡張スキャンは基本スキャンを包含する上位機能です。
- 拡張スキャンを有効にする場合(より高度な機能):
- 「拡張スキャンを有効にする」を選択します。これにより、Amazon Inspectorによって継続的なスキャンが行われ、より広範な脆弱性が検出されます。拡張スキャンは、リポジトリレベルではなくアカウントレベルで設定することも可能です。
- 「プッシュ時に基本スキャンを有効にする」のチェックボックスをオンにします。
- 変更を適用: 設定を確認し、「変更を保存」をクリックします。

これで、今後このリポジトリにイメージがプッシュされるたびに、自動的に脆弱性スキャンが実行されるようになります。既存のイメージをスキャンしたい場合は、手動でスキャンを開始する必要があります。
Terraformでの修復手順
TerraformでECRプライベートリポジトリへのイメージプッシュ時に自動脆弱性スキャンを有効にするには、aws_ecr_repository
リソースの image_scanning_configuration
ブロックを設定します。
# (例) ECRプライベートリポジトリ
resource "aws_ecr_repository" "my_private_app_repo" {
name = "my-secure-app-repository"
image_tag_mutability = "MUTABLE" # または IMMUTABLE
# イメージスキャン設定
image_scanning_configuration {
scan_on_push = true # イメージがプッシュされた際に自動スキャンを有効にする
}
# ライフサイクルポリシー (オプション: 古い/脆弱なイメージのクリーンアップ)
lifecycle_policy {
policy = jsonencode({
rules = [
{
rulePriority = 1,
description = "Remove untagged images older than 7 days",
selection = {
tagStatus = "untagged",
countType = "sinceImagePushed",
countUnit = "days",
countNumber = 7
},
action = {
type = "expire"
}
},
{
rulePriority = 2,
description = "Keep last 5 tagged images",
selection = {
tagStatus = "tagged",
countType = "imageCountMoreThan",
countNumber = 5
},
action = {
type = "expire"
}
}
]
})
}
tags = {
Environment = "Production"
Application = "MySecureApp"
}
}
# (オプション) アカウントレベルで拡張スキャン (Enhanced scanning) を有効にする場合
# これは全てのECRリポジトリに適用されます。
# resource "aws_inspector2_configuration" "enable_enhanced_ecr_scanning" {
# ecr {
# rescan_duration_setting {
# rescan_duration = "LIFETIME" # または "DAYS"
# # days = 90 # rescan_duration が DAYS の場合のみ
# }
# }
# activate_at_launch = true # Inspectorを有効にする
# }
# (オプション) 特定のリポジトリで拡張スキャンを設定する場合(リポジトリレベルのOverrides)
# resource "aws_ecr_repository_scanning_configuration" "my_repo_enhanced_scan" {
# repository_name = aws_ecr_repository.my_private_app_repo.name
# scan_on_push = false # 基本スキャンをオフにする (Enhanced Scanningが優先されるため)
# scan_frequency = "SCAN_ON_PUSH" # または "CONTINUOUS_SCAN"
# }
上記のTerraformコードでは、aws_ecr_repository
リソース内の image_scanning_configuration
ブロックで scan_on_push = true
を設定することで、イメージプッシュ時の基本脆弱性スキャンを有効にしています。
name
: ECRリポジトリの名前を指定します。image_scanning_configuration.scan_on_push
: これをtrue
に設定することで、イメージがリポジトリにプッシュされるたびに自動スキャンが実行されます。
注意点:
- 拡張スキャン: より高度な脆弱性スキャン(Amazon Inspectorとの統合)を利用する場合は、
aws_inspector2_configuration
リソースを使用してアカウントレベルで有効にするか、aws_ecr_repository_scanning_configuration
リソースを使用してリポジトリレベルで設定します。拡張スキャンを有効にすると、基本スキャンは自動的に無効化され、拡張スキャンが優先されます。 my-secure-app-repository
などのプレースホルダーは、実際の環境に合わせて修正してください。
最後に
この記事では、ECRプライベートリポジトリへのイメージプッシュ時に自動脆弱性スキャンを有効にすることの重要性について解説しました。この設定は、ソフトウェアサプライチェーンの初期段階で脆弱性を特定し、本番環境への安全なコンテナイメージのデプロイを促進するための不可欠なセキュリティ対策です。 貴社のECRプライベートリポジトリでは、イメージプッシュ時の自動脆弱性スキャンが適切に有効になっていますか?この機会にぜひ設定を確認・強化してみてください。 こちらの内容の検出は弊社が提供するSecurifyのCSPM機能で簡単に検出及び管理する事が可能です。運用が非常にラクに出来る製品になっていますのでぜひ興味がある方はお問い合わせお待ちしております。
最後までお読みいただきありがとうございました。この記事が皆さんの役に立てば幸いです。