Exercice 02 : Détecter des secrets exposés avec Gitleaks
🎯 Objectifs
À la fin de cet exercice, vous serez capable de :
- ✅ Installer Gitleaks via Docker ou binaire
- ✅ Scanner un repository complet avec
gitleaks detect - ✅ Interpréter les résultats et identifier les secrets exposés
- ✅ Supprimer un secret de l'historique Git avec
git filter-repo - ✅ Installer un hook pre-commit qui bloque les commits avec secrets
Durée estimée : 25 minutes
Difficulté : ⭐☆☆☆☆ (Débutant)
Prérequis : Git installé, Docker disponible (optionnel)
📖 Contexte
Gitleaks est un outil open-source qui analyse l'historique Git complet d'un repository pour détecter des patterns correspondant à des secrets : clés AWS, tokens GitHub, clés Stripe, mots de passe, etc. Il analyse chaque commit, pas seulement l'état actuel du code.
Un secret peut avoir été commité il y a 6 mois puis "supprimé" - Gitleaks le trouvera quand même dans l'historique.
📋 Énoncé
Créez un repository avec des secrets intentionnellement mal gérés, scannez-le, et appliquez les corrections.
🧭 Déroulement de l'exercice
Tâche 1 : Installer Gitleaks
Choisissez une méthode d'installation :
# Option A : via Docker (pas d'installation permanente)
alias gitleaks="docker run --rm -v $(pwd):/repo zricethezav/gitleaks:latest"
# Option B : téléchargement binaire (Linux amd64)
curl -sSL https://github.com/gitleaks/gitleaks/releases/latest/download/gitleaks_$(curl -s https://api.github.com/repos/gitleaks/gitleaks/releases/latest | grep tag_name | cut -d'"' -f4 | tr -d v)_linux_x64.tar.gz | tar xz -C /tmp
sudo mv /tmp/gitleaks /usr/local/bin/
# Option C : via Homebrew (macOS / Linuxbrew)
brew install gitleaksVérification : gitleaks version affiche la version (ex: v8.x.x).
Tâche 2 : Créer un repository avec des secrets
Créez un repository de test qui simule des erreurs fréquentes :
mkdir demo-gitleaks && cd demo-gitleaks
git init
# Commit 1 : code normal
cat > config.py << 'EOF'
# Configuration application
DEBUG = True
PORT = 8080
EOF
git add config.py
git commit -m "feat: configuration initiale"
# Commit 2 : ERREUR - clé AWS hardcodée
cat > config.py << 'EOF'
# Configuration application
DEBUG = True
PORT = 8080
AWS_ACCESS_KEY_ID = "AKIAIOSFODNN7EXAMPLE"
AWS_SECRET_ACCESS_KEY = "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
EOF
git add config.py
git commit -m "feat: ajouter config AWS"
# Commit 3 : tentative de "suppression" (mais l'historique garde tout)
cat > config.py << 'EOF'
# Configuration application
DEBUG = True
PORT = 8080
# TODO: mettre en variables d'environnement
EOF
git add config.py
git commit -m "fix: supprimer les clés AWS (temporaire)"Tâche 3 : Scanner le repository
Lancez Gitleaks sur l'ensemble de l'historique Git :
gitleaks detect --source . --verboseIndice : Sans
--verbose, Gitleaks affiche juste un résumé. Avec--verbose, il montre chaque secret trouvé avec : le fichier, le commit, la ligne, et le type de secret. Le code de retour est 1 si des secrets sont trouvés, 0 sinon.
Vérification : Gitleaks doit trouver au moins 2 secrets (la clé AWS et le secret AWS) dans le commit 2, même si le commit 3 les a "supprimés".
Tâche 4 : Générer un rapport JSON
Exportez les résultats dans un format exploitable :
gitleaks detect --source . --report-format json --report-path gitleaks-report.json
cat gitleaks-report.json | python3 -m json.toolIndice : Le rapport JSON contient pour chaque secret :
Description(type de secret),StartLine,Commit,File,Match(la valeur masquée),Author,Date. En CI/CD, ce rapport est archivé comme artifact pour audit.
Vérification : Le fichier JSON contient un tableau avec les secrets détectés.
Tâche 5 : Installer un hook pre-commit
Pour éviter qu'un tel commit arrive en premier lieu, installez le hook :
# Créer le hook pre-commit
cat > .git/hooks/pre-commit << 'EOF'
#!/bin/sh
gitleaks protect --staged --verbose
if [ $? -ne 0 ]; then
echo "❌ COMMIT BLOQUÉ : des secrets ont été détectés."
echo "Retirez les secrets de vos fichiers avant de commiter."
exit 1
fi
echo "✅ Aucun secret détecté - commit autorisé."
EOF
chmod +x .git/hooks/pre-commitTestez que le hook bloque bien un nouveau commit avec une clé :
echo 'GITHUB_TOKEN=ghp_abc123EXAMPLE456789012345678901234' >> config.py
git add config.py
git commit -m "test: le hook doit bloquer ce commit"Vérification : Le commit doit être bloqué avec le message "COMMIT BLOQUÉ".
✅ Vérification du résultat
gitleaks versionfonctionnegitleaks detecttrouve les 2 clés AWS dans l'historique- Le rapport JSON est généré et lisible
- Le hook pre-commit bloque un commit contenant un token GitHub
💡 À retenir
Gitleaks scanne tout l'historique Git - pas seulement le code actuel. Supprimer un secret dans un nouveau commit ne suffit pas : il faut réécrire l'historique avec git filter-repo (outil officiel, remplaçant de git filter-branch) et révoquer immédiatement le secret chez le provider.
La règle d'or : Un secret commité = un secret compromis. Révoque-le, puis nettoie l'historique.
✨ Solution Complète
# Installation
brew install gitleaks # ou méthode Docker
# Scanner tout l'historique
gitleaks detect --source . --verbose
# Rapport JSON
gitleaks detect --source . --report-format json --report-path rapport.json
# Hook pre-commit
cat > .git/hooks/pre-commit << 'EOF'
#!/bin/sh
gitleaks protect --staged --verbose || exit 1
EOF
chmod +x .git/hooks/pre-commit