Gérer les secrets dans Kubernetes –
Les secrets Kubernetes vous permettent de stocker des informations confidentielles en toute sécurité. L’utilisation d’un secret élimine le besoin de bake des données sensibles dans des définitions de manifeste ou des images de conteneur simples.
Les secrets sont un type de ressource de première classe qui existe indépendamment de tout pod. Vous fournissez aux pods des références à vos secrets. L’architecture vous permet de limiter l’accès aux secrets uniquement aux pods qui ont réellement besoin des données.
Vous utilisez généralement des secrets pour toutes les constantes sensibles dont vos pods peuvent avoir besoin. Ils sont idéaux pour stocker les clés d’authentification, les informations d’identification de base de données et les jetons d’API.
Sommaire
Créer un secret
Les secrets sont créés de la même manière que toute autre ressource API Kubernetes. Vous pouvez utiliser des commandes Kubectl ou un manifeste YAML que vous appliquez ensuite à votre cluster. Nous fournirons des exemples de fichiers YAML dans ce didacticiel.
Voici comment définir un secret créé par l’utilisateur:
apiVersion: v1 kind: Secret type: Opaque metadata: name: demo-secret data: SECRET_USERNAME: dXNlcm5hbWUK SECRET_PASSWORD: cGFzc3dvcmQK
Les secrets consistent en un kind
et un simple objet de data
. L’exemple de secret définit deux champs de données séparés, SECRET_USERNAME
et SECRET_PASSWORD
. Les valeurs doivent être encodées en Base64 – les valeurs indiquées ci-dessus étaient à l’origine username
et password
.
Si vous travaillez avec un modèle Helm, vous pouvez définir vos valeurs secrètes dans un values.yaml
déposer. Passez-les à travers b64enc
dans votre manifeste pour que Helm les code en Base64.
apiVersion: v1 kind: Secret type: Opaque metadata: name: demo-secret data: SECRET_PASSWORD: {{ .Values.SecretPassword | b64enc }}
Si vous préférez ne pas encoder vos valeurs en Base64, vous pouvez utiliser le stringData
champ à la place. Comme data
, stringData
est une carte de paires clé-valeur mais les valeurs seront traitées textuellement, sans aucun encodage.
Types secrets
le Opaque
le type secret doit être utilisé pour les données arbitraires que vous définissez vous-même. Kubernetes définit quelques autres types de secrets intégrés destinés à des scénarios d’utilisation spécifiques.
Les types disponibles incluent service-account-token
(un jeton de service Kubernetes), dockerconfigjson
(un Docker sérialisé config.json
fichier, pour fournir les informations d’identification Docker) et ssh-auth
(fournir les informations d’identification SSH). En plus de ces types, il existe des solutions pour l’authentification de base HTTP et les données de certificat TLS.
Chaque type de secret est capable de définir ses propres champs supplémentaires et contraintes de validation. Vous devrez généralement définir des annotations supplémentaires sur votre secret pour fournir les données nécessaires au type de secret.
Vous pouvez créer vos propres identificateurs de type secret en fournissant votre propre chaîne au type
champ. Le secret résultant sera fonctionnellement équivalent au Opaque
taper.
Fournir des secrets aux pods
Une fois que vous avez créé un secret, vous devez le rendre disponible pour vos pods. Vous pouvez injecter des données secrètes en tant que variables d’environnement ou en tant que fichier monté dans un volume.
Voici un manifeste de pod qui extrait les données d’un secret dans des variables d’environnement:
apiVersion: v1 kind: Pod metadata: name: pod-with-secret spec: containers: - name: demo-container image: my-image:latest envFrom: - secretRef: name: demo-secret
En utilisant envFrom
, toutes les paires clé-valeur définies dans le secret data
sera converti en variables d’environnement de conteneur. Avec l’exemple de secret de plus tôt, votre conteneur aurait SECRET_USERNAME
et SECRET_PASSWORD
variables d’environnement injectées. Les valeurs seront automatiquement décodées en Base64.
Parfois, vous voudrez travailler avec des fichiers au lieu de variables d’environnement. Voici comment monter un secret dans un volume Kubernetes.
apiVersion: v1 kind: Pod metadata: name: pod-with-secret spec: containers: - name: demo-container image: my-image:latest volumeMounts: - name: secret-volume mountPath: /secrets volumes: - name: secret-volume secret: secretName: demo-secret
Accéder au /secrets
répertoire dans le conteneur pour afficher les données secrètes. Chaque clé de données aura son propre fichier. Le contenu du fichier sera la valeur décodée en Base64 de cette clé. Notre exemple de secret écrirait /secrets/SECRET_USERNAME
et /secrets/SECRET_PASSWORD
des dossiers.
L’approche fonctionne en créant un volume Kubernetes à l’aide du secret
la source. Cette source remplit le volume avec les données d’un secret nommé. Le volume est ensuite monté dans le conteneur au chemin défini sous volumeMounts
.
Considérations relatives à la sécurité
Mettre des données dans un secret ne les sécurise pas automatiquement. L’encodage Base64 fournit une obscurité superficielle mais ne vous y trompez pas: c’est codage et pas chiffrement. Tout ce qui a accès à votre cluster, qu’il s’agisse d’un utilisateur humain ou d’une application dûment autorisée, peut récupérer des valeurs secrètes en texte brut.
Le secret est de réduire le risque d’exposition accidentelle de données lors de la création et de la visualisation des pods. Les secrets ne sont fournis qu’aux pods – et aux nœuds – qui en ont réellement besoin. Node détruira leurs copies locales de secrets lorsque le pod qui les a utilisés se terminera.
Le plan de contrôle Kubernetes stocke les valeurs secrètes dans son instance etcd. Il s’agit d’un magasin clé-valeur qui sauvegarde les données du cluster Kubernetes. Si vous souhaitez maximiser la sécurité, vous devez configurer le chiffrement au repos pour votre magasin etcd. Cela cryptera vos secrets dans etcd.
Vous devez également évaluer la manière dont votre couche d’application gère les secrets. Même avec le chiffrement au repos activé, vos conteneurs peuvent par inadvertance divulguer des secrets en les émettant dans les journaux de tâches ou en les envoyant à des services externes. L’utilisation de secrets Kubernetes n’élimine pas la nécessité de gérer avec soin les données sensibles au sein de votre conteneur.
Résumé
Les secrets Kubernetes vous permettent de stocker et d’accéder à des données confidentielles au sein de votre cluster Kubernetes. L’utilisation de secrets vous donne plus de contrôle sur l’exposition des informations. Cela rend également explicite le fait que vous gérez des valeurs potentiellement sensibles. Cela peut servir d’avertissement aux utilisateurs et aux administrateurs du cluster.
Les pods consomment des secrets sous forme de variables d’environnement ou de fichiers montés sur volume. Kubernetes gère l’injection de secrets dans des conteneurs. Vos charges de travail peuvent accéder aux données à l’aide de leurs mécanismes de configuration existants. Les secrets ne sont pas entièrement sécurisés par défaut, mais vous pouvez augmenter leur protection en activant le chiffrement au niveau du cluster.