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é.

Présentation

Par défaut, Google Kubernetes Engine (GKE) chiffre les contenus client stockés 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. Ce chiffrement 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), La clé KEK n'est pas stockée par Kubernetes.

Le chiffrement encapsulé offre deux grands avantages :

  • La KEK peut être alternée sans nécessiter le rechiffrement de tous les 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 KEK 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 :

  1. 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.

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

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

  4. Cloud KMS chiffre la DEK à l'aide de la KEK et la renvoie au plug-in KMS.

  5. 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.

  6. Le serveur d'API Kubernetes crée une entrée de cache mappant la DEK chiffrée avec la DEK en texte brut. Cela lui permet de déchiffrer le secret sans utiliser Cloud KMS.

Lorsqu'un client demande un secret au serveur d'API Kubernetes, voici ce qui se passe :

  1. Le serveur d'API Kubernetes récupère le secret et la DEK chiffrés.

  2. Le serveur d'API Kubernetes vérifie le cache d'une entrée de mappage existante et déchiffre le secret sans utiliser Cloud KMS.

  3. Si une entrée de cache est introuvable, le plug-in KMS envoie la DEK à Cloud KMS pour déchiffrement à l'aide de la KEK. La DEK déchiffrée est ensuite utilisée pour déchiffrer le secret.

  4. Le serveur d'API Kubernetes renvoie le secret déchiffré au client.

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

Lorsque vous détruisez une KEK dans Cloud KMS utilisée pour chiffrer un secret dans GKE, celui-ci n'est plus disponible, sauf si vous mettez à jour le cluster pour utiliser une nouvelle KEK au préalable.

Si vous envisagez de détruire une ancienne version de KEK après une rotation des clés, utilisez d'abord la nouvelle version de KEK pour rechiffrer le secret.

À moins que vous n'ayez recours à une projection de volume de jeton du compte de service, les comptes de service utilisés par vos charges de travail sur 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, les charges de travail échoueront.

Les exceptions suivantes s'appliquent :

  • Les pods avec un accès existant aux secrets en tant que volumes installés ou variables d'environnement conservent l'accès.

  • Le serveur d'API Kubernetes peut toujours utiliser les entrées de mappage DEK mises en cache pour déchiffrer un secret après la destruction de la KEK. Cela permet aux pods redémarrés ou reprogrammés d'accéder au secret, sauf dans les cas suivants :

    • Le plan de contrôle du cluster est redémarré.
    • Le pod du serveur d'API Kubernetes est redémarré.
    • L'entrée de mappage DEK pour le secret ne se trouve pas dans le cache du serveur d'API Kubernetes.

Avant de détruire une KEK, vérifiez 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 KEK.

    • 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 l'outil gcloud ou Google Cloud Console.

Console

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

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

    Accéder à la page Clés cryptographiques

  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.

  5. Cliquez sur Create (Créer).

Ensuite, créez une clé :

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

    Accéder à la page Clés cryptographiques

  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 Key name (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é.

  7. Cliquez sur Create (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

Remplacez l'élément suivant :

  • RING_NAME : nom que vous avez choisi pour votre trousseau de clés.
  • LOCATION : emplacement dans lequel vous souhaitez créer le trousseau de clés
  • KEY_PROJECT_ID : 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

Remplacez l'élément suivant :

  • KEY_NAME : nom de votre clé.
  • LOCATION : emplacement Cloud KMS dans lequel vous avez créé votre trousseau de clés
  • RING_NAME : nom de votre trousseau de clés
  • KEY_PROJECT_ID : 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

Remplacez CLUSTER_PROJECT_NUMBER par le numéro de projet de votre cluster. Pour trouver votre numéro de projet à l'aide de l'outil gcloud, exécutez la commande suivante :

gcloud projects describe CLUSTER_PROJECT_ID \
    --format="value(projectNumber)"

Pour accorder l'accès au compte de service, vous pouvez utiliser Google Cloud Console ou l'outil 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

Remplacez l'élément suivant :

  • KEY_NAME : nom de votre clé
  • LOCATION : emplacement Cloud KMS dans lequel vous avez créé votre trousseau de clés.
  • RING_NAME : nom de votre trousseau de clés
  • SERVICE_ACCOUNT_NAME : nom de votre compte de service GKE
  • KEY_PROJECT_ID : 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 à la page Google Kubernetes Engine dans Cloud Console.

    Accéder à Google Kubernetes Engine

  2. Cliquez sur Créer.

  3. Configurez le cluster 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. Cliquez sur Create (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

Remplacez l'élément suivant :

  • CLUSTER_NAME correspond au nom que vous avez choisi pour votre cluster.
  • ZONE : zone de calcul dans laquelle vous souhaitez créer le cluster
  • KEY_PROJECT_ID : identifiant de votre projet de clé
  • LOCATION : emplacement Cloud KMS dans lequel vous avez créé votre trousseau de clés.
  • RING_NAME : nom de votre trousseau de clés
  • KEY_NAME : nom de votre clé
  • CLUSTER_PROJECT_ID : ID de votre projet de votre cluster

Sur un cluster existant

Vous pouvez utiliser l'outil gcloud ou Google Cloud Console pour mettre à jour un cluster existant afin d'utiliser le chiffrement des secrets au niveau de la couche d'application.

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 à la page Google Kubernetes Engine dans Cloud Console.

    Accéder à Google Kubernetes Engine

  2. Cliquez sur le nom du cluster que vous souhaitez modifier.

  3. Sous Sécurité, dans le champ Chiffrement des secrets au niveau de la couche d'application, cliquez sur Modifier le chiffrement des secrets au niveau de la couche d'application.

  4. Sélectionnez la case à cocher 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.

  5. Cliquez sur Save Changes (Enregistrer les modifications).

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

Remplacez l'élément suivant :

  • CLUSTER_NAME : nom du cluster
  • ZONE : zone de calcul du cluster
  • KEY_PROJECT_ID : identifiant de votre projet de clé
  • LOCATION : emplacement Cloud KMS dans lequel vous avez créé votre trousseau de clés.
  • RING_NAME : nom de votre trousseau de clés
  • KEY_NAME : nom de votre clé
  • CLUSTER_PROJECT_ID : ID de votre projet de votre 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 à la page Google Kubernetes Engine dans Cloud Console.

    Accéder à Google Kubernetes Engine

  2. Cliquez sur le nom du cluster que vous souhaitez modifier.

  3. Sous Sécurité, dans le champ Chiffrement des secrets au niveau de la couche d'application, cliquez sur Modifier le chiffrement des secrets au niveau de la couche d'application.

  4. Sélectionnez la nouvelle clé de chiffrement que vous souhaitez utiliser.

  5. Cliquez sur Save Changes (Enregistrer les modifications).

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

Remplacez l'élément suivant :

  • CLUSTER_NAME : nom du cluster
  • ZONE : zone de calcul du cluster
  • KEY_PROJECT_ID : identifiant de votre projet de clé
  • LOCATION : emplacement Cloud KMS dans lequel vous avez créé votre trousseau de clés.
  • RING_NAME : nom de votre trousseau de clés
  • KEY_NAME : nom de votre clé
  • CLUSTER_PROJECT_ID : ID de votre projet de votre cluster

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

Vous pouvez utiliser l'outil gcloud ou Google Cloud Console.

Console

  1. Accédez à la page Google Kubernetes Engine dans Cloud Console.

    Accéder à Google Kubernetes Engine

  2. Cliquez sur le nom du cluster que vous souhaitez modifier.

  3. Sous Sécurité, dans le champ Chiffrement des secrets au niveau de la couche d'application, cliquez sur Modifier le chiffrement des secrets au niveau de la couche d'application.

  4. Décochez la case Activer le chiffrement des secrets au niveau de la couche d'application.

  5. Cliquez sur Save Changes (Enregistrer les modifications).

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

Remplacez l'élément suivant :

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 à la page Google Kubernetes Engine dans Cloud Console.

    Accéder à Google Kubernetes Engine

  2. Cliquez sur le nom du cluster que vous souhaitez modifier.

  3. Sous Sécurité, vérifiez que le champ Chiffrement des secrets au niveau de la couche d'application affiche Enabled et répertorie la clé correcte.

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 ZONE \
  --format 'value(databaseEncryption)' \
  --project CLUSTER_PROJECT_ID

Remplacez l'élément suivant :

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

Nombre de secrets

GKE accepte jusqu'à 10 000 secrets par cluster pour le chiffrement des secrets au niveau de la couche d'application. Si vous stockez plus de 10 000 secrets, votre cluster peut devenir instable au moment de la mise à niveau, ce qui risque d'entraîner une interruption de vos charges de travail.

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 version précédente de la clé de chiffrement de clé (KEK). Pour vous assurer qu'une version plus récente de KEK encapsule un secret, rechiffrez le 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.

Après la rotation de la KEK, vous rechiffrez Secret1 afin qu'elle soit encapsulée par DEK2, qui à son tour est encapsulée avec KEKv2, la KEK qui a fait l'objet d'une rotation.

Rechiffrer les secrets

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

Remplacez l'élément suivant :

  • LOCATION : emplacement Cloud KMS dans lequel vous avez créé votre trousseau de clés.
  • RING_NAME : nom de votre trousseau de clés
  • KEY_NAME : nom de votre clé
  • KEY_PROJECT_ID : identifiant de votre projet de clé

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.

Dépannage

La clé Cloud KMS est désactivée

Le compte de service par défaut de GKE ne peut pas utiliser une clé Cloud KMS désactivée pour le chiffrement des secrets au niveau de l'application.

Pour réactiver une clé, consultez la page Activer une version de clé désactivée.

Étape suivante