Encriptar los discos de arranque de etcd y del plano de control

.

En esta página se explica cómo cifrar los datos almacenados en tu plano de control de Google Kubernetes Engine (GKE) con las claves que gestionas en Cloud Key Management Service (Cloud KMS). Ya deberías conocer conceptos como etcd, la arquitectura de clústeres de GKE y Cloud KMS.

En esta página se describe una parte de un conjunto de funciones opcionales del plano de control de GKE que te permiten realizar tareas como verificar el estado de seguridad del plano de control o configurar el cifrado y la firma de credenciales en el plano de control mediante claves que tú gestionas. Para obtener más información, consulta el artículo Acerca de la autoridad del plano de control de GKE.

De forma predeterminada, Google Cloud aplica varias medidas de seguridad al plano de control gestionado. En esta página se describen las funciones opcionales que le ofrecen más visibilidad o control sobre el plano de control de GKE.

Acerca del disco de arranque del plano de control y el cifrado de etcd

De forma predeterminada, GKE encripta el disco de arranque de un nodo del plano de control, el disco que almacena datos en etcd y la Google Cloud copia de seguridad operativa interna de etcd Google Cloudmediante claves de encriptado que gestiona. Para obtener más información sobre este cifrado predeterminado, consulta el artículo Cifrado predeterminado en reposo. Opcionalmente, puedes usar tus propias claves de encriptado, que gestionas con Cloud KMS, para encriptar estos recursos. Para obtener más información, consulta Cifrado del disco de arranque y de etcd del plano de control.

Creas claves en Cloud KMS que GKE usa para cifrar los recursos de tu plano de control. Ten en cuenta lo siguiente al crear estos recursos:

  • Puedes usar un llavero para todas las claves de un clúster, independientemente del propósito de cada clave. Si tienes un llavero que has usado para otro propósito, como configurar tus propias autoridades de certificación, puedes usarlo en esta guía.
  • Para reducir la latencia, debes crear las claves en la misma Google Cloud ubicación que tu clúster.
  • En la mayoría de los casos prácticos, puedes usar el nivel de protección de claves de Cloud KMS software. También puedes usar claves de hardware con Cloud HSM.
  • Debes especificar la marca --purpose con el valor encryption porque estas claves se usan para el cifrado simétrico.
  • No debes modificar la duración predeterminada para la destrucción de claves.

Uso con otras funciones de autoridad del plano de control de GKE

La autoridad del plano de control de GKE proporciona las siguientes funciones relacionadas con las claves autogestionadas, que debes habilitar al mismo tiempo al crear un clúster:

Solo puedes habilitar estas funciones cuando creas un clúster de GKE. No puedes actualizar los clústeres que ya tengas para usar estas funciones. Para usar ambas funciones en el mismo clúster, sigue todos los procedimientos de configuración de claves y de la autoridad certificadora que se indican en ambas guías y, a continuación, ejecuta el comando de creación de clúster que habilita ambos conjuntos de funciones, tal como se describe en la sección Crear un clúster.

Antes de empezar

Antes de empezar, asegúrate de que has realizado las siguientes tareas:

  • Habilita la API de Google Kubernetes Engine.
  • Habilitar la API de Google Kubernetes Engine
  • Si quieres usar Google Cloud CLI para esta tarea, instálala y, a continuación, inicialízala. Si ya has instalado la gcloud CLI, obtén la versión más reciente ejecutando gcloud components update.
  • Asegúrate de que tu proyecto de clave tenga un llavero de claves de Cloud KMS para tu clúster. Puedes usar cualquier conjunto de claves que ya tengas en la ubicación de tu clúster. Para crear un conjunto de claves, consulta Crear un conjunto de claves.
  • Enable the Cloud Key Management Service API.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

Identificar proyectos

Te recomendamos que uses proyectos de Google Cloud independientes de la siguiente manera:

  • Proyecto clave: contiene todas las claves.
  • Proyecto de clúster: contiene tus clústeres de GKE.

También puedes usar el mismo proyecto para tus claves y clústeres de GKE, pero te recomendamos que utilices proyectos independientes para que los equipos que gestionan tus claves y operaciones criptográficas no sean los mismos que los que gestionan tus clústeres.

Roles y permisos necesarios

Para obtener los permisos que necesitas para ejecutar tus propias claves de cifrado, pide a tu administrador que te conceda los siguientes roles de gestión de identidades y accesos:

Para obtener más información sobre cómo conceder roles, consulta el artículo Gestionar el acceso a proyectos, carpetas y organizaciones.

También puedes conseguir los permisos necesarios a través de roles personalizados u otros roles predefinidos.

Requisitos

Tu clúster debe ejecutar la versión 1.31.1-gke.1846000 de GKE o una posterior.

Limitaciones

  • Solo puedes configurar las claves de cifrado del disco de arranque y de etcd durante la creación del clúster.
  • En el caso de los clústeres regionales en modo Estándar y los clústeres de Autopilot, la región en la que crees un clúster debe tener capacidad para el modo Confidencial de Hyperdisk Balanced en al menos tres zonas de esa región.

    En el caso de los clústeres de modo Estándar zonales, la zona del clúster debe tener capacidad de Hyperdisk Balanced. Si necesitas ayuda con la capacidad, ponte en contacto con Cloud Customer Care.

  • GKE solo admite claves de Cloud KMS. No puedes usar otro proveedor de KMS de Kubernetes ni otro proveedor de cifrado.

  • No se admiten las claves de Cloud External Key Manager (Cloud EKM).

  • No puedes acceder a las copias de seguridad operativas internas de etcd ni interactuar con ellas, ya que solo se utilizan en caso de desastre. Google Cloud

  • No se admiten los conjuntos de claves multirregionales. Debes usar un conjunto de claves regional.

  • Las regiones y zonas en las que puedes usar la autoridad del plano de control de GKE dependen de si quieres usar funciones específicas, tal como se indica a continuación:

    • Para encriptar los discos de arranque del plano de control con una clave de encriptado gestionada por el cliente, el clúster debe estar en una de las siguientes regiones:
      • asia-east1
      • asia-northeast1
      • asia-southeast1
      • europe-west1
      • europe-west4
      • us-central1
      • us-east1
      • us-east4
      • us-east5
      • us-south1
      • us-west1
      • us-west3
      • us-west4
    • Para usar nodos de Confidential GKE con la autoridad del plano de control de GKE, tu clúster debe estar en una región que admita el modo Confidencial para Hyperdisk Balanced.

    Si no usas estas funciones, puedes usar la autoridad del plano de control de GKE en cualquier Google Cloud ubicación.

Crear claves

En esta sección, se crea una clave de cifrado para los discos de arranque y los discos etcd del plano de control, así como una clave de cifrado independiente para la Google Cloudcopia de seguridad operativa interna de etcd. Puedes usar un llavero para guardar todas estas claves y cualquier otra clave del clúster.

  1. Crea la clave de cifrado para los discos de arranque del plano de control y los discos de etcd:

    gcloud kms keys create KCP_DISK_KEY_NAME \
        --keyring=KEYRING_NAME \
        --location=LOCATION \
        --purpose="encryption" \
        --protection-level=PROTECTION_LEVEL \
        --project=KEY_PROJECT_ID
    

    Haz los cambios siguientes:

    • KCP_DISK_KEY_NAME: el nombre de la clave de cifrado de los discos de arranque del plano de control y los discos de etcd.
    • KEYRING_NAME: el nombre del conjunto de claves que contendrá las claves de cifrado del clúster.
    • LOCATION: la Google Cloud ubicación del conjunto de claves. Debe ser la misma que la ubicación de tu clúster. Para ver una lista de regiones, filtra por "Región" en la tabla de ubicaciones de Cloud KMS.
    • PROTECTION_LEVEL: el nivel de protección de la clave, como software o hsm.
    • KEY_PROJECT_ID: el ID del proyecto de tu proyecto de clave.
  2. Crea la clave de cifrado de la copia de seguridad interna de etcd:

    gcloud kms keys create ETCD_BACKUP_KEY_NAME \
        --keyring=KEYRING_NAME \
        --location=LOCATION \
        --purpose="encryption" \
        --protection-level=PROTECTION_LEVEL \
        --project=KEY_PROJECT_ID
    

    Sustituye ETCD_BACKUP_KEY_NAME por el nombre de la clave de cifrado de la copia de seguridad interna de etcd.

Conceder roles de IAM al agente de servicio de GKE

En esta sección, asignas roles de gestión de identidades y accesos a las claves que has creado al agente de servicio de GKE en el proyecto del clúster. El agente de servicio de GKE requiere estos roles para usar estas claves y cifrar los recursos del plano de control correspondientes.

  1. Busca el número de proyecto de tu clúster:

    gcloud projects describe CLUSTER_PROJECT_ID \
        --format='value(projectNumber)'
    

    Sustituye CLUSTER_PROJECT_ID por el ID del proyecto del clúster de GKE.

    El resultado debería ser similar al siguiente:

    1234567890
    
  2. Asigna el rol Encargado del encriptado y desencriptado de claves criptográficas de Cloud KMS (roles/cloudkms.cryptoKeyEncrypterDecrypter) a la clave de encriptado de los discos de arranque y los discos etcd del agente de servicio de GKE en el proyecto del clúster:

    gcloud kms keys add-iam-policy-binding KCP_DISK_KEY_NAME \
        --location=LOCATION \
        --keyring=KEYRING_NAME \
        --member="serviceAccount:service-CLUSTER_PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com" \
        --role=roles/cloudkms.cryptoKeyEncrypterDecrypter \
        --project=KEY_PROJECT_ID
    

    Haz los cambios siguientes:

    • KCP_DISK_KEY_NAME: el nombre de la clave de cifrado del disco.
    • LOCATION: la Google Cloud ubicación de la clave.
    • KEYRING_NAME: el nombre del conjunto de claves que contiene la clave de cifrado.
    • CLUSTER_PROJECT_NUMBER: el número del proyecto del clúster, que has encontrado en el paso anterior.
    • KEY_PROJECT_ID: el ID del proyecto de tu proyecto de clave.
  3. Asigna el rol Encargado del encriptado y desencriptado de claves criptográficas de Cloud KMS mediante delegación (roles/cloudkms.cryptoKeyEncrypterDecrypterViaDelegation) a la clave de encriptado de los discos de arranque y los discos etcd del agente de servicio de GKE en el proyecto del clúster:

    gcloud kms keys add-iam-policy-binding KCP_DISK_KEY_NAME \
        --location=LOCATION \
        --keyring=KEYRING_NAME \
        --member="serviceAccount:service-CLUSTER_PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com" \
        --role=roles/cloudkms.cryptoKeyEncrypterDecrypterViaDelegation \
        --project=KEY_PROJECT_ID
    
  4. Asigna el rol Usuario de claves de Cloud KMS a las claves de cifrado de los discos de arranque y los discos etcd del agente de servicio de GKE en el proyecto del clúster para la rotación de claves:

    gcloud kms keys add-iam-policy-binding KCP_DISK_KEY_NAME \
        --location=LOCATION \
        --keyring=KEYRING_NAME \
        --member="serviceAccount:service-CLUSTER_PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com" \
        --role=roles/container.cloudKmsKeyUser \
        --project=KEY_PROJECT_ID
    
  5. Asigna el rol Encargado del encriptado de CryptoKey de Cloud KMS (roles/cloudkms.cryptoKeyEncrypter) a la clave de encriptado de la copia de seguridad interna de etcd del agente de servicio de GKE en el proyecto del clúster:

    gcloud kms keys add-iam-policy-binding ETCD_BACKUP_KEY_NAME \
        --location=LOCATION \
        --keyring=KEYRING_NAME \
        --member="serviceAccount:service-CLUSTER_PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com" \
        --role=roles/cloudkms.cryptoKeyEncrypter \
        --project=KEY_PROJECT_ID
    

    Sustituye ETCD_BACKUP_KEY_NAME por el nombre de la clave de cifrado de la copia de seguridad operativa de etcd.

    Si asignas el rol roles/cloudkms.cryptoKeyEncrypter, GKE no podrá restaurar bases de datos en tu nombre y se aumentará significativamente el tiempo necesario para restaurar la funcionalidad cuando se produzca un problema en la base de datos. Para permitir que GKE realice restauraciones por ti, asigna el rol roles/cloudkms.cryptoKeyEncrypterDecrypter.

Usar claves de cifrado en un clúster

En esta sección se explica cómo identificar las rutas de tus claves de cifrado.

  1. Identifica la ruta de acceso a tu clave de cifrado de disco:

    gcloud kms keys describe KCP_DISK_KEY_NAME \
        --keyring=KEYRING_NAME \
        --location=LOCATION \
        --project=KEY_PROJECT_ID \
        --format="value(name)"
    

    Haz los cambios siguientes:

    • KCP_DISK_KEY_NAME: el nombre de la clave de cifrado de los discos de arranque del plano de control y los discos etcd.
    • KEYRING_NAME: el nombre del conjunto de claves que contiene la clave.
    • LOCATION: la ubicación de la clave. Google Cloud
    • KEY_PROJECT_ID: el ID del proyecto de tu proyecto de clave.

    El resultado debería ser similar al siguiente:

    projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/KEYRING_NAME/cryptoKeys/disk-encryption-key
    
  2. Identifica la ruta de acceso a tu clave de cifrado de copia de seguridad interna de etcd:

    gcloud kms keys describe ETCD_BACKUP_KEY_NAME \
        --keyring=KEYRING_NAME \
        --location=LOCATION \
        --project=KEY_PROJECT_ID \
        --format="value(name)"
    

    Sustituye ETCD_BACKUP_KEY_NAME por el nombre de la clave de cifrado de la copia de seguridad operativa de etcd.

    El resultado debería ser similar al siguiente:

    projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/KEYRING_NAME/cryptoKeys/etcd-backup-encryption-key
    

Crear un clúster

En esta sección, creará un clúster con diferentes opciones especificadas en función de las funciones de autoridad del plano de control de GKE que quiera configurar. Solo puedes configurar estas funciones en un clúster durante la creación del clúster. Los siguientes comandos crean clústeres en modo estándar. Para crear clústeres en modo Autopilot, usa las mismas marcas con el comando gcloud container clusters create-auto.

  • Para crear un clúster que configure el cifrado de disco y ejecute tus propias ACs y claves de firma de cuentas de servicio, haz lo siguiente:

    1. Sigue todos los pasos de configuración de claves y AC que se indican en Ejecutar tus propias autoridades de certificación y claves.
    2. Para encontrar las rutas de cada una de las claves de la cuenta de servicio y de las autoridades de certificación, sigue las instrucciones que se indican en Configurar autoridades de certificación y claves en un clúster nuevo.
    3. Para crear un clúster, sigue estos pasos:

      gcloud container clusters create CLUSTER_NAME \
          --location=LOCATION \
          --project=CLUSTER_PROJECT_ID \
          --control-plane-disk-encryption-key=PATH_TO_DISK_KEY \
          --gkeops-etcd-backup-encryption-key=PATH_TO_ETCD_BACKUP_KEY \
          --service-account-signing-keys=PATH_TO_SIGNING_KEY_VERSION \
          --service-account-verification-keys=PATH_TO_VERIFICATION_KEY_VERSION \
          --cluster-ca=PATH_TO_CLUSTER_CA \
          --etcd-peer-ca=PATH_TO_ETCD_PEER_CA \
          --etcd-api-ca=PATH_TO_ETCD_API_CA \
          --aggregation-ca=PATH_TO_AGGREGATION_CA
      

      Haz los cambios siguientes:

      • CLUSTER_NAME: el nombre del nuevo clúster.
      • LOCATION: la ubicación de tu nuevo clúster.
      • CLUSTER_PROJECT_ID: el ID del proyecto de tu proyecto de clúster.
      • PATH_TO_DISK_KEY: la ruta a la clave de cifrado del disco que has obtenido en los pasos anteriores de esta página.
      • PATH_TO_ETCD_BACKUP_KEY: la ruta a tu clave de cifrado de copia de seguridad interna de etcd de los pasos anteriores de esta página.
      • PATH_TO_SIGNING_KEY_VERSION: la ruta a la versión de la clave de firma de la cuenta de servicio de Kubernetes en Cloud KMS.
      • PATH_TO_VERIFICATION_KEY_VERSION: la ruta a la versión de la clave de verificación de la cuenta de servicio de Kubernetes en Cloud KMS.
      • PATH_TO_CLUSTER_CA: la ruta al grupo de ACs del clúster.
      • PATH_TO_ETCD_PEER_CA: la ruta al grupo de autoridades de certificación de peer de etcd.
      • PATH_TO_ETCD_API_CA: la ruta al grupo de autoridades de certificación de la API de etcd.
      • PATH_TO_AGGREGATION_CA: ruta al grupo de autoridades de certificación de agregación.
  • Para crear un clúster que solo configure el cifrado de disco con las claves que has creado en esta guía, ejecuta el siguiente comando:

    gcloud container clusters create CLUSTER_NAME \
        --location=LOCATION \
        --project=CLUSTER_PROJECT_ID \
        --control-plane-disk-encryption-key=PATH_TO_DISK_KEY \
        --gkeops-etcd-backup-encryption-key=PATH_TO_ETCD_BACKUP_KEY
    

    Haz los cambios siguientes:

    • CLUSTER_NAME: el nombre del nuevo clúster.
    • LOCATION: la ubicación de tu nuevo clúster.
    • CLUSTER_PROJECT_ID: el ID del proyecto de tu proyecto de clúster.
    • PATH_TO_DISK_KEY: la ruta a la clave de cifrado del disco de los pasos anteriores.
    • PATH_TO_ETCD_BACKUP_KEY: la ruta a tu clave de cifrado de copia de seguridad interna de etcd de los pasos anteriores.

También puede especificar todas estas marcas al crear un clúster en modo Estándar.

Verificar el estado de la clave de cifrado

En esta sección se explica cómo verificar la clave de cifrado que se usó durante la creación del clúster. Puedes realizar esta verificación con Cloud Logging o con la CLI de Google Cloud.

Usar el registro para verificar las claves

Para verificar las claves mediante Logging, haz lo siguiente:

  1. En la Google Cloud consola, ve a la página Explorador de registros:

    Ir a Explorador de registros

  2. Para obtener el registro de creación del clúster, especifica la siguiente consulta:

    resource.type="gke_cluster"
    resource.labels.cluster_name="CLUSTER_NAME"
    resource.labels.location="CLUSTER_LOCATION"
    protoPayload.serviceName="container.googleapis.com"
    protoPayload.methodName=~"google.container.v(1|1alpha1|1beta1).ClusterManager.CreateCluster"
    protoPayload.request.cluster.userManagedKeysConfig:*
    
  3. Haz clic en Realizar una consulta.

En el resultado, comprueba que los parámetros de creación del clúster incluyan una ruta de clave que corresponda a la clave que has configurado en Cloud KMS, como en el siguiente ejemplo:

# lines omitted for clarity
userManagedKeysConfig: {
  controlPlaneDiskEncryptionKey: "projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/KEY_RING_NAME/cryptoKeys/KCP_DISK_KEY_NAME"
  gkeopsEtcdBackupEncryptionKey: "projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/KEY_RING_NAME/cryptoKeys/ETCD_BACKUP_KEY_NAME"
}

Usar la CLI de gcloud para verificar las claves

Para usar gcloud CLI y verificar la clave de cifrado, haz lo siguiente:

  1. Para la clave de cifrado de disco, ejecuta el siguiente comando:

    gcloud container clusters describe CLUSTER_NAME \
        --location=LOCATION \
        --format="value(userManagedKeysConfig.controlPlaneDiskEncryptionKey)"
    
  2. Para la clave de cifrado de la copia de seguridad interna de etcd, ejecuta el siguiente comando:

    gcloud container clusters describe CLUSTER_NAME \
        --location=LOCATION \
        --format="value(userManagedKeysConfig.gkeopsEtcdBackupEncryptionKey)"
    

Rotar las claves de cifrado de disco de etcd y del plano de control

Las claves de cifrado que creas no caducan. Para mejorar tu postura de seguridad, rota estas claves con regularidad y vuelve a cifrar tus recursos con nuevas versiones de las claves. Para obtener más información, consulta Rotar las claves de cifrado del disco de arranque de etcd y del plano de control.

Siguientes pasos