验证 build 来源

Assured OSS 软件包的构建符合 SLSA 2 级要求。构建来源信息作为安全元数据的一部分提供。本页介绍了如何验证 build 来源元数据。

本文档适用于免费层级。如需了解高级层级中的 build 出处,请参阅访问安全元数据并验证软件包

准备工作

  • 安装 cosign 以验证 build 出处中的签名。

设置身份验证

如需了解如何设置身份验证,请参阅设置身份验证

验证 build 出处

构建来源使用 in-toto 证明进行签名,而该证明又使用 DSSE 信封格式。这意味着生成的签名包含封装的签名和原始数据。

使用 aoss-verifier 工具

  1. 如需验证 build 出处,请安装 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 文件

手动验证

如需验证 build 出处,请执行以下操作:

  1. 检索 build 出处。

    根据您访问安全元数据的方式,构建来源的访问方式也会有所不同。

    如需了解详情,请参阅以下元数据代码段示例:

    {
      "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. 检索 build 来源签名。

    build 出处包含一个名为 Envelope 的部分,其中包含签名作为 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. 检索 build 出处公钥。

    build 出处中的 EnvelopeSignature 部分包含对用于对 build 出处进行签名的密钥的引用。密钥以以下格式之一存储:

    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 存储桶中。

    使用 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

后续步骤