このドキュメントでは、Container Scanning API を有効にし、イメージを Artifact Registry に push して、イメージで見つかった脆弱性のリストを表示する方法について説明します。
Artifact Analysis は、脆弱性情報をメモとして保存します。画像に関連付けられたメモのインスタンスごとに、オカレンスが作成されます。詳細については、概要と料金に関するドキュメントをご覧ください。
始める前に
- Google Cloud アカウントにログインします。 Google Cloudを初めて使用する場合は、 アカウントを作成して、実際のシナリオで Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分も差し上げます。
-
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 role
(
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, if any are not already enabled.
Roles required to enable APIs
To enable APIs, you need the
serviceusage.services.enablepermission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.-
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.
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 role
(
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, if any are not already enabled.
Roles required to enable APIs
To enable APIs, you need the
serviceusage.services.enablepermission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.-
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 リポジトリを作成し、Go コードを含むコンテナ イメージをリポジトリに push します。Artifact Registry に習熟されていない場合は、Docker のクイックスタートをご覧ください。
Cloud Build を使用して Go アプリケーションをビルドしてコンテナ化する方法については、 Go アプリケーションをビルドするをご覧ください。
必要なロール
パッケージ スキャンの結果を表示するために必要な権限を取得するには、プロジェクトに対する次の IAM ロールを付与するよう管理者に依頼してください。
- Container Scanner サービス エージェント (
roles/containerscanning.ServiceAgent) - Container Analysis Occurrences Viewer (
roles/containeranalysis.occurrences.viewer) - Container Analysis メモ閲覧者 (
roles/containeranalysis.notes.viewer) - Artifact Registry 読み取り(
roles/artifactregistry.reader)
ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。
必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。
イメージの脆弱性を表示する
Artifact Analysis は、Artifact Registry にアップロードされた新しいイメージをスキャンします。このスキャンにより、コンテナ内のパッケージに関する情報が抽出されます。
Artifact Registry のイメージの脆弱性検出結果は、 Google Cloud コンソール、Google Cloud CLI、または Container Analysis API を使用して確認できます。イメージに脆弱性がある場合は、詳細を取得できます。
Artifact Analysis は、イメージとパッケージが過去 30 日以内に pull された場合、スキャンを継続します。30 日を過ぎると、スキャンされたイメージとパッケージのメタデータは更新されなくなり、結果は古くなります。
Artifact Analysis は、90 日以上前のメタデータをアーカイブします。このアーカイブされたメタデータは、API を使用してのみ評価できます。古いメタデータまたはアーカイブされたメタデータを含むイメージを再スキャンするには、そのイメージを pull します。メタデータの更新には、最長で 24 時間ほどかかることがあります。メタデータが古いかアーカイブされているパッケージは、再スキャンできません。
Google Cloud コンソールでオカレンスを表示する
イメージの脆弱性を表示するには:
リポジトリのリストを取得します。
リポジトリ リストで、リポジトリをクリックします。
イメージのリストで、イメージ名をクリックします。
各イメージ ダイジェストの脆弱性の総数が、[脆弱性] 列に表示されます。
イメージで検出された脆弱性の一覧を表示するには、[脆弱性] 列のリンクをクリックします。
[スキャン結果] セクションには、スキャンされたパッケージ タイプ、脆弱性の合計数、修正が利用可能な脆弱性、修正がない脆弱性、有効な重大度の概要が表示されます。
脆弱性の表には、検出された各脆弱性の共通脆弱性識別子(CVE)名、有効な重大度、共通脆弱性評価システム(CVSS)スコア、修正(利用可能な場合)、脆弱性を含むパッケージの名前、パッケージ タイプが一覧表示されます。
Google Cloud コンソールでは、このテーブルに 1 ページあたり最大 1,200 件の脆弱性が表示されます。これらのファイルをフィルタして並べ替えることで、特定のファイル、ディレクトリ、レイヤ、ファイル形式をファイル拡張子で確認できます。
特定の CVE の詳細については、CVE 名をクリックします。
バージョン番号や影響を受ける場所などの脆弱性発生の詳細を表示するには、脆弱性の名前を含む行で [表示] または [修正済みを表示] をクリックします。修正プログラムのない脆弱性の場合はリンクテキストが [表示]、修正プログラムが適用されている脆弱性の場合は [修正済みを表示] になります。
特定のレイヤの脆弱性を表示する
Artifact Analysis は、脆弱性を含むパッケージと、そのレイヤを導入した Docker ビルドコマンドを特定するのに役立つレイヤ固有のメタデータを提供します。Google Cloud コンソールでレイヤベースの脆弱性メタデータを表示するには:
Artifact Registry で、リポジトリのリストを開きます。
[リポジトリ] ページで、リポジトリをクリックします。
[リポジトリの詳細] ページで、画像をクリックします。
画像モード リストで、イメージ ダイジェストをクリックします。
イメージ ダイジェストの詳細ページで、[脆弱性] タブをクリックします。
レイヤベースのメタデータが利用可能な場合、Artifact Analysis は [レイヤ] バーに選択可能なレイヤのリストを表示します。
レイヤのリストを表示するには、レイヤのプルダウン メニューをクリックします。
プルダウン リストが開き、レイヤの番号付きリストが表示されます。レイヤ 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"
}
}
}
脆弱性の発生をフィルタする
脆弱性のオカレンスをフィルタするには、--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="PACKAGE_VULNERABILITY"' --format=json \
LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID
ここで
API
API クエリで、次のフィルタ式を使用します。
kind="PACKAGE_VULNERABILITY" AND resourceUrl="RESOURCE_URL"
ここで
DEPLOYMENTは発生の種類です。- RESOURCE_URL は、
https://LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY_ID/IMAGE@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/にします。
- イメージのすべてのバージョンをフィルタするには、イメージ ダイジェストを省略します。
脆弱性の発生を表示する
脆弱性検出のリストは、gcloud CLI または Artifact Analysis API を使用して表示できます。
gcloud
イメージの脆弱性オカレンスのリストを取得するには、VULNERABILITY オカレンス タイプでフィルタできます。
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 は、
http://LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY_ID/IMAGE@sha256:HASH形式の画像の完全な URL です。 goog-vulnzは、Artifact Analysis の脆弱性分析のPROVIDER_PROJECT_IDです。- NOTE_ID はメモの ID です。セキュリティ関連のメモは、多くの場合
CVE-2019-12345の形式で記述されます。
次のステップ
Pub/Sub 通知を使用して、脆弱性やその他のメタデータに関する通知を受け取ります。
Kritis Signer を使用すると、ビルド パイプラインの一部として Binary Authorization 証明書を作成できます。このツールは、脆弱性スキャンの結果に基づいて Binary Authorization 証明書を作成できます。詳細については、Kritis Signer を使用して構成証明を作成するをご覧ください。