Skip to Content
Aan de slagRootless containers

Rootless containers

Op het Proxy Platform draaien uw Kubernetes-clusters met Pod Security Standards op het niveau Restricted. Dit betekent dat containers standaard als rootless worden uitgevoerd.

Wat zijn rootless containers?

Een rootless container draait als een niet-root gebruiker binnen de container. Dit is een belangrijke beveiligingsmaatregel die voorkomt dat een gecompromitteerde container toegang kan krijgen tot het onderliggende systeem.

Rootless vs. rootful

EigenschapRootlessRootful
GebruikerDraait als niet-root (bijv. UID 1000)Draait als root (UID 0)
BeveiligingHoog — beperkte systeemtoegangLaag — volledige systeemtoegang
Risico bij exploitBeperkt tot de containerMogelijk escalatie naar de host
BestandenAlleen toegang als eigenaar of via groepsrechtenToegang tot alle bestanden
PoortenAlleen poorten boven 1024Alle poorten inclusief 1-1023
CompatibiliteitSommige software vereist aanpassingenWerkt met alle software

Waarom rootless op het Proxy Platform?

Uw cluster is geconfigureerd met het Restricted Pod Security Standard. Dit is de hoogste beveiligingsniveau en vereist:

  • Containers draaien als niet-root gebruiker
  • Geen privilege escalation toegestaan
  • Geen host network of host PID toegang
  • Alleen read-only root filesystem (aanbevolen)
  • Geen extra Linux capabilities
Note

Dit is een bewuste keuze van het Proxy Platform. RKE2 is de enige Kubernetes-distributie die standaard voldoet aan de CIS Benchmark, en rootless containers zijn daar een essentieel onderdeel van.

Uw container rootless maken

1. Gebruik een niet-root gebruiker in uw Dockerfile

Dockerfile
FROM node:20-alpine # Maak een niet-root gebruiker aan RUN addgroup -S appgroup && adduser -S appuser -G appgroup # Stel de werkdirectory in WORKDIR /app # Kopieer bestanden en stel eigenaar in COPY --chown=appuser:appgroup . . # Installeer dependencies RUN npm ci --only=production # Schakel over naar de niet-root gebruiker USER appuser # Gebruik een poort boven 1024 EXPOSE 3000 CMD ["node", "server.js"]

2. Stel de security context in uw Kubernetes-manifest

deployment.yaml
apiVersion: apps/v1 kind: Deployment metadata: name: mijn-app spec: template: spec: securityContext: runAsNonRoot: true runAsUser: 1000 runAsGroup: 1000 fsGroup: 1000 containers: - name: app image: mijn-app:latest securityContext: allowPrivilegeEscalation: false readOnlyRootFilesystem: true capabilities: drop: - ALL ports: - containerPort: 3000

3. Gebruik poorten boven 1024

Rootless containers kunnen geen poorten onder 1024 binden. Gebruik een poort zoals 3000, 8080 of 8443 in uw applicatie en laat Kubernetes de routing afhandelen via een Service:

service.yaml
apiVersion: v1 kind: Service metadata: name: mijn-app spec: selector: app: mijn-app ports: - port: 80 # Externe poort (via Service) targetPort: 3000 # Interne poort (in container)

Veelvoorkomende problemen

”Permission denied” bij schrijven naar bestanden

Als uw applicatie bestanden moet schrijven, gebruik dan een emptyDir volume of een Persistent Volume:

Writable directory via emptyDir
spec: containers: - name: app volumeMounts: - name: tmp mountPath: /tmp - name: cache mountPath: /app/cache volumes: - name: tmp emptyDir: {} - name: cache emptyDir: {}

Nginx of Apache werken niet

Standaard proberen Nginx en Apache te luisteren op poort 80 en als root te draaien. Gebruik de officiële rootless-varianten:

  • Nginx: gebruik nginxinc/nginx-unprivileged in plaats van nginx
  • Apache: configureer Listen 8080 en draai als niet-root gebruiker

Container start niet op

Controleer of uw container niet probeert om:

  • Als root te draaien (USER root in Dockerfile)
  • Te schrijven naar read-only directories
  • Poorten onder 1024 te gebruiken
  • Extra Linux capabilities te gebruiken

Volgende stappen

Last updated on