2015-11-01 15 views
14

Microservizi e Cloud sono una cosa. Tutti parlano e scrivono. Personalmente sto pensando molto a questi argomenti: come può essere usato per trarne beneficio? Quali sono le possibili sfide? Come può accelerare lo sviluppo quotidiano? E come gestire tutte le cose? Una domanda che mi dà fastidio da qualche giorno è "Come gestire i segreti in un ambiente Microservice/Cloud?".Come gestire i segreti in un ambiente Microservice/Container/Cloud?

Immagina un'azienda con 150 ingegneri del software e vari team con vari prodotti. Ogni squadra sta creando un software e ogni servizio richiede una quantità di segreti (chiavi API, password, chiavi SSH, qualsiasi cosa). Il modo "vecchio stile" era quello di creare alcuni file di configurazione in un formato ini/yaml/txt e leggerlo da. Le app di 12Factor dicono: esegui per vv.

È possibile impostare vv Env per ogni macchina ei file di configurazione possono essere inseriti anche lì. Questo funziona se hai una mano piena di macchine e la distribuzione è fatta da pochi amministratori di sistema. Una delle regole generali dice: "Non conservare segreti in un repository Git".

Ora arriva il nuovo mondo. Ogni squadra è responsabile dell'applicazione che produce da sé. Devono essere schierati e gestiti dal team. Quindi la nostra azienda si sta spostando in un contenitore e in modalità self-service (ad esempio, Mesos e Marathon o Kubernetes).

Ovviamente, Dockerfiles può impostare anche env vars. E sì, puoi AGGIUNGERE il tuo file di configurazione nel contenitore Docker durante la compilazione. Ma con questo tutti possono accedere ai segreti (ad esempio da altri team). E nessuno sa chi usa questi segreti e fa qualcosa di pericoloso.

Si desidera eseguire la versione dei file Docker. E le applicazioni che vuoi eseguire su Marathon devono essere versionizzate (Git o qualsiasi altra cosa) (e applicate dall'API REST). Quindi dove conservare e gestire tutti i segreti per questi contenitori/app? Perché con framework di schedulazione come Swarm e Machine (per Docker), Mesos e Marathon (utilizzabile anche per Docker) o Kubernetes non sai dove verrà eseguita la tua app. Questo sarà programmato su più macchine. E la maggior parte di questi strumenti non ha autenticazione (di default, naturalmente, questo può essere aggiunto da un proxy Nginx o qualcosa del genere).

Un'idea per gestire i segreti è l'utilizzo di uno strumento come Vault. Ma non ho mai visto il supporto "nativo" in un'app. Lo stesso vale per Blackbox. E non so come la gestione della configurazione possa risolvere questo problema. So che lo chef supporta i databag crittografati, ma non è possibile utilizzare Chef per configurare/costruire i contenitori Docker.

Come gestisci i segreti in un ambiente multi team con diversi ingegneri in un ambiente Microservice/Container/Cloud?

+0

Forse c'è un "modo comunitario" di fare questo o uno standard del settore come farlo? Mi dispiace per una "domanda aperta". C'è una posizione corretta nella rete StackOverflow per discutere qualcosa del genere? O sto solo sbagliato qui? – Andy

+4

Ah, penso di aver perso la foresta per gli alberi su questo. C'è un sacco di rumore su ciò che stai facendo in contrasto con la domanda attuale qui. Hai intenzione di gestire i segreti in microcontainer; potresti pulire la tua domanda quindi è * esplicito *? Un primo accenno lo ha fatto leggere come se fosse basato sull'opinione pubblica. – Makoto

+1

Sono d'accordo con Makoto qui e chiedo a @Andy di chiarire la sua domanda. Così com'è ora, questa domanda è difficile da seguire, ma sospetto che ci sia una buona domanda che ci si nasconde. – Chris

risposta

7

Ci sono diverse soluzioni.

Primo, NON aggiungere all'immagine. Questa è solo una cattiva idea, come hai capito. Se non aggiungi i tuoi segreti al momento della compilazione, devi farlo in fase di esecuzione. Questo ci lascia con alcune opzioni:

  • variabili di utilizzare l'ambiente come suggerito dal 12 Factor App. Dovrai quindi scrivere uno script che popolerà i file di configurazione con i valori di queste variabili all'avvio del contenitore.Funziona, ma non mi piace molto, poiché le variabili di ambiente sono facilmente trapelate (possono essere viste in contenitori collegati e docker inspect e sono spesso incluse nelle segnalazioni di bug). Vedi anche Summon.

  • Utilizzare i volumi. Basta montare il file di configurazione con i segreti in fase di esecuzione. Funziona, ma significa che hai un file con i segreti che giacciono sull'host. Questo diventa più complicato quando non sai su quale host verrà eseguito il tuo contenitore, ad esempio quando utilizzi framework come Swarm e Mesos.

  • Utilizzare un archivio k/v sicuro come Vault/Keywhiz. Come fai notare, dovrai eseguire alcuni script per ottenere i valori nell'applicazione (come con env vars). Devi anche autenticarti in qualche modo sul negozio k/v (potresti voler vedere i driver del volume per Keywhiz e Vault, o usare un token monouso trasmesso tramite un env var).

kubernetes ha già fairly advanced support for secrets, e mi aspetto di vedere altri framework adottano le proprie soluzioni.