RessourcesDEVOPS · SECRETS

Secrets management en déploiement continu : sécuriser les credentials

Vault centralisé, injection sans clé statique et rotation automatique pour ne jamais exposer un secret en clair.

STRALYA13 min de lecturejuillet 2026

Pourquoi le secrets management est critique en déploiement continu

Dans tout pipeline de déploiement automatisé, l'application a besoin d'accéder à des ressources sensibles : bases de données, services externes, registries d'images, systèmes de paiement ou APIs privées. Ces identifiants doivent être injectés dynamiquement au moment du déploiement, mais jamais stockés en clair dans le code source, les fichiers de configuration commités, ou les logs visibles aux développeurs. Le risque est double : d'abord, un secret exposé dans un commit est exposé dans toute l'histoire Git, même après suppression ; ensuite, une personne mal intentionnée au sein de l'équipe ou accédant à votre CI/CD peut compromettre l'intégralité de votre infrastructure de production. Les réglementations telles que RGPD ou PCI-DSS imposent également de démontrer qu'aucun secret n'est stocké de manière non chiffrée. En déploiement continu, cette injection de secrets doit être automatique et transparente pour les développeurs, sans ajouter de friction au processus : un déploiement qui ralentit ou complexifie l'accès aux secrets incite l'équipe à contourner les bonnes pratiques.

Les trois modèles de stockage des secrets en production

Il existe trois approches majeures pour gérer les secrets en déploiement. La première, déjà dépassée mais encore présente dans certains codes legacy, consiste à stocker les secrets dans des variables d'environnement sur le serveur ou dans des fichiers .env versionnés (sans versioning) : cela fonctionne à très petite échelle mais ne scale pas, est impossible à auditer et extrêmement risqué. La deuxième approche utilise un vault centralisé et chiffré (AWS Secrets Manager, HashiCorp Vault, Google Secret Manager), où les secrets sont stockés dans un service dédié, chiffré, auditable, et reversionné à chaque modification : l'application ou le pipeline authentifient auprès du vault au moment du déploiement et récupèrent le secret de manière sécurisée. C'est le standard dans les organisations matures. La troisième approche, souvent combinée aux deux précédentes, utilise le chiffrement au niveau du pipeline : certains outils (notamment GitOps, qui versionnent les secrets chiffrés directement dans Git) stockent les secrets sous forme chiffrée dans le repository, et seul le pipeline posséde la clé pour les déchiffrer au moment du déploiement. Chacune a des avantages et des inconvénients selon votre maturité, votre budget et vos contraintes de compliance. Pour AWS, la combinaison vault centralisé (Secrets Manager) et injection sécurisée via les rôles IAM de l'EC2 ou du conteneur reste le choix le plus efficace et le plus sécurisé.

Architecture AWS : Secrets Manager et injection sécurisée

Sur AWS, le pattern de référence combine AWS Secrets Manager pour le stockage centralisé et les rôles IAM pour l'authentification sans clé. Voici comment cela fonctionne concrètement : vous créez un secret dans Secrets Manager (une base de données, une clé API), définissez une politique IAM qui autorise uniquement certaines ressources (votre EC2, votre pod Kubernetes, votre fonction Lambda) à le consulter, et lors du déploiement, l'application ou le pipeline utilise le SDK AWS pour récupérer le secret à partir du contexte IAM établi. Il n'y a pas de clé statique à gérer, pas de secret hardcodé : la confiance est basée sur l'identité de la ressource qui demande le secret. Dans un pipeline CI/CD (GitLab, GitHub Actions, Jenkins), cela signifie que le pipeline lui-même est authentifié auprès d'AWS via une clé d'accès temporaire ou une assomption de rôle (OIDC est préféré, qui élimine le besoin de clés statiques), et peut donc récupérer les secrets pour les injecter dans les variables d'environnement du conteneur ou de l'application déployée. La rotation des secrets est également simplifiée : Secrets Manager peut changer le secret automatiquement selon un calendrier défini (par exemple, rotation hebdomadaire des credentials de base de données), et l'application n'a jamais eu à mémoriser la vieille valeur, elle la demande à chaque déploiement. Pour encore plus de sécurité, vous pouvez combiner cela avec AWS Parameter Store (pour les configurations non sensibles) et limiter l'accès en réseau au Secrets Manager via des endpoints VPC privés.

Injection des secrets dans les pipelines de déploiement courants

La méthode concrète d'injection des secrets varie selon votre outil de pipeline. Sur GitHub Actions, la pratique est simple : GitHub secrets (eux-mêmes chiffrés et masqués des logs) sont injectés en tant que variables d'environnement ou passés en arguments au déploiement, ou vous pouvez configurer une authentification OIDC directement vers AWS Secrets Manager pour récupérer les secrets à la volée au lieu de les copier dans GitHub. Pour GitLab CI/CD, la même logique s'applique via les protected variables (limitées aux branches principales) et les CI/CD variables avec masquage, ou une intégration directe avec un vault externe via des intégrations natives. Sur Jenkins, un plugin (Credentials Binding, HashiCorp Vault plugin) permet de récupérer les secrets depuis un vault et de les injecter uniquement dans le contexte du job, sans jamais les écrire sur le disque. La règle d'or commune est de toujours injecter les secrets comme variables d'environnement (jamais en arguments de ligne de commande, visibles dans les processus listing), de masquer les secrets dans les logs de la pipeline (tous les outils majeurs proposent cette fonction), et de ne jamais les commiter dans le repository, même chiffrés localement. En pratique, pour les équipes utilisant ECS ou Kubernetes avec GitHub Actions, le pattern le plus fluide est : OIDC vers AWS STS pour obtenir un token temporaire, puis récupérer les secrets depuis Secrets Manager directement dans le déploiement (via le rôle IAM du task/pod), sans jamais les transiter par la pipeline elle-même en clair. Pour les équipes en phase de migration ou utilisant plusieurs clouds, HashiCorp Vault (déployé en interne ou via HCP) offre une couche d'abstraction unique, agnostique du cloud, et très flexible.

Les pièges courants et comment les éviter

Le premier piège, très fréquent dans les équipes pressées, est de stocker les secrets dans des fichiers .env commités par erreur. Un seul commit oublié, et vous devez considérer le secret compromis, même s'il est supprimé plus tard (l'histoire Git le conserve). La solution est simple : un .gitignore strict, un pre-commit hook qui refuse de commiter des patterns de secrets (tools comme detect-secrets ou TruffleHog aident à cela), et un audit du code existant pour chercher des secrets cachés. Le deuxième piège concerne les logs : les applications écrivent parfois les variables d'environnement ou les réponses du vault dans les logs pour déboguer, exposant accidentellement le secret. Soyez strict sur ce que vous loguez : jamais les variables d'environnement complètes, jamais les secrets reçus, jamais les en-têtes d'authentification. Le troisième piège est la rotation insuffisante : un secret que vous ne changez jamais devient un risque croissant au fil du temps. Utilisez les capacités de rotation automatique de votre vault (tous les services AWS, Vault, et les outils modernes le supportent). Le quatrième piège est l'authentification des pipelines elle-même : si vous utilisez des clés d'accès statiques (access key / secret key AWS) pour authentifier votre CI/CD auprès d'AWS Secrets Manager, ces clés elles-mêmes doivent être gérées et stockées quelque part. La meilleure approche est OIDC, où le pipeline et AWS échangent des tokens à courte durée sans jamais générer de clés statiques. Enfin, certaines équipes sous-estiment le besoin d'audit : qui a accédé à quel secret, quand, et pourquoi ? Secrets Manager et Vault fournissent des logs d'accès intégrés ; activez-les et examinez-les régulièrement.

Bonnes pratiques et checklist de sécurisation

Voici les points clés à mettre en place pour un secrets management sécurisé en déploiement continu. D'abord, centralisez tous les secrets dans un vault unique (Secrets Manager, Vault, ou équivalent) et supprimez-les de tous les autres endroits : code, fichiers config, variables d'environnement du serveur. Deuxièmement, authentifiez le pipeline sans clés statiques : utilisez OIDC pour les authentifications cloud, ou un agent (Vault agent sur le serveur) pour les déploiements on-premise. Troisièmement, limitez l'accès au minimum nécessaire : une application de paiement n'a pas besoin d'accéder aux secrets de la base de données de reporting. Utilisez les politiques IAM ou les contrôles d'accès du vault pour enforcer cette séparation. Quatrièmement, masquez les secrets dans les logs et les outputs : configurez votre pipeline et vos outils pour omettre les valeurs sensibles de tous les logs. Cinquièmement, versionnez et auditez les accès : activez les logs d'audit du vault, consultez-les régulièrement, et déclenchez des alertes sur les accès suspects (une application demandant un secret au-delà de ses besoins normaux, ou un humain accédant directement à des secrets hors déploiement). Sixièmement, mettez en place une rotation des secrets sur un calendrier strict : mensuellement ou trimestriellement pour les credentials de base de données, plus fréquemment pour les tokens API sensibles. Septièmement, testez vos procédures de gestion des secrets comprise : un secret compromis doit pouvoir être renouvelé et déployé dans les minutes, pas dans les heures. Enfin, documentez qui a le droit de créer, modifier, ou accéder à quels secrets, et appliquez une séparation des droits : un développeur peut créer un secret dans un environnement de dev, mais seul DevOps ou une personne d'ops peut le promouvoir en production.

Intégration du secrets management dans votre pipeline AWS actuel

Si vous utilisez déjà une infrastructure AWS et un pipeline de déploiement, la migration vers un secrets management sécurisé est progressive et sans interruption. Commencez par créer un secret dans AWS Secrets Manager pour l'une de vos applications non-critiques, puis mettez à jour sa définition de tâche ECS ou sa configuration Lambda pour que les credentials soient injectés depuis Secrets Manager au lieu d'être en clair. Testez le déploiement, vérifiez que l'application accède bien au secret, puis mesurez le temps d'injection (généralement imperceptible). Une fois le pattern validé, reproduisez-le pour les autres applications. Pour les applications legacy qui s'attendent à des fichiers .env ou à des variables d'environnement classiques, le processus est identique : le pipeline récupère le secret et le passe à l'application sous forme de variable d'environnement, l'application n'a rien à changer. Pour AWS CodeDeploy, l'intégration est native : configurez une politique IAM qui autorise le rôle du déploiement à accéder aux secrets, et utilisez un script d'appel custom pour les récupérer et les injecter. Pour Kubernetes sur AWS (EKS), la pratique est légèrement différente : utilisez AWS Secrets and Configuration Provider (ASCP) pour synchroniser les secrets AWS dans les secrets Kubernetes, ou injectez-les directement via le pod IAM role (Karpenter, Kube2IAM). Le coût est négligeable : Secrets Manager facture par secret et par requête, généralement moins de quelques euros par mois pour une petite à moyenne équipe. La migration peut être conduite progressivement sans risque de régression : si une application ne peut pas accéder à Secrets Manager pour une raison quelconque, maintenez un fallback temporaire vers l'ancienne méthode, le temps de déboguer l'accès IAM. Une fois que toutes les applications sont migrées et testées en production pendant quelques semaines, vous pouvez supprimer les anciens secrets de l'infrastructure classique.

Étapes concrètes pour démarrer demain

Voici ce que vous pouvez faire dès demain matin pour mettre en place une gestion sécurisée des secrets. Premièrement, inspectez votre codebase et votre infrastructure actuelle pour identifier tous les secrets exposés (scripts de recherche simples, outils comme TruffleHog, ou audit manuel rapide). Notez les coordonnées du propriétaire de chaque secret (quel développeur, quel projet). Deuxièmement, créez un secret de test dans AWS Secrets Manager : choisissez une clé API factice, donnez-lui un nom et placez-la en Secrets Manager. Testez sa récupération via le SDK AWS ou via la CLI. Troisièmement, créez ou mettez à jour la politique IAM d'une application non-critique pour lui donner accès à ce secret, et vérifiez que l'application peut le récupérer sans erreur. Quatrièmement, mettez à jour le pipeline de cette application (GitHub Actions, GitLab CI, ou Jenkins) pour passer par OIDC vers AWS au lieu d'une clé statique, si ce n'est pas déjà fait. Cinquièmement, une fois ce premier secret en production et fonctionnel depuis quelques jours, commencez à migrer les autres secrets une application à la fois, en commençant par les moins critiques. N'attendez pas de migrer tous les secrets en une seule grosse opération : cela introduirait trop de risque. Enfin, configurez une alerte ou une notification lors de tout accès aux secrets de production (via CloudWatch ou le système d'alertes de votre vault), et assignez quelqu'un à examiner ces logs une fois par semaine.

TEARDOWN AWS · GRATUIT

Recevez le Teardown AWS : où part vraiment votre facture.

Le guide qui liste les 12 postes de coût qui fuitent le plus chez les scale-ups, et comment les colmater. Gratuit, par mail, sans engagement.