En esta página, se muestra cómo encriptar los datos almacenados en el plano de control de Google Kubernetes Engine (GKE) con las claves que administras en Cloud Key Management Service (Cloud KMS). Ya deberías estar familiarizado con conceptos como etcd, la arquitectura del clúster de GKE y Cloud KMS.
En esta página, se describe una parte de un conjunto de funciones opcionales del plano de control en GKE que te permiten realizar tareas como verificar la postura de seguridad del plano de control o configurar la encriptación y la firma de credenciales en el plano de control con las claves que administras. Para obtener más información, consulta Acerca de la autoridad del plano de control de GKE.
De forma predeterminada, Google Cloud aplica varias medidas de seguridad al plano de control administrado. En esta página, se describen las funciones opcionales que te brindan más visibilidad o control sobre el plano de control de GKE.
Información acerca del disco de arranque del plano de control y la encriptación de etcd
De forma predeterminada, GKE encripta el disco de inicio de un nodo de plano de control, el disco que almacena datos en etcd y la copia de seguridad operativa interna de etcd de Google Cloud con claves de encriptación que administra Google Cloud. Para obtener detalles sobre esta encriptación predeterminada, consulta Encriptación en reposo predeterminada. De manera opcional, puedes usar tus propias claves de encriptación que administras con Cloud KMS para encriptar estos recursos. Para obtener más información, consulta Encriptación del disco de inicio del plano de control y etcd.
Creas claves en Cloud KMS que GKE usa para encriptar tus recursos del plano de control. Ten en cuenta lo siguiente cuando crees estos recursos:
- Puedes usar un llavero de claves para todas las claves de un clúster, independientemente del propósito de cada una. Si tienes un llavero de claves existente que usaste para un propósito diferente, como configurar tus propias autoridades certificadoras, puedes usar ese llavero para esta guía.
- Para obtener una latencia mejor, debes crear las claves en la misma ubicación de Google Cloud que tu clúster.
- En la mayoría de los casos de uso, puedes usar el nivel de protección de claves de Cloud KMS de software. También puedes usar claves de hardware con Cloud HSM.
- Debes especificar la marca
--purpose
con el valorencryption
porque estas claves se usan para la encriptación simétrica. - 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 llaves administradas por el usuario que debes habilitar al mismo tiempo cuando creas un clúster:
- Encripta los componentes del plano de control (esta página)
- Ejecuta tus propias autoridades certificadoras (AC) y claves
Solo puedes habilitar estas funciones cuando creas un clúster de GKE nuevo. No puedes actualizar los clústeres existentes para usar estas funciones. Para usar ambas funciones en el mismo clúster, realiza todos los procedimientos de configuración de claves y AC en ambas guías y, luego, ejecuta el comando de creación de clústeres que habilita ambos conjuntos de funciones, como se describe en la sección Cómo crear un clúster.
Antes de comenzar
Antes de comenzar, asegúrate de haber realizado las siguientes tareas:
- Habilita la API de Google Kubernetes Engine. Habilitar la API de Google Kubernetes Engine
- Si deseas usar Google Cloud CLI para esta tarea, instala y, luego, inicializa gcloud CLI. Si ya instalaste gcloud CLI, ejecuta
gcloud components update
para obtener la versión más reciente.
- Asegúrate de que tu proyecto de claves tenga un llavero de Cloud KMS para tu clúster. Puedes usar cualquier llavero de claves existente en la ubicación de tu clúster. Para crear un llavero de claves nuevo, consulta Cómo crear un llavero de claves.
-
Enable the Cloud Key Management Service API.
Identifica proyectos
Te recomendamos que uses proyectos Google Cloud separados de la siguiente manera:
- Proyecto de claves: Contiene todas las claves.
- Proyecto del clúster: Contiene tus clústeres de GKE.
De forma opcional, puedes usar el mismo proyecto para tus claves y clústeres de GKE, pero te recomendamos que uses proyectos separados para que los equipos que administran tus claves y operaciones criptográficas estén separados de los equipos que administran tus clústeres.
Roles y permisos requeridos
Para obtener los permisos que necesitas para ejecutar tus propias claves de encriptación, pídele a tu administrador que te otorgue los siguientes roles de IAM:
-
Crear claves de Cloud KMS:
Administrador de Cloud KMS (
roles/cloudkms.admin
) en tu proyecto de claves -
Crear clústeres de GKE:
Administrador de clústeres de Kubernetes Engine (
roles/container.clusterAdmin
) en tu proyecto de clúster
Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso a proyectos, carpetas y organizaciones.
También puedes obtener los permisos necesarios mediante roles personalizados o cualquier otro rol predefinido.
Requisitos
Tu clúster debe ejecutar la versión 1.31.1-gke.1846000 de GKE o una posterior.
Limitaciones
- Solo puedes configurar el disco de arranque y las claves de encriptación de etcd durante la creación del clúster.
En el caso de los clústeres regionales del modo estándar y de los clústeres de Autopilot, la región en la que crees un clúster debe tener capacidad para el modo confidencial de Hyperdisk equilibrado en al menos tres zonas de esa región.
Para los clústeres en modo estándar zonales, la zona del clúster debe tener capacidad de Hyperdisk Balanced. Para obtener ayuda con la capacidad, comunícate con Atención al cliente de Cloud.
El modo confidencial para Hyperdisk Balanced solo está disponible en regiones específicas. Para obtener más información, consulta Regiones compatibles para volúmenes de Hyperdisk Balanced en modo confidencial.
GKE solo admite claves de Cloud KMS. No puedes usar otro proveedor de KMS de Kubernetes ni otro proveedor de encriptación.
No se admiten las claves de Cloud External Key Manager (Cloud EKM).
No puedes acceder a las copias de seguridad operativas internas de etcd de Google Cloud ni interactuar con ellas, ya que solo se usan para la recuperación ante desastres.
No se admiten los llaveros multirregionales. Debes usar un llavero de claves regional.
Crea claves
En esta sección, crearás una clave de encriptación para los discos de inicio y los discos etcd en tu plano de control y una clave de encriptación independiente para la copia de seguridad operativa interna de etcd de Google Cloud. Puedes usar un llavero para contener todas estas claves y cualquier otra clave del clúster.
Crea la clave de encriptación para los discos de arranque y etcd del plano de control:
gcloud kms keys create KCP_DISK_KEY_NAME \ --keyring=KEYRING_NAME \ --location=LOCATION \ --purpose="encryption" \ --protection-level=PROTECTION_LEVEL \ --project=KEY_PROJECT_ID
Reemplaza lo siguiente:
KCP_DISK_KEY_NAME
: Es el nombre de la clave de encriptación para los discos de arranque y los discos etcd del plano de control.KEYRING_NAME
: Es el nombre del llavero de claves que contiene las claves de encriptación del clúster.LOCATION
: Es la ubicación de Google Cloud para el llavero de claves. Debe ser la misma que la ubicación de tu clúster. Para obtener 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, comosoftware
ohsm
.KEY_PROJECT_ID
: Es el ID del proyecto de tu proyecto de claves.
Crea la clave de encriptación 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
Reemplaza
ETCD_BACKUP_KEY_NAME
por un nombre para la clave de encriptación de la copia de seguridad interna de etcd.
Otorga roles de IAM al agente de servicio de GKE
En esta sección, otorgarás roles de IAM en las claves que creaste al agente de servicio de GKE en el proyecto del clúster. El agente de servicio de GKE requiere que estos roles usen estas claves para encriptar los recursos del plano de control correspondientes.
Busca el número de proyecto de tu clúster:
gcloud projects describe CLUSTER_PROJECT_ID \ --format='value(projectNumber)'
Reemplaza
CLUSTER_PROJECT_ID
por el ID del proyecto de tu proyecto de clúster de GKE.El resultado es similar a este:
1234567890
Otorga el rol de encriptador/desencriptador de CryptoKey de Cloud KMS (
roles/cloudkms.cryptoKeyEncrypterDecrypter
) en la clave de encriptación para los discos de inicio y los discos etcd al 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
Reemplaza lo siguiente:
KCP_DISK_KEY_NAME
: Es el nombre de la clave de encriptación del disco.LOCATION
: Es la ubicación de Google Cloud para la clave.KEYRING_NAME
: Es el nombre del llavero de claves que incluye la clave de encriptación.CLUSTER_PROJECT_NUMBER
: Es el número de proyecto numérico del proyecto del clúster que encontraste en el paso anterior.KEY_PROJECT_ID
: Es el ID del proyecto de tu proyecto de claves.
Otorga el rol de encriptador/desencriptador de CryptoKey de Cloud KMS mediante delegación (
roles/cloudkms.cryptoKeyEncrypterDecrypterViaDelegation
) en la clave de encriptación para los discos de inicio y los discos etcd al 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
Otorga el rol de encriptador de CryptoKey de Cloud KMS (
roles/cloudkms.cryptoKeyEncrypter
) en la clave de encriptación de copias de seguridad interna de etcd al 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
Reemplaza
ETCD_BACKUP_KEY_NAME
por el nombre de la clave de encriptación de la copia de seguridad operativa de etcd.Otorgar el rol
roles/cloudkms.cryptoKeyEncrypter
evita que GKE realice restauraciones de bases de datos en tu nombre y aumenta significativamente la cantidad de tiempo para restablecer la funcionalidad cuando se produce un problema en la base de datos. Para permitir que GKE realice los restablecimientos por ti, otorga el rolroles/cloudkms.cryptoKeyEncrypterDecrypter
.
Usa claves de encriptación en un clúster
En esta sección, se muestra cómo identificar las rutas de acceso a tus claves de encriptación.
Identifica la ruta de acceso a tu clave de encriptación del disco:
gcloud kms keys describe KCP_DISK_KEY_NAME \ --keyring=KEYRING_NAME \ --location=LOCATION \ --project=KEY_PROJECT_ID \ --format="value(name)"
Reemplaza lo siguiente:
KCP_DISK_KEY_NAME
: Es el nombre de la clave de encriptación para los discos de arranque del plano de control y los discos etcd.KEYRING_NAME
: Es el nombre del llavero de claves que incluye la clave.LOCATION
: Es la ubicación de la clave en Google Cloud .KEY_PROJECT_ID
: Es el ID del proyecto de tu proyecto de claves.
El resultado es similar a este:
projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/KEYRING_NAME/cryptoKeys/disk-encryption-key
Identifica la ruta de acceso a la clave de encriptación de la 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)"
Reemplaza
ETCD_BACKUP_KEY_NAME
por el nombre de la clave de encriptación de la copia de seguridad operativa de etcd.El resultado es similar a este:
projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/KEYRING_NAME/cryptoKeys/etcd-backup-encryption-key
Crea un clúster
En esta sección, crearás un clúster con diferentes opciones especificadas según las funciones de autoridad del plano de control de GKE que desees configurar. Solo puedes configurar estas funciones en un clúster durante su creación. Los siguientes comandos crean clústeres en modo Autopilot. Para crear clústeres de modo estándar, usa las mismas marcas con el comando gcloud container clusters create
.
Para crear un clúster que configure la encriptación de discos y ejecute tus propias AC y claves de firma de cuentas de servicio, haz lo siguiente:
- Realiza todos los pasos de configuración de claves y AC en Ejecuta tus propias autoridades certificadoras y claves.
- Para encontrar las rutas de acceso a cada una de las claves de la cuenta de servicio y las AC, sigue las instrucciones que se indican en Configura AC y claves en un clúster nuevo.
Crea un clúster:
gcloud container clusters create-auto 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
Reemplaza lo siguiente:
CLUSTER_NAME
: Es el nombre del clúster nuevo.LOCATION
: Es la ubicación del clúster nuevo.CLUSTER_PROJECT_ID
: Es el ID del proyecto de tu clúster.PATH_TO_DISK_KEY
: Es la ruta de acceso a la clave de encriptación del disco de los pasos anteriores de esta página.PATH_TO_ETCD_BACKUP_KEY
: Es la ruta de acceso a la clave de encriptación de la copia de seguridad interna de etcd de los pasos anteriores de esta página.PATH_TO_SIGNING_KEY_VERSION
: Es la ruta de acceso a la versión de la clave de firma de la cuenta de servicio de Kubernetes en Cloud KMS.PATH_TO_VERIFICATION_KEY_VERSION
: Es la ruta de acceso a la versión de la clave de verificación de la cuenta de servicio de Kubernetes en Cloud KMS.PATH_TO_CLUSTER_CA
: Es la ruta de acceso al grupo de AC del clúster.PATH_TO_ETCD_PEER_CA
: Es la ruta de acceso al grupo de AC de pares de etcd.PATH_TO_ETCD_API_CA
: Es la ruta de acceso al grupo de AC de la API de etcd.PATH_TO_AGGREGATION_CA
: Es la ruta de acceso al grupo de AC de agregación.
Para crear un clúster que solo configure la encriptación de discos con las claves que creaste en esta guía, ejecuta el siguiente comando:
gcloud container clusters create-auto 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
Reemplaza lo siguiente:
CLUSTER_NAME
: Es el nombre del clúster nuevo.LOCATION
: Es la ubicación del clúster nuevo.CLUSTER_PROJECT_ID
: Es el ID del proyecto de tu clúster.PATH_TO_DISK_KEY
: Es la ruta de acceso a la clave de encriptación del disco de los pasos anteriores.PATH_TO_ETCD_BACKUP_KEY
: Es la ruta de acceso a la clave de encriptación de la copia de seguridad interna de etcd de los pasos anteriores.
También puedes especificar todas estas marcas cuando creas un clúster nuevo en modo estándar.
Verifica el estado de la clave de encriptación
En esta sección, se muestra cómo verificar la clave de encriptación que se usó durante la creación del clúster. Puedes realizar esta verificación con Cloud Logging o con Google Cloud CLI.
Usa Logging para verificar claves
Para verificar las claves con Logging, haz lo siguiente:
En la consola de Google Cloud , ve a la página Explorador de registros:
Especifica la siguiente consulta para obtener el registro de creación del clúster:
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:*
Haz clic en Ejecutar consulta.
En el resultado, verifica que los parámetros de creación del clúster incluyan una ruta de acceso a la clave que corresponda a la clave que configuraste 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"
}
Usa gcloud CLI para verificar las claves
Para usar gcloud CLI y verificar la clave de encriptación, haz lo siguiente:
Para la clave de encriptación del disco, ejecuta el siguiente comando:
gcloud container clusters describe CLUSTER_NAME \ --location=LOCATION \ --format="value(userManagedKeysConfig.controlPlaneDiskEncryptionKey)"
Para la clave de encriptación de la copia de seguridad interna de etcd, ejecuta el siguiente comando:
gcloud container clusters describe CLUSTER_NAME \ --location=LOCATION \ --format="value(userManagedKeysConfig.gkeopsEtcdBackupEncryptionKey)"
¿Qué sigue?
- Obtén más información sobre lo que puedes ver en el plano de control
- Ejecuta tus propias autoridades certificadoras y claves en GKE
- Verifica la integridad de la VM del plano de control