Skip to content

Supply-Chain Evidence

Running cloudtaser is a trust shift. You are moving responsibility for secret handling FROM "the US cloud provider + their build pipelines + their signing root" TO "cloudtaser + OpenBao + your chosen EU substrate + cloudtaser's build pipelines." That shift is the product. This page gives you the cryptographic handle to audit the cloudtaser side of that shift, so you have evidence -- not assurance -- that the bits you run are the bits we shipped.

What release verification establishes

Every release artefact (container image, Linux binary, Helm chart, SBOM) is Cosign-signed. The public installer carries its verification key in its own content rather than downloading the key beside the artefact. Releases with Sigstore bundles also carry transparency-log evidence. These are separate properties: a pinned-key signature authenticates the signer, while a bundle additionally proves transparency-log inclusion. You still trust the reviewed installer revision and the channel that delivers it.


What we sign

Artefact type Signing mechanism Distribution
Container images (operator, wrapper, eBPF agent, port, beacon, S3/DB proxy, init container) cosign sign with COSIGN_KEY (env-only, never on disk in CI) against GAR (europe-west4-docker.pkg.dev/skipopsmain/cloudtaser/*) tags, recursive across multi-arch manifests Registry-attached signatures
Linux binaries (port, enroll, CLI, wrapper, etc.) cosign sign-blob produces <binary>.sig adjacent to the binary https://releases.cloudtaser.io/<component>/<version>/
Checksums file cosign sign-blob produces SHA256SUMS.sig Same release URL
SBOM syft dir:. -o spdx-json > sbom.spdx.json attached to each Codeberg release Codeberg release assets + release URL
Helm charts Chart lineage tracked through CI; release tags checksummed https://helm.cloudtaser.io

All signing steps hard-fail in CI if the signing key is missing. We do not ship unsigned artefacts.


Trust root -- the public key

The single public key that validates every cloudtaser signature:

  • Installer pin: SHA-256 036dd71c9d3c07a19bff06d4392874014573f695620ac8554d9df175094c4a31
  • Convenience copy: https://releases.cloudtaser.io/keys/release.pub
  • Format: PEM-encoded ECDSA P-256 (cosign.pub)

The convenience URL is not an independent trust root when it is downloaded from the same origin as the artefact. The public install.sh therefore embeds the PEM and checks its fingerprint before using it. A release-origin compromise cannot replace the binary, checksum, signature, and verification key together. For air-gapped or manual verification, copy the key from a reviewed installer revision or another independently controlled source and verify its fingerprint. Embedding the key protects against compromise of the release artefact origin; it does not protect against an attacker who can replace the installer itself.

Rotating the key is a versioned event

A planned rotation starts with a reviewed installer update that embeds both old and new public keys and records both fingerprints. A rotation statement signed by both keys defines the overlap deadline; only after that overlap may a second reviewed installer update remove the old key. Releases do not switch signers before the dual-key installer is published. Emergency revocation follows the same independently published update path, but may omit the overlap when the old private key is suspected compromised.


How to verify an image

Copy-paste ready:

# Fetching from the release origin is convenient, but verify this fingerprint
# against the independently published installer or your own pinned copy.
curl -sSLf https://releases.cloudtaser.io/keys/release.pub -o release.pub
printf '%s  %s\n' \
  036dd71c9d3c07a19bff06d4392874014573f695620ac8554d9df175094c4a31 \
  release.pub | sha256sum -c -

# Verify an operator image (GAR -- the sole production registry)
cosign verify \
  --key release.pub \
  europe-west4-docker.pkg.dev/skipopsmain/cloudtaser/cloudtaser-operator:v0.9.0

A successful verification prints the signing identity, the Rekor log entry UUID, and the verified manifest digest. Any other output means the image is unsigned, mis-signed, or the tag does not match a signed digest -- do not deploy.

Verifying all cloudtaser-managed images before a release

components=(
  cloudtaser-operator
  cloudtaser-wrapper
  cloudtaser-ebpf
  cloudtaser-beacon
  cloudtaser-s3-proxy
  cloudtaser-db-proxy
)
TAG=v0.9.0
for c in "${components[@]}"; do
  cosign verify --key release.pub "europe-west4-docker.pkg.dev/skipopsmain/cloudtaser/${c}:${TAG}" \
    && echo "OK: $c" \
    || { echo "FAIL: $c"; exit 1; }
done

Use this in your release-gate pipeline before promoting a cloudtaser version into a regulated environment.


How to verify a binary

Every Linux binary published to releases.cloudtaser.io ships a .sig file alongside it:

VERSION=v0.3.26
COMPONENT=port
curl -sSLfO "https://releases.cloudtaser.io/${COMPONENT}/${VERSION}/cloudtaser-${COMPONENT}-linux-amd64"
curl -sSLfO "https://releases.cloudtaser.io/${COMPONENT}/${VERSION}/cloudtaser-${COMPONENT}-linux-amd64.sig"

cosign verify-blob \
  --key release.pub \
  --signature "cloudtaser-${COMPONENT}-linux-amd64.sig" \
  "cloudtaser-${COMPONENT}-linux-amd64"

For the checksums file:

curl -sSLfO "https://releases.cloudtaser.io/${COMPONENT}/${VERSION}/SHA256SUMS"
curl -sSLfO "https://releases.cloudtaser.io/${COMPONENT}/${VERSION}/SHA256SUMS.sig"

cosign verify-blob \
  --key release.pub \
  --signature SHA256SUMS.sig \
  SHA256SUMS

sha256sum -c SHA256SUMS

Detached .sig verification authenticates the bytes against the pinned key, but it does not by itself prove transparency-log inclusion. When a release also publishes a .sigstore.json bundle, pass that bundle to Cosign and retain it with the audit evidence. Treat a release without a bundle as signed but not transparency-proven.

That second step is the chain you want in an audit narrative: the checksums file is signed, and every binary in the directory is included in that checksums file.


How to fetch an SBOM

Each release ships an SPDX-format SBOM generated with syft:

curl -sSLfO "https://releases.cloudtaser.io/${COMPONENT}/${VERSION}/sbom.spdx.json"

# Quick inventory
jq '.packages | map({name, versionInfo}) | .[]' sbom.spdx.json | head -40

# Or feed into Grype / Trivy for vulnerability scanning
grype sbom:sbom.spdx.json
trivy sbom sbom.spdx.json

SBOMs are also attached to every Codeberg release on the respective component repository under cloudtaser/<component>.


Admission-policy enforcement

You can enforce signature verification at admission time in your cluster, so that an unsigned image (or an image tag swap, or a rollback to a non-signed digest) is rejected before the pod schedules. The cloudtaser Helm chart ships this as an opt-in:

# values.yaml
admission:
  enforceSignature: true
  mode: kyverno          # or "vap", or "both"
  signature:
    publicKey: ""        # inline PEM for air-gapped; default is publicKeyURL
    publicKeyURL: "https://releases.cloudtaser.io/keys/release.pub"
    rekorURL: "https://rekor.sigstore.dev"
    ignoreTlog: false
    additionalImageReferences: []
      # - "europe-west4-docker.pkg.dev/customer-project/*"

See Helm Values Reference for the full admission options. The default is enforceSignature: false during Preview; once the trust root is broadly published, the default flips in a subsequent minor. If you want strict behaviour today, set it to true now and add your own signed images under additionalImageReferences to extend the same trust root to your internal registry.

Engine selection:

  • kyverno (recommended) uses Kyverno's native verifyImages rule; requires Kyverno ≥ 1.11 installed in the cluster.
  • vap renders a Kubernetes 1.30+ ValidatingAdmissionPolicy that enforces digest-pinned images (@sha256:...) without requiring an external controller. It cannot verify signatures by itself (VAP has no egress) but it closes the tag-swap / latest-rollback gap.
  • both renders both, for defence-in-depth or during a Kyverno install/uninstall migration.

Metrics you can scrape: cloudtaser_admission_signature_enforced (gauge) and cloudtaser_admission_signature_rejections_total (counter).


What's on the roadmap

  • Reproducible builds: verify that a given Git SHA produces a byte-identical image locally and in CI. Currently partial (Go binaries are reproducible with -trimpath -buildvcs=false -ldflags="-buildid="; container layer ordering is not fully pinned). Tracker: cloudtaser-pipeline# (filed in the same PR as this page -- see release notes).
  • Third-party penetration test: targeted Q2 2026; results publishable in a redacted executive summary. See Preview Status & Roadmap.
  • SLSA level 3 aspiration: signed provenance attestation attached to every image (beyond the basic Cosign signature). Depends on build-environment isolation work currently underway in the pipeline repo.
  • Rekor-only verification flows for customers who cannot tolerate fetching release.pub at admission time: we document the Rekor UUIDs per release so you can verify against the transparency log without holding a local copy of the public key.

Acknowledging the trust shift

Using cloudtaser IS a trust shift. You go from:

  • Before: trusting the US cloud provider + their key-management service + their Vault Enterprise build pipeline + their signing root.
  • After: trusting cloudtaser's codebase + your chosen EU substrate (OpenBao + provider) + cloudtaser's build pipeline + cloudtaser's signing root.

The shift is the value proposition -- we are moving secret material out of the compelled surface into a jurisdictionally and architecturally distinct surface. But it is not an elimination of trust; it is a relocation of it. This page exists to give you the cryptographic handle to audit the cloudtaser side of that shift -- independently, continuously, and with primitives (Cosign, SPDX SBOMs, Rekor transparency) that are open-source and industry-standard.

If you need evidence beyond what's documented here -- a pentest report, a SOC 2 letter, a penetration-test attestation, a specific build-provenance format -- reach out. Those items are on the roadmap; several are available under NDA today.