Node.js パッケージを自動的にスキャンする

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

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

始める前に

  1. アカウントにログインします。 Google Cloud を初めて使用する場合は、 アカウントを作成して、実際のシナリオで Google プロダクトのパフォーマンスを評価してください。 Google Cloud新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
  2. 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

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

  4. Enable the Artifact Registry and Container Scanning APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  5. Google Cloud CLI をインストールします。

  6. 外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。

  7. gcloud CLI を初期化するには、次のコマンドを実行します:

    gcloud init
  8. 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

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

  10. Enable the Artifact Registry and Container Scanning APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  11. Google Cloud CLI をインストールします。

  12. 外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。

  13. gcloud CLI を初期化するには、次のコマンドを実行します:

    gcloud init
  14. Artifact Registry に Docker リポジトリを作成し、npm コードを含むコンテナ イメージをリポジトリに push します。Artifact Registry に慣れていない場合は、 Docker のクイックスタートをご覧ください。

イメージの脆弱性を表示する

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. イメージで検出された脆弱性の一覧を表示するには、[脆弱性] 列のリンクをクリックします。

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

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

    脆弱性の表には、検出された各脆弱性の Common Vulnerabilities and Exposures(CVE)名、 有効な重大度、 共通脆弱性評価システム(CVSS)スコア、修正プログラム(利用可能な場合)、 脆弱性が存在するパッケージの名前、パッケージ タイプが一覧表示されます。

    Google Cloud コンソールでは、この表に 1 ページあたり最大 1,200 件の脆弱性が表示されます。これらのファイルをフィルタして並べ替え、特定のファイル、ディレクトリ、レイヤ、またはファイル拡張子でファイルの種類を確認できます。

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

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

特定のレイヤの脆弱性を表示する

Artifact Analysis は、レイヤ固有のメタデータを提供し、脆弱性を含むパッケージと、そのレイヤを導入した Docker ビルドコマンドを特定するのに役立ちます。

コンソールでレイヤベースの脆弱性メタデータを表示するには: Google Cloud

  1. Artifact Registry で、リポジトリのリストを開きます。

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

  2. [リポジトリ] ページで、リポジトリをクリックします。

  3. [リポジトリの詳細] ページで、イメージをクリックします。

  4. 画像モードのリストで、イメージ ダイジェストをクリックします。

  5. イメージ ダイジェストの詳細ページで、[脆弱性] タブをクリックします。

    レイヤベースのメタデータが利用可能な場合、Artifact Analysis は [レイヤ] バーに選択可能なレイヤのリストを表示します。

    レイヤバーを含むイメージ ダイジェストの [脆弱性] ページの画像。レイヤバーには、番号付きリストのレイヤから選択するためのプルダウン メニューがあります。

  6. レイヤのリストを表示するには、レイヤのプルダウン メニューをクリックします。

    プルダウン リストが開き、レイヤの番号付きリストが表示されます。レイヤ 0 は一番下のレイヤを表し、その後のレイヤは前のレイヤを基盤として構築されます。脆弱性が見つかったレイヤのみが表示されます。

    開いたレイヤ プルダウン メニューの画像。メニューには、レイヤのビルドに使用された Docker コマンドと、各レイヤの脆弱性の種類と数が表示されます。

    Artifact Analysis は、各レイヤについて、レイヤのビルドに使用された Docker コマンドと、そのレイヤで見つかった脆弱性の数を示します。

  7. 特定のレイヤの脆弱性について詳しくは、レイヤリストからレイヤを選択します。

    脆弱性の表が更新され、選択したレイヤで見つかった脆弱性のみが表示されます。フィルタを追加したり、特定の脆弱性を調査したりできます。

  8. 脆弱性の横にある [表示] または [修正を表示] をクリックすると、脆弱性の詳細情報が表示されます。

    [脆弱性の詳細] サイドパネルには、パッケージに脆弱性があるファイルの場所が表示されます。

  9. [ファイルの場所] 表で、疑問符にカーソルを合わせると、追加のレイヤ メタデータが開きます。

    ダイアログに、レイヤ インデックス、レイヤ ビルドコマンド、レイヤ ダイジェスト、脆弱性を修復できるベースイメージが表示されます。

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 を使用している場合は、 コンソール内の [Security insights] サイドパネルでイメージの脆弱性を表示することもできます。 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

ここで

  • PACKAGE_VULNERABILITY は、種類 のオカレンスです。
  • LOCATION は、リポジトリのリージョンまたはマルチリージョンの ロケーションです。
  • PROJECT_ID は、 Google Cloud コンソール プロジェクト 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 です:
    • LOCATION は、リポジトリのリージョンまたはマルチリージョンの ロケーションです。
    • PROJECT_ID は、 Google Cloud コンソール プロジェクト ID です。
    • REPOSITORY は、イメージ が保存されるリポジトリの名前です。
    • IMAGE_ID は、リポジトリ内のイメージの名前です。 このコマンドではイメージタグを指定できません。

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

ここで

  • VULNERABILITY は、種類 のオカレンスです。
  • LOCATION は、リポジトリのリージョンまたはマルチリージョンの ロケーションです。
  • PROJECT_ID は、 Google Cloud コンソール プロジェクト 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 は、アプリケーション言語のパッケージ タイプです。 使用可能なタイプは、COMPOSERGOMAVENNPMNUGETPYTHONRUBYGEMSRUST です。
  • 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 ID 形式が 使用されますCVE-2019-12345

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 ID 形式が 使用されますCVE-2019-12345

特定の画像の特定のメモを確認するには、次のフィルタ式を使用します。

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

場所

  • LOCATION は、リポジトリのリージョンまたはマルチリージョンの ロケーションです。
  • PROJECT_ID は、 Google Cloud コンソール プロジェクト ID です。
  • REPOSITORY は、イメージ が保存されるリポジトリの名前です。
  • IMAGE_ID は、リポジトリ内のイメージの名前です。 このコマンドではイメージタグを指定できません。

API

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

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

ここで

  • RESOURCE_URL は、イメージの完全な URL です http://LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY_ID/IMAGE@sha256:HASH
  • goog-vulnz は、Artifact Analysis の脆弱性分析の PROVIDER_PROJECT_ID です。
  • NOTE_ID はメモの ID です。多くの場合、セキュリティ関連のメモは CVE-2019-12345 という形式になります。

次のステップ