Ansible Vault Tutorial

Cos’è Ansible: Ansible è uno strumento open source per l’automazione. Fornisce una piattaforma semplice, agentless e potente che permette di automatizzare tutti i processi di una infrastruttura indipendentemente dal tipo di infrastruttura stessa e dal tipo di processo. (Per una introduzione più dettagliata rimando alla guida precedente: Introduzione ad Ansible) PROBLEMA: Ansible permette, attraverso l’uso di semplici file in formato YAML di scrivere su semplici file di testo le configurazioni necessarie per il provisioning, tra le altre cose, della nostra infrastruttura. Tali configurazioni possono -o sarebbe meglio dire devono- essere versionate su un sistema di tipo DCVS. A questo punto però sorge un problema: come facciamo a tenere nascoste informazioni sensibili, come le chiavi ssh ad esempio? SOLUZIONE: Ansible risponde in maniera ottimale a questo problema grazie ad Ansible Vault: un meccanismo che permette di criptare e decriptare le variabili di un playbook automaticamente. Usando questa feature di Ansible le nostre informazioni sensibili saranno criptate nel server della nostra azienda, restando nascoste da occhi maliziosi ma comunque perfettamente accessibili ed usabili dai nostri sistemi. HANDS ON: Per prima cosa creiamo il file contenente la password con cui andremo a criptare le nostre variabili: tale file non dovrà essere versionato ma è importante che venga conservato lontano da occhi indiscreti, perché permette di decriptare le informazioni che vogliamo tenere nascoste. echo “MyVeryComplicatedLongPassword“ > ~/.vault_pass.txt chmod 600 ~/.vault_pass.txt “~/.vault_pass.txt” contiene ora la nostra password che useremo per criptare le informazioni sensibili.  Successivamente seguendo le best practice creiamo 2 file contenenti uno le variabili che andremo ad usare e l’altro i corrispettivi valori criptati: → cat group_vars/localhost/vars.yml --- my_secret_key: “{{ vault_my_secret_key }}“ → cat group_vars/localhost/vault.yml --- vault_my_secret_key: VerySecretValue “vars.yml” contiene la variabile che useremo nel nostro playbook mentre “vault.yml” contiene il valore corretto che andremo a criptare. Criptiamo “vault.yml”: → ansible-vault encrypt group_vars/localhost/vault.yml --vault-password-file ~/.vault_pass.txt Encryption successful → head -n3 group_vars/localhost/vault.yml $ANSIBLE_VAULT;1.1;AES256 3237356333336666353533356334303539653039623464373133373962663530663933313 4313965 6664326664393537356334323539663333366237633863390a64366134393130363834353 6373735 Possiamo vedere che il file contenente le variabili con valori sensibili è stato criptato permettendoci di caricarlo su un repository pubblico. Scriviamo ora un semplice playbook per testare il corretto funzionamento ed un relativo ruolo: → cat provision.yml ---  - name: Deploy keys hosts: localhost connection: local gather_facts: no roles: - { role: deploy-keys } vars_files: - 'group_vars/localhost/vars.yml' - 'group_vars/localhost/vault.yml' → cat roles/deploy-keys/tasks/main.yml --- # tasks file for deploy-keys - name: Copy keys in the tmp directory on the remote server. copy: content: “{{ my_secret_key }}“ dest: /tmp/keys.txt Questo semplice playbook copia il contenuto della variabile “my_secret_key” in un file “/tmp/keys.txt”. Ricordiamoci che quest’ultima variabile punta a quella criptata. Eseguiamo ora il playbook: → ansible-playbook provision.yml --vault-password-file ~/.vault_pass.txt [WARNING]: provided hosts list is empty, only localhost is available PLAY [Deploy keys] ************************************************************* TASK [deploy-keys : Copy keys in the tmp directory on the remote server.] ****** changed: [localhost] PLAY RECAP ********************************************************************* localhost : ok=1 changed=1 unreachable=0 failed=0 E controlliamo che il file sia stato creato correttamente: → cat /tmp/keys.txt VerySecretValue Se abbiamo bisogno di modificare la nostra variabile criptata nessun problema: → ansible-vault decrypt group_vars/localhost/vault.yml --vault-password-file ~/.vault_pass.txt Decryption successful → cat group_vars/localhost/vault.yml --- vault_my_secret_key: VerySecretValue Ricordiamoci solo di criptare nuovamente il file una volta finito. Ansible Vault ci mette a disposizione una serie di comandi per gestire al meglio il nostro file criptato: [create|decrypt|edit|encrypt|rekey|view]. Il codice di questo tutorial è disponibile su github. CONCLUSIONI: Ansible è uno strumento estremamente semplice ma potente la cui versatilità ci permette di sviluppare ed ottimizzare le nostre procedure in tutta sicurezza. In questo tutorial abbiamo imparato come usare la caratteristica di Ansible Vault per versionare playbook contenenti informazioni sensibili tenendole nascoste in ogni caso da occhi indiscreti. E voi avete esperienze Ansible da condividere?
Realizziamo qualcosa di straordinario insieme!
Siamo consulenti prima che partner, scrivici per sapere quale soluzione si adatta meglio alle tue esigenze. Potremo trovare insieme la soluzione migliore per dare vita ai tuoi progetti.