Guida per proteggere in modo efficace i segreti di configurazione con Ansible Vault
Ansible è un potente motore di automazione, ma la gestione di dati sensibili come password di database, chiavi API e chiavi SSH private richiede robuste misure di sicurezza. Archiviare queste credenziali in chiaro all'interno del repository di codice è un rischio di sicurezza maggiore, che viola gli standard di conformità e le best practice.
Ansible Vault offre una soluzione abilitando la crittografia di file di variabili strutturati o di variabili specifiche, garantendo che i segreti vengano decrittografati solo al momento dell'esecuzione quando necessari ad Ansible. Questa guida fornisce un tutorial pratico, passo dopo passo, sull'integrazione di Ansible Vault nel tuo flusso di lavoro, coprendo i comandi essenziali per la gestione di file crittografati e l'utilizzo di tali segreti nei tuoi playbook.
Comprensione dei concetti fondamentali di Ansible Vault
Ansible Vault utilizza una forte crittografia simmetrica (AES256) per proteggere i dati. Il meccanismo principale richiede una Password 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 da violazioni del repository.
- Conformità: Aiuta a soddisfare gli standard di settore (ad esempio, PCI DSS, SOC 2) che richiedono la crittografia delle credenziali.
- Flusso di lavoro: Consente ai file di configurazione contenenti segreti di essere archiviati in modo sicuro 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. Creazione di un nuovo file Vaultato
Per creare un nuovo file specificamente destinato ai segreti, utilizza il comando create. Questo ti richiederà immediatamente una nuova password vault e aprirà 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: HighlySecurePassword123!
api_key: abc-123-def-456
Dopo aver salvato e chiuso l'editor, il contenuto viene crittografato e il file è pronto per essere archiviato nel controllo versione.
2. Visualizzazione del contenuto crittografato
Se hai bisogno di ispezionare rapidamente il contenuto di un file vaultato senza modificarlo, utilizza il comando view. Ti verrà richiesta la password vault.
ansible-vault view secrets/db_passwords.yml
3. Modifica di un file Vaultato esistente
Il comando edit è il modo principale per modificare i segreti. Ansible decrittografa il file, lo apre nel tuo editor e, al salvataggio, lo crittografa nuovamente automaticamente.
ansible-vault edit secrets/db_passwords.yml
Suggerimento: Assicurati che la tua variabile d'ambiente
$EDITORsia impostata correttamente (ad esempio,export EDITOR=vim) per un'esperienza di modifica fluida.
4. Crittografia e decrittografia di file esistenti
Se hai un file di testo normale esistente che necessita di essere protetto, usa il comando encrypt. Al contrario, decrypt viene utilizzato per riportare un file crittografato a testo normale (usato con cautela, solitamente per migrazioni).
# Crittografa un file esistente
ansible-vault encrypt plain_vars.yml
# Decrittografa un file vaultato esistente (Pericoloso! Usare solo se necessario)
ansible-vault decrypt secured_vars.yml
5. Modifica della password Vault (Rekey)
Per aggiornare la password master di un file vaultato, usa il comando rekey. Questo richiede di fornire la password corrente e quindi impostarne una nuova.
ansible-vault rekey secrets/db_passwords.yml
Questo è essenziale per le rotazioni di sicurezza o durante la transizione a un nuovo sistema di gestione delle credenziali.
Integrazione dei segreti Vaultati nei Playbook Ansible
Una volta che i file sono crittografati, è necessario un metodo per caricarli durante l'esecuzione del playbook e fornire la password vault necessaria.
Caricamento di variabili crittografate
I file di variabili crittografate vengono caricati proprio come qualsiasi altro file di variabili, tipicamente utilizzando la direttiva vars_files nel tuo playbook.
Esempio di Playbook (site.yml):
---
- name: Deploy applicazione che richiede segreti del database
hosts: webservers
vars_files:
- secrets/db_passwords.yml # Ansible rileva automaticamente che è vaultato
tasks:
- name: Assicurati che l'utente del database sia configurato
ansible.builtin.template:
src: config.j2
dest: /etc/app/config.conf
mode: '0600'
# Variabili come {{ db_user }} e {{ db_pass }} sono ora disponibili
Fornire la password Vault durante l'esecuzione
Ansible offre diversi metodi sicuri per fornire la password vault senza esporla nella cronologia o negli script.
Metodo 1: Prompt Interattivo
Il metodo più semplice è utilizzare il flag --ask-vault-pass, che richiede all'utente la password in modo sicuro al momento dell'esecuzione.
ansible-playbook site.yml --ask-vault-pass
Metodo 2: Utilizzo di un file password
Per l'automazione, le pipeline CI/CD o gli ambienti in cui i prompt interattivi non sono desiderabili, puoi utilizzare un file password in chiaro (spesso archiviato al di fuori del repository principale e protetto tramite permessi di file restrittivi).
# Nota: Il file password DEVE contenere SOLO il testo della password vault.
ansible-playbook site.yml --vault-password-file ~/.ansible/vault_key.txt
Metodo 3: Crittografia di singole variabili (encrypt_string)
Se hai bisogno di crittografare solo una singola variabile piccola (ad esempio, in un file inventory) invece di un intero file YAML, usa ansible-vault encrypt_string.
# Usa 'echo' o 'printf' per passare il segreto direttamente
ansible-vault encrypt_string 'MySuperSecretAPIKey' --name 'prod_api_key'
Questo comando restituisce la stringa crittografata che può essere incollata direttamente in un file di inventario o di variabili:
prod_api_key: !vault |
$ANSIBLE_VAULT;1.1;AES256
37666236613364656165386638323438646132646337326462613134373463353434613861313361
... (resto dei dati crittografati)
Best Practice per la gestione di Vault aziendali
La gestione efficace dei segreti va oltre la semplice crittografia di un file. L'adozione di queste best practice garantisce sicurezza e manutenibilità:
1. File di password Vault dedicato
Utilizza 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 archiviato in Git.
2. Segregazione degli ambienti
Utilizza file vault separati per diversi ambienti (Sviluppo, Staging, Produzione). Ciò impedisce agli ambienti a basso rischio di accedere alle credenziali di produzione ad alto rischio.
vars/prod_vault.ymlvars/stage_vault.yml
Carica questi file condizionalmente utilizzando gruppi di inventario o logica condizionale nei tuoi playbook.
3. Integrazione con Plugin di Lookup
Per una sicurezza avanzata, integra Ansible Vault con sistemi esterni di gestione dei segreti (ad esempio, HashiCorp Vault, AWS Secrets Manager) utilizzando i plugin lookup di Ansible. Ciò ti consente di delegare completamente la gestione delle chiavi a uno strumento specializzato, utilizzando Ansible Vault solo per segreti di base o per il bootstrap.
4. Variabili di gruppo vs. Variabili di Playbook
È spesso più pulito archiviare le variabili vaultate utilizzando group_vars/all.yml.vault o group_vars/<nome_gruppo>.yml.vault. Ansible tenta automaticamente di decrittografare i file che terminano con .vault quando carica variabili per quel gruppo o host, semplificando la struttura del playbook.
# Esempio di struttura
inventory/
├── hosts
└── group_vars/
└── webservers.yml.vault
Conclusione
Ansible Vault è un componente obbligatorio di qualsiasi distribuzione Ansible sicura. Crittografando i dati sensibili a riposo e utilizzando file password o prompt interattivi, garantisci che la tua automazione rimanga potente rispettando al contempo gli standard di sicurezza critici. Padroneggiare i comandi principali — create, edit e rekey — e integrare i file vaultati in modo fluido tramite vars_files consente ai team di sviluppo di collaborare in modo sicuro alla configurazione dell'infrastruttura senza esporre credenziali critiche.