Usar claves de encriptación administradas por el cliente (CMEK)


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

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

  2. En tu proyecto clave, asegúrate de que habilitaste la API de Cloud KMS.

    Habilitar la API de Cloud KMS

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

  4. En el proyecto del clúster, asegúrate de que habilitaste la API de Cloud KMS.

    Habilitar la API de Cloud KMS

  5. Asegúrate de que instalaste la CLI de gcloud.

  6. 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ón us-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ón asia-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:

  1. Abre el navegador de claves de Cloud Key Management Service en la consola de Google Cloud.
    Abrir el navegador de claves de Cloud KMS
  2. Haz clic en el nombre del llavero de claves que contiene la clave que desees.

  3. Selecciona la casilla de verificación de la clave que deseas.

    La pestaña Permisos en el panel de la ventana derecha estará disponible.

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

  5. En el menú desplegable Seleccionar una función, selecciona Encriptador/Desencriptador de CryptoKeys de Cloud KMS.

  6. 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) o pd-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:

  1. Ve a la página de Google Kubernetes Engine en la consola de Google Cloud.

    Ir a Google Kubernetes Engine

  2. Haz clic en Crear.

  3. En la sección Estándar, haz clic en Configurar.

  4. Configura tu clúster como desees.

  5. En el panel de navegación, en Grupos de nodos, haz clic en Nodos.

  6. En la lista desplegable Tipo de disco de arranque, selecciona Disco persistente estándar o Disco persistente SSD.

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

  8. Haga 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:

  1. Ve a la página de Google Kubernetes Engine en la consola de Google Cloud.

    Ir a Google Kubernetes Engine

  2. Haz clic en Crear.

  3. En la sección Autopilot, haz clic en Configurar.

  4. Configura tu clúster como desees.

  5. Expande la sección Opciones avanzadas y busca las opciones de Seguridad.

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

  7. Haga 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) o pd-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.

Consola

  1. Ve a la página de Google Kubernetes Engine en la consola de Google Cloud.

    Ir a Google Kubernetes Engine

  2. En la lista de clústeres, haz clic en el nombre del clúster que deseas modificar.

  3. Haz clic en Agregar grupo de nodos.

  4. Desde el panel de navegación, haz clic en Nodos.

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

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

  7. Haga 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 una StorageClass que haga referencia a la clave de Cloud KMS

  1. 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 y cryptoKeys). Cuando se aprovisiona un volumen nuevo con valores incorrectos, se genera un error invalidResourceUsage.
    • No puedes agregar el parámetro instance-encryption-kms-key a un objeto StorageClass existente. Sin embargo, puedes borrar el objeto StorageClass 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 y cryptoKeys). Cuando se aprovisiona un volumen nuevo con valores incorrectos, se genera un error invalidResourceUsage.
    • No puedes agregar el parámetro disk-encryption-kms-key a un objeto StorageClass existente. Sin embargo, puedes borrar el objeto StorageClass 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 sea pd.csi.storage.gke.io.

    Puedes configurar StorageClass como opción predeterminada.

  2. Implementa StorageClass en el clúster de GKE con kubectl:

    kubectl apply -f cmek-sc.yaml
    
  3. 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.

  1. Copia los siguientes contenidos en un archivo nuevo llamado pvc.yaml y asegúrate de que el valor de storageClassName coincida con el nombre de tu objeto StorageClass:

    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
    
  2. Aplica el objeto PersistentVolumeClaim (PVC) en tu clúster de GKE:

    kubectl apply -f pvc.yaml
    
  3. Si tu StorageClass tiene el campo volumeBindingMode configurado como WaitForFirstConsumer, debes crear un Pod para usar el PVC antes de poder verificarlo. Copia los siguientes contenidos en un archivo nuevo llamado pod.yaml y asegúrate de que el valor de claimName coincida con el nombre de tu objeto 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. Aplica el Pod en tu clúster de GKE:

    kubectl apply -f pod.yaml
    
  5. Obtén el estado del PersistentVolumeClaim de tu clúster y verifica que el PVC se haya creado y vinculado a un PersistentVolume 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?