Usa claves de encriptación administradas por el cliente

En este tema, se muestra cómo proteger las imágenes de contenedor implementadas en los servicios de Cloud Run mediante claves de encriptación administradas por el cliente (CMEK) de Cloud KMS. Puedes usar esta función para proteger los contenedores importados por Cloud Run con una clave en reposo de CMEK.

Debes tener en cuenta lo siguiente:

  • Los metadatos de archivos, como la ruta de acceso del archivo, no están encriptados.
  • Los metadatos del servicio de Cloud Run, como las variables de nombre o entorno, no se encriptan con la clave proporcionada, sino con una administrada por Google.
  • En el entorno de ejecución, la memoria y el contenido del archivo no están encriptados.
  • Si una clave CMEK está inhabilitada, las instancias de contenedor nuevas de revisiones de Cloud Run existentes que usan la clave no se iniciarán.
  • Si una clave CMEK está inhabilitada, la implementación de una nueva revisión de Cloud Run fallará, a menos que se use una nueva clave válida.

Debido a que la clave CMEK está bajo tu control y no está controlada por Google, nadie, ni siquiera Google, puede acceder a los datos protegidos por estas cuando se inhabilitan o se destruyen las claves.

Cuando usas CMEK, se generan registros de auditoría. Consulta Comprende los registros de auditoría y los mensajes de error para obtener más información.

Comportamiento del ajuste de escala automático afectado por CMEK

El ajuste de escala automático esperado para tu servicio de Cloud Run puede verse afectado cuando usas claves de encriptación administradas por el cliente. Por ejemplo, la latencia para iniciar instancias nuevas puede aumentar debido a demoras en la comunicación con sistemas de administración de claves externos durante las operaciones con claves.

En la siguiente tabla, se muestran los posibles cambios en el comportamiento debido al uso de claves CMEK:

Operación relacionada con CMEK Comportamiento del ajuste de escala automático
Clave inhabilitada/destruida No se iniciarán nuevas instancias.
No se puede establecer contacto con el administrador de clave externa Si la solicitud de clave se puede reintentar, no se cierran las instancias durante los reintentos y no se inician instancias nuevas. El escalamiento horizontal puede parecer más lento de lo esperado.
Si no se puede reintentar la solicitud de clave, no se inician instancias nuevas y las instancias en ejecución se cierran después de un período de espera.
Se superó la cuota de KMS Las operaciones de CMEK usan la cuota de KMS. Si se supera esta cuota, se registran los errores RESOURCE_EXHAUSTED y no se inician nuevas instancias. Puedes solicitar una cuota adicional para corregir el problema.

Permite que Cloud Run acceda a una clave

Para usar esta función, sigue estos pasos:

  1. Habilita la API de Administrador de Cloud Run

  2. Usa una clave simétrica existente de Cloud KMS o crea una clave simétrica nueva. Sin embargo, para permitir que un servicio de Cloud Run acceda a la clave, debes agregar la cuenta de servicio de Cloud Run como miembro de la clave y otorgarle la función de encriptador/desencriptador de clave criptográfica de Cloud KMS:

    Console

    1. Ve a la página Claves criptográficas en Cloud Console.

    2. Haz clic en el llavero de claves de tu clave para abrir su página de lista de claves.

    3. Selecciona la clave y, en la pestaña de permisos del lado derecho, haz clic en Agregar miembro.

    4. En el cuadro de texto Nuevos miembros, copia el correo electrónico del agente de servicio de Cloud Run. Tiene el sufijo @serverless-robot-prod.iam.gserviceaccount.com

    5. Otorga la función Encriptador/Desencriptador de CryptoKeys de Cloud KMS.

    Línea de comandos

    Usa el siguiente comando gcloud kms:

    gcloud kms keys add-iam-policy-binding 
    (KEY : --keyring=KEYRING --location=LOCATION)
    --member=MEMBER --role='roles/cloudkms.cryptoKeyEncrypterDecrypter'

    Reemplazar

    • KEYRING con el nombre del llavero de claves.
    • LOCATION por el nombre de tu región
    • MEMBER con el correo electrónico del agente de servicio de Cloud Run. Tiene el sufijo @serverless-robot-prod.iam.gserviceaccount.com

    Necesitas permiso para administrar los recursos de Cloud KMS en el proyecto de Google Cloud a fin de otorgar la función de IAM roles/cloudkms.cryptoKeyEncrypterDecrypter. Solo los miembros de IAM con las funciones de Propietario (roles/owner) o Administrador de Cloud KMS (roles/cloudkms.admin) pueden otorgar o revocar el acceso a los recursos de Cloud KMS.

Habilita CMEK para un servicio de Cloud Run:

Cualquier cambio en la configuración conlleva la creación de una revisión nueva. Las revisiones posteriores también adoptarán esta configuración de manera automática, a menos que realices actualizaciones explícitas para cambiarla.

Console

  1. Ir a Cloud Run

  2. Haz clic en Crear servicio si quieres configurar un servicio nuevo en el que realizarás la implementación. Si quieres configurar un servicio existente, haz clic en el servicio y, luego, en Editar e implementar nueva revisión.

  3. Si estás configurando un servicio nuevo, llena la página de configuración inicial del servicio como desees y haz clic en Siguiente > Configuración avanzada para acceder a la página de configuración del servicio.

  4. Haz clic en la pestaña Seguridad.

    image

  5. Selecciona la casilla de verificación Usar una clave de encriptación administrada por el cliente (CMEK) y, luego, selecciona la clave deseada en el menú desplegable Seleccionar una clave administrada por el cliente.

  6. Haz clic en Crear o Implementar.

Línea de comandos

Para configurar una clave en un servicio, usa cualquiera de los siguientes comandos:

gcloud run deploy SERVICE --image IMAGE_URL --key KEY
gcloud run services update SERVICE --key KEY

Reemplazar

  • SERVICE por el nombre de tu servicio
  • IMAGE_URL por una referencia a la imagen de contenedor, como us-docker.pkg.dev/cloudrun/container/hello:latest
  • KEY por el nombre de la clave completamente calificado, en este formato:projects/PROJECT_NAME/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME

YAML

Puedes descargar y ver la configuración del servicio existente mediante el comando gcloud run services describe --format export, que genera resultados limpios en formato YAML. Luego, puedes modificar los campos que se describen a continuación y subir el YAML modificado mediante el comando gcloud run services replace. Asegúrate de modificar los campos tal como se indica en la documentación.

  1. Para ver y descargar la configuración:

    gcloud run services describe SERVICE --format export > service.yaml
  2. Actualiza la anotación run.googleapis.com/encryption-key:

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
    spec:
      template:
        metadata:
          annotations:
            run.googleapis.com/encryption-key: projects/PROJECT_NAME/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME

    Reemplazar

    • SERVICE por el nombre del servicio de Cloud Run
    • PROJECT_NAME por el nombre del proyecto en el que se creó la clave.
    • LOCATION por la ubicación en la que se creó la clave. Debe coincidir con la ubicación del servicio de Cloud Run.
    • RING_NAME por el nombre del llavero de claves.
    • KEY_NAME por el nombre de la clave.
  3. Reemplaza el servicio por la configuración nueva mediante el comando siguiente:

    gcloud run services replace service.yaml

Haz referencia a claves de otros proyectos

Puedes hacer referencia a una clave de otro proyecto, si la cuenta de servicio de tu proyecto tiene permiso para encriptar o desencriptar la clave.

Console

  1. Ir a Cloud Run

  2. Haz clic en Crear servicio si quieres configurar un servicio nuevo en el que realizarás la implementación. Si quieres configurar un servicio existente, haz clic en el servicio y, luego, en Editar e implementar nueva revisión.

  3. Si estás configurando un servicio nuevo, llena la página de configuración inicial del servicio como desees y haz clic en Siguiente > Configuración avanzada para acceder a la página de configuración del servicio.

  4. Haz clic en la pestaña Seguridad.

    image

  5. En la pestaña Seguridad, haz lo siguiente:

    1. Selecciona la casilla de verificación Usar una clave de encriptación administrada por el cliente (CMEK).
    2. Selecciona ¿No ves tu clave? Ingresa el ID de recurso de la clave de la lista desplegable Selecciona una clave administrada por el cliente (Select a customer-managed key) para ver el siguiente formulario:

      Claves de proyectos cruzados

    3. En el formulario Agregar un Secret por ID de recurso, ingresa el Secret del otro proyecto, en el formato projects/PROJECT_NAME/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME. De manera alternativa, puedes copiar y pegar el ID de recurso del otro proyecto si tienes acceso a él. Para ello, selecciona la clave y haz clic en los puntos suspensivos Actions a la derecha del secreto. Selecciona Copiar ID del recurso en el menú desplegable.
    4. Haga clic en Implementar.

  6. Haz clic en Crear o Implementar.

Línea de comandos

Para configurar una clave en un servicio, usa uno de los siguientes comandos:

gcloud beta run deploy SERVICE --image IMAGE_URL --key KEY
gcloud beta run services update SERVICE --key KEY

Reemplazar

  • SERVICE por el nombre de tu servicio
  • IMAGE_URL por una referencia a la imagen de contenedor, como us-docker.pkg.dev/cloudrun/container/hello:latest
  • KEY por el nombre de la clave completamente calificado, en este formato:projects/PROJECT_NAME/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME

Ve la configuración de seguridad

Para ver la configuración de seguridad actual de tu servicio, haz lo siguiente:

Console

  1. Ir a Cloud Run

  2. Haz clic en el servicio que te interesa para abrir la página Detalles del servicio.

  3. Haz clic en la pestaña Revisiones (Revisions).

  4. En el panel de detalles de la derecha, la configuración de seguridad aparece en la pestaña Security.

Línea de comandos

  1. Usa el siguiente comando:

    gcloud run services describe SERVICE
  2. Busca la configuración de seguridad en la configuración mostrada.

Información sobre los registros de auditoría y los mensajes de error

Si eres responsable de supervisar los registros de auditoría, es posible que una de tus tareas verifiquen las operaciones de CMEK en el servicio de Cloud Run. En este caso, debes comprender los registros de auditoría relacionados.

Si eres responsable de abordar y corregir errores de entorno de ejecución del servicio de Cloud Run, es posible que debas solucionar errores relacionados con CMEK que se registraron durante la operación del servicio de Cloud Run.

En las siguientes secciones, se proporciona la información necesaria para las tareas anteriores.

Registros de auditoría

Los registros de auditoría de KMS proporcionan un registro de auditoría por cada operación que se realiza con una clave. En el caso de los servicios de Cloud Run habilitados para CMEK, Cloud Run agrega el contexto del emisor específico de Cloud Run que detalla por qué el sistema accedió a la clave del cliente. En la siguiente tabla, se enumeran los contextos que puedes ver en los registros de auditoría:

Motivo del acceso a las claves Descripción
Decrypting CMEK-encrypted layer during container clone start. Se registra cada vez que se inicia una instancia nueva.
Encrypting a newly created data-encryption-key w/ the customer-managed-encryption-key. Se registra durante la implementación de un servicio habilitado de CMEK, en el que la clave CMEK se une mediante una clave de KMS.
Decrypting an existing encrypted data-encryption-key, under the same customer-managed-encryption-key, to be used to encrypt container contents. Se registra cuando se inicia una instancia nueva, lo que requiere la desencriptación de la imagen.
Performing an encrypt operation on dummy data to check the customer-managed-encryption-key status and access. Se registra cada vez que se realiza una verificación de validación en la clave, lo cual se hace de manera periódica.
Performing an decrypt operation on dummy data to check the customer-managed-encryption-key status and access. Se registra cada vez que se realiza una verificación de validación en la clave, lo cual se hace de manera periódica.

Para obtener información específica sobre el formato y el contenido del registro de auditoría, consulta la página de registro de auditoría de KMS.

Mensajes de error

Ten en cuenta que los mensajes de error que proporciona un administrador de claves externo se pasan directamente a los registros de Cloud Run para tu servicio.

En la siguiente tabla, se enumeran los mensajes de error relacionados con CMEK que puedes ver, junto con descripciones y posibles soluciones.

Mensaje Descripción
User's service account does not have CMEK decrypter permission. Service account: %s Solución: Permite que el servicio acceda a la clave.
User's KMS operation quota has been exceeded. CMEK key: %s El servicio habilitado para CMEK usa la cuota de KMS en las operaciones de claves. Solución: Solicita un aumento de cuota de KMS.
User's CMEK key has been disabled. CMEK key: %s Se revocó la clave CMEK. Solución: Cambia la clave CMEK del servicio y vuelve a implementarlo.
User's CMEK key has been destroyed. CMEK key: %s Se borró la clave CMEK. Solución: Cambia la clave CMEK del servicio y vuelve a implementarlo.
User's CMEK key has been scheduled for deletion. CMEK Key: %s Se programó la eliminación de la clave CMEK. Solución: Cambia la clave CMEK del servicio y vuelve a implementarlo.

¿Qué sigue?