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 la CLI de gcloud.
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
.Un clúster regional debe usar un llavero 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 la consola de Google Cloud.
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_NAME \
--location LOCATION \
--keyring RING_NAME \
--member serviceAccount:SERVICE_ACCOUNT \
--role roles/cloudkms.cryptoKeyEncrypterDecrypter \
--project KEY_PROJECT_ID
Reemplaza lo siguiente:
KEY_NAME
: Es el nombre de la clave.LOCATION
: Es la región en la que creaste el llavero de claves.RING_NAME
: 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 claves.
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 la consola de Google Cloud.
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.
Usa discos de arranque de nodos protegidos 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 la CLI de gcloud o la consola de Google Cloud.
Para los clústeres estándar, solo un disco persistente estándar (pd-standard
) o un disco persistente SSD (pd-ssd
) se puede encriptar 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 el parámetro --boot-disk-kms-key
en el comando de creación.
Crea un clúster estándar
Para crear un clúster estándar cuyo disco de arranque esté encriptado con una clave CMEK, usa el siguiente comando:
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
Crea un clúster de Autopilot
Para crear un clúster de Autopilot cuyo disco de arranque esté encriptado con una clave CMEK, usa el siguiente comando:
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
Reemplaza lo siguiente:
CLUSTER_NAME
: Nombre del clúster nuevo.COMPUTE_REGION
: La región de procesamiento del plano de control del clúster.KEY_PROJECT_ID
: Es el ID del proyecto de claves.LOCATION
: Es la ubicación del llavero de claves.RING_NAME
: Es el nombre del llavero de claves.KEY_NAME
: Es el nombre de la clave.CLUSTER_PROJECT_ID
es el ID del proyecto del clúster.DISK_TYPE
:pd-standard
(predeterminado) opd-ssd
.
Console
Crea un clúster estándar
Para crear un clúster estándar cuyo disco de arranque esté encriptado con una clave CMEK, sigue estos pasos:
Ve a la página de Google Kubernetes Engine en la consola de Google Cloud.
Haz clic en add_box Crear.
En la sección Estándar, haz clic en Configurar.
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.
Crea un clúster de Autopilot
Para crear un clúster de Autopilot cuyo disco de arranque esté encriptado con una clave CMEK, sigue estos pasos:
Ve a la página de Google Kubernetes Engine en la consola de Google Cloud.
Haz clic en add_box Crear.
En la sección Autopilot, haz clic en Configurar.
Configura tu clúster como desees.
Expande la sección Opciones avanzadas y busca las opciones de Seguridad.
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.
Crea un grupo de nodos nuevo con discos de arranque de nodos protegidos por CMEK
Para crear un grupo de nodos nuevo con las CMEK habilitadas en un clúster estándar existente, puedes usar la CLI de gcloud o la consola de Google Cloud.
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 parámetro --boot-disk-kms-key
en el comando de creación.
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
Reemplaza lo siguiente:
NODE_POOL_NAME
: es el nombre que eliges para el grupo de nodos.COMPUTE_REGION
: La región de procesamiento del plano de control del clúster.DISK_TYPE
:pd-standard
(predeterminado) opd-ssd
.KEY_PROJECT_ID
: Es el ID del proyecto de claves.LOCATION
: Es la ubicación del llavero de claves.RING_NAME
: Es el nombre del llavero de claves.KEY_NAME
: Es el nombre de la clave.CLUSTER_PROJECT_ID
: Es el ID del proyecto del clúster.CLUSTER_NAME
: es el nombre del clúster estándar que creaste en el paso anterior.
Console
Ve a la página de Google Kubernetes Engine en la consola de Google Cloud.
En la lista de clústeres, haz clic en el nombre del clúster que deseas modificar.
Haz clic en add_box Agregar grupo de nodos.
Desde el panel de navegación, haz clic en Nodos.
En la sección Configuración de máquina, asegúrate de que el Tipo de disco de arranque sea 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.
Usa instancias de Filestore o discos persistentes protegidos por CMEK
La siguiente información abarca cómo encriptar instancias de Filestore o 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 CSI de Filestore o el controlador 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.
- Otorga permiso de acceso a la clave a la cuenta de servicio de Filestore.
- 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 una StorageClass que haga referencia a la clave de Cloud KMS
Copia el siguiente contenido en un archivo YAML llamado
cmek-sc.yaml
. Esta configuración permite el aprovisionamiento dinámico de volúmenes encriptados.Instancias de 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
- El campo
instance-encryption-kms-key
debe ser el identificador de recursos completamente calificado de la clave que se usará para encriptar nuevas instancias de Filestore. - En los valores de
instance-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
. - No puedes agregar el parámetro
instance-encryption-kms-key
a un objetoStorageClass
existente. Sin embargo, puedes borrar el objetoStorageClass
y volver a crearlo con el mismo nombre, pero con un conjunto diferente de parámetros.
Discos persistentes
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
- 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
. - No puedes agregar el parámetro
disk-encryption-kms-key
a un objetoStorageClass
existente. Sin embargo, puedes borrar el objetoStorageClass
y volver a crearlo con el mismo nombre, pero con un conjunto diferente de parámetros. Asegúrate de que el aprovisionador de la clase existente seapd.csi.storage.gke.io
.
Puedes configurar StorageClass como opción predeterminada.
- El campo
Implementa
StorageClass
en el clúster de GKE conkubectl
:kubectl apply -f cmek-sc.yaml
Verifica que la
StorageClass
usó el controlador CSI de Persistent Disk o Filestore de Compute Engine y que incluya el ID de la clave:Instancias de Filestore
kubectl describe storageclass csi-filestore-cmek
En el resultado del comando, verifica lo siguiente:
- El aprovisionador debe estar configurado como filestore.csi.storage.gke.io.
- El ID de tu clave sigue 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
Discos persistentes
kubectl describe storageclass csi-gce-pd-cmek
En el resultado del comando, verifica lo siguiente:
- El aprovisionador esté configurado como
pd.csi.storage.gke.io
. - El ID de tu clave siga
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
Crea un volumen de almacenamiento encriptado en GKE
En esta sección, aprovisionarás de forma dinámica los volúmenes de almacenamiento encriptados de Kubernetes con StorageClass
y la clave Cloud KMS nueva.
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
:Instancias de Filestore
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: podpvc spec: accessModes: - ReadWriteMany storageClassName: csi-filestore-cmek resources: requests: storage: 1Ti
Discos persistentes
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
Si tu
StorageClass
tiene el campovolumeBindingMode
configurado comoWaitForFirstConsumer
, debes crear un Pod para usar el PVC antes de poder verificarlo. Copia los siguientes contenidos en un archivo nuevo llamadopod.yaml
y asegúrate de que el valor declaimName
coincida con el nombre de tu objetoPersistentVolumeClaim
: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
Aplica el Pod en tu clúster de GKE:
kubectl apply -f pod.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.Instancias de Filestore
kubectl get pvc
El resultado es similar a este:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE podpvc Bound pvc-e36abf50-84f3-11e8-8538-42010a800002 1Ti RWO csi-filestore-cmek 9s
Discos persistentes
kubectl get pvc
El resultado es similar a este:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE podpvc Bound pvc-e36abf50-84f3-11e8-8538-42010a800002 6Gi 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
Si deseas quitar la protección con CMEK de un disco persistente, sigue las instrucciones de la documentación de Compute Engine.
La encriptación de CMEK no se puede quitar de las instancias de Filestore.
Políticas de la organización de GKE y CMEK
GKE admite las políticas de la organización de CMEK (vista previa) que pueden requerir protección de CMEK y que pueden limitar las claves de Cloud KMS que puedes usar para la protección de CMEK.
Cuando container.googleapis.com
está en la lista de servicios de la política Deny
de la restricción constraints/gcp.restrictNonCmekServices
, GKE se niega a crear los siguientes recursos si no habilitas la protección de CMEK:
- Clústeres y grupos de nodos nuevos
- Instancias de Filestore y discos persistentes
Cuando la restricción constraints/gcp.restrictNonCmekCryptoKeyProjects
se configura en una política de la organización, GKE solo crea recursos protegidos por CMEK que usan una clave de encriptación de una organización, carpeta o proyecto permitidos.
¿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.