Membuat dan memvalidasi asal build

Halaman ini memberikan petunjuk tentang cara membuat asal-usul build, melihat output, dan memvalidasinya.

Build provenance adalah kumpulan data yang dapat diverifikasi tentang build. Metadata asal-usul mencakup detail seperti ringkasan gambar yang dibuat, lokasi sumber input, argumen build, dan durasi build. Anda dapat menggunakan informasi ini untuk memastikan bahwa artefak yang dibuat yang Anda gunakan akurat dan andal, dibuat oleh sumber dan pembuat tepercaya.

Cloud Build mendukung pembuatan provenance build yang memenuhi jaminan tingkat 3 Supply-chain Levels for Software Artifacts (SLSA) berdasarkan spesifikasi untuk SLSA versi 0.1 dan 1.0.

Sebagai bagian dari dukungan untuk spesifikasi SLSA v1.0, Cloud Build menyediakan detail buildType dalam provenans build. Anda dapat menggunakan skema buildType untuk memahami template berparameter yang digunakan untuk proses build, termasuk nilai yang dicatat Cloud Build, dan sumber nilai tersebut. Untuk mengetahui informasi selengkapnya, lihat Cloud Build buildType v1.

Batasan

  • Cloud Build hanya menghasilkan provenans build untuk artefak yang disimpan di Artifact Registry.
  • Untuk mendapatkan provenance SLSA v1.0 dan v0.1, Anda harus membangun menggunakan pemicu. Jika Anda memulai build secara manual, dengan menggunakan gcloud CLI, Cloud Build hanya menyediakan provenans SLSA v0.1.
  • Lampiran repositori Docker, termasuk asal build, tidak tunduk pada kebijakan pembersihan. Sebaliknya, lampiran akan dihapus saat gambar yang dilampirkan dihapus. Untuk mengetahui informasi selengkapnya, lihat Mengelola lampiran dengan kebijakan pembersihan.

Sebelum memulai

  1. Enable the Cloud Build, Container Analysis, and Artifact Registry APIs.

    Enable the APIs

  2. Untuk menggunakan contoh command line dalam panduan ini, instal dan konfigurasi Google Cloud SDK.

  3. Siapkan kode sumber Anda.

  4. Memiliki repositori di Artifact Registry.

Membuat provenance build

Petunjuk berikut menjelaskan cara membuat provenans build untuk image container yang Anda simpan di Artifact Registry:

  1. Dalam file konfigurasi build, tambahkan kolom images untuk mengonfigurasi Cloud Build agar menyimpan image build Anda di Artifact Registry setelah build selesai.

    Cloud Build tidak dapat membuat provenance jika Anda mengirimkan image ke Artifact Registry menggunakan langkah docker push eksplisit.

    Cuplikan berikut menunjukkan konfigurasi build untuk membuat image container dan menyimpan image di repositori Docker di Artifact Registry:

    YAML

      steps:
      - name: 'gcr.io/cloud-builders/docker'
        args: [ 'build', '-t', 'LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE', '.' ]
      images: ['LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE']
    

    Dengan:

    • LOCATION: lokasi regional atau multi-regional untuk repositori Anda.
    • PROJECT_ID: ID project Google Cloud Anda.
    • REPOSITORY: nama repositori Artifact Registry Anda.
    • IMAGE: nama image container Anda.

    JSON

      {
      "steps": [
          {
              "name": "gcr.io/cloud-builders/docker",
              "args": [
                  "build",
                  "-t",
                  "LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE",
                  "."
              ]
          }
      ],
      "images": [
          "LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE"
      ]
      }
    

    Dengan:

    • LOCATION: lokasi regional atau multi-regional untuk repositori Anda.
    • PROJECT_ID: ID project Google Cloud Anda.
    • REPOSITORY: nama repositori Artifact Registry Anda.
    • IMAGE: nama image container Anda.
  2. Di bagian options pada konfigurasi build, tambahkan opsi requestedVerifyOption dan tetapkan ke nilai VERIFIED.

    Setelan ini mengaktifkan pembuatan informasi asal usul dan mengonfigurasi Cloud Build untuk memverifikasi bahwa metadata informasi asal usul ada. Build hanya akan ditandai berhasil jika provenance dibuat.

    YAML

    options:
      requestedVerifyOption: VERIFIED
    

    JSON

    {
        "options": {
            "requestedVerifyOption": "VERIFIED"
        }
    }
    
  3. Mulai membangun.

Melihat provenance build

Bagian ini menjelaskan cara melihat metadata asal build yang dibuat oleh Cloud Build. Anda dapat mengambil informasi ini untuk tujuan audit.

Anda dapat mengakses metadata provenans build untuk container menggunakan panel samping Insight keamanan dalam konsol Google Cloud , atau menggunakan gcloud CLI.

console

Panel samping Insight keamanan memberikan ringkasan umum informasi keamanan untuk artefak yang disimpan di Artifact Registry.

Untuk melihat panel Insight keamanan:

  1. Buka halaman Build History di konsol Google Cloud :

    Buka halaman Histori Build

  2. Di tabel dengan build, temukan baris dengan build yang ingin Anda lihat insight keamanannya.

  3. Di kolom Insight keamanan, klik Lihat.

    Tindakan ini akan menampilkan panel Insight keamanan untuk artefak yang dipilih.

    Kartu Build menampilkan detail asal dan link. Anda dapat melihat cuplikan asal-usul dengan mengklik ikon link.

Untuk mempelajari lebih lanjut panel samping dan cara menggunakan Cloud Build untuk membantu melindungi supply chain software Anda, lihat Melihat insight keamanan build.

gcloud CLI

Untuk melihat metadata asal-usul image container, jalankan perintah berikut:

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

Ganti kode berikut:

  • LOCATION: lokasi regional atau multi-regional untuk repositori Anda.
  • PROJECT_ID: ID project Google Cloud Anda.
  • REPOSITORY: nama repositori Artifact Registry Anda.
  • IMAGE: nama image container Anda.
  • HASH: Nilai hash sha256 gambar. Anda dapat menemukannya di output build Anda.
  • FORMAT: Setelan opsional tempat Anda dapat menentukan format output.

Contoh output

Provenans build akan terlihat seperti berikut:

      image_summary:
      digest: sha256:7e9b6e7ba2842c91cf49f3e214d04a7a496f8214356f41d81a6e6dcad11f11e3
      fully_qualified_digest: us-central1-docker.pkg.dev/my-project/my-repo/my-image@sha256:7e9b6e7ba2842c91cf49f3e214d04a7a496f8214356f41d81a6e6dcad11f11e3
      registry: us-central1-docker.pkg.dev
      repository: my-repo
      slsa_build_level: 0
    provenance_summary:
      provenance:
      - build:
          inTotoSlsaProvenanceV1:
            _type: https://in-toto.io/Statement/v1
            predicate:
              buildDefinition:
                buildType: https://cloud.google.com/build/gcb-buildtypes/google-worker/v1
                externalParameters:
                  buildConfigSource:
                    path: cloudbuild.yaml
                    ref: refs/heads/main
                    repository: git+https://github.com/my-username/my-git-repo
                  substitutions: {}
                internalParameters:
                  systemSubstitutions:
                    BRANCH_NAME: main
                    BUILD_ID: e73ca1d4-ec4a-4ea6-acdd-ac8bb16dcc79
                    COMMIT_SHA: 525c52c501739e6df0609ed1f944c1bfd83224e7
                    LOCATION: us-west1
                    PROJECT_NUMBER: '265426041527'
                    REF_NAME: main
                    REPO_FULL_NAME: my-username/my-git-repo
                    REPO_NAME: my-git-repo
                    REVISION_ID: 525c52c501739e6df0609ed1f944c1bfd83224e7
                    SHORT_SHA: 525c52c
                    TRIGGER_BUILD_CONFIG_PATH: cloudbuild.yaml
                    TRIGGER_NAME: github-trigger-staging
                  triggerUri: projects/265426041527/locations/us-west1/triggers/a0d239a4-635e-4bd3-982b-d8b72d0b4bab
                resolvedDependencies:
                - digest:
                    gitCommit: 525c52c501739e6df0609ed1f944c1bfd83224e7
                  uri: git+https://github.com/my-username/my-git-repo@refs/heads/main
                - digest:
                    sha256: 154fcd4d2d65c6a35b06b98053a0829c581e223d530be5719326f5d85d680e8d
                  uri: gcr.io/cloud-builders/docker@sha256:154fcd4d2d65c6a35b06b98053a0829c581e223d530be5719326f5d85d680e8d
              runDetails:
                builder:
                  id: https://cloudbuild.googleapis.com/GoogleHostedWorker
                byproducts:
                - {}
                metadata:
                  finishedOn: '2023-08-01T19:57:10.734471Z'
                  invocationId: https://cloudbuild.googleapis.com/v1/projects/my-project/locations/us-west1/builds/e73ca1d4-ec4a-4ea6-acdd-ac8bb16dcc79
                  startedOn: '2023-08-01T19:56:57.451553160Z'
            predicateType: https://slsa.dev/provenance/v1
            subject:
            - digest:
                sha256: 7e9b6e7ba2842c91cf49f3e214d04a7a496f8214356f41d81a6e6dcad11f11e3
              name: https://us-central1-docker.pkg.dev/my-project/my-repo/my-image
            - digest:
                sha256: 7e9b6e7ba2842c91cf49f3e214d04a7a496f8214356f41d81a6e6dcad11f11e3
              name: https://us-central1-docker.pkg.dev/my-project/my-repo/my-image:latest
        createTime: '2023-08-01T19:57:14.810489Z'
        envelope:
          payload:
          eyJfdHlwZSI6Imh0dHBzOi8vaW4tdG90by5pby9TdGF0ZW1lbnQvdMWQ0LWVjNGEtNGVhNi1hY2RkLWFjOGJiMTZkY2M3OSIsICJzdGFydGVkT24iOiIyMDIzLTA4LTAxVDE5OjU2OjU3LjQ1MTU1MzE2MFoiLCAiZmluaXNoZWRPbiI6IjIwMjMtMDgtMDFUMTk6NTc6MTAuNzM0NDcxWiJ9LCAiYnlwcm9kdWN0cyI6W3t9XX19fQ==...
          payloadType: application/vnd.in-toto+json
          signatures:
          - keyid: projects/verified-builder/locations/global/keyRings/attestor/cryptoKeys/google-hosted-worker/cryptoKeyVersions/1
            sig: MEUCIQCss8UlQL2feFePRJuKTE8VA73f85iqj4OJ9SvVPqTNwAIgYyuyuIrl1PxQC5B109thO24Y6NA4bTa0PJY34EHRSVE=
        kind: BUILD
        name: projects/my-project/occurrences/71787589-c6a6-4d6a-a030-9fd041e40468
        noteName: projects/argo-qa/notes/intoto_slsa_v1_e73ca1d4-ec4a-4ea6-acdd-ac8bb16dcc79
        resourceUri: https://us-central1-docker.pkg.dev/my-project/my-repo/my-image@sha256:7e9b6e7ba2842c91cf49f3e214d04a7a496f8214356f41d81a6e6dcad11f11e3
        updateTime: '2023-08-01T19:57:14.810489Z'
    

Beberapa hal penting yang perlu diperhatikan dalam contoh ini:

  • Sumber: Build dipicu dari repositori GitHub.

  • Referensi objek: Kolom bernama digest dan fileHash merujuk ke objek yang sama. Kolom digest yang disertakan dalam output contoh dienkode dalam base 16 (dienkode hex). Jika Anda menggunakan perujukan SLSA versi 0.1, output Anda menggunakan kolom fileHash yang dienkode dalam base64.

  • Tanda tangan: Jika Anda menggunakan provenans SLSA versi 0.1, output Anda berisi dua tanda tangan di kolom envelope. Tanda tangan pertama, yang memiliki nama kunci provenanceSigner, menggunakan tanda tangan yang sesuai dengan DSSE (diformat dengan Pre-Authentication Encoding (PAE)), yang dapat diverifikasi dalam kebijakan Binary Authorization. Sebaiknya gunakan tanda tangan ini dalam penggunaan baru asal-usul ini. Tanda tangan kedua, yang memiliki nama kunci builtByGCB, disediakan untuk penggunaan lama.

  • Akun layanan: Tanda tangan yang otomatis disertakan dalam provenans Cloud Build membantu Anda memverifikasi layanan build yang mengeksekusi build. Anda juga dapat mengonfigurasi Cloud Build untuk mencatat metadata yang dapat diverifikasi tentang akun layanan yang digunakan untuk memulai build. Untuk mengetahui informasi selengkapnya, lihat menandatangani image container dengan cosign.

  • Payload: Contoh asal-usul yang ditampilkan di halaman ini disingkat agar lebih mudah dibaca. Output sebenarnya akan lebih panjang, karena payload adalah versi berenkode base-64 dari semua metadata asal.

  • Dependensi: Dependensi yang Anda tentukan dalam file build disertakan dalam asal, di kolom resolvedDependencies.

Melihat provenance untuk artefak non-container

Cloud Build menghasilkan metadata asal-usul SLSA untuk aplikasi Go, Java (Maven), Python, dan Node.js (npm) mandiri saat Anda mengupload artefak build ke Artifact Registry. Anda dapat mengambil metadata asal dengan melakukan panggilan API langsung.

  1. Untuk membuat metadata asal untuk artefak Anda, jalankan build dengan Cloud Build. Gunakan salah satu panduan berikut:

    Setelah build selesai, catat BuildID.

  2. Ambil metadata asal dengan menjalankan panggilan API berikut di terminal Anda, dengan PROJECT_ID adalah ID yang terkait dengan project Google Cloud Anda:

    alias gcurl='curl -H"Authorization: Bearer $(gcloud auth print-access-token)"'
        gcurl 'https://containeranalysis.googleapis.com/v1/projects/PROJECT_ID/occurrences'
    

    Anda harus menggunakan panggilan API untuk mengakses metadata asal untuk jenis artefak ini. Metadata asal untuk artefak non-penampung tidak ditampilkan di konsol Google Cloud atau dapat diakses melalui gcloud CLI.

  3. Dalam kemunculan untuk project Anda, telusuri menurut BuildID untuk menemukan informasi asal-usul yang terkait dengan artefak build.

Memvalidasi bukti sumber

Bagian ini menjelaskan cara memvalidasi asal build untuk image container.

Memvalidasi asal build membantu Anda:

  • mengonfirmasi bahwa artefak build dihasilkan dari sumber dan pembangun tepercaya
  • memastikan bahwa metadata asal yang menjelaskan proses build Anda lengkap dan autentik

Untuk mengetahui informasi selengkapnya, lihat Mengamankan build.

Memvalidasi asal menggunakan pemverifikasi SLSA

Verifier SLSA adalah alat CLI open source untuk memvalidasi integritas build berdasarkan spesifikasi SLSA.

Jika menemukan masalah, verifier akan menampilkan pesan error mendetail untuk membantu Anda memperbarui proses build dan mengurangi risiko.

Untuk menggunakan verifier SLSA, lakukan hal berikut:

  1. Instal versi 2.1 atau yang lebih tinggi dari repositori slsa-verifier

    go install github.com/slsa-framework/slsa-verifier/v2/cli/slsa-verifier@VERSION
    
  2. Di CLI, tetapkan variabel untuk ID image Anda:

    export IMAGE=LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE@sha256:HASH
    

    Dengan:

    • LOCATION: Lokasi regional atau multi-regional.
    • PROJECT_ID: Google Cloud project ID.
    • REPOSITORY: Nama repositori.
    • IMAGE: Nama gambar.
    • HASH: Nilai hash sha256 gambar. Anda dapat menemukannya di output build Anda.
  3. Izinkan gcloud CLI agar verifier SLSA dapat mengakses data asal Anda:

    gcloud auth configure-docker LOCATION-docker.pkg.dev
    
  4. Ambil asal-usul gambar Anda dan simpan sebagai JSON:

    gcloud artifacts docker images describe $IMAGE --format json --show-provenance > provenance.json
    
  5. Verifikasi asal:

    slsa-verifier verify-image "$IMAGE" \
    --provenance-path provenance.json \
    --source-uri SOURCE \
    --builder-id=BUILDER_ID
    

    Dengan:

    • SOURCE adalah URI repositori sumber untuk image Anda, misalnya github.com/my-repo/my-application.
    • BUILDER_ID ID unik untuk builder, misalnya https://cloudbuild.googleapis.com/GoogleHostedWorker

    Jika Anda ingin mencetak asal yang divalidasi untuk digunakan dalam mesin kebijakan, gunakan perintah sebelumnya dengan tanda --print-provenance.

    Outputnya mirip dengan berikut ini: PASSED: Verified SLSA provenance atau FAILED: SLSA verification failed: <error details>.

Untuk mengetahui informasi selengkapnya tentang flag opsional, lihat options.

Memvalidasi metadata asal dengan gcloud CLI

Jika ingin memverifikasi bahwa metadata asal build tidak dirusak, Anda dapat memvalidasi asal dengan melakukan langkah-langkah berikut:

  1. Buat direktori baru dan buka direktori tersebut.

    mkdir provenance && cd provenance
    
  2. Menggunakan informasi dari kolom keyid, dapatkan kunci publik.

    gcloud kms keys versions get-public-key 1 --location global --keyring attestor \
      --key builtByGCB --project verified-builder --output-file my-key.pub
    
  3. payload berisi representasi JSON dari asal-usul, yang dienkode dalam base64url. Dekode data dan simpan dalam file.

    gcloud artifacts docker images describe \
    LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE@sha256:HASH --show-provenance \
      --format=json | jq -r '.provenance_summary.provenance[] | select(.build.intotoStatement.predicateType == "https://slsa.dev/provenance/v0.1") | .envelope.payload' | tr '\-_' '+/' | base64 -d > provenance.json
    

    Jenis asal SLSA versi 0.1 dan 1.0 disimpan jika tersedia. Jika Anda ingin memfilter versi 1.0, ubah predicateType menjadi https://slsa.dev/provenance/v1. Contoh:

    gcloud artifacts docker images describe \
    LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE@sha256:HASH --show-provenance \
      --format=json | jq -r '.provenance_summary.provenance[] | select(.build.intotoStatement.predicateType == "https://slsa.dev/provenance/v1") | .envelope.payload' | tr '\-_' '+/' | base64 -d > provenance.json
    
  4. Amplop juga berisi tanda tangan atas asal-usul. Dekode data dan simpan dalam file.

      gcloud artifacts docker images describe LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE@sha256:HASH --show-provenance \
      --format=json | jq -r '.provenance_summary.provenance[] | select(.build.intotoStatement.predicateType == "https://slsa.dev/provenance/v0.1") | .envelope.signatures[0].sig' | tr '\-_' '+/' | base64 -d > signature.bin
    

    Jika Anda ingin memfilter versi 1.0, ubah predicateType untuk menggunakan https://slsa.dev/provenance/v1. Contoh:

    gcloud artifacts docker images describe LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE@sha256:HASH --show-provenance \
    --format=json | jq -r '.provenance_summary.provenance[] | select(.build.intotoStatement.predicateType == "https://slsa.dev/provenance/v1") | .envelope.signatures[0].sig' | tr '\-_' '+/' | base64 -d > signature.bin
    
  5. Perintah di atas mereferensikan tanda tangan asal pertama (.provenance_summary.provenance[0].envelope.signatures[0]) yang ditandatangani oleh kunci provenanceSigner. Payload ditandatangani melalui amplop berformat PAE. Untuk memverifikasinya, jalankan perintah ini untuk mengubah provenance menjadi format PAE "DSSEv1" + SP + LEN(type) + SP + type + SP + LEN(body) + SP + body yang diharapkan.

    echo -n "DSSEv1 28 application/vnd.in-toto+json $(cat provenance.json | wc -c) $(cat provenance.json)" > provenance.json
    
  6. Validasi tanda tangan.

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

    Setelah validasi berhasil, outputnya adalah Verified OK.

Langkah berikutnya