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.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the On-Demand Scanning, Cloud Build, and Artifact Registry APIs.
- 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, Cloud Build, and Artifact Registry APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
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 リポジトリを作成する
プロジェクト 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
ビルドとスキャン
このセクションでは、ビルド構成ファイルを使用してビルド パイプラインを実行します。ビルド構成ファイルは、指定した内容に基づいて複数のタスクを実行する方法について 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
には、次の値を使用できます。CRITICAL
HIGH
MEDIUM
LOW
正規表現を使用して、複数の重大度を指定できます。
次の例では、
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 アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。
プロジェクトを削除する
- 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
リポジトリを選択します。[削除] をクリックします。
gcloud
ods-build-repo
リポジトリを削除するには、次のコマンドを実行します。
gcloud artifacts repositories delete ods-build-repo --location=us-central1