Ansible Vault : Automatiser le chiffrement avec Git

Ansible est un formidable outil d'automatisation de déploiement et de configuration d'environnement dev et production. Les dernières moutures d'Ansible intègre le cryptage chiffrement de vos fichiers vault, les fichiers contenant vos mots de passe de base de données, vos clés APi, etc ... Bref, tout un tas de choses que l'on ne souhaite pas spécialement voir apparaitre en clair dans son repo Git, même si votre repo est privé.

Pour éviter cela, Ansible a introduit il y a déjà quelques temps ansible-vault, permettant de crypter chiffrer, et déchiffrer, vos fichiers sensibles. Il s'agit donc de penser à crypter déchiffrer vos fichiers avant de pousser tout cela sur votre Git. Un simple

ansible-vault encrypt group_vars/production/vault.yml

Seulement, il suffit d'un banal commit, une fois, en ayant oublié de crypter chiffrer vos fichiers avant, pour que tout cela apparaisse en clair sur votre repo. Vous êtes bon pour effacer votre historique des commits.

Heureusement, Git permet d'automatiser certaines tâches lors d'un commit ou d'un push. J'avais donc dans un premier temps utilisé les hooks pre_commit pour forcer le cryptage chiffrement avant le commit. Seulement, cela a ses limites. En réalisant quelques tests, je me suis rendu compte que cela n'était pas fiable du tout, particulièrement dans le cas ou l'on commit, sans faire de push immédiatement. Le hooks pre-commit crypte chiffre bien les fichiers vault, mais si avant de pusher, je decrypte déchiffre manuellement pour X raisons, et qu'ensuite je push, tout part en clair sur le repo GIT, et cela même si je force le cryptage chiffrement dans un hooks pre_push. Certe, ce n'est pas le workflow standard, mais ce genre de chose peut arriver ... un vendredi ... après une grosse semaine.

La solution la plus fiable m'a semblé être l'utilisation des filtres smudge et clean.Cela sous-entend que vous avez déjà généré votre fichier pass à la racine de votre projet :

ansible-vault create .vault_pass

Attention : mettez ce fichier dans votre gitignore

Dans un premier temps, il s'agit de créer à la racine de votre projet un dossier mes_scripts

Dans ce dossier, créez ensuite 3 fichiers :

smudge_crypt
clean_crypt
diff_crypt

Rendre ensuite ces 3 fichiers exécutables:

chmod +x mes_scripts/smudge_crypt
chmod +x mes_scripts/clean_crypt
chmod +x mes_scripts/diff_crypt

smudge_crypt:

#!/bin/sh

if [ ! -r '.vault_pass' ]; then
  exit 1
fi

tmp=$(mktemp)
cat > $tmp

export PAGER='cat'
CONTENT=`ansible-vault view "$tmp" --vault-password-file=.vault_pass 2> /dev/null`

if echo "$CONTENT" | grep -q 'ERROR! input is not encrypted'; then
  echo "Looks like one file was commited clear text"
  echo "Please fix this before continuing !"
  exit 1
else
  echo "$CONTENT"
fi

rm $tmp

clean_crypt:

#!/bin/sh

if [ ! -r '.vault_pass' ]; then
  exit 1
fi

tmp=$(mktemp)
cat > $tmp

ansible-vault encrypt $tmp --vault-password-file=.vault_pass > /dev/null 2>&1

cat "$tmp"
rm $tmp

diff_crypt

#!/bin/sh

if [ ! -r '.vault_pass' ]; then
  exit 1
fi
export PAGER='cat'
CONTENT=`ansible-vault view "$1" --vault-password-file=.vault_pass 2> /dev/null`

if echo "$CONTENT" | grep -q 'ERROR! input is not encrypted'; then
  cat "$1"
else
  echo "$CONTENT"
fi

Enfin, il suffit de modifier votre fichier config dans le dossier .git de votre projet et d'ajouter les lignes suivantes:

[filter "vault"]
  smudge = mes_scripts/smudge_crypt
  clean  = mes_scripts/clean_crypt

[diff "vault"]
  textconv = mes_scripts/diff_crypt

et pour finir, il suffit de préciser ces filtres dans votre .gitattributes.

Toujours à la racine de votre projet, créer ou modifier le fichier .gitattributes et ajouter:

*vault* filter=vault diff=vault

Dorénavant, TOUS VOS FICHIERS comprenant VAULT dans leurs noms seront automatiquement cryptés chiffrés avec ansible-vault avant que GIT ne fasse un diff. On est ainsi sûr que le cryptage chiffrage sera bien pris en compte par le commit, ce qui n'était pas le cas avec les hooks pre_commit ou pre_push

Pour en savoir plus au sujet d'Ansible : Découvrir leur site web

Note : Le cryptage reviendrait à coder un fichier sans en connaître la clé et donc sans pouvoir le décoder ensuite. Le terme adéquat est donc le chiffrement, car nus utilisons une clé. Merci à Max de me l'avoir fait remarquer

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.