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:
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. Debes usar una clave administrada con Cloud KMS para encriptar datos en reposo 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:
- Rendimiento mejorado en comparación con la encriptación de claves públicas: GKE solo usa la API de Cloud KMS para encriptar DEK nuevas con la KEK o desencriptar una DEK cuando la caché local está vacía.
- Mejor administración de claves a gran escala: una sola KEK puede encriptar varias DEK. La cantidad de claves que necesitas almacenar en el servicio de Cloud KMS es mucho menor que la cantidad de claves que encriptan tus datos.
- Capacidad de usar una raíz de confianza central: Los Secrets 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. Un adversario que accede a tus contenedores sin conexión no puede obtener tus Secrets.
Con la encriptación de secretos de la capa de la aplicación en GKE, GKE encripta tus secretos con las DEK locales y el proveedor de AES-CBC. GKE encripta las DEK con una KEK 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 de KMS usa la cuenta de servicio de GKE del proyecto para autenticarse en Cloud KMS.
Cloud KMS encripta la DEK con la KEK y la envía de vuelta al complemento de KMS.
El servidor de la API de Kubernetes guarda el Secret encriptado y la DEK encriptada. La DEK de texto sin formato no se guarda en un disco y solo se almacena en la memoria del servidor de la API.
El servidor de la API de Kubernetes crea una entrada de caché que asigna la DEK encriptada a la DEK de texto simple en la memoria. 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:
El servidor de la API de Kubernetes recupera el Secret encriptado y la DEK encriptada.
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.
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.
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. De manera opcional, puedes conservar la versión anterior de KEK para evitar volver a encriptar los Secrets, pero se te seguirá facturando por todas las KEK activas en Cloud KMS. Para obtener detalles sobre los precios, consulta Precios de Cloud KMS.
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 una de las siguientes situaciones:
- 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.
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.
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ónus-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ónasia-northeast1
.
Puedes usar la CLI de gcloud o la consola de Google Cloud.
Consola
Crea un llavero de claves en el proyecto de clave:
Ve a la página Administración de claves en la consola de Google Cloud.
Haz clic en Crear llavero de claves.
En el campo Nombre del llavero de claves, ingresa el nombre de tu llavero de claves.
En la lista desplegable Ubicación, selecciona la ubicación de tu clúster de Kubernetes.
Haga clic en Crear.
A continuación, crea una clave:
Ve a la página Administración de claves en la consola de Google Cloud.
Haz clic en el nombre del llavero de claves para el que crearás la clave.
Haz clic en Crear clave.
Ingresa el nombre en el campo Nombre de la clave (Key name).
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.
Opcionalmente, si deseas agregar etiquetas a tu clave, haz clic en Agregar etiqueta en el campo Etiquetas.
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:
- Abre el navegador de claves de Cloud Key Management Service en la consola de Google Cloud.
Abrir el navegador de claves de Cloud KMS Haz clic en el nombre del llavero de claves que contiene la clave que desees.
Selecciona la casilla de verificación de la clave que deseas.
La pestaña Permisos en el panel de la ventana derecha estará disponible.
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.
En el menú desplegable Seleccionar una función, selecciona Encriptador/desencriptador de clave criptográfica de Cloud KMS.
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:
Ve a la página de Google Kubernetes Engine en la consola de Google Cloud.
Haz clic en add_box Crear.
En la sección Autopilot, haz clic en Configurar.
Configura tu clúster como desees.
En el panel de navegación, haz clic en Opciones avanzadas y expande la sección Seguridad.
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.
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:
Ve a la página de Google Kubernetes Engine en la consola de Google Cloud.
Haz clic en add_box Crear.
En la sección Estándar, haz clic en Configurar.
Configura tu clúster como desees.
En el panel de navegación, en Clúster, haz clic en Seguridad.
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.
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:
Ve a la página de Google Kubernetes Engine en la consola de Google Cloud.
Haz clic en el nombre del clúster que deseas modificar.
En Seguridad, en el campo Encriptación de Secrets de la capa de la aplicación, haz clic en edit Editar encriptación de Secrets en la capa de la aplicación.
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.
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:
Ve a la página de Google Kubernetes Engine en la consola de Google Cloud.
Haz clic en el nombre del clúster que deseas modificar.
En Seguridad, en el campo Encriptación de Secrets de la capa de la aplicación, haz clic en edit Editar encriptación de Secrets en la capa de la aplicación.
Selecciona la clave de encriptación nueva que deseas usar.
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
Ve a la página de Google Kubernetes Engine en la consola de Google Cloud.
Haz clic en el nombre del clúster que deseas modificar.
En Seguridad, en el campo Encriptación de Secrets de la capa de la aplicación, haz clic en edit Editar encriptación de Secrets en la capa de la aplicación.
Desmarca la casilla de verificación Habilitar encriptación de Secrets de la capa de la aplicación.
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:
CLUSTER_NAME
: El nombre de tu clúster.COMPUTE_REGION
: La región de Compute Engine del clúster.CLUSTER_PROJECT_ID
: Es el ID del proyecto de tu 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 la consola de Google Cloud o la CLI de gcloud.
Consola
Ve a la página de Google Kubernetes Engine en la consola de Google Cloud.
Haz clic en el nombre del clúster que deseas modificar.
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:
CLUSTER_NAME
: El nombre de tu clúster.COMPUTE_REGION
: La región de Compute Engine del clúster.CLUSTER_PROJECT_ID
: Es el ID del proyecto de tu clúster.
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ónus-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
Para obtener más información acerca de la solución de problemas de encriptación de Secrets de la capa de aplicación, incluida la resolución de problemas con actualizaciones de encriptación de Secrets con errores, consulta Soluciona problemas de encriptación de Secrets de la capa de aplicación.
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 Secrets a nivel de la aplicación.
Para volver a habilitar una clave inhabilitada, consulta Habilita una versión de clave inhabilitada.
¿Qué sigue?
- Obtén más información sobre los secretos en Kubernetes.
- Obtén más información sobre la administración secreta con Cloud KMS.
- Aprende a endurecer tu clúster.