Skip to content

ci(security): SLSA provenance + keyless cosign signing for releases (T7)#68

Merged
valdacf merged 1 commit into
mainfrom
security/t7-provenance-signing
Jun 22, 2026
Merged

ci(security): SLSA provenance + keyless cosign signing for releases (T7)#68
valdacf merged 1 commit into
mainfrom
security/t7-provenance-signing

Conversation

@valdacf

@valdacf valdacf commented Jun 22, 2026

Copy link
Copy Markdown
Collaborator

Second half of T7 (build provenance / signing) — completes the security-hardening plan. Builds on #67 (shdg --sbom-output, already merged).

Signs and attests every released artifact with keyless Sigstore (Fulcio certs from the GitHub Actions OIDC token, recorded in Rekor — no managed signing key). Closes the outbound supply-chain gap left by ADR-014/015 and the OpenSSF Scorecard Signed-Releases check.

What

Images (shieldoo-gate, scanner-bridge)

  • build-push-action with provenance: mode=max + sbom: true → BuildKit attaches SLSA provenance + CycloneDX SBOM as OCI referrers
  • actions/attest-build-provenance (GitHub-hosted SLSA provenance, pushed to the registry)
  • cosign sign by digest, never by tag

shdg binaries — one attest-build-provenance attestation over all 5 archives.

Dogfooded SBOMs — persisted via shdg scan --sbom-output, attached (*.cdx.json), folded into SHA256SUMS, and signed with cosign sign-blob --bundle. The signed bytes are the same ones uploaded to the production gate.

Security posture

  • Permissions reduced to least-privilege: top-level contents: read, each job widens only what it needs.
  • New actions SHA-pinned (attest-build-provenance@v4.1.0, cosign-installer@v4.1.2) per ADR-015.
  • Fail-closed guards: incomplete SHA256SUMS or an empty SBOM aborts the release.
  • Security-reviewed by the security-reviewer agent — no blockers; the two should-fix integrity guards were applied.

Validation

  • actionlint clean (only pre-existing SC2129/SC2035 style nits).
  • ⚠️ The workflow runs only on a vX.Y.Z tag, so it cannot be exercised by PR CI — the first real run is the next release tag. Review is the safety net.

Docs

  • ADR-018 — decision + verification commands + the single-platform-index gotcha.
  • docs/development/ci.md — new "Release signing & provenance" section.
  • Release notes now embed the exact cosign verify / gh attestation verify commands per tag.

Follow-up (not blocking)

Bind the dogfooded SBOM to the image digest (OCI referrer / in-predicate) so SBOM↔image correspondence is verifiable. The BuildKit sbom: true referrer is already digest-bound.

🤖 Generated with Claude Code

Sign and attest every released artifact with keyless Sigstore (Fulcio certs
from the GitHub Actions OIDC token, recorded in Rekor — no managed key).
Closes the outbound supply-chain gap left by ADR-014/015 and the Scorecard
Signed-Releases check.

Images (shieldoo-gate, scanner-bridge):
- build-push-action with provenance: mode=max + sbom: true (BuildKit attaches
  SLSA provenance + CycloneDX SBOM as OCI referrers)
- actions/attest-build-provenance (GitHub-hosted, push-to-registry)
- cosign sign by digest (never by tag)

shdg binaries: one attest-build-provenance over all 5 archives.

Dogfooded SBOMs: persisted via `shdg scan --sbom-output`, attached to the
release (*.cdx.json), folded into SHA256SUMS, and signed with
cosign sign-blob --bundle. Same bytes the gate ingested.

Permissions reduced to least-privilege: top-level contents: read, each job
widens only what it needs. New actions SHA-pinned (ADR-015). Fail-closed
guards reject an incomplete SHA256SUMS or an empty SBOM.

Security-reviewed (no blockers; two should-fix integrity guards applied).
The workflow only runs on a vX.Y.Z tag, so the first real exercise is the
next release tag.

ADR-018 records the decision; docs/development/ci.md documents the flow.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@valdacf valdacf merged commit 4751bf4 into main Jun 22, 2026
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant