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