Encriptar Secrets en la capa de la aplicación


Obtén información sobre cómo encriptar Secrets 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.


Para seguir la guía paso a paso sobre esta tarea directamente en la consola de Google Cloud, haz clic en Guiarme:

GUIARME


Descripción general

De forma predeterminada, Google Kubernetes Engine (GKE) encripta el contenido del cliente almacenado en reposo, incluidos los Secrets. 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. Puedes usar una clave que tenga cualquiera de los niveles de protección compatibles con Cloud KMS.

Asegúrate de que la clave se encuentre en la misma ubicación que el clúster para disminuir la latencia y evitar que los recursos dependan de los servicios distribuidos en varios dominios con fallas. Después de crear una clave, puedes habilitar la función en un clúster nuevo o existente cuando especificas la clave que deseas usar. Cuando habilitas la función, GKE encripta todos los Secrets nuevos y existentes mediante tu clave de encriptación.

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 (KEK). Kubernetes no almacena la KEK.

La encriptación de sobre tiene los siguientes beneficios:

  • La KEK se puede rotar sin necesidad de volver a encriptar todos los Secrets. 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 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 sin conexión 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:

  1. 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.

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

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

  4. Cloud KMS encripta la DEK con la KEK y la envía de vuelta al complemento de KMS.

  5. El servidor de la API de Kubernetes guarda el secreto y la DEK encriptados. La DEK sin formato no se guarda en el disco.

  6. El servidor de la API de Kubernetes crea una entrada de caché que asigna la DEK encriptada a la DEK de texto simple. Esto permite que el servidor de la API desencripte el Secret sin usar Cloud KMS.

Cuando un cliente solicita un Secret del servidor de la API de Kubernetes, sucede lo siguiente:

  1. El servidor de la API de Kubernetes recupera el Secret encriptado y la DEK encriptada.

  2. El servidor de la API de Kubernetes verifica la caché para encontrar una entrada de asignación existente y desencripta el Secret sin usar Cloud KMS.

  3. Si no se encuentra una entrada de caché, el complemento KMS envía la DEK a Cloud KMS para su desencriptación con KEK. La DEK desencriptada se usa para desencriptar el Secret.

  4. El servidor de la API de Kubernetes muestra el Secret desencriptado al cliente.

¿Qué sucede cuando borras una clave?

Cuando destruyes una KEK en Cloud KMS que se usó para encriptar un Secret en GKE, el secreto ya no está disponible, a menos que actualices el clúster para usar primero una KEK nueva.

Si planeas destruir una versión anterior de KEK después de una rotación de claves, primero usa la versión de KEK nueva para volver a encriptar el Secret.

A menos que se use una proyección de volumen de token de cuenta de servicio, las cuentas de servicio que usan las cargas de trabajo en GKE también usan Secrets y, si se destruye una clave, no estarán disponibles. La imposibilidad de acceder a ellas significa que las cargas de trabajo fallarán.

Se aplican las siguientes excepciones:

  • Los Pods con acceso existente a los Secrets como volúmenes activados o variables de entorno conservan el acceso.

  • El servidor de la API de Kubernetes aún puede usar entradas de asignación de DEK en caché para desencriptar un Secret después de destruir la KEK. Esto permite que los pods reiniciados o reprogramados accedan al Secret, a menos que ocurra lo siguiente:

    • El plano de control del clúster se reinicia.
    • El Pod del servidor de la API de Kubernetes se reinicia.
    • La entrada de asignación de DEK para el Secret no está en la caché del servidor de la API de Kubernetes.

Antes de destruir una KEK, verifica 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 clave: aquí es donde creas una KEK.

    • 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 tu proyecto 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 IAM:

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

    Estos permisos (y muchos otros) se otorgan a la función predefinida roles/cloudkms.admin de administración de identidades y accesos. Puedes obtener más detalles en la sección Otorga permisos para administrar claves de 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 Google Cloud CLI.

  • Actualiza gcloud a la versión más reciente:

    gcloud components update

Crea una clave de Cloud KMS

Para crear una clave de Cloud KMS, primero debes crear un llavero de claves. Las claves y los llaveros de claves son recursos regionales. Cuando crees un llavero de claves, especifica una ubicación que coincida con la ubicación del 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 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.

Puedes usar la CLI de gcloud o la consola de Google Cloud.

Consola

Crea un llavero de claves en el proyecto de clave:

  1. Ve a la página Administración de claves en la consola de Google Cloud.

    Ir a Key Management

  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.

  5. Haga clic en Crear.

A continuación, crea una clave:

  1. Ve a la página Administración de claves en la consola de Google Cloud.

    Ir a Key Management

  2. Haz clic en el nombre del llavero de claves para el que crearás la 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 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. Opcionalmente, si deseas agregar etiquetas a tu clave, haz clic en Agregar etiqueta en el campo Etiquetas.

  7. Haga clic en Crear.

gcloud

En tu proyecto clave, crea un llavero de claves:

gcloud kms keyrings create RING_NAME \
    --location=LOCATION \
    --project=KEY_PROJECT_ID

Reemplaza lo siguiente:

  • RING_NAME: Es el nombre del llavero de claves nuevo.
  • LOCATION: es la ubicación en la que deseas crear el llavero de claves.
  • KEY_PROJECT_ID: Es el ID del proyecto de claves.

Crea una clave:

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

Reemplaza lo siguiente:

  • KEY_NAME: Es el nombre de tu clave nueva.
  • LOCATION: Es la ubicación de Cloud KMS en la que creaste el llavero de claves.
  • RING_NAME: Es el nombre del llavero de claves.
  • KEY_PROJECT_ID: Es el ID del proyecto de claves.

Concede permisos para usar la clave

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

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

Reemplaza CLUSTER_PROJECT_NUMBER por el número de proyecto del clúster. Para encontrar el número del proyecto con la CLI de gcloud, ejecuta el siguiente comando:

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

Para otorgar acceso a la cuenta de servicio, puedes usar la consola de Google Cloud o la CLI de gcloud.

Consola

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 la consola de Google Cloud.
    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

Reemplaza lo siguiente:

  • KEY_NAME: Es el nombre de la clave.
  • LOCATION: Es la ubicación de Cloud KMS en la que creaste el llavero de claves.
  • RING_NAME: Es el nombre del llavero de claves.
  • SERVICE_ACCOUNT_NAME: Es el nombre de la cuenta de servicio.
  • KEY_PROJECT_ID: Es el ID del proyecto de claves.

Asegúrate de que la clave tenga suficiente cuota si es una clave de Cloud HSM

Si usas una clave de Cloud HSM, el proyecto de Google Cloud que contiene la clave está limitado por tu cuota de clave. Asegúrate de tener suficiente cuota para usar tus claves de Cloud HSM con la encriptación de secretos de la capa de la aplicación. Si se agota la cuota, es posible que los nodos pierdan conectividad con el plano de control del clúster.

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

Puedes habilitar la encriptación de Secrets de la capa de la aplicación en clústeres nuevos o existentes de GKE Standard y GKE Autopilot con la CLI de gcloud o la consola de Google Cloud.

Después de habilitar la encriptación de Secrets de la capa de la aplicación, te recomendamos que realices una rotación de claves. Puedes configurar la rotación de claves automática en Cloud KMS. Para obtener instrucciones, consulta Configura la rotación automática.

En un clúster nuevo

Puedes crear un clúster nuevo con encriptación habilitada de Secrets de la capa de la aplicación mediante la consola de Google Cloud o la CLI de gcloud.

Console - Autopilot

Para crear un clúster de Autopilot con encriptación de secretos de la capa de la aplicación habilitada, sigue estos pasos:

  1. Ve a la página de Google Kubernetes Engine en la consola de Google Cloud.

    Ir a Google Kubernetes Engine

  2. Haz clic en Crear.

  3. En la sección Autopilot, haz clic en Configurar.

  4. Configura tu clúster como desees.

  5. En el panel de navegación, haz clic en Opciones avanzadas y expande la sección Seguridad.

  6. Selecciona la casilla de verificación Habilitar encriptación de Secrets de la capa de la aplicación y elige la clave que creaste en Crea una clave de Cloud KMS.

  7. Haz clic en Crear.

Console - Estándar

Para crear un clúster estándar con la encriptación de secretos de la capa de la aplicación habilitada, sigue estos pasos:

  1. Ve a la página de Google Kubernetes Engine en la consola de Google Cloud.

    Ir a Google Kubernetes Engine

  2. Haz clic en Crear.

  3. En la sección Estándar, haz clic en Configurar.

  4. Configura tu clúster como desees.

  5. En el panel de navegación, en Clúster, haz clic en Seguridad.

  6. Selecciona la casilla de verificación Habilitar encriptación de Secrets de la capa de la aplicación y elige la clave que creaste en Crea una clave de Cloud KMS.

  7. Haga clic en Crear.

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-auto CLUSTER_NAME \
    --cluster-version=latest \
    --region=COMPUTE_REGION \
    --database-encryption-key=projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME \
    --project=CLUSTER_PROJECT_ID

Reemplaza lo siguiente:

  • CLUSTER_NAME: es el nombre que eliges para el clúster.
  • COMPUTE_REGION: Es la región de procesamiento en la que deseas crear el clúster.
  • KEY_PROJECT_ID: Es el ID del proyecto de claves.
  • LOCATION: Es la ubicación de Cloud KMS en la que creaste el 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 de tu clúster.

Puedes habilitar la encriptación de secretos de la capa de la aplicación en un clúster estándar nuevo con el comando gcloud container clusters create con las mismas marcas.

En un clúster existente

Puedes usar la CLI de gcloud o la consola de Google Cloud a fin de actualizar un clúster existente para que use la encriptación de Secrets de la capa de la aplicación. GKE encripta todos tus secretos nuevos y existentes mediante tu clave de encriptación especificada.

Consola

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. Ve a la página de Google Kubernetes Engine en la consola de Google Cloud.

    Ir a Google Kubernetes Engine

  2. Haz clic en el nombre del clúster que deseas modificar.

  3. En Seguridad, en el campo Encriptación de Secrets de la capa de la aplicación, haz clic en Editar encriptación de Secrets en la capa de la aplicación.

  4. Selecciona la casilla de verificación Habilitar encriptación de Secrets de la capa de la aplicación y elige la clave que creaste en Crea una clave de Cloud KMS.

  5. Haz clic en Save Changes.

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 \
    --region=COMPUTE_REGION \
    --database-encryption-key=projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME \
    --project=CLUSTER_PROJECT_ID

Reemplaza lo siguiente:

  • CLUSTER_NAME: El nombre de tu clúster.
  • COMPUTE_REGION: La región de Compute Engine del clúster.
  • KEY_PROJECT_ID: Es el ID del proyecto de claves.
  • LOCATION: Es la ubicación de Cloud KMS en la que creaste el 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 de tu clúster.

Actualiza una clave de Cloud KMS

Puedes usar la CLI de gcloud o la consola de Google Cloud para actualizar un clúster existente a fin de usar una clave de Cloud KMS nueva.

Consola

Para actualizar un clúster a fin de usar una clave de Cloud KMS nueva, sigue estos pasos:

  1. Ve a la página de Google Kubernetes Engine en la consola de Google Cloud.

    Ir a Google Kubernetes Engine

  2. Haz clic en el nombre del clúster que deseas modificar.

  3. En Seguridad, en el campo Encriptación de Secrets de la capa de la aplicación, haz clic en Editar encriptación de Secrets en la capa de la aplicación.

  4. Selecciona la clave de encriptación nueva que deseas usar.

  5. Haz clic en Save Changes.

gcloud

Actualiza tu clúster existente para usar una clave de Cloud KMS nueva:

gcloud container clusters update CLUSTER_NAME \
    --region=COMPUTE_REGION \
    --database-encryption-key=projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME \
    --project=CLUSTER_PROJECT_ID

Reemplaza lo siguiente:

  • CLUSTER_NAME: El nombre de tu clúster.
  • COMPUTE_REGION: La región de Compute Engine del clúster.
  • KEY_PROJECT_ID: Es el ID del proyecto de claves.
  • LOCATION: Es la ubicación de Cloud KMS en la que creaste el 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 de tu clúster.

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

Para inhabilitar la encriptación de Secrets de la capa de la aplicación, puedes usar la CLI de gcloud o la consola de Google Cloud.

Consola

  1. Ve a la página de Google Kubernetes Engine en la consola de Google Cloud.

    Ir a Google Kubernetes Engine

  2. Haz clic en el nombre del clúster que deseas modificar.

  3. En Seguridad, en el campo Encriptación de Secrets de la capa de la aplicación, haz clic en Editar encriptación de Secrets en la capa de la aplicación.

  4. Desmarca la casilla de verificación Habilitar encriptación de Secrets de la capa de la aplicación.

  5. Haz clic en Save Changes.

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 \
    --region=COMPUTE_REGION \
    --disable-database-encryption \
    --project=CLUSTER_PROJECT_ID

Reemplaza lo siguiente:

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 la consola de Google Cloud o la CLI de gcloud.

Consola

  1. Ve a la página de Google Kubernetes Engine en la consola de Google Cloud.

    Ir a Google Kubernetes Engine

  2. Haz clic en el nombre del clúster que deseas modificar.

  3. En Seguridad, verifica que el campo Encriptación de secretos de la capa de la aplicación muestre Enabled y enumere 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 \
    --region=COMPUTE_REGION \
    --format='value(databaseEncryption)' \
    --project=CLUSTER_PROJECT_ID

Reemplaza lo siguiente:

Si el clúster usa la encriptación de Secrets de la capa de aplicación, el resultado es similar al siguiente:

keyName=projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME;state=ENCRYPTED

Rota tus claves

Te recomendamos que rotes las claves con regularidad, incluso después de habilitar la encriptación de los Secrets de la capa de la aplicación. Si deseas obtener instrucciones para configurar la rotación automática de claves o rotar las claves de forma manual, consulta Rota claves.

Cuando realizas una rotación de claves, tus Secrets existentes permanecen encriptados con la versión de clave de encriptación de claves anterior (KEK). Para garantizar que una versión KEK más nueva encapsula un Secret, vuelve a encriptar el Secret después de la rotación de claves.

Por ejemplo, crea y almacena un secreto, Secret1. Está encriptado con DEK1, que, a su vez, está unida a KEKv1.

Después de que la KEK rota, debes volver a encriptar Secret1 para que se una por DEK2, que, a su vez, se une con KEKv2, la KEK rotada.

Vuelve a encriptar tus Secrets

Después de realizar una rotación de claves, debes volver a encriptar tus secretos para unirlos con la nueva versión de la KEK. Si bien no puedes configurar la reencriptación automática con la CLI de gcloud, puedes, por ejemplo, usar un CronJob para ejecutar el comando de reencriptación en intervalos regulares.

Para volver a encriptar manualmente tus secretos después de una rotación de claves, espera al menos tres horas hasta que la nueva versión sea coherente. Luego, toca cada secreto para forzar la nueva encriptación con un comando como el siguiente:

kubectl get secrets --all-namespaces -o json | kubectl annotate --overwrite -f - encryption-key-rotation-time="TIME"

Reemplaza TIME por una string que indique cuándo ocurre la rotación (por ejemplo, 20200909-090909).

Limitaciones

  • GKE admite hasta 30,000 Secrets por clúster para la encriptación de Secrets en la capa de la aplicación. Si almacenas más de 30,000 Secrets, es posible que el clúster se vuelva inestable en el momento de la actualización, lo que generaría una posible interrupción de las cargas de trabajo.
  • Asegúrate de que el tamaño promedio de los metadatos de un Secret en cada espacio de nombres sea inferior a 5 KiB. Si el tamaño promedio de los metadatos supera los 5 KiB, puede que tu clúster ingrese a un mal estado, en el que algunos Secrets se encriptan mientras que otros se desencriptan después de habilitar o inhabilitar la función.
  • Debes seleccionar una clave en la misma región que el clúster. 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.

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

Soluciona problemas

La clave de Cloud KMS está inhabilitada.

La cuenta de servicio predeterminada de GKE no puede usar una clave de Cloud KMS inhabilitada para la encriptación de secretos a nivel de la aplicación.

Para volver a habilitar una clave inhabilitada, consulta Habilita una versión de clave inhabilitada.

¿Qué sigue?