使用 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-action
mode=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 }}