荷物を自動的にスキャンする

このドキュメントでは、Container Scanning API を有効にし、イメージを Artifact Registry に push して、イメージで見つかった脆弱性のリストを表示する方法について説明します。

Artifact Analysis は、脆弱性情報をメモとして保存します。画像に関連付けられたメモのインスタンスごとに、オカレンスが作成されます。詳細については、概要と料金のドキュメントをご覧ください。

始める前に

  1. 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 the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  2. Verify that billing is enabled for your Google Cloud project.

  3. 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.enable permission. 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.

    Enable the APIs

  4. Install the Google Cloud CLI.

  5. Configure the gcloud CLI to use your federated identity.

    For more information, see Sign in to the gcloud CLI with your federated identity.

  6. To initialize the gcloud CLI, run the following command:

    gcloud init
  7. Artifact Registry にリポジトリを作成し、アプリケーション コードを含むパッケージをリポジトリに push します。Artifact Registry でのパッケージの管理に慣れていない場合は、次のトピックをご覧ください。
    1. Java パッケージを Artifact Registry に保存する
    2. Artifact Registry に Node.js パッケージを保存する
    3. Python パッケージを Artifact Registry に保存する

この API を有効にすると、Artifact Registry で言語パッケージ スキャンも有効になります。サポートされているパッケージ タイプをご覧ください。

必要なロール

パッケージ スキャンの結果を表示するために必要な権限を取得するには、プロジェクトに対する次の IAM ロールを付与するよう管理者に依頼してください。

ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。

必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。

パッケージの脆弱性を表示する

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 コンソールでオカレンスを表示する

パッケージの脆弱性を確認するには:

  1. リポジトリのリストを取得します。

    [リポジトリ] ページを開く

  2. リポジトリ リストで、リポジトリをクリックします。

  3. パッケージのリストで、パッケージ名をクリックします。

    各パッケージの脆弱性の総数が、[脆弱性] 列に表示されます。

    脆弱性のあるスキャン済みパッケージ

  4. パッケージの脆弱性の一覧を表示するには、[脆弱性] 列のリンクをクリックします。

    [スキャン結果] セクションには、スキャンされたパッケージ タイプ、脆弱性の合計数、修正が利用可能な脆弱性、修正がない脆弱性、有効な重大度の概要が表示されます。

    脆弱性、修正、有効な重大度を一覧表示するスキャン結果ページ

    脆弱性の表には、検出された各脆弱性の共通脆弱性識別子(CVE)名、有効な重大度、共通脆弱性評価システム(CVSS)スコア、修正(利用可能な場合)、脆弱性を含むパッケージの名前、パッケージ タイプが一覧表示されます。これらのファイルをフィルタして並べ替え、ファイル拡張子で特定のファイル、ディレクトリ、ファイルタイプを確認できます。 Google Cloud コンソールでは、この表に 1 ページあたり最大 1,200 件の脆弱性が表示されます。

  5. 特定の CVE の詳細については、CVE 名をクリックします。

  6. バージョン番号や影響を受ける場所など、脆弱性の発生の詳細を表示するには、脆弱性の名前が表示されている行で [表示] または [修正済みを表示] をクリックします。修正プログラムのない脆弱性の場合はリンクテキストが [表示]、修正プログラムが適用されている脆弱性の場合は [修正済みを表示] になります。

gcloud を使用してオカレンスを表示する

Artifact Registry のパッケージのオカレンスを表示するには、gcloud artifacts versions describe コマンドを実行します。

gcloud artifacts versions describe VERSION \
    --location=LOCATION --repository=REPOSITORY --package=PACKAGE --show-package-vulnerability

ここで

  • VERSION は、オカレンスを表示するパッケージのバージョンです。
  • LOCATION は、リポジトリのリージョンまたはマルチリージョンのロケーションです。
  • REPOSITORY は、パッケージが保存されるリポジトリの名前です。
  • PACKAGE は、リポジトリ内のイメージの名前です。このコマンドでパッケージ タグを指定することはできません。

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

発生をフィルタする

gcloud コマンドと Artifact Analysis API でフィルタ文字列を使用すると、オカレンスを表示する前にフィルタできます。以降では、サポートされている検索フィルタについて説明します。

特定のタイプのオカレンスを表示する

kind 値を使用して、発生タイプでフィルタできます。利用可能な種類をご覧ください。

次の例は、パッケージの脆弱性検出をフィルタする方法を示しています。

gcloud

パッケージ ベースのスキャンでは、Google Cloud CLI で検出結果のフィルタリングはサポートされていません。

API

API クエリで、次のフィルタ式を使用します。

kind="PACKAGE_VULNERABILITY" AND resourceUrl="RESOURCE_URL"

ここで

  • PACKAGE_VULNERABILITY は発生の種類です。
  • RESOURCE_URL は、projects/PROJECT_ID/locations/LOCATION/repositories/REPOSITORY_ID/packages/PACKAGE_ID/PACKAGE_TYPE/VERSION_ID 形式のパッケージの完全な URL です。
    • PROJECT_ID は、コンソールの Google Cloud プロジェクト ID です。
    • LOCATION は、リポジトリのリージョンまたはマルチリージョンのロケーションです。
    • REPOSITORY は、イメージが保存されるリポジトリの名前です。
    • PACKAGE_ID は、イメージが保存されるパッケージの名前です。
    • PACKAGE_TYPE は、アプリケーション言語パッケージのタイプです。使用可能なタイプは、pythonPackages、mavenArtifacts、npmPackages です。
    • VERSION は、パッケージのバージョン番号です。

hasPrefix 関数を使用すると、より広い範囲でフィルタできます。

たとえば、次のフィルタは、同じパッケージの複数のバージョンにわたる特定の種類のオカレンスをフィルタします。

kind="NOTE_KIND" AND has_prefix(resourceUrl, "RESOURCE_URL_PREFIX")

ここで

  • RESOURCE_URL_PREFIX は、リソース URL のサブ文字列を指定します。
    • パッケージのすべてのバージョンをフィルタするには、バージョンを省略します。形式は projects/PROJECT_ID/locations/LOCATION/repositories/REPOSITORY_ID にします。
    • プロジェクト内のすべてのパッケージをフィルタするには、リソースのロケーションとプロジェクトのみを指定します。形式は projects/PROJECT_ID/locations/LOCATION にします。

脆弱性の発生を表示する

脆弱性検出のリストは、gcloud CLI または Artifact Analysis API を使用して表示できます。

gcloud

パッケージの脆弱性のオカレンスのリストを取得するには、--show-package-vulnerability フラグを使用します。

gcloud artifacts versions describe VERSION_ID --repository=REPOSITORY_ID
  --package=GROUP_ID:ARTIFACT_ID --show-package-vulnerability

ここで

  • VERSION は、パッケージのバージョン番号です。
  • REPOSITORY は、パッケージが保存されるリポジトリの名前です。
  • GROUP_ID は、パッケージのグループ ID です。
  • ARTIFACT_ID は、パッケージのアーティファクト 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 をご覧ください。

特定のメモに関連付けられている画像を表示する

特定のメモ ID に関連付けられているリソースのリストを取得できます。たとえば、特定の CVE 脆弱性を持つイメージを一覧表示できます。

プロジェクト内で特定のメモに関連付けられているすべてのイメージを一覧表示するには、次のフィルタ式を使用します。

gcloud

パッケージ ベースのスキャンでは、Google Cloud CLI で検出結果のフィルタリングはサポートされていません。

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

パッケージ ベースのスキャンでは、Google Cloud CLI で検出結果のフィルタリングはサポートされていません。

API

API クエリに次のフィルタ式を追加します。

resourceUrl="RESOURCE_URL" AND noteProjectId="goog-vulnz" \
AND noteId="NOTE_ID"

ここで

  • RESOURCE_URL は、projects/PROJECT_ID/locations/LOCATION/repositories/REPOSITORY_ID/packages/PACKAGE_ID/PACKAGE_TYPE/VERSION_ID 形式のパッケージの完全な URL です。
  • goog-vulnz は、Artifact Analysis の脆弱性分析の PROVIDER_PROJECT_ID です。
  • NOTE_ID はメモの ID です。セキュリティ関連のメモは、多くの場合 CVE-2019-12345 の形式で記述されます。

次のステップ