On-Demand Scanning API を使用すると、ローカルのコンピュータに保存されているイメージ、または Artifact Registry または Container Registry にリモートで保存されているイメージをスキャンできます。オンデマンド スキャンを使用して、CI/CD パイプラインのイメージをスキャンし、システムの脆弱性と Go パッケージの脆弱性を検出して、レジストリに保存するかどうかを判断できます。詳しい料金情報については、料金ページをご覧ください。
このページでは、コンテナ イメージをスキャンしてシステムの脆弱性と Go パッケージの脆弱性を手動で確認する方法について説明します。
始める前に
- 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.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the On-Demand Scanning API.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the On-Demand Scanning API.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
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
または、前のコマンドの
dnf
をyum
に置き換えることもできます。
-
Debian/Ubuntu の場合:
- オンデマンド スキャンで使用するユーザーまたはサービス アカウントに、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_URI に
REPOSITORY_ID
を含める必要があります。
ローカル スキャンとリモート スキャンの両方で、次のオプションのフラグを使用できます。
--location
は、スキャンを行うマルチリージョンを手動で選択するためのオプションのフラグです。物理的なロケーションに近いマルチリージョンを選択すると、レイテンシを最小限に抑えることができます。使用できるロケーションは、us
、europe
、asia
です。デフォルトの場所は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]
ここで
SCAN_NAME はスキャン名です。同期スキャンを実行するか、スキャンが完了した後に長時間実行オペレーションをポーリングすると、出力の最後の行に表示されます。
--limit=X
は、出力に表示される出現回数を制限するオプションのフラグです。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 時間利用できます。
次のステップ
- Cloud Build パイプラインで On-Demand Scanning API を使用する。
- Artifact Analysis を使用して、Artifact Registry に保存されているイメージの脆弱性情報をスキャンし、継続的に更新します。