Ansible Vault Tutorial

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?​

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.