Mais 123% CVE comunicadas por dia em 2026 do que no ano passado.

SBOM

Como gerar uma SBOM no GitHub Actions

Há quatro formas de obter uma SBOM de um pipeline de GitHub Actions, e descrevem coisas diferentes: o repositório, os ficheiros em disco, uma cópia assinada de qualquer um deles ou aquilo que o build realmente obteve. Escolha conforme o que precisa que a SBOM prove. Cada abordagem abaixo vem com o YAML ou os comandos para a executar.

Atualizado a

Quatro abordagens

Em setembro de 2026.
Funcionalidade Abordagem O que a SBOM descreve Esforço
Exportação do grafo de dependências Grafo do GitHub Os manifestos e lockfiles do repositório, no branch predefinido Nenhum
Passo de geração Syft, Trivy, cdxgen Os ficheiros ou a imagem que tem à frente quando o passo é executado Um passo por job
Atestação actions/attest A SBOM que lhe for passada, assinada e ligada a um artefacto Um passo após a geração
Registo durante o build CRACI O que o job obteve durante a execução, com um estado de completude Alterar runs-on

1. Exportar o grafo de dependências

O GitHub constrói um grafo de dependências a partir dos manifestos e lockfiles de um repositório e consegue exportá-lo como SBOM SPDX. Não exige alterações ao workflow: abra o separador Insights do repositório, escolha Dependency graph e clique em Export SBOM. Descreve o repositório no branch predefinido, não um build em particular, pelo que as ferramentas e os pacotes que um workflow instala não constam dele.

Para o automatizar, use a REST API. GET /repos/{owner}/{repo}/dependency-graph/sbom devolve o SPDX JSON numa só chamada, mas o GitHub vai descontinuar este endpoint depois de 13 de novembro de 2026. A substituição é assíncrona: peça um relatório e depois obtenha o sbom_url que este devolve. Esse URL responde 202 enquanto a SBOM está a ser gerada e depois redireciona para o ficheiro SPDX JSON, que o GitHub guarda até uma semana.

# Export the dependency graph as SPDX JSON (closing down after November 13, 2026)
curl -L \
  -H "Accept: application/vnd.github+json" \
  -H "Authorization: Bearer $GITHUB_TOKEN" \
  -H "X-GitHub-Api-Version: 2026-03-10" \
  https://api.github.com/repos/OWNER/REPO/dependency-graph/sbom

# The replacement: request a report; the response carries an sbom_url
curl -L \
  -H "Accept: application/vnd.github+json" \
  -H "Authorization: Bearer $GITHUB_TOKEN" \
  -H "X-GitHub-Api-Version: 2026-03-10" \
  https://api.github.com/repos/OWNER/REPO/dependency-graph/sbom/generate-report

2. Adicionar um passo de geração

Um passo do workflow executa um gerador sobre o espaço de trabalho ou uma imagem. anchore/sbom-action executa o Syft: por defeito analisa o diretório do espaço de trabalho e produz SPDX JSON, pode analisar uma imagem de contentor em vez disso, e carrega a SBOM como artefacto do workflow e anexa-a às versões. O seu README pede contents: write, mais actions: read quando anexa a SBOM a uma versão:

name: sbom
on:
  push:
    branches: [main]
  release:
    types: [published]

jobs:
  sbom:
    runs-on: ubuntu-latest
    permissions:
      contents: write # upload the SBOM
      actions: read # attach it to a release
    steps:
      - uses: actions/checkout@v7
      - uses: actions/setup-node@v7
        with:
          node-version: 24
      - run: npm ci
      # Scan the workspace after the install step
      - uses: anchore/sbom-action@v0
        with:
          path: .
          format: cyclonedx-json

format aceita spdx, spdx-json, cyclonedx ou cyclonedx-json. Para analisar uma imagem, substitua path por image, por exemplo image: ghcr.io/OWNER/app:1.0. Consulte SBOM de imagens Docker para as SBOM de imagem do próprio BuildKit.

O Trivy e o cdxgen podem ser executados da mesma forma, como passos run simples. O cdxgen escreve CycloneDX; desde a versão 13, o seu pacote npm é @cdxgen/cdxgen:

    steps:
      - uses: actions/checkout@v7
      - run: npm ci
      - run: npm install -g @cdxgen/cdxgen --ignore-scripts
      - run: cdxgen -o bom.json .
      - uses: actions/upload-artifact@v7
        with:
          name: sbom
          path: bom.json

O momento importa. Execute o passo depois de as dependências serem instaladas, ou não as verá. Mesmo assim, um gerador vê os ficheiros que tem à frente: um pacote que um script descarregou, usou e apagou, ou uma ferramenta instalada fora de um gestor de pacotes, podem faltar.

3. Assinar como atestação

As atestações de artefactos do GitHub ligam uma SBOM ao artefacto que descreve e assinam-na com o Sigstore. actions/attest@v4 aceita SPDX ou CycloneDX JSON através de sbom-path, até 16 MB. Sem sbom-path, produz antes proveniência de build SLSA. actions/attest-sbom está a ser descontinuada em favor de actions/attest, que agora encapsula. O job precisa de id-token: write para obter um certificado de assinatura e de attestations: write para guardar o resultado:

jobs:
  build:
    runs-on: ubuntu-latest
    permissions:
      id-token: write # sign with a Sigstore certificate
      contents: read
      attestations: write # store the attestation
    steps:
      - uses: actions/checkout@v7
      - run: make build # writes dist/my-app
      - uses: anchore/sbom-action@v0
        with:
          path: .
          format: spdx-json
          output-file: sbom.spdx.json
          upload-artifact: false
      - uses: actions/attest@v4
        with:
          subject-path: dist/my-app
          sbom-path: sbom.spdx.json

Para uma imagem de contentor, passe subject-name e subject-digest em vez de subject-path, defina push-to-registry: true e acrescente packages: write. As atestações de artefactos funcionam em repositórios públicos em todos os planos atuais do GitHub; os repositórios privados e internos precisam do GitHub Enterprise Cloud.

A GitHub CLI verifica depois quem produziu a SBOM e para que artefacto. As atestações de SBOM precisam de --predicate-type; acrescente --format json para ver a própria SBOM. Para uma imagem, use oci:// seguido do nome da imagem em vez do caminho do ficheiro.

gh attestation verify dist/my-app \
  -R OWNER/REPO \
  --predicate-type https://spdx.dev/Document/v2.3

Uma atestação prova quem produziu a SBOM e para que artefacto. Não torna a SBOM mais completa.

4. Registar durante o build

O CRACI regista a SBOM enquanto o job é executado. Altera runs-on para craci:

jobs:
  build:
    runs-on: craci # was: ubuntu-latest

Um proxy que reconhece pacotes no runner regista então cada pacote que o job obteve, incluindo pacotes restaurados de caches de CI e dependências ocultas que nenhum lockfile lista, como código descarregado por scripts de instalação. Não há nenhum passo de geração para posicionar, pelo que a questão do momento desaparece. Cada SBOM, em CycloneDX ou SPDX, indica a sua completude por job e por cache, e a API devolve SBOM, traços de rede e proveniência. A configuração, incluindo a GitHub App do CRACI e as definições de rede, está na documentação do CRACI, e o significado de cada estado de completude está em completude da SBOM de jobs e caches.

Qual usar

  • Um inventário rápido de um repositório: a exportação do grafo de dependências.
  • Uma SBOM de uma imagem de contentor: um passo de geração sobre a imagem.
  • Prova de quem produziu uma SBOM e para que artefacto: uma atestação, sobre qualquer uma das anteriores.
  • Um registo do que o build realmente usou, para a resposta a vulnerabilidades ou para o Cyber Resilience Act: registo durante o build. Consulte ferramentas de SBOM comparadas.

SBOM no GitHub Actions: perguntas frequentes

Como gero uma SBOM no GitHub Actions?

Acrescente um passo de geração depois do passo de instalação. O mais curto é anchore/sbom-action@v0, que executa o Syft sobre o espaço de trabalho e carrega uma SBOM SPDX JSON como artefacto do workflow. Para uma SBOM assinada, passe o ficheiro a actions/attest@v4 com sbom-path.

O GitHub gera uma SBOM automaticamente?

O GitHub consegue exportar o grafo de dependências de um repositório como SBOM SPDX, a partir do separador Insights ou da REST API. Descreve os manifestos e lockfiles do repositório, não um build em particular, pelo que não mostra ferramentas nem pacotes que um workflow descarrega.

Que action gera uma SBOM no GitHub Actions?

anchore/sbom-action executa o Syft. Por defeito, analisa o diretório do espaço de trabalho e produz SPDX JSON; pode analisar uma imagem de contentor em vez disso, carrega a SBOM como artefacto do workflow e anexa-a às versões.

De que permissões precisa um workflow de SBOM?

anchore/sbom-action pede contents: write, mais actions: read para anexar a SBOM a uma versão. A assinatura com actions/attest precisa de id-token: write e attestations: write, e de packages: write quando a atestação é enviada para um registo de contentores.

Como assino uma SBOM no GitHub Actions?

Use as atestações de artefactos do GitHub. actions/attest assina uma SBOM SPDX ou CycloneDX JSON com o Sigstore e liga-a a um artefacto; verifique-a com gh attestation verify. actions/attest-sbom está a ser descontinuada em favor de actions/attest, que agora encapsula.

Como gero uma SBOM para uma imagem de contentor no GitHub Actions?

Passe a imagem a anchore/sbom-action com a entrada image em vez de path. Para a assinar, dê a actions/attest o nome e o digest da imagem através de subject-name e subject-digest, defina push-to-registry: true e verifique com gh attestation verify oci://IMAGE.

O workflow deve produzir SPDX ou CycloneDX?

O que a ferramenta que lê a SBOM espera. A exportação do grafo de dependências é apenas SPDX e o cdxgen escreve CycloneDX. anchore/sbom-action escreve qualquer um deles, e actions/attest aceita qualquer um. Consulte CycloneDX vs SPDX.

O passo de SBOM deve ser executado antes ou depois do build?

Depois de as dependências serem instaladas, ou não as verá. Mesmo assim, vê o que está em disco, não o que o job descarregou e removeu, nem o que um script obteve. Registar durante o build evita a questão do momento.

Registe uma SBOM de um dos seus builds

Altere runs-on num job, execute-o no CRACI e compare a SBOM registada com a que o seu passo atual produz.

Marcar demo