Contactez-nous

Ansible Vault pour la gestion des secrets

Apprenez à utiliser Ansible Vault pour chiffrer et gérer en toute sécurité les informations sensibles comme les mots de passe, clés API et certificats dans vos projets d'automatisation.

L'impératif de la gestion sécurisée des secrets en automatisation

Dans le monde de l'automatisation et de l'Infrastructure as Code (IaC), nos playbooks Ansible manipulent souvent des informations sensibles. Il peut s'agir de mots de passe pour des bases de données, de clés API pour des services cloud, de clés privées SSH, de certificats SSL, ou de tout autre type de données confidentielles nécessaires au fonctionnement de nos systèmes et applications. Stocker ces "secrets" en clair dans nos playbooks, nos fichiers de variables, ou pire, les commiter dans un système de contrôle de version comme Git, représente une faille de sécurité majeure.

C'est pour répondre à ce besoin crucial de protection des données sensibles qu'Ansible intègre un outil appelé Ansible Vault. Vault permet de chiffrer des fichiers entiers ou des chaînes de caractères spécifiques (variables) au sein de vos projets Ansible. Ces données chiffrées peuvent ensuite être stockées en toute sécurité, y compris dans des dépôts Git partagés. Lors de l'exécution d'un playbook qui utilise des secrets chiffrés, Ansible vous demandera le mot de passe du Vault pour déchiffrer les informations nécessaires à la volée, en mémoire, sans les exposer sur le disque en clair.

L'utilisation d'Ansible Vault est une pratique de sécurité fondamentale pour quiconque utilise Ansible. Elle permet de concilier les avantages de l'IaC (versionnement, collaboration, reproductibilité) avec les exigences de sécurité des informations sensibles.

Fonctionnement et commandes de base d'Ansible Vault

Ansible Vault utilise un chiffrement symétrique (AES256 par défaut) pour protéger vos données. Un mot de passe unique, que vous définissez, est utilisé pour chiffrer et déchiffrer le contenu. L'outil principal pour interagir avec Vault est la commande en ligne ansible-vault.

Voici les opérations les plus courantes :

  • Créer un nouveau fichier chiffré :
    ansible-vault create mon_fichier_secret.yml
    Cette commande vous demandera de définir un mot de passe pour le Vault, puis ouvrira votre éditeur de texte par défaut (configuré via la variable d'environnement $EDITOR) pour que vous puissiez y ajouter du contenu YAML (par exemple, des variables). A la fermeture de l'éditeur, le fichier sera sauvegardé sous forme chiffrée.
  • Chiffrer un fichier existant :
    ansible-vault encrypt mon_fichier_existant.yml
    Cette commande chiffrera un fichier qui était précédemment en clair. Elle vous demandera un mot de passe pour le Vault.
  • Déchiffrer un fichier existant :
    ansible-vault decrypt mon_fichier_secret.yml
    Ceci convertira un fichier chiffré en sa version en clair. Attention : utilisez cette commande avec prudence, car elle expose les secrets sur le disque.
  • Editer un fichier chiffré :
    ansible-vault edit mon_fichier_secret.yml
    C'est la méthode recommandée pour modifier un fichier déjà chiffré. Elle déchiffrera temporairement le fichier, vous permettra de l'éditer, puis le rechiffrera automatiquement à la sauvegarde.
  • Visualiser un fichier chiffré (en clair, temporairement) :
    ansible-vault view mon_fichier_secret.yml
    Affiche le contenu déchiffré du fichier dans votre terminal sans le modifier ni le sauvegarder en clair sur le disque.
  • Changer le mot de passe d'un fichier Vault :
    ansible-vault rekey mon_fichier_secret.yml
    Permet de changer le mot de passe d'un fichier chiffré. Vous devrez fournir l'ancien et le nouveau mot de passe.

Un fichier chiffré par Ansible Vault commence généralement par la ligne $ANSIBLE_VAULT;1.1;AES256 (ou une version similaire), suivie des données chiffrées. Vous pouvez inclure ces fichiers chiffrés dans votre structure de projet Ansible, par exemple dans le répertoire group_vars/, host_vars/, ou comme fichiers de variables inclus via vars_files dans un playbook.

Utiliser des secrets chiffrés dans les Playbooks Ansible

Lorsque vous exécutez un playbook (avec ansible-playbook) qui a besoin d'accéder à des variables stockées dans un fichier chiffré par Vault, Ansible détectera automatiquement que le fichier est chiffré et vous demandera le mot de passe du Vault. Par exemple, si vous avez un fichier group_vars/all/secrets.yml chiffré contenant :

# Contenu de secrets.yml avant chiffrement
api_key: "mon_api_key_super_secrete"
db_password: "MotDePasseTresComplique"

Et que votre playbook utilise ces variables :

- name: Utiliser une clé API
  ansible.builtin.uri:
    url: "https://api.example.com/data"
    headers:
      X-API-Key: "{{ api_key }}"
  # ...

Au lancement du playbook, Ansible vous promptera : Vault password:. Après avoir saisi le bon mot de passe, Ansible déchiffrera secrets.yml en mémoire et les variables api_key et db_password seront disponibles pour vos tâches.

Pour éviter de saisir le mot de passe à chaque exécution, plusieurs options s'offrent à vous :

  • Utiliser l'option --ask-vault-pass : Explicite la demande de mot de passe (c'est le comportement par défaut si des fichiers chiffrés sont détectés).
  • Utiliser un fichier de mot de passe Vault (--vault-password-file ou --vault-pass-file) : Vous pouvez stocker le mot de passe du Vault dans un fichier texte (protégé par des permissions système strictes, par exemple chmod 400) et indiquer à Ansible de l'utiliser :
    ansible-playbook mon_playbook.yml --vault-password-file ~/.ansible_vault_pass
    Ce fichier peut aussi être un script exécutable qui retourne le mot de passe sur sa sortie standard. Cette méthode est souvent utilisée dans les systèmes d'intégration continue (CI/CD) où la saisie interactive n'est pas possible.
  • Utiliser une variable d'environnement : La variable d'environnement ANSIBLE_VAULT_PASSWORD_FILE peut pointer vers ce fichier de mot de passe.
  • Utiliser plusieurs Vaults avec des identifiants (Vault IDs) : Pour des projets plus complexes, vous pouvez avoir plusieurs fichiers Vault, chacun chiffré avec un mot de passe différent. Ansible vous permet d'assigner un identifiant (Vault ID) à chaque Vault et de fournir les mots de passe correspondants. C'est utile pour séparer les secrets par environnement ou par équipe. Vous utilisez alors des options comme --vault-id dev@prompt ou --vault-id prod@~/.vault_pass_prod.

Chiffrement de variables individuelles (Ansible 2.3+)

Depuis Ansible 2.3, il est également possible de chiffrer des chaînes de caractères individuelles directement dans vos fichiers YAML (qui ne sont pas eux-mêmes entièrement chiffrés par Vault). Cela se fait avec la commande ansible-vault encrypt_string.

ansible-vault encrypt_string --ask-vault-pass 'ma_valeur_secrete' --name 'ma_variable_secrete'

Cette commande vous demandera le mot de passe du Vault, puis affichera une variable YAML multiligne chiffrée que vous pouvez copier-coller dans vos fichiers de variables :

ma_variable_secrete: !vault |
          $ANSIBLE_VAULT;1.1;AES256
          32663336313539323162306232386233333630313264393339643061313130616231333038346362
          61303539386262396430326130613265643331303230320a30383861333434303138376432633334
          36623162303132313130303636306663343664323336633631653438616533643066336431353033
          63326162393866380a62336463353161626339303930343633333264343561323832313931656134
          3266

Lorsque Ansible rencontre une telle variable (identifiée par !vault), il la déchiffrera en utilisant le mot de passe Vault fourni. Cela permet une granularité plus fine pour le chiffrement, en ne chiffrant que les valeurs qui le nécessitent au sein de fichiers de variables par ailleurs en clair.

Bonnes pratiques pour Ansible Vault

Pour utiliser Ansible Vault de manière efficace et sécurisée :

  • Utilisez des mots de passe Vault robustes : Comme pour tout mot de passe, la complexité est essentielle.
  • Ne commitez jamais votre fichier de mot de passe Vault dans votre dépôt Git (si vous utilisez l'option --vault-password-file). Ajoutez-le à votre fichier .gitignore.
  • Limitez l'accès au fichier de mot de passe Vault : Si vous utilisez un fichier, assurez-vous que ses permissions sont très restrictives (par exemple, chmod 400, lisible uniquement par le propriétaire).
  • Choisissez ce que vous chiffrez : Chiffrez uniquement ce qui est réellement sensible. Il n'est pas nécessaire de chiffrer des fichiers entiers si seule une petite partie de leur contenu est secrète (utilisez encrypt_string dans ce cas).
  • Auditez régulièrement vos secrets : Vérifiez qui a accès aux mots de passe du Vault et changez-les périodiquement ou en cas de compromission suspectée.
  • Intégration CI/CD : Lorsque vous intégrez Ansible avec Vault dans des pipelines CI/CD, utilisez des mécanismes sécurisés pour fournir le mot de passe du Vault à votre job d'automatisation (par exemple, des variables d'environnement secrètes fournies par le système CI/CD).
  • Documentez votre utilisation de Vault : Indiquez quels fichiers sont chiffrés et, si vous utilisez plusieurs Vault IDs, comment ils sont organisés.

Ansible Vault est un outil indispensable pour maintenir la sécurité de vos projets d'automatisation. En l'intégrant dans vos workflows, vous protégez vos informations les plus critiques tout en bénéficiant de la puissance et de la flexibilité d'Ansible.