Gestion des Secrets

Gérer des données confidentielles avec les Secrets.

1 - Gestion des secrets avec kubectl

Créer des Secrets via la ligne de commande kubectl.

Cette page vous montre comment créer, éditer, gérer et supprimer des Secrets Kubernetes en utilisant l'outil de ligne de commande kubectl.

Pré-requis

Vous devez disposer d'un cluster Kubernetes et l'outil de ligne de commande kubectl doit être configuré pour communiquer avec votre cluster. Si vous ne possédez pas déjà de cluster, vous pouvez en créer un en utilisant Minikube, ou vous pouvez utiliser l'un de ces environnements Kubernetes:

Créer un Secret

Un objet Secret stocke des données sensibles telles que des informations d'identification utilisées par des Pods pour accéder à des services. Par exemple, vous pourriez avoir besoin d'un Secret pour stocker le nom d'utilisateur et le mot de passe nécessaires pour accéder à une base de données.

Vous pouvez créer le Secret en passant les données brutes dans la commande, ou en stockant les informations d'identification dans des fichiers que vous transmettez à la commande. Les commandes suivantes créent un Secret qui stocke le nom d'utilisateur admin et le mot de passe S!B\*d$zDsb=.

Utiliser des données brutes

Exécutez la commande suivante :

kubectl create secret generic db-user-pass \
    --from-literal=username=admin \
    --from-literal=password='S!B\*d$zDsb='

Vous devez utiliser des guillemets simples '' pour échapper les caractères spéciaux tels que $, \, *, =, et ! dans vos chaînes de caractères. Sinon, votre shell interprétera ces caractères.

Utiliser des fichiers sources

  1. Stockez les informations d'identification dans des fichiers :

    echo -n 'admin' > ./username.txt
    echo -n 'S!B\*d$zDsb=' > ./password.txt
    

    L'argument -n garantit que les fichiers générés n'ont pas de saut de ligne supplémentaire à la fin du texte. C'est important car lorsque kubectl lit un fichier et encode le contenu dans une chaîne base64, le saut de ligne supplémentaire sera également encodé. Vous n'avez pas besoin d'échapper les caractères spéciaux dans les chaînes que vous incluez dans un fichier.

  2. Passez les chemins des fichiers dans la commande kubectl :

    kubectl create secret generic db-user-pass \
        --from-file=./username.txt \
        --from-file=./password.txt
    

    Par défaut, le nom de la clé sera le nom du fichier. Vous pouvez éventuellement définir le nom de la clé en utilisant --from-file=[key=]source. Par exemple :

    kubectl create secret generic db-user-pass \
        --from-file=username=./username.txt \
        --from-file=password=./password.txt
    

Avec l'une ou l'autre méthode, le résultat est similaire à :

secret/db-user-pass created

Vérifier le Secret

Vérifiez que le Secret a été créé :

kubectl get secrets

Le résultat est similaire à :

NAME              TYPE       DATA      AGE
db-user-pass      Opaque     2         51s

Affichez les détails du Secret :

kubectl describe secret db-user-pass

Le résultat est similaire à :

Name:            db-user-pass
Namespace:       default
Labels:          <none>
Annotations:     <none>

Type:            Opaque

Data
====
password:    12 bytes
username:    5 bytes

Les commandes kubectl get et kubectl describe n'affichent pas le contenu d'un Secret par défaut. Cela protège le Secret contre une exposition accidentelle, ou d'être stocké dans un historique de terminal.

Décoder le Secret

  1. Affichez le contenu du Secret que vous avez créé :

    kubectl get secret db-user-pass -o jsonpath='{.data}'
    

    Le résultat est similaire à :

    { "password": "UyFCXCpkJHpEc2I9", "username": "YWRtaW4=" }
    
  2. Décodez les données de password :

    echo 'UyFCXCpkJHpEc2I9' | base64 --decode
    

    Le résultat est similaire à :

    S!B\*d$zDsb=
    
    kubectl get secret db-user-pass -o jsonpath='{.data.password}' | base64 --decode
    

Modifier un Secret

Vous pouvez éditer un objet Secret existant sauf s'il est immuable. Pour éditer un Secret, exécutez la commande suivante :

kubectl edit secrets <secret-name>

Cela ouvre votre éditeur par défaut et vous permet de mettre à jour les valeurs base64 encodées du Secret dans le champ data, comme dans l'exemple suivant :

# Éditez l'objet ci-dessous. Les lignes commençant par '#' seront ignorées,
# et un fichier vide interrompra l'édition. Si une erreur se produit lors de l'enregistrement du fichier, il sera
# re ouvert en affichant les erreurs.
#
apiVersion: v1
data:
  password: UyFCXCpkJHpEc2I9
  username: YWRtaW4=
kind: Secret
metadata:
  creationTimestamp: "2022-06-28T17:44:13Z"
  name: db-user-pass
  namespace: default
  resourceVersion: "12708504"
  uid: 91becd59-78fa-4c85-823f-6d44436242ac
type: Opaque

Nettoyer

Pour supprimer un Secret, exécutez la commande suivante :

kubectl delete secret db-user-pass

A suivre

2 - Gestion des Secrets avec un fichier de configuration

Créer des Secrets en utilisant un fichier de configuration de ressources.

Pré-requis

Vous devez disposer d'un cluster Kubernetes et l'outil de ligne de commande kubectl doit être configuré pour communiquer avec votre cluster. Si vous ne possédez pas déjà de cluster, vous pouvez en créer un en utilisant Minikube, ou vous pouvez utiliser l'un de ces environnements Kubernetes:

Créer le Secret

Vous pouvez d'abord définir l'objet Secret dans un fichier, au format JSON ou YAML, puis créer cet objet. La ressource Secret contient deux clé : data et stringData. Le champ data est utilisé pour stocker des données encodées en base64. Le champ stringData est fourni par commodité et permet de fournir les mêmes données sous forme de texte non encodé. Les valeurs de data et stringData doivent être composées de caractères alphanumériques, -, _ ou ..

L'exemple suivant stocke deux chaînes de caractères dans un Secret en utilisant le champ data.

  1. Convertissez le texte en base64 :

    echo -n 'admin' | base64
    echo -n '1f2d1e2e67df' | base64
    

    Le résultat sera similaire à :

    YWRtaW4=
    MWYyZDFlMmU2N2Rm
    
  2. Créez le manifeste :

    apiVersion: v1
    kind: Secret
    metadata:
      name: mysecret
    type: Opaque
    data:
      username: YWRtaW4=
      password: MWYyZDFlMmU2N2Rm
    

    Notez que le nom d'un objet Secret doit être un nom de sous-domaine DNS valide.

  3. Créez le Secret en utilisant kubectl apply:

    kubectl apply -f ./secret.yaml
    

    Le résultat sera similaire à :

    secret/mysecret created
    

Pour vérifier que le Secret a été créé et pour décoder les données du Secret, référez-vous à la page sur la Gestion des secrets à l'aide de kubectl.

Spécifier des données non encodées lors de la création d'un Secret

Pour certains cas, vous pouvez utiliser le champ stringData à la place. Ce champ vous permet d'ajouter du texte non encodé directement dans le Secret, et il sera encodé pour vous lors de la création ou de la mise à jour du Secret.

Un exemple pratique de ce besoin pourrait être lorsque vous déployez une application qui utilise un Secret pour stocker un fichier de configuration, et que vous voulez configurer certaines parties de ce fichier de configuration pendant votre processus de déploiement.

Par exemple, si votre application utilise le fichier de configuration suivant :

apiUrl: "https://my.api.com/api/v1"
username: "<user>"
password: "<password>"

Vous pourriez le stocker dans un Secret en utilisant la définition suivante :

apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
stringData:
  config.yaml: |
    apiUrl: "https://my.api.com/api/v1"
    username: <user>
    password: <password>    

Lorsque vous récupérez les données du Secret, la commande retourne les valeurs encodées, et non les valeurs en texte brut que vous avez fournies dans stringData.

Par exemple, si vous exécutez la commande suivante :

kubectl get secret mysecret -o yaml

Le résultat sera similaire à :

apiVersion: v1
data:
  config.yaml: YXBpVXJsOiAiaHR0cHM6Ly9teS5hcGkuY29tL2FwaS92MSIKdXNlcm5hbWU6IHt7dXNlcm5hbWV9fQpwYXNzd29yZDoge3twYXNzd29yZH19
kind: Secret
metadata:
  creationTimestamp: 2018-11-15T20:40:59Z
  name: mysecret
  namespace: default
  resourceVersion: "7225"
  uid: c280ad2e-e916-11e8-98f2-025000000001
type: Opaque

Spécifier à la fois data et stringData

Si vous spécifiez un champ à la fois dans data et stringData, la valeur de stringData sera utilisée.

Par exemple, si vous définissez le Secret suivant :

apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  username: YWRtaW4=
stringData:
  username: administrator

L'objet Secret sera créé comme ceci :

apiVersion: v1
data:
  username: YWRtaW5pc3RyYXRvcg==
kind: Secret
metadata:
  creationTimestamp: 2018-11-15T20:46:46Z
  name: mysecret
  namespace: default
  resourceVersion: "7579"
  uid: 91460ecb-e917-11e8-98f2-025000000001
type: Opaque

YWRtaW5pc3RyYXRvcg== décodé devient administrator.

Modifier un Secret

Pour éditer les données du Secret que vous avez créé à l'aide d'un manifeste, modifiez le champ data ou stringData dans votre manifeste et appliquez le fichier à votre cluster. Vous pouvez éditer un objet Secret existant à moins qu'il ne soit immuable.

Par exemple, si vous souhaitez changer le mot de passe de l'exemple précédent pour birdsarentreal, procédez comme suit :

  1. Encodez le nouveau mot de passe:

    echo -n 'birdsarentreal' | base64
    

    Le résultat sera similaire à :

    YmlyZHNhcmVudHJlYWw=
    
  2. Mettre à jour le champ data avec votre nouvelle valeur :

    apiVersion: v1
    kind: Secret
    metadata:
      name: mysecret
    type: Opaque
    data:
      username: YWRtaW4=
      password: YmlyZHNhcmVudHJlYWw=
    
  3. Appliquer la configuration sur votre cluster :

    kubectl apply -f ./secret.yaml
    

    Le résultat sera similaire à :

    secret/mysecret configured
    

Kubernetes met à jour l'objet Secret existant. Pour être précis, l'outil kubectl remarque qu'il existe déja un Secret existant avec le même nom. kubectl récupère l'objet existant, planifie les modifications dessus et soumet le Secret modifié au plan de contrôle du cluster.

Si vous utilisez kubectl apply --server-side, kubectl utilisera plutôt le traitement coté serveur (Server Side Apply).

Nettoyage

Pour supprimer le Secret que vous venez de créer :

kubectl delete secret mysecret

A suivre

3 - Gestion des secrets avec Kustomize

Créer des Secrets à l'aide du fichier kustomization.yaml.

kubectl prend en charge l'utilisation de l'outil de gestion des objets Kustomize pour gérer les Secrets et ConfigMaps. Vous créez un générateur de ressources avec Kustomize, qui génère un Secret que vous pouvez appliquer au serveur API à l'aide de kubectl.

Pré-requis

Vous devez disposer d'un cluster Kubernetes et l'outil de ligne de commande kubectl doit être configuré pour communiquer avec votre cluster. Si vous ne possédez pas déjà de cluster, vous pouvez en créer un en utilisant Minikube, ou vous pouvez utiliser l'un de ces environnements Kubernetes:

Créer un Secret

Vous pouvez générer un Secret en définissant un secretGenerator dans un fichier kustomization.yaml qui référence d'autres fichiers existants, des fichiers .env, ou des valeurs littérales. Par exemple, les instructions suivantes créent un fichier Kustomization pour le nom d'utilisateur admin et le mot de passe 1f2d1e2e67df.

Créer le fichier Kustomization


secretGenerator:
- name: database-creds
  literals:
  - username=admin
  - password=1f2d1e2e67df

  1. Stockez les informations d'identification dans des fichiers. Les noms de fichiers sont les clés du secret :

    echo -n 'admin' > ./username.txt
    echo -n '1f2d1e2e67df' > ./password.txt
    

    L'argument -n garantit qu'il n'y a pas de saut de ligne supplémentaire à la fin de vos fichiers.

  2. Créez le fichier kustomization.yaml :

    secretGenerator:
    - name: database-creds
      files:
      - username.txt
      - password.txt
    

Vous pouvez également définir le générateur de secret dans le fichier kustomization.yaml en fournissant des fichiers .env. Par exemple, le fichier kustomization.yaml suivant récupère les données du fichier .env.secret :

secretGenerator:
- name: db-user-pass
  envs:
  - .env.secret

Dans tous les cas, vous n'avez pas besoin d'encoder les valeurs en base64. Le nom du fichier YAML doit être kustomization.yaml ou kustomization.yml.

Appliquer le fichier kustomization

Pour créer le Secret, appliquez le répertoire contenant le fichier kustomization :

kubectl apply -k <directory-path>

Le résutat est similaire à :

secret/database-creds-5hdh7hhgfk created

Lorsqu'un Secret est généré, le nom du Secret est créé en hashant les données du Secret et en ajoutant la valeur de hachage au nom. Cela garantit qu'un nouveau Secret sera généré à chaque fois que les données sont modifiées.

Pour vérifier que le Secret a été créé et décoder les données du Secret,

kubectl get -k <directory-path> -o jsonpath='{.data}' 

Le résutat est similaire à :

{ "password": "UyFCXCpkJHpEc2I9", "username": "YWRtaW4=" }
echo 'UyFCXCpkJHpEc2I9' | base64 --decode

Le résultat est similaire à :

S!B\*d$zDsb=

Pour en savor plus, consultez la gestion des secrets avec kubectl et la Gestion déclarative des objets Kubernetes avec Kustomize.

Modifier un Secret

  1. Dans votre fichier kustomization.yaml, modifiez les données, par exemple password.

  2. Appliquez le dossier contenant le fichier kustomization :

    kubectl apply -k <directory-path>
    

    Le résultat sera similaire à :

    secret/db-user-pass-6f24b56cc8 created
    

Le Secret modifié est créé en tant que nouvel objet Secret, au lieu de mettre à jour le Secret existant. Il sera peut-être nécessaire de mettre à jour les références au Secret dans vos Pods.

Nettoyage

Pour supprimer un Secret, utilisez kubectl :

kubectl delete secret db-user-pass

A suivre