Cloud Build パイプラインでオンデマンド スキャンを使用する


Cloud Build パイプラインの一部としてオンデマンド スキャンを使用すると、コンテナ イメージに事前定義されたレベルと一致する重大度の脆弱性がある場合にビルドをブロックできます。

このチュートリアルでは、Cloud Build を使用してソースコードからコンテナ イメージをビルドし、脆弱性をスキャンして脆弱性の重大度を確認し、特定の重大度の脆弱性がない場合にイメージを Artifact Registry に push する方法について説明します。

このチュートリアルでは、新しい Google Cloud プロジェクトを作成し、分離された環境で手順を完了することをおすすめします。

目標

  • Cloud Build でイメージをビルドする。
  • ビルドされたイメージをオンデマンド スキャンでスキャンします。
  • 許容できる脆弱性のレベルを評価する。
  • イメージを Artifact Registry に保存します。

料金

このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。 新しい Google Cloud ユーザーは無料トライアルをご利用いただける場合があります。

このドキュメントに記載されているタスクの完了後、作成したリソースを削除すると、それ以上の請求は発生しません。詳細については、クリーンアップをご覧ください。

始める前に

  1. 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.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the On-Demand Scanning, Cloud Build, and Artifact Registry APIs.

    Enable the APIs

  5. Install the Google Cloud CLI.
  6. To initialize the gcloud CLI, run the following command:

    gcloud init
  7. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  8. Make sure that billing is enabled for your Google Cloud project.

  9. Enable the On-Demand Scanning, Cloud Build, and Artifact Registry APIs.

    Enable the APIs

  10. Install the Google Cloud CLI.
  11. To initialize the gcloud CLI, run the following command:

    gcloud init

必要なロール

Cloud Build で使用するサービス アカウントには、次のロールが必要です。

デフォルトの Cloud Build サービス アカウントには、同じプロジェクトの Artifact Registry リポジトリに必要な権限が付与されています。リポジトリが Cloud Build に使用するプロジェクトと同じプロジェクトにある場合は、オンデマンド スキャン管理者ロールのみを付与する必要があります。

Cloud Build にユーザー指定のサービス アカウントを使用している場合は、両方のロールを付与する必要があります。

ソースファイルを準備する

このチュートリアルでは、Dockerfile からイメージをビルドします。Dockerfile は、Docker がイメージをビルドするための手順が記載されたソースファイルです。

  1. ターミナルを開き、ods-tutorial という名前の新しいディレクトリを作成し、そのディレクトリに移動します。

    mkdir ods-tutorial && cd ods-tutorial
    
  2. 次の内容のファイルを 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 リポジトリを作成する

  1. プロジェクト ID を、API を有効にしたプロジェクトと同じプロジェクトに設定します。

    gcloud config set project PROJECT_ID
    
  2. ロケーション us-central1ods-build-repo という名前の Docker リポジトリを作成します。

    gcloud artifacts repositories create ods-build-repo --repository-format=docker \
    --location=us-central1 --description="Repository for scan and build"
    
  3. リポジトリが正常に作成されたことを確認します。

    gcloud artifacts repositories list
    

ビルドとスキャン

このセクションでは、ビルド構成ファイルを使用してビルド パイプラインを実行します。ビルド構成ファイルは、指定した内容に基づいて複数のタスクを実行する方法について Cloud Build に指示します。

  1. 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_IDSEVERITY の値は、ビルドコマンドのスクリプトに渡されます。

  2. ブロックする脆弱性の SEVERITY レベルを指定して、ビルドを開始します。

    SEVERITY には、次の値を使用できます。

    • CRITICAL
    • HIGH
    • MEDIUM
    • LOW

    正規表現を使用して、複数の重大度を指定できます。

    次の例では、CRITICALHIGH の重大度の値の両方を指定します。これにより、重大度レベルが 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 アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。

プロジェクトを削除する

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

リソースを個別に削除する

リポジトリを削除する前に、保持する必要があるイメージが別の場所で使用可能であることを確認してください。

リポジトリを削除するには、次の手順を行います。

コンソール

  1. Google Cloud コンソールで [リポジトリ] ページを開きます。

    [リポジトリ] ページを開く

  2. [リポジトリ] リストで、ods-build-repo リポジトリを選択します。

  3. [削除] をクリックします。

gcloud

ods-build-repo リポジトリを削除するには、次のコマンドを実行します。

gcloud artifacts repositories delete ods-build-repo --location=us-central1

次のステップ