Skip to content

Sign published runner image: cosign signature, SBOM, and SLSA provenance #115

@jmcte

Description

@jmcte

Context

.github/workflows/release-image.yml publishes the runner image to GHCR as a verified multi-arch manifest (linux/amd64 + linux/arm64) and creates a GitHub Release, but the image itself is not signed and ships without an SBOM or build provenance attestation.

The org CI/CD audit (docs/omt-global-ci-cd-audit-2026-04-14.md) names this repo as the release-isolation reference and Wave 5 asks us to "Generalize the github-runner-fleet release isolation pattern." Operator-facing signing closes that loop and lines up with the org's gh-attest direction.

Scope

  • Add keyless cosign signing (sigstore/cosign-installer + cosign sign) for the multi-arch image manifest and per-architecture digests after the existing publish step.
  • Generate and publish an SBOM (e.g. anchore/sbom-action producing SPDX) attached to the image via cosign attest.
  • Emit SLSA build provenance via actions/attest-build-provenance for both the image and any release tarballs.
  • Add a verification step in the same workflow (or a follow-up smoke job) that runs cosign verify against the just-published digest before the release tag is created.
  • Document the verification command in README.md so downstream consumers can validate the image they pulled.

Acceptance Criteria

  • A maintainer can run cosign verify ghcr.io/omt-global/github-runner-fleet:<tag> --certificate-identity-regexp ... --certificate-oidc-issuer https://token.actions.githubusercontent.com and get a green result.
  • cosign verify-attestation returns an SPDX SBOM and an SLSA provenance statement for the same digest.
  • release-image.yml fails closed if signing, SBOM upload, or provenance attestation fails.
  • README documents the verify command and the OIDC identity to trust.

Related

  • Audit doc: docs/omt-global-ci-cd-audit-2026-04-14.md (Wave 5)
  • SECURITY.md — supply-chain posture for runner-host images

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions