Tags: container, security, docker, kubernetes, vulnerabilities, isolation
Level: intermedio
TL;DR: Best practices for securing containers throughout their lifecycle, from image build to runtime isolation.
Usa immagini base minimali (es. Alpine o distroless) per ridurre la superficie di attacco.
Non eseguire MAI i container come utente root (usa la direttiva USER nel Dockerfile).
Scansiona le immagini alla ricerca di vulnerabilità (CVE) prima del deployment (Trivy, Clair).
Firma le immagini per garantirne l'integrità e la provenienza (Notary, Cosign).
Limita le risorse hardware (CPU/RAM) per evitare attacchi DoS (cgroups).
Isola i container a livello di kernel utilizzando AppArmor, SELinux o seccomp.
Non includere segreti (password, chiavi API) nelle immagini o nel Dockerfile; usa secret manager o variabili d'ambiente a runtime.
Implementa Network Policies (in Kubernetes) per controllare il traffico tra container (Zero Trust).
Monta i file system radice come in sola lettura (readOnlyRootFilesystem) ove possibile.
Q: Perché è pericoloso eseguire un container come root, se è isolato?R: Anche se isolato, un processo root nel container può, in caso di escape (es. sfruttando bug del kernel), ottenere privilegi elevati sull'host.
Q: Qual è la differenza tra isolation tramite namespaces e cgroups?R: I namespaces isolano le risorse viste dal container (PID, reti, mount), mentre i cgroups limitano l'uso delle risorse fisiche (CPU, memoria).
Q: Come gestisci i segreti in un ambiente Kubernetes?R: Evito file in chiaro; uso Kubernetes Secrets, idealmente integrati con un provider esterno (es. HashiCorp Vault) tramite CSI Secrets Store.
Usare il tag latest per le immagini (rende imprevedibile cosa si sta eseguendo e complica i rollback).
Lasciare porte esposte non necessarie.
Condividere il socket Docker (/var/run/docker.sock) con un container (equivale a dare accesso root all'host).
Ignorare gli allarmi degli strumenti di scansione delle immagini.
# Esempio di Dockerfile sicuro
FROM node:18-alpine
# Non eseguire come root
USER node
WORKDIR /app
COPY --chown=node:node package*.json ./
RUN npm ci --only=production
COPY --chown=node:node . .
EXPOSE 3000
CMD ["node", "app.js"]
Bash
# Scansione di un'immagine con Trivy
trivy image my-app:v1.0.0
[ ] Configurazione dettagliata di seccomp profiles
[ ] Funzionamento di eBPF per la sicurezza a runtime (es. Cilium/Tetragon)
[ ] Meccanismi di image signing (Cosign)