Secrets

Cette page décrit l'objet secret dans Kubernetes et son utilisation dans Google Kubernetes Engine (GKE).

Qu'est-ce qu'un secret ?

Les codes secrets sont des objets sécurisés qui stockent des données sensibles, telles que les mots de passe, les jetons OAuth et les clés SSH, dans vos clusters. Le stockage des données sensibles dans des secrets est plus sécurisé que le stockage sous format texte brut dans ConfigMaps ou dans les spécifications d'un pod. L'utilisation de codes secrets vous permet de contrôler l'utilisation des données sensibles et réduit le risque d'exposition des données à des utilisateurs non autorisés.

Vous pouvez aussi chiffrer les codes secrets au niveau de la couche d’application à l’aide d’une clé que vous gérez dans Cloud KMS. Pour en savoir plus, consultez la section Chiffrement des codes secrets au niveau de la couche d'application.

Créer un secret

Vous pouvez créer un secret à l'aide de la commande kubectl create secret :

kubectl create secret type name data

où :

  • type peut être :

    • generic : crée un secret à partir d'un fichier local, d'un répertoire ou d'une valeur littérale.
    • docker-registry : crée un secret dockercfg à utiliser avec un registre Docker. Permet de s'authentifier auprès des registres Docker.
    • tls : crée un secret TLS à partir d'une paire de clés publique/privée donnée. Cette paire de clés doit exister au préalable. Le certificat de clé publique doit être encodé au format .PEM et doit correspondre à la clé privée donnée.

    Pour la plupart des secrets, utilisez le type generic.

  • name est le nom du secret que vous créez.

  • data peut être :

    • un chemin d'accès à un répertoire contenant un ou plusieurs fichiers de configuration, désigné à l'aide des options --from-file ou --from-env-file ;
    • des paires clé/valeur, chacune spécifiée à l'aide d'options --from-literal.

Pour en savoir plus sur kubectl create, reportez-vous à la documentation de référence.

Vous pouvez également créer un secret en définissant un objet Secret dans un fichier manifeste YAML et en le déployant à l'aide de la commande suivante :

kubectl create -f file-name.yaml

Pour obtenir un exemple, consultez la page Distribuer les identifiants de façon sécurisée à l'aide de secrets.

À partir de fichiers

Pour créer un secret à partir d'un ou de plusieurs fichiers, utilisez --from-file ou --from-env-file. Le fichier doit être en texte brut, mais son extension n'a pas d'importance.

--from-file

Lorsque vous créez le secret à l'aide de --from-file, sa valeur correspond à tout le contenu du fichier. Si la valeur du secret contient plusieurs paires clé/valeur, utilisez plutôt --from-env-file.

Vous pouvez transmettre un ou plusieurs fichiers comme suit :

kubectl create secret type name --from-file /path/to/file --from-file /path/to/file2

Vous pouvez également transmettre un répertoire contenant plusieurs fichiers :

kubectl create secret type name --from-file /path/to/directory

Par exemple, la commande suivante crée un secret nommé credentials à partir de deux fichiers, username.txt et password.txt, et définit les clés respectivement sur username.txt et password.txt :

kubectl create secret generic credentials --from-file ./username.txt --from-file ./password.txt

Dans Kubernetes, les valeurs du secret sont encodées en base64.

L'exécution de kubectl get secret credentials -o yaml renvoie le résultat suivant :

apiVersion: v1
data:
  password.txt: MTIzNAo=
  username.txt: YWRtaW4K
kind: Secret
metadata:
  creationTimestamp: ...
  name: credentials
  namespace: default
  resourceVersion: "2011810"
  selfLink: /api/v1/namespaces/default/secrets/credentials
  uid: ...
type: Opaque

Par défaut, la clé est le nom du fichier. Vous pouvez remplacer la clé en utilisant la syntaxe étendue pour --from-file :

kubectl create secret type name --from-file=key=/path/to/directory

L'exemple suivant crée un secret nommé "credentials" à partir de deux fichiers, username.txt et password.txt, et définit les clés sur username et password, plutôt que d'utiliser les noms de fichier :

kubectl create secret generic credentials --from-file=username=./username.txt --from-file=password=./password.txt

--from-env-file

Pour charger plusieurs paires clé/valeur dans un seul secret, stockez-les dans un ou plusieurs fichiers en texte brut et chargez-les à l'aide de --from-env-file au lieu de --from-file. Vous pouvez charger plusieurs fichiers en spécifiant l'indicateur plusieurs fois. Les mêmes limites que pour --from-file s'appliquent.

Par exemple, la commande suivante crée un secret nommé credentials à partir d'un seul fichier, credentials.txt, qui contient plusieurs paires clé/valeur :

# Each of these key-value pairs is loaded into the Secret
username=jane
password=d7xnNss7EGCFZusG

Dans Kubernetes, les valeurs du secret sont encodées en base64.

kubectl create secret generic credentials --from-env-file ./credentials.txt

L'exécution de kubectl get secret credentials -o yaml renvoie le résultat suivant :

apiVersion: v1
data:
  password: ZDd4bk5zczdFR0NGWnVzRw==
  username: amFuZQ==
kind: Secret
metadata:
  creationTimestamp: 2019-06-04T15:39:27Z
  name: credentials
  namespace: default
  resourceVersion: "14507319"
  selfLink: /api/v1/namespaces/default/secrets/credentials
  uid: efce376b-86de-11e9-9742-42010a80022f
type: Opaque

Limites

Les fichiers non standards, tels que les liens symboliques, les appareils et les tubes, sont ignorés par kubectl. C'est également le cas des sous-répertoires ; kubectl create secret ne les inclut pas.

À partir de valeurs littérales

Pour créer un secret à partir de valeurs littérales, utilisez --from-literal.

Par exemple, la commande suivante crée un secret générique nommé literal-token qui contient deux paires clé/valeur :

kubectl create secret generic literal-token --from-literal user=admin --from-literal password=1234

Spécifiez --from-literal pour chaque paire clé/valeur. Les valeurs sont automatiquement encodées en base64.

L'exécution de kubectl get secret literal-token -o yaml renvoie le résultat suivant :

apiVersion: v1
data:
  password: MTIzNA==
  user: YWRtaW4=
kind: Secret
metadata:
  creationTimestamp: ...
  name: literal-token
  namespace: default
  resourceVersion: "2012831"
  selfLink: /api/v1/namespaces/default/secrets/literal-token
  uid: ...
type: Opaque

Dans le résultat précédent, observez que password et user sont encodés en base64. L'encodage base64 rend les informations assimilables par les applications et les services qui ne peuvent pas gérer certains caractères. L'encodage base64 n'est pas sécurisé.

Utiliser un code secret

Pour utiliser un code secret avec vos charges de travail, vous pouvez spécifier des variables d'environnement qui font référence aux valeurs du code secret ou installer un volume contenant le code secret.

Pour en savoir plus à ce sujet, consultez la page sur l'utilisation des codes secrets.

Étape suivante