UID2-7080: Add SLSA provenance for private operator artifacts - #2696
Conversation
Gate non-snapshot private image tags and release files on attest+verify so enclave images, measurements, and deployment archives publish with the same producer-side provenance controls as the public operator image. Co-authored-by: Cursor <cursoragent@cursor.com>
🤖 AI Code ReviewGenerated by Azure OpenAI (gpt-5). Automated — human review is still required. SummaryThis PR adds artifact/image provenance attestation across the release pipelines: local file attestations for EIFs, manifests, AMI measurement files, and release archives; OCI attestation/verification for published images; digest-first image publishing with post-promotion digest checks; and updated README guidance for consumers to verify provenance. Strengths
Findings🟡 ImportantUnpinned external attestation action reintroduces supply-chain risk Fresh attestation verification has no retry/backoff, so these release paths may flake 🟢 Minor
README example weakens verification compared with the guidance above it VerdictReady to merge? Reasoning: The overall direction is solid and materially improves provenance coverage, but the unpinned attestation action and lack of retry/backoff in the new verification steps are both worth fixing before relying on this in release pipelines. |
Use exact signer workflow policies so verification cannot accept a different workflow through permissive regular-expression matching. Co-authored-by: Cursor <cursoragent@cursor.com>
Confirm Azure and EKS version tags resolve to the attested digest before their publish workflows continue. Co-authored-by: Cursor <cursoragent@cursor.com>
|
^ addressed initial comments on AI review but looks like it didn't work when i re-triggered the review workflow |
|
Can you see if you can run a smoketest to check the new actions or one of the workflows, usually helps check the job permissions and signer repo/wf |
BehnamMozafari
left a comment
There was a problem hiding this comment.
Reviewed the full diff plus the pinned upstream actions (actions/attest@v4.1.0, docker/build-push-action@v7.2.0, buildx imagetools create), uid2-shared-actions/attest_image@v3, and gh attestation verify flag semantics. Four comments inline, roughly in severity order.
A few things I specifically checked and found correct, noting them so they don't get re-raised: imagetools create preserves the attested digest for a single index source (util/imagetools/create.go, the len(srcs) == 1 && len(ann) == 0 carbon-copy branch); the quoted multi-registry outputs: syntax survives build-push-action's CSV parsing ({ignoreComma: true, quote: false}); actions/attest@59d8942 is genuinely v4.1.0 and defaults to SLSA provenance with no predicate input; and --repo + --signer-workflow are compatible, with the prefix match on job_workflow_ref correctly keeping the reusable workflow as signer. Two real bug fixes in here as well — the new Zip deployment artifacts step finally creates the archives Create release was already referencing, and Prepare EIF archive for Packer now runs on the operator_release path where uid2operatoreif.zip was previously never created.
Grant the cleanup job contents write access so its standalone release path can create the draft GitHub Release after provenance checks pass. Co-authored-by: Cursor <cursoragent@cursor.com>
Grant release jobs read access to pull requests so changelog generation can enumerate merged PR metadata under explicit token permissions. Co-authored-by: Cursor <cursoragent@cursor.com>
Make pre-provenance AMI rebuild failures recognisable and record that the workflow currently has no compatibility bypass. Co-authored-by: Cursor <cursoragent@cursor.com>
Disable BuildKit's redundant implicit provenance so private images remain plain single-platform manifests while signed SLSA attestations are published separately. Co-authored-by: Cursor <cursoragent@cursor.com>
Disable imagetools index preference so private image tags resolve directly to the plain manifest that was attested and verified. Co-authored-by: Cursor <cursoragent@cursor.com>
Preserve the historical Docker v2 manifest format despite BuildKit's newer OCI media type default. Co-authored-by: Cursor <cursoragent@cursor.com>
Ran Azure CC and GCP pipelines from this branch as tests and tested out the attestation (more details in the ticket comments) |
Summary
attest_file, sharedattest_image@v3, plus registry--bundle-from-ocichecks).gh attestation verifyusage with--signer-workflow/--bundle-from-oci; snapshots continue to skip attestation.Notes
uid2-private-operator-release,uid2-deployment, or consumer enforcement.Test plan
actionlint/ workflow YAML review of changed publish paths-SNAPSHOT--bundle-from-ociverify → tag promotion; both tags resolve to attested digestpublish-all-operatorsattests combined release ZIPs beforeaction-gh-releasegh attestation verifycommands from README against a real non-snapshot artifact setMade with Cursor