Ansible Vault Tutorial

Cos’è Ansible: Ansible​ è uno strumento open source per l’a​utomazione.​ 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 Y​AML​ di scrivere su semplici file di testo le ​configurazioni​ necessarie per il p​rovisioning​, 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 A​nsible 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 n​ascoste​ da occhi m​aliziosi​ 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 g​ithub.​ 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 i​nformazioni​ sensibili tenendole n​ascoste​ in ogni caso da occhi indiscreti. E voi avete esperienze ​Ansible​ da c​ondividere?​