Encriptación de secretos de la capa de la aplicación

En esta página, se explica cómo encriptar secretos de Kubernetes en la capa de la aplicación mediante una clave que administras en Cloud Key Management Service (Cloud KMS).

Puedes crear clústeres nuevos que utilicen la encriptación de secretos de la capa de la aplicación en GKE v1.11.2 y superior. La actualización de clústeres existentes para usar la encriptación de secretos de la capa de la aplicación es compatible con las siguientes versiones de GKE:

  • GKE 1.11: v1.11.9 y posterior
  • GKE 1.12: v1.12.7 y posterior
  • GKE 1.13 y posterior

Descripción general

De forma predeterminada, GKE encripta el contenido del cliente almacenado en reposo, incluidos los secretos. GKE controla y administra esta encriptación predeterminada sin que debas realizar ninguna acción adicional.

La encriptación de secretos de la capa de la aplicación proporciona una capa adicional de seguridad para los datos sensibles, como los secretos, almacenados en etcd. Con esta funcionalidad, puedes usar una clave administrada con Cloud KMS para encriptar datos en la capa de la aplicación. Esto protege contra atacantes que obtienen acceso a una copia sin conexión de etcd.

Para usar la encriptación de secretos de la capa de la aplicación, primero debes crear una clave de Cloud KMS y otorgarle a la cuenta de servicio de GKE acceso a la clave. La clave debe estar en la misma ubicación que el clúster para disminuir la latencia y evitar casos en los que los recursos dependen de los servicios distribuidos en varios dominios con fallas. Luego, puedes habilitar la función en un clúster nuevo o existente cuando especificas la clave que desearías usar.

Encriptación de sobre

Kubernetes ofrece encriptación de sobre de los secretos con un proveedor de KMS, lo que significa que se utiliza una clave local, comúnmente llamada clave de encriptación de datos (DEK), para encriptar los secretos. La DEK está encriptada con otra clave llamada clave de encriptación de clave. Kubernetes no almacena la clave de encriptación de clave.

La encriptación de sobre tiene dos beneficios principales:

  • La clave de encriptación de clave se puede rotar sin necesidad de volver a encriptar todos los secretos. Esto significa que puedes seguir más fácilmente la práctica recomendada de la rotación normal de claves, sin tener un impacto significativo en el rendimiento.

  • Los secretos que se almacenan en Kubernetes pueden basarse en una raíz de confianza externa. Esto significa que puedes utilizar una raíz central de confianza para todos tus secretos, por ejemplo, un módulo de seguridad de hardware, y que un adversario que accede a tus contenedores fuera de línea no puede obtener tus secretos.

Con la encriptación de secretos de la capa de la aplicación en GKE, tus secretos se encriptan localmente con el proveedor AES-CBC y las DEK locales. Las DEK se encriptan con una clave de encriptación de clave que administras en Cloud KMS.

Para obtener más información sobre la encriptación de sobre, consulta Encriptación de sobre.

¿Qué sucede cuando creas un secreto?

Cuando creas un secreto nuevo, esto es lo que sucede:

  • El servidor de la API de Kubernetes genera una DEK única para el secreto mediante el uso de un generador de números al azar.

  • El servidor de la API de Kubernetes usa la DEK localmente para encriptar el secreto.

  • El complemento para KMS envía la DEK a Cloud KMS con el objetivo de que se realice la encriptación. El complemento para KMS usa la cuenta de servicio de GKE de tu proyecto a fin de autenticarse en Cloud KMS.

  • Cloud KMS encripta la DEK y la envía de vuelta al complemento para KMS.

  • El servidor de la API de Kubernetes guarda el secreto encriptado y la DEK encriptada. La DEK sin formato no se guarda en el disco.

Cuando un cliente solicita un secreto del servidor de la API de Kubernetes, se revierte el proceso descrito anteriormente.

Rotación de claves

Las KEK que encriptan los secretos no se rotan y mantienen el secreto durante toda su vida. Para garantizar que una KEK diferente una un secreto, rota la KEK y, luego, crea un secreto nuevo.

Por ejemplo, crea y almacena un secreto, Secret1. Está encriptado con DEK1, que, a su vez, está unida con KEKv1. Antes de que KEKv1 rote, se crea otro secreto, Secret2. Secret2 obtiene su propia clave, DEK2. KEKv1 se utiliza nuevamente para encriptar la DEK.

Después de que la KEK rota, creamos otro secreto, Secret3, que se encripta con DEK3. DEK3, a su vez, está encriptada con KEKv2, la KEK rotada.

A fin de obtener instrucciones para rotar manualmente las KEK que encriptan tus secretos, consulta la página sobre cómo volver a encriptar tus secretos.

¿Qué sucede cuando destruyes una clave?

Cuando destruyes una clave en Cloud KMS que se utilizó para encriptar un secreto en GKE, ese secreto ya no está disponible. A menos que se use una proyección de volumen de token de cuenta de servicio, las cuentas de servicio que utiliza GKE también usan secretos y, si se destruye una clave, no estarán disponibles. La imposibilidad de acceder a ellas significa que el clúster no podrá iniciarse.

Antes de destruir una clave, se recomienda que verifiques si tu clúster la está utilizando. También puedes crear una política de alertas para la destrucción de claves en Cloud KMS.

Antes de comenzar

  • Para realizar los ejercicios de este tema, necesitas dos proyectos de Google Cloud Platform.

    • Proyecto clave: aquí es donde creas una clave de encriptación de clave.

    • Proyecto de clúster: aquí es donde creas un clúster que habilita la encriptación de secretos de la capa de la aplicación.

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

    Habilitar la API de Cloud KMS

  • En tu proyecto 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 información en la sección Otorga permisos para administrar claves en la documentación de Cloud KMS.

  • En tu proyecto de clúster, asegúrate de que habilitaste la API de Google Kubernetes Engine.

    Habilitar la API de Google Kubernetes Engine

  • 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

Cuando crees el llavero de claves, especifica una ubicación que coincida con la ubicación de tu 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 en la zona us-central1-a solo puede usar una clave 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.

Puedes usar Google Cloud Platform Console o el comando de gcloud.

Console

En tu proyecto clave, crea un llavero de claves:

  1. Ve a la página Claves criptográficas de GCP 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 Platform

  5. Haz clic en Crear (Create).

A continuación, crea una clave:

  1. Ve a la página Claves criptográficas de GCP 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 (Key name).

  5. Acepta los valores predeterminados de Período de rotación (Rotation period) y A partir de (Starting on), o define un período de rotación de clave y hora de inicio si quieres usar valores diferentes.

  6. En el campo Etiquetas (Labels), haz clic en Agregar etiqueta (Add label) si deseas agregar etiquetas a tu clave. [Opcional]

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

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

  7. Haz clic en Crear (Create).

gcloud

En tu proyecto clave, crea un llavero de claves:

gcloud kms keyrings create [RING_NAME] \
    --location [LOCATION] \
    --project [KEY_PROJECT_ID]

donde:

  • [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 tu ID del proyecto clave.

Crea una clave:

gcloud kms keys create [KEY_NAME] \
    --location [LOCATION] \
    --keyring [RING_NAME] \
    --purpose encryption \
    --project [KEY_PROJECT_ID]

donde:

  • [KEY_NAME] es un nombre que eliges para tu clave.
  • [LOCATION] es la región donde creaste tu llavero de claves.
  • [RING_NAME] es el nombre de tu llavero de claves.
  • [KEY_PROJECT_ID] es tu ID del proyecto clave.

Concede permisos para usar la clave

La cuenta de servicio de GKE en tu proyecto de clúster tiene este nombre:

service-[CLUSTER_PROJECT_NUMBER]@container-engine-robot.iam.gserviceaccount.com

donde [CLUSTER_PROJECT_NUMBER] es el número de proyecto de tu clúster.

Para otorgar acceso a la cuenta de servicio, puedes usar Google Cloud Platform Console o el comando de gcloud.

Console

Otorga a tu cuenta de servicio de GKE la función de encriptador/desencriptador de clave criptográfica de Cloud KMS:

  1. Abre el navegador de las claves de Cloud Key Management Service en Google Cloud Platform Console.
    Abrir el navegador de las 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 GKE a la que le estás otorgando acceso.

  5. En el menú desplegable Seleccionar una función, selecciona Encriptador/desencriptador de clave criptográfica de Cloud KMS.

  6. Haz clic en Guardar.

gcloud

Otorga a tu cuenta de servicio de GKE la función de encriptador/desencriptador de clave criptográfica de Cloud KMS:

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]

donde:

  • [KEY_NAME] es el nombre de tu clave.
  • [LOCATION] es la región donde creaste tu llavero de claves.
  • [RING_NAME] es el nombre de tu llavero de claves.
  • [SERVICE_ACCOUNT_NAME] es el nombre de tu cuenta de servicio de GKE.
  • [KEY_PROJECT_ID] es tu ID del proyecto clave.

Habilita la encriptación de secretos de la capa de la aplicación

En un clúster nuevo

Puedes crear un clúster nuevo con Google Cloud Platform Console o el comando de gcloud.

Console

  1. Ve al menú de Google Kubernetes Engine en GCP Console.

    Visitar el menú de Google Kubernetes Engine

  2. Haz clic en Crear clúster.

  3. Configura el clúster y los grupos de nodos como desees. Antes de guardar, selecciona Disponibilidad, redes, seguridad y características adicionales.

  4. Selecciona Habilitar encriptación de secretos de la capa de la aplicación y elige la clave de encriptación de base de datos que creaste en la creación de una clave de Cloud KMS.

  5. Continúa configurando tu clúster y guarda los cambios.

gcloud

Para crear un clúster compatible con la encriptación de secretos de la capa de la aplicación, especifica un valor para el parámetro --database-encryption-key en tu comando de creación. Usa la versión del clúster v1.11.2 o posterior:

gcloud beta container clusters create [CLUSTER_NAME] \
  --cluster-version=latest \
  --zone [ZONE] \
  --database-encryption-key projects/[KEY_PROJECT_ID]/locations/[LOCATION]/keyRings/[RING_NAME]/cryptoKeys/[KEY_NAME] \
  --project [CLUSTER_PROJECT_ID]

donde:

  • [CLUSTER_NAME] es un nombre que eliges para tu 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.
  • [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.

En un clúster existente

Puedes actualizar un clúster existente para usar la encriptación de secretos de la capa de la aplicación siempre que una de las siguientes afirmaciones sea verdadera:

  • La versión del clúster es superior o igual que v1.11.9 y menor que v1.12.0.
  • La versión del clúster es superior o igual que v1.12.7.

Puedes usar Google Cloud Platform Console o el comando de gcloud.

Console

Para actualizar un clúster a fin de admitir la encriptación de secretos de la capa de la aplicación, haz lo siguiente:

  1. Dirígete al menú de Google Kubernetes Engine en GCP Console.

    Ir al menú de Google Kubernetes Engine

  2. Haz clic en el ícono Editar para el clúster que deseas modificar. Parece un lápiz.

  3. Habilita la encriptación de secretos de la capa de la aplicación y elige la clave de encriptación de la base de datos que creaste durante la creación de una clave para KMS Cloud.

  4. Haz clic en Guardar.

gcloud

Para habilitar las encriptaciones de secretos de la capa de la aplicación en un clúster existente, ejecuta el siguiente comando:

gcloud beta container clusters update [CLUSTER_NAME] \
  --zone [ZONE] \
  --database-encryption-key projects/[KEY_PROJECT_ID]/locations/[LOCATION]/keyRings/[RING_NAME]/cryptoKeys/[KEY_NAME] \
  --project [CLUSTER_PROJECT_ID]

donde:

  • [CLUSTER_NAME] es un nombre que eliges para tu 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.
  • [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.

Inhabilita la encriptación de secretos de la capa de la aplicación

Puedes actualizar un clúster existente para dejar de usar la encriptación de secretos de la capa de la aplicación siempre que una de las siguientes afirmaciones sea verdadera:

  • La versión del clúster es superior o igual que v1.11.9 y menor que v1.12.0.
  • La versión del clúster es superior o igual que v1.12.7.

Puedes usar Google Cloud Platform Console o el comando de gcloud.

Console

  1. Dirígete al menú de Google Kubernetes Engine en GCP Console.

    Ir al menú de Google Kubernetes Engine

  2. Haz clic en el ícono Editar para el clúster que deseas modificar. Parece un lápiz.

  3. Inhabilita la encriptación de secretos de la capa de la aplicación.

  4. Haz clic en Guardar.

gcloud

Para inhabilitar la encriptación de secretos de la capa de la aplicación, ejecuta el siguiente comando:

gcloud beta container clusters update [CLUSTER_NAME] \
  --zone [ZONE] \
  --disable-database-encryption \
  --project [CLUSTER_PROJECT_ID]

donde:

  • [CLUSTER_NAME] es un nombre que eliges para tu clúster.
  • [ZONE] es la zona en la que deseas crear el clúster.
  • [CLUSTER_PROJECT_ID] es el ID del proyecto del clúster.

Verifica que la encriptación de secretos de la capa de la aplicación esté habilitada

Puedes comprobar si un clúster usa la encriptación de secretos de la capa de la aplicación mediante Google Cloud Platform Console o el comando de gcloud.

Console

  1. Dirígete al menú de Google Kubernetes Engine en GCP Console.

    Ir al menú de Google Kubernetes Engine

  2. Haz clic en el nombre del clúster que deseas modificar. Se abre la página Detalles del clúster.

  3. Verifica que la encriptación de secretos de la capa de la aplicación esté habilitada y que se indica la clave correcta.

gcloud

Verifica si un clúster está utilizando la encriptación de secretos de la capa de la aplicación:

gcloud beta container clusters describe [CLUSTER_NAME] \
  --zone [COMPUTE_ZONE] \
  --format 'value(databaseEncryption)' \
  --project [CLUSTER_PROJECT_ID]

donde:

  • [CLUSTER_NAME] es el nombre de un clúster existente.
  • [COMPUTE_ZONE] es el nombre de la zona del clúster.
  • [CLUSTER_PROJECT_ID] es el ID del proyecto del clúster.

Si el clúster usa la encriptación de secretos de la capa de la aplicación, la respuesta contiene EncryptionConfig:

keyName=projects/[PROJECT]/locations/[LOCATION]/keyRings/[RING_NAME]/cryptoKeys/[KEY_NAME];state=ENCRYPTED

Limitaciones

Ubicación de la clave

Debes seleccionar una clave en la misma región que el clúster en el que se usa. Por ejemplo, un clúster zonal en us-central1-a solo puede usar una clave en la región us-central1. Para los clústeres regionales, las claves deben estar en la misma ubicación a fin de disminuir la latencia y evitar que los recursos dependan de los servicios distribuidos en varios dominios con fallas.

Vuelve a encriptar tus secretos

En este momento, no hay forma de forzar una nueva encriptación automática de tus secretos. Si lo deseas, puede rotar manualmente tu KEK si creas una nueva versión clave:

gcloud kms keys versions create --location [LOCATION] \
   --keyring [RING_NAME] \
   --key [KEY_NAME] \
   --primary \
   --project [KEY_PROJECT_ID]

Luego, obligas a GKE a volver a encriptar tocando cada secreto:

kubectl get secrets --all-namespaces -o json | kubectl replace -f -

Configuración de la encriptación

En este momento, solo las claves de Cloud KMS son compatibles con GKE. No puedes utilizar otro proveedor de KMS de Kubernetes ni otro proveedor de encriptación.

¿Qué sigue?

¿Te ha resultado útil esta página? Enviar comentarios:

Enviar comentarios sobre...

Documentación de Kubernetes Engine