驗證建構來源資訊

Assured OSS 套件的建構作業符合 SLSA 第 2 級法規。建構出處會以安全性中繼資料的形式提供。本頁說明如何驗證建構出處中繼資料。

本文適用於免費方案。如要瞭解進階層級的建構出處資訊,請參閱「存取安全中繼資料並驗證套件」。

事前準備

  • 安裝 cosign,驗證建構出處中的簽章。

設定驗證方法

如要瞭解如何設定驗證,請參閱「設定驗證」。

驗證建構來源資訊

建構出處是使用 in-toto 認證簽署,而這項認證會使用 DSSE 信封格式。也就是說,產生的簽章會包含經過包裝的簽章和原始資料。

使用 aoss-verifier 工具

  1. 如要驗證建構出處,請安裝 aoss-verifier 工具。

  2. 匯出 $(go env GOPATH)/bin,然後執行加上 --verify_build_provenance 旗標的 aoss-verifier verify-package 指令。

    aoss-verifier verify-package \
       --language LANGUAGE \
       --package_id PACKAGE_ID \
       --version VERSION \
       --artifact_path ARTIFACT_PATH \
       --verify_build_provenance \
       [--disable_certificate_verification] \
       [--temp_downloads_path TEMP_DOWNLOADS_DIR_PATH] \
       [--disable_deletes]
    

    更改下列內容:

    • LANGUAGE:套件語言。值必須為小寫。
    • PACKAGE_ID:如果是 Java,格式為 groupId:artifactId。如果是 Python,格式為 packageName。值必須為小寫。
    • VERSION:套件版本。
    • ARTIFACT_PATH:要驗證的本機目錄中資料檔案路徑。請使用下列副檔名:
      • Java 套件的 jar 副檔名
      • Python 套件的 whl 副檔名

    --disable_certificate_verification 是選用標記,如果使用,會略過透過憑證鏈結將分葉憑證與根憑證相符的程序。

    --temp_downloads_path 是選用旗標,可用於設定要下載檔案的路徑。更換 TEMP_DOWNLOADS_DIR_PATH。 如未設定這個旗標,檔案會下載至目前目錄中的 tmp_downloads 資料夾。

    --disable_deletes 是選用旗標,可保留下載的檔案。根據預設,這項工具會清除所有已下載的檔案。

詳情請參閱 工具的 README 檔案

手動驗證

如要驗證建構出處,請執行下列操作:

  1. 擷取建構來源。

    視您存取安全中繼資料的方式而定,建構出處的存取方式也會有所不同。

    詳情請參閱下列中繼資料程式碼片段範例:

    {
      "creationTime": "2023-03-25T05:32:23Z",
      "buildDetails": [
       {
         "packageFileName": "jackson-databind-2.13.3.jar",
         "envelope": {
         "payload": "eyJfdHlwZSI6Imh0d……………",
         "payloadType": "application/vnd.in-toto+json",
         "signatures": [
            "sig": "eyJwYXlsb2FkVHlwZSI6Im……",
            "keyid": "gcpkms://projects/cloud-aoss/locations/global/keyRings/cloud-aoss-ring/cryptoKeys/tekton-chains"
           }
         ]
       },
      "buildProvenance": "{\"_type\":\"https://in-toto.io/Statement/v0.1…"
    .....
    
    

    中繼資料片段範例:

    {'BuildOccurrence': name: "projects/cloud-aoss/occurrences/06c514bb-1069-4cde-8d68-b1306f19535a"
    resource_uri: "jackson-databind-2.13.3.jar@sha256:4c01a14673bc1cd4a2df337a3b4e695af0a6ed8ac6be19c9e4077377fb8adf92"
    note_name: "projects/cloud-aoss/notes/tekton-cloudbuild-intoto"
    kind: BUILD
    create_time {
      seconds: 1665556616
      nanos: 891004000
    }
    ……
    ……
    }
    envelope {
      payload: "{\"_type\":\"https://in-toto.io/Statement/v0.1\", ….."
      payload_type: "application/vnd.in-toto+json"
      signatures {
        sig: "{\"payloadType\":\"application/vnd.in-toto+json\",....."
        keyid: "gcpkms://projects/cloud-aoss/locations/global/keyRings/cloud-aoss-ring/cryptoKeys/tekton-chains"
      }
    }
    ,
    
    
    
  2. 擷取建構來源簽章。

    建構出處包含名為「Envelope」的區段,其中包含簽章,如「EnvelopeSignature」EnvelopeSignature。如要擷取簽章,請按照下列步驟操作:

    1. sig 資料儲存在名為 signature.txt 的檔案中。
    2. 使用中繼資料指令碼檢查中繼資料是否已下載。

      如果使用中繼資料指令碼下載中繼資料,請修改簽章並儲存在名為 signature.sig 的另一個檔案中。

      如要修改簽章,請執行下列指令:

      cat signature.txt | sed -e 's/\\"/"/g' > signature.sig
      

      如果沒有使用中繼資料指令碼下載中繼資料,請解碼簽章並儲存在名為 signature.sig 的另一個檔案中。

      如要解碼簽章,請使用下列指令:

      cat signature.txt | tr '\-_' '+/' | base64 -d > signature.sig
      
  3. 擷取建構出處公開金鑰。

    建構出處的「EnvelopeSignature」EnvelopeSignature部分包含用來簽署建構出處的金鑰參照。金鑰會以下列其中一種格式儲存:

    1. gcpkms://projects/cloud-aoss/locations/global/keyRings/cloud-aoss-ring/cryptoKeys/KEY_NAME
    2. gcpkms://projects/cloud-aoss/locations/global/keyRings/cloud-aoss-ring/cryptoKeys/KEY_NAME/cryptoKeyVersions/KEY_VERSION

      其中 KEY_NAMEKEY_VERSION 是 Cloud Key Management Service 金鑰的名稱和版本。

    公開金鑰會儲存在 Assured OSS 擁有的 Cloud Storage bucket 中。

    使用 Google Cloud CLI 擷取公開金鑰。請使用下列其中一個指令:

    • 如果只有 KEY_NAME

      gcloud storage cp gs://cloud-aoss/keys/KEY_NAME-public.pem PATH_TO_LOCAL_STORE
      
    • 如果 KEY_NAMEKEY_VERSION 同時存在:

      gcloud storage cp gs://cloud-aoss/keys/KEY_NAME-KEY_VERSION-public.pem PATH_TO_LOCAL_STORE
      

    請替換下列項目:

    • KEY_NAME 替換為 Cloud Key Management Service 金鑰的名稱。
    • KEY_VERSION,並使用 Cloud Key Management Service 金鑰版本。
    • PATH_TO_LOCAL_STORE 替換為儲存公開金鑰的本機路徑名稱。
  4. 驗證出處簽章。

    1. 如要驗證簽章,請執行下列指令:

      cosign verify-blob-attestation --insecure-ignore-tlog --key KEY_REF --signature signature.sig --type slsaprovenance --check-claims=false /dev/null
      

      更改下列內容:

      • KEY_REF:您在上一個步驟中下載的公開金鑰路徑。
      • signature.sig:包含上一個步驟中擷取簽章的檔案。

      指令順利執行後,會傳回下列輸出內容:

      Verified OK

    2. 如要一併驗證與出處相關聯的構件雜湊值,請使用下列指令:

      cosign verify-blob-attestation --insecure-ignore-tlog --key KEY_REF --signature signature.sig --type slsaprovenance --check-claims=true ARTIFACT_PATH 
      

      更改下列內容:

      • KEY_REF:您在上一個步驟中下載的公開金鑰路徑。
      • signature.sig:包含上一個步驟中擷取簽章的檔案。
      • ARTIFACT_PATH:構件的路徑。

      指令順利執行後,會傳回下列輸出內容:

      Verified OK

後續步驟