映象證明儲存
Buildkit 支援建立證明並將其附加到構建工件。這些證明可以提供構建過程中的寶貴資訊,包括但不限於:SBOM、SLSA 出處、構建日誌等。
本文件描述了用於儲存證明的當前自定義格式,該格式旨在與當前的登錄檔實現相容。將來,我們可能會支援以其他格式匯出證明。
證明以清單物件的形式儲存在映象索引中,其風格類似於 OCI 工件。
屬性
證明清單
證明清單附加到根映象索引物件,在單獨的 OCI 映象清單 下。每個證明清單可以包含多個證明 blob,清單中的所有證明都適用於單個平臺清單。標準 OCI 和 Docker 清單的所有屬性仍然適用。
映象 `config` 描述符將指向有效的 映象配置,但是,它不包含證明特定詳細資訊,應被忽略,因為它僅為相容性目的而包含。
`layers` 中的每個映象層將包含單個證明 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`)
證明主體包含 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",
...