Aller au contenu

Ansible Vault

Mise à jour :

logo ansible

Dans le domaine de l’automatisation et de la gestion des infrastructures, la sécurité des données sensibles est une priorité. Lorsque l’on travaille avec des outils d’automatisation comme Ansible, il est fréquent de manipuler des informations confidentielles, telles que des mots de passe, des clés API, des certificats ou encore des identifiants de bases de données. Ces données sont souvent nécessaires pour garantir le bon fonctionnement des tâches automatisées, mais leur divulgation pourrait entraîner des conséquences graves, notamment des brèches de sécurité.

Pour répondre à ce besoin de sécurisation, Ansible Vault a été introduit. Il s’agit d’un outil intégré à Ansible qui permet de chiffrer et de déchiffrer des fichiers sensibles directement dans vos playbooks. Cela garantit que ces informations restent protégées tout au long du cycle de vie des projets, qu’ils soient en développement ou en production.

Dans ce guide, je vais vous expliquer en détail comment utiliser Ansible Vault pour sécuriser vos fichiers, tout en assurant une gestion simplifiée des secrets au sein de vos infrastructures automatisées. Nous verrons comment créer des fichiers Vault, les modifier, les déchiffrer et comment les intégrer dans des playbooks Ansible, afin de garantir que les informations sensibles ne soient jamais exposées en clair.

Fonctionnalités d’Ansible Vault

Ansible Vault propose un ensemble de fonctionnalités dédiées à la gestion des secrets et à la sécurisation des informations sensibles dans les playbooks. Voici une liste des principales fonctionnalités offertes par Ansible Vault :

  • Chiffrement de fichiers : Permet de chiffrer nativement des fichiers contenant des informations sensibles, tels que des variables ou des configurations, pour éviter qu’ils ne soient exposés en clair.
  • Chiffrement partiel de fichiers : Permet de chiffrer uniquement des parties spécifiques d’un fichier YAML, comme des blocs de variables, tout en laissant d’autres sections du fichier en clair.
  • Déchiffrement de fichiers : Offre la possibilité de déchiffrer des fichiers Vault pour rendre leur contenu lisible et exploitable dans des environnements sécurisés
  • Modification sécurisée de fichiers chiffrés : Ansible Vault propose une commande pour éditer un fichier chiffré, garantissant que les modifications sont également chiffrées lors de la sauvegarde.
  • Support multi-utilisateurs : Permet de partager des fichiers Vault avec plusieurs utilisateurs grâce à l’utilisation de plusieurs mots de passe ou de fichiers de mots de passe Vault.
  • Intégration avec les playbooks Ansible : Les fichiers Vault peuvent être utilisés directement dans les playbooks Ansible, permettant de protéger les secrets tout en automatisant les tâches.
  • Mises à jour des fichiers Vault : Ansible Vault permet de réinitialiser un fichier Vault avec un nouveau mot de passe, garantissant que les fichiers restent sécurisés même si les clés doivent être changées.

Installation et configuration d’Ansible Vault

Ansible Vault fait partie intégrante du package Ansible, il n’est donc pas nécessaire d’installer un outil distinct pour l’utiliser. Dès que vous installez Ansible, Ansible Vault est disponible et prêt à être utilisé pour sécuriser vos fichiers sensibles.

Si vous avez besoin d’instructions plus détaillées sur l’installation d’Ansible, vous pouvez consulter mon guide complet sur Ansible.

Une fois Ansible installé, vous pouvez vérifier que Ansible Vault est bien disponible en exécutant la commande suivante :

Terminal window
ansible-vault --version
ansible-vault [core 2.17.3]
config file = None
python version = 3.11.1 (v3.11.1:a7a450f84a, Dec 6 2022, 15:24:06) [Clang 13.0.0 (clang-1300.0.29.30)] (/usr/local/bin/python3)
jinja version = 3.1.4
libyaml = True

Cela devrait afficher la version d’Ansible installée, confirmant ainsi que Vault est bien accessible.

Configuration de base d’Ansible Vault

Aucune configuration spécifique n’est nécessaire pour utiliser Ansible Vault, mais il est recommandé d’avoir un environnement de travail organisé pour stocker vos secrets. Par exemple, vous pouvez regrouper les fichiers chiffrés dans un répertoire dédié au sein de vos projets Ansible.

Dès que l’installation est terminée, vous pourrez immédiatement commencer à utiliser les commandes de Vault pour créer, modifier et déchiffrer vos fichiers en toute sécurité.

Voyons comment créer un fichier contenant des informations sensibles de ce type :

secret.yml
api_key: dEZSY!3P22Pc#s

Création d’un fichier chiffré avec Ansible Vault

L’une des fonctionnalités principales d’Ansible Vault est la possibilité de chiffrer des fichiers contenant des informations sensibles. Vous pouvez chiffrer des fichiers existants ou en créer de nouveaux qui seront automatiquement protégés par un chiffrement. Ansible Vault utilise un algorithme de chiffrement symétrique, ce qui signifie qu’une même clé (ou mot de passe) est utilisée pour chiffrer et déchiffrer les données.

Utilisation de la commande ansible-vault create

La commande ansible-vault create permet de créer un nouveau fichier chiffré à partir de zéro. Lors de la création, vous serez invité à fournir un mot de passe qui servira à chiffrer le contenu. Ce mot de passe sera ensuite nécessaire pour accéder au fichier et le déchiffrer.

Voici comment utiliser cette commande :

Terminal window
ansible-vault create secret.yml

Lorsque vous lancez cette commande, les étapes suivantes se produisent :

  1. Saisie du mot de passe : Vous serez d’abord invité à entrer un mot de passe pour chiffrer le fichier. Ce mot de passe doit être suffisamment complexe pour garantir la sécurité du fichier. Vous devrez le saisir deux fois pour confirmer qu’il est correct.

  2. Édition du fichier : Une fois le mot de passe fourni, Ansible ouvrira votre éditeur de texte par défaut (généralement vi ou nano, selon votre configuration). Vous pourrez y ajouter les informations que vous souhaitez protéger. Il peut s’agir de variables sensibles, de configurations, ou d’autres données critiques.

  3. Chiffrement automatique : Lorsque vous sauvegardez et fermez l’éditeur, le contenu du fichier est automatiquement chiffré avec le mot de passe que vous avez fourni. Le fichier ainsi créé ne peut pas être ouvert ou lu sans le mot de passe.

Utilisation de la commande ansible-vault encrypt

Si vous avez déjà un fichier existant, vous pouvez le chiffrer avec la commande ansible-vault encrypt. Contrairement à create, cette commande ne crée pas un nouveau fichier, mais chiffre un fichier existant sans modifier son contenu. Cela est particulièrement utile si vous avez un fichier YAML déjà utilisé dans vos playbooks et que vous souhaitez le protéger.

Voici la syntaxe pour chiffrer un fichier déjà existant :

Terminal window
ansible-vault encrypt secret.yml

Les étapes sont similaires à celles de la commande create :

  1. Saisie du mot de passe : Vous serez invité à entrer et confirmer un mot de passe, qui sera utilisé pour chiffrer le fichier.

  2. Chiffrement immédiat : Une fois le mot de passe fourni, le fichier est immédiatement chiffré et son contenu n’est plus lisible en clair. Toute tentative d’ouverture du fichier affichera un texte chiffré illisible sans le mot de passe.

Modifier un fichier existant avec Ansible Vault

Une fois qu’un fichier a été chiffré avec Ansible Vault, il est souvent nécessaire de le modifier, par exemple pour mettre à jour des informations sensibles ou ajouter de nouvelles variables. La commande ansible-vault edit permet de faire cela de manière simple et sécurisée, sans avoir besoin de déchiffrer manuellement le fichier puis de le rechiffrer. Cette fonctionnalité est particulièrement utile car elle garantit que le fichier reste toujours chiffré pendant tout le processus de modification.

Utilisation de la commande ansible-vault edit

La commande ansible-vault edit permet d’éditer un fichier chiffré directement. Lors de l’utilisation de cette commande, le fichier est temporairement déchiffré dans votre éditeur de texte, puis rechiffré automatiquement dès que vous sauvegardez vos modifications. Cela évite d’avoir des versions non chiffrées du fichier présentes sur le disque, réduisant ainsi les risques de fuite d’informations.

Voici comment utiliser cette commande :

Terminal window
ansible-vault edit secret.yml

Les étapes se déroulent comme suit :

  1. Saisie du mot de passe : Lorsque vous exécutez la commande, Ansible Vault vous demande d’entrer le mot de passe que vous avez utilisé pour chiffrer le fichier. Ce mot de passe est nécessaire pour déchiffrer temporairement le contenu.

  2. Ouverture dans un éditeur de texte : Après avoir entré le mot de passe, Ansible Vault ouvre le fichier dans votre éditeur de texte par défaut, vous permettant d’apporter les modifications nécessaires. Vous pouvez ajouter, supprimer ou mettre à jour des variables, des clés ou toute autre information que vous aviez chiffrée.

  3. Chiffrement automatique : Une fois vos modifications terminées, en sauvegardant et en fermant l’éditeur, Ansible Vault rechiffre automatiquement le fichier avec le même mot de passe. Vous n’avez pas besoin de lancer une commande supplémentaire pour rechiffrer le fichier, ce qui garantit une sécurité continue.

Avantages de la commande ansible-vault edit

La commande edit présente plusieurs avantages par rapport à une méthode plus manuelle consistant à déchiffrer un fichier, le modifier, puis le rechiffrer :

  • Sécurité : Le fichier n’est jamais stocké en texte clair sur votre disque dur. Dès que vous terminez vos modifications, il est immédiatement rechiffré, ce qui limite le risque d’exposition accidentelle.
  • Simplicité : Vous n’avez pas besoin de vous rappeler d’exécuter des commandes supplémentaires pour rechiffrer le fichier. Tout est géré automatiquement par Ansible Vault.
  • Transparence : Les utilisateurs n’ont pas à se soucier des étapes techniques du chiffrement et du déchiffrement, Ansible Vault gère tout en arrière-plan.

Déchiffrer un fichier chiffré

Il peut arriver que vous ayez besoin de déchiffrer un fichier chiffré avec Ansible Vault pour diverses raisons. Par exemple, vous pourriez vouloir rendre le contenu du fichier lisible pour l’utiliser dans un autre contexte ou pour le partager temporairement avec quelqu’un sans utiliser Vault. Pour cela, Ansible Vault fournit la commande ansible-vault decrypt, qui permet de déchiffrer un fichier et de le stocker en texte clair.

Utilisation de la commande ansible-vault decrypt

La commande ansible-vault decrypt convertit un fichier chiffré en un fichier texte lisible. Une fois cette commande exécutée, le fichier ne sera plus chiffré et ne nécessitera plus de mot de passe pour être lu ou modifié. Voici comment utiliser cette commande :

Terminal window
ansible-vault decrypt secret.yml

Voici les étapes que la commande effectue :

  1. Saisie du mot de passe : Comme pour les autres commandes de Vault, vous devrez entrer le mot de passe que vous avez utilisé pour chiffrer le fichier. Ce mot de passe est nécessaire pour déchiffrer le contenu de manière sécurisée.

  2. Déchiffrement du fichier : Une fois le mot de passe correct fourni, Ansible Vault déchiffre le fichier. Cela signifie que le contenu est converti en texte clair et le fichier original chiffré est remplacé par une version déchiffrée. Le fichier résultant sera alors lisible par n’importe quel éditeur de texte sans nécessiter de mot de passe.

  3. Avertissement : Le fichier déchiffré n’est plus protégé. Cela signifie que toute personne ayant accès à ce fichier pourra lire son contenu sans restriction. Il est donc essentiel d’être prudent lors de l’utilisation de la commande decrypt, surtout dans des environnements collaboratifs ou des systèmes de gestion de versions comme Git.

Utilisation de la commande ansible-vault decrypt --output

Dans certains cas, vous pourriez vouloir conserver le fichier original chiffré tout en créant une copie déchiffrée temporaire. C’est là que la commande --output est utile. Elle vous permet de spécifier un fichier de sortie pour stocker la version déchiffrée, sans altérer l’original.

Exemple d’utilisation :

Terminal window
ansible-vault decrypt secret.yml --output secret_dechiffre.yml

Avec cette option, le fichier original reste chiffré et une version déchiffrée est créée sous un nouveau nom, dans cet exemple secret_dechiffre.yml. Cela vous permet de partager ou consulter temporairement le fichier sans compromettre la sécurité de l’original.

Utiliser des fichiers Vault dans les playbooks

L’une des forces d’Ansible Vault réside dans sa capacité à intégrer des fichiers chiffrés directement dans les playbooks Ansible. Cela permet de sécuriser des variables, des mots de passe, des clés API, ou toute autre donnée sensible sans jamais les exposer en clair dans les fichiers YAML. L’intégration des fichiers Vault dans vos playbooks garantit une gestion sécurisée des secrets tout en conservant la flexibilité et la simplicité des playbooks Ansible.

Charger des variables depuis un fichier Vault

Le cas le plus courant est d’utiliser un fichier chiffré avec Vault pour y stocker des variables sensibles qui seront ensuite chargées et utilisées dans un playbook. Voici comment cela fonctionne :

Si vous avez un fichier chiffré, par exemple secret.yml, contenant des informations sensibles, vous pouvez le référencer directement dans un playbook Ansible en utilisant le module vars_files. Ce fichier sera alors déchiffré à l’exécution grâce à Vault et les variables qu’il contient seront disponibles dans votre playbook.

Exemple de fichier chiffré secret.yml :

secret_password: "MonMotDePasseSuperSecret"

Pour utiliser ce fichier dans un playbook, voici ce que vous devez faire :

---
- hosts: localhost
vars_files:
- secret.yml
tasks:
- name: Afficher le mot de passe secret
ansible.builtin.debug:
msg: "Le mot de passe est : {{ secret_password }}"

Lorsque vous exécutez ce playbook, Ansible demandera le mot de passe Vault pour déchiffrer secret.yml, puis utilisera la variable secret_password dans les tâches. Cela vous permet d’utiliser des informations sensibles en toute sécurité dans vos playbooks sans les exposer en clair.

Exécution d’un playbook avec des fichiers Vault

Lorsque vous exécutez un playbook qui utilise des fichiers Vault, Ansible doit être capable de déchiffrer ces fichiers au moment de l’exécution. Pour cela, vous devez fournir le mot de passe de chiffrement. Il existe plusieurs façons de procéder :

  1. Saisie manuelle du mot de passe : Lorsque vous lancez un playbook qui inclut des fichiers Vault, Ansible vous demande par défaut d’entrer le mot de passe de Vault pour déchiffrer ces fichiers.

    Terminal window
    ansible-playbook playbook.yml --ask-vault-pass

    Cette commande affiche une invite pour entrer le mot de passe Vault nécessaire au déchiffrement des fichiers utilisés dans le playbook.

  2. Utiliser un fichier de mot de passe Vault : Pour automatiser l’exécution de vos playbooks et éviter de saisir manuellement le mot de passe à chaque fois, vous pouvez utiliser un fichier contenant le mot de passe Vault. Ce fichier doit être protégé et accessible uniquement à ceux qui en ont besoin. Voici comment l’utiliser :

    Créez un fichier contenant le mot de passe :

    Terminal window
    echo "MonMotDePasseVault" > vault_pass.txt

    Puis lancez votre playbook en spécifiant ce fichier de mot de passe :

    Terminal window
    ansible-playbook playbook.yml --vault-password-file vault_pass.txt

    Cette méthode est particulièrement utile pour les environnements d’intégration continue (CI) ou de production, où l’interaction manuelle est réduite au minimum.

Chiffrement partiel des playbooks

Outre le chiffrement complet des fichiers de variables, Ansible Vault permet également de chiffrer uniquement certaines sections d’un fichier playbook ou de variables. Cela permet de sécuriser uniquement les parties sensibles sans avoir à chiffrer l’intégralité du fichier. Par exemple, vous pourriez chiffrer une variable sensible au sein d’un fichier de variables global tout en laissant d’autres variables en clair.

Voici un exemple de comment vous pourriez chiffrer une partie d’un fichier de variables :

  1. Utilisez la commande suivante pour chiffrer une variable spécifique dans un fichier YAML :

    Terminal window
    ansible-vault encrypt_string 'MonMotDePasseSuperSecret' --name 'secret_password'
  2. Cela générera une sortie chiffrée que vous pourrez directement copier dans votre fichier de variables ou votre playbook, comme ceci :

    vars:
    secret_password: !vault |
    $ANSIBLE_VAULT;1.1;AES256
    6162636465666768696a6b6c6d6e6f707172737475767778797a
    8a8b8c8d8e8f909192939495969798999a9b9c9d9e9f101112
    ...

Cette approche permet de chiffrer uniquement les éléments sensibles d’un fichier YAML, tout en laissant les autres éléments en clair, ce qui facilite la gestion et la lecture du fichier.

Gestion de fichiers de vault par environnement

L’option --vault-id permet de gérer efficacement plusieurs fichiers Vault dans des projets Ansible comportant différents environnements (comme développement, production, etc.), chacun ayant des secrets protégés par des mots de passe différents. Cette option simplifie l’association des fichiers Vault aux bonnes clés de chiffrement, tout en permettant d’automatiser l’exécution des playbooks.

Création des vaults par environnement

Créer un fichier Vault pour l’environnement de production :

Terminal window
ansible-vault create vars_prod.yml --vault-id prod@prompt

Créer un fichier Vault pour l’environnement de développement :

Terminal window
ansible-vault create vars_dev.yml --vault-id dev@prompt

Utilisation des fichiers Vault dans un playbook avec --vault-id

Une fois que vos fichiers Vault sont créés avec leurs identifiants respectifs, vous pouvez les utiliser dans un playbook Ansible et spécifier les identifiants au moment de l’exécution.

Pour l’environnement de production :

Terminal window
ansible-playbook deploy.yml --vault-id prod@prompt -e @vars_prod.yml

Pour l’environnement de développement :

Terminal window
ansible-playbook deploy.yml --vault-id dev@prompt -e @vars_dev.yml

En utilisant l’option --vault-id dès la création des fichiers Vault et lors de l’exécution des playbooks, vous assurez une gestion cohérente et sécurisée des secrets pour vos différents environnements. Cela permet de simplifier la gestion des mots de passe et de garantir que chaque fichier Vault est toujours déchiffré avec la bonne clé.

Utilisation d’un vault Ansible dans un pipeline CI

Dans les environnements CI/CD, tels que GitLab CI et GitHub Actions, il est essentiel de sécuriser les secrets tels que les mots de passe, les clés API, et d’autres informations sensibles. Heureusement, ces plateformes offrent des solutions natives pour stocker ces secrets en toute sécurité et les utiliser dans vos workflows de manière automatisée, sans avoir à exposer ces informations dans le code source.

GitLab CI

GitLab propose une fonctionnalité appelée “Variables CI/CD”, qui permet de stocker en toute sécurité des variables d’environnement (comme les mots de passe, les clés API, etc.) accessibles uniquement dans le pipeline d’intégration et de déploiement continu (CI/CD).

  1. Accéder aux paramètres du projet :

    • Allez sur votre projet GitLab.
    • Dans la barre latérale gauche, cliquez sur “Settings” (Paramètres), puis sélectionnez “CI/CD”.
  2. Ajouter des variables CI/CD :

    • Dans la section “Variables”, cliquez sur le bouton “Expand” (Développer).
    • Cliquez ensuite sur le bouton “Add Variable” pour ajouter une nouvelle variable.
  3. Définir les détails de la variable :

    • Key : Donnez un nom à la variable (par exemple, VAULT_PASS_PROD).
    • Value : Entrez le mot de passe ou la clé que vous souhaitez stocker (par exemple, le mot de passe Vault pour l’environnement production).
    • Masked : Activez cette option pour que la valeur ne soit jamais exposée dans les logs.
    • Protected : Activez cette option si vous souhaitez que la variable ne soit utilisée que dans les branches protégées (comme main ou master).

    Une fois les informations remplies, cliquez sur “Add Variable”.

Une fois que la variable est stockée, vous pouvez l’utiliser dans vos pipelines GitLab CI en accédant à cette variable à l’aide de $VARIABLE_NAME. Par exemple, pour utiliser un mot de passe Vault dans un pipeline :

stages:
- deploy
deploy_production:
stage: deploy
script:
- ansible-playbook deploy.yml --vault-id prod@$VAULT_PASS_PROD -e @vars_prod.yml

Ici, VAULT_PASS_PROD est la variable que vous avez stockée dans les Variables CI/CD et elle est passée en tant que mot de passe pour Ansible Vault lors de l’exécution du playbook.

GitHub Actions

GitHub Actions, tout comme GitLab CI, permet de stocker des secrets via une fonctionnalité appelée “Secrets”, qui est spécifique à chaque dépôt et permet de gérer les informations sensibles pour les workflows CI/CD.

  1. Accéder aux paramètres du dépôt :

    • Allez sur le dépôt GitHub que vous souhaitez configurer.
    • Cliquez sur “Settings” (Paramètres) dans la barre supérieure.
  2. Accéder aux secrets :

    • Dans le menu de gauche, sélectionnez “Secrets and variables” puis “Actions”.
    • Cliquez ensuite sur “New repository secret” pour ajouter un nouveau secret.
  3. Définir les détails du secret :

    • Name : Donnez un nom à votre secret (par exemple, VAULT_PASS_PROD).
    • Value : Entrez la valeur du secret (par exemple, le mot de passe Vault pour l’environnement production).

    Cliquez sur “Add secret” pour enregistrer le secret.

Les secrets stockés dans GitHub peuvent être utilisés dans les workflows GitHub Actions en accédant à ces secrets via secrets.NAME. Voici un exemple d’un workflow qui utilise un secret pour passer le mot de passe Vault à un playbook Ansible :

name: Deploy to Production
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Run Ansible Playbook
run: ansible-playbook deploy.yml --vault-id prod@$VAULT_PASS_PROD -e @vars_prod.yml
env:
VAULT_PASS_PROD: ${{ secrets.VAULT_PASS_PROD }}

Conclusion

Ce guide a couvert en profondeur l’utilisation d’Ansible Vault pour sécuriser vos secrets dans des environnements automatisés, en expliquant comment chiffrer, déchiffrer et modifier des fichiers sensibles. Nous avons vu comment gérer plusieurs environnements grâce à l’option --vault-id, et comment intégrer ces fichiers Vault de manière fluide dans vos workflows CI/CD via GitLab CI et GitHub Actions. En utilisant les fonctionnalités de stockage sécurisé de secrets dans ces plateformes, vous pouvez automatiser vos pipelines tout en garantissant la sécurité des informations critiques.

L’intégration d’Ansible Vault et des pratiques de gestion des secrets dans vos projets Ansible vous permet de protéger efficacement vos mots de passe, clés API et autres données sensibles, tout en assurant une gestion simple et transparente dans des environnements collaboratifs et de production.

Pour aller plus loin dans la gestion des secrets et des workflows, n’hésitez pas à consulter les documentations officielles ou à explorer des outils complémentaires comme HashiCorp Vault pour des besoins plus avancés.

Plus d’infos

Pour approfondir vos connaissances et continuer à améliorer vos pratiques de gestion des secrets avec Ansible Vault, voici quelques-unes des ressources les plus importantes et pertinentes. Ces documents et outils vous permettront de rester à jour sur les bonnes pratiques, les nouvelles fonctionnalités et les cas d’utilisation avancés.