Hardened container images.
Minimal, signed, verifiable.
42 minimal, non-root images on musl and glibc. Each is signed with cosign and ships with a CycloneDX SBOM and SLSA provenance, so you can check what you pull before it runs.
What are the SecurityVault hardened images?
Base, language runtime and service images built to carry your workload and little else. Our own builder copies the program and the exact shared libraries it loads, not a whole distribution.
-glibc suffix in the tag.nonroot user. No shell, no package manager and no setuid or setgid files. Every distribution file keeps its package record, so scanners see every package.65532:65532.Which images and tags are in the catalog?
Pull any tag as ghcr.io/securityvault-io/<image>:<tag>. 42 tags in 9 families.
| Image | What it is | musl tags (Alpine 3.23) | glibc tags (Ubuntu 24.04) | Flavours |
|---|---|---|---|---|
| static | CA bundle, tzdata and the nonroot user, for statically linked binaries. | latest | latest-glibc | Runtime |
| base | C library, libgcc and libstdc++ for dynamically linked programs. | latest latest-dev | latest-glibc latest-glibc-dev | Runtime and dev |
| python | CPython 3.13 and 3.12. The dev flavour adds pip. | 3.13 3.12 3.13-dev 3.12-dev | 3.13-glibc 3.12-glibc 3.13-glibc-dev 3.12-glibc-dev | Runtime and dev |
| node | Node.js 22 and 24. Runtime images carry no npm; the dev flavour adds npm, npx and corepack. | 22 24 22-dev 24-dev | 22-glibc 24-glibc 22-glibc-dev 24-glibc-dev | Runtime and dev |
| openjdk | Headless Temurin 21: a JRE in the runtime image, a JDK in the dev flavour. | 21 21-dev | 21-glibc 21-glibc-dev | Runtime and dev |
| nginx | nginx 1.30 on port 8080, with logs to stdout and stderr. | 1.30 1.30-dev | 1.30-glibc 1.30-glibc-dev | Runtime and dev |
| valkey | Valkey 9.0 built from source, with upstream defaults including protected mode. | 9.0 9.0-dev | 9.0-glibc 9.0-glibc-dev | Runtime and dev |
| postgres | PostgreSQL 17, server only. Initialise the data directory with the dev flavour first. | 17 17-dev | 17-glibc 17-glibc-dev | Runtime and dev |
| go | Go 1.27 and 1.26 toolchain images, with a shell and package manager by design. | 1.27 1.26 | 1.27-glibc 1.26-glibc | Build image |
How do I verify an image before I pull it?
Every step uses the public key alone, with cosign 2.2 or later. The SBOM and provenance commands also need jq. No SecurityVault account is needed.
Download the public key. The same key is printed below so you can compare it with the file.
curl -fsSL https://securityvault.io/hardened-images/cosign.pub -o securityvault-hardened.pub-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEhLRqA4eX3I656dkcsxO7O47RZejM
7p481ZVz1zgCSo9ZL8c+cppsIVG6GkOAThoepzd0eHeaYCHu31yUi+yQJg==
-----END PUBLIC KEY-----This succeeds only if the image behind the tag carries a signature from that key. Every signature and attestation is recorded in the public Rekor transparency log, and cosign verify also checks the inclusion proof.
cosign verify --key securityvault-hardened.pub ghcr.io/securityvault-io/python:3.13The CycloneDX SBOM is attached as a signed attestation. This verifies it and prints every component with its licence.
cosign verify-attestation --key securityvault-hardened.pub --type cyclonedx \
ghcr.io/securityvault-io/python:3.13 | jq -r .payload | base64 -d | jq .predicateThe SLSA v1 provenance records the catalog entry, the source revision, the package snapshot and builder image the image was built from, and the digest of the result.
cosign verify-attestation --key securityvault-hardened.pub --type slsaprovenance1 \
ghcr.io/securityvault-io/python:3.13 | jq -r .payload | base64 -d | jq .predicatecosign verify reports and reference the image as ghcr.io/securityvault-io/python@sha256:<digest> in your Dockerfiles and manifests.What does the scan gate enforce?
Every image is scanned from its CycloneDX SBOM and directly with a second scanner before it can be published. An approved, time-limited OpenVEX statement may cover a finding for its exact component version and image.
not_affected statement naming the exact component version and image. Approval must be no more than 60 days old. Drafts exempt nothing; an expired approval fails the gate. An applicable statement is published as a signed openvex attestation. Verify it with cosign verify-attestation and --type openvex, using the published public key.How is an image set validated before it is published?
Each digest set passes two rounds and a security-owner sign-off. A newly built set needs its own validation record before it is published. SecurityVault runs both rounds; no third party has audited the set.
65532:65532 and names its package snapshot. No setuid, setgid or world-writable file apart from a sticky /tmp. No shell in runtime images. No build-environment content under /etc. The licence files are present. A second scanner applies the same policy. A rebuild with no cache from the recorded package snapshot must reproduce the same digest.What are the licence terms?
- Ubuntu packages (glibc images)
/usr/share/doc/<package>/copyright - Alpine package database (musl images)
/lib/apk/db/installed - Python
/usr/local/lib/python3.X/LICENSE.txt - Node.js
/usr/local/LICENSE - Eclipse Temurin
/opt/java/openjdk/legal/ - Go
/usr/local/go/LICENSE - Valkey
/usr/local/share/licenses/valkey/COPYING - nginx (musl images)
/usr/share/licenses/nginx/COPYRIGHT - nginx (glibc images)
/usr/share/doc/nginx/copyright
Where are the images published?
Packages are published to GHCR and made public per image. A denied anonymous pull means that package is not public yet.
GitHub Container Registry, under ghcr.io/securityvault-io. Verify the image with the steps above before you use it.
docker pull ghcr.io/securityvault-io/python:3.13Hardened image questions
- Are the hardened images free of vulnerabilities?
- No. The scan gate blocks Critical, High and Unknown findings and available fixes, except where a current, security-owner-approved OpenVEX not_affected statement covers the exact component version and image. Drafts exempt nothing; expired approvals fail the gate. Medium, Low and Negligible findings without a fix can remain, and scanner databases lag behind disclosures. Every image ships a CycloneDX SBOM and, when a statement applies, a signed OpenVEX attestation, so you can check the evidence with your own tools.
- Should I use the musl or the glibc images?
- Use the variant your software is built and tested against. musl images are based on Alpine 3.23 and glibc images on Ubuntu 24.04; glibc tags carry a
-glibcsuffix. If your binaries need glibc, choose a glibc image. - Why does a runtime image have no shell?
- Nothing in the image can run an interactive command or install a package, which removes tools an intruder would use. For build stages and debugging, use the
-devtwin, which adds a shell, core utilities and the package manager, and copy the result into the runtime image. PostgreSQL needs one extra step: initialise the data directory with the-devimage first. - Do I need a SecurityVault account to pull or verify an image?
- No. Pulling needs only the registry, and verification needs only the public key and cosign 2.2 or later.
- Which SLSA level do the images reach?
- Build L1. The pipeline produces SLSA v1 provenance and attests it with a key it holds. We claim no higher level.
- Can I rebuild an image myself?
- No. The build definitions are proprietary and the build repository is private. We build each image twice from one package snapshot and require the same digest, and a second, separate rebuild from the recorded snapshot must reproduce that digest before a set is published. The provenance attestation records the package snapshot and builder image digests.
- Do the tags change?
- Yes. The tags are rolling and a new validated digest set moves them. Pin the digest that
cosign verifyreports in production. Each published tag also gets a dated tag in the form<tag>-<yyyymmdd>. - Does SecurityVault scan images in my own registry?
- Yes, as part of the platform. See container security for digest-pinned scanning, signature checks and image-to-workload binding.
Ask us about the image set.
Ask about the build process, the licence texts, or how SecurityVault scans images in your own registry.