Skip to content
Research Lab
CI/CDBuild, attest, deploy7 min read

Signed supply chain on GitHub Actions, SLSA level 3

The shortest path to a defensible CI pipeline. Ephemeral runners, signed builds, SBOM and provenance, and an admission controller that refuses to run anything unsigned.

Why bother with SLSA

Most attacks on software supply chains are not exotic. A leaked publish token, a malicious dependency, a backdoored build script. SLSA is the framework that names the controls that close those paths.

Level 3 is the practical target. It requires hosted, ephemeral build runners, signed builds, and verifiable provenance. You can get there in a sprint with the tools below.

The pipeline

Pull requests trigger a workflow on GitHub Actions hosted runners. The job authenticates to your cloud through OIDC, with no long lived secrets. Cosign signs container images keylessly against the OIDC identity. Syft generates an SBOM in CycloneDX. in-toto attestations capture the provenance.

Signed images and attestations are pushed to your OCI registry. A Kyverno admission controller in every Kubernetes cluster verifies the signature and provenance before scheduling a pod.

Hardening

There are a few small choices that matter.

  • pin actions by sha, not tag
  • reusable workflows owned by platform, called by app teams
  • oidc trust scoped to repo and branch, not org
  • workflow tokens minimum permission, defaulted to read
  • sbom diff alerts on new transitive dependencies

Result

Production runs only images built by your pipeline, signed by your identity, with a provenance trail back to the commit. If an attacker pushes a tampered image to the registry, the cluster refuses it.

References

Official documentation and standards we draw on for this pattern.

Links open in a new tab

Takeaway

A signed supply chain is one of the highest leverage investments a platform team can make. Three weeks of work, years of pay off.

More from the lab

Related research.

Get started

Tell us where it hurts. We will tell you what good looks like.

A 30 minute call with a senior practitioner. No sales motion. Clear next step.