使用 GitHub Actions 添加 SBOM 和出处证明

软件物料清单(SBOM)和出处 证明为您的镜像添加了关于其内容以及构建方式的元数据。

Attestations 在 docker/build-push-action 的版本 4 及以上版本中受支持。

默认出处

docker/build-push-action GitHub Action 会自动为您的镜像添加 provenance 证明,条件如下:

  • 如果 GitHub 仓库是公开的,将自动向镜像添加 provenance 证明,其值为 mode=max
  • 如果 GitHub 仓库是私有的,将自动向镜像添加 provenance 证明,其值为 mode=min
  • 如果你使用的是 docker 导出器,或者 你使用 load: true 将构建结果加载到 runner 中,镜像不会添加任何 attestation。这些输出格式不支持 attestation。

警告

如果你使用 docker/build-push-action 为公共 GitHub 仓库中的代码构建镜像,默认附加到镜像的 provenance 证明中包含构建参数的值。如果你错误地使用构建参数将密钥传递给构建,例如用户凭据或身份验证令牌,这些密钥会在 provenance 证明中暴露。请重构你的构建,改用secret mounts传递这些密钥。同时请记得轮换你可能已经暴露的任何密钥。

最高级别的可追溯性

建议您使用最高级别的 provenance 证明构建镜像。默认情况下,私有仓库仅添加最低级别的 provenance,但您可以通过将 provenance 输入到 docker/build-push-action GitHub Action 设置为 mode=max 来手动覆盖 provenance 级别。

请注意,向镜像添加证明意味着您必须直接将镜像推送到注册表,而不是将其加载到运行程序的本地镜像存储中。这是因为本地镜像存储不支持加载带有证明的镜像。

name: ci

on:
  push:

env:
  IMAGE_NAME: user/app

jobs:
  docker:
    runs-on: ubuntu-latest
    steps:
      - name: Login to Docker Hub
        uses: docker/login-action@v3
        with:
          username: ${{ vars.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}
      
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      - name: Extract metadata
        id: meta
        uses: docker/metadata-action@v5
        with:
          images: ${{ env.IMAGE_NAME }}

      - name: Build and push image
        uses: docker/build-push-action@v6
        with:
          push: true
          provenance: mode=max
          tags: ${{ steps.meta.outputs.tags }}

物料清单(SBOM)

SBOM 证明不会自动添加到镜像中。要添加 SBOM 证明,请将 sbom 的输入设置为 docker/build-push-action 为 true。

请注意,向镜像添加证明意味着您必须直接将镜像推送到注册表,而不是将其加载到运行程序的本地镜像存储中。这是因为本地镜像存储不支持加载带有证明的镜像。

name: ci

on:
  push:

env:
  IMAGE_NAME: user/app

jobs:
  docker:
    runs-on: ubuntu-latest
    steps:
      - name: Login to Docker Hub
        uses: docker/login-action@v3
        with:
          username: ${{ vars.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      - name: Extract metadata
        id: meta
        uses: docker/metadata-action@v5
        with:
          images: ${{ env.IMAGE_NAME }}

      - name: Build and push image
        uses: docker/build-push-action@v6
        with:
          sbom: true
          push: true
          tags: ${{ steps.meta.outputs.tags }}