Un secret n'est pas un objet statique. Il naît, est stocké, est distribué, est utilisé, doit être roté, peut être révoqué, et ses accès doivent être audités.
Ce guide détaille chaque étape du cycle de vie et les bonnes pratiques associées.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Pourquoi inventaire, classification et ownership sont indispensables avant tout
- Les 8 étapes opérationnelles du cycle de vie (génération → destruction)
- Le bootstrap trust problem : comment l'application prouve son identité
- Les 3 modèles de rotation selon les situations
- Comment automatiser le cycle complet côté infrastructure et application
Prérequis
Section intitulée « Prérequis »Vue d'ensemble du cycle de vie
Section intitulée « Vue d'ensemble du cycle de vie »Le schéma résume le parcours complet : une étape 0 de cadrage (inventaire, classification, propriétaire) puis huit étapes opérationnelles qui vont de la génération à la destruction. L'audit n'est pas une étape parmi les autres, il est transversal et observe toutes les autres. Et il s'agit bien d'un cycle, pas d'une ligne droite : la rotation ramène périodiquement à la génération.
0. Inventaire, classification et ownership
Section intitulée « 0. Inventaire, classification et ownership »Avant même de générer un secret, il faut répondre à des questions fondamentales. Sans ce préalable, il est impossible d'automatiser la rotation, la révocation ou la destruction de manière fiable.
Ce qu'il faut définir à la création
Section intitulée « Ce qu'il faut définir à la création »Ces métadonnées ne sont pas de la paperasse administrative : ce sont elles que l'astreinte consulte à trois heures du matin quand un token fuite, et ce sont elles qu'un script de rotation lit pour savoir quels services prévenir. Les renseigner coûte deux minutes à la création et fait gagner des heures pendant un incident.
Chaque secret devrait avoir, dès sa création :
- un propriétaire (équipe ou service responsable)
- une liste des consommateurs (quels services, quels systèmes)
- un niveau de criticité (critique, standard, bas)
- une durée de vie attendue (courte, longue, permanente)
- une procédure de rotation documentée
- une procédure d'urgence en cas de compromission
Classification des secrets
Section intitulée « Classification des secrets »Tous les secrets ne méritent pas le même effort. La classification range chaque secret dans une classe qui détermine sa fréquence de rotation et le niveau de contrôle appliqué. Un secret racine compromis ouvre l'accès à tous les autres, alors qu'un token de session expire de lui-même en quelques minutes : traiter les deux avec la même procédure revient à gaspiller l'effort là où il ne sert à rien et à en manquer là où il compte.
| Classe | Exemples | Criticité | Rotation |
|---|---|---|---|
| Secret racine | Credential admin BDD, clé maître | Très élevée | Après chaque usage |
| Secret de service | Token inter-service, credential pipeline | Élevée | Automatisée, fréquente |
| Secret applicatif | Mot de passe BDD app, clé API externe | Standard | Planifiée |
| Secret temporaire | Token de session, OTP | Faible | Expiration native |
Registre minimal
Section intitulée « Registre minimal »Un registre peut être aussi simple qu'un fichier YAML versionné dans Git. L'essentiel est qu'il existe et soit maintenu.
# Exemple de registre minimal- name: db-production owner: team-platform consumers: [api-service, worker-service] criticality: high rotation_policy: automated-30d emergency_contact: oncall-platform1. Génération
Section intitulée « 1. Génération »La génération est la naissance du secret, et c'est l'étape la plus définitive du cycle. Un secret créé avec une entropie insuffisante (la quantité réelle de hasard qu'il contient) restera faible toute sa vie, quel que soit le coffre-fort qui l'héberge : ni le chiffrement ni la rotation ne rattrapent un générateur prévisible. La règle tient en une phrase, utiliser un générateur cryptographique fourni par le système et jamais une fonction aléatoire généraliste.
Bonnes pratiques
Section intitulée « Bonnes pratiques »Les exigences diffèrent selon le destinataire du secret. Un humain doit pouvoir le saisir ou le confier à un gestionnaire de mots de passe, ce qui borne sa longueur utile ; une machine n'a pas cette contrainte et peut recevoir 256 bits d'aléa pur.
| Type de secret | Exigence principale | Implémentation |
|---|---|---|
| Mot de passe humain | Mémorisation + complexité | ≥ 16 caractères, variété, gestionnaire |
| Token / secret machine | Entropie pure | Générateur cryptographique, ≥ 256 bits |
| Clé API fournisseur | Qualité de la source | Fournie par le fournisseur, non générée localement |
Exemples de génération
Section intitulée « Exemples de génération »Les commandes ci-dessous puisent toutes dans le générateur cryptographique du
système (/dev/urandom sous Linux) et affichent le secret sur la sortie
standard. Redirigez cette sortie directement vers votre coffre-fort : laissée
telle quelle, la valeur reste dans l'historique du shell et dans le buffer du
terminal.
Mot de passe fort :
# ✅ Génération cryptographiqueopenssl rand -base64 32# oupwgen -s 32 1Clé de chiffrement :
# ✅ 256 bits d'entropieopenssl rand -hex 32Token API :
# ✅ Python avec secrets (crypto-sécurisé)import secretstoken = secrets.token_urlsafe(32)Erreurs courantes
Section intitulée « Erreurs courantes »Les trois cas suivants produisent un secret qui a l'apparence de l'aléatoire
sans en avoir les propriétés. Le module random de Python est déterministe
une fois la graine connue, un hachage de donnée publique se rejoue en une
seconde, et un ancien secret suffixé reste cassable si l'original a déjà fuité.
# ❌ Générateur non cryptographiqueimport randompassword = ''.join(random.choices('abcdefgh', k=8))
# ❌ Secret dérivé de données prévisiblespassword = hashlib.md5(username.encode()).hexdigest()
# ❌ Réutilisation d'un secret existantnew_password = old_password + "2024"2. Stockage
Section intitulée « 2. Stockage »Le stockage détermine qui peut relire le secret et pendant combien de temps. Un secret bien généré puis déposé dans un fichier de configuration versionné dans Git est déjà compromis : la question n'est plus de savoir si quelqu'un le trouvera, mais quand. Le bon réflexe consiste à le centraliser dans un coffre-fort (un gestionnaire de secrets dédié) capable de chiffrer, de tracer les lectures et de révoquer, plutôt que d'en multiplier les copies.
Bonnes pratiques
Section intitulée « Bonnes pratiques »Ces quatre exigences se cumulent, aucune ne remplace les autres. Le versioning est celle qu'on néglige le plus souvent : sans historique des versions, une rotation ratée ne se rejoue pas et vous perdez l'accès au service le temps de reconstruire le secret.
| Pratique | Implémentation |
|---|---|
| Chiffrement at-rest | AES-256-GCM minimum |
| Contrôle d'accès | RBAC strict, moindre privilège |
| Centralisation | Un coffre-fort, pas de copies |
| Versioning | Historique des versions pour rollback |
Options de stockage
Section intitulée « Options de stockage »Le choix de la solution de stockage dépend de votre écosystème et de vos besoins en termes de secrets dynamiques.
| Solution | Cas d'usage | Chiffrement |
|---|---|---|
| HashiCorp Vault | Entreprise, secrets dynamiques | ✅ |
| AWS Secrets Manager | Écosystème AWS | ✅ |
| Azure Key Vault | Écosystème Azure | ✅ |
| GCP Secret Manager | Écosystème GCP | ✅ |
| Infisical | Open source, équipes | ✅ |
| SOPS | Fichiers chiffrés, GitOps | ✅ |
| Kubernetes Secrets | Distribution locale dans Kubernetes | ⚠️ Pas un secret manager, nécessite chiffrement etcd, RBAC strict et souvent un broker externe (External Secrets) pour la gouvernance |
Erreurs courantes
Section intitulée « Erreurs courantes »Ces trois situations ont un point commun : le secret existe en clair sur un disque, hors de tout contrôle d'accès et sans la moindre trace de lecture. Impossible ensuite de savoir qui l'a consulté, ni de garantir qu'il a bien disparu partout après une rotation.
# ❌ Secret dans un fichier non chiffrédatabase: password: SuperSecret123
# ❌ Secret dans une variable d'environnement système# ~/.bashrcexport DB_PASSWORD=SuperSecret123
# ❌ Secret dans un gestionnaire de mots de passe personnel# (pas d'audit, pas de partage contrôlé)3. Distribution
Section intitulée « 3. Distribution »La distribution est le trajet entre le coffre-fort et le processus qui consomme le secret. C'est l'étape la plus exposée du cycle, parce que le secret y transite en clair et que chaque intermédiaire ajouté (fichier, couche d'image, variable d'environnement) devient une copie à protéger puis à détruire. L'objectif est donc de raccourcir ce trajet au maximum et de ne l'ouvrir qu'à une identité authentifiée.
Bonnes pratiques
Section intitulée « Bonnes pratiques »L'injection au runtime est la plus structurante des quatre : tant que le secret figure dans une image ou un fichier de configuration, il est reproductible par quiconque récupère l'artefact, y compris des mois plus tard.
| Pratique | Implémentation |
|---|---|
| Injection runtime | Le secret n'est jamais dans le code ou les configs statiques |
| Canal chiffré | TLS pour la récupération |
| Authentification | L'application prouve son identité |
| Durée minimale | Le secret n'existe en mémoire que le temps nécessaire |
Méthodes de distribution
Section intitulée « Méthodes de distribution »Trois approches coexistent selon l'endroit où tourne l'application. Elles se valent en termes de sécurité ; ce qui les différencie est le composant qui porte la responsabilité de l'authentification : un agent local, l'orchestrateur, ou la CLI de l'outil qui lance le processus.
1. Injection par le coffre-fort :
# Vault Agent injecte le secret au démarragevault agent -config=agent.hcl2. Injection par l'orchestrateur :
# Kubernetes External SecretsapiVersion: external-secrets.io/v1beta1kind: ExternalSecretspec: secretStoreRef: name: vault-backend target: name: db-credentials3. CLI au démarrage :
# Infisical injecte les secrets puis lance l'appinfisical run -- npm startErreurs courantes
Section intitulée « Erreurs courantes »Les cas ci-dessous partagent un même défaut : le secret quitte le canal contrôlé, et personne ne sait plus où il a atterri. Une révocation devient alors impossible à mener complètement, puisqu'on ignore la liste des copies.
# ❌ Secret copié dans un fichier .envcp vault-export.env .envdocker-compose up
# ❌ Secret passé en argument de commande (visible dans ps)./myapp --db-password=SuperSecret123
# ❌ Secret envoyé par email/Slack"Voici le mot de passe : SuperSecret123"
# ❌ Variable d'environnement sans précautions# Visible dans /proc/PID/environ, héritée des processus enfants,# capturée dans les crash reports et outils de debugexport API_KEY=s3cr3t123
# ❌ Fichier de secret monté sans restriction de permissions# Accessible à tout UID dans le conteneur ou sur le hostchmod 644 /run/secrets/db-password # doit être 400 ou 600
# ❌ Secret chargé au démarrage mais jamais rechargé# Rotation effective côté coffre-fort, invisible pour l'application# → la rotation ne sert à rien si l'app garde l'ancienne valeur en mémoire4. Utilisation
Section intitulée « 4. Utilisation »L'utilisation est le seul moment où le secret doit exister en clair dans le processus. Tout l'enjeu est d'y rester le moins longtemps possible et de ne jamais le laisser fuir par un canal secondaire : un log de debug, une stack trace (la trace d'appel affichée lors d'une erreur), un message d'exception ou un rapport de crash. La majorité des fuites constatées ne viennent pas d'une attaque sophistiquée mais d'un secret recopié dans un journal applicatif.
Bonnes pratiques
Section intitulée « Bonnes pratiques »La première ligne est celle qu'on enfreint le plus : un secret chargé une fois au démarrage dans une variable globale reste en mémoire pendant toute la vie du processus, et il survit à la rotation côté coffre-fort.
| Pratique | Implémentation |
|---|---|
| Durée minimale en mémoire | Charger, utiliser, effacer |
| Pas de logging | Ne jamais afficher le secret |
| Connexion unique | Établir la connexion une fois |
| Gestion des erreurs | Ne pas exposer le secret dans les stack traces |
Exemples
Section intitulée « Exemples »Les deux extraits qui suivent lisent le secret depuis un fichier monté par le coffre-fort, l'utilisent immédiatement, puis relâchent la référence. Ils illustrent la bonne intention, pas une garantie d'effacement : l'encadré qui les suit explique pourquoi cette nuance compte en Python comme en Java.
Connexion base de données :
# ✅ Charger le secret depuis un fichier, établir la connexiondef get_db_connection(): with open('/etc/secrets/db-password') as f: password = f.read().strip() conn = psycopg2.connect( host="db", user="app", password=password, dbname="mydb" ) # Bonne intention : réduire la durée de présence en mémoire # Note : en Python, cela ne garantit PAS un effacement sécurisé # (copies internes, garbage collector, buffers) password = None return connAppel API :
# ✅ En-tête d'autorisation, pas de loggingimport requests
def call_api(endpoint): with open('/etc/secrets/api-key') as f: api_key = f.read().strip()
response = requests.get( endpoint, headers={"Authorization": f"Bearer {api_key}"} ) api_key = None return response.json()Erreurs courantes
Section intitulée « Erreurs courantes »Ces trois erreurs rendent le secret consultable sans passer par le coffre-fort : un attribut de classe s'inspecte depuis n'importe quel point du code, un log part vers l'agrégateur central, et une exception remonte souvent jusqu'à la réponse HTTP renvoyée à l'utilisateur.
# ❌ Secret stocké dans un attribut de classeclass Database: password = "SuperSecret123" # Accessible via Database.password
# ❌ Secret dans les logslogger.debug(f"Connecting with password: {password}")
# ❌ Secret dans l'exceptionraise Exception(f"Connection failed for {username}:{password}")5. Rotation
Section intitulée « 5. Rotation »La rotation remplace un secret encore valide par un nouveau, à intervalle régulier ou après un incident. Elle réduit la fenêtre d'exposition : un secret volé mais roté depuis n'a plus aucune valeur pour l'attaquant. C'est aussi l'étape la plus souvent abandonnée, parce qu'une rotation mal conçue coupe la production ; la concevoir automatisée dès le départ est ce qui la rend tenable dans la durée.
Bonnes pratiques
Section intitulée « Bonnes pratiques »Une rotation jamais testée n'existe pas. C'est en général le jour de l'incident qu'on découvre que l'application ne relit jamais son secret, ou que le compte de service n'a pas le droit de changer son propre mot de passe.
| Pratique | Implémentation |
|---|---|
| Automatisation | Rotation sans intervention humaine |
| Sans interruption | Période de grâce où les deux versions fonctionnent |
| Fréquence adaptée | Plus critique = plus fréquent |
| Testée régulièrement | Exercices de rotation |
Les 3 modèles de rotation
Section intitulée « Les 3 modèles de rotation »Le modèle à retenir dépend de ce qui déclenche le changement : un calendrier, un événement, ou la simple expiration du secret. Les deux premiers demandent une orchestration explicite ; le troisième la supprime en rendant chaque secret jetable dès l'émission.
1. Rotation planifiée :
Pour les mots de passe de base de données, les clés API, les tokens de longue durée. La rotation suit un calendrier défini, idéalement automatisée.
T0 : Secret A actif, Secret B inactifT1 : Générer Secret BT2 : Activer Secret A ET Secret B (dual-active)T3 : Migrer les applications vers Secret BT4 : Désactiver Secret ALa période de dual-active est cruciale : elle évite un incident de production lors de la bascule. Ne désactivez jamais l'ancien secret avant que tous les consommateurs aient migré.
2. Rotation événementielle :
Déclenchée par un incident (compromission suspectée), le départ d'un collaborateur, un changement de rôle ou une alerte de sécurité. La procédure est identique à la rotation planifiée, mais exécutée en urgence. La clarté du runbook est ce qui distingue un incident géré d'un incident chaotique.
3. Expiration native (secrets dynamiques) :
La logique n'est plus une rotation périodique classique, mais une génération à la demande avec une expiration automatique (TTL/lease). Pas de rotation à planifier : chaque accès produit un credential unique à durée limitée.
# Vault génère un nouveau secret à chaque demandevault read database/creds/my-role# Nouveau username/password, TTL 1h
# Renouveler le lease si nécessaire (avant expiration)vault lease renew database/creds/my-role/xxxFréquences indicatives
Section intitulée « Fréquences indicatives »Les valeurs du tableau servent de point de départ quand aucune contrainte réglementaire ni aucune limite du fournisseur n'impose déjà un rythme.
| Type de secret | Fréquence indicative | Commentaire |
|---|---|---|
| Credentials root | Immédiatement après usage | Ne jamais laisser traîner |
| Secrets de production | 30-90 jours | À adapter selon criticité |
| Tokens API | 30-90 jours | Plus exposé = plus court |
| Certificats | Avant expiration | Automatiser avec cert-manager |
| Secrets dynamiques | À chaque demande | TTL court, pas de rotation |
Erreurs courantes
Section intitulée « Erreurs courantes »Trois classiques se répètent d'une équipe à l'autre : la rotation reportée indéfiniment faute d'automatisation, celle qui coupe la production parce que l'ancien secret a été désactivé sans période dual-active, et celle qui produit un secret dérivé du précédent, donc devinable.
# ❌ Rotation manuelle oubliée# "On fera ça le trimestre prochain"
# ❌ Rotation qui casse les applications# Ancien secret désactivé avant migration des apps
# ❌ Même nouveau secret partout# "Je vais juste ajouter un chiffre à la fin"6. Révocation
Section intitulée « 6. Révocation »La révocation rend un secret inutilisable immédiatement, sans attendre son expiration naturelle. C'est le geste d'urgence du cycle : suspicion de compromission, départ d'un collaborateur, clé publiée par erreur dans un dépôt public. Sa valeur se mesure au délai entre la détection et l'invalidation effective, et surtout à son exhaustivité, un secret révoqué à un seul endroit restant actif partout ailleurs.
Bonnes pratiques
Section intitulée « Bonnes pratiques »La capacité de révocation se prépare à froid. Au milieu d'un incident, personne n'improvise la commande qui invalide un token ni la liste des services à redémarrer : c'est le runbook écrit à l'avance qui fait la différence entre dix minutes et une demi-journée.
| Pratique | Implémentation |
|---|---|
| Révocation immédiate | Capacité à invalider en minutes |
| Révocation complète | Toutes les copies, tous les systèmes |
| Vérification | Confirmer que l'ancien secret ne fonctionne plus |
| Procédure documentée | Runbook prêt à l'emploi |
Procédure type
Section intitulée « Procédure type »L'ordre de ces sept étapes n'est pas arbitraire. Le nouveau secret est déployé avant que l'ancien soit révoqué, sinon vous coupez le service en même temps que l'attaquant. Et la vérification finale n'est pas facultative : tant que personne n'a testé que l'ancien secret échoue, l'incident n'est pas clos.
-
Détecter la compromission ou la fin de vie
-
Évaluer l'impact et l'urgence
-
Générer un nouveau secret
-
Déployer le nouveau secret sur les applications
-
Révoquer l'ancien secret dans le coffre-fort
-
Vérifier que l'ancien secret ne fonctionne plus
-
Documenter l'incident et la résolution
Révocation et propagation
Section intitulée « Révocation et propagation »Révoquer un secret n'a d'intérêt que si tous les consommateurs ont effectivement basculé. Sinon, vous transformez un incident de sécurité en incident de production, surtout dans les environnements distribués.
| Question | Pourquoi elle compte |
|---|---|
| Quels services consomment ce secret ? | Inventaire des consommateurs à migrer |
| Dans quel ordre migrer ? | Éviter les dépendances circulaires |
| Comment vérifier la prise en compte ? | Health checks, logs applicatifs |
| Quel est le plan de rollback ? | Si la migration échoue avant révocation |
| Quel est le délai acceptable ? | Compromis sécurité vs stabilité |
Erreurs courantes
Section intitulée « Erreurs courantes »Ces trois situations laissent un secret compromis actif alors que l'équipe croit l'incident refermé. C'est le pire des états : plus personne ne surveille, et l'attaquant conserve son accès.
# ❌ Révocation partielle# "J'ai changé le mot de passe dans Vault, c'est bon"# (mais l'ancien est encore dans 3 fichiers .env)
# ❌ Pas de vérification# "Normalement c'est révoqué"
# ❌ Révocation trop lente# "On fera ça demain"7. Audit
Section intitulée « 7. Audit »L'audit enregistre qui a lu, écrit, roté ou révoqué chaque secret. Il ne protège rien par lui-même, mais c'est la seule source capable de répondre à la question qui se pose après une fuite : quelles données ont réellement été exposées, et depuis quand. Sans journal exploitable, un incident circonscrit se transforme en soupçon généralisé, et vous rotez tout par précaution.
Bonnes pratiques
Section intitulée « Bonnes pratiques »La protection des logs est la ligne la plus négligée du tableau. Un attaquant qui obtient les droits d'administration efface ses traces si le journal reste modifiable sur la même machine : d'où l'intérêt d'un stockage séparé, en écriture seule, et de signatures qui rendent l'altération visible.
| Pratique | Implémentation |
|---|---|
| Logs complets | Qui, quoi, quand, depuis où |
| Centralisation | SIEM ou log aggregator |
| Alertes temps réel | Accès suspects, anomalies, échecs répétés |
| Protection des logs | Immutabilité, signature, stockage séparé |
| Rétention | Conformité et forensics |
Ce qu'il faut tracer
Section intitulée « Ce qu'il faut tracer »Un audit efficace capture chaque interaction avec un secret. Ces informations permettent d'identifier rapidement la source d'une compromission et de reconstituer la chaîne d'événements.
| Événement | Informations |
|---|---|
| Création | Qui a créé, quand, quel type |
| Lecture | Qui a lu, quand, depuis quelle IP |
| Modification | Qui a modifié, quand, ancienne/nouvelle valeur (hash) |
| Rotation | Qui a déclenché, automatique ou manuel |
| Révocation | Qui a révoqué, pourquoi |
| Échec d'accès | Qui a échoué, pourquoi |
Auditer aussi les opérations d'administration
Section intitulée « Auditer aussi les opérations d'administration »L'audit des accès aux secrets ne suffit pas. Il faut aussi tracer les opérations d'administration du coffre-fort, souvent plus critiques :
- les changements de policy (qui a accordé quels droits, quand)
- les activations/désactivations d'engines
- l'ajout ou la suppression de méthodes d'authentification
- les opérations de scellement/descellement
Exemple Vault audit log
Section intitulée « Exemple Vault audit log »Vault ne journalise jamais les valeurs sensibles en clair. Chaque champ confidentiel apparaît sous forme de HMAC-SHA256, une empreinte calculée avec une clé propre au device d'audit : deux entrées identiques produisent la même empreinte, ce qui permet de corréler des accès sans jamais révéler le secret.
{ "time": "2026-03-16T10:00:00Z", "type": "response", "auth": { "client_token": "hmac-sha256:xxx", "accessor": "hmac-sha256:yyy", "policies": ["app-policy"], "metadata": { "service_account_name": "my-app", "service_account_namespace": "production" } }, "request": { "path": "secret/data/production/db", "operation": "read" }, "response": { "data": { "username": "hmac-sha256:zzz", "password": "hmac-sha256:www" } }}Erreurs courantes
Section intitulée « Erreurs courantes »Trois façons de se retrouver aveugle au moment précis où il faudrait voir. Désactiver l'audit pour gagner quelques millisecondes coûte la capacité à qualifier un incident ; des journaux restés locaux disparaissent avec le serveur compromis ; et sans alerte, personne n'ouvre le journal avant la catastrophe.
# ❌ Audit désactivé pour "performance"audit: enabled: false
# ❌ Logs non centralisés# Chaque coffre-fort a ses logs locaux
# ❌ Pas d'alertes# "On regardera les logs si quelque chose se passe"8. Destruction
Section intitulée « 8. Destruction »Rendre le secret définitivement inutilisable et éliminer, autant que possible, toutes ses copies opérationnelles et archivées. C'est l'étape la plus irréversible du cycle : une purge de versions dans un coffre-fort ne se rejoue pas. Avant de la lancer, vérifiez qu'aucune donnée chiffrée avec ce secret n'a encore besoin d'être relue, sinon vous détruisez la donnée en même temps que la clé.
Bonnes pratiques
Section intitulée « Bonnes pratiques »La zeroization mérite une définition : il s'agit de l'écrasement du matériel cryptographique à l'intérieur d'un module matériel (HSM, TPM). Dans ces équipements la clé n'est jamais exportable, cette commande est donc le seul moyen de la faire disparaître.
| Pratique | Implémentation |
|---|---|
| Purge des versions | Supprimer les anciennes versions dans le coffre-fort |
| Nettoyage des copies | Fichiers temporaires, backups, CI |
| Zeroization | Pour les HSM/TPM : effacement cryptographique |
| Vérification | Confirmer que le secret n'existe plus nulle part |
Ce qu'il faut nettoyer
Section intitulée « Ce qu'il faut nettoyer »La liste ci-dessous couvre les endroits où un secret se recopie sans que personne ne l'ait décidé. Passez-la en revue à chaque destruction ; l'oubli le plus fréquent reste le cache de build de la CI, qui survit aux pipelines et se restaure automatiquement au job suivant.
- Coffre-fort : purger les versions obsolètes (
kv destroy, pas seulementkv delete) - Backups : appliquer les politiques de rétention ; la suppression immédiate n'est pas toujours possible
- CI/CD : variables d'environnement, logs de build, caches d'artefacts
- Images Docker : layers contenant le secret (rebuild + purge du cache registry)
- Environnements temporaires : conteneurs éteints, VMs détruites, snapshots
- Historique Git : si le secret a été commité par erreur (
git filter-repo) - Crash reports et dumps mémoire : souvent oubliés, peuvent contenir des valeurs en clair
Exemple Vault
Section intitulée « Exemple Vault »La distinction entre kv delete et kv destroy est structurante : la première
commande masque une version qui reste récupérable, la seconde supprime réellement
les données. Seule destroy compte comme une destruction.
# Supprimer définitivement un secret (pas de récupération possible)vault kv destroy -versions=1,2,3 secret/data/production/db
# Ou supprimer toutes les métadonnéesvault kv metadata delete secret/data/production/dbAutomatiser le cycle complet
Section intitulée « Automatiser le cycle complet »L'objectif : un cycle de vie où l'humain n'intervient que pour les décisions stratégiques (classification initiale, révocation d'urgence, choix de politique).
Flux d'un cycle automatisé
Section intitulée « Flux d'un cycle automatisé »Les six phases ci-dessous décrivent ce qui se passe sans intervention humaine, du démarrage du service jusqu'à la révocation d'urgence. La quatrième est celle qui fait échouer la plupart des mises en oeuvre.
1. Authentification initiale du workload : le service prouve son identité via un mécanisme fort (ServiceAccount Kubernetes, identité cloud, OIDC/JWT). Pas de secret partagé à l'amorçage, c'est l'identité native qui permet l'accès.
2. Émission du secret : le coffre-fort vérifie l'identité, applique les policies, émet un secret avec TTL court. Il ne distribue que le strict nécessaire.
3. Renouvellement automatique : un agent ou sidecar renouvelle le lease avant expiration. L'application continue sans interruption.
# Vault Agent renouvelle automatiquement les secrets injectésvault agent -config=agent.hcl4. Rechargement applicatif : quand le secret change, l'application doit prendre en compte la nouvelle valeur. C'est le point souvent oublié lors de la conception.
| Mécanisme | Cas d'usage | Point d'attention |
|---|---|---|
| Redémarrage | Apps sans hot-reload | Nécessite un rolling update pour éviter le downtime |
| Signal SIGHUP | nginx, haproxy | Dépend du support applicatif |
| Rolling update K8s | Conteneurs | Quelques secondes de bascule |
| Lecture à chaque requête | Apps conçues pour ça | Complexité côté code et TTL du cache |
5. Journalisation : chaque accès est logué avec identité, timestamp et opération. Ces logs partent vers le SIEM avec des règles de détection actives.
6. Révocation d'urgence : révocation dans le coffre-fort + notification des équipes + vérification que l'ancien secret n'est plus actif + documentation.
Ce qu'il faut outiller
Section intitulée « Ce qu'il faut outiller »Chaque phase du cycle réclame un composant dédié : le tableau donne les briques les plus courantes pour un déploiement Kubernetes ou cloud. Aucune ligne n'est facultative, et celle du rechargement applicatif dépend du code de l'application, pas de l'infrastructure.
| Phase | Outil / mécanisme |
|---|---|
| Authentification | K8s ServiceAccount, OIDC, AppRole |
| Émission / stockage | Vault, OpenBao, AWS Secrets Manager |
| Distribution K8s | External Secrets Operator, Vault Agent Injector |
| Renouvellement | Vault Agent, sidecar dédié |
| Rechargement applicatif | Rolling update, SIGHUP, SDK natif |
| Audit | Vault audit device → SIEM |
| Révocation | API coffre-fort + runbook documenté |
À retenir
Section intitulée « À retenir »- Avant tout, inventaire, propriétaire, consommateurs, criticité et procédure d'urgence
- 1. Génération, entropie cryptographique ; certains secrets sont émis par une source externe
- 2. Stockage, chiffré + contrôle d'accès + audit ; K8s Secret ≠ secret manager
- 3. Distribution, injection runtime, bootstrap résolu ; variables d'env avec précautions
- 4. Utilisation, durée minimale, pas de logging, surface d'exposition minimale
- 5. Rotation, 3 modèles : planifiée, événementielle, expiration native ; dual-active pour la bascule
- 6. Révocation, immédiate + propagation maîtrisée + vérification complète
- 7. Audit, accès ET opérations d'admin, corrélé à des alertes actives
- 8. Destruction, rendre inutilisable + purger les copies selon les politiques de rétention