Come posso eseguire i playbook di Ansible Azure evitando di archiviare le credenziali nei file?


13

sfondo

  1. Usiamo Ansible per il provisioning e la gestione dell'infrastruttura di Azure. Al momento eseguiamo Ansible "manualmente", ovvero eseguiamo manualmente i playbook per varie attività automatizzate. Nessuna infrastruttura CI.
  2. Probabilmente non pertinente, ma gestiamo il nostro inventario utilizzando script dinamici azure_rm.py.
  3. Siamo incoraggiati ad essere il più sicuri possibile, ad es
    1. Non archiviare le password di Vault in ~/.vault_passo in alcun file locale
    2. Non archiviare i segreti di Azure in ~/.azure/credentials
    3. Non conservare nulla di sicuro in .bashrc.

In uno scenario del genere, ho difficoltà a elaborare una strategia coerente per garantire che i miei playbook possano accedere ai segreti di Azure, seguendo le linee guida sopra.

Domanda

Come posso evitare di archiviare Ansible Vault e le credenziali di Azure sui file, garantendo comunque che i miei playbook possano accedervi?

Quello che ho provato

Finora ho escogitato uno script wrapper che

  1. chiede all'utente la password di Vault
  2. Lo utilizza per decrittografare uno script di Vaulted Shell
  3. Valuta lo script, che carica le variabili di ambiente di Azure nell'ambiente;
  4. Esegue il playbook sull'ambiente che è stato così impostato.

Qualche soluzione migliore (più elegante, meno complicata, più "Ansible") là fuori?


Cosa ti disturba di più in questo flusso di lavoro?
Konstantin Suvorov,

1
@KonstantinSuvorov principalmente è il numero di cerchi che devo saltare per raggiungere quello che mi sembra (almeno per me) un requisito abbastanza comune nelle imprese ad alta compliance.
Vish

Risposte:


8

Password del Vault

Prima di tutto, dovresti familiarizzare con il fatto che il file della password del Vault può essere uno script eseguibile. In questo caso Ansible lo esegue e si aspetta di ricevere la password come output.

Ad esempio, è possibile utilizzare gpg-agento keychainper memorizzare la password effettiva e sbloccarla quando necessario. Maggiori informazioni in questo post del blog: https://benincosa.com/?p=3235

Se sei un po 'paranoico, puoi aggiungere una notifica quando viene chiamato lo script della password, in questo modo:

#!/bin/bash
PARENT_PROCESS=$(ps -p $PPID -o args | tail -n 1)
osascript -e "display notification \"Vault password used by ${PARENT_PROCESS}\" with title \"Ansible\" sound name \"default\""
gpg --batch --use-agent --no-tty --decrypt key.gpg 2>/dev/null

Questo script della password del vault utilizza key.gpgcome chiave effettiva del vault e mostra anche la notifica popup (per MacOS) con il nome del processo principale quando viene utilizzato lo script. L'agente Gpg memorizza nella cache la password per qualche tempo, quindi non è necessario inserire la password ogni volta che avvii il playbook.

Basta impostare il vault_password_file = ./vault_pass.shtuo ansible.cfg.

Ambiente

Hai detto che usi azure_rm.pycome script di inventario dinamico. Ciò significa che devi impostare le credenziali nelle variabili di ambiente prima di avviare ansible-playbook per poterle utilizzare.

Puoi creare due file:

secure_env (crittografato con vault):

export AZURE_SECRET=xxx;export AZURE_SUBSCRIPTION_ID=xxx;

set_env (testo semplice):

echo -n "Setting secure vars... "
eval $(ansible-vault view secure_env)
echo "done."

Quando si apre un nuovo terminale per eseguire le attività di automazione, è necessario eseguire:

source set_env

In questo momento, bash valuta set_enve secure_env(decrittografato tramite ansible-vault). Dopo questo comando hai le credenziali di Azure definite per la shell corrente, quindi puoi eseguire i playbook come al solito:

ansible-playbook provision-my-azure-instances.yml

Quindi, usando questi due approcci, è possibile archiviare key.gpge secure_envnel proprio repository; quindi nella nuova chiamata terminale source set_envuna volta, inserisci una volta la password di gpg (per sbloccare un uso futuro di key.gpg); quindi chiama ansible-playbooktutte le volte che vuoi senza password.


Grazie per la risposta. Fammi provare durante la settimana.
Vish

Quindi il vantaggio principale rispetto al mio approccio originale è che utilizza GPG, il che porta vantaggi nella cache --- giusto? L'approccio ambientale è simile a quello che mi è venuto in mente.
Vish,

1
Dal tuo OP capisco che usi wrapper ogni volta che esegui il playbook. Con l' sourceapproccio puoi impostare l'ambiente una volta per sessione terminale e puoi utilizzare separatamente tutta la gamma di strumenti: ansible-playbook, script di inventario, azzurro, senza alcun wrapper.
Konstantin Suvorov,

Ah, capito. Farò questo alla mia squadra. Accettare la tua risposta come soluzione più conveniente. Grazie per la ricerca e la spiegazione! Inoltre, mi è piaciuto il tuo blog :)
Vish l'

Il principale vantaggio dell'utilizzo di GPG (o di un portachiavi su macOS o Linux) è che ogni membro del team ha la propria autenticazione per sbloccare una chiave privata unica per loro. Questa chiave viene quindi utilizzata per sbloccare la password di Ansible Vault, che è un segreto condiviso. Devi ruotare tutti i tuoi segreti se qualcuno lascia la squadra comunque, inclusa la password Ansible Vault, ma almeno le password GPG / portachiavi non devono cambiare.
RichVel

2

Si prega di leggere https://docs.ansible.com/ansible/2.4/vault.html Da Ansible 2.4 si può usare --vault-id @prompt.

Crittografa un file usando ansible-vault:

ansible-vault encrypt /path/to/encrypted/file

Esegui il playbook e si otterrà:

fatal: [localhost]: FAILED! => {"msg": "A vault password or secret must be
specified to decrypt /path/to/encrypted/file"}

Esistono più opzioni per decrittografare i file, tra cui @prompt:

ansible-playbook some-playbook --vault-id @prompt

chiederà:

Vault password (default):

Dopo aver inserito la password del vault, il playbook dovrebbe avere esito positivo.


1
Leggendo la pagina sembra che ci sia una soluzione lì, ma non riesco a capire usando solo il link. Potresti per favore elaborare?
Vish,

Grazie per l'elaborazione. In effetti, sto richiedendo all'utente una password del Vault, usando l' --ask-vault-passopzione precedente . E non riesco a capire come sostituirlo con --vault-idrisponderebbe alla domanda più grande di un flusso di lavoro migliore.
Vish

Quando mi si rimanda al link che ho fatto vedere una possibilità intrigante: ansible-playbook --vault-id my-vault-password.py. Pensavo che forse avessi una soluzione usando uno script Python :) Sto anche pensando a questo.
Vish
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.