Aller au contenu
Sécurité medium

Vault : secrets dynamiques vs statiques

12 min de lecture

Les secrets dynamiques sont la vraie promesse de Vault : au lieu de stocker des credentials permanents que tout le monde partage, Vault génère des identifiants uniques, temporaires et révocables pour chaque workload.

Ce guide explique la différence entre secrets statiques et dynamiques, le modèle lease/TTL, et comment choisir le bon moteur selon votre besoin.

Le modèle classique de gestion des secrets :

Schéma du problème : credential permanent partagé entre plusieurs applications

Problèmes :

RisqueConséquence
Credential partagéSi compromis, toutes les apps sont exposées
Pas de traçabilitéImpossible de savoir quelle app a fait quoi
Révocation difficileChanger le mot de passe impacte toutes les apps
Rotation manuelleOublis, fenêtres d’exposition longues
Secrets dans le codeFuites via Git, logs, variables d’environnement

Vault stocke un secret que vous avez créé. Le secret existe indépendamment de Vault et ne change pas automatiquement.

Fenêtre de terminal
# Vous créez le secret
vault kv put secret/myapp/db password="secret123"
# Vous le lisez
vault kv get secret/myapp/db

Cas d’usage :

  • Clés API tierces imposées par le fournisseur
  • Secrets legacy non migrables
  • Configuration statique (URLs, paramètres)

Vault génère un secret à la demande, avec une durée de vie limitée. Le secret n’existait pas avant la requête et sera révoqué à expiration.

Fenêtre de terminal
# Vault génère un nouveau user/password PostgreSQL
vault read database/creds/readonly
# Sortie : credentials uniques, valides 1 heure
Key Value
--- -----
lease_id database/creds/readonly/abcd1234
lease_duration 1h
username v-token-readonly-xyz123
password A1B2c3D4e5F6g7H8

Cas d’usage :

  • Accès base de données (PostgreSQL, MySQL, MongoDB)
  • Credentials cloud (AWS, GCP, Azure)
  • Certificats TLS (PKI)
  • Accès SSH (certificats signés)

Chaque secret dynamique est associé à un lease (bail) qui définit sa durée de vie.

Le lease est un identifiant unique qui référence le secret émis :

lease_id: database/creds/readonly/abcd1234-5678-90ef-ghij-klmnopqrstuv

Vault stocke ce lease et sait :

  • Quel secret a été émis
  • À qui (quel token)
  • Quand il expire
  • Comment le révoquer

Exemples de TTL fréquents :

TTLCas d’usage
1hAccès DB pour un job batch
24hSession de développement
72hCredentials CI/CD
30 joursCertificats TLS services

Avant expiration, le client peut prolonger le lease :

Fenêtre de terminal
vault lease renew database/creds/readonly/abcd1234

Le renouvellement est limité par le max_ttl configuré sur le rôle.

À tout moment, vous pouvez révoquer un lease :

Fenêtre de terminal
# Révoquer un lease spécifique
vault lease revoke database/creds/readonly/abcd1234
# Révoquer tous les leases d'un préfixe
vault lease revoke -prefix database/creds/readonly

Vault exécute l’action de nettoyage : pour une base de données, il supprime l’utilisateur créé. Pour AWS, il révoque les credentials IAM.

Certains moteurs (Database, AWS) supportent deux modes.

Vault crée un nouveau credential à chaque requête :

Fenêtre de terminal
# Chaque appel crée un nouvel utilisateur DB
vault read database/creds/app-role
# → username: v-token-app-xyz123
vault read database/creds/app-role
# → username: v-token-app-abc456 (différent!)

Avantages :

  • Credentials uniques par workload
  • Traçabilité parfaite
  • Révocation granulaire

Inconvénients :

  • Nécessite que l’app gère le renouvellement
  • Plus de credentials à gérer côté système cible

Vault gère un credential existant et le fait tourner automatiquement :

Fenêtre de terminal
# Toujours le même utilisateur, mais password roté
vault read database/static-creds/legacy-app
# → username: legacy_app_user (fixe)
# → password: RotatedPass123 (changé périodiquement)

Avantages :

  • Compatible avec les apps legacy qui attendent un user fixe
  • Rotation automatique sans changer l’architecture

Inconvénients :

  • Credential partagé si plusieurs apps utilisent le même static role
  • Moins de traçabilité
BesoinMoteur VaultTypeTTL typique
Credentials PostgreSQL/MySQLDatabaseDynamique1-24h
Compte DB legacy à rotationDatabase (static role)Gérérotation 24h
Credentials AWS IAMAWSDynamique1-12h
Access key AWS existanteAWS (static role)Gérérotation 24h
Certificats TLSPKIDynamique30-90 jours
Accès SSH aux serveursSSHDynamique5 min - 24h
Clés API tierces imposéesKVStatiqueN/A
Configuration applicativeKVStatiqueN/A
Le credential peut-il être généré à la demande ?
├── Oui → Secret dynamique
│ ├── Base de données → Database secrets engine
│ ├── AWS → AWS secrets engine
│ ├── Azure → Azure secrets engine
│ ├── GCP → GCP secrets engine
│ ├── Certificat TLS → PKI secrets engine
│ └── Accès SSH → SSH secrets engine
└── Non (imposé par un tiers)
└── KV secrets engine

Avec les secrets dynamiques, chaque workload obtient un credential unique. La traçabilité devient bien plus simple :

Credentials dynamiques : chaque app a son propre identifiant unique

Bénéfices :

AspectAvant (partagé)Après (dynamique)
Audit DB”admin a fait X""v-token-app-b a fait X”
CompromissionToutes les apps exposéesUne seule app exposée
RévocationImpacte tout le mondeRévoque juste l’app compromise
RotationCoordination manuelleAutomatique par TTL

Les logs d’audit Vault tracent :

  • Quel token a demandé le credential
  • Quelle méthode d’auth a obtenu ce token
  • L’heure exacte de l’émission

Vous pouvez corréler :

  1. Log Vault : token abc123 a demandé database/creds/readonly à 10:00
  2. Log PostgreSQL : user v-token-readonly-xyz a exécuté SELECT * FROM users à 10:05
  3. Conclusion : l’app avec token abc123 a lu la table users

Les secrets dynamiques ne sont pas toujours possibles. Utilisez KV quand le secret est imposé par un tiers ou non générable par Vault :

CasExemplePourquoi KV
Clé API tierceStripe, Twilio, SendGridLe fournisseur impose la clé
Secret partagé partenaireToken d’intégration B2BNégocié manuellement
Licence logicielleClé de licence propriétaireNon générable
Credential legacyMot de passe d’un système non supportéPas de plugin Vault
Configuration statiqueURLs, paramètres non secretsPas besoin de dynamique

Les secrets dynamiques réduisent considérablement les risques, mais ne suppriment pas tout :

BesoinReste nécessaire
Authentification du workloadLe workload doit prouver son identité à Vault (K8s auth, OIDC, AppRole…)
Policies strictesLes permissions Vault doivent être finement configurées
Monitoring et auditCentraliser et surveiller les logs Vault reste indispensable
Haute disponibilitéVault devient un SPOF — prévoir cluster HA
Gestion des échecsQue faire si Vault est down ou si le renouvellement échoue ?
  1. Secret statique : Vault stocke, vous gérez le cycle de vie
  2. Secret dynamique : Vault génère, gère le TTL et révoque
  3. Lease : identifiant du secret dynamique, permet renouvellement et révocation
  4. Dynamic role : nouveau credential à chaque requête (recommandé)
  5. Static role : credential existant roté automatiquement (legacy)
  6. Traçabilité : simplifiée mais dépend d’une bonne configuration
  7. KV reste utile : pour les secrets imposés par des tiers
  8. Vault devient central : planifiez HA et stratégie de renouvellement

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