1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Amazon ECRの脆弱性スキャニング完全ガイド:基本・拡張スキャンとスキャン漏れ対策

Posted at

概要

Amazon ECRの基本スキャンと拡張スキャンの違いを解説し、スキャンされていないコンテナイメージを確実にスキャンする方法を実践的に紹介します。セキュリティリスクを最小化するためのベストプラクティスと自動化手法を具体例とともに説明します。

目次

  1. はじめに
  2. ECRの脆弱性スキャニング機能概要
  3. 基本スキャン(Basic Scanning)
  4. 拡張スキャン(Enhanced Scanning)
  5. スキャン漏れイメージの特定と対処法
  6. 実践的な運用方法
  7. ベストプラクティスと注意点
  8. 終わりに

はじめに

コンテナ技術の普及に伴い、セキュリティ対策は開発プロセスの重要な要素となっています。Amazon ECR(Elastic Container Registry)では、コンテナイメージの脆弱性スキャニング機能を提供しており、アプリケーションのセキュリティリスクを事前に検出できます。

本記事では、ECRの基本スキャンと拡張スキャンの特徴と違いを詳しく解説し、スキャンされていないイメージを確実にスキャンする実践的な手法を紹介します。これにより、セキュアなコンテナ環境の構築とその維持に必要な知識を習得できます。

ECRの脆弱性スキャニング機能概要

Amazon ECRは2つの脆弱性スキャニングオプションを提供しています:

機能 基本スキャン 拡張スキャン
スキャン対象 OS脆弱性のみ OS脆弱性 + プログラミング言語パッケージ脆弱性
スキャンエンジン ECR組み込み Amazon Inspector v2統合
継続監視 手動実行またはPush時のみ 継続的な監視とリアルタイム検出
新脆弱性検出 再スキャンが必要 自動的に検出・更新
料金 無料 使用量に応じた従量制

2024年の重要な更新: ECRの基本スキャンが改良版としてアップデートされ、より幅広いOS脆弱性の検出が可能になりました。

基本スキャン(Basic Scanning)

機能詳細と制限事項

基本スキャンでは、ECRコンテナイメージ内のソフトウェア脆弱性を特定でき、手動でスキャンするかイメージプッシュ時に自動実行するよう設定可能です。

主な特徴:

  • オペレーティングシステム層の脆弱性のみを検出
  • CVE(Common Vulnerabilities and Exposures)データベースと照合
  • 個々のイメージに対して24時間に1回のみ実行可能、1日あたり最大100,000回の基本スキャンが可能

設定方法と確認手順

リポジトリレベルでの設定:

# スキャンオンプッシュを有効化
aws ecr put-image-scanning-configuration \
    --repository-name my-app \
    --image-scanning-configuration scanOnPush=true \
    --region ap-northeast-1

手動スキャンの実行:

# タグを指定したスキャン
aws ecr start-image-scan \
    --repository-name my-app \
    --image-id imageTag=latest \
    --region ap-northeast-1

# ダイジェストを指定したスキャン
aws ecr start-image-scan \
    --repository-name my-app \
    --image-id imageDigest=sha256:abcd1234... \
    --region ap-northeast-1

スキャン結果の確認:

# スキャン結果の取得
aws ecr describe-image-scan-findings \
    --repository-name my-app \
    --image-id imageTag=latest \
    --region ap-northeast-1

【挿絵候補】:基本スキャンのワークフロー図(mermaidで作成、イメージプッシュ→スキャン実行→結果確認の流れ)

拡張スキャン(Enhanced Scanning)

Inspector v2との統合

拡張スキャンはAmazon Inspectorとの統合により、コンテナイメージのOSとプログラミング言語パッケージ両方の脆弱性スキャンを提供します。この統合により、より包括的なセキュリティ分析が可能になります。

継続的監視とリアルタイム検出

拡張スキャンでは、新たな脆弱性が発見されるとスキャン結果が自動的に更新されます。これは基本スキャンとの大きな違いで、一度スキャンしたイメージに対して新しい脆弱性情報が公開された際も、再スキャンすることなく最新の脅威情報を把握できます。

設定方法と料金体系

アカウントレベルでの有効化:

# 拡張スキャンの有効化
aws inspector2 enable \
    --account-ids $(aws sts get-caller-identity --query Account --output text) \
    --resource-types ECR \
    --region ap-northeast-1

リポジトリフィルターの設定:

# 特定のリポジトリのみスキャン対象とする場合
aws ecr put-registry-scanning-configuration \
    --scanning-configuration 'scanType=ENHANCED,rules=[{repositoryFilters=[{filter=production-*,filterType=WILDCARD}],scanFrequency=SCAN_ON_PUSH}]' \
    --region ap-northeast-1

料金の考慮事項:

  • イメージサイズと脆弱性スキャンの頻度に基づいた従量制
  • 東京リージョン(ap-northeast-1)での参考価格:$0.09 per image scan(初回)、$0.01 per re-scan
  • 詳細な料金情報は AWS 料金ページ ( https://aws.amazon.com/inspector/pricing/ ) で確認してください

image.png

スキャン漏れイメージの特定と対処法

スキャンステータスの確認方法

スキャンされていないイメージを特定するには、以下のAWS CLIコマンドを使用します:

# リポジトリ内の全イメージのスキャンステータス確認
aws ecr describe-images \
    --repository-name my-app \
    --region ap-northeast-1 \
    --query 'imageDetails[?imageScanFindingsSummary == null].[imageDigest,imageTags[0]]' \
    --output table

手動スキャンの実行手順

単一イメージのスキャン:

# 最新タグのイメージをスキャン
aws ecr start-image-scan \
    --repository-name my-app \
    --image-id imageTag=latest \
    --region ap-northeast-1

スキャン完了の待機と結果確認:

# スキャン完了まで待機するスクリプト例
scan_status="IN_PROGRESS"
while [ "$scan_status" = "IN_PROGRESS" ]; do
    echo "スキャン実行中..."
    sleep 30
    scan_status=$(aws ecr describe-image-scan-findings \
        --repository-name my-app \
        --image-id imageTag=latest \
        --region ap-northeast-1 \
        --query 'imageScanStatus.status' \
        --output text 2>/dev/null || echo "IN_PROGRESS")
done

echo "スキャン完了: $scan_status"

AWS CLIを使った一括処理方法

複数のイメージを一括でスキャンする場合のシェルスクリプト例:

#!/bin/bash
REPOSITORY_NAME="my-app"
REGION="ap-northeast-1"

# スキャンされていないイメージを取得
unscanned_images=$(aws ecr describe-images \
    --repository-name $REPOSITORY_NAME \
    --region $REGION \
    --query 'imageDetails[?imageScanFindingsSummary == null].[imageDigest]' \
    --output text)

# 各イメージをスキャン
for digest in $unscanned_images; do
    echo "スキャン開始: $digest"
    aws ecr start-image-scan \
        --repository-name $REPOSITORY_NAME \
        --image-id imageDigest=$digest \
        --region $REGION
    
    # API制限を考慮した待機
    sleep 1
done

基本スキャンでは1日あたり100,000回の制限があるため、大量のイメージを処理する際はスクリプト内で適切な間隔を設けることが重要です。

実践的な運用方法

CI/CDパイプラインとの連携

GitLab CI/CDでの実装例:

# .gitlab-ci.yml
scan_vulnerabilities:
  stage: security
  script:
    - aws ecr start-image-scan --repository-name $CI_PROJECT_NAME --image-id imageTag=$CI_COMMIT_SHA
    - |
      # スキャン完了まで待機
      while [ "$(aws ecr describe-image-scan-findings --repository-name $CI_PROJECT_NAME --image-id imageTag=$CI_COMMIT_SHA --query 'imageScanStatus.status' --output text)" = "IN_PROGRESS" ]; do
        sleep 30
      done
    - |
      # 高リスクの脆弱性が見つかった場合はビルドを停止
      critical_count=$(aws ecr describe-image-scan-findings --repository-name $CI_PROJECT_NAME --image-id imageTag=$CI_COMMIT_SHA --query 'imageScanFindingsSummary.findingCounts.CRITICAL' --output text)
      if [ "$critical_count" != "None" ] && [ "$critical_count" -gt 0 ]; then
        echo "クリティカルな脆弱性が発見されました: $critical_count件"
        exit 1
      fi

自動化スクリプトの実装例

Python を使った監視スクリプト:

import boto3
import time

def scan_unscanned_images(repository_name, region='ap-northeast-1'):
    ecr = boto3.client('ecr', region_name=region)
    
    # スキャンされていないイメージを取得
    response = ecr.describe_images(repositoryName=repository_name)
    unscanned = [
        img for img in response['imageDetails'] 
        if 'imageScanFindingsSummary' not in img
    ]
    
    print(f"未スキャンイメージ数: {len(unscanned)}")
    
    for image in unscanned:
        digest = image['imageDigest']
        try:
            ecr.start_image_scan(
                repositoryName=repository_name,
                imageId={'imageDigest': digest}
            )
            print(f"スキャン開始: {digest[:12]}...")
            time.sleep(1)  # API制限回避
        except Exception as e:
            print(f"エラー: {digest[:12]}... - {str(e)}")

if __name__ == "__main__":
    scan_unscanned_images("my-app")

モニタリングとアラート設定

CloudWatch イベントルールの設定:

# ECRスキャン完了イベントのルール作成
aws events put-rule \
    --name "ECRScanComplete" \
    --event-pattern '{"source":["aws.ecr"],"detail-type":["ECR Image Scan"],"detail":{"scan-status":["COMPLETE"],"finding-counts":{"CRITICAL":{"$exists":true}}}}' \
    --region ap-northeast-1

ベストプラクティスと注意点

セキュリティ対策の考え方

  1. レイヤード セキュリティの実装: ECRスキャンは万能ではありません。静的解析ツール、ランタイム保護、ネットワークセキュリティと組み合わせた多層防御を構築しましょう。

  2. 継続的な監視: 拡張スキャンの採用により、新しい脆弱性の早期発見が可能になります。特に本番環境では拡張スキャンの使用を強く推奨します。

  3. 脆弱性の優先度付け: すべての脆弱性を即座に修正することは現実的ではありません。CVSS スコア、利用可能性、影響範囲を考慮して優先度を決定しましょう。

コスト最適化のポイント

  1. スキャン対象の絞り込み: 本番環境や重要なアプリケーションのイメージを優先し、開発用途の一時的なイメージは基本スキャンを活用します。

  2. イメージの定期クリーンアップ: 古いイメージは削除して、不要なスキャンコストを削減しましょう。

  3. マルチアーキテクチャ対応: ARM64 とx86_64 両方のイメージを管理する場合、必要な分のみスキャンするよう設定を最適化します。

運用上の重要な注意点

  • 基本スキャンは24時間に1回の制限があるため、緊急時の再スキャンができない可能性があります
  • 拡張スキャン有効化後は、リージョン単位での管理となるため、マルチリージョン展開時は各リージョンで個別設定が必要です
  • スキャン結果の保持期間は基本スキャンで長期間、拡張スキャンはInspectorの設定に依存します

終わりに

Amazon ECRの脆弱性スキャニング機能を適切に活用することで、コンテナベースアプリケーションのセキュリティを大幅に向上させることができます。基本スキャンと拡張スキャンの特徴を理解し、運用要件に応じて適切に選択することが重要です。

特にスキャン漏れの防止は、セキュリティ運用において致命的な見落としを避けるために不可欠です。本記事で紹介した自動化手法を活用し、継続的なセキュリティ監視体制を構築してください。

次のステップとして、以下の取り組みをお勧めします:

  • 既存のCI/CDパイプラインへのスキャン工程統合
  • CloudWatch を使った脆弱性アラートシステムの構築
  • 組織全体でのセキュリティ基準とレスポンス手順の策定

セキュリティは継続的なプロセスです。定期的な見直しと改善により、安全なコンテナ環境を維持していきましょう。

参考文献・参考サイト

AWS 公式ドキュメント

その他の参考資料

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?