このドキュメントでは、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.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry and Container Scanning APIs.
-
Install the Google Cloud CLI.
-
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
-
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.
-
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
-
To initialize the gcloud CLI, run the following command:
gcloud init
- Artifact Registry に Docker リポジトリを作成し、Java コードを含むコンテナ イメージをリポジトリに push します。Artifact Registry に習熟していない場合は、Docker のクイックスタートをご覧ください。
Cloud Build を使用して Java アプリケーションをビルドしてコンテナ化する方法については、 Java アプリケーションのビルド、テスト、コンテナ化をご覧ください。
リポジトリのリストを取得します。
リポジトリ リストで、リポジトリをクリックします。
イメージのリストで、イメージ名をクリックします。
各イメージ ダイジェストの脆弱性の総数が、[脆弱性] 列に表示されます。
イメージで検出された脆弱性の一覧を表示するには、[脆弱性] 列のリンクをクリックします。
[スキャン結果] セクションには、スキャンされたパッケージ タイプ、脆弱性の合計数、修正プログラムが利用可能な脆弱性、修正プログラムがない脆弱性、有効な重大度の概要が表示されます。
脆弱性の表には、検出された各脆弱性の共通脆弱性識別子(CVE)名、有効な重大度、共通脆弱性スコアリング システム(CVSS)スコア、修正(利用可能な場合)、脆弱性を含むパッケージの名前、パッケージ タイプが一覧表示されます。
これらのファイルをフィルタリングして並べ替え、特定のファイル、ディレクトリ、またはファイル拡張子でファイルの種類を確認できます。
Google Cloud コンソールには、この表に最大 1,200 件の脆弱性が表示されます。イメージに 1, 200 個を超える脆弱性がある場合は、gcloud または API を使用して完全なリストを表示する必要があります。
特定の CVE の詳細については、CVE 名をクリックします。
バージョン番号や影響を受ける場所などの脆弱性発生の詳細を表示するには、脆弱性の名前を含む行で [表示] または [修正済みを表示] をクリックします。修正プログラムのない脆弱性のリンクテキストは [表示]、修正プログラムが適用されている脆弱性のリンクテキストは [修正済みを表示] です。
- 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
- LOCATION は、リポジトリのリージョンまたはマルチリージョンのロケーションです。
- PROJECT_ID は Google Cloud コンソールのプロジェクト ID です。
- REPOSITORY は、イメージが保存されるリポジトリの名前です。
- IMAGE_ID は、リポジトリ内のイメージの名前です。
- TAG は、情報を取得するイメージのタグです。
HASH は、イメージのダイジェストです。
Artifact Analysis は、
packageType
を含む結果を返します。- LOCATION は、リポジトリのリージョンまたはマルチリージョンのロケーションです。
- PROJECT_ID は Google Cloud コンソールのプロジェクト ID です。
- REPOSITORY は、イメージが保存されるリポジトリの名前です。
- IMAGE_ID は、リポジトリ内のイメージの名前です。
- FILTER_EXPRESSION は、脆弱性オカレンスのフィルタで説明されている形式のサンプル フィルタ式です。
DEPLOYMENT
は、オカレンスの種類です。- RESOURCE_URL は、
https://LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID@sha256:HASH
形式の画像の完全な URL です。 - RESOURCE_URL_PREFIX は、リソース URL のサブ文字列を指定します。
- イメージのすべてのバージョンをフィルタするには、イメージ ダイジェストを省略します。
https://LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID@
の形式を使用します。 - プロジェクト内のすべてのイメージをフィルタするには、リソースのロケーションとプロジェクトのみを指定します。
https://LOCATION-docker.pkg.dev/PROJECT_ID/
の形式を使用します。
- イメージのすべてのバージョンをフィルタするには、イメージ ダイジェストを省略します。
- ENCODED_RESOURCE_URL は、イメージへのエンコードされたパスです。エンコードについては、URL エンコードをご覧ください。
VULNERABILITY
は、オカレンスの種類です。- PACKAGE_TYPE はアプリケーション言語パッケージのタイプです。使用できるタイプは、
COMPOSER
、GO
、MAVEN
、NPM
、NUGET
、PYTHON
、RUBYGEMS
、RUST
です。 - LOCATION は、リポジトリのリージョンまたはマルチリージョンのロケーションです。
- PROJECT_ID は Google Cloud コンソールのプロジェクト ID です。
- REPOSITORY は、イメージが保存されるリポジトリの名前です。
- IMAGE_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 形式が使用されます。 goog-vulnz
は、Artifact Analysis の脆弱性分析のPROVIDER_PROJECT_ID
です。カスタム プロジェクトで Artifact Analysis を使用している場合は、この値を独自のプロバイダ プロジェクト ID に置き換えることができます。- ENCODED_RESOURCE_URL は、イメージへのエンコードされたパスです。エンコードについては、URL エンコードをご覧ください。
- NOTE_ID はメモの ID です。たとえば、Artifact Analysis のスキャン結果に脆弱性が表示される場合、多くの場合、
CVE-2019-12345
のような CVE 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 を統合して証明書を作成し、既知のセキュリティ問題を含むコンテナ イメージがデプロイ環境で実行されないようにします。
イメージの脆弱性を表示する
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 コンソールでオカレンスを表示する
イメージの脆弱性を表示するには:
gcloud を使用してオカレンスを表示する
Artifact Registry のイメージの検出結果を表示するには、次のコマンドを実行します。
gcloud artifacts docker images list --show-occurrences \
LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID
ここで
イメージタグまたはレイヤの脆弱性を表示するには:
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
ここで
脆弱性オカレンスをフィルタするには:
gcloud artifacts docker images list --show-occurrences \
LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID \
--occurrence-filter=FILTER_EXPRESSION
ここで
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"
ここで
hasPrefix
関数を使用すると、より広い範囲でフィルタできます。
たとえば、次のフィルタは、複数のイメージを対象に特定の種類のオカレンスをフィルタします。
kind="NOTE_KIND" AND has_prefix(resourceUrl, "RESOURCE_URL_PREFIX")
ここで
脆弱性オカレンスを表示する
イメージの脆弱性オカレンスのリストを取得するには、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
ここで
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
ここで
特定のメモに関連付けられている画像を表示する
特定のメモ 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
ここで
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
ここで
特定のイメージのメモを確認するには、次のフィルタ式を使用します。
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"
ここで