Melihat provenance build

Halaman ini berisi petunjuk tentang cara melihat dan mengaudit metadata provenance build yang dihasilkan oleh Cloud Build.

Build provenance adalah kumpulan data yang dapat diverifikasi tentang build yang dijalankan oleh Cloud Build. Metadata asal mencakup detail seperti ringkasan gambar yang di-build, lokasi sumber input, argumen build, dan durasi build.

Cloud Build mendukung pembuatan provenance build yang memenuhi jaminan Supply-chain Levels for Software Artifacts (SLSA) level 3 berdasarkan spesifikasi SLSA versi 0.1, dan dukungan untuk SLSA versi 1.0 kini tersedia dalam Pratinjau.

Sebagai bagian dari dukungan untuk spesifikasi SLSA v1.0, Cloud Build memberikan detail buildType. Anda dapat menggunakan skema buildType untuk memahami template berparameter yang digunakan untuk proses build. Untuk mengetahui informasi selengkapnya, lihat Cloud Build buildType v1.

Sebelum memulai

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

    Enable the APIs

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

Fitur ini hanya berfungsi dengan image container yang disimpan di Artifact Registry.

Melihat provenance build

Bagian ini menjelaskan cara melihat metadata provenance build yang dibuat oleh Cloud Build.

Saat Anda mem-build image dengan Cloud Build, kualitas build gambar akan direkam secara otomatis. Anda nanti dapat mengambil informasi ini untuk tujuan audit.

Lihat provenance di konsol Google Cloud

Anda dapat melihat provenance build di panel samping Security Insights di dalam Konsol Google Cloud.

Panel samping Security Insights memberikan ringkasan umum tentang informasi keamanan untuk artefak yang disimpan di Artifact Registry. Untuk mempelajari panel samping lebih lanjut dan cara menggunakan Cloud Build untuk membantu melindungi supply chain software Anda, lihat Melihat insight keamanan build.

Melihat provenance menggunakan Google Cloud CLI

  1. Untuk menghasilkan metadata provenance, jalankan build dengan Cloud Build.

    Kirim image yang di-build menggunakan kolom images, bukan langkah build docker push. Cloud Build hanya menghasilkan attestations untuk gambar yang dikirim melalui kolom images.

  2. Untuk melihat metadata provenance yang dihasilkan, jalankan perintah berikut:

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

    Ganti nilai placeholder dalam perintah dengan yang berikut ini:

    • LOCATION: Lokasi regional atau multi-regional.
    • PROJECT_ID: ID project Google Cloud.
    • REPOSITORY: Nama repositori.
    • IMAGE: Nama gambar.
    • HASH: Nilai hash sha256 pada gambar. Anda dapat menemukannya di output build Anda.

    Output-nya adalah provenance container, seperti yang dijelaskan dalam spesifikasi provenance SLSA. Misalnya:

      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: eyJfdHlwZSI6Imh0dHBzOi8vaW4tdG90by5pby9TdGF0ZW1lbnQvdjEiLCAic3ViamVjdCI6W3sibmFtZSI6Imh0dHBzOi8vdXMtY2VudHJhbDEtZG9ja2VyLnBrZy5kZXYvYXJnby1sb2NhbC1raGFsay9raGFsay1kb2NrZXItYXIvdGFnZ2VkLXdvcmxkLWdlbi10d28iLCAiZGlnZXN0Ijp7InNoYTI1NiI6IjdlOWI2ZTdiYTI4NDJjOTFjZjQ5ZjNlMjE0ZDA0YTdhNDk2ZjgyMTQzNTZmNDFkODFhNmU2ZGNhZDExZjExZTMifX0sIHsibmFtZSI6Imh0dHBzOi8vdXMtY2VudHJhbDEtZG9ja2VyLnBrZy5kZXYvYXJnby1sb2NhbC1raGFsay9raGFsay1kb2NrZXItYXIvdGFnZ2VkLXdvcmxkLWdlbi10d286bGF0ZXN0IiwgImRpZ2VzdCI6eyJzaGEyNTYiOiI3ZTliNmU3YmEyODQyYzkxY2Y0OWYzZTIxNGQwNGE3YTQ5NmY4MjE0MzU2ZjQxZDgxYTZlNmRjYWQxMWYxMWUzIn19XSwgInByZWRpY2F0ZVR5cGUiOiJodHRwczovL3Nsc2EuZGV2L3Byb3ZlbmFuY2UvdjEiLCAicHJlZGljYXRlIjp7ImJ1aWxkRGVmaW5pdGlvbiI6eyJidWlsZFR5cGUiOiJodHRwczovL2Nsb3VkLmdvb2dsZS5jb20vYnVpbGQvZ2NiLWJ1aWxkdHlwZXMvZ29vZ2xlLXdvcmtlci92MSIsICJleHRlcm5hbFBhcmFtZXRlcnMiOnsiYnVpbGRDb25maWdTb3VyY2UiOnsicGF0aCI6ImNsb3VkYnVpbGQueWFtbCIsICJyZWYiOiJyZWZzL2hlYWRzL21haW4iLCAicmVwb3NpdG9yeSI6ImdpdCtodHRwczovL2dpdGh1Yi5jb20va2hhbGtpZS9nY2ItcmVwby1zdGFnaW5nIn0sICJzdWJzdGl0dXRpb25zIjp7fX0sICJpbnRlcm5hbFBhcmFtZXRlcnMiOnsic3lzdGVtU3Vic3RpdHV0aW9ucyI6eyJCUkFOQ0hfTkFNRSI6Im1haW4iLCAiQlVJTERfSUQiOiJlNzNjYTFkNC1lYzRhLTRlYTYtYWNkZC1hYzhiYjE2ZGNjNzkiLCAiQ09NTUlUX1NIQSI6IjUyNWM1MmM1MDE3MzllNmRmMDYwOWVkMWY5NDRjMWJmZDgzMjI0ZTciLCAiTE9DQVRJT04iOiJ1cy13ZXN0MSIsICJQUk9KRUNUX05VTUJFUiI6IjI2NTQyNjA0MTUyNyIsICJSRUZfTkFNRSI6Im1haW4iLCAiUkVQT19GVUxMX05BTUUiOiJraGFsa2llL2djYi1yZXBvLXN0YWdpbmciLCAiUkVQT19OQU1FIjoiZ2NiLXJlcG8tc3RhZ2luZyIsICJSRVZJU0lPTl9JRCI6IjUyNWM1MmM1MDE3MzllNmRmMDYwOWVkMWY5NDRjMWJmZDgzMjI0ZTciLCAiU0hPUlRfU0hBIjoiNTI1YzUyYyIsICJUUklHR0VSX0JVSUxEX0NPTkZJR19QQVRIIjoiY2xvdWRidWlsZC55YW1sIiwgIlRSSUdHRVJfTkFNRSI6ImdpdGh1Yi10cmlnZ2VyLXN0YWdpbmcifSwgInRyaWdnZXJVcmkiOiJwcm9qZWN0cy8yNjU0MjYwNDE1MjcvbG9jYXRpb25zL3VzLXdlc3QxL3RyaWdnZXJzL2EwZDIzOWE0LTYzNWUtNGJkMy05ODJiLWQ4YjcyZDBiNGJhYiJ9LCAicmVzb2x2ZWREZXBlbmRlbmNpZXMiOlt7InVyaSI6ImdpdCtodHRwczovL2dpdGh1Yi5jb20va2hhbGtpZS9nY2ItcmVwby1zdGFnaW5nQHJlZnMvaGVhZHMvbWFpbiIsICJkaWdlc3QiOnsiZ2l0Q29tbWl0IjoiNTI1YzUyYzUwMTczOWU2ZGYwNjA5ZWQxZjk0NGMxYmZkODMyMjRlNyJ9fSwgeyJ1cmkiOiJnY3IuaW8vY2xvdWQtYnVpbGRlcnMvZG9ja2VyQHNoYTI1NjoxNTRmY2Q0ZDJkNjVjNmEzNWIwNmI5ODA1M2EwODI5YzU4MWUyMjNkNTMwYmU1NzE5MzI2ZjVkODVkNjgwZThkIiwgImRpZ2VzdCI6eyJzaGEyNTYiOiIxNTRmY2Q0ZDJkNjVjNmEzNWIwNmI5ODA1M2EwODI5YzU4MWUyMjNkNTMwYmU1NzE5MzI2ZjVkODVkNjgwZThkIn19XX0sICJydW5EZXRhaWxzIjp7ImJ1aWxkZXIiOnsiaWQiOiJodHRwczovL2Nsb3VkYnVpbGQuZ29vZ2xlYXBpcy5jb20vR29vZ2xlSG9zdGVkV29ya2VyIn0sICJtZXRhZGF0YSI6eyJpbnZvY2F0aW9uSWQiOiJodHRwczovL2Nsb3VkYnVpbGQuZ29vZ2xlYXBpcy5jb20vdjEvcHJvamVjdHMvYXJnby1sb2NhbC1raGFsay9sb2NhdGlvbnMvdXMtd2VzdDEvYnVpbGRzL2U3M2NhMWQ0LWVjNGEtNGVhNi1hY2RkLWFjOGJiMTZkY2M3OSIsICJzdGFydGVkT24iOiIyMDIzLTA4LTAxVDE5OjU2OjU3LjQ1MTU1MzE2MFoiLCAiZmluaXNoZWRPbiI6IjIwMjMtMDgtMDFUMTk6NTc6MTAuNzM0NDcxWiJ9LCAiYnlwcm9kdWN0cyI6W3t9XX19fQ==
          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'
      - 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.3
              materials:
              - digest:
                  sha1: 525c52c501739e6df0609ed1f944c1bfd83224e7
                uri: git+https://github.com/my-username/my-git-repo
              metadata:
                buildFinishedOn: '2023-08-01T19:57:10.734471Z'
                buildInvocationId: e73ca1d4-ec4a-4ea6-acdd-ac8bb16dcc79
                buildStartedOn: '2023-08-01T19:56:57.451553160Z'
              recipe:
                arguments:
                  '@type': type.googleapis.com/google.devtools.cloudbuild.v1.Build
                  id: e73ca1d4-ec4a-4ea6-acdd-ac8bb16dcc79
                  name: projects/265426041527/locations/us-west1/builds/e73ca1d4-ec4a-4ea6-acdd-ac8bb16dcc79
                  options:
                    dynamicSubstitutions: true
                    logging: LEGACY
                    pool: {}
                    requestedVerifyOption: VERIFIED
                    substitutionOption: ALLOW_LOOSE
                  sourceProvenance: {}
                  steps:
                  - args:
                    - tag
                    - hello-world
                    - us-central1-docker.pkg.dev/my-project/my-repo/my-image
                    name: gcr.io/cloud-builders/docker
                    pullTiming:
                      endTime: '2023-08-01T19:57:07.231646287Z'
                      startTime: '2023-08-01T19:57:07.225609188Z'
                    status: SUCCESS
                    timing:
                      endTime: '2023-08-01T19:57:08.343864907Z'
                      startTime: '2023-08-01T19:57:07.225609188Z'
                  substitutions:
                    BRANCH_NAME: main
                    COMMIT_SHA: 525c52c501739e6df0609ed1f944c1bfd83224e7
                    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
                entryPoint: cloudbuild.yaml
                type: https://cloudbuild.googleapis.com/CloudBuildYaml@v0.1
            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:13.168653Z'
        envelope:
          payload: eyJfdHlwZSI6Imh0dHBzOi8vaW4tdG90by5pby9TdGF0ZW1lbnQvdjAuMSIsInByZWRpY2F0ZSI6eyJidWlsZGVyIjp7ImlkIjoiaHR0cHM6Ly9jbG91ZGJ1aWxkLmdvb2dsZWFwaXMuY29tL0dvb2dsZUhvc3RlZFdvcmtlckB2MC4zIn0sIm1hdGVyaWFscyI6W3siZGlnZXN0Ijp7InNoYTEiOiI1MjVjNTJjNTAxNzM5ZTZkZjA2MDllZDFmOTQ0YzFiZmQ4MzIyNGU3In0sInVyaSI6ImdpdCtodHRwczovL2dpdGh1Yi5jb20va2hhbGtpZS9nY2ItcmVwby1zdGFnaW5nIn1dLCJtZXRhZGF0YSI6eyJidWlsZEZpbmlzaGVkT24iOiIyMDIzLTA4LTAxVDE5OjU3OjEwLjczNDQ3MVoiLCJidWlsZEludm9jYXRpb25JZCI6ImU3M2NhMWQ0LWVjNGEtNGVhNi1hY2RkLWFjOGJiMTZkY2M3OSIsImJ1aWxkU3RhcnRlZE9uIjoiMjAyMy0wOC0wMVQxOTo1Njo1Ny40NTE1NTMxNjBaIn0sInJlY2lwZSI6eyJhcmd1bWVudHMiOnsiQHR5cGUiOiJ0eXBlLmdvb2dsZWFwaXMuY29tL2dvb2dsZS5kZXZ0b29scy5jbG91ZGJ1aWxkLnYxLkJ1aWxkIiwiaWQiOiJlNzNjYTFkNC1lYzRhLTRlYTYtYWNkZC1hYzhiYjE2ZGNjNzkiLCJuYW1lIjoicHJvamVjdHMvMjY1NDI2MDQxNTI3L2xvY2F0aW9ucy91cy13ZXN0MS9idWlsZHMvZTczY2ExZDQtZWM0YS00ZWE2LWFjZGQtYWM4YmIxNmRjYzc5Iiwib3B0aW9ucyI6eyJkeW5hbWljU3Vic3RpdHV0aW9ucyI6dHJ1ZSwibG9nZ2luZyI6IkxFR0FDWSIsInBvb2wiOnt9LCJyZXF1ZXN0ZWRWZXJpZnlPcHRpb24iOiJWRVJJRklFRCIsInN1YnN0aXR1dGlvbk9wdGlvbiI6IkFMTE9XX0xPT1NFIn0sInNvdXJjZVByb3ZlbmFuY2UiOnt9LCJzdGVwcyI6W3siYXJncyI6WyJ0YWciLCJoZWxsby13b3JsZCIsInVzLWNlbnRyYWwxLWRvY2tlci5wa2cuZGV2L2FyZ28tbG9jYWwta2hhbGsva2hhbGstZG9ja2VyLWFyL3RhZ2dlZC13b3JsZC1nZW4tdHdvIl0sIm5hbWUiOiJnY3IuaW8vY2xvdWQtYnVpbGRlcnMvZG9ja2VyIiwicHVsbFRpbWluZyI6eyJlbmRUaW1lIjoiMjAyMy0wOC0wMVQxOTo1NzowNy4yMzE2NDYyODdaIiwic3RhcnRUaW1lIjoiMjAyMy0wOC0wMVQxOTo1NzowNy4yMjU2MDkxODhaIn0sInN0YXR1cyI6IlNVQ0NFU1MiLCJ0aW1pbmciOnsiZW5kVGltZSI6IjIwMjMtMDgtMDFUMTk6NTc6MDguMzQzODY0OTA3WiIsInN0YXJ0VGltZSI6IjIwMjMtMDgtMDFUMTk6NTc6MDcuMjI1NjA5MTg4WiJ9fV0sInN1YnN0aXR1dGlvbnMiOnsiQlJBTkNIX05BTUUiOiJtYWluIiwiQ09NTUlUX1NIQSI6IjUyNWM1MmM1MDE3MzllNmRmMDYwOWVkMWY5NDRjMWJmZDgzMjI0ZTciLCJSRUZfTkFNRSI6Im1haW4iLCJSRVBPX0ZVTExfTkFNRSI6ImtoYWxraWUvZ2NiLXJlcG8tc3RhZ2luZyIsIlJFUE9fTkFNRSI6ImdjYi1yZXBvLXN0YWdpbmciLCJSRVZJU0lPTl9JRCI6IjUyNWM1MmM1MDE3MzllNmRmMDYwOWVkMWY5NDRjMWJmZDgzMjI0ZTciLCJTSE9SVF9TSEEiOiI1MjVjNTJjIiwiVFJJR0dFUl9CVUlMRF9DT05GSUdfUEFUSCI6ImNsb3VkYnVpbGQueWFtbCIsIlRSSUdHRVJfTkFNRSI6ImdpdGh1Yi10cmlnZ2VyLXN0YWdpbmcifX0sImVudHJ5UG9pbnQiOiJjbG91ZGJ1aWxkLnlhbWwiLCJ0eXBlIjoiaHR0cHM6Ly9jbG91ZGJ1aWxkLmdvb2dsZWFwaXMuY29tL0Nsb3VkQnVpbGRZYW1sQHYwLjEifX0sInByZWRpY2F0ZVR5cGUiOiJodHRwczovL3Nsc2EuZGV2L3Byb3ZlbmFuY2UvdjAuMSIsInNsc2FQcm92ZW5hbmNlIjp7ImJ1aWxkZXIiOnsiaWQiOiJodHRwczovL2Nsb3VkYnVpbGQuZ29vZ2xlYXBpcy5jb20vR29vZ2xlSG9zdGVkV29ya2VyQHYwLjMifSwibWF0ZXJpYWxzIjpbeyJkaWdlc3QiOnsic2hhMSI6IjUyNWM1MmM1MDE3MzllNmRmMDYwOWVkMWY5NDRjMWJmZDgzMjI0ZTcifSwidXJpIjoiZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9raGFsa2llL2djYi1yZXBvLXN0YWdpbmcifV0sIm1ldGFkYXRhIjp7ImJ1aWxkRmluaXNoZWRPbiI6IjIwMjMtMDgtMDFUMTk6NTc6MTAuNzM0NDcxWiIsImJ1aWxkSW52b2NhdGlvbklkIjoiZTczY2ExZDQtZWM0YS00ZWE2LWFjZGQtYWM4YmIxNmRjYzc5IiwiYnVpbGRTdGFydGVkT24iOiIyMDIzLTA4LTAxVDE5OjU2OjU3LjQ1MTU1MzE2MFoifSwicmVjaXBlIjp7ImFyZ3VtZW50cyI6eyJAdHlwZSI6InR5cGUuZ29vZ2xlYXBpcy5jb20vZ29vZ2xlLmRldnRvb2xzLmNsb3VkYnVpbGQudjEuQnVpbGQiLCJpZCI6ImU3M2NhMWQ0LWVjNGEtNGVhNi1hY2RkLWFjOGJiMTZkY2M3OSIsIm5hbWUiOiJwcm9qZWN0cy8yNjU0MjYwNDE1MjcvbG9jYXRpb25zL3VzLXdlc3QxL2J1aWxkcy9lNzNjYTFkNC1lYzRhLTRlYTYtYWNkZC1hYzhiYjE2ZGNjNzkiLCJvcHRpb25zIjp7ImR5bmFtaWNTdWJzdGl0dXRpb25zIjp0cnVlLCJsb2dnaW5nIjoiTEVHQUNZIiwicG9vbCI6e30sInJlcXVlc3RlZFZlcmlmeU9wdGlvbiI6IlZFUklGSUVEIiwic3Vic3RpdHV0aW9uT3B0aW9uIjoiQUxMT1dfTE9PU0UifSwic291cmNlUHJvdmVuYW5jZSI6e30sInN0ZXBzIjpbeyJhcmdzIjpbInRhZyIsImhlbGxvLXdvcmxkIiwidXMtY2VudHJhbDEtZG9ja2VyLnBrZy5kZXYvYXJnby1sb2NhbC1raGFsay9raGFsay1kb2NrZXItYXIvdGFnZ2VkLXdvcmxkLWdlbi10d28iXSwibmFtZSI6Imdjci5pby9jbG91ZC1idWlsZGVycy9kb2NrZXIiLCJwdWxsVGltaW5nIjp7ImVuZFRpbWUiOiIyMDIzLTA4LTAxVDE5OjU3OjA3LjIzMTY0NjI4N1oiLCJzdGFydFRpbWUiOiIyMDIzLTA4LTAxVDE5OjU3OjA3LjIyNTYwOTE4OFoifSwic3RhdHVzIjoiU1VDQ0VTUyIsInRpbWluZyI6eyJlbmRUaW1lIjoiMjAyMy0wOC0wMVQxOTo1NzowOC4zNDM4NjQ5MDdaIiwic3RhcnRUaW1lIjoiMjAyMy0wOC0wMVQxOTo1NzowNy4yMjU2MDkxODhaIn19XSwic3Vic3RpdHV0aW9ucyI6eyJCUkFOQ0hfTkFNRSI6Im1haW4iLCJDT01NSVRfU0hBIjoiNTI1YzUyYzUwMTczOWU2ZGYwNjA5ZWQxZjk0NGMxYmZkODMyMjRlNyIsIlJFRl9OQU1FIjoibWFpbiIsIlJFUE9fRlVMTF9OQU1FIjoia2hhbGtpZS9nY2ItcmVwby1zdGFnaW5nIiwiUkVQT19OQU1FIjoiZ2NiLXJlcG8tc3RhZ2luZyIsIlJFVklTSU9OX0lEIjoiNTI1YzUyYzUwMTczOWU2ZGYwNjA5ZWQxZjk0NGMxYmZkODMyMjRlNyIsIlNIT1JUX1NIQSI6IjUyNWM1MmMiLCJUUklHR0VSX0JVSUxEX0NPTkZJR19QQVRIIjoiY2xvdWRidWlsZC55YW1sIiwiVFJJR0dFUl9OQU1FIjoiZ2l0aHViLXRyaWdnZXItc3RhZ2luZyJ9fSwiZW50cnlQb2ludCI6ImNsb3VkYnVpbGQueWFtbCIsInR5cGUiOiJodHRwczovL2Nsb3VkYnVpbGQuZ29vZ2xlYXBpcy5jb20vQ2xvdWRCdWlsZFlhbWxAdjAuMSJ9fSwic3ViamVjdCI6W3siZGlnZXN0Ijp7InNoYTI1NiI6IjdlOWI2ZTdiYTI4NDJjOTFjZjQ5ZjNlMjE0ZDA0YTdhNDk2ZjgyMTQzNTZmNDFkODFhNmU2ZGNhZDExZjExZTMifSwibmFtZSI6Imh0dHBzOi8vdXMtY2VudHJhbDEtZG9ja2VyLnBrZy5kZXYvYXJnby1sb2NhbC1raGFsay9raGFsay1kb2NrZXItYXIvdGFnZ2VkLXdvcmxkLWdlbi10d28ifSx7ImRpZ2VzdCI6eyJzaGEyNTYiOiI3ZTliNmU3YmEyODQyYzkxY2Y0OWYzZTIxNGQwNGE3YTQ5NmY4MjE0MzU2ZjQxZDgxYTZlNmRjYWQxMWYxMWUzIn0sIm5hbWUiOiJodHRwczovL3VzLWNlbnRyYWwxLWRvY2tlci5wa2cuZGV2L2FyZ28tbG9jYWwta2hhbGsva2hhbGstZG9ja2VyLWFyL3RhZ2dlZC13b3JsZC1nZW4tdHdvOmxhdGVzdCJ9XX0=
          payloadType: application/vnd.in-toto+json
          signatures:
          - keyid: projects/verified-builder/locations/global/keyRings/attestor/cryptoKeys/provenanceSigner/cryptoKeyVersions/1
            sig: MEUCIQDsD7nX7YgnKrhgiNZXWuvSf_1AG8DgGDUAlZnjT_SB1AIgTBHZPCjTTPk3lQPAccL6WNg457QHufk9T9YB1FW5xbQ=
          - keyid: projects/argo-qa/locations/us-west1/keyRings/attestor/cryptoKeys/builtByGCB/cryptoKeyVersions/1
            sig: MEUCIQDnQmgbIcCkbDZy91HicY-IkcuV5bV_Zo0D1Y_rmsAMyQIga17tv0c_KAW3Uhv8mM2SZwY8D3YuP6TUy7QXDs2cmpA=
        kind: BUILD
        name: projects/my-project/occurrences/8b5dcf9d-4076-4b85-a934-adfb91042088
        noteName: projects/argo-qa/notes/intoto_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:13.168653Z'
    

    Beberapa hal penting yang perlu diperhatikan dalam contoh ini:

    • Build dipicu dari repositori GitHub. Anda dapat melihat commit yang sesuai di kolom materials.

    • Kolom digest dan fileHash merujuk ke objek yang sama. Kolom digest dienkode dalam basis 16 (dienkode hex) dan kolom fileHash di basis 64.

    • Ada dua tanda tangan di kolom envelope. Tanda tangan pertama dengan nama kunci provenanceSigner menggunakan tanda tangan yang sesuai DSSE (diformat dengan Pre-Authentication Encoding (PAE)), yang dapat diverifikasi di kebijakan Otorisasi Biner. Sebaiknya Anda menggunakan tanda tangan ini dalam penggunaan baru provening ini. Tanda tangan kedua dengan nama kunci builtByGCB diberikan untuk penggunaan lama.

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

Lihat provenance build untuk kumpulan regional

Cloud Build tidak menghasilkan metadata provenance untuk build di gabungan regional, baik Anda menggunakan kumpulan pribadi maupun kumpulan default dengan region yang ditetapkan. Anda dapat mengaktifkan metadata provenance untuk build regional dengan menambahkan opsi ke file build. Untuk mengetahui informasi selengkapnya tentang region, lihat Lokasi Cloud build.

Lihat provenance untuk artefak non-container

Cloud Build menghasilkan metadata provenance Supply chain Levels for Software Artifacts (SLSA) untuk aplikasi Java (Maven), Python, dan Node.js (npm) mandiri saat Anda mengupload artefak build ke Artifact Registry.

  1. Untuk membuat metadata provenance untuk artefak Anda, jalankan build dengan Cloud Build:

    Setelah build selesai, perhatikan BuildID.

  2. Jalankan 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'
    

    Dalam kejadian project Anda, telusuri berdasarkan BuildID untuk menemukan informasi provenance yang terkait dengan setiap artefak build.

Validasi provenance

Bagian ini menjelaskan cara memvalidasi provenance build.

Memvalidasi provenance build akan membantu Anda:

  • mengonfirmasi bahwa artefak build dihasilkan dari sumber dan builder tepercaya
  • pastikan metadata provenance yang mendeskripsikan proses build Anda lengkap dan autentik

Untuk mengetahui informasi selengkapnya, lihat Safeguard build.

Memvalidasi provenance menggunakan pemverifikasi SLSA

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

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

Untuk menggunakan pemverifikasi SLSA:

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

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

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

    Ganti nilai placeholder dalam perintah dengan yang berikut ini:

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

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

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

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

    Dengan keterangan:

    • SOURCE adalah URI repositori sumber untuk gambar Anda, misalnya github.com/username/my-application.

      Jika Anda memverifikasi build yang tidak dihasilkan oleh pemicu Git, sumbernya akan terlihat berbeda. Misalnya, saat Anda mengerjakan kode sumber secara lokal, gcloud builds submit akan mengupload sumber Anda ke Cloud Storage. Kemudian, info sumber Cloud Storage Anda akan terlihat seperti gs://myrepo/source/1665165300.279777-955d1904741e4bbeb3461080299e929a.tgz#1665165361152799.

    • BUILDER_ID ID unik untuk builder, misalnya https://cloudbuild.googleapis.com/GoogleHostedWorker

    Jika Anda ingin mencetak provenance yang divalidasi untuk digunakan di mesin kebijakan, gunakan perintah sebelumnya dengan flag --print-provenance.

    Output-nya akan mirip dengan berikut ini: PASSED: Verified SLSA provenance atau FAILED: SLSA verification failed: <error details>.

Untuk informasi selengkapnya tentang tanda opsional, lihat opsi.

Memvalidasi metadata provenance dengan gcloud CLI

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

  1. Buat direktori baru dan buka direktori tersebut.

    mkdir provenance && cd provenance
    
  2. Dengan 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 provenance, yang dienkode dalam base64url. Mendekode data dan menyimpannya 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
    

    Kedua jenis SLSA versi 0.1 dan 1.0 provenance akan disimpan jika tersedia. 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.payload' | tr '\-_' '+/' | base64 -d > provenance.json
    
  4. Amplop juga berisi tanda tangan di atas provenance. Mendekode data dan menyimpannya dalam file.

    gcloud artifacts docker images describe LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE@sha256:HASH --show-provenance \
    --format=json | '.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 provenance pertama (.provenance_summary.provenance[0].envelope.signatures[0]) yang ditandatangani dengan kunci provenanceSigner. Payload ditandatangani melalui envelope berformat PAE. Untuk memverifikasinya, jalankan perintah ini untuk mengubah provenance ke dalam format PAE yang diharapkan, yaitu "DSSEv1" + SP + LEN(type) + SP + type + SP + LEN(body) + SP + body.

    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, output-nya adalah Verified OK.

Wajibkan gambar Anda memiliki metadata provenance yang terkait

Secara default, jika Cloud Build tidak menghasilkan metadata provenance, build tetap berhasil diselesaikan. Untuk menimpa perilaku ini dan menggagalkan build jika Cloud Build tidak menghasilkan metadata provenance untuk image Anda, tambahkan opsi requestedVerifyOption: VERIFIED ke file konfigurasi build.

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

Setelah menambahkan requestedVerifyOption, Cloud Build hanya menandai build sebagai berhasil jika dapat membuat metadata provenance yang sesuai. Hal ini juga memengaruhi image yang di-build di kumpulan regional, sehingga memungkinkan pembuatan metadata dan pembuatan pengesahan untuk gambar tersebut.

Langkah selanjutnya