このドキュメントでは、Container Scanning API を有効にして、イメージを Artifact Registry に push し、イメージで見つかった脆弱性の一覧を表示する方法について説明します。
Artifact Analysis は、脆弱性情報をメモとして保存します。イメージに関連付けられたメモの各インスタンスが検出されるたびにオカレンスが作成されます。詳細については、概要と料金のドキュメントをご覧ください。
始める前に
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
- 
    
    
      In the Google Cloud console, on the project selector page, select or create a Google Cloud project. Roles required to select or create a project - Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
- 
      Create a project: To create a project, you need the Project Creator
      (roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
 
- 
  
    Verify that billing is enabled for your Google Cloud project. 
- 
  
  
    
      Enable the Artifact Registry and Container Scanning APIs. Roles required to enable APIs To enable APIs, you need the Service Usage Admin IAM role ( roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.
- 
    
    
      In the Google Cloud console, on the project selector page, select or create a Google Cloud project. Roles required to select or create a project - Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
- 
      Create a project: To create a project, you need the Project Creator
      (roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
 
- 
  
    Verify that billing is enabled for your Google Cloud project. 
- 
  
  
    
      Enable the Artifact Registry and Container Scanning APIs. Roles required to enable APIs To enable APIs, you need the Service Usage Admin IAM role ( roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.
- Artifact Registry に Docker リポジトリを作成し、Python コードを含むコンテナ イメージをリポジトリに push します。Artifact Registry に習熟していない場合は、Docker のクイックスタートをご覧ください。
 Cloud Build を使用して Python アプリケーションをビルドしてコンテナ化する方法については、 Python アプリケーションのビルド、テスト、コンテナ化をご覧ください。
 
イメージの脆弱性を表示する
Artifact Analysis は、Artifact Registry にアップロードされた新しいイメージをスキャンします。このスキャンにより、コンテナ内のパッケージに関する情報が抽出されます。
Artifact Registry に格納されているイメージの脆弱性オカレンスを表示するには、 Google Cloud コンソール、Google Cloud CLI、または Container Analysis API を使用します。イメージに脆弱性が存在する場合、その詳細を確認できます。
Artifact Analysis は、過去 30 日間に push または pull されたイメージのメタデータのみを更新します。30 日を過ぎると、メタデータは更新されなくなり、結果は古くなります。また、Artifact Analysis は 90 日以上前のメタデータをアーカイブします。このメタデータは、 Google Cloud コンソール、gcloud、API を使用して取得することはできません。古いメタデータまたはアーカイブされたメタデータを含むイメージを再スキャンするには、そのイメージを pull します。メタデータの更新には、最長で 24 時間ほどかかることがあります。
Google Cloud コンソールでオカレンスを表示する
イメージの脆弱性を表示するには:
- リポジトリのリストを取得します。 
- リポジトリ リストで、リポジトリをクリックします。 
- イメージのリストで、イメージ名をクリックします。 - 各イメージ ダイジェストの脆弱性の総数が、[脆弱性] 列に表示されます。   
- イメージで検出された脆弱性の一覧を表示するには、[脆弱性] 列のリンクをクリックします。 - [スキャン結果] セクションには、スキャンされたパッケージ タイプ、脆弱性の合計数、修正プログラムが利用可能な脆弱性、修正プログラムがない脆弱性、有効な重大度の概要が表示されます。   - 脆弱性の表には、検出された各脆弱性の共通脆弱性識別子(CVE)名、有効な重大度、共通脆弱性スコアリング システム(CVSS)スコア、修正プログラム(利用可能な場合)、脆弱性が含まれるパッケージの名前、パッケージ タイプが一覧表示されます。 - Google Cloud コンソールには、この表にページあたり最大 1,200 件の脆弱性が表示されます。これらのファイルをフィルタして並べ替え、特定のファイル、ディレクトリ、レイヤ、ファイル形式をファイル拡張子で確認できます。 
- 特定の CVE の詳細については、CVE 名をクリックします。 
- バージョン番号や影響を受ける場所などの脆弱性発生の詳細を表示するには、脆弱性の名前を含む行で [表示] または [修正済みを表示] をクリックします。リンクテキストは、修正プログラムのない脆弱性については [表示]、修正プログラムが適用されている脆弱性については [修正済みを表示] です。 
特定のレイヤの脆弱性を表示する
Artifact Analysis は、脆弱性を含むパッケージと、そのレイヤを導入した Docker ビルドコマンドを特定するのに役立つレイヤ固有のメタデータを提供します。
Google Cloud コンソールでレイヤベースの脆弱性メタデータを表示するには:
- Artifact Registry で、リポジトリのリストを開きます。 
- [リポジトリ] ページで、リポジトリをクリックします。 
- [リポジトリの詳細] ページで、イメージをクリックします。 
- イメージ バージョン リストで、イメージ ダイジェストをクリックします。 
- イメージ ダイジェストの詳細ページで、[脆弱性] タブをクリックします。 - レイヤベースのメタデータが利用可能な場合、Artifact Analysis は [レイヤ] バーに選択可能なレイヤのリストを表示します。 ![レイヤバーを含むイメージ ダイジェストの [脆弱性] ページの画像。レイヤバーには、番号付きのレイヤのリストから選択するためのプルダウン メニューがあります。](https://cloud.google.com/artifact-analysis/images/layers.png?hl=ja)  
- レイヤのリストを表示するには、レイヤのプルダウン メニューをクリックします。 - プルダウン リストが開き、レイヤの番号付きリストが表示されます。レイヤ 0 は一番下のレイヤを表し、その後のレイヤは前のレイヤを基盤として構築されます。脆弱性が見つかったレイヤのみが表示されます。   - Artifact Analysis は、各レイヤについて、レイヤのビルドに使用された Docker コマンドと、そのレイヤで検出された脆弱性の数を示します。 
- 特定のレイヤの脆弱性の詳細を確認するには、レイヤリストからレイヤを選択します。 - 脆弱性の表が更新され、選択したレイヤで見つかった脆弱性のみが表示されます。フィルタを追加したり、特定の脆弱性を調査したりできます。 
- 脆弱性の横にある [表示] または [修正を表示] をクリックすると、脆弱性の詳細情報を確認できます。 - [脆弱性の詳細] サイドパネルには、パッケージに脆弱性があるファイルの場所が表示されます。 
- [ファイルの場所] テーブルで、疑問符にカーソルを合わせると、追加のレイヤ メタデータが開きます。 - ダイアログには、レイヤ インデックス、レイヤビルド コマンド、レイヤ ダイジェスト、脆弱性を修復できるベースイメージが表示されます。 
gcloud を使用してオカレンスを表示する
Artifact Registry のイメージのオカレンスを表示するには、gcloud artifacts docker images list コマンドを実行します。
gcloud artifacts docker images list --show-occurrences \
    LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID
ここで
- LOCATION は、リポジトリのリージョンまたはマルチリージョンのロケーションです。
- PROJECT_ID は Google Cloud コンソールのプロジェクト ID です。
- REPOSITORY は、イメージが保存されるリポジトリの名前です。
- IMAGE_ID は、リポジトリ内のイメージの名前です。このコマンドではイメージタグを指定できません。
デフォルトでは、このコマンドは最新の 10 個のイメージを返します。表示する画像の数を変更するには、--show-occurrences-from フラグを使用します。たとえば、次のコマンドは最新の 25 個のイメージを返します。
gcloud artifacts docker images list --show-occurrences-from=25 \
    us-central1-docker.pkg.dev/my-project/my-repo/my-image
出力は次のようになります。
画像出力の例
  {
      "name": "projects/my-project/locations/us-central1/occurrences/22d3edfb-34f2-4d3f-be08-fd90c549f010",
      "resource": {
        "uri": "https://us-central1-docker.pkg.dev/my-project/my-repo/golang-nginx@sha256:5b54ef20748417ccdb0b87afedf98c44e699e2f59bd6cv48cbdc1ca2e72c80e3"
      },
      "noteName": "projects/my-project/locations/us-central1/notes/CVE-2005-2541",
      "kind": "VULNERABILITY",
      "createTime": "2025-01-21T15:57:01.238832Z",
      "updateTime": "2025-01-21T15:57:01.238832Z",
      "vulnerability": {
        "severity": "CRITICAL",
        "cvssScore": 10,
        "packageIssue": [
          {
            "affectedLocation": {
              "cpeUri": "cpe:/o:debian:debian_linux:12",
              "package": "tar",
              "version": {
                "name": "1.34+dfsg",
                "revision": "1.2+deb12u1",
                "kind": "NORMAL"
              }
            },
            "fixedLocation": {
              "cpeUri": "cpe:/o:debian:debian_linux:12",
              "package": "tar",
              "version": {
                "kind": "MAXIMUM"
              }
            },
            "packageType": "OS",
            "effectiveSeverity": "LOW",
            "file_location": [
                {
                "file_path": "/var/lib/dpkg/status",
                "layerDetails": {
                  "index": 0,
                  "diffID": "sha256:123",
                  "buildCommand": "FROM golang:example_sha256",
                  "BaseImages": [
                    {
                      "name": "library/golang",
                    },
                  ],
                },
              },
            ],
          }
        ],
        "shortDescription": "CVE-2005-2541",
        "longDescription": "NIST vectors: AV:N/AC:L/Au:N/C:C/I:C/A:C",
        "relatedUrls": [
          {
            "url": "https://security-tracker.debian.org/tracker/CVE-2005-2541",
            "label": "More Info"
          }
        ],
        "effectiveSeverity": "LOW",
        "cvssVersion": "CVSS_VERSION_2",
        "cvssV2": {
          "baseScore": 10,
          "attackVector": "ATTACK_VECTOR_NETWORK",
          "attackComplexity": "ATTACK_COMPLEXITY_LOW",
          "authentication": "AUTHENTICATION_NONE",
          "confidentialityImpact": "IMPACT_COMPLETE",
          "integrityImpact": "IMPACT_COMPLETE",
          "availabilityImpact": "IMPACT_COMPLETE"
        }
      }
    }
  イメージタグの脆弱性を表示する
イメージタグの脆弱性を表示するには、次のいずれかのコマンドを入力します。
gcloud artifacts docker images describe \
    LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID:TAG \
    --show-package-vulnerability
または
gcloud artifacts docker images describe \
    LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID@sha256:HASH \
    --show-package-vulnerability
ここで
- LOCATION は、リポジトリのリージョンまたはマルチリージョンのロケーションです。
- PROJECT_ID は Google Cloud コンソールのプロジェクト ID です。
- REPOSITORY は、イメージが保存されるリポジトリの名前です。
- IMAGE_ID は、リポジトリ内のイメージの名前です。
- TAG は、情報を取得するイメージのタグです。
- HASH は、イメージのダイジェストです。
Artifact Analysis は、packageType を含む結果を返します。
脆弱性オカレンスをフィルタする
脆弱性オカレンスをフィルタするには、--occurrence-filter パラメータを使用します。
gcloud artifacts docker images list --show-occurrences \
    LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID \
    --occurrence-filter=FILTER_EXPRESSION
ここで
- LOCATION は、リポジトリのリージョンまたはマルチリージョンのロケーションです。
- PROJECT_ID は Google Cloud コンソールのプロジェクト ID です。
- REPOSITORY は、イメージが保存されるリポジトリの名前です。
- IMAGE_ID は、リポジトリ内のイメージの名前です。
- FILTER_EXPRESSION は、脆弱性オカレンスのフィルタで説明されている形式のサンプル フィルタ式です。
特定のレイヤの脆弱性を表示する
layerDetails フィールドを使用すると、脆弱なパッケージを導入した特定のレイヤを特定し、そのレイヤに関する追加情報を表示できます。たとえば、次の画像に対する layerDetails 出力を考えてみましょう。
  "layerDetails": {
    "index": 0,
    "diffID": "sha256:123",
    "buildCommand": "FROM golang:example_sha256",
    "BaseImages": [
      {
        "name": "library/golang",
      },
    ],
  }
出力には、コンテナ イメージのレイヤ インデックスが 0 で、レイヤ ハッシュが sha256:123 であることが示されています。このレイヤのビルドに使用される Docker ビルドコマンドは FROM golang:example_sha256 です。このレイヤは library/golang ベースイメージにもあります。
API を使用してオカレンスを表示する
プロジェクトのオカレンスのリストを取得するには:
 curl -X GET -H "Content-Type: application/json" -H \
    "Authorization: Bearer $(gcloud auth print-access-token)" \
    https://containeranalysis.googleapis.com/v1/projects/PROJECT_ID/occurrences
プロジェクトの脆弱性の概要を取得するには:
 curl -X GET -H "Content-Type: application/json" -H \
    "Authorization: Bearer $(gcloud auth print-access-token)" \
    https://containeranalysis.googleapis.com/v1/projects/PROJECT_ID/occurrences:vulnerabilitySummary
特定のオカレンスの詳細を取得するには:
 curl -X GET -H "Content-Type: application/json" -H \
    "Authorization: Bearer $(gcloud auth print-access-token)" \
    https://containeranalysis.googleapis.com/v1/projects/PROJECT_ID/occurrences/OCCURRENCE_ID
Cloud Build で脆弱性を表示する
Cloud Build を使用している場合は、 Google Cloud コンソールの [セキュリティ分析情報] サイドパネルでイメージの脆弱性を確認することもできます。
[セキュリティ分析情報] サイドパネルには、Artifact Registry に保存されているアーティファクトのビルド セキュリティ情報の概要が表示されます。サイドパネルの詳細と、Cloud Build を使用してソフトウェア サプライ チェーンを保護する方法については、ビルドのセキュリティ分析情報を表示するをご覧ください。
オカレンスをフィルタする
gcloud コマンドや Artifact Analysis API のフィルタ文字列を使用して、表示する前にオカレンスを絞り込むことができます。以降では、サポートされている検索フィルタについて説明します。
特定の種類のオカレンスを表示する
kind 値を使用して、検出結果のタイプでフィルタできます。使用可能な種類をご覧ください。
次の例は、イメージのデプロイ オカレンスをフィルタする方法を示しています。
gcloud
gcloud CLI で次のコマンドを実行します。
gcloud artifacts docker images list --show-occurrences \
    --occurrence-filter='kind="DEPLOYMENT"' --format=json \
    LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID
ここで
API
API クエリで、次のフィルタ式を使用します。
kind="DEPLOYMENT" AND resourceUrl="RESOURCE_URL"
ここで
- DEPLOYMENTは、オカレンスの種類です。
- RESOURCE_URL は、https://LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID@sha256:HASH形式の画像の完全な URL です。
hasPrefix 関数を使用すると、より広い範囲でフィルタできます。
たとえば、次のフィルタは、複数のイメージを対象に特定の種類のオカレンスをフィルタします。
kind="NOTE_KIND" AND has_prefix(resourceUrl, "RESOURCE_URL_PREFIX")
ここで
- RESOURCE_URL_PREFIX は、リソース URL のサブ文字列を指定します。- イメージのすべてのバージョンをフィルタするには、イメージ ダイジェストを省略します。https://LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID@の形式を使用します。
- プロジェクト内のすべてのイメージをフィルタするには、リソースのロケーションとプロジェクトのみを指定します。https://LOCATION-docker.pkg.dev/PROJECT_ID/の形式を使用します。
 
- イメージのすべてのバージョンをフィルタするには、イメージ ダイジェストを省略します。
脆弱性オカレンスを表示する
イメージの脆弱性オカレンスのリストを取得するには、VULNERABILITY オカレンス タイプでフィルタできます。
gcloud
gcloud CLI で次のコマンドを実行します。
gcloud artifacts docker images list \
    --show-occurrences \
    --occurrence-filter='kind="VULNERABILITY"' \
    --format=json \
    LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID
ここで
API
API クエリで、次のフィルタ式を使用します。
GET https://containeranalysis.googleapis.com/v1/projects/PROJECT_ID/occurrences?filter=kind%3D%22VULNERABILITY%22%20AND%20resourceUrl%3D%22ENCODED_RESOURCE_URL%22
ここで
- ENCODED_RESOURCE_URL は、イメージへのエンコードされたパスです。エンコードについては、URL エンコードをご覧ください。
API の使用について詳しくは、projects.occurrences.get をご覧ください。
パッケージ タイプでフィルタする
脆弱性スキャンの結果を 1 つのパッケージ タイプに制限するには、次の gcloud CLI コマンドを実行します。
  gcloud artifacts docker images list /
      --show-occurrences /
      --occurrence-filter='kind="VULNERABILITY" AND packageType="PACKAGE_TYPE"' /
      LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID
ここで
- VULNERABILITYは、オカレンスの種類です。
- PACKAGE_TYPE はアプリケーション言語パッケージのタイプです。使用できるタイプは、COMPOSER、GO、MAVEN、NPM、NUGET、PYTHON、RUBYGEMS、RUSTです。
- LOCATION は、リポジトリのリージョンまたはマルチリージョンのロケーションです。
- PROJECT_ID は Google Cloud コンソールのプロジェクト ID です。
- REPOSITORY は、イメージが保存されるリポジトリの名前です。
- IMAGE_ID は、リポジトリ内のイメージの名前です。このコマンドではイメージタグを指定できません。
特定のメモに関連付けられている画像を表示する
特定のメモ ID に関連付けられているリソースのリストを取得できます。たとえば、特定の CVE の脆弱性を含むイメージを一覧表示できます。
プロジェクト内で特定のメモに関連付けられているすべてのイメージを一覧表示するには、次のフィルタ式を使用します。
gcloud
gcloud artifacts docker images list /
    --show-occurrences /
    --occurrence-filter='noteProjectId="goog-vulnz" AND noteId="NOTE_ID"' /
    LOCATION-docker.pkg.dev/PROJECT_ID
ここで
- goog-vulnzは、Artifact Analysis の脆弱性分析の- PROVIDER_PROJECT_IDです。カスタム プロジェクトで Artifact Analysis を使用している場合は、この値を独自のプロバイダ プロジェクト ID に置き換えることができます。
- LOCATION は、リポジトリのリージョンまたはマルチリージョンのロケーションです。
- PROJECT_ID は Google Cloud コンソールのプロジェクト ID です。
- NOTE_ID はメモの ID です。たとえば、Artifact Analysis のスキャン結果に脆弱性が表示される場合、多くの場合、CVE-2019-12345のような CVE ID 形式が使用されます。
API
GET https://containeranalysis.googleapis.com/v1/projects/PROJECT_ID/occurrences?filter=noteProjectId%3D%22goog-vulnz%22%20AND%20resourceUrl%3D%22ENCODED_RESOURCE_URL%22%20AND%20noteId%3D%22NOTE_ID%22
ここで
- goog-vulnzは、Artifact Analysis の脆弱性分析の- PROVIDER_PROJECT_IDです。カスタム プロジェクトで Artifact Analysis を使用している場合は、この値を独自のプロバイダ プロジェクト ID に置き換えることができます。
- ENCODED_RESOURCE_URL は、イメージへのエンコードされたパスです。エンコードについては、URL エンコードをご覧ください。
- NOTE_ID はメモの ID です。たとえば、Artifact Analysis のスキャン結果に脆弱性が表示される場合、多くの場合、CVE-2019-12345のような CVE ID 形式が使用されます。
特定のイメージのメモを確認するには、次のフィルタ式を使用します。
gcloud
gcloud artifacts docker images list /
    --show-occurrences /
    --occurrence-filter='noteProjectId="goog-vulnz" AND noteId="NOTE_ID"' /
    LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID
場所
API
API クエリに次のフィルタ式を追加します。
resourceUrl="RESOURCE_URL" AND noteProjectId="goog-vulnz" \ AND noteId="NOTE_ID"
ここで
- RESOURCE_URL は、https://LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID@sha256:HASH形式の画像の完全な URL です。
- goog-vulnzは、Artifact Analysis の脆弱性分析の- PROVIDER_PROJECT_IDです。カスタム プロジェクトで Artifact Analysis を使用している場合は、この値を独自のプロバイダ プロジェクト ID に置き換えることができます。
- NOTE_ID はメモの ID です。多くの場合、セキュリティ関連のメモは CVE-2019-12345という形式になります。
次のステップ
- Pub/Sub 通知を使用すると、脆弱性やその他のメタデータに関する通知を受け取ることができます。 
- Artifact Analysis と Binary Authorization を統合して証明書を作成し、既知のセキュリティ問題を含むコンテナ イメージがデプロイ環境で実行されないようにします。