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

软件物料清单 (SBOM) 和出处 证明添加有关图像内容及其构建方式的元数据。

版本 4 及更高版本支持证明 docker/build-push-action

默认出处

GitHub Actiondocker/build-push-action会自动向您的图像添加出处证明,但需满足以下条件:

  • 如果 GitHub 存储库是公共的,则出处证明mode=max 会自动添加到图像中。
  • 如果 GitHub 存储库是私有的,则出处证明mode=min 会自动添加到图像中。
  • 如果您使用的是 docker导出程序,或者您使用的是将构建结果加载到运行程序load: true,则不会将任何证明添加到图像中。这些输出格式不支持证明。

警告

如果您要docker/build-push-action在公共 GitHub 存储库中为代码构建图像,则默认情况下附加到图像的出处证明包含构建参数的值。如果您滥用构建参数将机密传递到构建,例如用户凭据或身份验证令牌,那么这些机密将在出处证明中公开。重构您的构建以使用秘密安装来传递这些秘密 。还要记住轮换您可能暴露的任何秘密。

最高等级出处

建议您使用最高级别的来源证明来构建映像。默认情况下,私有存储库仅添加最低级别的出处,但您可以通过将GitHub 操作provenance 上的输入设置为 来手动覆盖出处级别。docker/build-push-actionmode=max

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

name: ci

on:
  push:
    branches:
      - "main"

env:
  IMAGE_NAME: user/app

jobs:
  docker:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4

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

      - name: Login to Docker Hub
        uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}

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

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

SBOM

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

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

name: ci

on:
  push:
    branches:
      - "main"

env:
  IMAGE_NAME: user/app

jobs:
  docker:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4

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

      - name: Login to Docker Hub
        uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}

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

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