Go パッケージを手動でスキャンする

On-Demand Scanning API を使用すると、ローカルのコンピュータに保存されているイメージ、または Artifact Registry または Container Registry にリモートで保存されているイメージをスキャンできます。オンデマンド スキャンを使用して、CI/CD パイプラインのイメージをスキャンし、システムの脆弱性と Go パッケージの脆弱性を検出して、レジストリに保存するかどうかを判断できます。詳しい料金情報については、料金ページをご覧ください。

このページでは、コンテナ イメージをスキャンしてシステムの脆弱性と Go パッケージの脆弱性を手動で確認する方法について説明します。

始める前に

  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 On-Demand Scanning API.

    Enable the API

  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 On-Demand Scanning API.

    Enable the API

  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. Google Cloud CLI インストールに local-extract コンポーネントを追加する

    Google Cloud CLI コンポーネント マネージャーの使用

    コンポーネント マネージャーは、スキャン コマンドを初めて実行するときに、必要なコンポーネントをインストールするよう求めるプロンプトを表示します。

    システム パッケージ マネージャーを使用する

    • Debian/Ubuntu の場合:
      sudo apt install google-cloud-sdk-local-extract
          
    • Red Hat/Fedora/CentOS の場合:
      sudo dnf install google-cloud-sdk-local-extract
          

      または、前のコマンドの dnfyum に置き換えることもできます。

  15. オンデマンド スキャンで使用するユーザーまたはサービス アカウントに、IAM ロール オンデマンド スキャン管理者を付与します。プロジェクトのオーナー アカウントを使用してスキャンを実行する場合は、この手順をスキップできます。
  16. コンテナ イメージをスキャンする

    • ローカル スキャン:

      gcloud artifacts docker images scan IMAGE_URI \
          [--location=(us,europe,asia)] [--async]
      

      ローカル イメージの場合は、IMAGE_URI に次のいずれかの形式を使用します。

      • REPOSITORY:TAG
      • REPOSITORY
    • リモート スキャン:

      gcloud artifacts docker images scan IMAGE_URI \
          --remote [--location=(us,europe,asia)] [--async]
      

      リモート イメージの場合は、IMAGE_URI に次のいずれかの形式を使用します。

      • HOSTNAME/PROJECT_ID/REPOSITORY_ID/IMAGE_ID@sha256:HASH
      • HOSTNAME/PROJECT_ID/REPOSITORY_ID/IMAGE_ID:HASH
      • HOSTNAME/PROJECT_ID/REPOSITORY_ID/IMAGE_ID
      • HOSTNAME/PROJECT_ID/IMAGE_ID@sha256:HASH
      • HOSTNAME/PROJECT_ID/IMAGE_ID:HASH
      • HOSTNAME/PROJECT_ID/IMAGE_ID

      Artifact Registry のイメージの場合は、IMAGE_URIREPOSITORY_ID を含める必要があります。

    ローカル スキャンとリモート スキャンの両方で、次のオプション フラグを使用できます。

    • --location は、スキャンを行うマルチリージョンを手動で選択するためのオプションのフラグです。物理的なロケーションに近いマルチリージョンを選択すると、レイテンシを最小限に抑えることができます。使用できるロケーションは、useuropeasia です。デフォルトの場所は us です。

    • --async は、スキャン プロセスを非同期で実行するためのオプションのフラグです。このフラグを省略すると、スキャン プロセスが完了するまでターミナルがブロックされます。

    同期スキャン

    次の例は、--async フラグを使用しない同期スキャンの出力を示しています。

    $ gcloud artifacts docker images scan golang:1.17.6-alpine
    
    ✓ Scanning container image
      ✓ Locally extracting packages and versions from local container image
      ✓ Remotely initiating analysis of packages and versions
      ✓ Waiting for analysis operation to complete [projects/my-project/locations/us/operations/87d2e137-1d1c-4790-8e5e-daf6c96ae7d7]
    Done.
    done: true
    metadata:
      '@type': type.googleapis.com/google.cloud.ondemandscanning.v1.AnalyzePackagesMetadata
      createTime: '2022-01-11T16:58:11.711487Z'
      resourceUri: golang:1.16.13-alpine
    name: projects/my-project/locations/us/operations/87d2e137-1d1c-4790-8e5e-daf6c96ae7d7
    response:
      '@type': type.googleapis.com/google.cloud.ondemandscanning.v1.AnalyzePackagesResponse
      scan: projects/my-project/locations/us/scans/2fe2bfb8-f0c5-4dd6-a8c8-38961869767a
    

    スキャン名を使用して、脆弱性の結果を取得します。スキャン名は、出力メッセージの最後の行にある scan の値です。

    非同期スキャン

    次の例は、非同期スキャンを実行した出力を示しています。

    $ gcloud artifacts docker images scan golang:1.17.6-alpine --async
    
    ✓ Scanning container image
      ✓ Locally extracting packages and versions from local container image
      ✓ Remotely initiating analysis of packages and versions
    Done.
    Check operation [projects/my-project/locations/us/operations/2e1a6b1f-16e5-4427-ac86-72c998a3dd16] for status.
    metadata:
      '@type': type.googleapis.com/google.cloud.ondemandscanning.v1.AnalyzePackagesMetadata
      createTime: '2022-01-11T16:58:11.711487Z'
      resourceUri: golang:1.16.13-alpine
    name: projects/my-project/locations/us/operations/2e1a6b1f-16e5-4427-ac86-72c998a3dd16
    

    これにより、長時間実行オペレーションが開始され、ターミナルをブロックすることなく ID が返されます。出力メッセージの最後の行にある name の値であるオペレーション ID を使用して、オペレーションをポーリングします。

    長時間実行オペレーションをポーリングする

    非同期スキャン コマンドの出力からオペレーション ID を使用して、オペレーションのステータスを確認します。

    gcloud artifacts docker images get-operation LRO_ID
    

    ここで、LRO_ID は長時間実行オペレーション ID です。

    非同期スキャン セクションの例に沿って、オペレーションのステータスを確認します。

    $ gcloud artifacts docker images get-operation \
      projects/my-project/locations/us/operations/2e1a6b1f-16e5-4427-ac86-72c998a3dd16
    
    done: true
    metadata:
      '@type': type.googleapis.com/google.cloud.ondemandscanning.v1.AnalyzePackagesMetadata
      createTime: '2022-01-11T16:58:11.711487Z'
      resourceUri: golang:1.16.13-alpine
    name: projects/my-project/locations/us/operations/2e1a6b1f-16e5-4427-ac86-72c998a3dd16
    response:
      '@type': type.googleapis.com/google.cloud.ondemandscanning.v1.AnalyzePackagesResponse
      scan: projects/my-project/locations/us/scans/2fe2bfb8-f0c5-4dd6-a8c8-38961869767a
    

    出力に done: true という行が含まれている場合、スキャン オペレーションは完了しています。スキャン名を使用して、脆弱性の結果を取得します。名前は、出力メッセージの最後の行にある scan の値です。

    スキャン結果を取得する

    スキャン オペレーションの完了後にスキャン結果を取得するには、次のコマンドを使用します。

    gcloud artifacts docker images list-vulnerabilities SCAN_NAME [--limit=X]
    

    ここで

    次に例を示します。

    createTime: '2022-01-11T16:58:11.972043Z'
    kind: VULNERABILITY
    name: projects/my-project/locations/us/occurrences/0c607d9b-aff4-4cde-86b7-e2c0a865aadd
    noteName: projects/goog-vulnz/notes/CVE-2021-38297
    resourceUri: golang:1.16.13-alpine
    updateTime: '2022-01-11T16:58:11.972043Z'
    vulnerability:
      cvssScore: 7.5
      effectiveSeverity: CRITICAL
      longDescription: Go before 1.16.9 and 1.17.x before 1.17.2 has a Buffer Overflow
        via large arguments in a function invocation from a WASM module, when GOARCH=wasm
        GOOS=js is used.
      packageIssue:
      - affectedCpeUri: cpe:/o:alpine:alpine_linux:3.15
        affectedPackage: go
        affectedVersion:
          fullName: 1.16.13
          kind: NORMAL
          name: 1.16.13
        effectiveSeverity: CRITICAL
        fixedCpeUri: cpe:/o:alpine:alpine_linux:3.15
        fixedPackage: go
        fixedVersion:
          fullName: 1.17.2
          kind: NORMAL
          name: 1.17.2
        packageType: GO_STDLIB
      relatedUrls:
      - label: More Info
        url: https://security-tracker.debian.org/tracker/CVE-2021-38297
      - label: More Info
        url: https://access.redhat.com/security/cve/CVE-2021-38297
      - label: More Info
        url: https://nvd.nist.gov/vuln/detail/CVE-2021-38297
      severity: HIGH
      shortDescription: CVE-2021-38297
    

    このコマンドの出力は、Grafeas 形式の発生リストです。この例では、イメージで検出された重大度の高い脆弱性が 1 つ表示されています。

    オンデマンド スキャンでは、次の 2 種類の Go パッケージの脆弱性が特定されます。

    • packageType:GO_STDLIB. Go 標準ライブラリの脆弱性。これは、バイナリのビルドに使用された Go ツールチェーンまたはツールチェーンにバンドルされている標準ライブラリで脆弱性が見つかったことを示します。ビルド ツールチェーンをアップグレードすると問題を解決できます。

    • packageType:GO. Go パッケージの脆弱性。これは、サードパーティ パッケージで脆弱性が見つかったことを示します。依存するモジュールをアップグレードすると問題を解決できます。

    スキャン結果は、スキャン オペレーションの完了後 48 時間利用できます。

    次のステップ