Ansible password encryption

Ansible dispose d’un moyen pour chiffrer les mots de passe appelé le vault. Les vaults sont des fichiers, généralement disposés au sein de l’inventaire ansible qui sont entièrement chiffrés.

Dans un système entièrement industrialisé, on retrouve généralement ansible accompagné d’un SCM comme git afin de versionner le code et l’inventaire de l’infrastructure.L’utilisation d’un ou plusieurs vault files pour les mots de passe pose un souci, les variables chiffrées (nom et valeurs) sont tous au sein du vault et donc tous chiffrés. Lors d’un changement sur un mot de passe unitaire au sein d’une vault, le différentiel du SCM montrera un changement global de la vault, et non le changement unitaire du mot de passe.

Une fonction mal documentée existe heureusement dans Ansible et va vous permettre de retrouver un comportement similaire à hiera et eyaml-encrypt avec Puppet, il s’agit du tag !vault-encrypt renommé en !vault à partir d’Ansible 2.3.

Ce tag va vous permettre de ne chiffrer que le contenu d’une variable contenu au sein d’un fichier YAML complet non chiffré. Pour créer une variable chiffrée, on va comme pour les vaults utiliser le binaire ansible-vault.

echo -n "monpassword" | ansible-vault encrypt

Cette commande va chiffrer la chaîne monpassword avec l’utilitaire. Notez 2 choses:

  • L’option -n de la commande echo est importante auquel cas vous aurez un \n supplémentaire en fin de chaîne chiffrée
  • Si vous n’avez pas de vault-password-file spécifié dans votre configuration globale, ansible-vault vous demandera le mot de passe associé au vault chiffré, et donc la clef de chiffrement/déchiffrement.
echo -n "monpassword" | ansible-vault encrypt
Vault password:
$ANSIBLE_VAULT;1.1;AES256
65396363643837643539373866353262623930346635656566326362336635313334623239623663
3639366665656235623833633762336231393536326635370a376532663333653465366439636536
31656539633564363364666632366464613964616162376662623937656266666362663462636161
3162333838646537330a633033396635376438373036376166333938613061316539363439393662
6536

Maintenant que nous avons notre chaîne chiffrée, il n’y a plus qu’à l’utiliser quelque part dans notre inventaire ansible.

my_strong_password: !vault-encrypted |
  $ANSIBLE_VAULT;1.1;AES256
  65396363643837643539373866353262623930346635656566326362336635313334623239623663
  3639366665656235623833633762336231393536326635370a376532663333653465366439636536
  31656539633564363364666632366464613964616162376662623937656266666362663462636161
  3162333838646537330a633033396635376438373036376166333938613061316539363439393662
  6536

Vous pouvez désormais chiffrer et versionner vos passwords chiffrés proprement.

See Also