Container Registry 脆弱性スキャン

は、

Container Registry 脆弱性スキャンは、コンテナ イメージのパッケージに存在する脆弱性を識別します。このページでは、パッケージに存在する脆弱性を Google Cloud Platform Console、gcloud コマンドライン ツール、Container Analysis API を使用して確認する方法について説明します。

制限事項

  • Container Analysis API は、次のパッケージの脆弱性スキャンに対応しています。
    • Ubuntu
    • Debian
    • Alpine
  • 過去 30 日間に作成または pull されたイメージが脆弱性スキャンの対象になります。
  • レポジトリ内のイメージ数が多い場合、スキャン結果が表示されるまでに時間がかかります。

概念

Container Analysis API を有効にすると、Container Registry 脆弱性スキャンは、プロジェクト内にあるすべてのイメージを自動的にスキャンします。プロジェクトに新しく作成したイメージは、Container Registry に追加されるときにスキャンされます。脆弱性データベースが更新されるたびに、すべてのイメージがスキャンされます。

主な用語

  • 注記は、脆弱性の具体的な説明を表します。
  • 発生個所はイメージ内で注記の脆弱性が実際に見つかった場所を表します。これは、特定のイメージに特定の脆弱性が存在することを意味します。Google Cloud Platform プロジェクトのイメージごとに発生個所が記録されます。
  • 脆弱性の結果は、イメージ内での発生個所がまとめられたものです。

脆弱性スキャンを有効にする

脆弱性スキャンの結果を取得するには、Container Analysis API を有効にして脆弱性スキャンを有効にする必要があります。

  1. プロジェクトで Container Analysis API を有効にします。既存のプロジェクトで API を有効にすることも、新しいプロジェクトを作成して API を有効にすることもできます。

    Container Analysis API を有効にする

  2. Container Registry ページの設定で脆弱性スキャンを有効にします。

    脆弱性スキャンを有効にする

コンテナ イメージの脆弱性を表示する

Container Analysis API を有効にしたら、次の手順に沿って、Container Registry のイメージの脆弱性を表示します。

Console

  1. GCP Console で Container Registry ページを開きます。

    Container Registry ページを開く

  2. [Scan vulnerabilities] をクリクします。

イメージの脆弱性が表示されます。

gcloud

脆弱性情報の概要を表示するには:

    gcloud alpha container images list-tags --show-occurrences \
        gcr.io/[PROJECT_ID]/[IMAGE_ID]

ここで:

  • [PROJECT_ID] は、イメージを含むプロジェクトの ID です。
  • [IMAGE_ID] は、脆弱性を表示するイメージの ID です。

タグまたはレイヤに関する情報を表示するには:

    gcloud alpha container images describe gcr.io/[PROJECT_ID]/[IMAGE_ID]:[TAG]

または

    gcloud alpha container images describe gcr.io/[PROJECT_ID]/[IMAGE_ID]@sha256:[HASH]

ここで:

  • [PROJECT_ID] は、イメージを含むプロジェクトの ID です。
  • [IMAGE_ID] は、脆弱性を表示するイメージの ID です。
  • [TAG] は、情報を取得するイメージのタグです。
  • [HASH] は、イメージのダイジェストです。

脆弱性をフィルタリングするには:

    gcloud alpha container images list-tags --show-occurrences \
        gcr.io/[PROJECT_ID]/[IMAGE_ID] --occurrence-filter=[FILTER_EXPRESSION]

ここで:

  • [PROJECT_ID] は、イメージを含むプロジェクトの ID です。
  • [IMAGE_ID] は、脆弱性を表示するイメージの ID です。
  • [FILTER_EXPRESSION] はサンプル フィルタ式です。詳細については、サンプル フィルタ式をご覧ください。

API

Container Analysis API は、gRPC と REST/JSON の両方をサポートしています。API の呼び出しは、クライアント ライブラリ(内部的に gRPC を使用)または REST/JSON の cURL を使用して行うことができます。

クライアント ライブラリを使用する

次のクライアント ライブラリを使用できます。

cURL を使用する

注記を取得するには:

curl -X GET -H "Content-Type: application/json" -H \
    "Authorization: Bearer $(gcloud auth print-access-token)" \
    https://containeranalysis.googleapis.com/v1alpha1/providers/[PROVIDER_PROJECT_ID]/notes/[NOTE_ID]

注記の一覧を表示するには:

curl -X GET -H "Content-Type: application/json" -H \
    "Authorization: Bearer $(gcloud auth print-access-token)" \
    https://containeranalysis.googleapis.com/v1alpha1/providers/[PROVIDER_PROJECT_ID]/notes?filter=[URL_ENCODED_FILTER_EXPRESSION]

発生個所を取得するには:

curl -X GET -H "Content-Type: application/json" -H \
    "Authorization: Bearer $(gcloud auth print-access-token)" \
    https://containeranalysis.googleapis.com/v1alpha1/projects/[PROJECT_ID]/occurrences/[OCCURRENCE_ID]

発生個所の一覧を表示するには:

curl -X GET -H "Content-Type: application/json" -H \
    "Authorization: Bearer $(gcloud auth print-access-token)" \
    https://containeranalysis.googleapis.com/v1alpha1/projects/[PROJECT_ID]/occurrences?filter=[URL_ENCODED_FILTER_EXPRESSION]

サンプル フィルタ式

脆弱性をフィルタリングするには、gcloud コマンドライン ツールまたは Container Analysis API で次の式を使用します。

Debian “Jessie” のすべての脆弱性:

vulnerabilityType.details.cpeUri = "cpe:/o:debian:debian_linux:8"

Debian “Jessie” / nginx のすべての脆弱性:

vulnerabilityType.details.cpeUri = "cpe:/o:debian:debian_linux:8" AND \
    vulnerabilityType.details.package = "nginx"

Debian “Jessie” / nginx でバージョン “1.6.2-5” に影響するすべての脆弱性:

vulnerabilityType.details.cpeUri = "cpe:/o:debian:debian_linux:8" AND \
    vulnerabilityType.details.package = "nginx" AND \
    vulnerabilityType.details.fixedLocation.version > version("1.6.2-5")

“Jessie” / nginx で重大度の高いすべての脆弱性:

vulnerabilityType.details.cpeUri = "cpe:/o:debian:debian_linux:8" AND \
    vulnerabilityType.details.package = "nginx" \
    vulnerabilityType.severity = "HIGH"

resourceUrl のすべての脆弱性の発生個所:

kind="PACKAGE_VULNERABILITY" \
    AND has_prefix("resource_url", "https://gcr.io\path_to_resource")"

リソース URL の脆弱性の発生個所をフィルタリングするときに、上の PACKAGE_VULNERABILITY フィルタを適用しないと、他の発生個所の KIND が結果に表示される場合があります。

プロバイダ固有の例

このセクションでは、サードパーティ プロバイダがユーザーのプロジェクトに注記や発生個所を作成する方法について説明します。

注記の作成

必要な IAM 役割: Note を作成するには、プロジェクトに containeranalysis.notes.editor 役割が必要です。

次の例では、新しい注記を作成します。

  1. 次の内容を含むファイルを note.json という名前で作成します。

    {
        "shortDescription": "A brief Description of the note",
            "longDescription": "A longer description of the note",
        "kind": "PACKAGE_VULNERABILITY",
        "vulnerabilityType": {
            "details": [
            {
                "package": "libexempi3",
                "cpeUri": "cpe:/o:debian:debian_linux:7",
                "minAffectedVersion": { "name": "2.5.7", "revision": "1"},
                "maxAffectedVersion": { "name": "2.5.9", "revision": "1"},
            },
            {
                "cpeUri": "something else"
            }
            ]
        }
    }
    
  2. 次の curl コマンドを実行します。

    curl -X POST -H "Content-Type: application/json" -H \
        "Authorization: Bearer $(gcloud auth print-access-token)" \
        https://containeranalysis.googleapis.com/v1alpha1/projects/[PROVIDER_PROJECT_ID]/notes?note_id=[NOTE_ID] -d @note.json
    

発生個所の作成

必要な IAM 役割: Occurrence を作成するには、ユーザーのプロジェクトに containeranalysis.occurrences.editor 役割が必要です。また、注記のプロジェクトに containeranalysis.notes.attacher 役割が必要です。

次の例では、新しい発生個所を作成します。

  1. 次の内容のファイルを occurrence.json という名前で作成します。

    {
        "resourceUrl": "<resource_url>",
        "noteName": "projects/<provider-project-id>/notes/<note_id>",
        "kind": "PACKAGE_VULNERABILITY",
        "vulnerabilityDetails": {
            "packageIssue": [{
                "affectedLocation": {
                    "cpeUri": "7",
                    "package": "a",
                    "version":  {
                        "epoch": "1"
                        "name": "namestring"
                        "revision": "r"
                    },
                },
                "fixedLocation": {
                    "cpeUri": "cpe:/o:debian:debian_linux:7",
                    "package": "a",
                    "version":  {
                        "epoch": "2"
                        "name": "namestring"
                        "revision": "1"
                    }
                }
            }]
        }
    }
    
  2. 次の curl コマンドを実行します。

    curl -v -X POST -H "Content-Type: application/json" -H \
        "Authorization: Bearer $(gcloud auth print-access-token)" \
        https://containeranalysis.googleapis.com/v1alpha1/projects/[PROJECT_ID]/occurrences -d @occurrence.json
    

Cloud Pub/Sub の通知

Container Registry は、脆弱性のスキャン時に Cloud Pub/Sub 経由で通知を送信します。Container Analysis API を有効にすると、エンティティ通知の種類ごとに、次の Cloud Pub/Sub トピックがプロジェクトに作成されます。

  • resource-notes-notes-v1alpha1
  • resource-notes-occurrences-v1alpha1

これらのトピックを使用して通知を受信します。

注記または発生個所が作成または更新されるたびに、それぞれのトピックにメッセージがパブリッシュされます。

Pub/Sub ペイロードは JSON 形式で、スキーマは次のとおりです。

注:

{
    "noteName": "providers/[PROJECT_ID]/notes/[NOTE_ID]"
}

発生個所:

{
    "occurrenceName": "projects/[PROJECT_ID]/occurrences/[OCCURRENCE_ID]"
}

通知が送信されているかどうかテストするには、次の gcloud コマンドを使用してトピックを登録し、メッセージを pull します。

トピックを登録するには:

gcloud beta pubsub subscriptions create --topic \
    resource-notes-occurrences-v1alpha1 occurrences

トピックからメッセージを pull するには:

gcloud beta pubsub subscriptions pull --auto-ack occurrences

サブスクライバー アプリケーションで使用できるのは、サブスクリプションの作成後にトピックにパブリッシュしたメッセージだけです。このため、メッセージをすぐに取得できない場合があります。

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...