Cloud Build パイプラインの一部としてオンデマンド スキャンを使用すると、コンテナ イメージに事前に定義されたレベルと一致する重大度の脆弱性がある場合に、ビルドをブロックできます。
このチュートリアルでは、Cloud Build を使用してソースコードからコンテナ イメージをビルドし、脆弱性をスキャンして、脆弱性の重大度レベルを確認し、特定の重大度レベルの脆弱性がない場合はイメージを Artifact Registry に push する方法について説明します。
このチュートリアルでは、新しい Google Cloud プロジェクトを作成し、 隔離された環境で手順を完了することをおすすめします。
目標
- Cloud Build でイメージをビルドする。
- オンデマンド スキャンでビルドしたイメージをスキャンする。
- 許容できる脆弱性レベルを評価する。
- イメージを Artifact Registry に保存する。
費用
このドキュメントでは、課金対象である次の コンポーネントを使用します Google Cloud:
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
このドキュメントに記載されているタスクの完了後、作成したリソースを削除すると、それ以上の請求は発生しません。詳細については、クリーンアップをご覧ください。
始める前に
- アカウントにログインします。 Google Cloud を初めて使用する場合は、 アカウントを作成して、 実際のシナリオでプロダクトがどのように機能するかを評価してください。 Google Cloud新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $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, 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.enablepermission. 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, 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.enablepermission. Learn how to grant roles.-
Google Cloud CLI をインストールします。
-
外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。
-
gcloud CLI を初期化するには、次のコマンドを実行します:
gcloud init
必要なロール
Cloud Build で使用するサービス アカウントには、次のロールが必要です。
オンデマンド スキャン管理者(
roles/ondemandscanning.admin)Artifact Registry 書き込み (
roles/artifactregistry.writer)
デフォルトの Cloud Build サービス アカウントには、同じプロジェクト内の Artifact Registry リポジトリに必要な権限が付与されています。リポジトリが Cloud Build で使用するプロジェクトと同じプロジェクトにある場合は、オンデマンド スキャン管理者ロールを付与するだけで済みます。
Cloud Build にユーザー指定のサービス アカウントを使用している場合は、両方のロールを付与する必要があります。
ソースファイルを準備する
このチュートリアルでは、Dockerfile からイメージをビルドします。Dockerfile は、Docker がイメージをビルドするための手順を含むソースファイルです。
ターミナルを開き、
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
Artifact Registry リポジトリを作成する
API を有効にしたプロジェクトと同じプロジェクトにプロジェクト ID を設定します。
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
ビルドしてスキャンする
このセクションでは、ビルド パイプラインを実行するために、ビルド 構成ファイルを使用します。ビルド構成ファイルは、指定に基づいて複数のタスクを実行する方法を Cloud Build に指示します。
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には、次の値を使用できます。CRITICALHIGHMEDIUMLOW
正規表現を使用して複数の重大度を指定できます。
次の例では、
CRITICALとHIGHの両方の重大度値を指定しています。これにより、HIGH重大度レベル以上に分類された脆弱性をチェックするように Cloud Build に指示します。gcloud builds submit --substitutions=_PROJECT_ID=PROJECT_ID,_SEVERITY='"CRITICAL|HIGH"' \ --config cloudbuild.yaml場所
- PROJECT_ID はプロジェクト ID です。
- SEVERITY を使用すると、ブロックする重大度レベルを設定できます。オンデマンド スキャンで、指定した重大度レベルのいずれかに一致する脆弱性が検出されると、ビルドは失敗します。
結果について
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 アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。
プロジェクトを削除する
- コンソールで [**リソースの管理**] ページに移動します。 Google Cloud
- プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
- ダイアログでプロジェクト ID を入力し、 [Shut down] をクリックしてプロジェクトを削除します。
リソースを個別に削除する
リポジトリを削除する前に、保持する必要があるイメージが別の場所で使用可能であることを確認してください。
リポジトリを削除するには、次の手順を行います。
コンソール
コンソールで [**リポジトリ**] ページを開きます。 Google Cloud
[リポジトリ] リストで、
ods-build-repoリポジトリを選択します。[削除] をクリックします。
gcloud
ods-build-repo リポジトリを削除するには、次のコマンドを実行します。
gcloud artifacts repositories delete ods-build-repo --location=us-central1