Gestion des secrets
Mise à jour :
Un développeur commit “temporairement” un mot de passe de base de données pour tester son code. Trois ans plus tard, un attaquant scanne GitHub, trouve ce secret dans l’historique Git, et accède à la base de production. Le commit avait été supprimé, mais l’historique Git conserve tout.
85% des fuites de données impliquent des credentials compromis. La gestion des secrets n’est pas une option, c’est une nécessité.
Pourquoi les secrets sont une cible prioritaire
Un secret est toute information qui permet d’accéder à un système : mot de passe, clé API, token, certificat, clé SSH. Contrairement à une vulnérabilité logicielle qui nécessite une exploitation technique, un secret exposé donne un accès immédiat.
| Risque | Impact |
|---|---|
| Secret dans le code | Accessible à tous ceux qui ont accès au repo (y compris l’historique) |
| Secret dans les logs | Visible par les équipes ops, archivé, potentiellement public |
| Secret partagé par chat | Aucune traçabilité, impossible à révoquer proprement |
| Secret jamais roté | Un secret compromis reste valide des années |
| Secret trop permissif | Un token admin quand un accès lecture suffit |
Qui est concerné
| Profil | Responsabilité | Priorité |
|---|---|---|
| Développeur | Ne jamais commiter de secrets, utiliser des variables d’environnement | Quotidienne |
| Ops / SRE | Configurer les coffres-forts, automatiser la rotation | Critique |
| DevSecOps | Détecter les secrets exposés, intégrer les scans CI/CD | Continue |
| RSSI | Politique de gestion des secrets, audit de conformité | Stratégique |
| Tech Lead | Revue de code, culture équipe, choix d’outils | Encadrement |
Comment fonctionne une gestion saine des secrets
Principe : séparation code/secrets
Le code source ne doit jamais contenir de secrets. Les secrets sont injectés au runtime depuis une source externe sécurisée.
# ❌ Mauvais : secret en durDB_PASSWORD="mon-super-mot-de-passe"
# ✅ Bon : référence à un coffre-fortDB_PASSWORD=$(vault kv get -field=password secret/db/prod)Cycle de vie d’un secret
- Génération : créer un secret fort (aléatoire, longueur suffisante)
- Stockage : coffre-fort chiffré avec contrôle d’accès
- Distribution : injection au runtime, jamais en clair dans les configs
- Utilisation : accès tracé, durée de vie limitée
- Rotation : changement régulier, automatisé si possible
- Révocation : suppression immédiate si compromission suspectée
Scénario concret : application web avec base de données
Situation : une API Node.js doit se connecter à PostgreSQL.
Mauvaise pratique :
// ❌ Secret en dur dans le codeconst db = new Pool({ password: 'prod-password-123'});Bonne pratique avec HashiCorp Vault :
// ✅ Secret injecté depuis l'environnementconst db = new Pool({ password: process.env.DB_PASSWORD});# Injection via Kubernetes avec External Secrets OperatorapiVersion: external-secrets.io/v1beta1kind: ExternalSecretspec: secretStoreRef: name: vault-backend target: name: db-credentials data: - secretKey: DB_PASSWORD remoteRef: key: secret/data/prod/db property: passwordVérification :
# Le secret n'apparaît pas dans les sourcesgrep -r "password" --include="*.js" .# Résultat : aucune correspondance avec des valeurs en clairPièges courants
| Piège | Conséquence | Solution |
|---|---|---|
| Commiter “temporairement” | L’historique Git conserve tout | Pre-commit hooks avec Gitleaks |
| Variables d’env non protégées | Visibles dans logs, dumps, /proc | Coffre-fort avec injection runtime |
| Partage par Slack/email | Aucune traçabilité ni révocation | Coffre-fort avec accès partagé |
| Jamais de rotation | Secret compromis = accès permanent | Rotation automatique (Vault, AWS SM) |
| Même secret partout | Dev compromis = prod compromis | Secrets séparés par environnement |
| Token admin par défaut | Surface d’attaque maximale | Moindre privilège, scopes limités |
| Secrets dans les images Docker | Extraits avec docker history | Multi-stage builds, injection runtime |
Outils disponibles
Détection de secrets
Coffres-forts et gestionnaires
Outils à explorer
| Outil | Usage | Fournisseur |
|---|---|---|
| AWS Secrets Manager | Secrets AWS avec rotation automatique | Amazon |
| Azure Key Vault | Gestion clés/secrets écosystème Azure | Microsoft |
| Google Secret Manager | Secrets GCP avec IAM intégré | |
| Kubernetes Secrets | Secrets natifs K8s (chiffrer etcd !) | CNCF |
| Ansible Vault | Chiffrement des variables Ansible | Red Hat |
| VaultWarden | Alternative légère à Bitwarden | Open source |
À retenir
- Jamais dans le code — les secrets sont injectés au runtime depuis un coffre-fort
- Détection continue — scannez chaque commit avec Gitleaks ou TruffleHog en CI
- Rotation automatique — un secret a une durée de vie limitée
- Moindre privilège — chaque secret donne accès au strict nécessaire
- Audit et traçabilité — sachez qui accède à quoi, quand, et pourquoi
Liens utiles
Guides internes
- Principe du moindre privilège — limiter les accès au strict nécessaire
- Sécurité des pipelines CI/CD — protéger les secrets dans les workflows
- Gestion des accès — IAM et contrôle d’accès