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

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

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

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

目標

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

費用

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

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。

新規の Google Cloud ユーザーは無料トライアルをご利用いただける場合があります。

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

始める前に

  1. アカウントにログインします。 Google Cloud を初めて使用する場合は、 アカウントを作成して、 実際のシナリオでプロダクトがどのように機能するかを評価してください。 Google Cloud新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
  2. 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 the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. 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 the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  5. Google Cloud CLI をインストールします。

  6. 外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。

  7. gcloud CLI を初期化するには、次のコマンドを実行します:

    gcloud init
  8. 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 the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  9. Verify that billing is enabled for your Google Cloud project.

  10. 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 the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  11. Google Cloud CLI をインストールします。

  12. 外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。

  13. gcloud CLI を初期化するには、次のコマンドを実行します:

    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. API を有効にしたプロジェクトと同じプロジェクトにプロジェクト ID を設定します。

    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. コンソールで [**リソースの管理**] ページに移動します。 Google Cloud

    [リソースの管理] に移動

  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、 [Shut down] をクリックしてプロジェクトを削除します。

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

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

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

コンソール

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

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

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

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

gcloud

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

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

次のステップ