Utiliser des clés de chiffrement gérées par le client (CMEK)


Cette page explique comment utiliser les clés de chiffrement gérées par le client (CMEK, Customer-Managed Encryption Keys) sur Google Kubernetes Engine (GKE). Si vous avez besoin de contrôler la gestion de vos clés, vous pouvez utiliser Cloud Key Management Service et la fonctionnalité CMEK pour protéger les disques persistants et les disques de démarrage personnalisés associés à votre cluster GKE.

Présentation

Par défaut, Google Cloud chiffre les contenus client au repos et GKE gère ce chiffrement sans aucune intervention de votre part.

Si vous souhaitez contrôler et gérer vous-même la rotation des clés de chiffrement, vous pouvez utiliser des clés CMEK. Elles s'appliquent aux clés de chiffrement de données qui, elles, chiffrent vos données. Pour en savoir plus, consultez la section Gestion des clés.

Vous pouvez également chiffrer les secrets de votre cluster à l'aide des clés que vous gérez. Pour en savoir plus, consultez la page Chiffrement des secrets au niveau de la couche d'application.

Dans GKE, les clés de chiffrement gérées par le client peuvent protéger les données de deux types de disques de stockage : les disques de démarrage des nœuds et les disques associés.

Disques de démarrage des nœuds
Les disques de démarrage des nœuds font partie des pools de nœuds de votre cluster. Vous pouvez créer un disque de démarrage des nœuds chiffré par CMEK lors de la création des clusters et des pools de nœuds.
Disques associés
Les disques associés sont des ressources PersistentVolume dont les pods se servent pour un stockage durable. Les disques persistants chiffrés par CMEK sont disponibles dans GKE en tant qu'objets PersistentVolume à provisionnement dynamique.

Pour en savoir plus sur les disques de stockage, consultez la page Options de stockage. Les disques de plans de contrôle utilisés par les plans de contrôle GKE ne peuvent pas être protégés par les CMEK.

Avant de commencer

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

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

    Activer l'API Cloud KMS

  3. 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 sont accordées au rôle Identity and Access Management roles/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.

  4. Dans votre projet de cluster, vérifiez que vous avez activé l'API Cloud KMS.

    Activer l'API Cloud KMS

  5. Assurez-vous d'avoir installé gcloud CLI.

  6. Mettez à jour gcloud vers la dernière version :

    gcloud components update
    

Créer une clé Cloud KMS

Pour pouvoir protéger un disque de démarrage des nœuds ou un disque associé à l'aide d'une clé CMEK, vous avez besoin d'un trousseau de clés et d'une clé Cloud KMS.

Le trousseau de clés et la clé s'accompagnent des exigences suivantes :

  • La clé doit utiliser le chiffrement symétrique.

  • Vous devez accorder les autorisations de compte de service GKE pour utiliser la clé.

  • L'emplacement du trousseau de clés doit correspondre à 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.

Pour savoir comment créer un trousseau de clés et une clé, consultez la page Créer des clés symétriques.

Accorder l'autorisation d'utiliser la clé

Vous devez attribuer le rôle Chiffreur/Déchiffreur de CryptoKey Cloud KMS au compte de service Compute Engine utilisé par les nœuds de votre cluster. Cette opération est nécessaire pour que les disques persistants GKE puissent accéder à votre clé de chiffrement et l'utiliser.

Le nom du compte de service Compute Engine a le format suivant :

service-PROJECT_NUMBER@compute-system.iam.gserviceaccount.com

Remplacez PROJECT_NUMBER par le numéro de projet de votre cluster.

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

gcloud

Attribuez le rôle Chiffreur/Déchiffreur de CryptoKey Cloud KMS à votre compte de service Compute Engine :

gcloud kms keys add-iam-policy-binding KEY_NAME \
    --location LOCATION \
    --keyring RING_NAME \
    --member serviceAccount:SERVICE_ACCOUNT \
    --role roles/cloudkms.cryptoKeyEncrypterDecrypter \
    --project KEY_PROJECT_ID

Remplacez les éléments suivants :

  • KEY_NAME : nom de votre clé
  • LOCATION : région dans laquelle vous avez créé votre trousseau de clés.
  • RING_NAME : nom de votre trousseau de clés
  • SERVICE_ACCOUNT : nom de votre compte de service Compute Engine.
  • KEY_PROJECT_ID : identifiant de votre projet de clé

Console

Attribuez le rôle Chiffreur/Déchiffreur de CryptoKey Cloud KMS à votre compte de service Compute Engine :

  1. Ouvrez le navigateur Clés Cloud Key Management Service dans la console Google Cloud.
    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 Compute Engine 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.

Utiliser des disques de démarrage des nœuds protégés par CMEK

Dans cette section, vous allez créer un cluster ou un pool de nœuds avec un disque de démarrage protégé par CMEK.

Vous ne pouvez pas activer le chiffrement géré par le client pour les disques de démarrage des nœuds d'un cluster existant, car vous ne pouvez pas modifier le type de disque de démarrage d'un cluster ou d'un pool de nœuds existant. Vous pouvez néanmoins créer un pool de nœuds avec le chiffrement géré par le client dans votre cluster et supprimer le pool de nœuds précédent.

Vous ne pouvez pas non plus désactiver le chiffrement géré par le client pour les disques de démarrage des nœuds d'un cluster ou d'un pool de nœuds existant. Vous pouvez néanmoins créer un pool de nœuds sans chiffrement géré par le client dans votre cluster et supprimer le pool de nœuds précédent.

Créer un cluster avec un disque de démarrage des nœuds protégé par CMEK

Vous pouvez créer un cluster avec un disque de démarrage des nœuds protégé par CMEK à l'aide de la commande gcloud CLI ou de Google Cloud Console.

Pour les clusters standards, seul un disque persistant standard (pd-standard) ou un disque persistant SSD (pd-ssd) peut être chiffré avec une clé CMEK.

gcloud

Pour créer un cluster dont le disque de démarrage est chiffré avec une clé CMEK, spécifiez une valeur pour le paramètre --boot-disk-kms-key dans votre commande de création de cluster.

Créer un cluster standard

Pour créer un cluster standard dont le disque de démarrage est chiffré avec une clé CMEK, exécutez la commande suivante :

gcloud container clusters create CLUSTER_NAME \
    --cluster-version=latest \
    --region COMPUTE_REGION \
    --boot-disk-kms-key projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME \
    --project CLUSTER_PROJECT_ID \
    --disk-type DISK_TYPE

Créer un cluster Autopilot

Pour créer un cluster Autopilot dont le disque de démarrage est chiffré avec une clé CMEK, exécutez la commande suivante :

gcloud container clusters create-auto CLUSTER_NAME \
    --cluster-version=latest \
    --region COMPUTE_REGION \
    --boot-disk-kms-key projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME \
    --project CLUSTER_PROJECT_ID

Remplacez les éléments suivants :

  • CLUSTER_NAME : nom du nouveau cluster.
  • COMPUTE_REGION : région de calcul du plan de contrôle du cluster.
  • KEY_PROJECT_ID : identifiant de votre projet de clé
  • LOCATION : emplacement de votre trousseau de clés
  • RING_NAME : nom de votre trousseau de clés
  • KEY_NAME : nom de votre clé
  • CLUSTER_PROJECT_ID est l'ID de votre projet de cluster.
  • DISK_TYPE : pd-standard (par défaut) ou pd-ssd.

Console

Créer un cluster standard

Pour créer un cluster standard dont le disque de démarrage est chiffré avec une clé CMEK, procédez comme suit :

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

    Accéder à Google Kubernetes Engine

  2. Cliquez sur Créer.

  3. Dans la section Standard, cliquez sur Configurer.

  4. Configurez le cluster selon vos besoins.

  5. Dans le volet de navigation, cliquez sur Nœuds sous Pools de nœuds.

  6. Dans la liste déroulante Type de disque de démarrage, sélectionnez Disque persistant standard ou Disque persistant SSD.

  7. Cochez la case Activer le chiffrement géré par le client pour le disque de démarrage, puis sélectionnez la clé de chiffrement Cloud KMS que vous avez créée précédemment.

  8. Cliquez sur Créer.

Créer un cluster Autopilot

Pour créer un cluster Autopilot dont le disque de démarrage est chiffré avec une clé CMEK, procédez comme suit :

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

    Accéder à Google Kubernetes Engine

  2. Cliquez sur Créer.

  3. Dans la section Autopilot, cliquez sur Configurer.

  4. Configurez le cluster selon vos besoins.

  5. Développez la section Options avancées et localisez les options Sécurité.

  6. Cochez la case Activer le chiffrement géré par le client pour le disque de démarrage, puis sélectionnez la clé de chiffrement Cloud KMS que vous avez créée précédemment.

  7. Cliquez sur Créer.

Créer un pool de nœuds avec des disques de démarrage des nœuds protégés par CMEK

Pour créer un pool de nœuds avec CMEK activé sur un cluster standard existant, vous pouvez utiliser gcloud CLI ou la console Google Cloud.

gcloud

Pour créer un pool de nœuds avec des disques de démarrage des nœuds dont le chiffrement est géré par le client, spécifiez une valeur pour le paramètre --boot-disk-kms-key dans votre commande de création.

gcloud container node-pools create NODE_POOL_NAME \
    --region COMPUTE_REGION \
    --disk-type DISK_TYPE \
    --boot-disk-kms-key projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME \
    --project CLUSTER_PROJECT_ID \
    --cluster CLUSTER_NAME

Remplacez les éléments suivants :

  • NODE_POOL_NAME : nom que vous avez choisi pour votre pool de nœuds.
  • COMPUTE_REGION : région de calcul du plan de contrôle du cluster.
  • DISK_TYPE : pd-standard (par défaut) ou pd-ssd.
  • KEY_PROJECT_ID : ID de votre projet de clé.
  • LOCATION : emplacement de 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 cluster.
  • CLUSTER_NAME : nom du cluster standard que vous avez créé à l'étape précédente.

Console

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

    Accéder à Google Kubernetes Engine

  2. Dans la liste des clusters, cliquez sur le nom du cluster que vous souhaitez modifier.

  3. Cliquez sur Ajouter un pool de nœuds.

  4. Dans le volet de navigation, cliquez sur Nœuds.

  5. Dans la section Configuration de la machine, vérifiez que Type de disque de démarrage est défini sur Disque persistant standard ou Disque persistant SSD.

  6. Cochez la case Activer le chiffrement géré par le client pour le disque de démarrage, puis sélectionnez la clé de chiffrement Cloud KMS que vous avez créée.

  7. Cliquez sur Créer.

Utiliser des instances Filestore ou des disques persistants protégés par CMEK

Les informations suivantes expliquent comment chiffrer les instances Filestore ou les disques persistants nouvellement créés. Vous pouvez activer CMEK sur un cluster nouveau ou existant à l'aide d'une clé Cloud KMS nouvelle ou existante.

Cette procédure doit être réalisée une fois pour chaque cluster GKE.

Créer une ressource StorageClass faisant référence à la clé Cloud KMS

  1. Copiez le contenu ci-dessous dans un fichier YAML nommé cmek-sc.yaml. Cette configuration active le provisionnement dynamique des volumes chiffrés.

    Instances Filestore

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: csi-filestore-cmek
    provisioner: filestore.csi.storage.gke.io
    allowVolumeExpansion: true
    parameters:
      tier: enterprise
      instance-encryption-kms-key: projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME
    
    • La valeur du champ instance-encryption-kms-key doit être l'identifiant de ressource complet de la clé qui sera utilisée pour chiffrer les nouvelles instances Filestore.
    • Les valeurs dans instance-encryption-kms-key (par exemple, keyRings et cryptoKeys) sont sensibles à la casse. Le provisionnement d'un nouveau volume avec des valeurs incorrectes génère une erreur invalidResourceUsage.
    • Vous ne pouvez pas ajouter le paramètre instance-encryption-kms-key à un objet StorageClass existant. Cependant, vous pouvez supprimer l'objet StorageClass et le recréer avec le même nom, mais avec un ensemble de paramètres différent.

    Disques persistants

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: csi-gce-pd-cmek
    provisioner: pd.csi.storage.gke.io
    volumeBindingMode: "WaitForFirstConsumer"
    allowVolumeExpansion: true
    parameters:
      type: pd-standard
      disk-encryption-kms-key: projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME
    
    • La valeur du champ disk-encryption-kms-key doit être l'identifiant de ressource complet de la clé qui sera utilisée pour chiffrer les nouveaux disques.
    • Les valeurs dans disk-encryption-kms-key (par exemple, keyRings et cryptoKeys) sont sensibles à la casse. Le provisionnement d'un nouveau volume avec des valeurs incorrectes génère une erreur invalidResourceUsage.
    • Vous ne pouvez pas ajouter le paramètre disk-encryption-kms-key à un objet StorageClass existant. Cependant, vous pouvez supprimer l'objet StorageClass et le recréer avec le même nom, mais avec un ensemble de paramètres différent. Assurez-vous que l'approvisionneur de la classe existante est pd.csi.storage.gke.io.

    Vous pouvez définir StorageClass en tant que classe de stockage par défaut.

  2. Déployez StorageClass sur votre cluster GKE en exécutant la commande kubectl :

    kubectl apply -f cmek-sc.yaml
    
  3. Vérifiez que la ressource StorageClass a utilisé le pilote CSI Filestore ou de disque persistant Compute Engine et qu'elle inclut l'ID de votre clé :

    Instances Filestore

    kubectl describe storageclass csi-filestore-cmek
    

    Dans le résultat de la commande, vérifiez les éléments suivants :

    • L'approvisionneur est défini sur filestore.csi.storage.gke.io.
    • L'ID de votre clé s'affiche à la suite de instance-encryption-kms-key.
    Name:                  csi-filestore-cmek
    IsDefaultClass:        No
    Annotations:           None
    Provisioner:           filestore.csi.storage.gke.io
    Parameters:            instance-encryption-kms-key=projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME,type=pd-standard
    AllowVolumeExpansion:  true
    MountOptions:          none
    ReclaimPolicy:         Delete
    VolumeBindingMode:     WaitForFirstConsumer
    Events:                none
    

    Disques persistants

    kubectl describe storageclass csi-gce-pd-cmek
    

    Dans le résultat de la commande, vérifiez les éléments suivants :

    • L'approvisionneur est défini sur pd.csi.storage.gke.io.
    • L'ID de votre clé s'affiche à la suite de disk-encryption-kms-key.
    Name:                  csi-gce-pd-cmek
    IsDefaultClass:        No
    Annotations:           None
    Provisioner:           pd.csi.storage.gke.io
    Parameters:            disk-encryption-kms-key=projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME,type=pd-standard
    AllowVolumeExpansion:  unset
    MountOptions:          none
    ReclaimPolicy:         Delete
    VolumeBindingMode:     WaitForFirstConsumer
    Events:                none
    

Créer un volume de stockage chiffré dans GKE

Dans cette section, vous allez provisionner de manière dynamique des volumes de stockage Kubernetes chiffrés avec la nouvelle ressource StorageClass et votre clé Cloud KMS.

  1. Copiez le contenu suivant dans un nouveau fichier nommé pvc.yaml et assurez-vous que la valeur storageClassName correspond au nom de votre objet StorageClass :

    Instances Filestore

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: podpvc
    spec:
      accessModes:
        - ReadWriteMany
      storageClassName: csi-filestore-cmek
      resources:
        requests:
          storage: 1Ti
    

    Disques persistants

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: podpvc
    spec:
      accessModes:
        - ReadWriteOnce
      storageClassName: csi-gce-pd-cmek
      resources:
        requests:
          storage: 6Gi
    
  2. Appliquez l'instruction PersistentVolumeClaim (PVC) à votre cluster GKE :

    kubectl apply -f pvc.yaml
    
  3. Si votre ressource StorageClass comporte le champ volumeBindingMode défini sur WaitForFirstConsumer, vous devez créer un pod pour utiliser le PVC avant de pouvoir le valider. Copiez le contenu suivant dans un nouveau fichier nommé pod.yaml et assurez-vous que la valeur claimName correspond au nom de votre objet PersistentVolumeClaim :

    apiVersion: v1
    kind: Pod
    metadata:
      name: web-server
    spec:
      containers:
       - name: web-server
         image: nginx
         volumeMounts:
           - mountPath: /var/lib/www/html
             name: mypvc
      volumes:
       - name: mypvc
         persistentVolumeClaim:
           claimName: podpvc
           readOnly: false
    
  4. Appliquez le pod à votre cluster GKE :

    kubectl apply -f pod.yaml
    
  5. Obtenez l'état de votre cluster PersistentVolumeClaim, puis vérifiez que le PVC est créé et lié à un PersistentVolume nouvellement provisionné.

    Instances Filestore

    kubectl get pvc
    

    Le résultat ressemble à ce qui suit :

    NAME      STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS     AGE
    podpvc    Bound     pvc-e36abf50-84f3-11e8-8538-42010a800002   1Ti        RWO            csi-filestore-cmek  9s
    

    Disques persistants

    kubectl get pvc
    

    Le résultat ressemble à ce qui suit :

    NAME      STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS     AGE
    podpvc    Bound     pvc-e36abf50-84f3-11e8-8538-42010a800002   6Gi       RWO            csi-gce-pd-cmek  9s
    

Vous pouvez maintenant utiliser votre disque persistant protégé par CMEK avec votre cluster GKE.

Supprimer la protection CMEK

Pour supprimer la protection CMEK d'un disque persistant, suivez les instructions fournies dans la documentation de Compute Engine.

Le chiffrement CMEK ne peut pas être supprimé des instances Filestore.

GKE et règles d'administration CMEK

GKE est compatible avec les règles d'administration CMEK, qui peuvent exiger une protection CMEK et limiter les clés Cloud KMS utilisables pour la protection CMEK.

Lorsque container.googleapis.com figure dans la liste des services Deny de la contrainte constraints/gcp.restrictNonCmekServices, GKE refuse de créer les ressources suivantes si vous n'activez pas la protection CMEK :

  • Nouveaux clusters et pools de nœuds
  • Nouvelles instances Filestore et disques persistants

Lorsque la contrainte constraints/gcp.restrictNonCmekCryptoKeyProjects est configurée dans une règle d'administration, GKE ne crée que des ressources protégées par des clés CMEK qui utilisent une clé de chiffrement d'un projet, d'un dossier ou d'une organisation autorisée.

Étape suivante