Aller au contenu
Sécurité medium

Gitleaks : scanner vos dépôts Git pour détecter les secrets exposés

20 min de lecture

Logo Gitleaks

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.

  • 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

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 :

SituationExempleRisque
Fichier de config commité.env oublié dans .gitignoreClés API en clair dans l’historique Git
Mot de passe hardcodépassword = "admin123" dans le codeAccès à la base de données
Token dans les logsAuthorization: Bearer sk_live_...Compromission de compte
Secret encodé en base64YXdzX3NlY3JldF9hY2Nlc3Nfa2V5...Fausse impression de sécurité
Historique GitSecret supprimé mais présent dans un ancien commitReste 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.

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é.

  1. Découverte — Gitleaks parcourt les sources (Git, fichiers, archives, stdin)
  2. Classification — Chaque ligne est comparée aux 150+ règles intégrées
  3. Rapport — Les secrets trouvés sont affichés avec leur emplacement exact
CaractéristiqueDétail
RapiditéÉcrit en Go, très performant
ConfigurabilitéRègles TOML personnalisables
DécodageBase64, hex, URL encoding (v8.26+)
ArchivesZIP, tar.gz, 7z… (v8.27+)
Règles compositesSecrets multi-parties (v8.28+)
IntégrationPre-commit, GitHub Actions, GitLab CI

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

Plusieurs méthodes sont disponibles selon votre environnement.

Téléchargez le binaire depuis les releases GitHub :

Fenêtre de terminal
# Télécharger la dernière version
VERSION="8.30.0"
wget https://github.com/gitleaks/gitleaks/releases/download/v${VERSION}/gitleaks_${VERSION}_linux_x64.tar.gz
# Extraire et installer
tar xzf gitleaks_${VERSION}_linux_x64.tar.gz
sudo mv gitleaks /usr/local/bin/
# Vérification
gitleaks version
# 8.30.0

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.

La commande git scanne l’historique complet d’un dépôt Git, y compris toutes les branches.

Fenêtre de terminal
# Scanner le dépôt dans le répertoire courant
gitleaks git
# Scanner un dépôt spécifique
gitleaks git /chemin/vers/mon-repo
# Afficher les détails (mode verbose)
gitleaks git -v
# Masquer la bannière
gitleaks git --no-banner

Exemple de sortie :

Finding: aws_access_key_id = AKIAIOSFODNN7EXAMPLE
Secret: AKIAIOSFODNN7EXAMPLE
RuleID: aws-access-token
Entropy: 3.646439
File: config.env
Line: 4
Commit: fbc14303ffbf8fb1c2c1914e8dda7d0121633aca
Author: dev@example.com
Date: 2024-06-16T17:17:40Z
Fingerprint: fbc14303ffbf8fb1c2c1914e8dda7d0121633aca:config.env:aws-access-token:4
Link: https://github.com/org/repo/blob/fbc14303.../config.env#L4

Cette 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

Utilisez --log-opts pour passer des options à git log :

Fenêtre de terminal
# Scanner uniquement les 10 derniers commits
gitleaks git --log-opts="--max-count=10"
# Scanner une plage de commits
gitleaks git --log-opts="HEAD~20..HEAD"
# Scanner uniquement une branche spécifique
gitleaks git --log-opts="--all develop..main"

L’option --staged scanne uniquement les fichiers stagés, idéal pour les hooks pre-commit :

Fenêtre de terminal
# Scanner les fichiers stagés
gitleaks git --staged
# Scanner avec git diff (mode pre-commit)
gitleaks git --pre-commit

La commande dir scanne des fichiers ou répertoires sans historique Git :

Fenêtre de terminal
# Scanner un répertoire
gitleaks dir /chemin/vers/dossier
# Scanner un fichier spécifique
gitleaks dir config.env
# Scanner plusieurs chemins
gitleaks dir fichier1.log fichier2.env /etc/config/

La commande stdin permet de scanner des données en pipeline :

Fenêtre de terminal
# Scanner un fichier via pipe
cat config.env | gitleaks stdin
# Scanner la sortie d'une commande
kubectl logs deployment/mon-app | gitleaks stdin
# Scanner un fichier décompressé à la volée
gunzip -c logs.gz | gitleaks stdin

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.

Fenêtre de terminal
# Activer le décodage récursif (profondeur 2)
gitleaks dir /chemin --max-decode-depth=2
# Désactiver le décodage
gitleaks dir /chemin --max-decode-depth=0

Exemple : un token Stripe encodé en base64 sera détecté :

# Fichier contenant : c2tfbGl2ZV80ZUMzOUhxTHlqV0Rhcmp0VDF6ZHA3ZGMK
Finding: sk_live_4eC39HqLyjWDarjtT1zdp7dc
Secret: sk_live_4eC39HqLyjWDarjtT1zdp7dc
RuleID: stripe-access-token
Tags: [decoded:base64 decode-depth:1]

Les tags decoded:base64 et decode-depth:1 indiquent que le secret a été trouvé après décodage.

Gitleaks peut extraire et scanner le contenu des archives :

Fenêtre de terminal
# Scanner une archive avec profondeur 1
gitleaks dir archive.tar.gz --max-archive-depth=1
# Scanner des archives imbriquées (profondeur 3)
gitleaks dir archives/ --max-archive-depth=3

Formats 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/.env

Cela signifie : .env est dans files.tar, qui est dans nested.tar.gz.

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.

  1. Créer la baseline en générant un rapport initial

    Fenêtre de terminal
    gitleaks git --report-path baseline.json
  2. Utiliser la baseline pour les scans suivants

    Fenêtre de terminal
    gitleaks git --baseline-path baseline.json --report-path findings.json

    Seuls les nouveaux secrets seront rapportés.

Gitleaks supporte plusieurs formats de rapport :

Fenêtre de terminal
# JSON (défaut si --report-path est utilisé)
gitleaks git -f json -r report.json
# CSV
gitleaks 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 stdout
gitleaks git -f json -r -

Gitleaks est hautement configurable via un fichier .gitleaks.toml.

  1. Option --config ou -c
  2. Variable d’environnement GITLEAKS_CONFIG (chemin fichier)
  3. Variable d’environnement GITLEAKS_CONFIG_TOML (contenu TOML)
  4. Fichier .gitleaks.toml dans le répertoire scanné

Si aucune configuration n’est trouvée, Gitleaks utilise les règles par défaut.

.gitleaks.toml
# Titre de la configuration
title = "Configuration personnalisée"
# Étendre la configuration par défaut
[extend]
useDefault = true
# Désactiver certaines règles par défaut
disabledRules = ["generic-api-key"]
.gitleaks.toml
[[rules]]
# Identifiant unique
id = "internal-api-key"
# Description
description = "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 reporting
tags = ["internal", "api-key"]

Vous pouvez définir des allowlists au niveau global ou par règle :

.gitleaks.toml
# 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"]

Depuis v8.25, vous pouvez définir une allowlist et l’appliquer à plusieurs règles :

.gitleaks.toml
[[allowlists]]
# Appliquer à des règles spécifiques
targetRules = ["aws-access-token", "generic-api-key"]
description = "Fichiers de test"
paths = ['''tests/.*\.json$''']

Les règles composites permettent de détecter des secrets multi-parties (ex: clé + secret) :

.gitleaks.toml
[[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 suivantes

Ajoutez un commentaire gitleaks:allow pour ignorer une ligne :

# Cette clé est un exemple pour la documentation
AWS_KEY = "AKIAIOSFODNN7EXAMPLE" # gitleaks:allow

Ajoutez les fingerprints des secrets à ignorer :

.gitleaksignore
# Format : fingerprint (depuis le rapport JSON)
fbc14303ffbf8fb1c2c1914e8dda7d0121633aca:config.env:aws-access-token:4
77b2a3e56973785a52ba4ae4b8dac61d4bac016f:keys:private-key:6

Bloquez les secrets avant qu’ils ne soient commités :

.pre-commit-config.yaml
repos:
- repo: https://github.com/gitleaks/gitleaks
rev: v8.30.0
hooks:
- id: gitleaks
  1. Installer pre-commit

    Fenêtre de terminal
    pip install pre-commit
  2. Créer le fichier de configuration

    Fenêtre de terminal
    cat > .pre-commit-config.yaml << 'EOF'
    repos:
    - repo: https://github.com/gitleaks/gitleaks
    rev: v8.30.0
    hooks:
    - id: gitleaks
    EOF
  3. Installer les hooks

    Fenêtre de terminal
    pre-commit install
  4. 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 :

Fenêtre de terminal
SKIP=gitleaks git commit -m "skip check"

Utilisez l’action officielle Gitleaks :

.github/workflows/gitleaks.yml
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 }}

Intégrez Gitleaks dans vos merge requests :

.gitlab-ci.yml
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: false

Pour générer un rapport SARIF compatible avec GitLab Security Dashboard :

.gitlab-ci.yml
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.sarif

SymptômeCause probableSolution
Aucun résultatPas de secret trouvéNormal si le repo est propre
Faux positifs nombreuxSecrets de test, exemplesUtiliser .gitleaksignore ou allowlists
Scan très lentHistorique Git volumineuxUtiliser --log-opts="--max-count=100"
Erreur “no such file”URL distante non supportéeCloner le repo localement d’abord
Secret encodé non détectéDécodage désactivéVérifier --max-decode-depth
Archive non scannéeScan d’archives désactivéActiver --max-archive-depth=1
Fenêtre de terminal
# Niveau debug
gitleaks git --log-level=debug
# Niveau trace (très verbeux)
gitleaks git --log-level=trace

Depuis v8.26, Gitleaks identifie les fichiers lents :

Fenêtre de terminal
gitleaks git --log-level=debug 2>&1 | grep "slow"

Ajoutez ces fichiers à une allowlist ou utilisez --max-target-megabytes :

Fenêtre de terminal
# Ignorer les fichiers > 10 MB
gitleaks git --max-target-megabytes=10

Prévention : empêcher les secrets d’arriver dans Git

Section intitulée « Prévention : empêcher les secrets d’arriver dans Git »
  1. Pre-commit hooks — Bloquer les commits contenant des secrets
  2. Fichiers .gitignore — Exclure .env, *.pem, credentials.json
  3. Gestionnaire de secrets — Utiliser Vault, AWS Secrets Manager, ou Passbolt
  4. Variables d’environnement — Injecter les secrets au runtime
  1. CI/CD — Scanner chaque PR et push
  2. Scans périodiques — Auditer l’organisation complète chaque semaine
  3. Nouveaux repos — Ajouter Gitleaks dès la création
  1. Rotation immédiate — Révoquer et recréer le secret exposé
  2. Audit des accès — Vérifier les logs d’utilisation du secret compromis
  3. Nettoyage de l’historique — Utiliser git filter-branch ou BFG Repo-Cleaner
  4. Post-mortem — Comprendre comment le secret a été exposé

Gitleaks et TruffleHog sont les deux outils open source les plus populaires pour la détection de secrets :

CritèreGitleaksTruffleHog
Vitesse✅ Très rapide⚠️ Plus lent (vérification)
Vérification automatique❌ Non✅ Oui (800+ APIs)
Sources supportées3 (Git, dir, stdin)18 (Git, Docker, S3, Jenkins…)
Nombre de règles150+800+
ConfigurationTOML flexibleYAML 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.


  1. Trois commandesgit (historique), dir (fichiers), stdin (pipeline)
  2. 150+ règles intégrées — AWS, Stripe, GitHub, Slack, et bien plus
  3. Décodage automatique — Base64, hex, URL encoding détectés
  4. Scan d’archives — ZIP, tar.gz, 7z… avec --max-archive-depth
  5. Baseline — Ignorer les secrets déjà traités
  6. Pre-commit — Bloquer les secrets avant qu’ils n’atteignent Git
  7. Rotation immédiate — Un secret exposé = un secret compromis

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.