En esta página, se describe cómo usar claves de encriptación administradas por el cliente (CMEK) en Google Kubernetes Engine (GKE). Si quieres controlar la administración de tus claves, puedes usar Cloud Key Management Service y CMEK para proteger los discos persistentes conectados y los discos de arranque personalizados de los clústeres de GKE.
Descripción general
De forma predeterminada, Google Cloud encripta el contenido en reposo del cliente y GKE administra la encriptación sin que tengas que realizar ninguna acción.
Si deseas controlar y administrar la rotación de claves de encriptación, puedes usar CMEK. Estas claves encriptan las claves de encriptación de datos que, a su vez, encriptan tus datos. Para obtener más información, consulta Administración de claves. También puedes encriptar secretos en el clúster mediante las claves que administras. Para obtener más detalles, consulta Encriptación de secretos de la capa de la aplicación.
En GKE, las CMEK pueden proteger los datos de dos tipos de discos de almacenamiento: discos de arranque de los nodos y discos conectados.
- Discos de arranque de los nodos
- Los discos de arranque de los nodos forman parte de los grupos de nodos del clúster. Puedes crear un disco de arranque de nodo encriptado con CMEK cuando creas clústeres y grupos de nodos.
- Discos conectados
- Los discos conectados son PersistentVolumes que usan los pods para el almacenamiento durable. Los discos persistentes conectados que están encriptados con CMEK están disponibles en GKE como PersistentVolumes aprovisionados de manera dinámica.
Para obtener más información sobre los discos de almacenamiento, consulta Opciones de almacenamiento. Los discos del plano de control, que se usan en los planos de control de GKE, no se pueden proteger con CMEK.
Antes de comenzar
Para realizar los ejercicios de este tema, necesitas dos proyectos de Google Cloud:
Proyecto de la clave: En él crearás una clave de encriptación.
Proyecto de clúster: Aquí crearás un clúster que habilita CMEK.
En tu proyecto clave, asegúrate de que habilitaste la API de Cloud KMS.
En el proyecto de claves, el usuario que crea el llavero de claves y la clave necesita los siguientes permisos de IAM:
cloudkms.keyRings.getIamPolicy
cloudkms.keyRings.setIamPolicy
Estos permisos se otorgan a la función de la administración de identidades y accesos predefinida
roles/cloudkms.admin
. Puedes obtener más información sobre otorgar permisos para administrar claves en la documentación de Cloud KMS.En el proyecto del clúster, asegúrate de que habilitaste la API de Cloud KMS.
Asegúrate de que instalaste el SDK de Cloud.
Actualiza
gcloud
a la versión más reciente:gcloud components update
Crea una clave de Cloud KMS
Para proteger el disco de arranque del nodo o el disco conectado con una CMEK, necesitas un llavero de claves y una clave de Cloud KMS.
El llavero de claves y la clave tienen los siguientes requisitos:
La clave debe usar encriptación simétrica.
Debes otorgar los permisos de la cuenta de servicio de GKE para usar la clave.
El llavero de claves debe tener una ubicación que coincida con la ubicación del clúster de GKE:
Un clúster zonal debe usar un llavero de claves desde la ubicación de un superconjunto. Por ejemplo, un clúster ubicado en la zona
us-central1-a
solo puede usar una clave ubicada en la regiónus-central1
.Los clústeres regionales deben usar llaveros de claves de la misma ubicación. Por ejemplo, un clúster en la región
asia-northeast1
debe protegerse con un llavero de claves de la regiónasia-northeast1
.La región
global
de Cloud KMS no es compatible con GKE.
Para obtener instrucciones sobre cómo crear un llavero de claves y una clave, consulta Crea claves simétricas.
Concede permisos para usar la clave
Debes asignarle la función Encriptador/Desencriptador de CryptoKeys de Cloud KMS a la cuenta de servicio de Compute Engine que los nodos del clúster usan. Esto es necesario para que los discos persistentes de GKE puedan acceder a tu clave de encriptación y usarla.
El nombre de la cuenta de servicio de Compute Engine tiene el siguiente formato:
service-project-number@compute-system.iam.gserviceaccount.com
Reemplaza project-number por el número de proyecto del clúster.
Para otorgar acceso a la cuenta de servicio, puedes usar el comando gcloud
o Google Cloud Console.
gcloud
Otorga la función Encriptador/Desencriptador de CryptoKeys de Cloud KMS a tu cuenta de servicio de Compute Engine:
gcloud kms keys add-iam-policy-binding key \
--location location \
--keyring key-ring \
--member serviceAccount:service-account \
--role roles/cloudkms.cryptoKeyEncrypterDecrypter \
--project key-project-id
Reemplaza los siguientes elementos:
- key es el nombre de la clave.
- location es la región donde creaste tu llavero de claves.
- key-ring es el nombre del llavero de claves.
- service-account es el nombre de tu cuenta de servicio de Compute Engine.
- key-project-id es el ID del proyecto de clave.
Console
Otorga la función Encriptador/Desencriptador de CryptoKeys de Cloud KMS a tu cuenta de servicio de Compute Engine:
- Abre el navegador de claves de Cloud Key Management Service en Google Cloud Console.
Abrir el navegador de claves de Cloud KMS Haz clic en el nombre del llavero de claves que contiene la clave que desees.
Selecciona la casilla de verificación de la clave que deseas.
La pestaña Permisos en el panel de la ventana derecha estará disponible.
En el cuadro de diálogo Agregar miembros, especifica la dirección de correo electrónico de la cuenta de servicio de Compute Engine a la que otorgas acceso.
En el menú desplegable Seleccionar una función, selecciona Encriptador/Desencriptador de CryptoKeys de Cloud KMS.
Haz clic en Guardar.
Crea un disco de arranque protegido por CMEK
En esta sección, crearás un clúster o grupo de nodos nuevo con un disco de arranque protegido por CMEK.
No puedes habilitar la encriptación administrada por el cliente en los discos de arranque de nodos de un clúster existente, ya que no es posible cambiar el tipo de disco de arranque de un clúster o grupo de nodos existente. Sin embargo, puedes crear un nuevo grupo de nodos para el clúster con la encriptación administrada por el cliente habilitada y borrar el grupo de nodos anterior.
Tampoco puedes inhabilitar la encriptación administrada por el cliente en los discos de arranque de nodos de un clúster o grupo de nodos existente. Sin embargo, puedes crear un nuevo grupo de nodos para el clúster con la encriptación administrada por el cliente inhabilitada y borrar el grupo de nodos anterior.
Crea un clúster con un disco de arranque de nodo protegido por CMEK
Puedes crear un clúster con un disco de arranque de nodo protegido por CMEK mediante el comando de gcloud
o Google Cloud Console.
Solo se puede encriptar un disco persistente estándar (pd-standard
) o un disco persistente SSD (pd-ssd
) con una clave CMEK.
gcloud
A fin de crear un clúster cuyo disco de arranque esté encriptado con una clave CMEK, especifica un valor para --boot-disk-kms-key parameter
en el comando de creación.
gcloud container clusters create cluster \
--cluster-version=latest \
--zone zone \
--boot-disk-kms-key projects/key-project-id/locations/location/keyRings/key-ring/cryptoKeys/key \
--project cluster-project-id\
--disk-type disk-type
Reemplaza los siguientes elementos:
- cluster es un nombre que eliges para el clúster.
- zone es la zona en la que deseas crear el clúster.
- key-project-id es tu ID del proyecto clave.
- location es la ubicación de tu llavero de claves.
- key-ring es el nombre de tu llavero de claves.
- key es el nombre de tu clave.
- cluster-project-id es el ID del proyecto del clúster.
- disk-type es
pd-standard
(predeterminado) opd-ssd
.
Console
Visita el menú de Cloud Key Management Service en Cloud Console.
Haz clic en el botón Crear clúster.
Configura tu clúster como desees.
En el panel de navegación, en Grupos de nodos, haz clic en Nodos.
En la lista desplegable Tipo de disco de arranque, selecciona Disco persistente estándar o Disco persistente SSD.
Selecciona la casilla de verificación Habilita la encriptación administrada por el cliente para el disco de arranque y elige la clave de encriptación de Cloud KMS que creaste antes.
Haz clic en Crear.
Actualiza un clúster con discos de arranque de nodos protegidos por CMEK
Para crear un grupo de nodos nuevo con CMEK habilitadas en un clúster existente, puedes usar el comando gcloud
o Google Cloud Console.
gcloud
A fin de crear un grupo de nodos con encriptación administrada por el cliente para discos de arranque de nodos, especifica un valor para el --boot-disk-kms-key parameter
en el comando de creación.
gcloud container node-pools create node-pool-name \
--zone zone \
--disk-type disk-type \
--boot-disk-kms-key projects/key-project-id/locations/location/keyRings/ring-name/cryptoKeys/<var>key-name \
--project cluster-project-id \
--cluster cluster-name
Reemplaza los siguientes elementos:
- node-pool-name es un nombre que eliges para el grupo de nodos.
- zone es la zona en la que deseas crear el clúster.
- disk-type es
pd-standard
(predeterminado) opd-ssd
. - key-project-id es tu ID del proyecto clave.
- location es la ubicación de tu llavero de claves.
- ring-name es el nombre de tu llavero de claves.
- key-name es el nombre de tu clave.
- cluster-project-id es el ID del proyecto del clúster.
- cluster-name es el nombre del clúster que creaste en el paso anterior.
Console
Visita el menú de GKE en Cloud Console.
Selecciona el clúster al que deseas agregar un grupo de nodos.
Haz clic en Agregar grupo de nodos.
Asegúrate de que el Tipo de disco de arranque sea Disco persistente estándar o Disco persistente SSD.
Selecciona Habilita la encriptación administrada por el cliente para el disco de arranque y elige la clave de encriptación de Cloud KMS que creaste.
Haz clic en Guardar.
Crea un disco conectado protegido con CMEK
Sigue estas instrucciones para encriptar los discos persistentes recién creados. Puedes habilitar CMEK en un clúster nuevo o existente, con una clave de Cloud KMS nueva o existente.
Debes seguir estos pasos una vez por cada clúster de GKE.
- Crea un clúster de GKE, si todavía no tienes uno disponible.
- Implementa el controlador de CSI de Persistent Disk de Compute Engine en el clúster.
- Crea un llavero de claves y versiones de claves de Cloud KMS, si todavía no los tienes.
- Crea una StorageClass que permita que se encripten automáticamente los discos aprovisionados mediante Kubernetes con esa clave de Cloud KMS. Para obtener detalles sobre cómo hacer esto, consulta la siguiente sección.
Crea un objeto StorageClass que haga referencia a la clave de Cloud KMS
Copia el siguiente contenido en un archivo YAML llamado
gcepd-sc.yaml
. Esta configuración permite el aprovisionamiento dinámico de volúmenes encriptados.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/key-ring/cryptoKeys/key
- El campo
disk-encryption-kms-key
debe ser el identificador de recursos completamente calificado de la clave que se usará para encriptar los discos nuevos. - En los valores de
disk-encryption-kms-key
, se distingue entre mayúsculas y minúsculas (por ejemplo:keyRings
ycryptoKeys
). Cuando se aprovisiona un volumen nuevo con valores incorrectos, se genera un errorinvalidResourceUsage
. - Puedes configurar StorageClass como opción predeterminada.
No puedes agregar el parámetro
disk-encryption-kms-key
a una StorageClass existente. Sin embargo, puedes borrar la StorageClass y volver a crearla con el mismo nombre, pero con un conjunto diferente de parámetros. Si haces esto, asegúrate de que el aprovisionador de la clase existente seapd.csi.storage.gke.io
.- El campo
Implementa
StorageClass
en el clúster de GKE conkubectl
:kubectl apply -f gcepd-sc.yaml
Verifica que la
StorageClass
usó el controlador CSI de Persistent Disk de Compute Engine y que incluya el ID de la clave:kubectl describe storageclass csi-gce-pd-cmek
En el resultado del comando, verifica lo siguiente:
- El aprovisionador debe estar configurado como
pd.csi.storage.gke.io
. - El ID de tu clave debe seguir
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
- El aprovisionador debe estar configurado como
Crea un disco persistente encriptado en GKE
En esta sección, aprovisionarás de forma dinámica los volúmenes de almacenamiento encriptados de Kubernetes con tu objeto StorageClass
y la clave Cloud KMS nuevos.
Copia los siguientes contenidos en un archivo nuevo llamado
pvc.yaml
y asegúrate de que el valor destorageClassName
coincida con el nombre de tu objetoStorageClass
:kind: PersistentVolumeClaim apiVersion: v1 metadata: name: podpvc spec: accessModes: - ReadWriteOnce storageClassName: csi-gce-pd-cmek resources: requests: storage: 6Gi
Aplica el objeto
PersistentVolumeClaim
(PVC) en tu clúster de GKE:kubectl apply -f pvc.yaml
Obtén el estado del
PersistentVolumeClaim
de tu clúster y verifica que el PVC se haya creado y vinculado a unPersistentVolume
recién aprovisionado.kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE podpvc Bound pvc-e36abf50-84f3-11e8-8538-42010a800002 10Gi RWO csi-gce-pd-cmek 9s
Ahora puedes usar el disco persistente protegido por CMEK con el clúster de GKE.
Quita la protección con CMEK de un disco persistente
Si deseas quitar la protección con CMEK de un disco persistente, sigue las instrucciones de la documentación de Compute Engine.
¿Qué sigue?
- Lee las Preguntas frecuentes sobre Cloud Key Management Service.
- Obtén más información sobre cómo proteger recursos con las claves de Cloud KMS.