Usa 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

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

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

    Habilitar 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ón us-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ó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 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:

  1. Abre el navegador de claves de Cloud Key Management Service en Google Cloud Console.
    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.

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

Console

  1. Visita el menú de Cloud Key Management Service en Cloud Console.

    Visitar el menú de Cloud Key Management Service

  2. Haz clic en el botón Crear clúster.

  3. Configura tu clúster como desees.

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

  5. En la lista desplegable Tipo de disco de arranque, selecciona 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. 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) o pd-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

  1. Visita el menú de GKE en Cloud Console.

    Visita el menú de GKE.

  2. Selecciona el clúster al que deseas agregar un grupo de nodos.

  3. Haz clic en Agregar grupo de nodos.

  4. Asegúrate de que el Tipo de disco de arranque sea Disco persistente estándar o Disco persistente SSD.

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

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

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

    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 sea pd.csi.storage.gke.io.

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

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

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.

  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:

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

    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?