Git : How to smudge and clean ?

Git : How to smudge and clean ?

Table of Contents

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'

    # 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'

    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.

John Johnk

Les commentaires sont fermés.