このドキュメントでは、Container Scanning API を有効にして、Artifact Registry にイメージを push し、イメージで検出された脆弱性のリストを表示する方法について説明します。
Artifact Analysis は、Artifact Registry と Container Registry(非推奨)のコンテナ イメージの脆弱性情報を提供します。メタデータはメモとして保存されます。イメージに関連付けられたメモの各インスタンスが検出されるたびにオカレンスが作成されます。詳細については、概要と料金のドキュメントをご覧ください。
この API を有効にすると、Artifact Registry で言語パッケージ スキャンも有効になります。サポートされているパッケージの種類をご覧ください。
始める前に
- 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.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry and Container Scanning APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry and Container Scanning APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
- Artifact Registry に Docker リポジトリを作成し、コンテナ イメージをリポジトリに push します。Artifact Registry に習熟していない場合は、Docker のクイックスタートをご覧ください。
イメージの脆弱性を表示する
Artifact Analysis は、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 コンソールで発生を表示する
イメージの脆弱性を表示するには:
リポジトリのリストを取得します。
リポジトリ リストで、リポジトリをクリックします。
画像リストで、イメージ名をクリックします。
各イメージ ダイジェストの脆弱性の総数が、[脆弱性] 列に表示されます。
イメージで検出された脆弱性の一覧を表示するには、[脆弱性] 列のリンクをクリックします。
[スキャン結果] セクションには、スキャンされたパッケージの種類、脆弱性の合計数、修正可能な脆弱性、修正不可能な脆弱性、有効な重大度の概要が表示されます。
脆弱性の表には、検出された各脆弱性の Common Vulnerability and Exposures(CVE)名、有効な重大度、Common Vulnerability Scoring System(CVSS)スコア、修正(利用可能な場合)、脆弱性が含まれているパッケージの名前、パッケージ タイプが表示されます。
これらのファイルをフィルタして並べ替えることで、ファイル拡張子で特定のファイル、ディレクトリ、ファイルの種類を確認できます。
Google Cloud コンソールには、この表に最大 1,200 個の脆弱性が表示されます。イメージに 1, 200 を超える脆弱性がある場合は、gcloud または API を使用して完全なリストを表示する必要があります。
特定の CVE の詳細については、CVE 名をクリックします。
バージョン番号や影響を受ける場所など、脆弱性の発生の詳細を表示するには、脆弱性の名前の行にある [表示] または [修正済みを確認] をクリックします。リンクテキストは、修正されていない脆弱性の場合は [表示]、修正が適用されている脆弱性の場合は [修正済みを確認] です。
gcloud を使用して発生を表示する
イメージのオカレンスを表示するには:
Artifact Registry
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
Container Registry
gcloud beta container images list-tags \
HOSTNAME/PROJECT_ID/IMAGE_ID
ここで
- HOSTNAME はマルチリージョン ホスト名です。
gcr.io
asia.gcr.io
eu.gcr.io
us.gcr.io
- PROJECT_ID は、イメージを含むプロジェクトの ID です。
- IMAGE_ID は、脆弱性を表示するイメージの ID です。このコマンドではイメージタグを指定できません。
デフォルトでは、最新の 10 個のイメージが返されます。表示する画像の数を変更するには、--show-occurrences-from
フラグを使用します。たとえば、次のコマンドは直近の 25 個のイメージを返します。
gcloud beta container images list-tags --show-occurrences-from=25 \
gcr.io/my-project/my-image
イメージタグまたはレイヤの脆弱性を表示するには:
Artifact Registry
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
ここで
Container Registry
gcloud beta container images describe HOSTNAME/PROJECT_ID/IMAGE_ID@sha256:HASH \
--show-package-vulnerability
ここで
- HOSTNAME はマルチリージョン ホスト名です。
gcr.io
asia.gcr.io
eu.gcr.io
us.gcr.io
- PROJECT_ID は、イメージを含むプロジェクトの ID です。
- IMAGE_ID は、脆弱性を表示するイメージの ID です。
- HASH は、イメージのダイジェストです。
脆弱性オカレンスをフィルタするには:
Artifact Registry
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 は、脆弱性オカレンスのフィルタで説明されている形式のサンプル フィルタ式です。
Container Registry
gcloud beta container images list-tags \
HOSTNAME/PROJECT_ID/IMAGE_ID --occurrence-filter=FILTER_EXPRESSION
ここで
- HOSTNAME はマルチリージョン ホスト名です。
gcr.io
asia.gcr.io
eu.gcr.io
us.gcr.io
- PROJECT_ID は、イメージを含むプロジェクトの ID です。
- IMAGE_ID は、脆弱性オカレンスを表示するイメージの ID です。
- FILTER_EXPRESSION は、脆弱性オカレンスのフィルタで説明されている形式のサンプル フィルタ式です。
API またはコードを使用して発生を表示する
イメージのオカレンスを表示するには、適切なスニペットを使用します。コード スニペットでは、Container Registry 内のイメージの URL を指定します。Artifact Registry を使用している場合は、次の形式の URL を使用してイメージを指定します。
LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID
API
cURL の使用
プロジェクトのオカレンスのリストを取得するには:
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
Java
Artifact Analysis のクライアント ライブラリをインストールして使用する方法については、Artifact Analysis のクライアント ライブラリをご覧ください。 詳細については、Artifact Analysis Java API のリファレンス ドキュメントをご覧ください。
Artifact Analysis に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
Go
Artifact Analysis のクライアント ライブラリをインストールして使用する方法については、Artifact Analysis のクライアント ライブラリをご覧ください。 詳細については、Artifact Analysis Go API のリファレンス ドキュメントをご覧ください。
Artifact Analysis に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
Node.js
Artifact Analysis のクライアント ライブラリをインストールして使用する方法については、Artifact Analysis のクライアント ライブラリをご覧ください。 詳細については、Artifact Analysis Node.js API のリファレンス ドキュメントをご覧ください。
Artifact Analysis に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
Ruby
Artifact Analysis のクライアント ライブラリをインストールして使用する方法については、Artifact Analysis のクライアント ライブラリをご覧ください。 詳細については、Artifact Analysis Ruby API のリファレンス ドキュメントをご覧ください。
Artifact Analysis に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
Python
Artifact Analysis のクライアント ライブラリをインストールして使用する方法については、Artifact Analysis のクライアント ライブラリをご覧ください。 詳細については、Artifact Analysis Python API のリファレンス ドキュメントをご覧ください。
Artifact Analysis に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
Cloud Build で発生を表示する
Cloud Build を使用している場合は、Google Cloud コンソールの [セキュリティ分析情報] サイドパネルでイメージの脆弱性を確認することもできます。
[セキュリティ分析情報] サイドパネルには、Artifact Registry に保存されているアーティファクトのビルド セキュリティ情報の概要が表示されます。サイドパネルの詳細と、Cloud Build を使用してソフトウェア サプライ チェーンを保護する方法については、ビルドのセキュリティ分析情報を表示するをご覧ください。
オカレンスをフィルタする
gcloud
コマンドや Artifact Analysis API のフィルタ文字列を使用して、表示する前にオカレンスを絞り込むことができます。以降では、サポートされている検索フィルタについて説明します。
検出オカレンスを表示する
イメージが Container Registry に最初に push されるときに、コンテナ イメージの初期スキャンに関する情報を含めた検出オカレンスが作成されます。
イメージの検出オカレンスを取得するには、次のフィルタ式を使用します。
kind="DISCOVERY" AND resourceUrl="RESOURCE_URL"
次のスニペットは、フィルタ式を使用してイメージの検出オカレンスを表示する方法を示しています。コード スニペットでは、Container Registry 内のイメージの URL を指定します。Artifact Registry を使用している場合は、次の形式の URL を使用してイメージを指定します。
LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID
gcloud
イメージの検出オカレンスを表示するには:
この場合、コマンドで式を直接使用しませんが、同じ情報が引数として渡されます。
Artifact Registry:
gcloud artifacts docker images list --show-occurrences \
--occurrence-filter='kind="DISCOVERY"' --format=json \
LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID
Container Registry:
gcloud beta container images list-tags \
--occurrence-filter='kind="DISCOVERY"' --format=json HOSTNAME/PROJECT_ID/IMAGE_ID
API
検出オカレンスを取得するには、次のようにフィルタ式を URL エンコード型にして、GET
リクエストに埋め込む必要があります。
GET https://containeranalysis.googleapis.com/v1/projects/PROJECT_ID/occurrences?filter=kind%3D%22DISCOVERY%22%20AND%20resourceUrl%3D%22ENCODED_RESOURCE_URL%22
詳細については、projects.occurrences.get
API エンドポイントをご覧ください。
Java
Artifact Analysis のクライアント ライブラリをインストールして使用する方法については、Artifact Analysis のクライアント ライブラリをご覧ください。 詳細については、Artifact Analysis Java API のリファレンス ドキュメントをご覧ください。
Artifact Analysis に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
Go
Artifact Analysis のクライアント ライブラリをインストールして使用する方法については、Artifact Analysis のクライアント ライブラリをご覧ください。 詳細については、Artifact Analysis Go API のリファレンス ドキュメントをご覧ください。
Artifact Analysis に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
Node.js
Artifact Analysis のクライアント ライブラリをインストールして使用する方法については、Artifact Analysis のクライアント ライブラリをご覧ください。 詳細については、Artifact Analysis Node.js API のリファレンス ドキュメントをご覧ください。
Artifact Analysis に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
Ruby
Artifact Analysis のクライアント ライブラリをインストールして使用する方法については、Artifact Analysis のクライアント ライブラリをご覧ください。 詳細については、Artifact Analysis Ruby API のリファレンス ドキュメントをご覧ください。
Artifact Analysis に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
Python
Artifact Analysis のクライアント ライブラリをインストールして使用する方法については、Artifact Analysis のクライアント ライブラリをご覧ください。 詳細については、Artifact Analysis Python API のリファレンス ドキュメントをご覧ください。
Artifact Analysis に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
脆弱性オカレンスを表示する
特定のイメージの脆弱性オカレンスを表示するには、次のフィルタ式を使用してクエリを作成します。
kind="VULNERABILITY" AND resourceUrl="RESOURCE_URL"
次のスニペットは、イメージの脆弱性オカレンスのリストを取得する方法を示しています。コード スニペットでは、Container Registry 内のイメージの URL を指定します。Artifact Registry を使用している場合は、次の形式の URL を使用してイメージを指定します。
LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID
gcloud
イメージの脆弱性オカレンスを表示するには:
この場合、コマンドで式を直接使用しませんが、同じ情報が引数として渡されます。
Artifact Registry
gcloud artifacts docker images list --show-occurrences \
--occurrence-filter='kind="VULNERABILITY"' --format=json \
LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID
Container Registry
gcloud beta container images list-tags \
--occurrence-filter='kind="VULNERABILITY"' --format=json HOSTNAME/PROJECT_ID/IMAGE_ID
API
リソース URL は URL エンコードし、次のように GET リクエストに埋め込む必要があります。
GET https://containeranalysis.googleapis.com/v1/projects/PROJECT_ID/occurrences?filter=kind%3D%22VULNERABILITY%22%20AND%20resourceUrl%3D%22ENCODED_RESOURCE_URL%22
詳細については、projects.occurrences.get
API エンドポイントをご覧ください。
Java
Artifact Analysis のクライアント ライブラリをインストールして使用する方法については、Artifact Analysis のクライアント ライブラリをご覧ください。 詳細については、Artifact Analysis Java API のリファレンス ドキュメントをご覧ください。
Artifact Analysis に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
Go
Artifact Analysis のクライアント ライブラリをインストールして使用する方法については、Artifact Analysis のクライアント ライブラリをご覧ください。 詳細については、Artifact Analysis Go API のリファレンス ドキュメントをご覧ください。
Artifact Analysis に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
Node.js
Artifact Analysis のクライアント ライブラリをインストールして使用する方法については、Artifact Analysis のクライアント ライブラリをご覧ください。 詳細については、Artifact Analysis Node.js API のリファレンス ドキュメントをご覧ください。
Artifact Analysis に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
Ruby
Artifact Analysis のクライアント ライブラリをインストールして使用する方法については、Artifact Analysis のクライアント ライブラリをご覧ください。 詳細については、Artifact Analysis Ruby API のリファレンス ドキュメントをご覧ください。
Artifact Analysis に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
Python
Artifact Analysis のクライアント ライブラリをインストールして使用する方法については、Artifact Analysis のクライアント ライブラリをご覧ください。 詳細については、Artifact Analysis Python API のリファレンス ドキュメントをご覧ください。
Artifact Analysis に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
特定の種類のオカレンスを表示する
前の 2 つの例では、フィルタ式の違いは kind
の値だけですが、これによりオカレンスの種類を識別します。このフィールドを使用して、オカレンスのリストを特定の種類(脆弱性やデプロイメントなど)に限定します。
特定のイメージのオカレンスを取得するには、このフィルタ式を使用します。
kind="NOTE_KIND" AND resourceUrl="RESOURCE_URL"
ここで
- NOTE_KIND はメモの種類です。
- たとえば、検出オカレンスを表示するには、
DISCOVERY
を使用します。これらは、イメージが最初に Container Registry に push されたときに作成されます。 - 脆弱性オカレンスを表示するには、
VULNERABILITY
を使用します。
- たとえば、検出オカレンスを表示するには、
-
RESOURCE_URL は、イメージ
https://HOSTNAME/PROJECT_ID/IMAGE_ID@sha256:HASH
の完全な URL です。
複数のイメージを対象に特定の種類のオカレンスを取得するには、次のフィルタ式を使用します。
kind="NOTE_KIND" AND has_prefix(resourceUrl, "RESOURCE_URL_PREFIX")
ここで
- RESOURCE_URL_PREFIX は、イメージの URL 接頭辞です。
- 1 つのイメージのすべてのバージョンを表示する場合:
https://HOSTNAME/PROJECT_ID/IMAGE_ID@
- プロジェクト内のすべてのイメージを表示する場合:
https://HOSTNAME/PROJECT_ID/
- 1 つのイメージのすべてのバージョンを表示する場合:
特定のメモに関連付けられている画像を表示する
特定のメモ ID に関連付けられているリソースのリストを取得できます。たとえば、特定の CVE の脆弱性を含むイメージを一覧表示できます。
プロジェクト内で特定のメモに関連付けられているすべてのイメージを一覧表示するには、次のフィルタ式を使用します。
noteProjectId="PROVIDER_PROJECT_ID" AND noteId="NOTE_ID"
特定のイメージのメモを確認するには、次のフィルタ式を使用します。
resourceUrl="RESOURCE_URL" AND noteProjectId="PROVIDER_PROJECT_ID" \ AND noteId="NOTE_ID"
ここで
- PROVIDER_PROJECT_ID は、プロバイダ プロジェクトの ID です。たとえば、
goog-vulnz
はデフォルトの脆弱性分析を提供します。 - NOTE_ID はメモの ID です。多くの場合、セキュリティ関連のメモは
CVE-2019-12345
という形式になります。 -
RESOURCE_URL は、イメージ
https://HOSTNAME/PROJECT_ID/IMAGE_ID@sha256:HASH
の完全な URL です。
たとえば、Google による分析で CVE-2017-16231 のオカレンスがあるすべてのイメージを確認するには、次のフィルタ式を使用します。
noteProjectId="goog-vulnz" AND noteId="CVE-2017-16231"
次のステップ
Pub/Sub 通知を使用すると、脆弱性やその他のメタデータに関する通知を受け取ることができます。
Kritis Signer と Voucher を使用すると、ビルド パイプラインの一部として Binary Authorization 証明書を作成できます。これらのツールは、脆弱性スキャンの結果に基づいて Binary Authorization 証明書を作成できます。詳細については、Kritis Signer で証明書を作成するまたは Voucher で証明書を作成するをご覧ください。