CascadeGuard Open Secure Images
Production-hardened container base images with built-in vulnerability scanning, cryptographic signing, and SLA-driven CVE remediation.
Why CascadeGuard?
Most container security issues originate in the base image. Upstream images ship with unnecessary packages, default root users, embedded shells, and stale vulnerability databases. CascadeGuard images address this by applying a consistent hardening pipeline to every image we publish.
Security Properties
- Non-root by default — All images run as
nonroot(UID 65532), matching the distroless convention. - Minimal attack surface — Unnecessary packages, shells, documentation, and locale data are stripped at build time.
- Shell-restricted — Only
/bin/shis retained;bash,dash,zsh, and others are removed. - SUID/SGID bits removed — No binaries retain elevated privilege bits.
- Cryptographically signed — Every image is signed with cosign keyless signing via Sigstore.
- SBOM attached — Every image carries an SPDX SBOM attestation generated by syft.
- Continuously scanned — A daily workflow scans all published images with Grype and Trivy, automatically opening issues for new CVEs.
- SLA-driven patching — Critical CVEs are patched within 24 hours; high within 48 hours.
Image Catalog
| Image | Base | Tag | Pull |
|---|---|---|---|
| Python 3.12 | python:3.12-slim | 3.12-slim | docker pull ghcr.io/cascadeguard/python:3.12-slim |
| Node.js 20 | node:20-slim | 20-slim | docker pull ghcr.io/cascadeguard/node:20-slim |
| Nginx | nginx:stable-alpine-slim | stable-alpine-slim | docker pull ghcr.io/cascadeguard/nginx:stable-alpine-slim |
| Alpine 3.20 | alpine:3.20 | 3.20 | docker pull ghcr.io/cascadeguard/alpine:3.20 |
| Debian Slim | debian:bookworm-slim | bookworm-slim | docker pull ghcr.io/cascadeguard/debian:bookworm-slim |
Quick Start
Pull an image
docker pull ghcr.io/cascadeguard/python:3.12-slimVerify the signature
cosign verify \
--certificate-identity-regexp "https://github.com/cascadeguard/open-secure-images/.*" \
--certificate-oidc-issuer "https://token.actions.githubusercontent.com" \
ghcr.io/cascadeguard/python:3.12-slimUse in a Dockerfile
FROM ghcr.io/cascadeguard/python:3.12-slim
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["python", "app.py"]Verify the SBOM attestation
cosign verify-attestation \
--type spdxjson \
--certificate-identity-regexp "https://github.com/cascadeguard/open-secure-images/.*" \
--certificate-oidc-issuer "https://token.actions.githubusercontent.com" \
ghcr.io/cascadeguard/python:3.12-slimRepository Structure
images/ # One directory per image variant
python/3.12/ # Dockerfile + tests
node/20/
nginx/
alpine/
debian-slim/
shared/ # Shared tooling across all images
hardening/ # Bash scripts for hardening
scanning/ # Grype configuration
signing/ # Cosign signing scripts
.github/workflows/ # CI/CD pipelines
build-image.yaml # Build, scan, test, sign on push
scheduled-scan.yaml # Daily CVE scan of published images
release.yaml # Tagged release to GHCR + Docker Hub
policy/ # Security policies
cve-sla.yaml # Remediation SLA targets
allowed-packages.yaml # Per-image package allowlists
How Hardening Works
Every image passes through three shared hardening scripts during the Docker build:
-
minimize-packages.sh— Removes build tools, documentation, man pages, locale data, and unnecessary system packages. Supports both APT (Debian) and APK (Alpine). -
strip-shells.sh— Removes all shell binaries except/bin/sh. Cleans up profile files, completion directories, and updates/etc/shells. -
set-nonroot.sh— Creates thenonrootuser (UID 65532, GID 65532) with no login shell. Sets ownership of/appand/home/nonrootwith restricted permissions. Locks the root account.
CI/CD Pipeline
On push to main
The build-image.yaml workflow detects which images changed, builds them, runs Grype scans and container-structure-tests, generates SBOMs, signs with cosign, and pushes to GHCR.
Daily scheduled scan
The scheduled-scan.yaml workflow pulls all published images, scans them with both Grype and Trivy, and automatically opens GitHub issues for any new critical or high CVEs.
On version tag
The release.yaml workflow builds all images for linux/amd64 and linux/arm64, pushes to both GHCR and Docker Hub, signs everything, attaches SBOM attestations, and creates a GitHub Release with release notes.
CVE Remediation SLA
| Severity | Max Remediation Time | Build Gate |
|---|---|---|
| Critical | 24 hours | Blocked |
| High | 48 hours | Blocked |
| Medium | 7 days | Allowed |
| Low | 30 days | Allowed |
| Negligible | 90 days | Allowed |
See policy/cve-sla.yaml for SLA targets and CVE-STRATEGY.md for the full CVE detection, remediation, and upstream contribution strategy.
Contributing
By contributing to this project, you agree that your contributions will be licensed under the Business Source License 1.1.
- Fork the repository.
- Create a feature branch from
main. - Make your changes. If modifying a Dockerfile, update the corresponding
test/structure.yaml. - Run the structure tests locally:
container-structure-test test \ --image your-local-image:tag \ --config images/<image>/test/structure.yaml - Open a pull request. The CI pipeline will automatically build, scan, and test your changes.
Adding a new image
- Create a new directory under
images/<name>/with aDockerfileandtest/directory. - Add
structure.yamlandcve-policy.yamlin the test directory. - Add the image to the matrix in
.github/workflows/scheduled-scan.yamland.github/workflows/release.yaml. - Add an entry to
policy/allowed-packages.yaml.
License
The source code in this repository is licensed under the Business Source License 1.1. The Additional Use Grant permits production use, provided such use does not include offering the Licensed Work to third parties as a commercial container image lifecycle management service or a managed image rebuild service. On the Change Date (2030-04-04), the license converts to Apache License 2.0.
Published container image artifacts on GHCR and Docker Hub are free to pull and use in your own applications. See IMAGE-TERMS.md for details on image artifact usage, including restrictions on redistribution and resale.