Verify release artifacts
Every vX.Y.Z tag starts our release workflow. The workflow signs SLSA build provenance
for its images and release assets.
Before you deploy a release, verify that each artifact came from this workflow at that tag.
The workflow stores attestations in two places:
- GHCR stores attestations with each image:
ghcr.io/zalando-incubator/agentic-identity-broker,-migrate, and-extproc. - The GitHub Release stores one Sigstore bundle for the binary archives
(
*.tar.gz), the Helm chart (*.tgz), andchecksums.txt. The bundle isagentic-identity-broker_<version>.intoto.jsonl.
Each verification command specifies the repository, the release workflow, and the tag. Attestations from a fork, a different workflow, or a different tag fail verification.
Verify with GitHub CLI
Log in to GitHub with gh. Before you verify images, log in to GHCR with
docker login ghcr.io.
Set the repository, release tag, and workflow:
REPO=zalando-incubator/agentic-identity-broker
TAG=vX.Y.Z
WORKFLOW="$REPO/.github/workflows/release.yml"
Verify the images:
for IMAGE in "ghcr.io/$REPO" "ghcr.io/$REPO-migrate" "ghcr.io/$REPO-extproc"; do
gh attestation verify "oci://$IMAGE:$TAG" --repo "$REPO" \
--signer-workflow "$WORKFLOW" --source-ref "refs/tags/$TAG"
done
To verify the broker archive for amd64, run these commands:
FILE="agentic-identity-broker_${TAG#v}_linux_amd64.tar.gz"
gh release download "$TAG" --repo "$REPO" --pattern "$FILE"
gh attestation verify "$FILE" --repo "$REPO" \
--signer-workflow "$WORKFLOW" --source-ref "refs/tags/$TAG"
To verify a different release asset, replace the FILE value in the example
with its filename.
Verify with cosign
Use cosign 3.0 or later.
Older versions search for a different attestation format by default. As a result, they do not find our attestations.
Set the repository, release tag, identity, and issuer:
REPO=zalando-incubator/agentic-identity-broker
TAG=vX.Y.Z
IDENTITY="https://github.com/$REPO/.github/workflows/release.yml@refs/tags/$TAG"
ISSUER=https://token.actions.githubusercontent.com
Verify the images:
for IMAGE in "ghcr.io/$REPO" "ghcr.io/$REPO-migrate" "ghcr.io/$REPO-extproc"; do
cosign verify-attestation --type slsaprovenance1 \
--certificate-identity "$IDENTITY" --certificate-oidc-issuer "$ISSUER" \
"$IMAGE:$TAG" > /dev/null
done
To verify the broker archive for amd64, run these commands:
FILE="agentic-identity-broker_${TAG#v}_linux_amd64.tar.gz"
BUNDLE="agentic-identity-broker_${TAG#v}.intoto.jsonl"
for NAME in "$FILE" "$BUNDLE"; do
curl --fail --location --remote-name \
"https://github.com/$REPO/releases/download/$TAG/$NAME"
done
cosign verify-blob-attestation --bundle "$BUNDLE" --type slsaprovenance1 \
--certificate-identity "$IDENTITY" --certificate-oidc-issuer "$ISSUER" \
"$FILE"
To verify a different release asset, replace the FILE value in the example
with its filename.
Verify many files at once
The checksums.txt file lists every archive and the Helm chart.
In either asset example, replace the FILE assignment with FILE=checksums.txt.
Run that example to verify the checksum file.
Then compare the downloaded files with it:
sha256sum --check --ignore-missing checksums.txt
On macOS, use shasum -a 256 --check --ignore-missing checksums.txt.
Verify the Helm chart from GHCR
The workflow publishes the same chart archive to GHCR and the GitHub Release.
Pull the archive from oci://ghcr.io/zalando-incubator/agentic-identity-broker:
helm pull oci://ghcr.io/zalando-incubator/agentic-identity-broker --version "${TAG#v}"
FILE="agentic-identity-broker-${TAG#v}.tgz"
If you use GitHub CLI, run the gh attestation verify command from the GitHub
CLI asset example.
If you use cosign, set BUNDLE as shown in the cosign asset example.
Download that bundle from the GitHub Release.
Then run the cosign verify-blob-attestation command from the cosign asset example.
Install the chart from the verified archive.
Deploy images with the exact vX.Y.Z tag that you verified.
The vX.Y tag changes with each patch release.
If verification fails, do not deploy the artifact. Report the failure through our security policy.