Agence web » Actualités du digital » Gérer les secrets dans Kubernetes –

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.

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.