Aller au contenu
Sécurité medium
🔐 Alerte sécurité — Incident supply chain Trivy : lire mon analyse de l'attaque

Gestion des secrets : réduire les risques

21 min de lecture

Un développeur commit “temporairement” un mot de passe de base de données. Trois mois 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.

Le problème n’est pas seulement la fuite accidentelle. Le vrai problème est l’usage massif de secrets statiques : trop durables, trop partagés, trop difficiles à révoquer. Les architectures modernes cherchent à réduire les secrets persistants au profit de secrets dynamiques et d’identités de workload.

Avant d’aller plus loin, voici les termes que vous croiserez tout au long de cette page :

  • Secret statique : accès stocké longtemps (mot de passe, clé API permanente)
  • Secret dynamique : accès généré à la demande, avec durée de vie limitée
  • Identité machine : identité cryptographique d’un workload (SPIFFE ID, certificat)
  • Workload : application, pod, service, job, VM, fonction serverless
  • Rotation : changement régulier d’un secret pour limiter l’exposition
  • Bootstrap : processus d’obtention du premier accès au coffre-fort

Un secret est toute information sensible donnant accès à un système :

  • Mot de passe
  • Clé API
  • Token d’authentification
  • Certificat TLS
  • Clé SSH
  • Secret applicatif (JWT secret, encryption key)
  • Identifiant technique (service account)

Tous ces éléments sont sensibles, mais leur gestion n’obéit pas exactement aux mêmes règles. Un mot de passe, une clé API, une clé privée et un certificat ont des cycles de vie et des contraintes différents. Le NIST SP 800-57 existe justement parce que la gestion des clés cryptographiques a ses propres exigences.

Contrairement à une vulnérabilité logicielle qui nécessite une exploitation technique, un secret exposé donne un accès immédiat :

ConséquenceImpact
Accès immédiatL’attaquant entre sans effort
Contournement des contrôlesAuthentification légitime, pas de détection
Déplacement latéralUn secret mène souvent à d’autres systèmes
Difficulté de détectionActivité “normale” avec des credentials valides
Compromission durableSi le secret ne tourne jamais, l’accès persiste

Les secrets ne fuient pas que dans le code source. Voici les surfaces réelles d’exposition :

  • Code source : password = "admin123" en dur dans un fichier
  • Historique Git : commit supprimé mais toujours accessible via git log
  • Variables CI/CD : secret affiché dans les logs de pipeline
  • Fichiers .env : committé “par erreur” ou copié entre environnements
  • Images Docker : secret visible via docker history
  • Logs applicatifs : credential affiché en mode debug
  • Outils de debug : secret capturé dans un dump mémoire ou un core dump
  • Chat et tickets : secret partagé par Slack, JIRA, email

La gestion des secrets n’est pas qu’une affaire de sécurité. Elle concerne toute personne qui touche au code, à l’infrastructure ou aux données. Voici comment chaque rôle contribue à une gestion saine.

ProfilResponsabilitéPriorité
DéveloppeurNe jamais commiter de secrets, utiliser l’injection runtimeQuotidienne
Ops / SREConfigurer les coffres-forts, automatiser rotation et révocationCritique
DevSecOpsDétecter les secrets exposés, intégrer les scans CI/CDContinue
RSSIPolitique de gestion des secrets, audit de conformitéStratégique
Tech LeadRevue de code, culture équipe, choix des outilsEncadrement

Le code source ne doit jamais contenir de secrets. Les secrets sont injectés au runtime depuis une source externe sécurisée.

Fenêtre de terminal
# ❌ Mauvais : secret en dur
DB_PASSWORD="mon-super-mot-de-passe"
# ✅ Bon : référence à un coffre-fort
DB_PASSWORD=$(vault kv get -field=password secret/db/prod)
  • Chiffrer : les secrets sont stockés chiffrés, jamais en clair
  • Centraliser : un point unique de vérité, pas de copies multiples
  • Tracer : chaque accès est audité (qui, quand, pourquoi)

Un secret donne accès au minimum requis. Un token admin “par facilité” est une surface d’attaque maximale.

Un secret doit pouvoir être changé rapidement. Si la rotation est pénible, elle ne sera pas faite.

L’humain est le maillon faible. Automatisez la génération, la distribution, la rotation et la révocation.

Consultez le guide dédié : Cycle de vie d’un secret.

Chaque secret passe par plusieurs étapes. Comprendre ce cycle permet d’identifier les points de contrôle où appliquer les bonnes pratiques.

ÉtapeDescriptionBonnes pratiques
GénérationCréer un secret fortAléatoire, longueur suffisante, entropie élevée
StockagePersister de façon sécuriséeCoffre-fort chiffré, contrôle d’accès
DistributionTransmettre à l’applicationInjection runtime, jamais en clair dans les configs
UtilisationAccéder au secretAccès tracé, durée de vie limitée
RotationChanger régulièrementAutomatisée, sans interruption de service
RévocationInvalider immédiatementSuppression rapide si compromission suspectée
AuditTracer les accèsLogs centralisés, alertes sur anomalies

Le vrai problème : les limites des secrets statiques

Section intitulée « Le vrai problème : les limites des secrets statiques »

C’est le point clé que beaucoup de guides ignorent. Avant de parler d’outils, il faut comprendre pourquoi les secrets traditionnels posent problème.

Un secret statique est un secret qui :

  • Existe avant d’être utilisé
  • Est stocké quelque part (fichier, variable, coffre-fort)
  • Est souvent partagé entre plusieurs composants
  • A une durée de vie longue (mois, années)
  • Nécessite une rotation manuelle ou peu fréquente

Exemples : mot de passe de base de données, clé API permanente, token d’accès stocké dans un coffre-fort puis réutilisé pendant des mois.

ProblèmeConséquence
Durée de vie trop longuePlus de temps pour être découverts et exploités
Duplication dans plusieurs couchesDifficile de savoir où ils sont tous
Difficiles à révoquer partoutUn secret compromis reste actif quelque part
Mal adaptés aux environnements éphémèresPods Kubernetes, fonctions serverless
Mauvaise attributionImpossible de savoir quel service a causé un incident

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 ?

  • Mot de passe DB partagé entre plusieurs applications
  • Token admin utilisé “par facilité” dans un script
  • Secret stocké dans Kubernetes puis copié dans un .env
  • Rotation annuelle manuelle (si elle est faite)
  • Secret jamais supprimé après un incident
  • Même credential en dev, préprod et prod

Secrets statiques, secrets dynamiques et identité machine

Section intitulée « Secrets statiques, secrets dynamiques et identité machine »

Cette section est centrale pour comprendre l’évolution de la gestion des secrets.

Un secret créé manuellement, stocké, puis réutilisé :

  • Mot de passe PostgreSQL défini une fois
  • Clé API longue durée
  • Token stocké dans un coffre-fort et réutilisé pendant des mois

Un secret généré à la demande, avec une durée de vie limitée :

  • Généré au moment où l’application en a besoin
  • Limité dans le temps (TTL)
  • Lié à un rôle ou une politique
  • Révoqué automatiquement à expiration

Exemple : Vault génère un utilisateur PostgreSQL temporaire avec un mot de passe unique, valide 1 heure, puis le supprime automatiquement.

Un concept différent : la machine ou le workload prouve son identité :

  • L’application reçoit un document cryptographique court (certificat, token)
  • Cette identité permet de s’authentifier auprès d’autres services
  • Pas de secret partagé entre services

Exemple : un pod Kubernetes reçoit un SPIFFE ID (identité cryptographique) qu’il utilise pour s’authentifier auprès d’une base de données, sans mot de passe.

Pour simplifier :

  • Un secret statique est un accès stocké quelque part
  • Un secret dynamique est un accès créé à la demande puis expiré
  • Une identité machine permet à un service de prouver qui il est, sans partager un mot de passe durable
ModèleExempleAvantagesLimites
Secret statiqueMot de passe DB, clé API longueSimple à comprendreFuite durable, rotation difficile
Secret dynamiqueLogin DB temporaire, credentials cloud TTL courtRévocation automatique, durée de vie réduiteNécessite une plateforme adaptée
Identité machineSPIFFE ID, certificat workload, OIDC federationÉvite le secret partagé, meilleure attributionPlus complexe à concevoir

Les secrets dynamiques n’existent pas avant lecture. Cela réduit le risque de vol. Après usage ou expiration, ils sont révoqués automatiquement.

Pas de rotation manuelle : chaque accès génère un nouveau secret. L’ancien expire naturellement.

Un secret dynamique compromis est valide quelques minutes ou heures, pas des années.

Chaque pod, chaque job CI, chaque fonction reçoit ses propres credentials. L’attribution d’un incident devient triviale.

Chaque secret généré est lié à un demandeur spécifique. Les logs d’audit sont précis.

Vault peut générer des utilisateurs temporaires pour :

  • PostgreSQL
  • MySQL / MariaDB
  • MongoDB
  • Microsoft SQL Server

L’utilisateur est créé à la demande avec les permissions définies dans un rôle, et supprimé automatiquement après expiration du TTL.

Au lieu de stocker des access keys AWS longue durée :

  • Vault génère des credentials IAM à la demande
  • Durée de vie de quelques minutes à quelques heures
  • Aucun secret persistant dans les pipelines CI/CD

Le service mesh ou le proxy génère des certificats de courte durée pour le chiffrement inter-services. Rotation automatique toutes les 24 heures ou moins.

Le workflow s’authentifie via OIDC, récupère un token de courte durée, et n’a jamais besoin de stocker de credentials dans le dépôt.

Ce n’est pas un “mot de passe de machine”. C’est une identité vérifiable cryptographiquement attribuée à un workload :

  • Une VM
  • Un pod Kubernetes
  • Un service
  • Un agent
  • Une fonction serverless

Pourquoi ce n’est pas la même chose qu’un secret

Section intitulée « Pourquoi ce n’est pas la même chose qu’un secret »
SecretIdentité machine
Peut être copiéDélivrée après attestation
Dure longtempsGénéralement courte (certificat temporaire)
PartageableLiée à un workload spécifique
Difficile à attribuerAttribution précise
  • Service A appelle service B (API interne)
  • Pod Kubernetes appelle une base de données
  • Runner CI appelle un registry d’artefacts
  • Agent infra appelle une API cloud
  • Sidecar ou proxy mTLS

Pour clarifier votre gestion, distinguez :

  1. Secrets humains : mots de passe utilisateurs, MFA
  2. Secrets applicatifs : clés API, tokens, credentials DB
  3. Identités machine : certificats workload, SPIFFE ID, tokens OIDC

Pour approfondir l’identité machine : Identité machine et workload identity.

Vers des architectures moins dépendantes des secrets

Section intitulée « Vers des architectures moins dépendantes des secrets »

Réduire les secrets persistants autant que possible

Section intitulée « Réduire les secrets persistants autant que possible »

L’objectif n’est pas d’éliminer tous les secrets, mais de réduire les plus risqués :

  • Fédération d’identité (OIDC, SAML)
  • Workload identity (SPIFFE, cloud IAM)
  • Secrets dynamiques (Vault, cloud secrets engines)
  • Certificats courts (cert-manager, SPIRE)
  • Accès temporaires pour CI/CD

Dans certains cas, un secret statique est inévitable :

  • Équipements legacy sans support moderne
  • Intégrations tierces imposant une clé API
  • Outils ne supportant pas l’identité fédérée
  • Bootstrap initial (le premier secret pour accéder au coffre-fort)

Ne pas chercher à tout remplacer d’un coup, mais supprimer progressivement les credentials les plus durables, les plus partagés et les plus critiques.

  1. Le pod reçoit une identité de workload (SPIFFE ID ou service account token)
  2. Cette identité permet d’obtenir un credential DB dynamique depuis Vault
  3. Le credential expire automatiquement après 1 heure
  4. Aucun mot de passe permanent n’est embarqué dans l’image
  1. Le workflow s’authentifie via OIDC (GitHub Actions, GitLab CI)
  2. Il récupère un token temporaire pour accéder au registry ou au cloud
  3. Aucun token longue durée n’est stocké dans les secrets du dépôt
  1. mTLS avec identités de workload
  2. Autorisation basée sur l’identité du service (SPIFFE ID)
  3. Pas de secret partagé entre microservices

Les outils ne suffisent pas. Une gestion saine des secrets nécessite une gouvernance claire et des processus organisationnels.

Savez-vous exactement :

  • Combien de secrets existent dans votre organisation ?
  • Où chaque secret est utilisé ?
  • Quelle est sa date d’expiration ou de rotation attendue ?
  • Qui est le propriétaire responsable ?

Sans inventaire, la réponse à incident est aveugle.

Chaque secret doit avoir un propriétaire identifié :

  • Qui décide de le créer ou de le révoquer ?
  • Qui est alerté en cas de compromission ?
  • Qui valide les accès ?

Que faites-vous quand un secret fuite ?

  1. Détecter : alerting sur exposition GitHub, logs anormaux
  2. Révoquer : invalidation immédiate du secret
  3. Tourner : nouveau secret pour tous les consommateurs légitimes
  4. Analyser : comprendre comment c’est arrivé
  5. Améliorer : corriger le processus pour éviter que ça se reproduise

Testez-vous régulièrement cette procédure ? Une procédure non testée est une procédure qui échouera en conditions réelles.

Les erreurs suivantes sont fréquentes dans les organisations, même celles qui utilisent un coffre-fort. Chaque piège a un impact direct sur la posture de sécurité et nécessite une action corrective.

PiègeConséquenceSolution
Secret statique partagé entre servicesImpossible d’attribuer un incidentIdentité ou secret distinct par workload
Rotation manuelle rareSecret valide trop longtempsSecrets dynamiques ou rotation automatisée
Kubernetes Secrets comme seul coffre-fortFaux sentiment de sécuritéChiffrement etcd + RBAC + External Secrets
Token cloud long terme dans CI/CDCompromission durableOIDC, accès temporaires, workload identity
Secrets via variables d’environnement uniquementExposition dans logs, /proc, dumpsInjection contrôlée, durée de vie minimale
Même secret dev/staging/prodCompromission dev = compromission prodSecrets séparés par environnement
Commiter “temporairement”L’historique Git conserve toutPre-commit hooks avec Gitleaks

Le marché propose plusieurs solutions, chacune avec ses forces. HashiCorp Vault reste la référence établie, mais le changement de licence (BSL) en 2023 a conduit la communauté à créer OpenBao, un fork communautaire open source de Vault sous gouvernance ouverte (Linux Foundation / OpenSSF).

OutilSpécialité
HashiCorp VaultSecrets statiques, dynamiques, PKI, transit encryption
OpenBaoFork open source de Vault, stockage sécurisé, secrets dynamiques
SPIFFE / SPIREIdentités de workload, attestation, mTLS
AWS IAM Roles AnywhereWorkload identity pour ressources hors AWS
GCP Workload IdentityIdentité pour pods GKE sans service account key
Azure Workload IdentityIdentité pour pods AKS avec federation OIDC
External Secrets OperatorSynchronisation secrets externes → Kubernetes
Secrets Store CSI DriverMontage de secrets depuis providers externes
  • Gestionnaire de mots de passe (Bitwarden, Passbolt)
  • MFA obligatoire
  • Partage contrôlé avec audit
  • Rotation régulière
  • Coffre-fort central (Vault, Infisical)
  • Injection runtime (pas de .env committé)
  • Rotation programmée
  • Secrets dynamiques (Vault database secrets engine)
  • Workload identity (SPIFFE, cloud IAM)
  • Certificats courts (cert-manager, SPIRE)
  • mTLS inter-services
  • Accès temporaires CI/CD (OIDC)
  • Secret statique, mais fortement contrôlé
  • Rotation la plus fréquente possible
  • Monitoring des accès
  • Moindre privilège strict
  1. Le code source ne doit jamais contenir de secrets — c’est la règle de base
  2. Un secret statique doit être l’exception, pas la norme — visez les secrets dynamiques
  3. Un secret dynamique est préférable à un secret longue durée — réduisez la fenêtre d’exploitation
  4. Pour le machine-to-machine, pensez identité avant mot de passe — SPIFFE, workload identity
  5. La bonne stratégie consiste à réduire progressivement les secrets persistants — pas tout d’un coup

Cette page pivot pose les bases. Elle ne traite pas en profondeur :

  • PKI et gestion des certificats — Architecture PKI, chaînes de confiance, automatisation avec cert-manager
  • Design des politiques d’autorisation — RBAC, ABAC, OPA, admission controllers
  • Procédures d’incident complètes — Playbooks de réponse, forensics, communication de crise

Les guides enfants détaillent ces sujets.

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