Skip to content

Harden container images: distroless non-root with SecurityContext - #2

Merged
minivolk merged 4 commits into
masterfrom
feature/distroless-hardening
Mar 29, 2026
Merged

Harden container images: distroless non-root with SecurityContext#2
minivolk merged 4 commits into
masterfrom
feature/distroless-hardening

Conversation

@minivolk

Copy link
Copy Markdown
Owner

Security hardening for all injected containers:
Dockerfile (envproxy image):

  • Use gcr.io/distroless/cc-debian12:nonroot (was cc-debian12 without tag)
  • Add USER nonroot:nonroot Dockerfile (injector image):
  • Already using gcr.io/distroless/static:nonroot (no change) Webhook mutator:
  • Add SecurityContext to both init container and sidecar: runAsNonRoot: true, readOnlyRootFilesystem: true, allowPrivilegeEscalation: false, capabilities.drop: ["ALL"] Build context:
  • Add .dockerignore to exclude .git, target/, node_modules/, pycache/, IDE files from Docker build context

@minivolk
minivolk force-pushed the feature/distroless-hardening branch 2 times, most recently from 54d12aa to 9c99e40 Compare March 29, 2026 21:19
Security hardening for all injected containers:
Dockerfile (envproxy image):
- Use gcr.io/distroless/cc-debian12:nonroot (was cc-debian12 without
tag)
- Add USER nonroot:nonroot
Dockerfile (injector image):
- Already using gcr.io/distroless/static:nonroot (no change)
Webhook mutator:
- Add SecurityContext to both init container and sidecar:
  runAsNonRoot: true, readOnlyRootFilesystem: true,
  allowPrivilegeEscalation: false, capabilities.drop: ["ALL"]
Build context:
- Add .dockerignore to exclude .git, target/, node_modules/,
  __pycache__/, IDE files from Docker build context
…Fix non-root user: use numeric UID 65534 for Kubernetes runAsNonRoot verification

Kubernetes cannot verify non-root when USER is set to a string name.
The distroless nonroot user is UID 65534 — use the numeric value.
- k8s/Dockerfile: USER nonroot:nonroot → USER 65534:65534
- mutator.go: add RunAsUser: 65534 to SecurityContext so Kubernetes
  can verify the container process is non-root
@minivolk
minivolk force-pushed the feature/distroless-hardening branch 3 times, most recently from ae8c186 to 45c818f Compare March 29, 2026 21:56
Replace all QEMU-based cross-compilation with native ARM64 runners
(ubuntu-24.04-arm). All binaries (Rust + Go) are built natively
per-architecture, then Docker images just COPY the pre-built artifacts.
Pipeline restructure:
- build-rust: native cargo build on amd64 + arm64 runners
- build-injector: native Go build on amd64 + arm64 runners (new job)
- build-envproxy-image: per-arch Docker build (just COPY, no
compilation)
  then merge into multi-arch manifest via imagetools
- build-injector-image: per-arch Docker build using Dockerfile.release
  (just COPY pre-built binary) then merge manifest
- Remove docker/setup-qemu-action from all jobs
- Remove cross tool dependency
- Add Dockerfile.release for injector (no Go build stage, just
distroless + COPY)
- Add --prerelease flag for pre-release GitHub Releases (alpha/beta/rc)
Estimated speedup: ~25 min → ~4 min total pipeline time.
@minivolk
minivolk force-pushed the feature/distroless-hardening branch from 45c818f to 5ef8c58 Compare March 29, 2026 22:00
@minivolk
minivolk merged commit 812f887 into master Mar 29, 2026
22 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant