
Gitleaks détecte les secrets exposés dans vos dépôts Git, fichiers et archives. Rapide et hautement configurable, c’est l’outil de référence pour les pre-commit hooks et les pipelines CI/CD. Avec plus de 150 règles intégrées, il identifie les clés AWS, tokens GitHub, Stripe, Slack et bien d’autres.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Comprendre comment Gitleaks détecte les secrets avec des règles regex
- Scanner différentes sources : dépôts Git, fichiers, archives, entrée standard
- Configurer des règles personnalisées et des exclusions
- Intégrer Gitleaks dans vos pipelines CI/CD (GitHub Actions, GitLab CI)
- Utiliser les fonctionnalités avancées : décodage, archives, baseline
Le problème des secrets dans le code
Section intitulée « Le problème des secrets dans le code »Imaginez : un développeur pousse un commit contenant une clé API AWS. En quelques minutes, des bots automatisés scannent GitHub, trouvent la clé, et commencent à miner du Bitcoin sur votre compte. C’est arrivé. Plusieurs fois.
Les secrets se retrouvent exposés pour plusieurs raisons :
| Situation | Exemple | Risque |
|---|---|---|
| Fichier de config commité | .env oublié dans .gitignore | Clés API en clair dans l’historique Git |
| Mot de passe hardcodé | password = "admin123" dans le code | Accès à la base de données |
| Token dans les logs | Authorization: Bearer sk_live_... | Compromission de compte |
| Secret encodé en base64 | YXdzX3NlY3JldF9hY2Nlc3Nfa2V5... | Fausse impression de sécurité |
| Historique Git | Secret supprimé mais présent dans un ancien commit | Reste accessible via git log |
Le problème : même si vous supprimez un secret, il reste dans l’historique Git. Et les scanners malveillants analysent tout l’historique, pas juste la branche principale.
Comment Gitleaks résout ce problème
Section intitulée « Comment Gitleaks résout ce problème »Gitleaks utilise une approche basée sur des règles regex et des mots-clés pour détecter les secrets. Contrairement à d’autres outils, il ne vérifie pas si les secrets sont actifs — il se concentre sur la vitesse et la configurabilité.
Fonctionnement en trois étapes
Section intitulée « Fonctionnement en trois étapes »- Découverte — Gitleaks parcourt les sources (Git, fichiers, archives, stdin)
- Classification — Chaque ligne est comparée aux 150+ règles intégrées
- Rapport — Les secrets trouvés sont affichés avec leur emplacement exact
Points forts de Gitleaks
Section intitulée « Points forts de Gitleaks »| Caractéristique | Détail |
|---|---|
| Rapidité | Écrit en Go, très performant |
| Configurabilité | Règles TOML personnalisables |
| Décodage | Base64, hex, URL encoding (v8.26+) |
| Archives | ZIP, tar.gz, 7z… (v8.27+) |
| Règles composites | Secrets multi-parties (v8.28+) |
| Intégration | Pre-commit, GitHub Actions, GitLab CI |
Ce que Gitleaks détecte
Section intitulée « Ce que Gitleaks détecte »Gitleaks intègre plus de 150 règles pour détecter :
- Cloud providers : AWS, GCP, Azure, DigitalOcean
- Paiements : Stripe, PayPal, Square
- Authentification : GitHub, GitLab, Slack, Discord
- Bases de données : PostgreSQL, MySQL, MongoDB dans les URLs
- Clés privées : RSA, DSA, ECDSA, OpenSSH
- IA/ML : OpenAI, Anthropic, HuggingFace, Perplexity
Installation
Section intitulée « Installation »Plusieurs méthodes sont disponibles selon votre environnement.
Téléchargez le binaire depuis les releases GitHub :
# Télécharger la dernière versionVERSION="8.30.0"wget https://github.com/gitleaks/gitleaks/releases/download/v${VERSION}/gitleaks_${VERSION}_linux_x64.tar.gz
# Extraire et installertar xzf gitleaks_${VERSION}_linux_x64.tar.gzsudo mv gitleaks /usr/local/bin/
# Vérificationgitleaks version# 8.30.0Avec Homebrew :
brew install gitleaks
# Vérificationgitleaks versionL’image Docker est idéale pour les environnements CI/CD :
# Depuis Docker Hubdocker pull zricethezav/gitleaks:latest
# Scanner un répertoire localdocker run --rm -v "$PWD:/path" zricethezav/gitleaks:latest dir /path
# Depuis GitHub Container Registrydocker pull ghcr.io/gitleaks/gitleaks:latestPour une gestion de versions flexible :
# Ajouter le pluginasdf plugin add gitleaks
# Installer une version spécifiqueasdf install gitleaks 8.30.0
# Définir comme version globaleasdf set --home gitleaks 8.30.0Commandes principales
Section intitulée « Commandes principales »Depuis la version 8.19.0, Gitleaks utilise trois commandes principales : git, dir et stdin. Les anciennes commandes detect et protect sont dépréciées mais toujours fonctionnelles.
Scanner un dépôt Git
Section intitulée « Scanner un dépôt Git »La commande git scanne l’historique complet d’un dépôt Git, y compris toutes les branches.
# Scanner le dépôt dans le répertoire courantgitleaks git
# Scanner un dépôt spécifiquegitleaks git /chemin/vers/mon-repo
# Afficher les détails (mode verbose)gitleaks git -v
# Masquer la bannièregitleaks git --no-bannerExemple de sortie :
Finding: aws_access_key_id = AKIAIOSFODNN7EXAMPLESecret: AKIAIOSFODNN7EXAMPLERuleID: aws-access-tokenEntropy: 3.646439File: config.envLine: 4Commit: fbc14303ffbf8fb1c2c1914e8dda7d0121633acaAuthor: dev@example.comDate: 2024-06-16T17:17:40ZFingerprint: fbc14303ffbf8fb1c2c1914e8dda7d0121633aca:config.env:aws-access-token:4Link: https://github.com/org/repo/blob/fbc14303.../config.env#L4Cette sortie vous indique :
- Le type de secret :
aws-access-token - L’emplacement : fichier
config.env, ligne 4 - Le commit : hash, auteur, date
- Le lien direct : vers la ligne sur GitHub/GitLab
Filtrer par plage de commits
Section intitulée « Filtrer par plage de commits »Utilisez --log-opts pour passer des options à git log :
# Scanner uniquement les 10 derniers commitsgitleaks git --log-opts="--max-count=10"
# Scanner une plage de commitsgitleaks git --log-opts="HEAD~20..HEAD"
# Scanner uniquement une branche spécifiquegitleaks git --log-opts="--all develop..main"Scanner avant un commit (pre-commit)
Section intitulée « Scanner avant un commit (pre-commit) »L’option --staged scanne uniquement les fichiers stagés, idéal pour les hooks pre-commit :
# Scanner les fichiers stagésgitleaks git --staged
# Scanner avec git diff (mode pre-commit)gitleaks git --pre-commitScanner des fichiers ou répertoires
Section intitulée « Scanner des fichiers ou répertoires »La commande dir scanne des fichiers ou répertoires sans historique Git :
# Scanner un répertoiregitleaks dir /chemin/vers/dossier
# Scanner un fichier spécifiquegitleaks dir config.env
# Scanner plusieurs cheminsgitleaks dir fichier1.log fichier2.env /etc/config/Scanner l’entrée standard (stdin)
Section intitulée « Scanner l’entrée standard (stdin) »La commande stdin permet de scanner des données en pipeline :
# Scanner un fichier via pipecat config.env | gitleaks stdin
# Scanner la sortie d'une commandekubectl logs deployment/mon-app | gitleaks stdin
# Scanner un fichier décompressé à la voléegunzip -c logs.gz | gitleaks stdinFonctionnalités avancées
Section intitulée « Fonctionnalités avancées »Décodage automatique (v8.26+)
Section intitulée « Décodage automatique (v8.26+) »Gitleaks peut décoder automatiquement les secrets encodés en base64, hexadécimal ou URL encoding. Par défaut, le décodage est activé avec une profondeur de 5.
# Activer le décodage récursif (profondeur 2)gitleaks dir /chemin --max-decode-depth=2
# Désactiver le décodagegitleaks dir /chemin --max-decode-depth=0Exemple : un token Stripe encodé en base64 sera détecté :
# Fichier contenant : c2tfbGl2ZV80ZUMzOUhxTHlqV0Rhcmp0VDF6ZHA3ZGMK
Finding: sk_live_4eC39HqLyjWDarjtT1zdp7dcSecret: sk_live_4eC39HqLyjWDarjtT1zdp7dcRuleID: stripe-access-tokenTags: [decoded:base64 decode-depth:1]Les tags decoded:base64 et decode-depth:1 indiquent que le secret a été trouvé après décodage.
Scan d’archives (v8.27+)
Section intitulée « Scan d’archives (v8.27+) »Gitleaks peut extraire et scanner le contenu des archives :
# Scanner une archive avec profondeur 1gitleaks dir archive.tar.gz --max-archive-depth=1
# Scanner des archives imbriquées (profondeur 3)gitleaks dir archives/ --max-archive-depth=3Formats supportés : zip, tar, tar.gz, tar.bz2, tar.xz, 7z, rar, et plus.
Le chemin dans les résultats indique l’emplacement dans l’archive :
File: nested.tar.gz!inner/files.tar!config/.envCela signifie : .env est dans files.tar, qui est dans nested.tar.gz.
Baseline : ignorer les secrets connus
Section intitulée « Baseline : ignorer les secrets connus »La baseline permet d’ignorer les secrets déjà identifiés lors de scans ultérieurs. Utile pour les projets avec un historique contenant des secrets déjà traités.
-
Créer la baseline en générant un rapport initial
Fenêtre de terminal gitleaks git --report-path baseline.json -
Utiliser la baseline pour les scans suivants
Fenêtre de terminal gitleaks git --baseline-path baseline.json --report-path findings.jsonSeuls les nouveaux secrets seront rapportés.
Formats de sortie
Section intitulée « Formats de sortie »Gitleaks supporte plusieurs formats de rapport :
# JSON (défaut si --report-path est utilisé)gitleaks git -f json -r report.json
# CSVgitleaks git -f csv -r report.csv
# SARIF (pour GitHub Code Scanning)gitleaks git -f sarif -r report.sarif
# JUnit (pour CI/CD)gitleaks git -f junit -r report.xml
# Template personnaliségitleaks git -f template --report-template custom.tmpl -r report.txt
# Sortie JSON vers stdoutgitleaks git -f json -r -Configuration
Section intitulée « Configuration »Gitleaks est hautement configurable via un fichier .gitleaks.toml.
Ordre de précédence
Section intitulée « Ordre de précédence »- Option
--configou-c - Variable d’environnement
GITLEAKS_CONFIG(chemin fichier) - Variable d’environnement
GITLEAKS_CONFIG_TOML(contenu TOML) - Fichier
.gitleaks.tomldans le répertoire scanné
Si aucune configuration n’est trouvée, Gitleaks utilise les règles par défaut.
Étendre la configuration par défaut
Section intitulée « Étendre la configuration par défaut »# Titre de la configurationtitle = "Configuration personnalisée"
# Étendre la configuration par défaut[extend]useDefault = true
# Désactiver certaines règles par défautdisabledRules = ["generic-api-key"]Créer une règle personnalisée
Section intitulée « Créer une règle personnalisée »[[rules]]# Identifiant uniqueid = "internal-api-key"
# Descriptiondescription = "Clé API interne de l'entreprise"
# Expression régulière (syntaxe Go)regex = '''int_[a-zA-Z0-9]{32}'''
# Mots-clés pour pré-filtrage (optimisation)keywords = ["int_", "internal_api"]
# Entropie minimum (optionnel)entropy = 3.5
# Tags pour le reportingtags = ["internal", "api-key"]Allowlists : exclure des faux positifs
Section intitulée « Allowlists : exclure des faux positifs »Vous pouvez définir des allowlists au niveau global ou par règle :
# Allowlist globale (s'applique à toutes les règles)[[allowlists]]description = "Fichiers de test et documentation"paths = [ '''tests/''', '''fixtures/''', '''\.md$''',]
# Allowlist pour une règle spécifique[[rules]]id = "aws-access-token"
[[rules.allowlists]] description = "Clés de test AWS" regexes = ['''AKIAIOSFODNN7EXAMPLE'''] stopwords = ["example", "test", "demo"]Allowlists partagées (v8.25+)
Section intitulée « Allowlists partagées (v8.25+) »Depuis v8.25, vous pouvez définir une allowlist et l’appliquer à plusieurs règles :
[[allowlists]]# Appliquer à des règles spécifiquestargetRules = ["aws-access-token", "generic-api-key"]description = "Fichiers de test"paths = ['''tests/.*\.json$''']Règles composites (v8.28+)
Section intitulée « Règles composites (v8.28+) »Les règles composites permettent de détecter des secrets multi-parties (ex: clé + secret) :
[[rules]]id = "aws-keypair"description = "Paire clé/secret AWS"regex = '''AKIA[0-9A-Z]{16}'''
# Règle requise : le secret doit être proche [[rules.required]] id = "aws-secret-pattern" withinLines = 5 # Le secret doit être dans les 5 lignes suivantesIgnorer un secret spécifique dans le code
Section intitulée « Ignorer un secret spécifique dans le code »Ajoutez un commentaire gitleaks:allow pour ignorer une ligne :
# Cette clé est un exemple pour la documentationAWS_KEY = "AKIAIOSFODNN7EXAMPLE" # gitleaks:allowFichier .gitleaksignore
Section intitulée « Fichier .gitleaksignore »Ajoutez les fingerprints des secrets à ignorer :
# Format : fingerprint (depuis le rapport JSON)fbc14303ffbf8fb1c2c1914e8dda7d0121633aca:config.env:aws-access-token:477b2a3e56973785a52ba4ae4b8dac61d4bac016f:keys:private-key:6Intégration CI/CD
Section intitulée « Intégration CI/CD »Pre-commit hook
Section intitulée « Pre-commit hook »Bloquez les secrets avant qu’ils ne soient commités :
repos: - repo: https://github.com/gitleaks/gitleaks rev: v8.30.0 hooks: - id: gitleaks-
Installer pre-commit
Fenêtre de terminal pip install pre-commit -
Créer le fichier de configuration
Fenêtre de terminal cat > .pre-commit-config.yaml << 'EOF'repos:- repo: https://github.com/gitleaks/gitleaksrev: v8.30.0hooks:- id: gitleaksEOF -
Installer les hooks
Fenêtre de terminal pre-commit install -
Tester
Fenêtre de terminal git add . && git commit -m "test"# Si un secret est détecté, le commit sera bloqué
Pour désactiver temporairement le hook :
SKIP=gitleaks git commit -m "skip check"GitHub Actions
Section intitulée « GitHub Actions »Utilisez l’action officielle Gitleaks :
name: Gitleaks
on: push: branches: [main] pull_request:
jobs: gitleaks: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: fetch-depth: 0 # Important : récupérer tout l'historique
- uses: gitleaks/gitleaks-action@v2 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}GitLab CI
Section intitulée « GitLab CI »Intégrez Gitleaks dans vos merge requests :
stages: - security
gitleaks: stage: security image: zricethezav/gitleaks:latest script: - gitleaks git --source="$CI_PROJECT_DIR" --verbose --exit-code 1 rules: - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' - if: '$CI_COMMIT_BRANCH == "main"' allow_failure: falsePour générer un rapport SARIF compatible avec GitLab Security Dashboard :
gitleaks: stage: security image: zricethezav/gitleaks:latest script: - gitleaks git --source="$CI_PROJECT_DIR" -f sarif -r gl-sast-report.sarif artifacts: reports: sast: gl-sast-report.sarif paths: - gl-sast-report.sarifDépannage
Section intitulée « Dépannage »| Symptôme | Cause probable | Solution |
|---|---|---|
| Aucun résultat | Pas de secret trouvé | Normal si le repo est propre |
| Faux positifs nombreux | Secrets de test, exemples | Utiliser .gitleaksignore ou allowlists |
| Scan très lent | Historique Git volumineux | Utiliser --log-opts="--max-count=100" |
| Erreur “no such file” | URL distante non supportée | Cloner le repo localement d’abord |
| Secret encodé non détecté | Décodage désactivé | Vérifier --max-decode-depth |
| Archive non scannée | Scan d’archives désactivé | Activer --max-archive-depth=1 |
Logs de débogage
Section intitulée « Logs de débogage »# Niveau debuggitleaks git --log-level=debug
# Niveau trace (très verbeux)gitleaks git --log-level=traceFichier lent à scanner
Section intitulée « Fichier lent à scanner »Depuis v8.26, Gitleaks identifie les fichiers lents :
gitleaks git --log-level=debug 2>&1 | grep "slow"Ajoutez ces fichiers à une allowlist ou utilisez --max-target-megabytes :
# Ignorer les fichiers > 10 MBgitleaks git --max-target-megabytes=10Bonnes pratiques
Section intitulée « Bonnes pratiques »Prévention : empêcher les secrets d’arriver dans Git
Section intitulée « Prévention : empêcher les secrets d’arriver dans Git »- Pre-commit hooks — Bloquer les commits contenant des secrets
- Fichiers
.gitignore— Exclure.env,*.pem,credentials.json - Gestionnaire de secrets — Utiliser Vault, AWS Secrets Manager, ou Passbolt
- Variables d’environnement — Injecter les secrets au runtime
Détection : scanner régulièrement
Section intitulée « Détection : scanner régulièrement »- CI/CD — Scanner chaque PR et push
- Scans périodiques — Auditer l’organisation complète chaque semaine
- Nouveaux repos — Ajouter Gitleaks dès la création
Remédiation : réagir aux découvertes
Section intitulée « Remédiation : réagir aux découvertes »- Rotation immédiate — Révoquer et recréer le secret exposé
- Audit des accès — Vérifier les logs d’utilisation du secret compromis
- Nettoyage de l’historique — Utiliser
git filter-branchou BFG Repo-Cleaner - Post-mortem — Comprendre comment le secret a été exposé
Comparaison avec TruffleHog
Section intitulée « Comparaison avec TruffleHog »Gitleaks et TruffleHog sont les deux outils open source les plus populaires pour la détection de secrets :
| Critère | Gitleaks | TruffleHog |
|---|---|---|
| Vitesse | ✅ Très rapide | ⚠️ Plus lent (vérification) |
| Vérification automatique | ❌ Non | ✅ Oui (800+ APIs) |
| Sources supportées | 3 (Git, dir, stdin) | 18 (Git, Docker, S3, Jenkins…) |
| Nombre de règles | 150+ | 800+ |
| Configuration | TOML flexible | YAML simple |
| Décodage | ✅ Base64, hex, URL | ❌ Non |
| Archives | ✅ ZIP, tar… | ❌ Non |
| Règles composites | ✅ (v8.28+) | ❌ Non |
Recommandation :
- Gitleaks — Idéal pour les pre-commit hooks et les scans CI/CD rapides
- TruffleHog — Préférable pour les audits de sécurité avec vérification des secrets actifs
Vous pouvez utiliser les deux : Gitleaks en pre-commit pour la rapidité, TruffleHog en scan périodique pour la vérification.
À retenir
Section intitulée « À retenir »- Trois commandes —
git(historique),dir(fichiers),stdin(pipeline) - 150+ règles intégrées — AWS, Stripe, GitHub, Slack, et bien plus
- Décodage automatique — Base64, hex, URL encoding détectés
- Scan d’archives — ZIP, tar.gz, 7z… avec
--max-archive-depth - Baseline — Ignorer les secrets déjà traités
- Pre-commit — Bloquer les secrets avant qu’ils n’atteignent Git
- Rotation immédiate — Un secret exposé = un secret compromis
Prochaines étapes
Section intitulée « Prochaines étapes »Ressources
Section intitulée « Ressources »- Site officiel : github.com/gitleaks/gitleaks
- Playground : gitleaks.io/playground
- Configuration par défaut : gitleaks.toml
- Action GitHub : gitleaks-action