Détecte les secrets, clés API et credentials exposés dans le code source, l'historique Git et les fichiers de configuration. À utiliser pour vérifier qu'aucun secret n'est dans le code. Se déclenche avec "secrets", "clé API exposée", "credential leak", "mot de passe dans le code", "token exposé", ".env", "secret scanner". Also triggers on "exposed secrets", "leaked API key", "scan git history for credentials".
Détecte les secrets, clés API et credentials exposés dans le code source, l'historique Git et les fichiers de configuration. À utiliser pour vérifier qu'aucun secret n'est dans le code. Se déclenche avec "secrets", "clé API exposée", "credential leak", "mot de passe dans le code", "token exposé", ".env", "secret scanner". Also triggers on "exposed secrets", "leaked API key", "scan git history for credentials".
Critère de décision : si gitleaks retourne 0 findings ET la baseline est propre → passer à l'étape 3. Sinon, traiter chaque finding avant de continuer.
2. Analyse de l'historique Git complet
# gitleaks — historique complet
gitleaks detect --source . --log-opts="--all" --report-format json --report-path leaks-history.json
# truffleHog — haute entropie + patterns, branches et stash inclus
trufflehog git file://. --only-verified --json > trufflehog-report.json
# Repérer les commits "correctifs" (indice qu'un secret a été exposé)
git --all --oneline | grep -iE
Anti-pattern fréquent : croire qu'un git rm ou un commit de suppression efface un secret. Le secret reste dans l'historique tant que le repo n'est pas réécrit.
3. Fichiers de configuration à risque
Fichier
Piège courant
.env, .env.local
Pas dans .gitignore
appsettings.json
Connexion strings en clair
docker-compose.yml
environment: avec valeurs
Manifests K8s Secret
Base64 ≠ chiffrement
.github/workflows/*.yml
echo $SECRET dans les logs
Jenkinsfile
withCredentials mal utilisé
# Vérifier que les fichiers sensibles sont bien ignorés
git check-ignore -v .env .env.local *.pem *.key secrets/
# Détecter les fichiers sensibles déjà trackés (= en danger)
git ls-files | grep -E "\.(env|pem|key|p12|pfx|jks|ppk)$"
# Grep manuel ciblé dans les sources
grep -rE "AKIA[0-9A-Z]{16}" . --include="*.{js,ts,py,java,go,cs,yml,json}"
grep -rE "sk_live_" . --include="*.{js,ts,py,rb,php}"
5. Détection de haute entropie (secrets non étiquetés)
# truffleHog — détecte les chaînes aléatoires longues même sans label
trufflehog filesystem . --entropy --json
# Python rapide : entropie de Shannon sur les chaînes longues
python3 - <<'EOF'
import math, re, sys
def entropy(s):
counts = {c: s.count(c) for c inset(s)}
return -sum((v/len(s)) * math.log2(v/len(s)) for v in counts.values())
for line in open(sys.argv[1]):
for token in re.findall(r'[A-Za-z0-9+/=_\-]{20,}', line):
if entropy(token) > 4.5:
print(f"{entropy(token):.2f} {token}")
EOF suspicious_file.txt
Seuil recommandé : entropie > 4.5 bits/char sur une chaîne > 20 caractères = suspect.
6. Vérification des variables d'environnement vs hardcoded
# Détecter les assignations directes à risque (Node.js / Python)
grep -rE "(api_key|password|secret|token)\s*[:=]\s*[\"'][^\"']{8,}" . \
--include="*.{js,ts,py,java,go,cs}" \
--exclude-dir={node_modules,.git,dist,build}
Bonne pratique : les valeurs par défaut dans le code ne doivent JAMAIS être des credentials valides — utiliser "CHANGE_ME" ou lever une exception au démarrage si la variable est vide.
# Python — pattern sûrimport os
SECRET_KEY = os.environ["SECRET_KEY"] # KeyError explicite si absent
// TypeScript — pattern sûr avec validation au bootconst apiKey = process.env.API_KEY;
if (!apiKey) thrownewError("API_KEY manquante — vérifiez votre .env");