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
| Eigenschap | Rootless | Rootful |
|---|---|---|
| Gebruiker | Draait als niet-root (bijv. UID 1000) | Draait als root (UID 0) |
| Beveiliging | Hoog — beperkte systeemtoegang | Laag — volledige systeemtoegang |
| Risico bij exploit | Beperkt tot de container | Mogelijk escalatie naar de host |
| Bestanden | Alleen toegang als eigenaar of via groepsrechten | Toegang tot alle bestanden |
| Poorten | Alleen poorten boven 1024 | Alle poorten inclusief 1-1023 |
| Compatibiliteit | Sommige software vereist aanpassingen | Werkt 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
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
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
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: 30003. 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:
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:
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-unprivilegedin plaats vannginx - Apache: configureer
Listen 8080en draai als niet-root gebruiker
Container start niet op
Controleer of uw container niet probeert om:
- Als root te draaien (
USER rootin Dockerfile) - Te schrijven naar read-only directories
- Poorten onder 1024 te gebruiken
- Extra Linux capabilities te gebruiken
Volgende stappen
- Wat kan je met Kubernetes — Overzicht van Kubernetes-features
- Van nul naar productie — Deploy uw eerste applicatie