Cloud Build パイプラインの一部としてオンデマンド スキャンを使用すると、コンテナ イメージに事前に定義されたレベルと一致する重大度の脆弱性がある場合に、ビルドをブロックできます。
このチュートリアルでは、Cloud Build を使用してソースコードからコンテナ イメージをビルドし、脆弱性をスキャンして、脆弱性の重大度レベルを確認し、特定の重大度レベルの脆弱性がない場合はイメージを Artifact Registry に push する方法について説明します。
このチュートリアル用に新しい Google Cloud プロジェクトを作成し、隔離された環境で手順を完了することをおすすめします。
目標
- Cloud Build でイメージをビルドする。
- オンデマンド スキャンでビルドされたイメージをスキャンします。
- 許容可能な脆弱性レベルを評価します。
- イメージを Artifact Registry に保存します。
費用
このドキュメントでは、課金対象である次の Google Cloudコンポーネントを使用します。
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
このドキュメントに記載されているタスクの完了後、作成したリソースを削除すると、それ以上の請求は発生しません。詳細については、クリーンアップをご覧ください。
始める前に
- 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.
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
(
roles/resourcemanager.projectCreator
), which contains theresourcemanager.projects.create
permission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the On-Demand Scanning, Cloud Build, and Artifact Registry APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin
), which contains theserviceusage.services.enable
permission. Learn how to grant roles. -
Install the 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
(
roles/resourcemanager.projectCreator
), which contains theresourcemanager.projects.create
permission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the On-Demand Scanning, Cloud Build, and Artifact Registry APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin
), which contains theserviceusage.services.enable
permission. Learn how to grant roles. -
Install the Google Cloud CLI.
-
外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。
-
gcloud CLI を初期化するには、次のコマンドを実行します。
gcloud init
オンデマンド スキャン管理者(
roles/ondemandscanning.admin
)Artifact Registry 書き込み(
roles/artifactregistry.writer
)ターミナルを開き、
ods-tutorial
という名前の新しいディレクトリを作成して、そのディレクトリに移動します。mkdir ods-tutorial && cd ods-tutorial
次の内容のファイルを
Dockerfile
という名前で作成します。# Debian10 image FROM gcr.io/google-appengine/debian10:latest # Ensures that the built image is always unique RUN apt-get update && apt-get -y install uuid-runtime && uuidgen > /IAMUNIQUE
プロジェクト ID を API を有効にした同じプロジェクトに設定します。
gcloud config set project PROJECT_ID
ロケーション
us-central1
にods-build-repo
という名前の Docker リポジトリを作成します。gcloud artifacts repositories create ods-build-repo --repository-format=docker \ --location=us-central1 --description="Repository for scan and build"
リポジトリが正常に作成されたことを確認します。
gcloud artifacts repositories list
ods-tutorial/
フォルダに、次の内容のcloudbuild.yaml
ファイルを作成します。steps: - id: build name: gcr.io/cloud-builders/docker entrypoint: /bin/bash args: - -c - | docker build -t us-central1-docker.pkg.dev/$_PROJECT_ID/ods-build-repo/ods-test:latest -f ./Dockerfile . && docker image inspect us-central1-docker.pkg.dev/$_PROJECT_ID/ods-build-repo/ods-test:latest --format \ '{{index .RepoTags 0}}@{{.Id}}' > /workspace/image-digest.txt && cat image-digest.txt - id: scan name: gcr.io/google.com/cloudsdktool/cloud-sdk entrypoint: /bin/bash args: - -c - | gcloud artifacts docker images scan us-central1-docker.pkg.dev/$_PROJECT_ID/ods-build-repo/ods-test:latest \ --format='value(response.scan)' > /workspace/scan_id.txt - id: severity check name: gcr.io/google.com/cloudsdktool/cloud-sdk entrypoint: /bin/bash args: - -c - | gcloud artifacts docker images list-vulnerabilities $(cat /workspace/scan_id.txt) \ --format='value(vulnerability.effectiveSeverity)' | if grep -Exq $_SEVERITY; \ then echo 'Failed vulnerability check' && exit 1; else exit 0; fi - id: push name: gcr.io/cloud-builders/docker entrypoint: /bin/bash args: - -c - | docker push us-central1-docker.pkg.dev/$_PROJECT_ID/ods-build-repo/ods-test:latest images: ['us-central1-docker.pkg.dev/$_PROJECT_ID/ods-build-repo/ods-test:latest']
このファイルには、Artifact Registry で以前に作成したロケーションとリポジトリが含まれています。別の値を使用する場合は、それに応じて
cloudbuild.yaml
ファイルを変更します。PROJECT_ID
とSEVERITY
の値は、ビルドコマンドでスクリプトに渡されます。ブロックする脆弱性の
SEVERITY
レベルを指定して、ビルドを開始します。SEVERITY
には、次の値を使用できます。CRITICAL
HIGH
MEDIUM
LOW
正規表現を使用して複数の重大度を指定できます。
次の例では、
CRITICAL
とHIGH
の両方の重大度値を指定しています。これにより、Cloud Build はHIGH
以上の重大度レベルに分類された脆弱性をチェックします。gcloud builds submit --substitutions=_PROJECT_ID=PROJECT_ID,_SEVERITY='"CRITICAL|HIGH"' \ --config cloudbuild.yaml
場所
- PROJECT_ID はプロジェクト ID です。
- SEVERITY を使用すると、ブロックする重大度レベルを設定できます。オンデマンド スキャンで、指定された重大度レベルのいずれかに一致する脆弱性が見つかった場合、ビルドは失敗します。
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
Google Cloud コンソールで [リポジトリ] ページを開きます。
[リポジトリ] リストで、
ods-build-repo
リポジトリを選択します。[削除] をクリックします。
必要なロール
Cloud Build で使用するサービス アカウントには、次のロールが必要です。
デフォルトの Cloud Build サービス アカウントには、同じプロジェクトの Artifact Registry リポジトリに必要な権限が付与されています。リポジトリが Cloud Build で使用するプロジェクトと同じプロジェクトにある場合は、オンデマンド スキャン管理者ロールのみを付与する必要があります。
Cloud Build にユーザー指定のサービス アカウントを使用している場合は、両方のロールを付与する必要があります。
ソースファイルを準備する
このチュートリアルでは、Dockerfile からイメージをビルドします。Dockerfile は、Docker がイメージを作成するための指示を含むソースファイルです。
Artifact Registry リポジトリを作成する
ビルドとスキャン
このセクションでは、ビルド構成ファイルを使用してビルド パイプラインを実行します。ビルド構成ファイルは、指定に基づいて複数のタスクを実行する方法を Cloud Build に指示します。
結果を把握する
SEVERITY
の値を CRITICAL|HIGH
に設定すると、オンデマンド スキャンで脆弱性がスキャンされた後、HIGH
レベルとより重大な CRITICAL
レベルの脆弱性があるかどうかが確認されます。イメージに一致する脆弱性が見つからない場合、ビルドは成功し、Cloud Build はイメージを Artifact Registry に push します。
出力は次のようになります。
DONE
--------------------------------------------------------------------------------------------------------------------------------------------
ID CREATE_TIME DURATION SOURCE IMAGES STATUS
abb3ce73-6ae8-41d1-9080-7d74a7ecd7bc 2021-03-15T06:50:32+00:00 1M48S gs://ods-tests_cloudbuild/source/1615791031.906807-a648d10faf4a46d695c163186a6208d5.tgz us-central1-docker.pkg.dev/ods-tests/ods-build-repo/ods-test (+1 more) SUCCESS
オンデマンド スキャンでイメージに HIGH
または CRITICAL
の脆弱性が検出されると、scan
ビルドステップが失敗し、後続のビルドステップが開始されず、Cloud Build はイメージを Artifact Registry に push しません。
出力は次のようになります。
Step #2 - "severity check": Failed vulnerability check
Finished Step #2 - "severity check"
ERROR
ERROR: build step 2 "gcr.io/cloud-builders/gcloud" failed: step exited with non-zero status: 1
このチュートリアルでは、サンプル ソースコードが一般公開されている Linux ディストリビューション debian10:latest
であるため、結果が異なる場合があります。Linux ディストリビューションと関連する脆弱性データは継続的に更新されます。
ソフトウェア サプライ チェーンの保護に役立つ追加の Google Cloud ツールとベスト プラクティスについては、ソフトウェア サプライ チェーンのセキュリティをご覧ください。
Linux の脆弱性管理のベスト プラクティスについて詳しくは、Linux Foundation が提供する無料のオンライン トレーニングをご利用ください。安全なソフトウェアの開発をご覧ください。
クリーンアップ
このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。
プロジェクトの削除
リソースを個別に削除する
リポジトリを削除する前に、保持する必要があるイメージが別の場所で使用可能であることを確認してください。
リポジトリを削除するには、次の手順を行います。
コンソール
gcloud
ods-build-repo
リポジトリを削除するには、次のコマンドを実行します。
gcloud artifacts repositories delete ods-build-repo --location=us-central1