Aller au contenu
Sécurité medium

Pourquoi les secrets statiques posent problème

11 min de lecture

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

Un secret statique possède ces caractéristiques :

CaractéristiqueDescription
PréexistenceLe secret existe avant d’être utilisé
Stockage persistantIl est stocké quelque part (fichier, variable, coffre-fort)
Partage fréquentSouvent réutilisé par plusieurs composants
Longue durée de vieValide pendant des mois ou des années
Rotation manuelleChangé rarement, souvent manuellement

Mot de passe de base de données :

Fenêtre de terminal
# Défini une fois dans un fichier de configuration
DB_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 :

Fenêtre de terminal
# Générée sur le portail du fournisseur
STRIPE_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 :

Fenêtre de terminal
# Access keys AWS créées manuellement
AWS_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.

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.

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 debug

Chaque copie est une surface d’attaque supplémentaire.

Quand un secret statique est compromis, il faut :

  1. Identifier tous les endroits où il est utilisé
  2. Générer un nouveau secret
  3. Le déployer partout simultanément
  4. 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

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.

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 1
env:
- 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é” »
Fenêtre de terminal
# Script de déploiement
export 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 »
Fenêtre de terminal
# Le secret est dans Kubernetes
kubectl get secret db-creds -o jsonpath='{.data.password}' | base64 -d
# Mais aussi dans un .env pour le dev local
cat .env
DB_PASSWORD=same-password-here

Problème : le secret existe en plusieurs exemplaires, chacun avec ses propres risques.

Solution : source unique de vérité, injection runtime.

Ticket JIRA : "Rotation des secrets annuelle"
Assigné : Équipe Ops
Priorité : Basse
Statut : 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 attaquant

Problème : la révocation n’a pas été complète.

Solution : procédure de révocation claire, avec vérification.

.env.dev
DB_PASSWORD="password123"
# .env.staging
DB_PASSWORD="password123"
# .env.prod
DB_PASSWORD="password123"

Problème : compromission du dev = accès à la prod.

Solution : secrets distincts par environnement, générés automatiquement.

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.

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.

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.

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 :

  1. Centraliser dans un coffre-fort (Vault, Infisical)
  2. Séparer par environnement (dev ≠ staging ≠ prod)
  3. Limiter les permissions au strict nécessaire
  4. Tracer tous les accès
  5. Planifier des rotations régulières

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

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

Évaluez votre maturité actuelle :

QuestionRé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
  1. Un secret statique est un passif de sécurité — plus il vit longtemps, plus il représente un risque
  2. La duplication multiplie les surfaces d’attaque — chaque copie est une faille potentielle
  3. L’attribution est impossible avec des secrets partagés — vous ne saurez pas d’où vient la compromission
  4. La rotation manuelle ne passe pas à l’échelle — si c’est pénible, ce ne sera pas fait
  5. Les environnements éphémères nécessitent des secrets éphémères — le modèle statique ne fonctionne plus

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.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn