構建證明

構建證明描述了映象的構建方式及其包含的內容。證明由 BuildKit 在構建時建立,並作為元資料附加到最終映象。

證明的目的是使檢查映象成為可能,檢視它的來源、建立者、建立方式以及包含的內容。這使您能夠就映象如何影響應用程式的供應鏈安全做出明智的決策。它還允許使用策略引擎根據您定義的策略規則驗證映象。

提供兩種型別的構建證明

  • 軟體物料清單 (SBOM):映象包含的或用於構建映象的軟體工件列表。
  • 來源證明:映象的構建方式。

證明的目的

開源和第三方軟體包的使用比以往任何時候都更廣泛。開發者共享和重用程式碼,因為它有助於提高生產力,讓團隊更快地建立更好的產品。

在未審查的情況下匯入和使用他處建立的程式碼會帶來嚴重的安全風險。即使您審查了所使用的軟體,新的零日漏洞也經常被發現,需要開發團隊採取行動進行修復。

構建證明使檢視映象內容及其來源變得更容易。使用證明來分析和決定是否使用映象,或檢視您已使用的映象是否存在漏洞。

建立證明

使用 docker buildx build 構建映象時,您可以使用 --provenance--sbom 選項向生成的映象新增證明記錄。您可以選擇新增 SBOM 或來源證明型別,或兩者都新增。

$ docker buildx build --sbom=true --provenance=true .

注意

預設映象儲存不支援證明。如果您使用預設映象儲存並使用預設的 docker 驅動程式構建映象,或使用帶有 --load 標誌的不同驅動程式,則證明將丟失。

為確保證明得以保留,您可以

  • 使用帶有 --push 標誌的 docker-container 驅動程式直接將映象推送到倉庫。
  • 啟用containerd 映象儲存

注意

來源證明預設啟用,選項為 mode=min。您可以使用 --provenance=false 標誌或設定 BUILDX_NO_DEFAULT_ATTESTATIONS 環境變數來停用來源證明。

預設情況下,使用 --provenance=true 標誌會附加選項為 mode=max 的來源證明。有關詳細資訊,請參閱來源證明

BuildKit 在構建映象時生成證明。證明記錄採用 in-toto JSON 格式包裝,並作為最終映象清單的一部分附加到映象索引中。

儲存

BuildKit 根據 Linux Foundation 支援的標準 in-toto 框架 中定義的in-toto 格式 生成證明。

證明作為映象索引中的清單附加到映象。證明的資料記錄以 JSON blobs 形式儲存。

由於證明作為清單附加到映象,這意味著您無需拉取整個映象即可檢查倉庫中任何映象的證明。

所有 BuildKit 匯出器都支援證明。localtar 無法將證明儲存到映象清單中,因為它們輸出的是檔案目錄或 tarball,而不是映象。相反,這些匯出器會將證明寫入匯出根目錄中的一個或多個 JSON 檔案。

示例

以下示例顯示了 SBOM 證明的 in-toto JSON 表示(已截斷)。

{
  "_type": "https://in-toto.io/Statement/v0.1",
  "predicateType": "https://spdx.dev/Document",
  "subject": [
    {
      "name": "pkg:docker/<registry>/<image>@<tag/digest>?platform=<platform>",
      "digest": {
        "sha256": "e8275b2b76280af67e26f068e5d585eb905f8dfd2f1918b3229db98133cb4862"
      }
    }
  ],
  "predicate": {
    "SPDXID": "SPDXRef-DOCUMENT",
    "creationInfo": {
      "created": "2022-12-15T11:47:54.546747383Z",
      "creators": ["Organization: Anchore, Inc", "Tool: syft-v0.60.3"],
      "licenseListVersion": "3.18"
    },
    "dataLicense": "CC0-1.0",
    "documentNamespace": "https://anchore.com/syft/dir/run/src/core-da0f600b-7f0a-4de0-8432-f83703e6bc4f",
    "name": "/run/src/core",
    // list of files that the image contains, e.g.:
    "files": [
      {
        "SPDXID": "SPDXRef-1ac501c94e2f9f81",
        "comment": "layerID: sha256:9b18e9b68314027565b90ff6189d65942c0f7986da80df008b8431276885218e",
        "fileName": "/bin/busybox",
        "licenseConcluded": "NOASSERTION"
      }
    ],
    // list of packages that were identified for this image:
    "packages": [
      {
        "name": "busybox",
        "originator": "Person: Sören Tempel <soeren+alpine@soeren-tempel.net>",
        "sourceInfo": "acquired package info from APK DB: lib/apk/db/installed",
        "versionInfo": "1.35.0-r17",
        "SPDXID": "SPDXRef-980737451f148c56",
        "description": "Size optimized toolbox of many common UNIX utilities",
        "downloadLocation": "https://busybox.net/",
        "licenseConcluded": "GPL-2.0-only",
        "licenseDeclared": "GPL-2.0-only"
        // ...
      }
    ],
    // files-packages relationship
    "relationships": [
      {
        "relatedSpdxElement": "SPDXRef-1ac501c94e2f9f81",
        "relationshipType": "CONTAINS",
        "spdxElementId": "SPDXRef-980737451f148c56"
      },
      ...
    ],
    "spdxVersion": "SPDX-2.2"
  }
}

要深入瞭解證明的儲存細節,請參閱映象證明儲存 (BuildKit)

證明清單格式

證明作為清單儲存,由映象的索引引用。每個證明清單引用一個映象清單(映象的一個平臺變體)。證明清單包含一個單獨的層,即證明的“值”。

以下示例顯示了證明清單的結構

{
  "schemaVersion": 2,
  "mediaType": "application/vnd.oci.image.manifest.v1+json",
  "config": {
    "mediaType": "application/vnd.oci.image.config.v1+json",
    "size": 167,
    "digest": "sha256:916d7437a36dd0e258e64d9c5a373ca5c9618eeb1555e79bd82066e593f9afae"
  },
  "layers": [
    {
      "mediaType": "application/vnd.in-toto+json",
      "size": 1833349,
      "digest": "sha256:3138024b98ed5aa8e3008285a458cd25a987202f2500ce1a9d07d8e1420f5491",
      "annotations": {
        "in-toto.io/predicate-type": "https://spdx.dev/Document"
      }
    }
  ]
}

作為 OCI 工件的證明

您可以使用 imageregistry 匯出器的 oci-artifact 選項 配置證明清單的格式。如果設定為 true,證明清單的結構將按如下方式更改

  • 證明清單中添加了 artifactType 欄位,其值為 application/vnd.docker.attestation.manifest.v1+json
  • config 欄位是一個空描述符,而不是“dummy”配置。
  • 還添加了 subject 欄位,指向證明引用的映象清單。

以下示例顯示了採用 OCI 工件格式的證明

{
  "schemaVersion": 2,
  "mediaType": "application/vnd.oci.image.manifest.v1+json",
  "artifactType": "application/vnd.docker.attestation.manifest.v1+json",
  "config": {
    "mediaType": "application/vnd.oci.empty.v1+json",
    "size": 2,
    "digest": "sha256:44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a",
    "data": "e30="
  },
  "layers": [
    {
      "mediaType": "application/vnd.in-toto+json",
      "size": 2208,
      "digest": "sha256:6d2f2c714a6bee3cf9e4d3cb9a966b629efea2dd8556ed81f19bd597b3325286",
      "annotations": {
        "in-toto.io/predicate-type": "https://slsa.dev/provenance/v0.2"
      }
    }
  ],
  "subject": {
    "mediaType": "application/vnd.oci.image.manifest.v1+json",
    "size": 1054,
    "digest": "sha256:bc2046336420a2852ecf915786c20f73c4c1b50d7803aae1fd30c971a7d1cead",
    "platform": {
      "architecture": "amd64",
      "os": "linux"
    }
  }
}

下一步

瞭解有關可用證明型別及其使用方法的更多資訊

頁面選項