Container in produzione con processo principale che gira come root. Dockerfile con credenziali hardcoded nell’ENV. Immagine basata su Ubuntu full con 247 vulnerabilità note. Tutto in produzione da 8 mesi. Questo non è un esercizio teorico, ma uno scenario reale, purtroppo comune, che ho riscontrato in diversi ambienti. L’adozione di Docker e dei container ha rivoluzionato il modo in cui sviluppiamo e distribuiamo le applicazioni, offrendo agilità e scalabilità senza precedenti. Tuttavia, questa flessibilità porta con sé nuove e complesse sfide di sicurezza che, se ignorate, possono esporre l’intera infrastruttura a rischi significativi. Molte organizzazioni si concentrano sulla velocità di deployment, sacrificando, spesso inconsciamente, le best practice di sicurezza fondamentali. La conseguenza è un ambiente containerizzato che, all’apparenza efficiente, è in realtà un colabrodo per potenziali attacchi. Questa guida approfondisce le 10 best practice di sicurezza Docker più critiche e, troppo spesso, ignorate, fornendo indicazioni pratiche per proteggere i tuoi ambienti di produzione.
Prerequisiti / Ambiente di test
Per seguire questa guida, avrai bisogno di un ambiente Linux con Docker installato e funzionante (versione 25.x o superiore). Tutti i comandi sono stati testati su Ubuntu Server 24.04 LTS. Familiarità con i concetti base di Docker e della riga di comando Linux sono consigliate. Assicurati di avere i permessi di sudo o di essere parte del gruppo docker.
1-2. Image Hardening: Basi Minimali e Scansione Continua
La sicurezza di un container inizia dalla sua immagine base. Utilizzare immagini minimali come Alpine Linux o quelle Distroless di Google riduce drasticamente la superficie d’attacco, eliminando pacchetti e dipendenze non necessarie. Ogni software aggiuntivo è un potenziale vettore di vulnerabilità. Evitare il tag :latest è cruciale; preferisci tag specifici come node:16-alpine per garantire riproducibilità e stabilità. Una volta scelta l’immagine base, la scansione delle vulnerabilità deve diventare una pratica standard nella tua CI/CD pipeline. Strumenti come Docker Scout (integrato in Docker Desktop e CLI) o trivy possono identificare CVE noti.
Esempio di scansione con docker scout:
docker scout cves myimage:latest
Questa analisi fornisce un report dettagliato sulle vulnerabilità presenti nell’immagine, permettendoti di intervenire prima che un’immagine vulnerabile raggiunga la produzione. Secondo il Snyk Container Security Report 2024, il 75% delle immagini Docker in produzione contiene almeno una vulnerabilità critica o ad alto rischio.
3-4. Runtime Security: Utente Non-Root e Filesystem Read-Only
Un errore comune è eseguire i processi all’interno del container come utente root. Questo concede al processo privilegi elevati che, in caso di compromissione, possono essere sfruttati per attaccare l’host. Configura il Dockerfile per creare un utente non-root e usalo per eseguire l’applicazione. Se un’applicazione necessita di accedere a porte privilegiate (<1024), puoi usare setcap o un reverse proxy.
Esegui un container come utente non-root:
docker run --user 1000:1000 myimage
Un’altra best practice fondamentale è rendere il filesystem del container read-only. Questo impedisce a un attaccante di scrivere file malevoli o modificare configurazioni critiche dopo l’avvio del container. Eventuali dati persistenti devono essere gestiti tramite volumi esterni.
Esegui un container con filesystem read-only:
docker run --read-only myimage
5-6. Rete: Esposizione Minima e Isolamento di Rete
Ogni porta esposta è un potenziale punto di ingresso. Esponi solo le porte strettamente necessarie e abilita il firewall sull’host per limitare ulteriormente gli accessi. Utilizza reti Docker custom (docker network create) per segmentare le tue applicazioni. Questo permette di isolare i container tra loro e dall’host, limitando la propagazione di un attacco. Ad esempio, un database non dovrebbe mai essere direttamente accessibile dall’esterno, ma solo dai container dell’applicazione.
7-8. Secrets Management: Mai in Variabili d’Ambiente
Hardcodare credenziali o inserirle come variabili d’ambiente nel Dockerfile o nei comandi docker run è una pratica estremamente pericolosa. Queste informazioni possono essere facilmente estratte tramite docker inspect o log. Utilizza soluzioni dedicate alla gestione dei segreti come Docker Secrets (per Docker Swarm), Kubernetes Secrets, o soluzioni esterne e più robuste come HashiCorp Vault. Questi strumenti offrono meccanismi per iniettare i segreti in modo sicuro nel container al runtime, cifrati e senza lasciarli in chiaro.
Verifica la configurazione di un container (attenzione ai segreti esposti):
docker inspect <container> | jq '.[].HostConfig'
9-10. Logging, Monitoring e Aggiornamento Automatico Immagini
Un sistema di logging centralizzato e un monitoring proattivo sono essenziali per identificare e rispondere rapidamente a potenziali incidenti di sicurezza. Integra i log dei tuoi container con soluzioni come ELK Stack o Grafana Loki. Monitora le metriche di utilizzo delle risorse e gli eventi di sicurezza. Infine, un piano di aggiornamento delle immagini è vitale. Le vulnerabilità vengono scoperte continuamente; automatizza il processo di re-build e re-deployment delle immagini quando le basi vengono aggiornate o nuove patch di sicurezza sono disponibili. Questo può essere integrato nella tua pipeline CI/CD.
Docker Bench Security: Audit Automatico in 2 Minuti
Per una valutazione rapida e automatizzata della sicurezza del tuo host Docker, puoi utilizzare Docker Bench for Security. Questo script open-source verifica decine di best practice di sicurezza basate sulla CIS Docker Benchmark. È un ottimo punto di partenza per identificare le aree di miglioramento.
Esegui Docker Bench Security:
docker run --rm --net host --pid host --userns host --cap-add audit_control \n -e DOCKER_CONTENT_TRUST=$DOCKER_CONTENT_TRUST \n -v /etc:/etc:ro -v /usr/bin/containerd:/usr/bin/containerd:ro \n docker/docker-bench-security
Questo comando avvierà un container che eseguirà una serie di test sull’host Docker, fornendo un report dettagliato con consigli per il hardening.
Errori comuni e troubleshooting
Uno degli errori più comuni è ignorare gli avvisi di docker scout o altri scanner di vulnerabilità. Molti pensano che una vulnerabilità in un pacchetto non utilizzato non sia rilevante, ma un attaccante potrebbe trovare un modo per attivarla. Un altro errore è non limitare le capabilities del container (--cap-drop). Per il troubleshooting, se un container non si avvia con un utente non-root, verifica i permessi sui file e le directory che l’applicazione tenta di leggere/scrivere. Se un container read-only ha problemi, assicurati che i dati persistenti siano montati su volumi esterni scrivibili.
FAQ — Domande Frequenti
Cos’è il Docker Bench for Security e come mi aiuta?
Docker Bench for Security è uno script open-source che automatizza la verifica delle best practice di sicurezza per Docker, basate sul CIS Docker Benchmark. Ti fornisce un report con raccomandazioni specifiche per il hardening del tuo host e dei tuoi container, aiutandoti a identificare e correggere configurazioni insicure.
Qual è la differenza tra Docker Secrets e semplici variabili d’ambiente per i segreti?
Le variabili d’ambiente sono facilmente ispezionabili e possono finire nei log. Docker Secrets, invece, sono gestiti nativamente da Docker Swarm (o Kubernetes Secrets per Kubernetes), cifrati in transito e a riposo, e iniettati nel container come file in memoria, rendendoli molto più sicuri e meno suscettibili a esposizioni accidentali.
Perché è sconsigliato usare il tag :latest per le immagini Docker in produzione?
Il tag :latest è volatile e può puntare a versioni diverse dell’immagine in momenti diversi. Questo rende le build non riproducibili e può introdurre inaspettatamente nuove vulnerabilità o breaking changes. Usare tag specifici (es. my-app:1.2.3) garantisce che l’immagine deployata sia sempre la stessa.
Devo sempre usare immagini Distroless o Alpine?
Non necessariamente, ma sono caldamente raccomandate. Se la tua applicazione ha dipendenze complesse che richiedono una base più completa (es. Debian o Ubuntu), assicurati di rimuovere tutti i pacchetti non essenziali dal Dockerfile e di scansionare regolarmente l’immagine per vulnerabilità. Il compromesso tra dimensione dell’immagine, funzionalità e sicurezza è sempre da valutare.
Conclusioni con takeaway operativi
La sicurezza dei container Docker non è un’opzione, ma una necessità per qualsiasi ambiente di produzione. Implementare queste 10 best practice ti permetterà di ridurre significativamente la superficie d’attacco e mitigare i rischi. Inizia con l’hardening delle immagini, l’esecuzione di processi con privilegi minimi e la gestione sicura dei segreti. Automatizza le scansioni e integra la sicurezza fin dalle prime fasi del ciclo di sviluppo. Non aspettare che un incidente ti costringa ad agire; la proattività è l’unica vera difesa nell’ecosistema containerizzato.
Leggi anche: Active Directory Hardening: 10 Impostazioni Critiche da Verificare Subito (2026)
Leggi anche: Ransomware in Produzione: 48 Ore di Recovery e 7 Lezioni Operative (2026)
Leggi anche: Nginx Reverse Proxy Sicuro: Configurazione HTTPS, Header e Rate Limiting (2026)
Aggiornato: giugno 2026