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). Esta característica se basa en la funcionalidad de Cloud KMS, por lo que deberías familiarizarte con la rotación de claves y la encriptación de sobre.

Las siguientes versiones de GKE admiten la actualización de clústeres existentes para habilitar la encriptación de secretos en la capa de la aplicación:

  • GKE 1.11: v1.11.10 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 en la capa de la aplicación proporciona más seguridad para los datos sensibles, como los secretos, que se almacenan en etcd. Con esta función, 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 usa una clave local, que se suele llamar clave de encriptación de datos (DEK), para encriptar los secretos. La DEK está encriptada con otra clave llamada clave de encriptación de claves. 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 con mayor facilidad la práctica recomendada de la rotación normal de claves, sin generar 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 usar una raíz de confianza central para todos tus secretos, por ejemplo, un módulo de seguridad de hardware, y que un adversario que acceda a tus contenedores fuera de línea no pueda obtener tus secretos.

Con la encriptación de secretos en la capa de la aplicación de GKE, se encriptan localmente los secretos con el proveedor AES‑CBC y las DEK locales. Las DEK se encriptan con una clave de encriptación de claves 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 de manera local para encriptar el secreto.

  • El complemento de KMS envía la DEK a Cloud KMS para realizar la encriptación. El complemento de KMS usa la cuenta de servicio de GKE del proyecto para autenticarse en Cloud KMS.

  • Cloud KMS encripta la DEK y la envía de vuelta al complemento de 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 ya descrito.

¿Qué sucede cuando borras una clave?

Cuando destruyes una clave de Cloud KMS que se utilizó para encriptar un secreto de GKE, el secreto dejará de estar 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 borrar una clave, te recomendamos que verifiques si la está usando un clúster. 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.

    • Proyecto de clave: Aquí crearás una clave de encriptación de claves.

    • Proyecto de clúster: Aquí crearás un clúster que habilita la encriptación de secretos en la capa de la aplicación.

  • 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 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 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 ubicado 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 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 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 (Create).

A continuación, crea una clave:

  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 (Create).

gcloud

En tu proyecto clave, crea un llavero de claves:

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

En el ejemplo anterior, se ilustra lo siguiente:

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

En el ejemplo anterior se ilustra lo siguiente: [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 Console o el comando de gcloud.

console

Otorga a tu cuenta de servicio de GKE la función Encriptador/Desencriptador de CryptoKeys de Cloud KMS:

  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 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 Encriptador/Desencriptador de CryptoKeys 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 Console o con el comando de gcloud.

console

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

    Ir al menú 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, herramientas de red, seguridad y características adicionales.

  4. Selecciona Habilitar la encriptación de secretos en la capa de la aplicación y elige la clave de encriptación de base de datos que creaste en el paso Crea 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.

gcloud 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]

En el ejemplo anterior, se ilustra lo siguiente:

  • [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 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 Cloud Console.

    Ir al menú Google Kubernetes Engine

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

  3. Activa Habilitar la encriptación de secretos en la capa de la aplicación y elige la clave de encriptación de la base de datos que creaste en el paso Crea una clave de Cloud KMS.

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

En el ejemplo anterior, se ilustra lo siguiente:

  • [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 Console o el comando de gcloud.

console

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

    Ir al menú 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 container clusters update [CLUSTER_NAME] \
  --zone [ZONE] \
  --disable-database-encryption \
  --project [CLUSTER_PROJECT_ID]

En el ejemplo anterior, se ilustra lo siguiente:

  • [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 Console o el comando de gcloud.

console

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

    Ir al menú 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 container clusters describe [CLUSTER_NAME] \
  --zone [COMPUTE_ZONE] \
  --format 'value(databaseEncryption)' \
  --project [CLUSTER_PROJECT_ID]

En el ejemplo anterior, se ilustra lo siguiente:

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

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 a KEKv1. Antes de que KEKv1 rote, debes crear otro secreto, Secret2. Secret2 obtiene su propia clave, DEK2. KEKv1 se vuelve a usar a fin de 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 de forma manual las KEK que encriptan tus secretos, consulta la página sobre cómo volver a encriptar tus secretos.

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, debes hacer que GKE se vuelva a encriptar. Para esto, toca 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.

Pasos siguientes