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 CMEK en reposo.

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 clave administrada por Google y propiedad de 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 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.

El uso de CMEK genera registros de auditoría. Consulta Comprende los registros de auditoría y los mensajes de error para obtener más información.

Cuotas de Cloud KMS y Cloud Run

Puedes establecer tu CMEK en uno de los niveles de protección disponibles para indicar cómo se realizan las operaciones criptográficas. Cuando usas CMEK en Cloud Run, tus proyectos pueden consumir cuotas de solicitudes criptográficas de Cloud KMS. Por ejemplo, los repositorios encriptados con CMEK pueden consumir estas cuotas para cada carga o descarga.

Las operaciones de encriptación y desencriptación con claves CMEK afectan las cuotas de Cloud KMS de las siguientes maneras:

  • En el caso de las claves CMEK de software generadas en Cloud KMS, no se consume cuota de Cloud KMS.
  • En el caso de las claves CMEK de hardware, a veces llamadas claves de Cloud HSM, las operaciones de encriptación y desencriptación se descuentan de las cuotas de Cloud HSM en el proyecto que contiene la clave.
  • Para las claves CMEK externas, a veces llamadas claves de Cloud EKM, las operaciones de encriptación y desencriptación se descuentan de las cuotas de Cloud EKM del proyecto que contiene la clave.

Para obtener más información, consulta Cuotas de Cloud KMS.

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/revocada No se iniciarán las instancias nuevas.
No se puede establecer contacto con el administrador de claves externo 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 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.

Antes de comenzar

Permite que Cloud Run acceda a una clave

Para usar CMEK en Cloud Run, sigue estos pasos:

  1. Configura Artifact Registry para usar CMEK.

  2. Con la Guía de inicio rápido de Docker de Artifact Registry como referencia, crea un repositorio de Docker para enviarle una imagen.

  3. Usa una clave simétrica existente de Cloud KMS o crea una clave simétrica nueva.

  4. Para permitir que Cloud Run acceda a la clave, otorga al agente de servicio de Cloud Run el rol de encriptador/desencriptador de CryptoKey de Cloud KMS:

    Console

    1. Ve a la página Claves criptográficas

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

    3. Selecciona la clavet y, en la pestaña Permisos del lado derecho, haz clic en Agregar principal.

    4. En el campo Principales nuevas, copia el correo electrónico del agente de servicio de Cloud Run. Tiene el siguiente sufijo:

      PROJECT_NUMBER@serverless-robot-prod.iam.gserviceaccount.com.

    5. En el menú desplegable Selecciona un rol, selecciona Encriptador/desencriptador de CryptoKey de Cloud KMS.

    6. Haz clic en Guardar.

    gcloud

    Usa el siguiente comando gcloud kms:

    gcloud kms keys add-iam-policy-binding KEY_NAME \
    --keyring=KEYRING \
    --location=LOCATION) \
    --member serviceAccount:PROJECT_NUMBER@serverless-robot-prod.iam.gserviceaccount.com \
    --role='roles/cloudkms.cryptoKeyEncrypterDecrypter'

    Reemplazar

    • KEY_NAME por el nombre de la clave.
    • KEYRING con el nombre del llavero de claves.
    • LOCATION por el nombre de tu región
    • PROJECT_NUMBER por el número de proyecto en el que deseas implementar el servicio de Cloud Run.

    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.

Configura 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. En la consola de Google Cloud ve a Cloud Run:

    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 implementar y editar la nueva revisión.

  3. Si configuras un servicio nuevo, completa la página de configuración del servicio inicial como desees y haz clic en Contenedor, herramientas de redes, seguridad para expandir la página de configuración del servicio.

  4. Haz clic en la pestaña Seguridad.

    imagen

    • En Encriptación, haz lo siguiente:
      1. Selecciona Clave de encriptación administrada por el cliente (CMEK).
      2. En el menú Selecciona una clave administrada por el cliente, elige una de las siguientes opciones:
        • Selecciona Cambiar proyecto si necesitas usar una clave de un proyecto diferente. Puedes hacer referencia a una clave de otro proyecto si la cuenta de servicio de tu proyecto puede acceder a la clave para realizar operaciones de encriptación y desencriptación.

        • Selecciona Ingresar clave de forma manual para ingresar el secreto de un proyecto, con el siguiente formato: projects/PROJECT_NAME/locations/LOCATION/keyRings/KEYRING_NAME/cryptoKeys/KEY_NAME.

        Para copiar y pegar el nombre del recurso de otro proyecto al que tengas acceso, haz lo siguiente:

        • Ve a la página Claves criptográficas.
        • Haz clic en el llavero de claves.
        • Selecciona el nombre del llavero de claves elegido y haz clic en Acciones.
        • Selecciona Copiar nombre del recurso en el menú y pégalo en el campo Nombre del recurso de la clave del paso anterior.

      3. En el menú de revocación de claves, elige una de las siguientes opciones:
        • Impedir que se cree una nueva instancia de contenedor: Ninguna instancia nueva se iniciará después de la revocación de claves de CMEK.

        • Apagar lo antes posible: No se iniciarán instancias nuevas y las instancias existentes se cerrarán después de la revocación de claves de CMEK.

        • Retraso personalizado del cierre: Especifica la cantidad de horas antes de que se cierre el servicio.

  5. Haz clic en Crear o Implementar.

gcloud

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

gcloud run deploy SERVICE \
--image IMAGE_URL \
--key KEY \
--post-key-revocation-action-type KEY_REVOCATION_ACTION
--encryption-key-shutdown-hours SHUTDOWN_HOURS
gcloud run services update SERVICE --key KEY
--post-key-revocation-action-type KEY_REVOCATION_ACTION
--encryption-key-shutdown-hours SHUTDOWN_HOURS

Reemplazar

  • SERVICE por el nombre de tu servicio
  • IMAGE_URL por una referencia a la imagen del contenedor, como us-docker.pkg.dev/cloudrun/container/hello:latest Si usas Artifact Registry, el repositorio REPO_NAME debe estar creado. La URL tiene el formato LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG.
  • KEY: Por el nombre de la clave completamente calificado, en el siguiente formato: projects/PROJECT_NAME/locations/LOCATION/keyRings/KEYRING_NAME/cryptoKeys/KEY_NAME.
  • KEY_REVOCATION_ACTION por shut-down o prevent-new, según tus preferencias de revocación de claves.
  • SHUTDOWN_HOURS por la cantidad de horas de retraso antes de que el servicio se cierre después de la revocación.

YAML

  1. Si creas un servicio nuevo, omite este paso. Si actualizas un servicio existente, descarga su configuración de YAML:

    gcloud run services describe SERVICE --format export > service.yaml
  2. Actualiza las siguientes anotaciones de CMEK a los valores que deseas:

    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/KEYRING_NAME/cryptoKeys/KEY_NAME
            run.googleapis.com/post-key-revocation-action-type: KEY_REVOCATION_ACTION
            run.googleapis.com/encryption-key-shutdown-hours: SHUTDOWN_HOURS
          name: REVISION

    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.
    • KEYRING_NAME por el nombre del llavero de claves.
    • KEY_NAME por el nombre de la clave.
    • KEY_REVOCATION_ACTION por shut-down o prevent-new, según tus preferencias de revocación de claves.
    • SHUTDOWN_HOURS por la cantidad de horas de retraso antes de que el servicio se cierre después de la revocación.
    • REVISION por un nombre de revisión nuevo o bórralo (si está presente). Si proporcionas un nuevo nombre de revisión, debe cumplir con los siguientes criterios:
      • Comienza con SERVICE-
      • Solo contiene letras minúsculas, números y -
      • No termina con -
      • No supera los 63 caracteres
  3. Reemplaza el servicio por la configuración nueva mediante el siguiente comando:

    gcloud run services replace service.yaml

Ver la configuración de la seguridad

Para ver la configuración actual de los Secrets del servicio de Cloud Run, sigue estos pasos:

Console

  1. En la consola de Google Cloud ve a Cloud Run:

    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.

gcloud

  1. Usa el siguiente comando:

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

Prueba la revocación de CMEK

  1. Ejecuta el siguiente comando para confirmar que se puede acceder al servicio:

    curl SERVICE_URL
    

    Reemplaza SERVICE_URL por la URL del servicio. Puedes encontrar esta opción en la IU de la consola después de la implementación: la URL del contenedor se muestra junto al texto URL:.

  2. Inhabilita la versión de clave

  3. Espera el número de SHUTDOWN_HOURS que especificaste. Si no especificaste, vuelves a habilitar tu clave y edita o vuelve a implementar tu servicio con el valor establecido en el mínimo de una hora.

  4. Después de esperar la duración de SHUTDOWN_HOURS, vuelve a ejecutar el siguiente comando y confirma que ya no se puede acceder al servicio:

curl SERVICE_URL

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 sea verificar 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 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 para 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 a 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 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 podrías 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 superó las cuotas de KMS. Solución: Solicita un aumento de cuota de KMS.
User's CMEK key has been disabled. CMEK key: %s Se revocó la CMEK. Solución: Cambia la CMEK del servicio y vuelve a implementarlo.
User's CMEK key has been destroyed. CMEK key: %s Se borró la CMEK. Solución: Cambia la 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 CMEK. Solución: Cambia la CMEK del servicio y vuelve a implementarlo.

¿Qué sigue?