security: verify container release source and image attestations - #339
security: verify container release source and image attestations#339m-khan-97 wants to merge 1 commit into
Conversation
…attestations Signed-off-by: Muhammad Ibrahim <135441675+m-khan-97@users.noreply.github.com>
Dependency ReviewThe following issues were found:
License Issues.github/workflows/docker.yml
OpenSSF Scorecard
Scanned Files
|
|
Ritik and Parth, this is ready for review; please focus on the signed-tag/main-ancestry gate, the scanned-image-to-attested-digest path, and failure handling before version promotion. One coordination issue after the OWASP transfer: GitHub rejected my review request for @Vishnu2707 because it does not currently recognize him as a repository collaborator. An OWASP administrator should confirm his reviewer access or the intended replacement before we proceed through the normal approval process. I have not changed access or enabled container publication. |
TFT444
left a comment
There was a problem hiding this comment.
The release integrity chain is well constructed: container publishing is gated behind the signed source-release job, both provenance and SBOM attestations are produced and verified against the exact manifest digest before any version promotion, and release_integrity.py is exercised at each stage. Actions are pinned to SHAs. Approved.
Summary
I am taking the container release-integrity slice of #304. The existing Docker publisher runs independently of the signed source-release job, so a successful image publication does not establish the same source-verification guarantees.
This change removes the independent Docker tag/manual triggers and makes container publishing a dependent reusable workflow after the signed source release succeeds.
What is enforced
vMAJOR.MINOR.PATCHtag must directly identify the event/checkout commit, and that commit must be on fetchedmainhistory.OWASP transition and explicit rollout control
GitHub now reports the canonical repository as OWASP/openshield. The proposed image destination is ghcr.io/owasp/openshield, replacing the historical namespace for future releases only. Nothing here migrates or deletes existing packages.
Container publication additionally requires the repository variable
CONTAINER_RELEASE_ENABLED=true. Before enabling it, an OWASP administrator must confirm package creation/write permissions, visibility, tag authority and the first-release verification plan. I have not set that variable, changed settings, created a tag, dispatched a release or published an image.The workflow must reach
mainbefore tagging a new release; historical tags retain their historical workflow code. A verified signature is not a separate trusted-signer allowlist, so branch/tag protections remain an administrative prerequisite under #298.Validation
bash -nin tests.git diff --checkpassed.Limits
No Docker daemon or live OIDC/registry publication was exercised locally. Tests validate the gate and workflow wiring, not a completed production release. The owner-approved first release must verify actual registry attestations and provide that operating evidence before announcement.
Registry push and signing are not atomic: a failed run may leave an unpromoted candidate. Source artifacts may already exist when the dependent container job fails. Consumers must verify and deploy the digest, never trust a candidate tag. Base/OS reproducibility, immutable version-tag enforcement, multi-architecture publishing and historical package migration are separate work.
Refs #304; deliberately leaves the broader issue open. Independent of #336.
Dependencies
Depends-On: none