このディレクトリには、Day07の課題「ECR脆弱性スキャンとCodePipelineで安全な自動デプロイを構築しよう」で使用する資材が含まれています。
- buildspec.yml: CodeBuildで使用するビルド仕様ファイル
- Dockerfile: ✅ 安全なイメージパターン(脆弱性スキャン合格想定)
- Dockerfile.vulnerable: ❌ 脆弱性を含むイメージパターン(スキャン失敗想定)
- .dockerignore: Dockerビルド時に除外するファイルの設定
- demo-comparison.md: 成功・失敗パターンの詳細比較表
- VERIFICATION-REPORT.md: AWS公式ドキュメントに基づく検証レポート
- README.md: この説明ファイル
aws ecr create-repository \
--repository-name test/demo-app \
--image-scanning-configuration scanOnPush=true \
--region ap-northeast-1このディレクトリには2種類のDockerfileがあります:
最新の安全なベースイメージ(nginx:1.27-alpine)を使用します。
# 通常のDockerfileを使用(単一プラットフォーム)
docker build --platform linux/amd64 -t demo-app:safe -f Dockerfile .古いベースイメージ(nginx:1.19-alpine)を使用し、意図的に脆弱性を含めます。
# 脆弱性のあるDockerfileを使用(単一プラットフォーム)
docker build --platform linux/amd64 -t demo-app:vulnerable -f Dockerfile.vulnerable .# 安全なイメージのテスト
docker run -p 8080:80 demo-app:safe
# 脆弱性のあるイメージのテスト
docker run -p 8081:80 demo-app:vulnerable
# ブラウザで http://localhost:8080 または http://localhost:8081 にアクセス# AWSアカウントIDを取得
AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
# ECRにログイン
aws ecr get-login-password --region ap-northeast-1 | \
docker login --username AWS --password-stdin ${AWS_ACCOUNT_ID}.dkr.ecr.ap-northeast-1.amazonaws.com
# イメージにタグ付け
docker tag demo-app:safe ${AWS_ACCOUNT_ID}.dkr.ecr.ap-northeast-1.amazonaws.com/test/demo-app:safe
# ECRにプッシュ
docker push ${AWS_ACCOUNT_ID}.dkr.ecr.ap-northeast-1.amazonaws.com/test/demo-app:safe# イメージにタグ付け
docker tag demo-app:vulnerable ${AWS_ACCOUNT_ID}.dkr.ecr.ap-northeast-1.amazonaws.com/test/demo-app:vulnerable
# ECRにプッシュ
docker push ${AWS_ACCOUNT_ID}.dkr.ecr.ap-northeast-1.amazonaws.com/test/demo-app:vulnerable# スキャン完了まで5〜15分かかる場合があります
aws inspector2 list-findings \
--filter-criteria '{"ecrImageRepositoryName":[{"comparison":"EQUALS","value":"test/demo-app"}],"ecrImageTags":[{"comparison":"EQUALS","value":"safe"}]}' \
--region ap-northeast-1 \
--max-results 10
# 期待される結果: CRITICALやHIGHの脆弱性が0件、またはごく少数# スキャン結果を取得(脆弱性のあるイメージ)
aws inspector2 list-findings \
--filter-criteria '{"ecrImageRepositoryName":[{"comparison":"EQUALS","value":"test/demo-app"}],"ecrImageTags":[{"comparison":"EQUALS","value":"vulnerable"}]}' \
--region ap-northeast-1 \
--max-results 10
# 期待される結果: CRITICALまたはHIGHレベルの脆弱性が複数検出されるbuildspec.ymlは使用するDockerfileに応じて動作が変わります:
✅ 成功パターン(Dockerfileを使用):
# buildspec.ymlはデフォルトでDockerfileを使用
# → ビルド成功 → スキャン合格 → デプロイ実行❌ 失敗パターン(Dockerfile.vulnerableを使用):
buildspec.ymlの32行目を以下のように変更:
# 変更前
- docker build --platform linux/amd64 -t $IMAGE_REPO_NAME:$IMAGE_TAG .
# 変更後(脆弱性パターンをテストする場合)
- docker build --platform linux/amd64 -t $IMAGE_REPO_NAME:$IMAGE_TAG -f Dockerfile.vulnerable .この場合の動作:
# → ビルド成功 → スキャン実行 → CRITICAL検出 → ビルド失敗 → デプロイ中止- ECRへのログイン: 自動的にECRに認証
- Dockerイメージのビルド: Dockerfileからイメージをビルド
- ECRへのプッシュ: ビルドしたイメージをECRにプッシュ
- 脆弱性スキャン結果のチェック:
- CRITICALレベルの脆弱性を検出した場合、ビルドを失敗させる
- 安全なイメージのみデプロイが進むようにする
- ECS用の成果物出力:
imagedefinitions.jsonを生成
env:
variables:
AWS_DEFAULT_REGION: "ap-northeast-1" # 任意のリージョンに変更env:
variables:
IMAGE_REPO_NAME: "test/demo-app" # 任意の名前に変更buildspec.ymlの以下のコメントアウトを解除:
if [ "$HIGH_COUNT" -gt 0 ]; then
echo "⚠️ HIGH レベルの脆弱性が検出されました!確認が必要です。"
exit 1
fiこのbuildspec.ymlは、CodePipelineのBuildステージで使用されます:
- Source(ソース): GitHubまたはCodeCommitからコードを取得
- Build(ビルド): このbuildspec.ymlを使用してビルド・スキャン
- Deploy(デプロイ): スキャンに合格したイメージをECSにデプロイ
# ECRリポジトリの削除(イメージも全て削除)
aws ecr delete-repository \
--repository-name test/demo-app \
--force \
--region ap-northeast-1Dockerfileを使用してビルド- ECRにプッシュ → 自動スキャン実行
- スキャン結果:脆弱性なし(またはCRITICAL = 0)
- buildspec.ymlのチェック:合格
- 結果:✅ パイプライン成功、ECSへデプロイ
Dockerfile.vulnerableを使用してビルド- ECRにプッシュ → 自動スキャン実行
- スキャン結果:CRITICALレベルの脆弱性を検出
- buildspec.ymlのチェック:失敗(exit 1)
- 結果:❌ パイプライン失敗、デプロイ中止
- スキャン完了には通常30秒〜数分かかります
- buildspec.ymlでは簡易的に
sleep 30を使用していますが、大きなイメージの場合は不足する可能性があります - より確実にするには、スキャン状態をポーリングするループ処理を実装することをおすすめします
- CRITICALレベルの脆弱性が検出されると、デプロイは自動的にブロックされます
Dockerfile.vulnerableは学習・デモ目的でのみ使用してください。本番環境では使用しないでください- CodeBuildの特権モードはDockerビルドに必要ですが、セキュリティリスクがあることに注意してください
- このハンズオンでは Enhanced scanning (Amazon Inspector連携) を前提としています
- Inspectorのカバレッジにリポジトリが含まれていることを確認してください
- 参考: Scanning Amazon ECR images with Amazon Inspector
UNSUPPORTED_MEDIA_TYPE:OCI index/manifest listをプッシュしている可能性があります。単一プラットフォームで再ビルドしてください。- 結果が出ない:14日ルール対象外またはスキャン未完了。再プッシュまたは数分待ってからInspector APIで再確認。
- リージョン相違:ECR/Inspector/CLIのリージョンを揃える。
# メディアタイプの確認
aws ecr describe-images \
--repository-name test/demo-app \
--image-ids imageTag=safe \
--query 'imageDetails[0].imageManifestMediaType' \
--output text
# カバレッジ確認
aws inspector2 list-coverage \
--region ap-northeast-1 \
--filter-criteria '{"resourceType":[{"comparison":"EQUALS","value":"AWS_ECR_CONTAINER_IMAGE"}],"ecrRepositoryName":[{"comparison":"EQUALS","value":"test/demo-app"}]}' \
--max-items 20