Skip to content

Latest commit

 

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ECR脆弱性スキャンとCodePipeline デモ資材

このディレクトリには、Day07の課題「ECR脆弱性スキャンとCodePipelineで安全な自動デプロイを構築しよう」で使用する資材が含まれています。

📁 ファイル構成

  • buildspec.yml: CodeBuildで使用するビルド仕様ファイル
  • Dockerfile: ✅ 安全なイメージパターン(脆弱性スキャン合格想定)
  • Dockerfile.vulnerable: ❌ 脆弱性を含むイメージパターン(スキャン失敗想定)
  • .dockerignore: Dockerビルド時に除外するファイルの設定
  • demo-comparison.md: 成功・失敗パターンの詳細比較表
  • VERIFICATION-REPORT.md: AWS公式ドキュメントに基づく検証レポート
  • README.md: この説明ファイル

🚀 使い方

1. ECRリポジトリの作成

aws ecr create-repository \
    --repository-name test/demo-app \
    --image-scanning-configuration scanOnPush=true \
    --region ap-northeast-1

2. パターン選択(単一プラットフォームでビルド)

このディレクトリには2種類のDockerfileがあります:

✅ パターンA:安全なイメージ(スキャン合格)

最新の安全なベースイメージ(nginx:1.27-alpine)を使用します。

# 通常のDockerfileを使用(単一プラットフォーム)
docker build --platform linux/amd64 -t demo-app:safe -f Dockerfile .

❌ パターンB:脆弱性のあるイメージ(スキャン失敗)

古いベースイメージ(nginx:1.19-alpine)を使用し、意図的に脆弱性を含めます。

# 脆弱性のあるDockerfileを使用(単一プラットフォーム)
docker build --platform linux/amd64 -t demo-app:vulnerable -f Dockerfile.vulnerable .

⚠️ 注意: Dockerfile.vulnerableは学習・デモ目的でのみ使用してください。

3. ローカルでのテスト(任意)

# 安全なイメージのテスト
docker run -p 8080:80 demo-app:safe

# 脆弱性のあるイメージのテスト
docker run -p 8081:80 demo-app:vulnerable

# ブラウザで http://localhost:8080 または http://localhost:8081 にアクセス

4. ECRへの手動プッシュ(任意)

✅ 安全なイメージをプッシュ(スキャン合格を確認)

# 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. スキャン結果の確認(Enhanced Scanning 推奨)

✅ 安全なイメージのスキャン結果

# スキャン完了まで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レベルの脆弱性が複数検出される

6. CodePipelineでの動作確認

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検出 → ビルド失敗 → デプロイ中止

🔧 buildspec.yml の主な機能

  1. ECRへのログイン: 自動的にECRに認証
  2. Dockerイメージのビルド: Dockerfileからイメージをビルド
  3. ECRへのプッシュ: ビルドしたイメージをECRにプッシュ
  4. 脆弱性スキャン結果のチェック:
    • CRITICALレベルの脆弱性を検出した場合、ビルドを失敗させる
    • 安全なイメージのみデプロイが進むようにする
  5. ECS用の成果物出力: imagedefinitions.json を生成

⚙️ カスタマイズポイント

リージョンの変更

env:
  variables:
    AWS_DEFAULT_REGION: "ap-northeast-1"  # 任意のリージョンに変更

リポジトリ名の変更

env:
  variables:
    IMAGE_REPO_NAME: "test/demo-app"  # 任意の名前に変更

HIGHレベルの脆弱性も検出する場合

buildspec.ymlの以下のコメントアウトを解除:

if [ "$HIGH_COUNT" -gt 0 ]; then
  echo "⚠️  HIGH レベルの脆弱性が検出されました!確認が必要です。"
  exit 1
fi

📊 CodePipelineとの統合

このbuildspec.ymlは、CodePipelineのBuildステージで使用されます:

  1. Source(ソース): GitHubまたはCodeCommitからコードを取得
  2. Build(ビルド): このbuildspec.ymlを使用してビルド・スキャン
  3. Deploy(デプロイ): スキャンに合格したイメージをECSにデプロイ

🧹 リソースの削除

# ECRリポジトリの削除(イメージも全て削除)
aws ecr delete-repository \
    --repository-name test/demo-app \
    --force \
    --region ap-northeast-1

🧪 テストシナリオ

シナリオ1:安全なイメージのデプロイ(成功)

  1. Dockerfileを使用してビルド
  2. ECRにプッシュ → 自動スキャン実行
  3. スキャン結果:脆弱性なし(またはCRITICAL = 0)
  4. buildspec.ymlのチェック:合格
  5. 結果:✅ パイプライン成功、ECSへデプロイ

シナリオ2:脆弱性のあるイメージのデプロイ(失敗)

  1. Dockerfile.vulnerableを使用してビルド
  2. ECRにプッシュ → 自動スキャン実行
  3. スキャン結果:CRITICALレベルの脆弱性を検出
  4. buildspec.ymlのチェック:失敗(exit 1)
  5. 結果:❌ パイプライン失敗、デプロイ中止

📝 注意事項

スキャン待機時間について

  • スキャン完了には通常30秒〜数分かかります
  • buildspec.ymlでは簡易的にsleep 30を使用していますが、大きなイメージの場合は不足する可能性があります
  • より確実にするには、スキャン状態をポーリングするループ処理を実装することをおすすめします

セキュリティについて

  • CRITICALレベルの脆弱性が検出されると、デプロイは自動的にブロックされます
  • Dockerfile.vulnerable学習・デモ目的でのみ使用してください。本番環境では使用しないでください
  • CodeBuildの特権モードはDockerビルドに必要ですが、セキュリティリスクがあることに注意してください

スキャンタイプについて

  • このハンズオンでは Enhanced scanning (Amazon Inspector連携) を前提としています
  • Inspectorのカバレッジにリポジトリが含まれていることを確認してください
  • 参考: Scanning Amazon ECR images with Amazon Inspector

よくあるエラーと回避策

  • UNSUPPORTED_MEDIA_TYPEOCI 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

🔗 参考リンク

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages