Tokens API
GitHub PAT, GitLab tokens, tokens cloud (AWS, GCP, Azure)
Mise à jour :
Un couple d’AK/SK committé par erreur. Une clé API dans un fichier .env.example.
Un token GitLab dans les logs de CI. Ces scénarios ne sont pas hypothétiques :
85% des fuites de secrets passent par Git selon GitGuardian.
Le secrets scanning n’est pas une option. C’est une ligne de défense obligatoire dans toute usine logicielle.
Les secrets fuient par des chemins prévisibles :
| Vecteur | Exemple | Détection possible |
|---|---|---|
| Commit direct | password = "admin123" dans le code | ✅ Scanning repo |
| Fichier exemple | .env.example avec vraies valeurs | ✅ Scanning repo |
| Historique Git | Secret supprimé mais présent dans l’historique | ✅ Scan historique |
| Logs CI/CD | Token affiché dans les logs de build | ⚠️ Masquage variables |
| Artefacts | Credentials dans un binaire ou config packagée | ⚠️ Scan artefacts |
| MR/PR | Secret dans une diff avant merge | ✅ Scan MR |
L’enjeu n’est pas d’atteindre le “zéro secret exposé” (utopique), mais de :
Tokens API
GitHub PAT, GitLab tokens, tokens cloud (AWS, GCP, Azure)
Credentials
Mots de passe, strings de connexion DB, credentials SMTP
Clés cryptographiques
Clés privées SSH/TLS, clés de chiffrement, JWT secrets
Webhooks & URLs
URLs avec tokens intégrés, webhooks Slack/Discord
Tous les patterns détectés ne sont pas des secrets :
xxx ou REPLACE_MEUne stratégie efficace gère ce bruit au lieu de le subir.
La détection des secrets doit intervenir à plusieurs niveaux :
Avant le push (client-side)
Pre-commit hooks avec Gitleaks. Bloque le commit avant qu’il n’atteigne le serveur.
✅ Feedback immédiat pour le développeur ⚠️ Contournable (hooks désactivables)
Dans la Merge Request
Scan automatique sur chaque MR. Feedback visible dans la diff.
✅ Point de contrôle centralisé ✅ Impossible à contourner ⚠️ Détection “tardive” (après commit)
Sur la branche par défaut
Scan post-merge comme filet de sécurité.
✅ Couverture complète ⚠️ Réaction après le fait
Recommandation : combiner les trois niveaux. Le pre-commit accélère le feedback, la MR garantit le contrôle, le scan de branche assure la couverture.
| Critère | GitLab Secret Detection | Gitleaks | TruffleHog |
|---|---|---|---|
| Intégration | Native GitLab | CI générique | CI générique |
| Méthode | Règles regex | Règles regex | Entropie + regex + validation |
| Historique | ⚠️ Limité | ✅ Complet | ✅ Complet |
| Validation | ❌ | ❌ | ✅ (certains providers) |
| Coût | Inclus Ultimate | Gratuit | Gratuit / Enterprise |
| Bruit | Moyen | Configurable | Faible (validation) |
Solution intégrée pour les utilisateurs GitLab Ultimate :
include: - template: Jobs/Secret-Detection.gitlab-ci.yml→ Documentation GitLab Secret Detection ↗
Outil open source, rapide, configurable :
secrets-scan: image: zricethezav/gitleaks:latest script: - gitleaks detect --source . --verbose --redact rules: - if: $CI_PIPELINE_SOURCE == "merge_request_event"Forces :
.gitleaks.toml--log-opts="--all")Détection avancée avec validation des secrets :
secrets-scan: image: trufflesecurity/trufflehog:latest script: - trufflehog git file://. --only-verified --failForces :
| Situation | Recommandation |
|---|---|
| GitLab Ultimate, équipe petite | GitLab Secret Detection |
| CI générique, besoin de contrôle | Gitleaks |
| Volume important, faux positifs problématiques | TruffleHog |
| Défense en profondeur | Gitleaks (pre-commit) + TruffleHog (CI) |
Avant d’implémenter, l’équipe doit trancher :
| Question | Options |
|---|---|
| Quand bloquer la pipeline ? | Toujours / Seulement sur branches protégées / Jamais (warning) |
| Quels types de secrets bloquent ? | Tous / Seulement haute sévérité / Liste explicite |
| Quid des faux positifs ? | Baseline + allowlist / Review manuelle |
Les exceptions sont inévitables. Les documenter :
[[rules.allowlist]]description = "Fake key for tests"regexes = ['''FAKE_.*_KEY''']paths = ["tests/", "fixtures/"]Règles :
Vrai secret ?
Faux positif (hash, fixture, exemple) → Ajouter à l’allowlist
Exposé publiquement ?
Repo public, MR publique, historique accessible → Rotation urgente
Quel scope ?
Accès limité (dev) vs accès large (prod, admin)
Rotation possible ?
Token révocable → Révoquer immédiatement Credential hardcodé → Rotation + audit d’utilisation
| Situation | Action |
|---|---|
| Secret valide détecté | 1. Révoquer/rotater 2. Vérifier les logs d’accès 3. Supprimer du code |
| Secret dans l’historique | Rotation obligatoire (même si supprimé du code actuel) |
| Secret exposé publiquement | Rotation + audit + évaluer la purge d’historique |
Chaque incident de secret exposé devrait générer :
❌ On a masqué la variable, donc c'est bon
❌ On a supprimé le fichier du repo
git log -p ou un clone suffisent à retrouver le secret.
Seule la rotation protège. ❌ On scanne la branche default, ça suffit
❌ Trop de faux positifs → on désactive
❌ On bloque tout dès J1
❌ Confondre scanning et management