构建证明

构建证明描述了镜像的构建方式及其包含的内容。这些证明在构建时由 BuildKit 创建,并作为元数据附加到最终镜像上。

证明的目的在于使我们能够检查镜像,了解其来源、创建者及其创建方式,以及其中包含的内容。这使您能够就镜像对应用程序供应链安全的影响做出明智的决策。它还允许使用策略引擎根据您定义的策略规则来验证镜像。

可用两种类型的构建注解:

  • 软件物料清单(SBOM):列出镜像包含的软件制品,或用于构建镜像的软件制品。
  • 来源:镜像是如何构建的。

认证的目的

开源和第三方包的使用比以往任何时候都更加广泛。 开发人员共享和重用代码,因为这有助于提高生产力,使团队能够更快地创建更好的产品。

在未审核的情况下导入并使用其他地方创建的代码会带来严重的安全风险。即使您确实审查了所使用的软件,新的零日漏洞也经常被发现,要求开发团队采取行动进行修复。

构建证明使您更容易查看镜像的内容及其来源。使用证明来分析并决定是否使用某个镜像,或查看您正在使用的镜像是否暴露于漏洞之中。

创建证明

当你使用 docker buildx build 构建镜像时,可以使用 --provenance--sbom 选项向生成的镜像添加 attestation 记录。 你可以选择添加 SBOM 或 provenance 类型的 attestation,或两者都添加。

$ docker buildx build --sbom=true --provenance=true .

注意

默认的镜像存储不支持证明。如果您使用默认的镜像存储,并使用默认的 docker 驱动程序构建镜像, 或者使用不同的驱动程序并带有 --load 标志,证明将会丢失。

为了确保证明被保留,您可以:

  • 使用带有 --push 标志的 docker-container 驱动程序将镜像直接推送到注册表。
  • 启用 containerd 镜像存储

注意

默认情况下,出处证明是启用的,使用 mode=min 选项。 您可以使用 --provenance=false 标志禁用出处证明, 或者通过设置 BUILDX_NO_DEFAULT_ATTESTATIONS 环境变量。

使用 --provenance=true 标志会默认使用 mode=max 附加出处证明。详见 出处证明 以获取更多详情。

BuildKit 在构建镜像时生成证明。证明记录采用 in-toto JSON 格式封装,并附加到最终镜像的索引清单中。

存储

BuildKit 以 in-toto 格式, 如 in-toto 框架所定义, 这是一个由 Linux 基金会支持的标准。

断言作为清单附加到镜像索引中的镜像上。断言的数据记录以JSON blob的形式存储。

因为 attestation 作为清单附加到镜像上,这意味着您可以在不拉取整个镜像的情况下检查注册表中任何镜像的 attestation。

所有 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)

接下来是什么

了解可用的证明类型及其使用方法: