映像檔證明儲存體

Buildkit 支援建立證明並將其附加到建置成品。這些證明可以提供來自建置流程的寶貴資訊,包括但不限於:軟體物料清單 (SBOM)SLSA 出處屬性

證明資訊清單

證明資訊清單附加到根映像檔索引物件,位於個別的 OCI 映像檔資訊清單證明 Blob,資訊清單中的所有證明都適用於單一平台資訊清單。標準 OCI 和 Docker 資訊清單的所有屬性仍然適用。

映像檔 config 描述器將指向有效的 映像檔設定證明 Blob 的描述器。每個層的 mediaType 將根據其內容進行設定,其中之一為

  • application/vnd.in-toto+json(目前唯一支援的選項)

    表示 in-toto 證明 Blob

任何未知的 mediaType 都應予以忽略。

為了協助證明遍歷,可以在每個層描述器上設定以下註釋

  • in-toto.io/predicate-type

    如果封閉的證明是 in-toto 證明(目前唯一支援的選項),則將設定此註釋。該註釋將被設定為包含與證明內 predicateType 屬性相同的值。

    存在時,可以使用此註釋來查找他們正在尋找的特定證明,以避免提取其他證明的內容。

證明 Blob

每個層的內容將是一個取決於其 mediaType 的 Blob。

  • application/vnd.in-toto+json

    Blob 內容將包含完整的 in-toto 證明聲明

    {
      "_type": "https://in-toto.io/Statement/v0.1",
      "subject": [
        {
          "name": "<NAME>",
          "digest": {"<ALGORITHM>": "<HEX_VALUE>"}
        },
        ...
      ],
      "predicateType": "<URI>",
      "predicate": { ... }
    }

    證明的標的應設定為與證明資訊清單描述器中描述的目標資訊清單相同的摘要,或是其中的某些物件。

證明資訊清單描述器

證明資訊清單會附加到根映像檔索引 中的 `manifests` 鍵值,位於所有原始可執行資訊清單之後。標準 OCI 和 Docker 資訊清單描述器的所有屬性仍然適用。

為了防止容器執行階段意外提取或執行資訊清單中描述的映像檔,證明資訊清單的 `platform` 屬性將設定為 `unknown/unknown`,如下所示:

"platform": {
  "architecture": "unknown",
  "os": "unknown"
}

為了協助索引遍歷,資訊清單描述器上將設定以下註釋:

  • vnd.docker.reference.type

    此註釋描述了構件的類型,並將設定為 `attestation-manifest`。如果指定了任何其他值,則應忽略整個資訊清單。

  • vnd.docker.reference.digest

    此註釋將包含映像檔索引中證明資訊清單所參考物件的摘要。

    存在時,此註釋可用於查找所選映像檔資訊清單的相符證明資訊清單。

範例

範例顯示附加到 `linux/amd64` 映像檔的 SBOM 證明:

映像檔索引 (sha256:94acc2ca70c40f3f6291681f37ce9c767e3d251ce01c7e4e9b98ccf148c26260)

此映像檔索引定義了兩個描述器:一個 AMD64 映像檔 sha256:23678f31.. 和該映像檔的證明資訊清單 sha256:02cb9aa7..

{
  "mediaType": "application/vnd.oci.image.index.v1+json",
  "schemaVersion": 2,
  "manifests": [
    {
      "mediaType": "application/vnd.oci.image.manifest.v1+json",
      "digest": "sha256:23678f31b3b3586c4fb318aecfe64a96a1f0916ba8faf9b2be2abee63fa9e827",
      "size": 1234,
      "platform": {
        "architecture": "amd64",
        "os": "linux"
      }
    },
    {
      "mediaType": "application/vnd.oci.image.manifest.v1+json",
      "digest": "sha256:02cb9aa7600e73fcf41ee9f0f19cc03122b2d8be43d41ce4b21335118f5dd943",
      "size": 1234,
      "annotations": {
        "vnd.docker.reference.digest": "sha256:23678f31b3b3586c4fb318aecfe64a96a1f0916ba8faf9b2be2abee63fa9e827",
        "vnd.docker.reference.type": "attestation-manifest"
      },
      "platform": {
         "architecture": "unknown",
         "os": "unknown"
      }
    }
  ]
}

證明資訊清單 (sha256:02cb9aa7600e73fcf41ee9f0f19cc03122b2d8be43d41ce4b21335118f5dd943)

此證明資訊清單包含一個證明,該證明是一個 in-toto 證明,其中包含一個「https://spdx.dev/Document」謂詞,表示它正在為映像檔定義 SBOM。

{
  "mediaType": "application/vnd.oci.image.manifest.v1+json",
  "schemaVersion": 2,
  "config": {
    "mediaType": "application/vnd.oci.image.config.v1+json",
    "digest": "sha256:a781560066f20ec9c28f2115a95a886e5e71c7c7aa9d8fd680678498b82f3ea3",
    "size": 123
  },
  "layers": [
    {
      "mediaType": "application/vnd.in-toto+json",
      "digest": "sha256:133ae3f9bcc385295b66c2d83b28c25a9f294ce20954d5cf922dda860429734a",
      "size": 1234,
      "annotations": {
        "in-toto.io/predicate-type": "https://spdx.dev/Document"
      }
    }
  ]
}

映像檔設定 (sha256:a781560066f20ec9c28f2115a95a886e5e71c7c7aa9d8fd680678498b82f3ea3)

{
  "architecture": "unknown",
  "os": "unknown",
  "config": {},
  "rootfs": {
    "type": "layers",
    "diff_ids": [
      "sha256:133ae3f9bcc385295b66c2d83b28c25a9f294ce20954d5cf922dda860429734a"
    ]
  }
}

層內容 (sha256:1ea07d5e55eb47ad0e6bbfa2ec180fb580974411e623814e519064c88f022f5c)

證明主體,其中包含以 SPDX 格式列出建置期間使用的套件的 SBOM 資料。

{
  "_type": "https://in-toto.io/Statement/v0.1",
  "predicateType": "https://spdx.dev/Document",
  "subject": [
    {
      "name": "_",
      "digest": {
        "sha256": "23678f31b3b3586c4fb318aecfe64a96a1f0916ba8faf9b2be2abee63fa9e827"
      }
    }
  ],
  "predicate": {
    "SPDXID": "SPDXRef-DOCUMENT",
    "spdxVersion": "SPDX-2.2",
    ...