Container Security — Cheat Sheet

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.

Concetti chiave

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.

Domande tipiche e risposte pronte

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.

Insidie e errori comuni

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.

Snippet e comandi

# 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

Da ripassare

[ ] Configurazione dettagliata di seccomp profiles

[ ] Funzionamento di eBPF per la sicurezza a runtime (es. Cilium/Tetragon)

[ ] Meccanismi di image signing (Cosign)

Jarvis Interviews
Jarvis