Guide pour sécuriser efficacement les secrets de configuration avec Ansible Vault
Sécurisez les secrets Ansible avec les commandes Vault, les fichiers de variables chiffrés, la gestion des mots de passe et une utilisation pratique dans les playbooks.
Guide pour sécuriser efficacement les secrets de configuration avec Ansible Vault
Ansible Vault vous aide à garder les secrets de configuration hors du texte brut tout en utilisant les variables Ansible normales. Si vos playbooks contiennent des mots de passe de base de données, des clés API ou des clés privées, les commiter non chiffrés peut transformer une fuite de dépôt banale en un incident d'infrastructure.
Ansible Vault chiffre des fichiers de variables structurés ou des valeurs individuelles et les déchiffre uniquement lorsqu'Ansible dispose du mot de passe du coffre. Ce guide présente les commandes que vous utiliserez réellement, comment charger des variables chiffrées dans les playbooks et où les équipes commettent généralement des erreurs.
Comprendre les concepts de base d'Ansible Vault
Ansible Vault utilise un chiffrement symétrique fort (AES256) pour protéger les données. Le mécanisme central nécessite un Mot de passe Vault qui agit comme la clé maîtresse. Ce mot de passe doit être fourni à Ansible chaque fois qu'il a besoin d'accéder ou de modifier du contenu chiffré.
Pourquoi utiliser Ansible Vault ?
- Sécurité : Garde les données sensibles chiffrées au repos, protégeant contre les violations de dépôt.
- Conformité : Aide à respecter les normes industrielles (ex. : PCI DSS, SOC 2) exigeant le chiffrement des identifiants.
- Flux de travail : Permet de commiter en toute sécurité des fichiers de configuration contenant des secrets dans des systèmes de contrôle de version (comme Git).
Commandes essentielles d'Ansible Vault
La commande ansible-vault est un utilitaire autonome utilisé pour gérer les fichiers chiffrés en dehors d'une exécution de playbook.
1. Créer un nouveau fichier chiffré
Pour créer un nouveau fichier destiné aux secrets, utilisez la commande create. Cela vous invite immédiatement à saisir un nouveau mot de passe du coffre, puis ouvre le fichier dans votre éditeur de texte par défaut ($EDITOR).
ansible-vault create secrets/db_passwords.yml
Exemple de contenu (db_passwords.yml après sauvegarde) :
# Ce fichier est chiffré
db_user: app_admin
db_pass: MotDePasseHautementSécurisé123!
api_key: abc-123-def-456
Après avoir sauvegardé et fermé l'éditeur, le contenu est chiffré et le fichier est prêt à être commité dans le contrôle de version.
2. Afficher le contenu chiffré
Si vous devez inspecter rapidement le contenu d'un fichier chiffré sans le modifier, utilisez la commande view. Vous serez invité à saisir le mot de passe du coffre.
ansible-vault view secrets/db_passwords.yml
3. Modifier un fichier chiffré existant
La commande edit est le principal moyen de modifier les secrets. Ansible déchiffre le fichier, l'ouvre dans votre éditeur et, lors de la sauvegarde, le rechiffre automatiquement.
ansible-vault edit secrets/db_passwords.yml
Astuce : Assurez-vous que votre variable d'environnement
$EDITORest correctement définie (ex. :export EDITOR=vim) pour une expérience d'édition fluide.
4. Chiffrer et déchiffrer des fichiers existants
Si vous avez un fichier texte brut existant qui doit être sécurisé, utilisez la commande encrypt. Inversement, decrypt est utilisé pour ramener un fichier chiffré en texte brut (à utiliser avec prudence, généralement pour une migration).
# Chiffrer un fichier existant
ansible-vault encrypt plain_vars.yml
# Déchiffrer un fichier chiffré existant (Dangereux ! Utiliser uniquement si nécessaire)
ansible-vault decrypt secured_vars.yml
5. Changer le mot de passe du coffre (Rekey)
Pour mettre à jour le mot de passe maître d'un fichier chiffré, utilisez la commande rekey. Cela nécessite de fournir le mot de passe actuel, puis d'en définir un nouveau.
ansible-vault rekey secrets/db_passwords.yml
Ceci est essentiel pour les rotations de sécurité ou lors de la transition vers un nouveau système de gestion des identifiants.
Intégrer les secrets chiffrés dans les playbooks Ansible
Une fois les fichiers chiffrés, vous avez besoin d'une méthode pour les charger lors de l'exécution du playbook et fournir le mot de passe du coffre nécessaire.
Charger des variables chiffrées
Les fichiers de variables chiffrées sont chargés comme n'importe quel autre fichier de variables, généralement en utilisant la directive vars_files dans votre playbook.
Exemple de playbook (site.yml) :
---
- name: Déployer une application nécessitant des secrets de base de données
hosts: serveurs_web
vars_files:
- secrets/db_passwords.yml # Ansible détecte automatiquement que c'est chiffré
tasks:
- name: Assurer que l'utilisateur de la base de données est configuré
ansible.builtin.template:
src: config.j2
dest: /etc/app/config.conf
mode: '0600'
# Les variables comme {{ db_user }} et {{ db_pass }} sont maintenant disponibles
Fournir le mot de passe du coffre lors de l'exécution
Ansible offre plusieurs méthodes sécurisées pour fournir le mot de passe du coffre sans l'exposer dans l'historique ou les scripts.
Méthode 1 : Invite interactive
La méthode la plus simple consiste à utiliser le drapeau --ask-vault-pass, qui invite l'utilisateur à saisir le mot de passe de manière sécurisée lors de l'exécution.
ansible-playbook site.yml --ask-vault-pass
Méthode 2 : Utiliser un fichier de mot de passe
Pour l'automatisation, les pipelines CI/CD ou les environnements où les invites interactives ne sont pas souhaitables, vous pouvez utiliser un fichier de mot de passe en texte brut (souvent stocké en dehors du dépôt principal et sécurisé par des permissions de fichier restrictives).
# Remarque : Le fichier de mot de passe doit contenir UNIQUEMENT le texte du mot de passe du coffre.
ansible-playbook site.yml --vault-password-file ~/.ansible/vault_key.txt
Méthode 3 : Chiffrer des variables uniques (encrypt_string)
Si vous avez seulement besoin de chiffrer une seule petite variable (ex. : dans un fichier inventory) plutôt qu'un fichier YAML entier, utilisez ansible-vault encrypt_string.
# Utilisez 'echo' ou 'printf' pour passer le secret directement
ansible-vault encrypt_string 'MaCléAPISuperSecrète' --name 'prod_api_key'
Cette commande produit la chaîne chiffrée qui peut être collée directement dans un fichier d'inventaire ou de variables :
prod_api_key: !vault |
$ANSIBLE_VAULT;1.1;AES256
37666236613364656165386638323438646132646337326462613134373463353434613861313361
... (reste des données chiffrées)
Meilleures pratiques pour la gestion d'entreprise du coffre
Une gestion efficace des secrets va au-delà du simple chiffrement d'un fichier. L'adoption de ces meilleures pratiques garantit la sécurité et la maintenabilité :
1. Fichier de mot de passe dédié
Utilisez toujours la méthode --vault-password-file dans les environnements automatisés. Le fichier contenant le mot de passe doit avoir des permissions extrêmement restrictives (chmod 400) et ne doit jamais être commité dans Git.
2. Ségrégation des environnements
Utilisez des fichiers de coffre séparés pour différents environnements (Développement, Préproduction, Production). Cela empêche les environnements à faible risque d'accéder aux identifiants de production à haut risque.
vars/prod_vault.ymlvars/stage_vault.yml
Chargez ces fichiers de manière conditionnelle en utilisant des groupes d'inventaire ou une logique conditionnelle dans vos playbooks.
3. Utiliser des magasins de secrets externes lorsque le coffre ne suffit pas
Pour les environnements plus vastes, envisagez des magasins de secrets externes comme HashiCorp Vault, AWS Secrets Manager ou la gestion de clés native du cloud. Les plugins de recherche Ansible peuvent récupérer ces valeurs lors de l'exécution, tandis qu'Ansible Vault reste utile pour les petits secrets, les valeurs d'amorçage ou les équipes qui n'ont pas encore de plateforme de secrets dédiée.
4. Variables de groupe vs. Variables de playbook
Il est souvent plus propre de stocker les variables chiffrées sous group_vars ou host_vars en utilisant des noms de fichiers de variables normaux. Ansible déchiffre le contenu chiffré lorsque le fichier est chargé ; l'extension n'est qu'une convention, pas la fonctionnalité qui déclenche le déchiffrement.
# Exemple de structure
inventory/
├── hosts
└── group_vars/
└── serveurs_web/
└── vault.yml
Gardez le coffre pratique
Commencez par chiffrer les secrets que vos playbooks chargent déjà, puis standardisez la façon dont votre équipe fournit le mot de passe du coffre. Gardez le mot de passe du coffre en dehors de Git, séparez les secrets de production des environnements inférieurs et faites pivoter le mot de passe avec ansible-vault rekey lorsque les accès changent.