Aller au contenu
Sécurité medium

Secrets statiques vs dynamiques : comparatif

21 min de lecture

Faut-il générer un mot de passe temporaire, stocker un token dans un coffre-fort, ou supprimer complètement le besoin d’un secret ? La réponse dépend du système cible, de votre infrastructure et de votre niveau de maturité. Ce guide compare trois modèles — secret statique, secret dynamique et identité fédérée — pour vous aider à choisir le bon selon votre contexte. Vous verrez que le vrai progrès n’est pas toujours de rendre les secrets dynamiques, mais parfois de réduire la dépendance aux secrets quand c’est possible.

  • Les trois modèles de gestion des credentials : statique, dynamique, identité fédérée
  • Les avantages, limites et contraintes d’intégration de chaque approche
  • Les cas d’usage concrets pour chaque modèle
  • Les pièges courants lors de la migration
  • Comment choisir et migrer progressivement

Le réflexe courant est d’opposer “secret statique” et “secret dynamique”. En pratique, il faut distinguer trois modèles de gestion des credentials.

Un secret créé à l’avance, stocké quelque part, et réutilisé pendant une période prolongée.

Fenêtre de terminal
# Exemple : mot de passe défini manuellement
DB_PASSWORD="SuperSecretPassword123!"

Caractéristiques :

  • Existe avant d’être utilisé
  • Stocké dans un fichier, une variable ou un coffre-fort
  • Durée de vie longue (semaines, mois, années)
  • Rotation manuelle ou planifiée
  • Souvent partagé entre plusieurs composants

Un secret généré à la demande, avec une durée de vie limitée, et révoqué automatiquement à expiration.

Fenêtre de terminal
# Exemple : Vault génère un utilisateur PostgreSQL temporaire
vault read database/creds/my-role
# Key Value
# lease_id database/creds/my-role/abc123
# lease_duration 1h
# username v-root-my-role-xyz789
# password A1b2C3d4E5f6G7h8

Caractéristiques :

  • N’existe pas avant d’être demandé
  • Généré au moment de l’utilisation
  • Durée de vie courte (minutes, heures)
  • Révoqué automatiquement à expiration
  • Unique par demandeur

Pas de secret partagé du tout. Le workload prouve son identité via un jeton signé, validé par le système cible sans échange de mot de passe.

Fenêtre de terminal
# Exemple : un pipeline GitHub Actions accède à AWS sans secret
# Le runner obtient un jeton OIDC signé par GitHub
# AWS valide le jeton et accorde un accès temporaire via STS

Caractéristiques :

  • Aucun secret à stocker, distribuer ou renouveler
  • Repose sur une chaîne de confiance (IdP → système cible)
  • Le workload prouve “qui il est” plutôt que “ce qu’il sait”
  • Dépend de la compatibilité du système cible
AspectStatiqueDynamiqueIdentité fédérée
CréationManuelle, à l’avanceAutomatique, à la demandeAucune (jeton signé)
Durée de vieLongue (mois/années)Courte (minutes/heures)Très courte (minutes)
StockagePersistantTemporaire, souvent mis en cacheAucun (jeton en mémoire)
RotationManuelle, planifiéeContinue, automatiqueN/A (pas de rotation)
RévocationManuelle ou planifiéeExpiration auto, parfois révocation explicite utileExpiration du jeton
AttributionDifficile (souvent partagé)Facile (unique par workload)Facile (identité du workload)
ComplexitéSimple à mettre en placeInfrastructure centrale requiseIntégration IdP requise
CompatibilitéUniverselleDépend du système cibleDépend du support OIDC/mTLS

Le terme “secret dynamique” recouvre en réalité des mécanismes distincts. Les confondre mène à des choix d’architecture incorrects.

Sous-familleMécanismeExemple
Secret généréLe gestionnaire crée un compte temporaire sur le système cibleUtilisateur PostgreSQL via Vault Database
Token éphémère dérivé d’une identitéLe workload s’authentifie et obtient un jeton signé à durée courteSTS AssumeRole, OIDC, JWT
Certificat courtUne CA signe un certificat à durée de vie limitéeCertificat SSH signé par Vault, certificat X.509 court via PKI

La distinction est importante : un secret généré implique que le gestionnaire a des privileges élevés sur le système cible (droits de création d’utilisateurs). Un token éphémère repose sur une relation de confiance préétablie. Un certificat court repose sur une PKI.

  1. L’application demande un secret

    L’application s’authentifie auprès du gestionnaire de secrets (ex: Vault) et demande un accès à une ressource (ex: base de données).

  2. Le gestionnaire génère le secret

    Vault se connecte à la base de données avec des credentials admin et crée un nouvel utilisateur avec un mot de passe aléatoire.

  3. Le secret est retourné avec un TTL

    L’application reçoit les credentials et une durée de vie (ex: 1 heure). Un identifiant de lease permet de renouveler ou révoquer le secret.

  4. L’application utilise le secret

    L’application se connecte à la base avec ces credentials temporaires.

  5. Le secret expire et est révoqué

    Après 1 heure (ou quand l’application libère le lease), Vault supprime automatiquement l’utilisateur de la base de données.

Diagramme de séquence : l'application demande un credential à Vault, qui crée un utilisateur temporaire dans PostgreSQL, puis le supprime à expiration du lease

Un secret dynamique n’existe que pendant son utilisation. Si un attaquant le capture, il n’a que quelques minutes ou heures pour l’exploiter — contre des mois ou des années pour un secret statique.

Pas besoin de tracker où le secret est utilisé. À expiration, le compte est supprimé sur le système cible. Cependant, une connexion déjà établie peut survivre à l’expiration du credential : certains systèmes (bases de données, brokers) maintiennent les sessions TCP ouvertes même après la suppression de l’utilisateur. Vérifiez le comportement de votre système cible.

Chaque demande génère un secret unique. Si une activité suspecte est détectée, vous savez exactement quel workload a utilisé ce secret.

Fenêtre de terminal
# Logs de la base de données
2026-03-16 10:00:00 - User v-app1-xyz789 connected
2026-03-16 10:00:05 - User v-app2-abc123 connected
2026-03-16 10:00:10 - User v-app1-xyz789: suspicious query detected
# ↑ On sait immédiatement que c'est app1

Chaque émission produit un credential récent, ce qui réduit fortement l’ancienneté moyenne des accès actifs. Pas de “rotation annuelle oubliée”.

Vous pouvez créer des rôles avec des permissions minimales. Chaque workload reçoit exactement les droits dont il a besoin, pour la durée dont il a besoin.

Les secrets dynamiques nécessitent un gestionnaire de secrets capable de s’authentifier auprès du système cible, créer/supprimer des credentials à la demande, et gérer les expirations.

Le gestionnaire de secrets devient un composant critique du plan de contrôle. Sa disponibilité, sa résilience et son observabilité doivent être traitées comme celles d’un service central d’infrastructure.

Exemples : HashiCorp Vault, AWS Secrets Manager (certaines fonctions), HCP Vault Secrets.

Tous les systèmes ne permettent pas la création dynamique de credentials.

SystèmeSupport dynamique
PostgreSQL✅ Vault database secrets engine
MySQL✅ Vault database secrets engine
AWS IAM✅ Vault AWS secrets engine ou STS
API tierce avec clé fixe❌ Pas de support
Application legacy❌ Souvent impossible

La compatibilité du système cible ne suffit pas. L’application cliente doit aussi être capable de gérer le cycle de vie du secret dynamique.

ContrainteProblème si non gérée
Renouvellement en mémoireL’app tente d’utiliser un credential expiré
Réouverture de connexionLe pool de connexions garde l’ancien utilisateur
Gestion des leasesPas de renouvellement anticipé avant expiration
TTL vs durée du workloadUn job batch dure plus longtemps que le lease
Indisponibilité du gestionnaireL’app ne peut pas démarrer ou renouveler
SDK / middlewareCertaines librairies ne supportent pas le refresh de credentials

La latence d’obtention du premier secret retarde le démarrage de l’application. Mais le vrai sujet est plus large :

  • Disponibilité : si Vault ou STS est injoignable, l’application ne démarre pas
  • Renouvellement en cours de vie : il faut surveiller les leases et anticiper le renouvellement avant expiration
  • Effet sur les pools de connexions : un renouvellement de credential peut nécessiter la fermeture et la réouverture de toutes les connexions
  • Cache et anticipation : un renouvellement anticipé (par exemple à 75 % du TTL) évite les interruptions

Un secret statique n’est pas un anti-pattern par défaut. Il reste le bon choix dans plusieurs situations concrètes.

SituationPourquoi le statique est adapté
API tierce avec clé fixeLe fournisseur ne supporte pas la rotation automatique ni la fédération
Clé maître de chiffrementLa clé SOPS, âge ou KMS est un secret fondamental qui ne peut pas être dynamique
Bootstrap initialLe premier secret pour accéder au coffre-fort lui-même (token d’enrôlement, unseal key)
Environnement air-gapAucun accès réseau vers un gestionnaire de secrets
Intégration legacyApplication qui ne supporte pas le rafraîchissement de credentials
Reprise dégradéeCredentials de secours en cas de panne du gestionnaire de secrets

Même dans une architecture moderne, il existe presque toujours un secret initial ou une chaîne de confiance initiale : identité machine, rôle cloud, token d’enrôlement, recovery path. L’objectif n’est pas d’atteindre le “zéro secret absolu”, mais de réduire au maximum la surface des secrets statiques et de les gérer rigoureusement (coffre-fort, rotation planifiée, audit).

Quand le système cible le supporte, l’identité fédérée est souvent préférable aux secrets dynamiques : elle élimine le besoin de créer, distribuer et révoquer un credential.

BesoinApproche recommandée
Base de données classiqueSecret dynamique (Vault Database)
Pipeline CI/CD vers cloudOIDC / identité fédérée
Service Kubernetes vers AWSIRSA / workload identity
API tierce avec clé fixeSecret statique sous coffre-fort
SSH admin courte duréeCertificat signé (Vault SSH CA)
Service mesh interne (mTLS)SPIFFE/SPIRE
Application vers autre application internemTLS avec certificats courts

Pour le cloud, les credentials dynamiques sont utiles, mais lorsqu’une fédération d’identité native existe (OIDC GitHub → AWS, IRSA, GCP Workload Identity), elle est souvent préférable à la création de credentials — même temporaires.

Pour approfondir l’identité fédérée : voir le guide Identité machine et workload identity.

Critère→ Statique→ Dynamique→ Identité fédérée
Le système accepte OIDC ou une identité cloud ?NonParfoisOui
L’app a besoin d’un vrai credential (user/password) ?OuiOuiNon
Le système cible crée des comptes temporaires ?NonOuiN/A
L’attribution précise est importante ?NonOuiOui
L’environnement est éphémère (K8s, serverless) ?NonOuiOui
Vous avez Vault ou équivalent ?NonOuiParfois
C’est une intégration tierce avec clé fixe ?OuiNonNon
L’app supporte le refresh de credentials ?N/ARequisN/A

Credentials PostgreSQL dynamiques (secret généré)

Section intitulée « Credentials PostgreSQL dynamiques (secret généré) »

C’est le cas d’usage le plus mature pour les secrets dynamiques : Vault crée un utilisateur temporaire directement sur la base de données.

Configuration du secrets engine :

Fenêtre de terminal
# Activer le secrets engine database
vault secrets enable database
# Configurer la connexion PostgreSQL
vault write database/config/my-postgresql \
plugin_name=postgresql-database-plugin \
allowed_roles="my-role" \
connection_url="postgresql://{{username}}:{{password}}@postgres:5432/mydb?sslmode=disable" \
username="vault_admin" \
password="vault_admin_password"
# Créer un rôle avec les permissions minimales
vault write database/roles/my-role \
db_name=my-postgresql \
creation_statements="CREATE ROLE \"{{name}}\" WITH LOGIN PASSWORD '{{password}}' VALID UNTIL '{{expiration}}'; \
GRANT SELECT ON ALL TABLES IN SCHEMA public TO \"{{name}}\";" \
default_ttl="1h" \
max_ttl="24h"

Utilisation par l’application :

Fenêtre de terminal
# Demander des credentials
vault read database/creds/my-role
# Résultat
Key Value
--- -----
lease_id database/creds/my-role/abc123...
lease_duration 1h
lease_renewable true
password A1b2C3d4E5f6G7h8
username v-root-my-role-xyz789

Pour AWS, le modèle le plus actuel utilise STS AssumeRole plutôt que la création d’utilisateurs IAM temporaires. STS émet un jeton éphémère sans créer de compte IAM.

Fenêtre de terminal
# Activer le secrets engine AWS
vault secrets enable aws
# Configurer les credentials root
vault write aws/config/root \
access_key=AKIAIOSFODNN7EXAMPLE \
secret_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY \
region=eu-west-1
# Créer un rôle avec assumed_role (recommandé)
vault write aws/roles/my-role \
credential_type=assumed_role \
role_arns="arn:aws:iam::123456789012:role/my-app-role"

Utilisation :

Fenêtre de terminal
vault read aws/creds/my-role
# Résultat : credentials STS temporaires
Key Value
--- -----
lease_id aws/creds/my-role/xyz789...
lease_duration 1h
access_key ASIAXXXXXXXXXXXXXXXX
secret_key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
security_token FwoGZXIvYXdzE...

Pas besoin de tout changer d’un coup. Migrez progressivement, en commençant par les cas les plus mûrs.

  1. Inventaire et classification

    Listez tous vos secrets statiques. Classez-les par criticité et compatibilité avec les secrets dynamiques ou l’identité fédérée.

  2. Mettre en place l’observabilité

    Avant de migrer, vérifiez que vous pouvez observer : quel workload demande quoi, quels leases expirent, quels échecs d’authentification surviennent, quelle latence est introduite. Sans observabilité, une migration peut dégrader la production silencieusement.

  3. Quick wins : bases de données

    Commencez par les credentials de base de données. C’est le cas d’usage le plus mature avec Vault, et celui qui apporte le plus de valeur (attribution, révocation automatique).

  4. CI/CD : adopter OIDC

    Remplacez les tokens CI/CD stockés par de la fédération OIDC. GitHub Actions et GitLab CI supportent nativement cette approche.

  5. Cloud credentials

    Remplacez les access keys longue durée par des credentials STS ou de la workload identity (IRSA, GCP WI, Azure MI).

  6. Évaluation continue

    Pour chaque nouveau secret, posez-vous la question : “Peut-il être dynamique ? Peut-il être remplacé par de l’identité fédérée ?”

PiègeConséquenceSolution
Migrer tous les secrets “par principe”Complexité inutile, incidents de prodMigrer par ordre de maturité et de risque
TTL trop courts sans gestion de renouvellementConnexions coupées en productionRenouveler à 75 % du TTL, tester le comportement
Vault avec trop de privilègesCompromission de Vault = compromission de toutCloisonner les policies, limiter les rôles admin
Écrire un credential dynamique dans un fichierLe secret n’est plus éphémèreInjecter en mémoire, monter en volume tmpfs
Injecter un secret en variable d’environnementVisible dans /proc/<pid>/environ et les logsPréférer les fichiers montés ou l’injection sidecar
Confondre secret dynamique et jeton fédéréMauvais choix d’architectureDistinguer les trois sous-familles
Multiplier les rôles sans gouvernanceProlifération incontrôlableNommer, documenter et auditer régulièrement

La migration vers les secrets dynamiques n’est pas toujours la prochaine étape.

SituationPourquoi attendre
Système legacy fragileLe risque de casser la production dépasse le gain de sécurité
Pas d’observabilité en placeVous ne verrez pas les problèmes introduits par la migration
Gestionnaire sans haute disponibilitéVault en single-node est un SPOF pour tous les workloads
Application incompatible avec le refreshL’app crash à l’expiration du credential
Équipe non forméeLes opérateurs doivent comprendre les leases, TTL et renouvellements

Dans ces cas, la priorité est de sécuriser les secrets statiques existants : coffre-fort, rotation régulière, journalisation des accès, alerting. Puis de préparer l’infrastructure pour la migration future.

  • Tous les secrets n’ont pas vocation à devenir dynamiques — le bon choix dépend du système cible et de la maturité de l’infrastructure
  • Quand une identité fédérée existe, elle est souvent préférable — elle élimine complètement le besoin d’un credential partagé
  • Les secrets dynamiques réduisent fortement la fenêtre d’exploitation et améliorent l’attribution des accès
  • Ils demandent une infrastructure centrale fiable — le gestionnaire de secrets devient un composant critique du plan de contrôle
  • La compatibilité applicative est souvent le vrai facteur limitant — pas le système cible, mais la capacité de l’application à gérer le refresh
  • L’expiration ne garantit pas l’arrêt immédiat — les sessions déjà ouvertes peuvent survivre au credential qui les a établies
  • La migration doit commencer par les cas les plus mûrs : bases de données, CI/CD, cloud credentials
  • Un secret statique bien géré reste préférable à un secret dynamique déployé dans une infrastructure qui n’est pas prête

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