ビルドの来歴の表示

コレクションでコンテンツを整理 必要に応じて、コンテンツの保存と分類を行います。

このページでは、Cloud Build によって生成されたビルドの来歴メタデータを表示する方法について説明します。

Cloud Build は、Software Artifacts のサプライ チェーン レベル(SLSA)レベル 3 の保証を満たすビルド場所の生成をサポートしています。

ビルドの場所は、Cloud Build によって実行されたビルドに関する検証可能なデータの集まりです。来歴のメタデータには、ビルドされたイメージのダイジェスト、入力ソースの場所、ビルド引数、ビルド時間などの詳細が含まれます。

始める前に

  1. Cloud Build, Container Analysis, and Artifact Registry API を有効にします。

    API を有効にする

  2. このガイドのコマンドラインの例を使用するには、Google Cloud SDK をインストールして構成します。

この機能は、Artifact Registry に保存されているコンテナ イメージでのみ動作します。

ビルドの来歴を表示する

このセクションでは、Cloud Build によって作成されたビルドの来歴メタデータを表示する方法について説明します。

Cloud Build でイメージをビルドすると、イメージのビルド来歴は自動的に記録されます。この情報は後で監査目的で取得できます。

  1. 来歴メタデータを生成するには、Cloud Build でビルドを実行します。

    docker push ビルドステップの代わりに images フィールドを使用して、ビルドされたイメージを push します。Cloud Build は、images フィールドを介して push されたイメージの証明書のみを生成します。

  2. 生成された来歴メタデータを表示するには、次のコマンドを実行します。

    gcloud artifacts docker images describe \
    LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE@sha256:HASH \
    --show-provenance
    

    コマンドのプレースホルダ値を、次のように置き換えます。

    • LOCATION: リージョンまたはマルチリージョンのロケーション
    • PROJECT_ID: Google Cloud プロジェクト ID
    • REPOSITORY: リポジトリの名前。
    • IMAGE: イメージの名前。
    • HASH: イメージの sha256 ハッシュ値。これはビルドの出力で確認できます。

    出力は、SLSA 来歴の仕様で説明されているコンテナの来歴です。次に例を示します。

    image_summary:
      digest: sha256:370938421b670a1489b98adac2ad41709bf0892be36382d50d563868dbfa5b16
      fully_qualified_digest: us-central1-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE@sha256:HASH
      registry: us-central1-docker.pkg.dev
      repository: REPOSITORY
    provenance_summary:
      provenance:
      - build:
          intotoStatement:
            _type: https://in-toto.io/Statement/v0.1
            predicateType: https://slsa.dev/provenance/v0.1
            slsaProvenance:
              builder:
                id: https://cloudbuild.googleapis.com/GoogleHostedWorker@v0.2
              materials:
              - digest:
                  md5: 6bbe6fa4c15b6486a03717bbf8b84f5c
                uri: https://github.com/user/repo/commit/1f25aed0a18e0bc674b6113f2d901306a3a9cb38
              metadata:
                buildFinishedOn: '2022-03-02T16:46:08.977469Z'
                buildInvocationId: 64def907-dbbd-4862-895a-0f67c95fcf2c
                buildStartedOn: '2022-03-02T16:45:55.972778547Z'
              recipe:
                arguments:
                  '@type': type.googleapis.com/google.devtools.cloudbuild.v1.Build
                  id: 64def907-dbbd-4862-895a-0f67c95fcf2c
                  options:
                    logging: LEGACY
                    pool: {}
                  sourceProvenance:
                    fileHashes:
                      gs://PROJECT_ID_cloudbuild/source/1646239554.496829-decf6ad639ea4470a569ff24c8f736f3.tgz#1646239555011921:
                        fileHash:
                        - type: MD5
                          value: 6vBB10o8CcNn1hUjzxjgcQ==
                    resolvedStorageSource:
                      bucket: PROJECT_ID_cloudbuild
                      generation: '1646239555011921'
                      object: source/1646239554.496829-decf6ad639ea4470a569ff24c8f736f3.tgz
                  steps:
                  - args:
                    - build
                    - --network
                    - cloudbuild
                    - --no-cache
                    - -t
                    - us-central1-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE:tag1
                    - .
                    name: gcr.io/cloud-builders/docker
                    pullTiming:
                      endTime: '2022-03-02T16:46:01.718245526Z'
                      startTime: '2022-03-02T16:46:01.712281272Z'
                    status: SUCCESS
                    timing:
                      endTime: '2022-03-02T16:46:03.364690833Z'
                      startTime: '2022-03-02T16:46:01.712281272Z'
            entryPoint: cloudbuild.yaml
                type: https://cloudbuild.googleapis.com/GoogleHostedWorker@v0.2
            subject:
            - digest:
                sha256: 370938421b670a1489b98adac2ad41709bf0892be36382d50d563868dbfa5b16
              name: https://us-central1-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE:tag1
        createTime: '2022-03-02T16:46:09.980577Z'
        envelope:
          payload: eyJfdHlwZSI...
          payloadType: application/vnd.in-toto+json
          signatures:
          - keyid: projects/verified-builder/locations/global/keyRings/attestor/cryptoKeys/builtByGCB/cryptoKeyVersions/1
            sig: MEYCIQCX87CG-4qGHkHKQIT7Z5t0vdG1cPqStwUwNapm4YQBfQIhAMYLaiKG9nnzHIsVmxWesoOw-WF8knNE14aE-Goeh7X0
        kind: BUILD
        name: projects/PROJECT_ID/occurrences/0168ea5c-0b84-475e-b786-ea80bbab15d1
        noteName: projects/verified-builder/notes/intoto_64def907-dbbd-4862-895a-0f67c95fcf2c
        resourceUri: https://us-central1-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE@sha256:HASH
        updateTime: '2022-03-02T16:46:09.980577Z'
    

    この例では、次の 2 つの重要な点に注意してください。

    • ビルドが GitHub リポジトリからトリガーされました。対応する commit は、materials フィールドで確認できます。

    • digest フィールドと fileHash フィールドは同じオブジェクトを参照します。digest フィールドは Base16 でエンコード(16 進数でエンコード)され、fileHash フィールドは Base64 でエンコードされます。

リージョン プールのビルドの場所を表示

Cloud Build は、プライベート プールを使用しているか、リージョンが割り当てられているデフォルトのプールを使用しているかにかかわらず、リージョン プールのビルドの来歴メタデータを生成しません。ビルドファイルにオプションを追加すると、リージョン ビルドの来歴メタデータを有効にできます。リージョンの詳細については、Cloud ビルドのロケーションをご覧ください。

来歴メタデータを検証する

メタデータが改ざんされていないことを確認するには、次の手順を行うことで来歴を検証できます。

  1. 新しいディレクトリを作成し、そのディレクトリに移動します。

    mkdir provenance && cd provenance
    
  2. keyid フィールドの情報を使用して、公開鍵を取得します。

    gcloud kms keys versions get-public-key 1 --location global --keyring attestor \
    --key builtByGCB --project verified-builder --output-file my-key.pub
    
  3. payload には、base64url でエンコードされた来歴の JSON 表現が含まれます。データをデコードしてファイルに格納する。

    gcloud artifacts docker images describe \
    LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE@sha256:HASH --show-provenance \
    --format=json | jq -r '.provenance_summary.provenance[0].envelope.payload' | tr '\-_' '+/' | base64 -d > provenance.json
    
  4. エンベロープには、来歴に関する署名も含まれます。データをデコードしてファイルに保存します。

    gcloud artifacts docker images describe LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE@sha256:HASH --show-provenance \
    --format=json | jq -r '.provenance_summary.provenance[0].envelope.signatures[0].sig' | tr '\-_' '+/' | base64 -d > signature.bin
    
  5. 署名を検証します。

    openssl dgst -sha256 -verify my-key.pub -signature signature.bin provenance.json
    

    検証が成功すると、「Verified OK」が出力されます。

イメージに来歴のメタデータが関連付けられるように求める

デフォルトでは、Cloud Build が来歴メタデータを生成していない場合でも、ビルドは正常に完了します。この動作をオーバーライドして、Cloud Build がイメージの来歴メタデータを生成しない場合にビルドが失敗するには、requestedVerifyOption: VERIFIED オプションをビルド構成ファイルに追加します。

steps:
- name: 'gcr.io/cloud-builders/docker'
  args: [ 'build', '-t', 'us-central1-docker.pkg.dev/$PROJECT_ID/quickstart-docker-repo/quickstart-image:tag1', '.' ]
images:
- 'us-central1-docker.pkg.dev/$PROJECT_ID/quickstart-docker-repo/quickstart-image:tag1'
options:
  requestedVerifyOption: VERIFIED

requestedVerifyOption を追加した後、Cloud Build は、対応する来歴メタデータを生成できる場合にのみ、ビルドを成功としてマークします。これは、リージョン プールにビルドされたイメージにも影響し、これらのイメージで来歴メタデータと証明書の生成が有効になります。

次のステップ