Un secret statique est un credential créé une fois, stocké quelque part, et réutilisé pendant des mois voire des années. C’est le modèle dominant depuis des décennies : mot de passe de base de données, clé API, token d’accès.
Le problème : ce modèle ne correspond plus aux architectures modernes. Les environnements éphémères, les microservices et le cloud ont multiplié les secrets tout en rendant leur gestion manuelle impossible.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Ce qu’est réellement un secret statique
- Pourquoi les secrets statiques posent des problèmes de sécurité
- Comment reconnaître les symptômes d’une mauvaise maturité
- Quelles alternatives existent
Prérequis
Section intitulée « Prérequis »Qu’est-ce qu’un secret statique
Section intitulée « Qu’est-ce qu’un secret statique »Un secret statique possède ces caractéristiques :
| Caractéristique | Description |
|---|---|
| Préexistence | Le secret existe avant d’être utilisé |
| Stockage persistant | Il est stocké quelque part (fichier, variable, coffre-fort) |
| Partage fréquent | Souvent réutilisé par plusieurs composants |
| Longue durée de vie | Valide pendant des mois ou des années |
| Rotation manuelle | Changé rarement, souvent manuellement |
Exemples concrets
Section intitulée « Exemples concrets »Mot de passe de base de données :
# Défini une fois dans un fichier de configurationDB_PASSWORD="SuperSecretPassword123!"Ce mot de passe est créé lors du setup initial, stocké dans un .env ou un
coffre-fort, et réutilisé pendant toute la durée de vie de l’application. Il
est parfois partagé entre plusieurs applications qui accèdent à la même base.
Clé API de service externe :
# Générée sur le portail du fournisseurSTRIPE_API_KEY="sk_live_abc123xyz789..."Cette clé est générée une fois, stockée dans les secrets CI/CD ou le coffre-fort, et utilisée par tous les environnements qui appellent l’API Stripe.
Token d’accès cloud :
# Access keys AWS créées manuellementAWS_ACCESS_KEY_ID="AKIAIOSFODNN7EXAMPLE"AWS_SECRET_ACCESS_KEY="wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"Ces clés sont créées dans la console IAM, stockées dans le pipeline CI/CD, et utilisées pendant des mois sans rotation.
Pourquoi les secrets statiques posent problème
Section intitulée « Pourquoi les secrets statiques posent problème »Durée de vie trop longue
Section intitulée « Durée de vie trop longue »Plus un secret existe longtemps, plus il a de chances d’être :
- Découvert par un attaquant
- Copié dans un endroit non sécurisé
- Partagé avec des personnes qui n’en ont plus besoin
- Oublié dans un ancien système
Impact : un secret compromis il y a 6 mois est peut-être toujours actif aujourd’hui.
Duplication dans plusieurs couches
Section intitulée « Duplication dans plusieurs couches »Un secret statique a tendance à se propager :
Secret original (Vault) ↓Copié dans Kubernetes Secret ↓Injecté comme variable d'environnement ↓Visible dans les logs de démarrage ↓Capturé dans un dump de debugChaque copie est une surface d’attaque supplémentaire.
Difficulté de révocation complète
Section intitulée « Difficulté de révocation complète »Quand un secret statique est compromis, il faut :
- Identifier tous les endroits où il est utilisé
- Générer un nouveau secret
- Le déployer partout simultanément
- S’assurer que l’ancien ne fonctionne plus
En pratique, cette opération est rarement complète. Il reste souvent un vieux script, un job cron oublié, ou une copie dans un backup qui continue d’utiliser l’ancien secret.
Mauvaise adaptation aux environnements éphémères
Section intitulée « Mauvaise adaptation aux environnements éphémères »Dans un cluster Kubernetes, les pods sont créés et détruits en permanence. Dans une architecture serverless, les fonctions sont éphémères.
Un secret statique suppose un environnement stable :
- L’application démarre une fois et tourne longtemps
- Le secret est configuré manuellement au déploiement
- La rotation se fait lors des maintenances planifiées
Ce modèle ne fonctionne pas quand :
- Des dizaines de pods sont créés par minute
- Chaque fonction serverless a besoin d’un accès
- L’infrastructure est reconstruite quotidiennement
Impossibilité d’attribution précise
Section intitulée « Impossibilité d’attribution précise »Quand plusieurs services partagent le même secret :
Service A ─────┐ │Service B ─────┼──→ Même mot de passe DB │Service C ─────┘Si une activité suspecte est détectée sur la base de données, impossible de savoir quel service est à l’origine. Les logs montrent juste “user: app_user” pour les trois.
OWASP souligne que les services partageant les mêmes secrets rendent l’identification de la source d’une compromission plus difficile.
Les symptômes d’une mauvaise maturité
Section intitulée « Les symptômes d’une mauvaise maturité »Reconnaissez-vous ces situations dans votre organisation ?
Symptôme 1 : mot de passe DB partagé entre applications
Section intitulée « Symptôme 1 : mot de passe DB partagé entre applications »# Application 1env: - name: DB_PASSWORD value: "shared-password-123"
# Application 2 (même secret)env: - name: DB_PASSWORD value: "shared-password-123"Problème : compromission de l’une = compromission des deux.
Solution : un credential distinct par application, idéalement dynamique.
Symptôme 2 : token admin utilisé “par facilité”
Section intitulée « Symptôme 2 : token admin utilisé “par facilité” »# Script de déploiementexport GITHUB_TOKEN="ghp_AdminTokenWithFullAccess..."Problème : ce script a accès à tout le compte GitHub.
Solution : token à permissions minimales (fine-grained PAT), en lecture seule si possible.
Symptôme 3 : secret copié entre Kubernetes et fichiers locaux
Section intitulée « Symptôme 3 : secret copié entre Kubernetes et fichiers locaux »# Le secret est dans Kuberneteskubectl get secret db-creds -o jsonpath='{.data.password}' | base64 -d
# Mais aussi dans un .env pour le dev localcat .envDB_PASSWORD=same-password-hereProblème : le secret existe en plusieurs exemplaires, chacun avec ses propres risques.
Solution : source unique de vérité, injection runtime.
Symptôme 4 : rotation annuelle manuelle
Section intitulée « Symptôme 4 : rotation annuelle manuelle »Ticket JIRA : "Rotation des secrets annuelle"Assigné : Équipe OpsPriorité : BasseStatut : Reporté (3ème fois)Problème : si la rotation est pénible, elle ne sera pas faite.
Solution : rotation automatisée ou secrets dynamiques.
Symptôme 5 : secret jamais supprimé après un incident
Section intitulée « Symptôme 5 : secret jamais supprimé après un incident »Historique :- 2024-01 : Fuite suspectée du token API- 2024-01 : Nouveau token généré- 2024-03 : Ancien token toujours actif (oublié)- 2024-06 : Ancien token utilisé par un attaquantProblème : la révocation n’a pas été complète.
Solution : procédure de révocation claire, avec vérification.
Symptôme 6 : même credential dev/staging/prod
Section intitulée « Symptôme 6 : même credential dev/staging/prod »DB_PASSWORD="password123"
# .env.stagingDB_PASSWORD="password123"
# .env.prodDB_PASSWORD="password123"Problème : compromission du dev = accès à la prod.
Solution : secrets distincts par environnement, générés automatiquement.
L’impact réel : scénarios de compromission
Section intitulée « L’impact réel : scénarios de compromission »Scénario 1 : la clé API dans l’historique Git
Section intitulée « Scénario 1 : la clé API dans l’historique Git »Un développeur commit temporairement une clé API pour tester. Il la retire dans le commit suivant.
Problème : l’historique Git conserve tout. Un an plus tard, un attaquant scanne les dépôts publics et trouve la clé.
Impact : la clé est toujours active car personne ne l’a rotée.
Scénario 2 : le mot de passe partagé
Section intitulée « Scénario 2 : le mot de passe partagé »Trois microservices utilisent le même mot de passe PostgreSQL. Une vulnérabilité dans le service le moins critique permet à un attaquant de lire les variables d’environnement.
Impact : l’attaquant a maintenant accès à la base de données partagée par les trois services, y compris les données sensibles des deux autres.
Scénario 3 : la rotation impossible
Section intitulée « Scénario 3 : la rotation impossible »Une équipe veut faire tourner un mot de passe critique. Mais le secret est utilisé par :
- 5 applications en production
- 2 jobs cron
- 3 scripts de maintenance
- 1 intégration tierce
Coordonner le changement simultané est trop risqué. La rotation est reportée.
Impact : le secret reste inchangé pendant 3 ans.
Que faire : les alternatives
Section intitulée « Que faire : les alternatives »Court terme : améliorer la gestion des secrets statiques
Section intitulée « Court terme : améliorer la gestion des secrets statiques »Même si vous ne pouvez pas éliminer les secrets statiques immédiatement :
- Centraliser dans un coffre-fort (Vault, Infisical)
- Séparer par environnement (dev ≠ staging ≠ prod)
- Limiter les permissions au strict nécessaire
- Tracer tous les accès
- Planifier des rotations régulières
Moyen terme : adopter les secrets dynamiques
Section intitulée « Moyen terme : adopter les secrets dynamiques »Remplacer les secrets statiques les plus critiques par des secrets dynamiques :
- Credentials de base de données générés à la demande
- Tokens cloud avec TTL court
- Certificats auto-renouvelés
Long terme : identité machine
Section intitulée « Long terme : identité machine »Pour les communications machine-to-machine, passer à des identités de workload :
- SPIFFE / SPIRE pour les identités cryptographiques
- Workload Identity pour les clouds (GCP, AWS, Azure)
- mTLS pour les communications inter-services
Checklist d’évaluation
Section intitulée « Checklist d’évaluation »Évaluez votre maturité actuelle :
| Question | Réponse idéale |
|---|---|
| Combien de temps vos secrets restent-ils valides ? | Heures ou jours, pas mois |
| Un secret est-il partagé entre plusieurs services ? | Non, un par service |
| Pouvez-vous roter un secret en moins d’une heure ? | Oui, de façon automatisée |
| Savez-vous quels services utilisent chaque secret ? | Oui, avec certitude |
| Les environnements dev/staging/prod ont-ils des secrets distincts ? | Oui, toujours |
| La révocation d’un secret est-elle testée régulièrement ? | Oui, en exercice |
À retenir
Section intitulée « À retenir »- Un secret statique est un passif de sécurité — plus il vit longtemps, plus il représente un risque
- La duplication multiplie les surfaces d’attaque — chaque copie est une faille potentielle
- L’attribution est impossible avec des secrets partagés — vous ne saurez pas d’où vient la compromission
- La rotation manuelle ne passe pas à l’échelle — si c’est pénible, ce ne sera pas fait
- Les environnements éphémères nécessitent des secrets éphémères — le modèle statique ne fonctionne plus