Passando i segreti a un contenitore Docker


26

Ho un'immagine docker di base che viene utilizzata per eseguire il software di analisi delle immagini. Per ogni contenitore creato dall'immagine, esiste una serie di impostazioni di configurazione, alcuni dei quali sono segreti (chiavi di crittografia, informazioni sui clienti, ecc.) Che vengono utilizzati dal software per analizzare e distribuire le immagini elaborate. Come posso passare in sicurezza questi segreti a un container?


Hashicorp Vault
030

Risposte:


23

Esistono 3 metodi per ottenere segreti per un'app all'interno di un contenitore finestra mobile. I primi 2 riguardano la configurazione della finestra mobile. L'ultimo è avere le tue app per recuperare direttamente i segreti da un negozio segreto.

1 - Variabili d'ambiente

Secondo la guida "The 12 Factor App" , i segreti non sono altro che una configurazione e devono sempre essere impostati nell'ambiente. Puoi impostare i tuoi segreti come variabili di ambiente durante l'esecuzione della finestra mobile e la tua app li accede da lì.

2 - Volumi montati

Potresti avere i tuoi segreti tutti all'interno di un particolare file di configurazione / segreti, quindi montarli sulla tua istanza come volume montato .

3 - Recupera dall'archivio segreto

Come menzionato @ 030, puoi usare Hashicorp Vault (o "Amazon Secrets Manager", o qualsiasi altro servizio simile).
La tua app o un'app sidecar può recuperare direttamente i segreti di cui ha bisogno, senza dover gestire alcuna configurazione sul contenitore Docker. Questo metodo consentirebbe di utilizzare i segreti creati dinamicamente (una caratteristica molto interessante di tali sistemi) e senza doversi preoccupare che i segreti siano visualizzabili dal file system o dall'ispezione delle variabili env del contenitore docker.

Opinione personale

Credo che le variabili env siano la strada da percorrere. È più facile da gestire e puoi ancora estrarre da un negozio segreto come Hashicorp Vault, se hai il tuo sistema di compilazione CI, tira i segreti durante la compilazione e impostali durante la distribuzione. Ottieni il meglio da entrambi i mondi e l'ulteriore vantaggio dei tuoi sviluppatori che non hanno bisogno di scrivere il codice dell'applicazione per recuperare i segreti. Gli sviluppatori dovrebbero concentrarsi sulla funzionalità del loro codice e non occuparsi delle attività di amministrazione come il recupero delle password.

Il codice dell'applicazione deve essere incentrato sulla sua stessa funzionalità dell'app e non deve occuparsi di attività di back-end come il recupero delle password. Proprio come afferma l'app 12 Factor.

Modifica: modifica l'ultima frase per rimuovere le implicazioni del silo-ing Developer vs SysAdmin. I compiti stessi dovrebbero essere separati dal punto di vista del codice, ma DevOps riguarda le stesse persone tenendo a mente entrambi e non essere limitati.

Opinione personale (aggiornamento)

L'eccellente commento di Per @ Dirk ( passare i segreti a un container Docker ), vi è un argomento molto forte per dare la priorità a un negozio segreto rispetto ai variatori ENV, a causa del fatto che non vogliono perderli.


2
Questo promuove i silos. DevOps sta facendo le cose insieme invece di gettarle sul muro.
030

2
Il codice dovrebbe essere rimosso dai componenti dell'infrastruttura. Le persone reali potrebbero codificare sia l'automazione dell'infrastruttura sia la base di codice dell'app, ma le attività stesse dovrebbero essere separate. Vedo che l'ultima frase della mia risposta originale era quella di sgridare gli sviluppatori, la gente. Questo è un errore Lo modificherò per essere più chiaro.
BoomShadow

7
Mettere segreti in variabili d'ambiente offre varie possibilità per farli trapelare. Alcuni esempi: chiunque abbia accesso al demone Docker sulla macchina che esegue il contenitore può vederli usando i comandi inspecto exec. Le variabili di ambiente vengono spesso scaricate stdoutnei file di registro o nei file di registro quando vengono eseguite in modalità di debug. Tutti i processi figlio generati possono leggerli ed esporli che potrebbero essere fuori dal tuo controllo. Maggiori informazioni, ad esempio qui: diogomonica.com/2017/03/27/…
Dirk,

1
Sono anche alle prese con questa domanda. La cosa che non capisco è, anche se usi un deposito di credenziali per proteggere i tuoi segreti, devi comunque autenticarti per accedere a quel deposito, e ciò presumibilmente richiede qualche segreto. La stessa preoccupazione si applica all'utilizzo di un file KeyStore protetto da password. Siamo sempre bloccati a trasmettere almeno la "meta credenziale" nell'ambiente?
Wheezil,

1
@Wheezil una meta-credenziale è più facile da proteggere rispetto a molte credenziali specifiche. puoi ruotare frequentemente e automaticamente la meta credenziale. la meta credenziale può andare a un deposito che si trova su un host protetto e può avere cose come la whitelisting ip in modo che accetti solo connessioni dalle sottoreti di produzione. puoi anche assicurarti che il vault utilizzi la crittografia a riposo e la crittografia in volo e il reciproco tsl e il pinning dei certificati e tutte le altre best practice che rendono le cose più sicure.
simbo1905

1

Esiste un'altra opzione che utilizza solo pipe:

docker run -d -i --name $n alpine sh -c 'read A; echo "[$A]"; exec some-server'
docker exec -i $n sh -c 'cat > /proc/1/fd/0' <<< _a_secret_

Innanzitutto, crea il demone docker con -i, il comando si read Abloccherà in attesa dell'input da /proc/1/fd/0; Quindi eseguire il secondo comando docker, leggendo il segreto da stdin e reindirizzare all'ultimo processo di sospensione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.