Guide de plateforme

Gestion de configuration cloud-native et secrets : sécurisés, observables et portables

La configuration externe est un principe Twelve-Factor ; une implémentation cloud-native exploitable ajoute la responsabilité, la validation, le contrôle d'accès, la rotation et des éléments de preuve opérationnels sûrs.

Publié le
Mis à jour le
Temps de lecture
19 min de lecture
Sur cette page

La configuration indique à un service où et comment s'exécuter. Les secrets l'autorisent à le faire. Tous deux évoluent indépendamment du code applicatif et peuvent provoquer une panne ou une exposition de données lorsqu'ils sont traités comme des détails de déploiement accessoires. L'objectif n'est pas simplement de placer des valeurs dans des variables d'environnement. Il consiste à créer un contrat explicite et auditable entre une application et son environnement d'exécution.

À l'échelle où opère une couche d'orchestration d'edge managée — de nombreux services et environnements derrière un seul point d'entrée — ce contrat doit tenir de façon cohérente partout, sous peine de devenir la première source d'incidents impossibles à reproduire. Ce guide traite la gestion de configuration cloud-native et la gestion des secrets comme une seule discipline : les pratiques qui maintiennent, version après version, les promesses Performance, Sécurité et Visibilité de la Suite Optimi.

Les ConfigMaps et Secrets Kubernetes sont des mécanismes de distribution utiles, mais ils ne constituent pas une stratégie complète de gestion des secrets. Un Secret Kubernetes est encodé, non chiffré automatiquement de bout en bout, et sa sécurité dépend de la configuration de chiffrement de l'API server, de RBAC, des contrôles d'admission, de l'accès aux nœuds et du pipeline de livraison environnant.

Séparer la configuration selon sa sensibilité et son comportement

Classez chaque valeur d'exécution avant de choisir comment la distribuer :

  • Configuration opérationnelle publique : ports, niveaux de logs, valeurs par défaut de fonctionnalités, régions et endpoints non sensibles.
  • Configuration sensible : clés API, mots de passe de bases de données, matériel de signature, secrets client OAuth et certificats privés.
  • Configuration de politique : limites de débit, comportement du cache, origines autorisées et règles de routage qui peuvent modifier le comportement de sécurité ou de latence.
  • Configuration d'identité : identité de charge de travail, service account, rôle, audience et domaine de confiance.

Cette classification évite deux mauvaises valeurs par défaut : stocker toute valeur dans le contrôle de source parce que c'est pratique, ou traiter chaque paramètre comme un secret et rendre le dépannage courant impossible. Utilisez des noms qui expriment l'intention, définissez des formats et plages acceptables et documentez un responsable pour chaque valeur.

Une classification se dégrade si rien ne la fait respecter. Une « URL de webhook de debug » qui finit par porter un jeton signé, ou une « région par défaut » qui devient une politique de routage, peut glisser silencieusement du public vers le sensible. Revoyez la classification chaque fois que la forme ou l'usage d'une valeur change, pas seulement lors de son introduction.

Faire de la gestion de configuration cloud-native un contrat de démarrage typé

Lisez la configuration une fois au démarrage, analysez-la dans une structure typée et échouez clairement en cas de valeurs requises manquantes ou de combinaisons non valides. Masquez les noms et valeurs sensibles dans les erreurs. Un service qui substitue silencieusement une valeur par défaut dangereuse peut sembler sain tout en envoyant le trafic vers le mauvais endpoint ou en désactivant un contrôle critique.

Conservez une configuration orthogonale. Préférez des valeurs individuelles telles que PAYMENTS_TIMEOUT_MS et EDGE_CACHE_TTL_SECONDS à un seul libellé d'environnement au comportement implicite. Les noms d'environnement restent utiles pour sélectionner un déploiement, mais ils ne doivent pas dissimuler les valeurs qui déterminent l'exactitude.

La validation au niveau de chaque champ ne suffit pas. Deux valeurs peuvent être individuellement valides et rester dangereuses ensemble : un TTL de cache plus long que l'expiration d'une URL signée, un plafond de pool de connexions supérieur à la limite maximale de connexions de la base de données, ou un listener public laissé actif alors que la vérification TLS est désactivée pour le débogage. Codifiez ces invariants inter-champs dans la même vérification de démarrage et refusez de démarrer plutôt que de dégrader silencieusement le service. Un schéma confirme la forme ; une vérification d'invariant confirme que les formes sont sûres ensemble — c'est la part de la gestion de configuration cloud-native qu'un simple fichier de schéma ne peut pas exprimer.

Versionnez les changements de configuration comme le code. Examinez les changements à fort impact, testez-les dans un environnement représentatif et enregistrez quelle release a utilisé quelle révision de configuration. Lorsqu'une régression de latence suit un déploiement, les ingénieurs doivent distinguer une nouvelle image d'un délai d'attente, d'une clé de cache ou d'un endpoint amont modifié.

Choisir un modèle de distribution pour la gestion des secrets

Kubernetes offre plusieurs façons de faire passer une valeur d'un système de gestion des secrets vers un conteneur en cours d'exécution, et ces modèles ne sont pas interchangeables :

  • Les contrôleurs de synchronisation vers un Secret — le modèle utilisé par des outils comme External Secrets Operator — lisent un gestionnaire de secrets externe et écrivent un Secret Kubernetes ordinaire, que le kubelet monte comme d'habitude. L'outillage existant continue de fonctionner sans changement, mais la valeur atterrit malgré tout dans etcd : le chiffrement au repos et le RBAC restent obligatoires, et l'intervalle de rafraîchissement du contrôleur détermine la vitesse à laquelle une valeur révoquée disparaît réellement.
  • Le montage par pilote CSI — le modèle du Secrets Store CSI Driver — projette le contenu du secret dans le système de fichiers du pod via un volume éphémère, sans jamais créer d'objet Secret Kubernetes. La valeur ne transite jamais par etcd, ce qui réduit une surface d'attaque, mais tout ce qui attend spécifiquement un objet Secret ne trouvera rien.
  • L'injection par agent ou sidecar avec des identifiants dynamiques à bail demande au système sous-jacent — une base de données, un fournisseur cloud, un courtier comme Vault — d'émettre à la demande un identifiant à courte durée de vie plutôt que d'en stocker un au repos. Il expire selon son propre calendrier et peut être révoqué de façon centralisée : l'option la plus robuste lorsque le système sous-jacent la prend en charge, et un mauvais choix lorsqu'il n'accepte que des identifiants statiques de longue durée.

Choisissez le modèle par charge de travail en fonction de ce que le système consommateur peut accepter et de la vitesse à laquelle une valeur révoquée doit disparaître, et documentez ce choix à côté de la charge de travail plutôt que de supposer qu'un seul modèle convient à tout le cluster.

Base64 est un encodage, pas un chiffrement

Les données d'un Secret Kubernetes sont encodées en base64 dans les manifests. Protégez-les par un chiffrement au repos pour l'API server, un RBAC à portée étroite, des sauvegardes sûres et des revues d'accès. Ne commitez jamais de vrais manifests Secret ni de valeurs décodées dans un dépôt.

Utiliser les primitives Kubernetes en gardant leurs limites à l'esprit

Montez un ConfigMap ou un Secret comme volume lorsqu'une application peut recharger en toute sécurité une configuration fondée sur des fichiers. Les variables d'environnement sont simples, mais un processus déjà en cours ne reçoit pas une valeur modifiée. Le contenu projeté dans un volume peut finir par se mettre à jour, mais l'application doit détecter et valider le changement ; ne supposez jamais que cela rend chaque paramètre rechargeable dynamiquement.

Marquez les ConfigMaps et Secrets qui n'ont pas besoin d'édition en place avec immutable: true. Le kubelet arrête de surveiller les changements, ce qui réduit la charge sur l'API server à l'échelle du cluster et supprime le risque qu'une édition en place « anodine » modifie silencieusement le comportement de chaque réplica à la fois. La contrepartie : un objet immuable ne peut plus être patché. Un changement de valeur signifie créer un nouvel objet — généralement suffixé par un hash de contenu ou un numéro de révision —, mettre à jour la référence de la charge de travail, puis déployer les pods par lots contrôlés. Cette étape supplémentaire est une fonctionnalité, pas une gêne : elle transforme une rotation de configuration ordinaire en un changement revu et réversible plutôt qu'en une mutation silencieuse.

Évitez les imports envFrom étendus pour les services de production. Ils rendent le contrat effectif invisible et permettent à une clé sans rapport de modifier un environnement d'exécution. Référencez des clés exactes, délimitez la configuration par charge de travail et évitez de placer des secrets dans les arguments de ligne de commande, annotations, labels ou endpoints de débogage.

Utilisez un RBAC avec espace de noms et n'accordez aux charges de travail que la capacité de lire les ressources spécifiques dont elles ont besoin, idéalement via un contrôleur ou une intégration de secrets externe plutôt que par un accès direct étendu à l'API. Limitez qui peut lire les objets Secret, qui peut créer des pods qui les montent et qui peut inspecter les logs CI ou les manifests de déploiement. Un sujet qui peut créer un pod avec le service account d'une autre charge de travail peut souvent obtenir les accès de cette charge de travail.

Privilégier une identité de charge de travail à courte durée de vie

Lorsque votre plateforme cloud le prend en charge, laissez une charge de travail s'authentifier avec sa propre identité et échanger des identifiants à courte durée de vie contre la ressource requise. Cela réduit le périmètre d'impact et la charge de rotation des clés statiques de longue durée. Liez l'identité au bon espace de noms et service account, contraignez l'audience et le rôle, et testez ce qui se produit lorsque le renouvellement du token ou le fournisseur d'identité est indisponible.

Les secrets statiques restent nécessaires pour certains systèmes. Conservez-les dans un gestionnaire de secrets dédié, distribuez-les juste à temps lorsque possible, faites-les tourner selon un calendrier testé et prenez en charge les identifiants qui se chevauchent pendant la rotation. Une rotation qui modifie le serveur d'abord et les clients ensuite peut créer un événement de disponibilité généralisé.

Lorsque le système sous-jacent le permet, préférez des identifiants dynamiques à bail à la rotation d'un identifiant statique. Un moteur de secrets de base de données qui émet à la demande un nom d'utilisateur et un mot de passe à portée réduite et à durée de vie bornée élimine la rotation manuelle en tant qu'étape : l'identifiant expire, que quelqu'un se souvienne ou non de le révoquer, et une fuite a une durée de vie intégrée. Réservez la rotation manuelle de configuration aux systèmes — bases de données historiques, API tierces, clés de signature — incapables d'émettre des identifiants à la demande.

Pour les certificats TLS, coordonnez l'émission, le déploiement, le rechargement et la surveillance de l'expiration. Un changement de certificat sur un ingress ou en périphérie peut nécessiter une procédure différente de celle d'un identifiant d'application à base de données.

Orchestrer une rotation de configuration sûre

  1. Créez un nouvel identifiant avec les autorisations minimales requises.
  2. Distribuez-le par le chemin de secret approuvé tout en conservant l'ancien identifiant.
  3. Rechargez ou déployez les charges de travail par lots contrôlés et vérifiez le succès de l'authentification, la latence et le taux d'erreur.
  4. Révoquez l'ancien identifiant après que tous les consommateurs ont migré et que la fenêtre de chevauchement est écoulée.
  5. Auditez les accès et documentez le résultat sans enregistrer de matériel secret.

Généralisez les étapes 2 et 4 avec une étiquette explicite plutôt qu'une hypothèse implicite. Plusieurs magasins de secrets managés en font un concept de première classe — une étiquette de mise en scène qui distingue la valeur précédemment active, la valeur en cours de validation et la valeur que les clients doivent encore utiliser — afin que chaque consommateur et chaque opérateur s'accordent sur l'identifiant faisant autorité à chaque instant. Intégrez ce même raisonnement à trois états dans une rotation de configuration maison, même sans cet outillage : étiquetez les identifiants comme sortants, actifs ou en attente, et ne révoquez jamais un identifiant sortant tant que quelque chose le présente encore.

Surveillez un mode de défaillance précis : un pool de connexions de longue durée qui s'est authentifié avant la rotation et ne renégocie jamais continue de fonctionner avec l'ancien identifiant jusqu'à son recyclage, ce qui peut masquer une rotation échouée pendant des heures. Bornez la durée de vie des connexions en deçà de votre fenêtre de chevauchement de rotation, ou recyclez le pool comme une étape explicite de la rotation.

Empêcher que les changements ne deviennent des incidents de latence

La configuration peut créer des régressions de performances. Une limite de pool de connexions plus faible augmente le temps d'attente ; un délai d'attente amont plus court peut transformer des requêtes lentes en erreurs ; une règle de variation du cache incorrecte peut divulguer des réponses personnalisées ou détruire le taux de cache hit. Définissez un budget de latence et de disponibilité pour les valeurs critiques, testez-les sous charge et déployez les changements progressivement.

Conservez les endpoints d'origine privés lorsque possible et configurez le chemin de confiance périphérie-origine indépendamment de la configuration des clients publics. Ne distribuez pas d'adresse d'origine ni d'identifiant de contournement au code du navigateur. Lorsque la configuration de routage, de cache ou de failover change, validez la possibilité de mise en cache, l'autorisation, TLS, les contrôles de santé et la corrélation des requêtes de la périphérie à l'origine.

Observez la configuration sans l'exposer. Émettez une révision de configuration, un digest de release, l'état des feature flags lorsqu'il n'est pas sensible et un identifiant de version de secret ou un horodatage de rotation lorsque cela est autorisé. Ne journalisez pas le secret réel, une chaîne de connexion complète, un en-tête d'autorisation ou une URL signée. Ces identifiants permettent d'associer une hausse de la latence p99 ou des échecs d'authentification à un changement.

Un seul contrat de configuration, plusieurs fournisseurs

Une requête derrière un seul point d'entrée traverse souvent plusieurs fournisseurs spécialisés — CDN, WAF, DNS, origine — où un changement de configuration ou d'identifiant sur une seule couche produit le même symptôme : un pic de latence ou une vague d'échecs d'autorisation. Étiquetez chaque révision et chaque version de secret avec un identifiant que MYO peut corréler entre fournisseurs, afin qu'une régression pointe vers la couche réellement modifiée plutôt que vers une recherche manuelle dans chaque tableau de bord.

Pièges fréquents

  • Secrets dans les images ou l'historique Git : supprimer un fichier ne révoque pas une clé divulguée. Faites-la tourner et analysez les couches d'image, dépôts, artefacts CI et logs.
  • Un secret de production partagé : cela empêche l'attribution et rend la rotation risquée. Émettez des identifiants distincts par service et environnement.
  • Rechargement de configuration sans validation : une valeur partiellement écrite ou malformée peut casser chaque réplica. Validez avant activation et conservez la dernière configuration connue comme valide lorsque l'application prend en charge le rechargement.
  • Accès de débogage qui révèle les variables d'environnement : l'inspection de processus, les crash dumps et les bundles de support peuvent exposer des identifiants. Masquez-les par défaut et limitez l'accès aux diagnostics.
  • Secrets accessibles à chaque pod d'un espace de noms : l'isolation par espace de noms seule n'est pas le moindre privilège. Examinez ensemble les droits RBAC et les droits de création de pods.
  • Contourner l'immutabilité plutôt que versionner : recréer un objet immutable: true sous le même nom pour forcer une édition détruit l'historique de révisions qui rendait le changement contrôlable. Avancez plutôt vers un nouveau nom versionné.
  • Rotation qui ignore les pools de connexions : révoquer l'ancien identifiant alors que des connexions du pool sont encore authentifiées avec lui produit des échecs intermittents et difficiles à reproduire, bien après la fermeture de la fenêtre de rotation.

Liste de contrôle opérationnelle

Pour chaque service, documentez le schéma complet de configuration, la classification de sensibilité, la source de vérité, le responsable, l'identité consommatrice, le modèle de distribution retenu pour la gestion des secrets, la procédure de rotation, le comportement de rechargement et le signal de supervision. Testez une valeur manquante, une valeur invalide, un identifiant révoqué, le chevauchement de rotation, une panne du magasin de secrets et un retour arrière. Incluez le système de déploiement et les sauvegardes dans le modèle de menace : un environnement d'exécution sûr ne peut pas compenser des artefacts CI en clair ou une administration de cluster trop étendue.

Références faisant autorité

Faites de la configuration et des secrets un pilier de votre stratégie d'edge

Échangez avec Optimi sur l'alignement de la gestion de configuration cloud-native, de la gestion des secrets et de la rotation de configuration avec les promesses Performance, Sécurité et Visibilité de votre orchestration d'edge.

Évaluer l'architecture de configuration