Blog

Rafforzamento dei Container Docker per Hosting Multi-Tenant: Guida all'Isolamento Passo dopo Passo

Scopri come blindare i container Docker per ambienti multi-tenant con misure di sicurezza pratiche come utenti non root, capacità rimosse, filesystem in sola lettura e isolamento di rete.

Riepilogo

Gestire una piattaforma di hosting Docker multi-tenant richiede un isolamento ermetico dei container per evitare che i tenant interferiscano tra loro o scappino verso l'host. Questa guida fornisce un processo concreto e dettagliato di rafforzamento che puoi applicare oggi stesso. Imparerai a configurare utenti non root, rimuovere capacità Linux superflue, montare filesystem in sola lettura, imporre limiti di risorse tramite cgroup, segmentare le reti e applicare profili seccomp o AppArmor. Vedremo anche quando affiancare i container con macchine virtuali per la massima sicurezza. Alla fine, avrai una checklist per eliminare sistematicamente i comuni vettori di fuga dai container e mantenere la tua infrastruttura multi-tenant veramente isolata.

Il Problema Reale dei Container Multi-Tenant

I container Docker condividono il kernel dell'host e, se l'isolamento è configurato male, un tenant può teoricamente accedere ai dati di un altro, consumare tutta la CPU o persino evadere verso l'host. Come fornitore di hosting, hai bisogno di confini ermetici senza sacrificare i vantaggi prestazionali dei container. Molti team iniziano con le impostazioni predefinite di Docker, che sono progettate per lo sviluppo, non per la produzione multi-tenant. La buona notizia: con una checklist sistematica di rafforzamento, puoi blindare ogni container fino a livelli di isolamento quasi da VM, mantenendo la velocità di Docker.

Questo articolo ti guida attraverso ogni fase di rafforzamento con esempi pratici e avvertenze. Alla fine, avrai un processo ripetibile per distribuire container multi-tenant sicuri.

Passo 1: Esegui i Container come Utente Non Root

Per impostazione predefinita, i container Docker vengono eseguiti come root. Se un container viene compromesso, l'attaccante ottiene privilegi di root all'interno del container e può tentare una fuga. Per prima cosa, crea un utente dedicato nel tuo Dockerfile e passa a esso:

FROM ubuntu:22.04
RUN useradd -m appuser
USER appuser

Avvertenza: Alcuni processi (ad esempio, il binding a porte < 1024) richiedono root. In questi casi, usa il flag --cap-add per concedere solo la capacità necessaria, come --cap-add=NET_BIND_SERVICE, ed esegui comunque il processo sotto un utente non root.

Per maggiori informazioni sull'isolamento di base, consulta la nostra guida su raggiungere un vero isolamento multi-tenant in Docker.

Passo 2: Rimuovi Tutte le Capacità Linux e Aggiungi Solo Quelle Necessarie

Le capacità Linux suddividono i privilegi di root in piccole unità. I container Docker vengono forniti con un insieme predefinito di capacità troppo permissive per l'hosting multi-tenant. Rimuovile tutte e aggiungi solo quelle richieste dalla tua applicazione:

docker run --cap-drop=ALL --cap-add=NET_BIND_SERVICE my-app

Capacità comuni da evitare: SYS_ADMIN (fuga dal container), NET_RAW (sniffing di pacchetti), SYS_PTRACE (debug di processi). Usa docker run con --security-opt no-new-privileges per impedire l'escalation dei privilegi tramite binari setuid.

Passo 3: Monta il Filesystem Root in Sola Lettura

Gli attaccanti spesso scrivono script malevoli nel filesystem del container. Rendendo il filesystem root in sola lettura, lo impedisci:

docker run --read-only --tmpfs /tmp:rw,noexec,nosuid,size=64m my-app

--tmpfs crea un mount scrivibile temporaneo per directory come /tmp e /var/run. Il flag noexec impedisce l'esecuzione da quel mount. Questo approccio costringe gli attaccanti a passare attraverso directory scrivibili, che puoi monitorare.

Passo 4: Imponi Limiti di Risorsa con i cgroup

I container senza limiti possono effettuare attacchi denial-of-service esaurendo la memoria o la CPU dell'host. Usa i vincoli di runtime di Docker:

docker run --memory=512m --memory-swap=512m --cpus=0.5 --pids-limit=100 my-app
  • --memory e --memory-swap impostano limiti rigidi (nessuno swap).
  • --cpus limita la CPU.
  • --pids-limit previene le fork bomb limitando il numero di processi.

Avvertenza: I limiti di risorse sono imposti dai cgroup, ma non impediscono l'esfiltrazione dei dati tramite rete. Combina con l'isolamento di rete (passo successivo).

Passo 5: Segmenta le Reti con Reti Personalizzate di Docker

Per impostazione predefinita, i container Docker condividono una rete bridge. In una configurazione multi-tenant, devi isolare lo stack di rete di ogni tenant. Crea una rete dedicata per ogni tenant:

docker network create tenant-alpha --internal
docker run --network tenant-alpha my-app

Usa il flag --internal per bloccare l'accesso a Internet in uscita, quindi esponi solo le porte necessarie tramite -p. Per una segmentazione di rete più avanzata, considera proteggere le app web con isolamento Docker.

Avvertenza: Le reti interne impediscono la comunicazione diretta container-container tra tenant, ma possono comunque verificarsi perdite DNS se usi la rete host. Attieniti a reti bridge o overlay.

Passo 6: Applica Profili Seccomp e AppArmor

Seccomp filtra le chiamate di sistema, e AppArmor (o SELinux) impone controlli di accesso obbligatori. Docker fornisce un profilo seccomp predefinito che blocca syscall pericolose come clone con certi flag. Per un isolamento più stretto, crea un profilo personalizzato:

docker run --security-opt seccomp=./custom.json --security-opt apparmor=docker-default my-app

Puoi generare un profilo di base con docker run --rm -it --security-opt seccomp=unconfined my-app strace -c -S time e poi ridurlo. Avvertenza: Profili eccessivamente restrittivi possono rompere funzionalità legittime. Testa accuratamente in staging.

Passo 7: Considera l'Isolamento Ibrido con Macchine Virtuali

Se i tuoi tenant richiedono un isolamento assoluto (ad esempio, settore regolamentato), esegui i container all'interno di una VM leggera. Strumenti come Sysbox o Kata Containers forniscono una separazione a livello hardware senza sacrificare la velocità dei container. Questo è l'approccio utilizzato da Docker Enhanced Container Isolation (ECI). Sebbene l'overhead sia maggiore rispetto ai container nudi, è molto inferiore rispetto alle VM complete per carico di lavoro.

Per maggiori informazioni sulla scelta del giusto livello di isolamento, leggi progettare un'architettura Docker multi-tenant.

Mettere Tutto Insieme: Una Checklist di Rafforzamento

  1. Costruisci container con utente non root.
  2. Rimuovi tutte le capacità, aggiungi solo le necessarie.
  3. Monta il filesystem in sola lettura con mount scrivibili temporanei.
  4. Imposta limiti di memoria, CPU e PID.
  5. Crea reti Docker isolate per ogni tenant.
  6. Applica profili seccomp e AppArmor personalizzati.
  7. Valuta container VM ibridi per esigenze di alta sicurezza.

Conclusione

Il rafforzamento dei container non è un'operazione una tantum, ma una disciplina continua. I passaggi sopra formano una baseline di sicurezza per l'hosting multi-tenant. Ricorda che nessuna singola misura garantisce la sicurezza; la difesa in profondità è fondamentale. Inizia con le basi: utenti non root e capacità rimosse. Poi aggiungi strati di limiti di risorse e segmentazione di rete. Per i carichi di lavoro più sensibili, combina container con VM. Con questa guida, puoi distribuire con sicurezza ambienti Docker multi-tenant che siano sia efficienti che sicuri.

Sources (5)