このドキュメントでは、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.
-
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 リポジトリを作成し、Python コードを含むコンテナ イメージをリポジトリに push します。Artifact Registry に慣れていない場合は、Docker のクイックスタートをご覧ください。
Cloud Build を使用して Python アプリケーションをビルドしてコンテナ化する方法については、 Python アプリケーションのビルド、テスト、コンテナ化をご覧ください。
Artifact Analysis では、既存のイメージは自動的にスキャンされません。既存のイメージをスキャンするには、もう一度 push する必要があります。
イメージの脆弱性を表示する
Artifact Analysis は、Artifact Registry にアップロードされた新しいイメージをスキャンします。このスキャンにより、コンテナ内のパッケージに関する情報が抽出されます。
Artifact Registry にイメージの脆弱性のオカレンスを表示するには、Google Cloud コンソール、Google Cloud CLI、または Container Analysis API を使用します。イメージに脆弱性が存在する場合、その詳細を確認できます。
Artifact Analysis は、過去 30 日間に push または pull されたイメージのメタデータのみを更新します。Artifact Analysis は、30 日以上経過したメタデータをアーカイブします。アーカイブされたメタデータを含むイメージを再スキャンするには、そのイメージを 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
イメージタグまたはレイヤの脆弱性を表示するには:
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
を含む結果を返します。
脆弱性オカレンスをフィルタするには:
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 は、脆弱性オカレンスのフィルタで説明されている形式のサンプル フィルタ式です。
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 通知を使用すると、脆弱性やその他のメタデータに関する通知を受け取ることができます。
Kritis Signer と Voucher を使用すると、ビルド パイプラインの一部として Binary Authorization 証明書を作成できます。これらのツールは、脆弱性スキャンの結果に基づいて Binary Authorization 証明書を作成できます。詳細については、Kritis Signer で証明書を作成するまたは Voucher で証明書を作成するをご覧ください。