Guides

Guide de plateforme

Configuration et secrets cloud-native : 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.

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.

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.

Faire de la configuration 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.

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é.

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.

É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.

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.

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é.

Une séquence de rotation 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.

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.

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.

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.

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, 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é

Maintenez la configuration de livraison sûre et mesurable

Échangez avec Optimi sur la configuration de périphérie à origine, les contrôles de cache et une architecture de livraison du trafic résiliente.

Évaluer l'architecture de configuration