Table of Contents
Capire il bisogno di una gestione segreta sicura in Docker
Tuttavia, questo cambiamento ha amplificato la sfida di gestire dati sensibili come chiavi API, credenziali di database e certificati TLS. Hardcoding segreti nelle immagini Docker, impegnandoli nel controllo delle versioni, o passandole come variabili di ambiente normale introduce significativi rischi di sicurezza.
Cos'è HashiCorp Vault?
HashiCorp Vault è uno strumento open source progettato per memorizzare e controllare in modo sicuro l'accesso a gettoni, password, certificati e chiavi di crittografia. Offre un'interfaccia unificata per la gestione dei segreti, la crittografia come servizio e l'accesso basato sull'identità.
- Dynamic Secrets:[] Genera credenziali di breve durata e portata a richiesta (ad esempio, un utente di database con un contratto di locazione 24 ore).
- Leasing e Renewal:[ Ogni segreto ha una durata di locazione; le applicazioni devono rinnovare o riautenticicare, riducendo il raggio di esplosione di un compromesso.
- Rivocazione:[] Se un'applicazione o un utente è compromessa, invalidare istantaneamente i segreti.
- Registrazione audio:[] Registra tutte le richieste di accesso, fornendo una chiara catena di custodia.
- Crittografia come servizio:[] Crittografia e decifra i dati senza esporre le chiavi alle applicazioni.
Il Vault supporta più motori secrets[ (valore chiave, banche dati, PKI, transito, ecc.) e [ metodi di autenticazione[[]] (token, AppRole, Kubernetes, LDAP, ecc.), rendendolo adattabile a quasi tutte le infrastrutture.
Perché usare Vault con Docker?
Integrare Vault con contenitori Docker porta diversi vantaggi rispetto ai metodi di iniezione segreti tradizionali:
- Ritiro di tempo:[] I segreti vengono catturati quando il contenitore inizia o su richiesta, non si cotto mai nell'immagine, eliminando così il rischio di segreti che traducono i registri delle immagini.
- Gestione centralizzata:[] Un singolo cluster Vault gestisce segreti per tutti i servizi containerizzati, riducendo la deriva di configurazione e semplificando la rotazione.
- Credenziali dinamiche:[ Ogni istanza di contenitore può ricevere credenziali uniche, limitate nel tempo. Se un contenitore è compromesso, la credenziale scade rapidamente o può essere revocata centralmente.
- Sentieri uditi:[ Ogni accesso segreto è registrato, aiutando a soddisfare i requisiti di conformità (SOC 2, HIPAA, PCI DSS).
- Accesso basato sulla privacy:[ ACL finiti assicurano che ogni contenitore veda solo i segreti di cui ha bisogno (primo privilegio).
HashiCorp Vault Architettura per container workloads
Prima di immergersi nell'integrazione, è utile capire l'architettura di distribuzione di Vault. Vault viene eseguito come un daemon server con un backend key-value store (Consul, eccd, Raft storage integrato, o cloud-based storage).
Per gli ambienti dei container, Vault è spesso dispiegato in uno dei due modi:
- Vault Server Cluster[[[]] (produzione): richieste di gestione cluster altamente disponibili, sigillate/non sigillate da più contenitori.
- Vault Dev Server[] (sviluppo): Un'istanza mononoda, in memoria con auto-unseal. Ideale per i test locali ma mai per la produzione.
I contenitori interagiscono con Vault tramite l'API HTTP, o un agente sidecar (Agente Vault) che gestisce automaticamente l'autenticazione e l'acquisizione segreta.
Integrazione Vault con Docker: Modelli core
Ci sono diversi modelli provati per iniettare segreti Vault in contenitori Docker. La scelta dipende dal livello di orchestrazione e la maturità operativa.
1. Utilizzo del Vault CLI in Script di Entrypoint
Questo è il modello più semplice. L'immagine del contenitore include il Vault CLI, e uno script di shell entrypoint autentica a Vault, fetches secrets, e li inietta nell'applicazione come variabili di ambiente o file.
# Dockerfile
FROM alpine:latest
RUN apk add --no-cache vault ca-certificates
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
# entrypoint.sh
#!/bin/sh
export VAULT_ADDR="http://vault.example.com:8200"
vault login -method=approle role_id="$ROLE_ID" secret_id="$SECRET_ID"
API_KEY=$(vault kv get -field=api_key secret/myapp)
export API_KEY
exec myapp
Il contenitore riceve e [ come variabili di ambiente (o tramite file montati) Questo approccio richiede al contenitore di avere accesso alla rete a Vault e al binario Vault completo, che aumenta la dimensione dell'immagine.
2. Vault Agent Sidecar
Vault Agent[]]] è un daemon che può autenticare, catturare segreti e renderli in file o modelli. Supporta un modello sidecar dove l'agente corre accanto al contenitore principale nello stesso pod (Kubernetes) o Docker Compose servizio. L'agente rinnova automaticamente le rotazioni e leasing.
# config.hcl for Vault Agent
vault {
address = "http://vault.example.com:8200"
}
auto_auth {
method "approle" {
mount_path = "auth/approle"
config = {
role_id_file_path = "/tmp/role-id"
secret_id_file_path = "/tmp/secret-id"
}
}
}
template {
source = "/tmp/secrets.ctmpl"
destination = "/etc/secrets/app.env"
}
L'agente guarda il modello per le modifiche e re-renders l'output quando i segreti vengono rinnovati.
Docker Swarm ha un sistema segreto integrato, ma memorizzare segreti nei registri di Swarm Raft non può soddisfare le esigenze di conformità. Un driver segreto Vault di terze parti può essere utilizzato per indirizzare le richieste segrete di Swarm a Vault.
4. Integrazione Kubernetes con driver CSI
Per gli utenti Kubernetes, il Vault CSI Provider[] permette di montare i segreti di Vault come volumi. Questo utilizza l'interfaccia di stoccaggio del contenitore (CSI) per montare segreti senza modifiche di applicazione.
Metodi di autenticazione per contenitori
La scelta del metodo di autenticazione giusto è fondamentale per la sicurezza e l'automazione.
- AppRole[]]: Ideale per l'automazione. Il contenitore è dato un [ e un (questo può essere un token avvolto o un altro segreto).
- Kubernetes Auth[[]: Quando si esegue su Kubernetes, Vault può autenticare i pods verificando i token del conto di servizio.
- JWT/OIDC[[]: Adatto per ambienti cloud-native in cui i contenitori hanno gettoni JWT da un provider di identità di fiducia.
- Token[]: Più semplice ma meno sicuro. I gettoni possono essere preconfigurati in tubazioni CI/CD o iniettati tramite orchestrazione.
Segreti dinamici: Il potere reale
Una delle caratteristiche più forti di Vault per i carichi di lavoro Docker è direttidinamici[. Piuttosto che memorizzare le credenziali statiche nel negozio di valore chiave di Vault, Vault può connettersi a un database (PostgreSQL, MySQL, MongoDB) e creare un utente temporaneo sul volo. Il contenitore riceve queste credenziali, lo usa e quando l'utente scade automaticamente.
# Example: Enable PostgreSQL secrets engine
vault secrets enable database
vault write database/config/my-postgres-database \
plugin_name=postgresql-database-plugin \
allowed_roles="my-role" \
connection_url="postgresql://{{username}}:{{password}}@postgres.example.com:5432/myapp" \
username="vault_admin" \
password="super_secret"
vault write database/roles/my-role \
db_name=my-postgres-database \
creation_statements="CREATE USER \"{{name}}\" WITH PASSWORD '{{password}}' VALID UNTIL '{{expiration}}'; GRANT SELECT ON ALL TABLES IN SCHEMA public TO \"{{name}}\";" \
default_ttl="1h" \
max_ttl="24h"
Il contenitore richiede quindi una credenziale: []. Questo restituisce un nome utente/password univoco valido per un'ora.
Migliori Pratiche per Docker + Vault
- Non ci sono segreti di codice rigido nelle immagini. Utilizzare l'iniezione runtime esclusivamente.
- Utilizzare meno privilegi politiche di Vault. Ogni contenitore o servizio dovrebbe essere in grado di leggere solo i propri segreti e percorsi.
- Preferire Vault Agent o sidecars[[]]] per incorporare il Vault CLI in immagini. semplifica la gestione del ciclo di vita e riduce la dimensione dell'immagine.
- Rotate AppRole SecretIDs frequentemente.] Usa [] o token periodici per ridurre al minimo l'esposizione.
- Abilita la registrazione di audit[] in Vault e i registri delle navi in un SIEM centrale.
- Secure Vault stesso:[] Usa TLS per tutte le comunicazioni, non sigillare tramite auto-unseal (KMS, cloud HSM), e limitare l'accesso alla rete a Vault solo agli orchestratori e ai contenitori.
- Il rinnovamento segreto di un altro e con grazia.[ Le applicazioni dovrebbero essere in grado di aggiornare le credenziali senza riavviare.
- Test per scenari di guasto:[] Simulare i tempi di fermo del Vault, le partizioni di rete e la scadenza dei gettoni per garantire le applicazioni degradare con grazia.
- Utilizzare i TTL corti[[] per segreti e gettoni dinamici per limitare l'esposizione se un contenitore è compromesso.
- Considerare uno strato di cache dei segreti[[] (ad esempio, la cache dell'agente Vault) per ridurre il carico su Vault e migliorare le prestazioni per ambienti ad alta quota.
Confronto con le alternative
Mentre Vault è una soluzione leader, vale la pena capire come si confronta con altri approcci:
- Docker Native Secrets[[] (Swarm): Semplice ma limitato ai segreti statici, nessuna generazione dinamica, pista di audit o politiche di grana fine.
- Kubernetes Secrets[[]: Segreti statici di base codificati 64 in eccd. Senza crittografia a riposo (che richiede una configurazione extra) possono essere insicuri.
- Cloud Provider Secret Managers[] (AWS Secrets Manager, Azure Key Vault, GCP Secret Manager): Buona integrazione con i loro ecosistemi ma lock-in. In genere manca di segreti dinamici per database o PKI come flessibile come Vault.
- CyberArk Conjur[[]: Enterprise-focused, forte sulla gestione privilegiata dell'accesso, ma più complesso e costoso di Vault per i casi di uso dei container.
Vault colpisce un equilibrio tra flessibilità open source, ricchezza di funzionalità e supporto di piattaforma ampio, rendendolo una scelta popolare per le implementazioni multi-cloud e ibrido Docker.
Impostazione di un Vault di Produzione-Grade per Docker
- Deploy a Highly Available Vault Cluster[[[]: Utilizzare il grafico ufficiale Vault Helm su Kubernetes, o eseguire Vault in modalità manuale HA con lo storage Raft.
- Configurare l'auto-Unseal[[[]: Utilizzare un cloud KMS (AWS KMS, Azure Key Vault, GCP Cloud KMS) o HSM. Non memorizzare mai le chiavi in rete nello stesso cluster di Vault.
- Abilita dispositivi di controllo[]: Invia log di audit a stdout e un negozio esterno sicuro.
- Impostare politiche e ruoli[[[]]: Creare politiche per ogni servizio (ad esempio ]]).
- Integrate with Orchestration[[]: In Kubernetes, installare il Vault CSI Provider o Vault Injector (mutando webhook). Per crudo Docker, utilizzare Vault Agent sidecar container via Docker Compose.
- Test Dynamic Secrets[[]: Abilitare il motore dei segreti del database e creare ruoli. Verificare che i contenitori possano richiedere e utilizzare le credenziali temporanee.
- Implement CI/CD Integration[[]: Nel vostro pipeline, utilizzare l'API di Vault per fornire token temporanei per ogni fase di costruzione, evitando le credenziali statiche.
Considerazioni di sicurezza oltre lo stoccaggio segreto
Utilizzando Vault riduce il rischio di esposizione segreta, ma non elimina tutti i vettori di attacco:
- Sicurezza dei contenuti[[]: Assicurare che Vault non sia esposto a Internet pubblico.
- Provazione dell'immagine[]: Verificare che le immagini di base e i pacchetti estratti siano da registri di fiducia. Un'immagine compromessa potrebbe esfiltrare i segreti prima dell'iniezione di Vault.
- Monitoraggio in tempo reale[[]: Utilizzare strumenti di sicurezza dei container (Falco, Tracee, AppArmor) per rilevare esecuzioni di processo inattese o accessi ai file.
- Scrate sprawl[[]: Anche con Vault, gli sviluppatori possono ancora codici rigidi segreti nei file ambientali per i test locali.
- Gestione del contratto[[]: Le applicazioni che non riescono a rinnovare le locazioni possono perdere l'accesso in momenti critici.
Caso di utilizzo reale: Microservices con credenziali di database
Considera una piattaforma di e-commerce con 20 microservizi, ciascuna di esse si connette a un database PostgreSQL specifico. Senza Vault, ogni servizio ha un utente/password di database codificato nel suo manifesto di distribuzione o immagine.
- Ogni servizio autentica tramite AppRole o Kubernetes auth.
- Tutti i servizi richiedono credenziali di database dinamiche all'avvio.
- Le credenziali sono valide per 1 ora e rinnovate automaticamente dall'agente Vault.
- Se un servizio è compromesso, l'operatore revoca tutti i suoi contratti attivi in un unico comando.
- I registri di audit del database mostrano utenti temporanei creati, riducendo il raggio di esplosione di eventuali credenziali rubate.
Questo modello riduce la sovraccarico operativo e migliora la postura di sicurezza in modo significativo.
Pitfalls comune e come evitare di loro
- Per la tenuta/unseal Vault:[ In produzione, Vault inizia sigillato.
- Esporre i gettoni dei Vault nei registri:[] Utilizzare la risposta-wrapping o l'agente Vault per evitare i gettoni che appaiono nei registri dei container.
- Scoprire segreti statici e dinamici: Evitare di memorizzare segreti statici di lunga durata nel negozio KV di Vault per i carichi di lavoro dei container.
- Non programmate per il tempo di fermo di Vault:[] Segreti di Cache con il caching TTL-aware, o usate sidecar che possono servire temporaneamente i segreti stanti.
- Overly permissive policy:[] Una politica che concede [ a un container frontend potrebbe esporre le password del database backend.
Conclusioni
Integrando HashiCorp Vault con i contenitori Docker è una migliore pratica per qualsiasi organizzazione seria circa sicurezza, conformità e efficienza operativa. Passando da segreti statici e codici rigidi a un ciclo di vita segreto dinamico e gestito centralmente, si riduce il rischio, semplifica le rotazioni e guadagna piena verificabilità.
Per ulteriori informazioni, consultare la documentazione ufficiale del Vault[], la [] Panoramica dei segreti del Docker[[], e la Guida del fornitore di Vault CSI.