Uma supply chain de Docker prática: assinada, escaneada, atestada
6 de maio de 2026 · 2 min de leitura · por Sudhanshu K.
«Minha imagem passa no scan» não é uma supply chain. Supply chain é linhagem comprovável do commit fonte até o container rodando. Este é o mínimo que entregamos para cada cliente.
Os quatro artefatos
Para cada imagem que construímos, produzimos:
- A imagem em si, tagueada de forma imutável (SHA do commit, não
latest) - Um SBOM (Software Bill of Materials) em formato SPDX ou CycloneDX
- Um relatório de scan de vulnerabilidades (Trivy ou Grype)
- Uma assinatura (Cosign) sobre o digest + uma atestação assinada ligando imagem ao SBOM + scan + commit
Tudo isso é publicado junto à imagem no registry sob as relações OCI padrão.
Pipeline de build
No GitHub Actions:
- run: docker buildx build --output type=registry,name=${IMG} .
- run: syft ${IMG} -o cyclonedx-json > sbom.json
- run: trivy image --format json ${IMG} > scan.json
- run: cosign sign --yes ${IMG}
- run: cosign attest --predicate sbom.json --type cyclonedx --yes ${IMG}
- run: cosign attest --predicate scan.json --type vuln --yes ${IMG}Assinatura keyless via Fulcio + Rekor significa que a identidade assinante é o token OIDC do GitHub Actions. Nenhuma chave de longa duração para rotacionar.
Política de admissão
O cluster Kubernetes roda Kyverno (ou OPA Gatekeeper) com uma política que recusa qualquer pod cuja imagem:
- Não esteja assinada por uma identidade esperada (a workload identity do pipeline de build)
- Tenha alguma CVE crítica na atestação de scan com mais de 7 dias
- Não tenha atestação de SBOM nenhuma
Isso significa que um desenvolvedor não consegue empurrar uma imagem não assinada para produção mesmo com permissões kubectl apply. O cluster rejeitará o pod antes de escaloná-lo.
O que monitoramos
- Novas CVEs que afetam imagens já implantadas (a base do Trivy atualiza diariamente; re-escaneamos no lugar)
- Imagens em produção que não foram reconstruídas há N dias
- Falhas de verificação de assinatura (alertas para PagerDuty)
- Drift entre o SBOM no momento do build e o que de fato roda (geralmente um
apt installinfiltrado)
O post completo no Medium tem as políticas Kyverno literais, o setup do Cosign keyless, e o dashboard que usamos para acompanhar a cobertura de assinaturas em toda a frota.
Full article available
Read the full article