En este instructivo, se muestra cómo encriptar Secrets de Kubernetes en la capa de aplicación con una clave que administras en Cloud Key Management Service (Cloud KMS). El proceso de encriptación de Secrets proporciona una capa adicional de seguridad para las cargas de trabajo sensibles.
Esta página está dirigida a especialistas en seguridad que desean encriptar Secrets. Para obtener más información sobre los roles comunes y las tareas de ejemplo a las que hacemos referencia en el contenido de Google Cloud , consulta Roles y tareas comunes del usuario de GKE.
Antes de leer este documento, asegúrate de estar familiarizado con los siguientes conceptos:
Para seguir la guía paso a paso sobre esta tarea directamente en la consola 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 Secrets en la capa de aplicación proporciona una capa adicional de seguridad para los datos sensibles almacenados en la base de datos de estado del clúster. Cuando está habilitada, usas una clave administrada con Cloud KMS para encriptar estos datos en la capa de aplicación.
En la versión 1.35 de GKE o posterior, los recursos específicos de Kubernetes que se encriptan dependen del almacén de pares clave-valor que aloja el estado del clúster, de la siguiente manera:
- Spanner: La encriptación de Secrets a nivel de la aplicación encripta todos los objetos de la API de Kubernetes.
- etcd: La encriptación de Secrets de la capa de aplicación encripta principalmente los Secrets.
Para usar la encriptación de Secrets de la capa de aplicación, primero debes crear una clave de Cloud KMS y otorgarle al agente de servicio de Kubernetes Engine 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 los objetos en la base de datos de estado del clúster con tu clave de encriptación. Los tipos de API específicos que se encriptan dependen del almacén de pares clave-valor que use tu clúster, como se describe en la lista anterior.
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 se encriptan los datos
Cuando creas un recurso de Kubernetes nuevo apto para el encriptado, sucede lo siguiente:
GKE genera una DEK con un generador de números aleatorios.
GKE encripta los datos de forma local en el plano de control con esta DEK.
GKE envía la DEK a Cloud KMS para encriptarla. Esta operación usa el agente de servicio de Kubernetes Engine de tu proyecto para autenticarse en Cloud KMS.
Cloud KMS encripta la DEK con la KEK y la envía de vuelta al plano de control de GKE.
El plano de control de GKE almacena los datos encriptados junto con la DEK encriptada en la base de datos del clúster. La DEK de texto sin formato no se escribe en el disco, aunque se almacena en caché en la memoria para mejorar el rendimiento.
Cuando un cliente solicita los datos del servidor de la API de Kubernetes, sucede lo siguiente:
El plano de control de GKE recupera los datos encriptados de la base de datos de estado del clúster.
El plano de control de GKE verifica la caché de la memoria para obtener la DEK en texto simple. Si la caché tiene la DEK en texto simple, GKE la usa para desencriptar los datos.
Si la DEK no está en la caché, GKE envía la DEK encriptada a Cloud KMS para su desencriptación con tu KEK.
GKE recibe la DEK desencriptada de Cloud KMS y la usa para desencriptar los datos.
El servidor de la API de Kubernetes devuelve los datos desencriptados al cliente.
¿Qué sucede cuando borras una clave?
Si planeas destruir una versión anterior de KEK después de una rotación de claves, asegúrate de que los datos de tu clúster estén protegidos por la nueva versión de KEK. El proceso para esto depende del alcance de la encriptación del clúster (verifica el alcance de la encriptación).
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 plano de control de GKE aún puede usar entradas de asignación de DEK almacenadas en caché para desencriptar datos después de destruir la KEK. Esto permite que los Pods reiniciados o reprogramados accedan a los datos, a menos que ocurra una de las siguientes situaciones:
- El plano de control del clúster se reinicia.
- Se reinicia el Pod del plano de control de GKE.
- La DEK no está en la caché del plano de control de GKE.
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. Solo destruye las versiones anteriores de KEK cuando estés seguro de que no hay datos encriptados en tu clúster con la versión anterior. Antes de destruir una KEK, verifica si la clave está en uso. Para obtener más detalles, consulta Destruye y restablece versiones de claves.
Puedes programar la destrucción de una versión de clave después de un período configurable. Durante este tiempo, si cambias de opinión, puedes restablecer la versión de clave para evitar la eliminación. Sin embargo, una vez que llega el momento de destrucción programado y se destruye la versión de la clave, esta acción es irreversible. Los datos encriptados con esta versión de clave no se podrán desencriptar de forma permanente.
Antes de comenzar
Para realizar los ejercicios de este tema, necesitas dos Google Cloud proyectos:
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.
Puedes usar el mismo proyecto para tu proyecto de claves y el de clústeres. pero se recomienda usar proyectos separados.
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.getIamPolicycloudkms.keyRings.setIamPolicy
Estos permisos (y muchos otros) se otorgan a la función predefinida
roles/cloudkms.adminde 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 el proyecto de tu clúster, asegúrate de haber habilitado la API de Google Kubernetes Engine.
Asegúrate de que instalaste Google Cloud CLI.
Actualiza
gclouda 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-asolo 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-northeast1debe protegerse con un llavero de claves de la regiónasia-northeast1.
La región global de Cloud KMS no es compatible con GKE.
Puedes usar gcloud CLI o la consola de Google Cloud .
Console
En tu proyecto clave, crea un llavero de claves:
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 Ubicación, selecciona la ubicación de tu clúster de Kubernetes.
Haz 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
El agente de servicio de Kubernetes Engine 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 gcloud CLI, ejecuta el siguiente
comando:
gcloud projects describe CLUSTER_PROJECT_ID \
--format="value(projectNumber)"
Para otorgar acceso al agente de servicio de Kubernetes Engine, puedes usar la consola de Google Cloud o la gcloud CLI.
Console
Otorga el rol de encriptador/desencriptador de CryptoKey de Cloud KMS al agente de servicio de Kubernetes Engine:
- En la consola de Google Cloud , ve a la página Administración de claves.
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 del agente de servicio de Kubernetes Engine al que le otorgarás acceso.
En el menú desplegable Seleccionar una función, selecciona Encriptador/desencriptador de CryptoKey de Cloud KMS.
Haz clic en Guardar.
gcloud
Otorga el rol de encriptador/desencriptador de CryptoKey de Cloud KMS a tu agente de servicio de Kubernetes Engine:
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 tu agente de servicio de Kubernetes Engine.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.
Habilita la encriptación de Secrets de la capa de aplicación
Puedes habilitar la encriptación de Secrets de la capa de aplicación en clústeres nuevos o existentes de GKE Standard y GKE Autopilot con gcloud CLI o la consola de Google Cloud .
Después de habilitar la encriptación de Secrets de la capa de la aplicación, realiza una rotación de claves. Puedes configurar la rotación de claves automática en Cloud KMS.
Habilita en un clúster nuevo
Puedes crear un clúster nuevo con encriptación habilitada de Secrets de la capa de aplicación con la consola deGoogle Cloud o la gcloud CLI.
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:
En la consola de Google Cloud , ve a la página Crea un clúster de Autopilot.
Configura tu clúster como desees.
En el panel de navegación, haz clic en Configuración avanzada y expande la sección Seguridad.
En Encripta Secrets en la capa de aplicación, selecciona Clave de Cloud KMS 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:
En la consola de Google Cloud , ve a la página Crea un clúster de Kubernetes.
Configura tu clúster como desees.
En el panel de navegación, haz clic en Configuración avanzada.
En la fila Encriptación de Secrets en la capa de aplicación, haz clic en edit Editar configuración.
En Encripta Secrets en la capa de aplicación, selecciona Clave de Cloud KMS y elige la clave que creaste en Crea una clave de Cloud KMS.
Haz clic en Guardar.
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 \
--location=CONTROL_PLANE_LOCATION \
--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.CONTROL_PLANE_LOCATION: Es la región de Compute Engine del plano de control de tu 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.
Habilita en un clúster existente
Puedes usar la gcloud CLI o la consola de Google Cloud para actualizar un clúster existente y usar la encriptación de Secrets de la capa de aplicación. GKE encripta todos tus secretos nuevos y existentes mediante tu clave de encriptación especificada.
Actualizar un clúster existente para que use la encriptación de Secrets de la capa de aplicación reinicia el plano de control del clúster. Durante este proceso, GKE vuelve a encriptar todos los Secrets existentes con la clave nueva, por lo que se espera una operación de larga duración. En el caso de los clústeres zonales, el plano de control deja de estar disponible.
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:
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 \
--location=CONTROL_PLANE_LOCATION \
--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.CONTROL_PLANE_LOCATION: Es la ubicación de Compute Engine del plano de control de tu clúster. Proporciona una región para los clústeres regionales o una zona para los clústeres zonales.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 gcloud CLI o la consola de Google Cloud para actualizar un clúster existente a fin de usar una clave de Cloud KMS nueva.
Actualizar un clúster existente para que use una clave de Cloud KMS nueva reinicia el plano de control del clúster. Durante este proceso, GKE vuelve a encriptar todos los Secrets existentes con la clave nueva, por lo que se espera un tiempo de operación prolongado. En el caso de los clústeres zonales, el plano de control deja de estar disponible durante la actualización.
Console
Para actualizar un clúster a fin de usar una clave de Cloud KMS nueva, sigue estos pasos:
Accede 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 \
--location=CONTROL_PLANE_LOCATION \
--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.CONTROL_PLANE_LOCATION: La ubicación de Compute Engine del plano de control de tu clúster. Proporciona una región para los clústeres regionales o una zona para los clústeres zonales.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 Secrets de la capa de la aplicación
Para inhabilitar la encriptación de Secrets de la capa de aplicación, puedes usar gcloud CLI o la consola deGoogle Cloud .
Console
Accede 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 \
--location=CONTROL_PLANE_LOCATION \
--disable-database-encryption \
--project=CLUSTER_PROJECT_ID
Reemplaza lo siguiente:
CLUSTER_NAME: El nombre de tu clúster.CONTROL_PLANE_LOCATION: La ubicación de Compute Engine del plano de control de tu clúster. Proporciona una región para los clústeres regionales o una zona para los clústeres zonales.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 Secrets de la capa de aplicación con la consola deGoogle Cloud o gcloud CLI.
Console
Accede a la página de Google Kubernetes Engine en la consola de Google Cloud .
Haz clic en el nombre del clúster que deseas inspeccionar.
En Seguridad, busca el campo Encriptación de Secrets de la capa de la aplicación. El valor de este campo indica qué objetos están encriptados, de la siguiente manera:
- Habilitado (todos los objetos): Todos los objetos de la API de Kubernetes en la base de datos de estado del clúster están encriptados.
- Habilitado: Solo se encriptan los Secrets.
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 \
--location=CONTROL_PLANE_LOCATION \
--format='value(databaseEncryption.state)' \
--project=CLUSTER_PROJECT_ID
Reemplaza lo siguiente:
CLUSTER_NAME: El nombre de tu clúster.CONTROL_PLANE_LOCATION: La ubicación de Compute Engine del plano de control de tu clúster. Proporciona una región para los clústeres regionales o una zona para los clústeres zonales.CLUSTER_PROJECT_ID: Es el ID del proyecto de tu clúster.
El resultado indica qué objetos están encriptados, de la siguiente manera:
ALL_OBJECTS_ENCRYPTION_ENABLED: Todos los objetos de la API de Kubernetes en la base de datos de estado del clúster están encriptados.ENCRYPTED: Solo se encriptan los Secrets.
Si el resultado es DECRYPTED, la encriptación de Secrets de la capa de aplicación está inhabilitada.
Rota tus claves
Rota 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 Rotación de 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.
La rotación de la versión de la clave es una operación de coherencia eventual y podría haber una demora antes de que la nueva versión de la clave entre en vigencia. Consulta Coherencia de las versiones de clave para obtener más información.
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. Puedes volver a encriptar tus Secrets de una de las siguientes maneras:
- De forma manual, ejecutando un comando de
kubectlen una terminal - Automáticamente, con una carga de trabajo recurrente, como un
CronJob, para ejecutar un comando
kubectlen intervalos regulares.
Después de una rotación de claves, espera al menos tres horas hasta que la nueva versión sea coherente. Luego, activa la reencriptación ejecutando un comando como el siguiente:
kubectl get secrets --namespace=NAMESPACE -o json \
| kubectl annotate --overwrite -f - encryption-key-rotation-time="TIME"
Reemplaza lo siguiente:
NAMESPACE: Es el espacio de nombres en el que se actualizarán los Secrets. En los clústeres estándar, puedes usar la marca--all-namespacesde forma opcional para actualizar todos los objetos Secret del clúster con el mismo comando. En los clústeres de Autopilot, solo puedes actualizar los espacios de nombres que te pertenecen.TIME: Es una cadena que indica cuándo se produce la rotación (por ejemplo,20200909-090909).
Después de rotar las claves, la versión anterior de la clave sigue existiendo y puede generar costos. La destrucción de la versión de clave es permanente, por lo que debes asegurarte de que la versión de clave anterior ya no esté en uso antes de destruirla. Para obtener más información, consulta Visualiza el uso de claves.
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-asolo 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.No es necesario que la clave esté en el mismo proyecto que el clúster. Para obtener más información sobre las ubicaciones compatibles con Cloud KMS, consulta Google Cloud ubicaciones.
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
El agente de servicio de Kubernetes Engine 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.
Se destruye la versión de clave de Cloud KMS
Cuando el estado del clúster contiene el mensaje KEY_VERSION_URI is not enabled, current state is: DESTROYED, significa que la versión de la clave que se usó para la encriptación de Secrets de la capa de aplicación se destruyó.
Reemplaza KEY_VERSION_URI por el URI de la versión de la clave.
¿Qué sigue?
- Obtén más información sobre los secretos en Kubernetes.
- Obtén más información sobre la administración de secretos con Cloud KMS.
- Aprende a endurecer tu clúster.