10
mar

GauvainOLN&B

Par Gauvain Pocentek, Consultant Senior et expert OpenStack @Objectif Libre

 

Le but de cet article est de présenter des solutions pour la sécurisation des données dans Ansible.

 

Il est souvent nécessaire de stocker des informations sensibles dans les playbooks ansible : mots de passe, clés privées, clés de transfert DNS, etc.

C’est un problème de taille lorsque les playbooks, et leurs données sensibles, sont partagés dans un dépôt git.

 

Afin de résoudre ce problème, ansible fournit ansible-vault.

 

Cet utilitaire chiffre les fichiers grâce à un mot de passe :


$ ansible-vault create group_vars/host
New Vault password:
Confirm New Vault password:
EDIT EDIT EDIT
$ ansible-vault edit group_vars/host
Vault password:
UPDATE UPDATE UPDATE

 

Le fichier édité avec ansible-vault ressemble à quelque chose comme :


ANSIBLE_VAULT;1.1;AES256
6661656265653234313962356465316166383...

 

Les options --ask-vault-pass ou --vault-password-file des commandes ansible permettent de déchiffrer les fichiers lors de l’exécution de playbooks.

 

Opération simple lorsqu’ansible est exécuté par un être humain, mais :

  • Comment gérer les exécutions automatiques de playbook via Jenkins ou Ansible Tower ?
  • Comment partager le mot de passe avec les collègues de manière sécurisée ?

 Que faire ?

Une solution est l’utilisation d’outils externes pour le stockage et la lecture du mot de passe : par exemple pass ou HashiCorp Vault.

 

L’utilisation d’un script au lieu d’un simple fichier avec l’option --vault-password-file permet d’accéder à ces ressources externes.

 

Pour une automatisation complète, il est nécessaire de configurer ansible pour systématiquement utiliser ce script :

  1. Écrire un script vault_pass. Ce script doit afficher le mot de passe ansible-vault sur la sortie standard :
    #!/bin/sh
    # avec pass
    pass pocentek.net/ansible/vault
    # ou avec vault
    vault read -field=password secret/pocentek.net/ansible_vault
  2. Rendre le script exécutable :
    $ chmod +x vault_pass
  3. Ajouter la ligne suivante dans le fichier ansible.cfg :
    [defaults]
    vault_password_file = ./vault_pass
  4. Exécuter le playbook :
    ansible-playbook votre-playbook.yml

Au final : pass ou vault ?

pass est très facile à mettre en place et est sans doute le meilleur choix pour des projets solo.

Dès que le projet implique plusieurs personnes les choses se compliquent :

  • Chaque utilisateur doit stocker le mot de passe partagé dans un chemin prédéfini sur leur instance locale de pass
  • En cas de changement de mot de passe tous les utilisateurs doivent faire la modification en local

 

vault est plus complexe à mettre en œuvre mais présente plus d’avantages fonctionnels :

  • Pas besoin de stocker le mot de passe localement
  • Support des ACLs : si un utilisateur quitte le projet ses permissions sont supprimées et le mot de passe mis à jour uniquement côté serveur
  • Il devient plus simple de changer le mot de passe régulièrement pour augmenter sa sécurité

 

vault est une solution plus pérenne et plus solide que pass, notamment pour des projets collaboratifs.

C’est ce choix que nous avons fait chez Objectif Libre pour sécuriser les playbooks de nos clients.