Préambule
Il était une fois, dans le royaume du développement, un développeur nommé John. En plein milieu d'un projet complexe, qui impliquait des fichiers de configuration .env et .yaml pour se connecter à une API tournant dans un conteneur Docker, John a commis l'impensable : il a ouvert un dépôt contenant une clé API Mailgun en clair dans un fichier .env utilisé pour la configuration du docker compose.
À peine avait-il réalisé son erreur qu'un désastre s'annonçait. Non seulement sa clé d'API avait été compromise, mais son compte Mailgun avait également été coupé, le plongeant dans un tourbillon de préoccupations. Une procédure rigoureuse devait être suivie pour le réactiver, impliquant la réinitialisation des mots de passe et des clés d'API. Une perte de temps énorme qui plongea notre petit John dans une énorme tristesse.
Face à l'urgence de partager son code Python avec un autre développeur pour résoudre un problème pressant, John a décidé d'agir. Bien que la meilleure solution aurait été de monter un vault sécurisé, le temps pressait. Il a donc opté pour un mécanisme de nettoyage et de restauration connu sous le nom de "smudge and clean".
Les faits
Il a ajouté dans le fichier .git/config
de son projet, les lignes suivantes :
[filter "secrets"]
clean = ../scripts/filter-secrets.sh clean
smudge = ../scripts/filter-secrets.sh smudge
Ces lignes indiquaient à Git d'utiliser son script de filtrage chaque fois qu'il push
ou pull
des commits
. Dans ce script, il a employé sed
pour remplacer sa clé API par une phrase humoristique, de sorte qu'elle ne soit jamais exposée dans le dépôt.
Filter secrets
Le script de filtrage filter-secrets.sh
en question ressemblait à cela :
#!/bin/bash
if [ "$1" == "clean" ]; then
# Clean (replace sensitive data with placeholders)
sed -e 's/XXXXXXXXX/{API_KEY_PLACEHOLDER}/g' \
-e 's/YYYYYYYYY/{SENDING_API_KEY_PLACEHOLDER}/g' \
-e 's/ZZZZZZZZZ/{SMTP_PASSWORD_PLACEHOLDER}/g' \
-e 's/AAAAAAAAA/{POSTGRES_PASSWORD_PLACEHOLDER}/g' \
-e 's/BBBBBBBBB/{TWS_USERID_PLACEHOLDER}/g' \
-e 's/CCCCCCCCCC/{TWS_PASSWORD_PLACEHOLDER}/g' > /path/to/log/clean_output.log
cat /path/to/log/clean_output.log
# Si une erreur se produit avec sed, renvoyer un code d'erreur
if [ $? -ne 0 ]; then
echo "Erreur lors de l'exécution du clean"
exit 1
fi
elif [ "$1" == "smudge" ]; then
# Smudge (replace placeholders with sensitive data)
sed -e 's/{API_KEY_PLACEHOLDER}/XXXXXXXXX/g' \
-e 's/{SENDING_API_KEY_PLACEHOLDER}/YYYYYYYYY/g' \
-e 's/{SMTP_PASSWORD_PLACEHOLDER}/ZZZZZZZZZ/g' \
-e 's/{POSTGRES_PASSWORD_PLACEHOLDER}/AAAAAAAAA/g' \
-e 's/{TWS_USERID_PLACEHOLDER}/BBBBBBBBB/g' \
-e 's/{TWS_PASSWORD_PLACEHOLDER}/CCCCCCCCCC/g' > /path/to/log/smudge_output.log
cat /path/to/log/smudge_output.log
if [ $? -ne 0 ]; then
echo "Erreur lors de l'exécution du smudge"
exit 1
fi
fi
exit 0
Les attributs
Pour finaliser le tout, il a modifié un fichier .git/info/attributes
où il a défini quels fichiers de configuration devaient passer par ce filtre :
config.yaml filter=secrets
.env filter=secrets
Conclusion
Grâce à son ingéniosité, John a pu collaborer sur son projet sans craindre pour la sécurité de ses informations sensibles en se donnant le temps de monter proprement un Vault. À la fin de la journée, il avait non seulement corrigé son erreur, mais aussi appris à jongler avec la sécurité dans le monde des dépôts Git. Et c'est ainsi qu'il a vécu heureux, protégé de la menace des fuites de secrets, et avec un compte Mailgun réactivé, prêt à affronter de nouveaux défis.