Guida per proteggere efficacemente i segreti di configurazione con Ansible Vault
Proteggi i segreti di Ansible con comandi Vault, file di variabili crittografati, gestione delle password e utilizzo pratico nei playbook.
Guida per proteggere efficacemente i segreti di configurazione con Ansible Vault
Ansible Vault ti aiuta a mantenere i segreti di configurazione fuori dal testo semplice, utilizzando comunque le normali variabili di Ansible. Se i tuoi playbook contengono password di database, chiavi API o chiavi private, commetterli non crittografati può trasformare una normale fuga di repository in un incidente infrastrutturale.
Ansible Vault crittografa file di variabili strutturati o valori singoli e li decrittografa solo quando Ansible ha la password del vault. Questa guida mostra i comandi che utilizzerai effettivamente, come caricare variabili protette nei playbook e dove i team solitamente commettono errori.
Comprendere i concetti fondamentali di Ansible Vault
Ansible Vault utilizza una crittografia simmetrica forte (AES256) per proteggere i dati. Il meccanismo principale richiede una Password del Vault che funge da chiave master. Questa password deve essere fornita ad Ansible ogni volta che deve accedere o modificare contenuti crittografati.
Perché usare Ansible Vault?
- Sicurezza: Mantiene i dati sensibili crittografati a riposo, proteggendo dalle violazioni del repository.
- Conformità: Aiuta a soddisfare gli standard di settore (es. PCI DSS, SOC 2) che richiedono la crittografia delle credenziali.
- Flusso di lavoro: Permette di commettere in modo sicuro file di configurazione contenenti segreti nei sistemi di controllo versione (come Git).
Comandi essenziali di Ansible Vault
Il comando ansible-vault è un'utilità standalone utilizzata per gestire file crittografati al di fuori dell'esecuzione di un playbook.
1. Creare un nuovo file protetto
Per creare un nuovo file specificamente destinato ai segreti, usa il comando create. Questo ti chiede immediatamente una nuova password del vault e poi apre il file nel tuo editor di testo predefinito ($EDITOR).
ansible-vault create secrets/db_passwords.yml
Esempio di contenuto (db_passwords.yml dopo il salvataggio):
# Questo file è crittografato
db_user: app_admin
db_pass: PasswordAltamenteSicura123!
api_key: abc-123-def-456
Dopo aver salvato e chiuso l'editor, il contenuto è crittografato e il file è pronto per essere commesso nel controllo versione.
2. Visualizzare il contenuto crittografato
Se devi ispezionare rapidamente il contenuto di un file protetto senza modificarlo, usa il comando view. Ti verrà chiesta la password del vault.
ansible-vault view secrets/db_passwords.yml
3. Modificare un file protetto esistente
Il comando edit è il modo principale per modificare i segreti. Ansible decrittografa il file, lo apre nel tuo editor e, al salvataggio, lo ricrittografa automaticamente.
ansible-vault edit secrets/db_passwords.yml
Suggerimento: Assicurati che la variabile d'ambiente
$EDITORsia impostata correttamente (es.export EDITOR=vim) per un'esperienza di modifica fluida.
4. Crittografare e decrittografare file esistenti
Se hai un file di testo semplice esistente che deve essere protetto, usa il comando encrypt. Al contrario, decrypt viene utilizzato per riportare un file crittografato a testo semplice (usato con cautela, solitamente per la migrazione).
# Crittografa un file esistente
ansible-vault encrypt plain_vars.yml
# Decrittografa un file protetto esistente (Pericoloso! Usa solo se necessario)
ansible-vault decrypt secured_vars.yml
5. Cambiare la password del vault (Rekey)
Per aggiornare la password master per un file protetto, usa il comando rekey. Richiede di fornire la password corrente e poi impostarne una nuova.
ansible-vault rekey secrets/db_passwords.yml
Questo è essenziale per le rotazioni di sicurezza o quando si passa a un nuovo sistema di gestione delle credenziali.
Integrare i segreti protetti nei playbook Ansible
Una volta che i file sono crittografati, hai bisogno di un metodo per caricarli durante l'esecuzione del playbook e fornire la password del vault necessaria.
Caricare variabili crittografate
I file di variabili crittografati vengono caricati come qualsiasi altro file di variabili, tipicamente usando la direttiva vars_files nel tuo playbook.
Esempio di playbook (site.yml):
---
- name: Distribuire applicazione che richiede segreti del database
hosts: webservers
vars_files:
- secrets/db_passwords.yml # Ansible rileva automaticamente che è protetto
tasks:
- name: Assicurarsi che l'utente del database sia configurato
ansible.builtin.template:
src: config.j2
dest: /etc/app/config.conf
mode: '0600'
# Le variabili come {{ db_user }} e {{ db_pass }} sono ora disponibili
Fornire la password del vault durante l'esecuzione
Ansible offre diversi metodi sicuri per fornire la password del vault senza lasciarla esposta nella cronologia o negli script.
Metodo 1: Prompt interattivo
Il metodo più semplice è usare il flag --ask-vault-pass, che chiede all'utente la password in modo sicuro durante l'esecuzione.
ansible-playbook site.yml --ask-vault-pass
Metodo 2: Usare un file di password
Per automazione, pipeline CI/CD o ambienti in cui i prompt interattivi non sono desiderabili, puoi usare un file di password in testo semplice (spesso memorizzato al di fuori del repository principale e protetto tramite permessi di file restrittivi).
# Nota: Il file di password DEVE contenere SOLO il testo della password del vault.
ansible-playbook site.yml --vault-password-file ~/.ansible/vault_key.txt
Metodo 3: Crittografare variabili singole (encrypt_string)
Se devi solo crittografare una singola variabile piccola (es. in un file inventory) anziché un intero file YAML, usa ansible-vault encrypt_string.
# Usa 'echo' o 'printf' per passare il segreto direttamente
ansible-vault encrypt_string 'MiaChiaveAPISuperSegreta' --name 'prod_api_key'
Questo comando restituisce la stringa crittografata che può essere incollata direttamente in un file di inventario o variabili:
prod_api_key: !vault |
$ANSIBLE_VAULT;1.1;AES256
37666236613364656165386638323438646132646337326462613134373463353434613861313361
... (resto dei dati crittografati)
Best practice per la gestione enterprise del vault
Una gestione efficace dei segreti va oltre la semplice crittografia di un file. Adottare queste best practice garantisce sicurezza e manutenibilità:
1. File di password del vault dedicato
Usa sempre il metodo --vault-password-file negli ambienti automatizzati. Il file contenente la password dovrebbe avere permessi estremamente restrittivi (chmod 400) e non dovrebbe mai essere commesso in Git.
2. Segregazione degli ambienti
Usa file vault separati per ambienti diversi (Sviluppo, Staging, Produzione). Questo impedisce agli ambienti a basso rischio di accedere a credenziali di produzione ad alto rischio.
vars/prod_vault.ymlvars/stage_vault.yml
Carica questi file condizionalmente usando gruppi di inventario o logica condizionale nei tuoi playbook.
3. Usa archivi segreti esterni quando il vault non è sufficiente
Per ambienti più grandi, considera archivi segreti esterni come HashiCorp Vault, AWS Secrets Manager o sistemi di gestione delle chiavi nativi del cloud. I plugin di lookup di Ansible possono recuperare quei valori durante l'esecuzione, mentre Ansible Vault rimane utile per piccoli segreti, valori di bootstrap o team che non hanno ancora una piattaforma segreta dedicata.
4. Variabili di gruppo vs. variabili di playbook
Spesso è più pulito memorizzare variabili protette sotto group_vars o host_vars usando nomi di file di variabili normali. Ansible decrittografa il contenuto protetto quando il file viene caricato; l'estensione è solo una convenzione, non la caratteristica che attiva la decrittografia.
# Esempio di struttura
inventory/
├── hosts
└── group_vars/
└── webservers/
└── vault.yml
Mantieni il vault pratico
Inizia crittografando i segreti che i tuoi playbook già caricano, poi standardizza il modo in cui il tuo team fornisce la password del vault. Tieni la password del vault fuori da Git, separa i segreti di produzione dagli ambienti inferiori e ruota la password con ansible-vault rekey quando l'accesso cambia.