構建證明

構建證明描述了映象的構建方式及其包含的內容。證明在構建時由 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=min 的出處證明。有關更多詳細資訊,請參閱出處證明

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

儲存

BuildKit 按照 in-toto 框架(Linux 基金會支援的標準)中定義的 in-toto 格式生成證明。

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

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

所有 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 欄位是 空描述符,而不是“虛擬”配置。
  • 還添加了一個 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"
    }
  }
}

接下來做什麼

瞭解更多關於可用證明型別及其使用方法