Verify the installer

The DBSheriff installer is a shell script that you run as root, and it decides what else runs as root on your host: it downloads the install package, checks it, unpacks it and hands over to the guided setup. Everything after it is checked by the script; the script itself is the one thing you have to check yourself, and this page is how, before you run it.

It is signed, with Sigstore (keyless: there is no DBSheriff private key that could leak). A signature that verifies proves which workflow of which repository, at which release tag, produced those exact bytes. It does not depend on the server you downloaded the script from, so a changed script or a changed signature file on that server fails the check.

What to expect: the trust anchor

For release v1.4.0 the signer is exactly this identity, issued by exactly this provider:

Repository       dbsheriffai/dbsheriff
Workflow         .github/workflows/release.yml
Tag              v1.4.0   (a release tag: v, three numbers)
Identity         https://github.com/dbsheriffai/dbsheriff/.github/workflows/release.yml@refs/tags/v1.4.0
Identity pattern ^https://github\.com/dbsheriffai/dbsheriff/\.github/workflows/release\.yml@refs/tags/v[0-9]+\.[0-9]+\.[0-9]+(-[A-Za-z0-9.]+)?$
Issuer           https://token.actions.githubusercontent.com

Do not take these values from this page alone. They are printed in three places that do not depend on each other; read them in at least two and compare:

  1. the e-mail you received with your download links (the trial e-mail names the identity in the command it gives you),
  2. this page, at https://get.dbsheriff.ai/docs/v1.4.0/verify-the-installer.html (and in customer_docs/ inside the install package, which you can read from an earlier install),
  3. the release notes that came with your release.

If they differ from each other, stop and write to security@dbsheriff.ai.

Get cosign without trusting DBSheriff for it

cosign is the Sigstore client. Get it from somewhere that is not us:

No cosign, but Docker (the product needs Docker anyway)? Run the same check through the cosign image, which is pinned by digest, so it cannot change under you:

ghcr.io/sigstore/cosign/cosign:v3.1.3@sha256:9e5c2f2edc34351160407ca3416c61855bdf9403c3c5936e0f0be7fc261611b8

The two steps

Download the script and its signature, verify, and only then run. Replace v1.4.0 by the release you were given; the download token comes from your e-mail.

set -e
curl -fsSLO https://get.dbsheriff.ai/install-v1.4.0.sh
curl -fsSLO https://get.dbsheriff.ai/install-v1.4.0.sh.sigstore.json
cosign verify-blob --bundle install-v1.4.0.sh.sigstore.json \
  --certificate-identity https://github.com/dbsheriffai/dbsheriff/.github/workflows/release.yml@refs/tags/v1.4.0 \
  --certificate-oidc-issuer https://token.actions.githubusercontent.com \
  install-v1.4.0.sh
sudo bash install-v1.4.0.sh --version v1.4.0 --token '<download token>'

set -e stops at the first command that fails, so a script that does not verify is never run. Add the options your setup needs after --token (for example --airgap; the e-mail's command shows them), and everything after a lone -- goes to the guided installer.

The same check through Docker, with no cosign installed (the files are mounted read-only):

docker run --rm --user "$(id -u):$(id -g)" -e HOME=/tmp -v "$PWD:/w:ro" \
  ghcr.io/sigstore/cosign/cosign:v3.1.3@sha256:9e5c2f2edc34351160407ca3416c61855bdf9403c3c5936e0f0be7fc261611b8 \
  verify-blob --bundle /w/install-v1.4.0.sh.sigstore.json \
  --certificate-identity https://github.com/dbsheriffai/dbsheriff/.github/workflows/release.yml@refs/tags/v1.4.0 \
  --certificate-oidc-issuer https://token.actions.githubusercontent.com \
  /w/install-v1.4.0.sh

Verified OK is the answer you want. The digest of the script is also in the release notes of each release (sha256 of install.sh), if you want a second look: sha256sum install-v1.4.0.sh.

The one-line form

curl -fsSL https://get.dbsheriff.ai | sudo bash -s -- --version v1.4.0 --token '<download token>'

is a convenience for an evaluation on a host you can throw away. It runs the script without checking it: whatever the network and the server hand you is run as root. Do not use it for a host that matters.

What the installer then checks for itself

Once it runs, the installer verifies the signature of the release's checksum list (and, with --airgap, of the image bundle's checksum and of the image manifest) against the same identity for that release's tag, before it trusts a checksum. It stops if the signature is missing or does not verify, or if there is no way to verify it: it uses the host's cosign, or else the pinned cosign image through Docker, or else it refuses. --skip-signature goes on without any signature check; it says so loudly and leaves a checksum served from the same place as the file as the only protection. Do not use it for a real install.

A host that cannot reach Sigstore

Verification normally fetches Sigstore's trusted root from its public repository (tuf-repo-cdn.sigstore.dev). An air-gapped host cannot, so the release ships the root:

Trusted root sha256: 6494e21ea73fa7ee769f85f57d5a3e6a08725eae1e38c755fc3517c9e6bc0b66

(sha256sum trusted_root.json; the installer pins the same value, so a different file is refused), - copy it to the host, and give it to both steps:

cosign verify-blob --trusted-root trusted_root.json --bundle install-v1.4.0.sh.sigstore.json \
  --certificate-identity https://github.com/dbsheriffai/dbsheriff/.github/workflows/release.yml@refs/tags/v1.4.0 \
  --certificate-oidc-issuer https://token.actions.githubusercontent.com \
  install-v1.4.0.sh
sudo bash install-v1.4.0.sh --version v1.4.0 --token '<download token>' --trusted-root trusted_root.json

Sigstore rotates its trusted root about once a year. A root that is out of date makes verification fail (it never passes quietly); download the current trusted_root.json again and compare its checksum with the one above.

If the check fails

Do not run the script. A failure means one of: the file or the signature was changed on the way or on the server, you asked for the signature of a different release, your cosign is too old for the signature format (cosign version; use a current one), or, with a trusted root, the root is out of date. Download both files again over a different network and repeat the check; if it still fails, keep the two files and write to security@dbsheriff.ai.

Everything else a release contains (the images, the packages, the air-gap bundle) can be verified the same way: see verify your download.