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

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

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

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

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

このチュートリアルでは、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 の両方の重大度値を指定しています。これにより、Cloud Build は HIGH 以上の重大度レベルに分類された脆弱性をチェックします。

    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 が提供する無料のオンライン トレーニングをご利用ください。安全なソフトウェアの開発をご覧ください。