Artifact Signing and Provenance

By Davy Rogers

How do you know that binary is what it claims to be? Sigstore and SLSA.

Supply chain attacks modify artefacts after build, before install. Signing and provenance prove: authentic, unmodified, traceable.

Sigstore

Keyless signing. No long-lived keys.

# Sign
cosign sign ghcr.io/myorg/myapp@sha256:abc123...

# Verify
cosign verify ghcr.io/myorg/myapp@sha256:abc123... \
  --certificate-identity=.../workflows/build.yml@refs/heads/main \
  --certificate-oidc-issuer=https://token.actions.githubusercontent.com

Fulcio: Issues short-lived certs binding key to OIDC identity.

Rekor: Append-only transparency log.

CI signing

permissions:
  id-token: write  # Required for keyless

- uses: sigstore/cosign-installer@v3
- run: cosign sign --yes ghcr.io/${{ github.repository }}@${{ steps.build.outputs.digest }}

npm provenance:

npm publish --provenance
npm audit signatures

SLSA

Supply-chain Levels for Software Artefacts.

LevelRequirement
SLSA 1Provenance documented
SLSA 2Hosted build service
SLSA 3Hardened platform, non-falsifiable provenance

Verification

Signing is useless without enforcement.

# Kyverno - reject unsigned images
verifyImages:
  - imageReferences: ["ghcr.io/myorg/*"]
    attestors:
      - keyless:
          issuer: "https://token.actions.githubusercontent.com"

What to sign

Container images, npm packages, Go binaries, Helm charts, SBOMs. Everything crossing a trust boundary.

The takeaway

Sigstore keyless. SLSA provenance. Enforce verification at deployment.

Want a professional to look at it?Get an AppSec Health Check.