A live demo showing how to make a software supply chain provable — signing, attestation, and SLSA provenance — for teams that have to answer to auditors.
The story in one line: move from "trust us" to "verify it yourself", and make the deploy pipeline refuse to run anything that can't prove where it came from.
- Docker running
cosignv3.x (the CLI changed at v3 — v2-era blog syntax will fail),syft,jq- For the CI act: this repo pushed to GitHub with Actions enabled
demo/00-setup.sh # before the audience arrives: registry + keypair
demo/01-unprovable.sh # Act 1: ship an artifact the usual way; the auditor's 4 questions
demo/02-sign-and-tamper.sh # Act 2: sign, verify, Rekor; tamper → verification fails
demo/03-attest-sbom.sh # Act 3a: SBOM as a *signed attestation* bound to the digest
# Act 3b: switch to the browser — GitHub Actions run of release.yml
demo/04-deploy-gate.sh # Act 4: deploy gate; unsigned image is blocked (fail closed)
demo/99-reset.sh # re-arm for the next run (--full for a clean slate)Set DEMO_NONINTERACTIVE=1 to rehearse without the "press enter" pauses.
Open the latest release workflow run. Show:
- Keyless signing —
cosign signwith no key anywhere. The workflow's OIDC identity (repo,ref,workflow) goes into a short-lived certificate from Fulcio. Nothing to leak, rotate, or offboard. - SLSA provenance —
actions/attest-build-provenanceemits a statement signed by the build platform: source commit, builder, build parameters. The developer never touches it — that's the point. - The deploy-gate job — verifies the signature identity (only images
signed by this repo's workflow pass) and the provenance
(
gh attestation verify) before the deploy step is reachable.
One-command verification an auditor could run themselves:
gh attestation verify oci://ghcr.io/spiculedata/sigstore-demo:latest --owner spiculedataAnd the public evidence trail: search the digest at https://search.sigstore.dev.
| Level | Requirement (short form) | Where the demo shows it |
|---|---|---|
| L1 | Provenance exists | provenance JSON in the workflow run |
| L2 | Provenance is signed by a hosted build platform | attest-build-provenance + gh attestation verify |
| L3 | Hardened builder; provenance forgeable only by the platform | discussed: GitHub's reusable SLSA3 builders / slsa-github-generator are the upgrade path |
- US EO 14028 / NIST SSDF (SP 800-218) — federal suppliers must attest to secure development practices; SBOMs and provenance are the evidence.
- EU Cyber Resilience Act — manufacturers must identify and document components (SBOM) and demonstrate integrity of updates.
- Vendor due diligence / M&A — "show me your SBOM and build provenance" is now a standard questionnaire line. A signed, machine-verifiable answer beats a PDF of good intentions.
- Audit posture — Rekor's append-only transparency log gives auditors an independent record of every signing event, not one you could quietly edit.
- Act 1: tags are mutable pointers; digests are facts. Everything from here on is pinned to a digest.
- Act 2: a signature answers "who vouched for this exact content?" The tamper demo is the visceral moment — one byte breaks it.
- Act 3: an SBOM file proves nothing; a signed attestation bound to the digest does. Provenance is the build system vouching, not a person.
- Act 4: the gate asks "can you prove you're ours?", not "are you on a blocklist?" No proof → no deploy. Same concept scales to a Kubernetes admission controller (Sigstore policy-controller, Kyverno) unchanged.