Chiffrer les secrets au niveau de la couche d'application

Cette page explique comment chiffrer les objets Secret Kubernetes au niveau de la couche d'application, au moyen d'une clé que vous gérez via le service Cloud Key Management Service (Cloud KMS). Dans la mesure où cette fonctionnalité repose sur Cloud KMS, vous devez vous familiariser avec la rotation des clés et le chiffrement encapsulé.

Aperçu

Par défaut, GKE chiffre le contenu client stocké au repos, y compris les secrets. GKE traite et gère ce chiffrement par défaut sans requérir aucune action de votre part.

Le chiffrement des secrets au niveau de la couche d'application fournit une couche de sécurité supplémentaire pour les données sensibles stockées dans etcd, telles que les secrets. Cette fonctionnalité vous permet de chiffrer les données au niveau de la couche d'application au moyen d'une clé gérée avec Cloud KMS. Elle offre une protection contre les pirates informatiques qui réussiraient à accéder à une copie hors connexion d'etcd.

Pour utiliser le chiffrement des secrets au niveau de la couche d'application, vous devez d'abord créer une clé Cloud KMS et permettre au compte de service GKE d'y accéder. La clé doit se trouver au même emplacement que le cluster afin de réduire la latence et d'éviter que les ressources ne dépendent de services répartis sur plusieurs domaines de défaillance. Vous pouvez ensuite activer la fonctionnalité sur un cluster nouveau ou existant en spécifiant la clé que vous souhaitez utiliser.

Chiffrement encapsulé

Kubernetes propose le chiffrement encapsulé des secrets via un fournisseur KMS, ce qui signifie qu'ils sont chiffrés à l'aide d'une clé locale, couramment appelée clé de chiffrement de données (DEK, Data Encryption Key). Cette DEK est elle-même chiffrée au moyen d'une autre clé appelée clé de chiffrement de clé (KEK, Key Encryption Key), laquelle n'est pas stockée par Kubernetes.

Le chiffrement encapsulé offre deux grands avantages :

  • Il permet d'alterner les clés de chiffrement de clé sans rechiffrer l'ensemble des secrets. Vous pouvez ainsi observer facilement la pratique recommandée de rotation régulière des clés sans impact significatif sur les performances.

  • Les secrets qui sont stockés dans Kubernetes peuvent être basés sur une racine de confiance externe. Cela signifie que vous pouvez utiliser une racine de confiance centrale, telle qu'un module de sécurité matérielle, pour tous vos secrets, et qu'une personne mal intentionnée accédant à vos conteneurs hors ligne n'aura pas la possibilité de se procurer vos secrets.

Avec le chiffrement des secrets au niveau de la couche d'application, GKE vous permet de chiffrer vos secrets localement, via le fournisseur AES-CBC et en utilisant des clés de chiffrement de données (DEK) locales, elles-mêmes chiffrées au moyen d'une clé de chiffrement de clé que vous gérez dans Cloud KMS.

Pour en savoir plus sur le chiffrement encapsulé, consultez la page Chiffrement encapsulé.

Que se passe-t-il lorsque vous créez un secret ?

La création d'un secret met en œuvre le processus suivant :

  • Le serveur d'API Kubernetes génère une DEK unique pour le nouveau secret à l'aide d'un générateur de numéros aléatoires.

  • Le serveur d'API Kubernetes utilise cette DEK localement pour chiffrer le secret.

  • Le plug-in KMS envoie la DEK à Cloud KMS pour chiffrement. Le plug-in KMS s'authentifie auprès de Cloud KMS à l'aide du compte de service GKE de votre projet.

  • Cloud KMS chiffre la DEK et la renvoie au plug-in KMS.

  • Le serveur d'API Kubernetes enregistre le secret et la DEK chiffrés. Le texte brut de la DEK n'est pas enregistré sur le disque.

Lorsqu'un client demande un secret au serveur d'API Kubernetes, le processus décrit ci-dessus s'effectue en sens inverse.

Que se passe-t-il lorsque vous détruisez une clé ?

Lorsque vous détruisez une clé Cloud KMS employée pour chiffrer un secret dans GKE, ce secret n'est plus disponible. À moins que vous n'ayez recours à une projection de volume de jeton du compte de service, les comptes de service utilisés par GKE exploitent également des secrets, et si une clé est détruite, ces derniers deviennent indisponibles. Si vous ne pouvez pas accéder aux secrets, le démarrage du cluster échoue.

Avant de détruire une clé, il est recommandé de vérifier si elle est utilisée par votre cluster. Vous pouvez également créer une règle d'alerte pour la destruction de clés dans Cloud KMS.

Avant de commencer

  • Pour réaliser les exercices de ce thème, vous avez besoin de deux projets Google Cloud.

    • Projet de clé : c'est ici que vous allez créer une clé de chiffrement.

    • Projet de cluster : c'est ici que vous allez créer un cluster activant le chiffrement des secrets au niveau de la couche d'application.

  • Dans votre projet de clé, assurez-vous que vous avez activé l'API Cloud KMS.

    Activer l'API Cloud KMS

  • Dans votre projet de clé, l'utilisateur qui crée le trousseau de clés et la clé doit disposer des autorisations IAM suivantes :

    • cloudkms.keyRings.getIamPolicy
    • cloudkms.keyRings.setIamPolicy

    Ces autorisations (et bien d'autres encore) sont accordées au rôle Identity and Access Managementroles/cloudkms.admin prédéfini. Pour en savoir plus sur l'octroi d'autorisations pour gérer les clés, consultez la documentation Cloud KMS.

  • Dans votre projet de cluster, vérifiez que vous avez activé l'API Google Kubernetes Engine.

    Activer l'API Google Kubernetes Engine

  • Assurez-vous d'avoir installé le SDK Cloud.

  • Mettez à jour gcloud vers la dernière version :

    gcloud components update

Créer une clé Cloud KMS

Lorsque vous créez un trousseau de clés, spécifiez un emplacement correspondant à celui de votre cluster GKE :

  • Un cluster zonal doit utiliser un trousseau de clés provenant de l'emplacement correspondant au surensemble de sa zone. Par exemple, un cluster situé dans la zone us-central1-a ne peut utiliser qu'une clé de la région us-central1.

  • Un cluster régional doit utiliser un trousseau de clés localisé dans son emplacement. Par exemple, un cluster situé dans la région asia-northeast1 doit être protégé par un trousseau de clés provenant de la région asia-northeast1.

  • La région global de Cloud KMS n'est pas compatible avec GKE.

Vous pouvez utiliser Google Cloud Console ou la commande gcloud.

Console

Dans votre projet de clé, créez un trousseau de clés :

  1. Accédez à la page Clés de chiffrement dans Cloud Console.

    Accéder à la page Clés de chiffrement

  2. Cliquez sur Créer un trousseau.

  3. Dans le champ Key ring name (Nom du trousseau), saisissez le nom du trousseau de clés.

  4. Dans la liste déroulante Location (Emplacement), sélectionnez l'emplacement de votre cluster Kubernetes. La page Créer un trousseau devrait être semblable à celle-ci :

    Écran de création de trousseaux dans l'interface utilisateur Web Google Cloud

  5. Cliquez sur Create (Créer).

Ensuite, créez une clé :

  1. Accédez à la page Clés de chiffrement dans Cloud Console.

    Accéder à la page Clés de chiffrement

  2. Cliquez sur le nom du trousseau de clés pour lequel vous souhaitez créer une clé.

  3. Cliquez sur Créer une clé.

  4. Dans le champ Nom de la clé, saisissez le nom de votre clé.

  5. Acceptez les valeurs par défaut pour Rotation period (Période de rotation) et Starting on (Rotation à partir du), ou définissez une période de rotation des clés et une date de début si vous souhaitez utiliser des valeurs différentes.

  6. [Facultatif] Dans le champ Labels (Étiquettes), cliquez sur Add label (Ajouter une étiquette) si vous souhaitez ajouter des étiquettes à la clé.

    La page Créer une clé devrait être semblable à celle-ci :

    Écran de création de clés dans l'interface utilisateur Web de Google Cloud

  7. Cliquez sur Créer.

gcloud

Dans votre projet de clé, créez un trousseau de clés :

gcloud kms keyrings create ring-name \
    --location location \
    --project key-project-id

où :

  • ring-name correspond au nom que vous avez choisi pour votre trousseau de clés ;
  • location est la région dans laquelle vous souhaitez créer le trousseau de clés ;
  • key-project-id est l'identifiant de votre projet de clé.

Créez une clé :

gcloud kms keys create key-name \
    --location location \
    --keyring ring-name \
    --purpose encryption \
    --project key-project-id

où :

  • key-name correspond au nom que vous avez choisi pour votre clé ;
  • location est la région dans laquelle vous avez créé votre trousseau de clés ;
  • ring-name est le nom de votre trousseau de clés ;
  • key-project-id est l'identifiant de votre projet de clé.

Accorder l'autorisation d'utiliser la clé

Le compte de service GKE de votre projet de cluster porte le nom suivant :

service-cluster-project-number@container-engine-robot.iam.gserviceaccount.com

cluster-project-number est le numéro de votre projet de cluster.

Pour accorder l'accès au compte de service, vous pouvez utiliser Google Cloud Console ou la commande gcloud.

Console

Attribuez à votre compte de service GKE le rôle de chiffreur/déchiffreur de clés cryptographiques Cloud KMS :

  1. Ouvrez le navigateur Clés Cloud Key Management Service dans Google Cloud Console.
    Ouvrir le navigateur de clés Cloud KMS
  2. Cliquez sur le nom du trousseau contenant la clé souhaitée.

  3. Cochez la case correspondant à la clé souhaitée.

    L'onglet Autorisations s'affiche dans le volet de droite.

  4. Dans la boîte de dialogue Ajouter des membres, indiquez l'adresse e-mail du compte de service GKE auquel vous accordez l'accès.

  5. Dans le menu déroulant Sélectionner un rôle, sélectionnez Chiffreur/Déchiffreur de clés cryptographiques Cloud KMS.

  6. Cliquez sur Enregistrer.

gcloud

Attribuez à votre compte de service GKE le rôle de chiffreur/déchiffreur de clés cryptographiques Cloud KMS :

gcloud kms keys add-iam-policy-binding key-name \
  --location location \
  --keyring ring-name \
  --member serviceAccount:service-account-name \
  --role roles/cloudkms.cryptoKeyEncrypterDecrypter \
  --project key-project-id

où :

  • key-name est le nom de votre clé ;
  • location est la région dans laquelle vous avez créé votre trousseau de clés ;
  • ring-name est le nom de votre trousseau de clés ;
  • service-account-name est le nom de votre compte de service GKE ;
  • key-project-id est l'identifiant de votre projet de clé.

Activer le chiffrement des secrets au niveau de la couche d'application

Sur un nouveau cluster

Vous pouvez créer un cluster à l'aide de Google Cloud Console ou de l'outil gcloud.

console

  1. Accédez au menu "Google Kubernetes Engine" dans Cloud Console.

    Accéder au menu "Google Kubernetes Engine"

  2. Cliquez sur le bouton Créer un cluster.

  3. Configurez votre cluster et vos pools de nœuds selon vos besoins.

  4. Dans le volet de navigation, cliquez sur Sécurité sous Cluster.

  5. Sélectionnez Activer le chiffrement des secrets au niveau de la couche d'application, puis choisissez la clé de chiffrement de base de données que vous avez créée à la section Créer une clé Cloud KMS.

  6. Continuez à configurer votre cluster.

  7. Cliquez sur Créer.

gcloud

Pour créer un cluster compatible avec le chiffrement des secrets au niveau de la couche d'application, spécifiez une valeur pour le paramètre --database-encryption-key dans votre commande de création.

gcloud container clusters create cluster-name \
  --cluster-version=latest \
  --zone zone \
  --database-encryption-key projects/key-project-id/locations/location/keyRings/ring-name/cryptoKeys/key-name \
  --project cluster-project-id

où :

  • cluster-name est le nom que vous avez choisi pour le cluster ;
  • zone est la zone dans laquelle vous souhaitez créer le cluster.
  • key-project-id est l'identifiant de votre projet de clé ;
  • location est l'emplacement de votre trousseau de clés ;
  • ring-name est le nom de votre trousseau de clés ;
  • key-name est le nom de votre clé ;
  • cluster-project-id est l'identifiant de votre projet de cluster.

Sur un cluster existant

Vous pouvez mettre à jour un cluster existant de sorte qu'il utilise le chiffrement des secrets au niveau de la couche d'application, à condition que l'une des affirmations suivantes soit vraie :

  • La version du cluster est supérieure ou égale à v1.11.9 et inférieure à v1.12.0.
  • La version du cluster est supérieure ou égale à v1.12.7.

Vous pouvez utiliser Google Cloud Console ou la commande gcloud.

Console

Pour mettre à jour un cluster de sorte qu'il soit compatible avec le chiffrement des secrets au niveau de la couche d'application :

  1. Accédez au menu Google Kubernetes Engine dans Cloud Console.

    Accéder au menu Google Kubernetes Engine

  2. Cliquez sur l'icône Modifier correspondant au cluster que vous souhaitez modifier. Il est en forme de crayon.

  3. Activez Chiffrement des secrets au niveau de la couche d'application, puis choisissez la clé de chiffrement de base de données que vous avez créée à la section Créer une clé Cloud KMS.

  4. Cliquez sur Enregistrer.

gcloud

Pour activer le chiffrement des secrets au niveau de la couche d'application sur un cluster existant, exécutez la commande suivante :

gcloud container clusters update cluster-name \
  --zone zone \
  --database-encryption-key projects/key-project-id/locations/location/keyRings/ring-name/cryptoKeys/key-name \
  --project cluster-project-id

où :

  • cluster-name est le nom que vous avez choisi pour le cluster ;
  • zone est la zone dans laquelle vous souhaitez créer le cluster.
  • key-project-id est l'identifiant de votre projet de clé ;
  • location est l'emplacement de votre trousseau de clés ;
  • ring-name est le nom de votre trousseau de clés ;
  • key-name est le nom de votre clé ;
  • cluster-project-id est l'identifiant de votre projet de cluster.

Mettre à jour une clé Cloud KMS

Console

Pour mettre à jour un cluster de sorte qu'il utilise une nouvelle clé Cloud KMS, procédez comme suit :

  1. Accédez au menu Google Kubernetes Engine dans Cloud Console.

    Accéder au menu Google Kubernetes Engine

  2. Cliquez sur l'icône Modifier correspondant au cluster que vous souhaitez modifier. Il est en forme de crayon.

  3. Sous Chiffrement des secrets au niveau de la couche d'application, sélectionnez la nouvelle clé de chiffrement que vous souhaitez utiliser.

  4. Cliquez sur Enregistrer.

gcloud

Mettez à jour votre cluster existant de sorte qu'il utilise une nouvelle clé Cloud KMS :

gcloud container clusters update cluster-name \
  --zone zone \
  --database-encryption-key projects/key-project-id/locations/location/keyRings/ring-name/cryptoKeys/key-name \
  --project cluster-project-id

où :

  • cluster-name est le nom que vous avez choisi pour le cluster ;
  • zone est la zone dans laquelle vous souhaitez créer le cluster.
  • key-project-id est l'identifiant de votre projet de clé ;
  • location est l'emplacement de votre trousseau de clés ;
  • ring-name est le nom de votre trousseau de clés ;
  • key-name est le nom de votre clé ;
  • cluster-project-id est l'identifiant de votre projet de cluster.

Désactiver le chiffrement des secrets au niveau de la couche d'application

Vous pouvez utiliser Google Cloud Console ou la commande gcloud.

Console

  1. Accédez au menu Google Kubernetes Engine dans Cloud Console.

    Accéder au menu Google Kubernetes Engine

  2. Cliquez sur l'icône Modifier correspondant au cluster que vous souhaitez modifier. Il est en forme de crayon.

  3. Désactivez Chiffrement des secrets au niveau de la couche d'application.

  4. Cliquez sur Enregistrer.

gcloud

Pour désactiver le chiffrement des secrets au niveau de la couche d'application, exécutez la commande suivante :

gcloud container clusters update cluster-name \
  --zone zone \
  --disable-database-encryption \
  --project cluster-project-id

où :

  • cluster-name est le nom que vous avez choisi pour le cluster ;
  • zone est la zone dans laquelle vous souhaitez créer le cluster ;
  • cluster-project-id est l'identifiant de votre projet de cluster.

Confirmer l'activation du chiffrement des secrets au niveau de la couche d'application

Vous pouvez vérifier si un cluster utilise le chiffrement des secrets au niveau de la couche d'application à l'aide de Google Cloud Console ou de la commande gcloud.

Console

  1. Accédez au menu Google Kubernetes Engine dans Cloud Console.

    Accéder au menu Google Kubernetes Engine

  2. Cliquez sur le nom du cluster que vous souhaitez modifier. La page Détails du cluster s'ouvre.

  3. Vérifiez que l'option Chiffrement des secrets au niveau de la couche d'application est activée, et que la clé correcte est répertoriée.

gcloud

Pour vérifier si un cluster utilise le chiffrement des secrets au niveau de la couche d'application :

gcloud container clusters describe cluster-name \
  --zone compute-zone \
  --format 'value(databaseEncryption)' \
  --project cluster-project-id

où :

  • cluster-name est le nom d'un cluster existant ;
  • compute-zone est le nom de la zone du cluster ;
  • cluster-project-id est l'identifiant de votre projet de cluster.

Si le cluster utilise le chiffrement des secrets au niveau de la couche d'application, la réponse contient EncryptionConfig :

keyName=projects/project/locations/location/keyRings/ring-name/cryptoKeys/key-name;state=ENCRYPTED

Limites

Emplacement de la clé

Vous devez sélectionner une clé localisée dans la même région que le cluster dans lequel elle est utilisée. Par exemple, un cluster zonal situé dans us-central1-a ne peut utiliser qu'une clé située dans la région us-central1. Pour les clusters régionaux, les clés doivent se trouver au même emplacement afin de réduire la latence et d'éviter que les ressources ne dépendent de services répartis sur plusieurs domaines de défaillance.

Rotation des clés

Lorsque vous effectuez une rotation des clés, vos secrets existants restent chiffrés avec la KEK précédente. Pour faire en sorte qu'une nouvelle KEK encapsule un secret, vous devez créer un nouveau secret après la rotation des clés.

Par exemple, créez un secret nommé Secret1 et stockez-le. Il est chiffré avec DEK1, elle-même encapsulée avec KEKv1. Avant de procéder à la rotation de KEKv1, créez un autre secret nommé Secret2. Secret2 obtient sa propre clé, DEK2. KEKv1 est utilisée à nouveau pour chiffrer la DEK.

Après la rotation de la KEK, nous créons un autre secret, Secret3, qui est chiffré avec DEK3. DEK3 est chiffrée à son tour avec KEKv2, la KEK qui a fait l'objet d'une rotation.

Pour découvrir comment effectuer une rotation manuelle des KEK qui chiffrent vos secrets, consultez la section Rechiffrer les secrets.

Rechiffrer les secrets

Pour le moment, il n'existe aucun moyen de forcer le rechiffrement automatique de vos secrets. Si vous le souhaitez, vous pouvez effectuer une rotation manuelle de votre KEK en créant une nouvelle version de cette clé :

gcloud kms keys versions create --location location \
   --keyring ring-name \
   --key key-name \
   --primary \
   --project key-project-id

Ensuite, forcez GKE à rechiffrer en appuyant sur chaque secret :

kubectl get secrets --all-namespaces -o json | kubectl annotate --overwrite -f - encryption-key-rotation-time="time"

Remplacez time par une chaîne indiquant à quel moment la rotation se produit (par exemple, 20200909-090909).

EncryptionConfig

À l'heure actuelle, seules les clés provenant de Cloud KMS sont compatibles avec GKE. Vous ne pouvez pas utiliser d'autre fournisseur KMS Kubernetes ni d'autre fournisseur de chiffrement.

Étapes suivantes