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
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.
Dans votre projet de clé, assurez-vous que vous avez activé 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 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.Dans votre projet de cluster, vérifiez que vous avez activé l'API Cloud KMS.
Assurez-vous d'avoir installé gcloud CLI.
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égionus-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égionasia-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ésSERVICE_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 :
- Ouvrez le navigateur Clés Cloud Key Management Service dans la console Google Cloud.
Ouvrir le navigateur de clés Cloud KMS Cliquez sur le nom du trousseau contenant la clé souhaitée.
Cochez la case correspondant à la clé souhaitée.
L'onglet Autorisations s'affiche dans le volet de droite.
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.
Dans le menu déroulant Sélectionner un rôle, sélectionnez Chiffreur/Déchiffreur de clés cryptographiques Cloud KMS.
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ésRING_NAME
: nom de votre trousseau de clésKEY_NAME
: nom de votre cléCLUSTER_PROJECT_ID
est l'ID de votre projet de cluster.DISK_TYPE
:pd-standard
(par défaut) oupd-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 :
Accédez à la page Google Kubernetes Engine dans Google Cloud Console.
Cliquez sur add_box Créer.
Dans la section Standard, cliquez sur Configurer.
Configurez le cluster selon vos besoins.
Dans le volet de navigation, cliquez sur Nœuds sous Pools de nœuds.
Dans la liste déroulante Type de disque de démarrage, sélectionnez Disque persistant standard ou Disque persistant SSD.
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.
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 :
Accédez à la page Google Kubernetes Engine dans Google Cloud Console.
Cliquez sur add_box Créer.
Dans la section Autopilot, cliquez sur Configurer.
Configurez le cluster selon vos besoins.
Développez la section Options avancées et localisez les options Sécurité.
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.
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) oupd-ssd
.KEY_PROJECT_ID
: ID de votre projet de clé.LOCATION
: emplacement de votre trousseau de clésRING_NAME
: nom de votre trousseau de clésKEY_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
Accédez à la page Google Kubernetes Engine dans Google Cloud Console.
Dans la liste des clusters, cliquez sur le nom du cluster que vous souhaitez modifier.
Cliquez sur add_box Ajouter un pool de nœuds.
Dans le volet de navigation, cliquez sur Nœuds.
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.
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.
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éez un cluster GKE, si vous n'en possédez pas.
- Déployez le pilote CSI Filestore ou le pilote CSI de disque persistant Compute Engine sur votre cluster.
- Créez un trousseau de clés et une version de clé Cloud KMS, si vous n'en possédez pas.
- Accordez un accès aux clés au compte de service Filestore.
- Créez une ressource StorageClass qui permet aux disques provisionnés par Kubernetes d'être automatiquement chiffrés avec la clé Cloud KMS. Pour savoir comment procéder, consultez la section suivante.
Créer une ressource StorageClass faisant référence à la clé Cloud KMS
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
etcryptoKeys
) sont sensibles à la casse. Le provisionnement d'un nouveau volume avec des valeurs incorrectes génère une erreurinvalidResourceUsage
. - Vous ne pouvez pas ajouter le paramètre
instance-encryption-kms-key
à un objetStorageClass
existant. Cependant, vous pouvez supprimer l'objetStorageClass
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
etcryptoKeys
) sont sensibles à la casse. Le provisionnement d'un nouveau volume avec des valeurs incorrectes génère une erreurinvalidResourceUsage
. - Vous ne pouvez pas ajouter le paramètre
disk-encryption-kms-key
à un objetStorageClass
existant. Cependant, vous pouvez supprimer l'objetStorageClass
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 estpd.csi.storage.gke.io
.
Vous pouvez définir StorageClass en tant que classe de stockage par défaut.
- La valeur du champ
Déployez
StorageClass
sur votre cluster GKE en exécutant la commandekubectl
:kubectl apply -f cmek-sc.yaml
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.
Copiez le contenu suivant dans un nouveau fichier nommé
pvc.yaml
et assurez-vous que la valeurstorageClassName
correspond au nom de votre objetStorageClass
: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
Appliquez l'instruction
PersistentVolumeClaim
(PVC) à votre cluster GKE :kubectl apply -f pvc.yaml
Si votre ressource
StorageClass
comporte le champvolumeBindingMode
défini surWaitForFirstConsumer
, 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 valeurclaimName
correspond au nom de votre objetPersistentVolumeClaim
: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
Appliquez le pod à votre cluster GKE :
kubectl apply -f pod.yaml
Obtenez l'état de votre cluster
PersistentVolumeClaim
, puis vérifiez que le PVC est créé et lié à unPersistentVolume
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
- Consultez les questions fréquentes sur Cloud KMS.
- Apprenez à protéger des ressources avec des clés Cloud KMS.