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 secretdockercfg
à 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
.
- un chemin d'accès à un répertoire contenant un ou plusieurs fichiers de configuration, désigné à l'aide des options
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.