On-Demand Scanning API を使用すると、ローカルのコンピュータに保存されているイメージ、または Artifact Registry にリモートで保存されているイメージをスキャンできます。これにより、脆弱性をスキャンするコンテナをきめ細かく制御できます。オンデマンド スキャンを使用すると、イメージをレジストリに保存するかどうかを決定する前に、CI/CD パイプラインでイメージをスキャンできます。詳しい料金情報については、料金ページをご覧ください。
このページでは、オンデマンド スキャンを使用してコンテナ イメージを手動でスキャンする方法について説明します。
始める前に
- Google Cloud アカウントにログインします。 Google Cloudを初めて使用する場合は、 アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
-
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 theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the On-Demand Scanning API.
Roles required to enable APIs
To enable APIs, you need the
serviceusage.services.enablepermission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.-
Google Cloud CLI をインストールします。
-
外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。
-
gcloud CLI を初期化するには、次のコマンドを実行します。
gcloud init -
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 theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the On-Demand Scanning API.
Roles required to enable APIs
To enable APIs, you need the
serviceusage.services.enablepermission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.-
Google Cloud CLI をインストールします。
-
外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。
-
gcloud CLI を初期化するには、次のコマンドを実行します。
gcloud init -
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
また、前のコマンドで
dnfをyumに置き換えることもできます。
-
Debian/Ubuntu の場合:
- オンデマンド スキャンで使用するユーザーまたはサービス アカウントに、IAM ロールのオンデマンド スキャン管理者を付与します。プロジェクトの所有者アカウントを使用してスキャンを実行している場合は、この手順をスキップできます。
必要なロール
パッケージ スキャン結果の表示に必要な権限を取得するには、プロジェクトに対する次の IAM ロールを付与するよう管理者に依頼してください。
- Container Scanner サービス エージェント (
roles/containerscanning.ServiceAgent) - Container Analysis のオカレンスの閲覧者 (
roles/containeranalysis.occurrences.viewer) - Container Analysis メモ閲覧者 (
roles/containeranalysis.notes.viewer) - Artifact Registry 読み取り(
roles/artifactregistry.reader)
ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。
必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。
コンテナ イメージをスキャンする
ローカル スキャン:
gcloud artifacts docker images scan IMAGE_URI \ [--location=(us,europe,asia)] [--async]ローカル イメージの場合は、IMAGE_URI に次のいずれかの形式を使用します。
REPOSITORY:TAGREPOSITORY
リモート スキャン:
gcloud artifacts docker images scan IMAGE_URI \ --remote [--location=(us,europe,asia)] [--async]リモート イメージの場合は、IMAGE_URI に次のいずれかの形式を使用します。
HOSTNAME/PROJECT_ID/REPOSITORY_ID/IMAGE_ID@sha256:HASHHOSTNAME/PROJECT_ID/REPOSITORY_ID/IMAGE_ID:HASHHOSTNAME/PROJECT_ID/REPOSITORY_ID/IMAGE_IDHOSTNAME/PROJECT_ID/IMAGE_ID@sha256:HASHHOSTNAME/PROJECT_ID/IMAGE_ID:HASHHOSTNAME/PROJECT_ID/IMAGE_ID
Artifact Registry のイメージの場合、IMAGE_URI に
REPOSITORY_IDを含める必要があります。
ローカル スキャンとリモート スキャンの両方で、次のオプションのフラグを使用できます。
--locationは、スキャンが行われるマルチリージョンを手動で選択するフラグです。物理的なロケーションに近いマルチリージョンを選択すると、レイテンシを最小限に抑えることができます。使用可能なロケーションは、us、europe、asiaです。デフォルトの場所はusです。--asyncは、スキャン プロセスを非同期で実行するためのフラグです。このフラグを省略すると、スキャン プロセスが完了するまでターミナルがブロックされます。
同期スキャン
次の例は、--async フラグなしの同期スキャンの出力を示しています。
$ gcloud artifacts docker images scan ubuntu:latest ✓ 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: '2021-01-05T23:03:04.185261Z' resourceUri: ubuntu:latest 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 ubuntu:latest --async ✓ Scanning container image ✓ Locally extracting packages and versions from local container image ✓ Remotely initiating analysis of packages and versions Done. Check operation [projects/cloud-project/locations/us/operations/2e1a6b1f-16e5-4427-ac86-72c998a3dd16] for status. metadata: '@type': type.googleapis.com/google.cloud.ondemandscanning.v1.AnalyzePackagesMetadata createTime: '2021-01-05T23:04:54.393510Z' resourceUri: ubuntu:latest 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/cloud-project/locations/us/operations/2e1a6b1f-16e5-4427-ac86-72c998a3dd16 done: true metadata: '@type': type.googleapis.com/google.cloud.ondemandscanning.v1.AnalyzePackagesMetadata createTime: '2021-01-05T23:04:54.393510Z' resourceUri: ubuntu:latest 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は数値です。
次に例を示します。
gcloud artifacts docker images list-vulnerabilities \
projects/my-project/locations/us/scans/2fe2bfb8-f0c5-4dd6-a8c8-38961869767a
createTime: '2021-01-05T23:05:42.956227Z'
kind: VULNERABILITY
name: projects/my-project/locations/us/occurrences/f82a1efd-a261-4973-acbd-f9854d8b8135
noteName: projects/goog-vulnz/notes/CVE-2018-1000654
resourceUri: ubuntu:latest
updateTime: '2021-01-05T23:05:42.956227Z'
vulnerability:
cvssScore: 7.1
cvssv3:
attackComplexity: ATTACK_COMPLEXITY_LOW
attackVector: ATTACK_VECTOR_NETWORK
availabilityImpact: IMPACT_HIGH
baseScore: 7.2
confidentialityImpact: IMPACT_HIGH
exploitabilityScore: 1.2
impactScore: 5.9
integrityImpact: IMPACT_HIGH
privilegesRequired: PRIVILEGES_REQUIRED_HIGH
scope: SCOPE_UNCHANGED
userInteraction: USER_INTERACTION_NONE
effectiveSeverity: MEDIUM
このコマンドの出力は、Grafeas 形式のオカレンスのリストです。この例では、イメージで検出された中程度の重大度の脆弱性を示しています。
スキャン結果は、スキャン オペレーションが完了してから 48 時間利用できます。
次のステップ
- Cloud Build パイプラインで On-Demand Scanning API を使用する。
- Artifact Analysis を使用すると、Artifact Registry に保存されているイメージの脆弱性情報をスキャンして継続的に更新できます。