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 se encarga de la encriptación sin que tengas que realizar ninguna acción.

Si deseas controlar y administrar la rotación de las claves de encriptación, puedes usar claves de encriptación administradas por el cliente (CMEK). Estas 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 usando las claves que administras. Consulta el artículo sobre la encriptación de secretos en la capa de aplicación para obtener más detalles.

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 quedan 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 las instancias principales 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 el proyecto de clave, asegúrate de que habilitaste la API de Cloud KMS.

    Habilitar la API de Cloud KMS

  • En el proyecto de la clave, el usuario que crea el llavero de claves y la clave necesita los siguientes permisos de Cloud IAM:

    • cloudkms.keyRings.getIamPolicy
    • cloudkms.keyRings.setIamPolicy

    Estos permisos (y muchos otros) se otorgan a la función predefinida roles/cloudkms.admin de Cloud Identity and Access Management. Puedes obtener más detalles en la sección Otorga permisos para administrar claves de 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, debes crear un llavero de claves, una clave y una versión de clave de Cloud KMS (si es necesario). Puedes usar una clave de Cloud KMS existente, siempre y cuando sea del tipo correcto (es decir, que sea de la misma región, que sea una clave de encriptación simétrica y que otorgues los permisos correspondientes).

Cuando crees un llavero de claves, especifica una ubicación que coincida con la ubicación del clúster de GKE:

  • Los clústeres zonales deben usar llaveros de claves de una ubicación superior. 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 crear una clave de Cloud KMS, puedes usar el comando de gcloud o Google Cloud Console.

  1. En el proyecto de la clave, crea un llavero de claves:

    gcloud

    gcloud kms keyrings create ring-name \
        --location location \
        --project key-project-id
    

    En el ejemplo anterior, se ilustra lo siguiente:

    • ring-name es un nombre que eliges para tu llavero de claves.
    • location es la región en la que deseas crear el llavero de claves.
    • key-project-id es el ID del proyecto de la clave.

    Console

    1. Ve a la página Claves criptográficas en Cloud Console.

      Ir a la página Claves criptográficas

    2. Haz clic en Crear llavero de claves.

    3. En el campo Nombre del llavero de claves, ingresa el nombre de tu llavero de claves.

    4. En la lista desplegable Ubicación, selecciona la ubicación de tu clúster de Kubernetes. Tu página Crear llavero de claves debe ser similar a la que se muestra a continuación:

      Pantalla de creación de llavero de claves en la IU web de Google Cloud

    5. Haz clic en Crear.

  2. Luego, crea una clave:

    gcloud

    gcloud kms keys create key-name \
      --location location \
      --keyring ring-name \
      --purpose encryption \
      --project key-project-id
    

    En el ejemplo anterior, se ilustra lo siguiente:

    • key-name es el nombre que eliges para la clave.
    • location es la región donde creaste el llavero de claves.
    • ring-name es el nombre del llavero de claves.
    • key-project-id es el ID del proyecto de la clave.

    Console

    1. Ve a la página Claves criptográficas en Cloud Console.

      Ir a la página Claves criptográficas

    2. Haz clic en el nombre del llavero de claves para el cual crearás una clave.

    3. Haz clic en Crear clave.

    4. Ingresa el nombre en el campo Nombre de la clave.

    5. Acepta los valores predeterminados de Período de rotación y A partir de, o establece un período de rotación de clave y una fecha de inicio si deseas usar valores diferentes.

    6. De manera opcional, si deseas agregar etiquetas a tu clave, haz clic en Agregar etiqueta en el campo Etiquetas.

      Tu página Crear clave (Create key) debe ser similar a la que se muestra a continuación:

      Pantalla de creación de claves en la IU web de Google Cloud

    7. Haz clic en Crear.

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

En el ejemplo anterior, project-number es 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-name \
  --location location \
  --keyring ring-name \
  --member serviceAccount:service-account-name \
  --role roles/cloudkms.cryptoKeyEncrypterDecrypter \
  --project key-project-id

En el ejemplo anterior, se ilustra lo siguiente:

  • key-name es el nombre de la clave.
  • location es la región donde creaste el llavero de claves.
  • ring-name es el nombre del llavero de claves.
  • service-account-name es el nombre de tu cuenta de servicio de Compute Engine.
  • key-project-id es el ID del proyecto de la 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 con el comando gcloud o Google Cloud Console.

Para usar CMEK con un disco de arranque de nodo, asegúrate de seleccionar un disco persistente estándar (pd-standard) o un disco persistente SSD (pd-ssd).

gcloud

A fin de crear un clúster con encriptación administrada por el cliente para discos de arranque de nodos, especifica un valor para el parámetro --boot-disk-kms-key parameter en el comando de creación.

  gcloud beta container clusters create cluster-name \
--cluster-version=latest \
--zone zone \
--boot-disk-kms-key projects/key-project-id/locations/location/keyRings/ring-name/cryptoKeys/key-name \
--project cluster-project-id\
--disk-type disk-type

En el ejemplo anterior, se ilustra lo siguiente:

  • cluster-name es el nombre que eliges para el clúster.
  • zone es la zona en la que deseas crear el clúster.
  • key-project-id es el ID del proyecto de la clave.
  • 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 es pd-standard (valor 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.

Crea un grupo de nodos con un disco de arranque de nodo protegido por CMEK

Puedes crear un nuevo grupo de nodos con un disco de arranque de nodo protegido por CMEK con 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 beta 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/key-name \
--project cluster-project-id \
--cluster cluster-name

En el ejemplo anterior, se ilustra lo siguiente:

  • node-pool-name es un nombre que eliges para tu grupo de nodos.
  • zone es la zona en la que deseas crear el clúster.
  • disk-type es pd-standard (valor predeterminado) o pd-ssd.
  • key-project-id es el ID del proyecto de la clave.
  • 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 que creaste en el paso anterior.

Console

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

    Visitar 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
    
  2. Implementa el objeto StorageClass en tu clúster de GKE mediante kubectl:

    kubectl apply -f gcepd-sc.yaml
  3. Por último, verifica que el objeto StorageClass haya usado el controlador de CSI de Persistent Disk de Compute Engine y que incluya el ID de tu 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.

Pasos siguientes