建置證明

建置證明描述映像檔的建置方式及其內容。證明由 BuildKit 在建置時建立,並以中繼資料的形式附加到最終映像檔。

證明的目的是讓您可以檢查映像檔並查看其來源、建立者和方式,以及其內容。這讓您可以就映像檔如何影響應用程式的供應鏈安全性做出明智的決策。它還允許使用策略引擎根據您定義的策略規則驗證映像檔。

提供兩種建置註釋類型

  • 軟體物料清單 (SBOM):映像檔包含或用於建置映像檔的軟體構件清單。
  • 來源:映像檔的建置方式。

證明的目的

開放原始碼和第三方套件的使用比以往任何時候都更加普遍。開發人員共享和重複使用程式碼,因為它有助於提高生產力,讓團隊能夠更快地創造更好的產品。

導入和使用未經審查的其他地方建立的程式碼會帶來嚴重的安全風險。即使您確實審查了您使用的軟體,也經常會發現新的零時差漏洞,需要開發團隊採取行動來修復它們。

建置證明可以更容易地查看映像檔的內容及其來源。使用證明來分析和決定是否使用映像檔,或查看您正在使用的映像檔是否暴露於漏洞中。

建立證明

使用 docker buildx build 建置映像檔時,您可以使用 --provenance--sbom 選項將證明記錄新增到產生的映像檔中。您可以選擇新增 SBOM 或來源證明類型,或兩者都新增。

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

注意

預設映像檔存放區不支援證明。如果您使用預設映像檔存放區,並使用預設 docker 驅動程式或使用帶有 --load 旗標的其他驅動程式建置映像檔,則證明將會遺失。

為了確保證明被保留,您可以

注意

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

使用 --provenance=true 旗標會預設以 mode=max 附加來源證明。詳情請參閱 來源證明

BuildKit 在建置映像檔時會產生證明。證明記錄以 in-toto JSON 格式包裝,並附加到最終映像檔資訊清單中的映像檔索引。

儲存

BuildKit 產生的證明採用 in-toto 格式,由 in-toto 架構(Linux 基金會支援的標準)所定義。

證明以資訊清單的形式附加到映像檔。證明的資料記錄儲存為 JSON Blob。

由於證明以資訊清單的形式附加到映像檔,這表示您可以檢查登錄檔中任何映像檔的證明,而無需提取整個映像檔。

所有 BuildKit 匯出器都支援證明。 localtar 無法將證明儲存到映像檔資訊清單中,因為它輸出的是檔案目錄或壓縮檔,而不是映像檔。相反,這些匯出器會將證明寫入到匯出根目錄中的一個或多個 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)

後續步驟

深入了解可用的證明類型以及如何使用它們