镜像证明存储
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+jsonblob 内容将包含完整的 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",
...