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

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

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

始める前に

  1. 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.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Artifact Registry and Container Scanning APIs.

    Enable the APIs

  5. Install the Google Cloud CLI.

  6. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

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

    gcloud init
  8. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  9. Make sure that billing is enabled for your Google Cloud project.

  10. Enable the Artifact Registry and Container Scanning APIs.

    Enable the APIs

  11. Install the Google Cloud CLI.

  12. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

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

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

    Cloud Build を使用して Go アプリケーションをビルドしてコンテナ化する方法については、 Go アプリケーションをビルドするをご覧ください。
  15. イメージの脆弱性を表示する

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

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

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

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

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

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

      各イメージ ダイジェストの脆弱性の総数が、[脆弱性] 列に表示されます。

      脆弱性のあるイメージのスクリーンショット

    4. イメージで検出された脆弱性の一覧を表示するには、[脆弱性] 列のリンクをクリックします。

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

      脆弱性、修正、有効な重大度が表示された [スキャン結果] セクションのスクリーンショット

      脆弱性の表には、検出された各脆弱性の共通脆弱性識別子(CVE)名、有効な重大度、共通脆弱性スコアリング システム(CVSS)スコア、修正(利用可能な場合)、脆弱性を含むパッケージの名前、パッケージ タイプが一覧表示されます。

      これらのファイルをフィルタリングして並べ替え、特定のファイル、ディレクトリ、またはファイル拡張子でファイルの種類を確認できます。

      Google Cloud コンソールには、この表に最大 1,200 件の脆弱性が表示されます。イメージに 1, 200 個を超える脆弱性がある場合は、gcloud または API を使用して完全なリストを表示する必要があります。

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

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

    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
    

    ここで

    • DEPLOYMENT は、オカレンスの種類です。
    • LOCATION は、リポジトリのリージョンまたはマルチリージョンのロケーションです。
    • PROJECT_ID は Google Cloud コンソールのプロジェクト 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
    

    ここで

    • 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-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
    

    場所

    • LOCATION は、リポジトリのリージョンまたはマルチリージョンのロケーションです。
    • PROJECT_ID は Google Cloud コンソールのプロジェクト 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 通知を使用すると、脆弱性やその他のメタデータに関する通知を受け取ることができます。

    • Artifact Analysis と Binary Authorization を統合して証明書を作成し、既知のセキュリティ問題を含むコンテナ イメージがデプロイ環境で実行されないようにします。