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

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

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

始める前に

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

    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 API

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

    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 API

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

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

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

    gcloud init
  14. local-extract コンポーネントを Google Cloud CLI のインストールに追加する

    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 ロールオンデマンド スキャン管理者を付与します。プロジェクトの所有者アカウントを使用してスキャンを実行している場合は、この手順をスキップできます。

コンテナ イメージをスキャンする

  • ローカル スキャン:

    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 が返されます。オペレーション ID(出力メッセージの最後の行の name の値)を使用して、オペレーションをポーリングします。

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

非同期スキャン コマンドの出力からオペレーション 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 時間利用できます。

次のステップ