使用 GitHub Actions 新增 SBOM 和來源證明

軟體物料清單 (SBOM) 和來源證明會新增關於映像檔內容及其建置方式的詮釋資料。

版本 4 和更新版本的docker/build-push-action支援證明。

預設來源

docker/build-push-action GitHub Action 會自動將來源證明新增至您的映像檔,條件如下:

  • 如果 GitHub 儲存庫是公開的,則會自動將具有mode=max的來源證明新增至映像檔。
  • 如果 GitHub 儲存庫是私有的,則會自動將具有mode=min的來源證明新增至映像檔。
  • 如果您使用的是docker 匯出器,或者您使用 load: true 將建置結果載入至執行器,則不會將任何證明新增至映像檔。這些輸出格式不支援證明。

警告

如果您使用docker/build-push-action為公開 GitHub 儲存庫中的程式碼建置映像檔,則預設附加至映像檔的來源證明會包含建置引數的值。如果您濫用建置引數將密碼傳遞至建置,例如使用者憑證或驗證權杖,則這些密碼會在來源證明中公開。請重構您的建置,改用密碼掛載來傳遞這些密碼。也請記住要輪替您可能已公開的任何密碼。

最大程度來源

建議您使用最大程度的來源證明來建置映像檔。私有儲存庫預設只會新增最小程度的來源,但您可以透過將docker/build-push-action GitHub Action 上的provenance 輸入設定為mode=max來手動覆蓋來源程度。

請注意,將證明新增至映像檔表示您必須將映像檔直接推送至登錄檔,而不是將映像檔載入至執行器的本機映像檔存放區。這是因為本機映像檔存放區不支援載入具有證明的映像檔。

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 證明,請將docker/build-push-actionsbom輸入設定為 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 }}