映像證明儲存
Buildkit 支援建立建置證明並將其附加至建置產物。這些證明能提供來自建置過程的寶貴資訊,包括但不限於:SBOM、SLSA 溯源 (Provenance)、建置日誌等。
本文件說明目前用於儲存證明的自定義格式,其設計旨在與現今的登錄 (registry) 實作相容。未來我們可能會支援匯出更多格式的證明。
證明儲存為映像檔索引 (image index) 中的清單物件,風格類似於 OCI 產物。
屬性
證明清單 (Attestation Manifest)
證明清單會附加至根映像檔索引物件,位於一個獨立的 OCI 映像檔清單之下。每個證明清單可包含多個證明 blob,且清單中的所有證明皆適用於單一平台清單。標準 OCI 和 Docker 清單的所有屬性皆持續適用。
映像檔 config 描述元將指向一個有效的映像檔配置;不過,它不會包含證明相關的詳細資訊,且應被忽略,因為它僅為了相容性目的而包含。
layers 中的每個映像檔層都將包含一個針對單一證明 blob 的描述元。每個層的 mediaType 將根據其內容設定,以下為其中之一:
application/vnd.in-toto+json(目前唯一支援的選項)表示一個 in-toto 證明 blob
任何未知的 mediaType 都應被忽略。
為了協助證明遍歷,可以在每個層描述元上設定以下註解 (annotations):
in-toto.io/predicate-type如果包含的證明是 in-toto 證明(目前唯一支援的選項),則會設定此註解。該註解的值將設定為與證明內部存在的
predicateType屬性相同。當此註解存在時,可用於尋找特定的證明,以避免拉取其他不需要的內容。
證明 Blob
每個層的內容將是一個取決於其 mediaType 的 blob。
application/vnd.in-toto+jsonblob 內容將包含一個完整的 in-toto 證明陳述 (statement)
{ "_type": "https://in-toto.io/Statement/v0.1", "subject": [ { "name": "<NAME>", "digest": {"<ALGORITHM>": "<HEX_VALUE>"} }, ... ], "predicateType": "<URI>", "predicate": { ... } }該證明的 subject 應設定為與證明清單描述元中所描述的目標清單相同的摘要 (digest),或是其中的某個物件。
證明清單描述元 (Attestation Manifest Descriptor)
證明清單會附加至根映像檔索引,位於 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)
此證明清單包含一個證明,即一個包含 "https://spdx.dev/Document" 謂詞 (predicate) 的 in-toto 證明,表示它為該映像檔定義了一個 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)
包含 SBOM 資料的證明主體,以 SPDX 格式列出建置期間使用的軟體套件。
{
"_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",
...