Autenticar cargas de trabajo en otras cargas de trabajo mediante mTLS


En este documento se describe cómo configurar el aprovisionamiento automático y la gestión del ciclo de vida de las identidades de carga de trabajo gestionadas en Compute Engine. Puedes configurar grupos de autoridades de certificación para emitir certificados mediante Servicio de Autoridades de Certificación (CA), un servicio de alta disponibilidad y escalable Google Cloud que simplifica y automatiza el despliegue, la gestión y la seguridad de los servicios de CA. Cada máquina virtual se aprovisiona con credenciales X.509 del grupo de CAs configurado. Estas credenciales se pueden usar para establecer conexiones mTLS.

Con las identidades de carga de trabajo gestionadas de Compute Engine, puedes implementar comunicaciones cifradas y autenticadas mutuamente entre dos máquinas virtuales de Compute Engine. Las aplicaciones de carga de trabajo que se ejecutan en las VMs configuradas pueden usar las credenciales X.509 para mTLS por VM. El Servicio de Autoridades de Certificación rota y gestiona automáticamente estos certificados mTLS.

Antes de empezar

  • Solicita acceso a la vista previa de Workload Identity gestionado.

  • Configura Google Cloud CLI.

    Instala Google Cloud CLI. Después de la instalación, inicializa la CLI de Google Cloud ejecutando el siguiente comando:

    gcloud init

    Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

  • Configura la CLI de Google Cloud para que use el proyecto incluido en la lista de permitidos para la facturación y la cuota.

      gcloud config set billing/quota_project PROJECT_ID

    Sustituye PROJECT_ID por el ID del proyecto que se ha añadido a la lista de permitidos de la vista previa de la identidad de carga de trabajo gestionada.

  • Consulta la documentación sobre la información general de las identidades de carga de trabajo gestionadas.
  • Enable the Compute Engine API:

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    gcloud services enable compute.googleapis.com

Roles obligatorios

Para obtener los permisos que necesitas para crear VMs que usen certificados de identidad de carga de trabajo gestionada para autenticarte en otras cargas de trabajo, pide a tu administrador que te conceda los siguientes roles de gestión de identidades y accesos en el proyecto:

Para obtener más información sobre cómo conceder roles, consulta el artículo Gestionar el acceso a proyectos, carpetas y organizaciones.

También puedes conseguir los permisos necesarios a través de roles personalizados u otros roles predefinidos.

Información general

Para usar identidades de carga de trabajo gestionadas en tus aplicaciones, debes realizar las siguientes tareas:

  1. Administrador de seguridad:

  2. Administrador de Compute:

Configurar identidades de carga de trabajo gestionadas en Gestión de Identidades y Accesos

  • Sigue las instrucciones que se indican en el artículo Configurar la autenticación de identidades de cargas de trabajo gestionadas .

    En estas instrucciones se explica cómo completar lo siguiente:

    • Crea un grupo de identidades de carga de trabajo.
    • Crea espacios de nombres en el grupo de identidades de carga de trabajo. Los espacios de nombres se usan para crear límites administrativos para las identidades de carga de trabajo gestionadas. Por ejemplo, puedes crear un espacio de nombres para cada una de las aplicaciones propiedad de tu organización.
    • Crea una identidad de carga de trabajo gestionada en un espacio de nombres del grupo de identidades de carga de trabajo. Por ejemplo, puede crear un espacio de nombres para una aplicación y crear identidades gestionadas en ese espacio de nombres para los microservicios que admitan esa aplicación.
    • Crea una cuenta de servicio. Las VMs de Compute Engine se pueden autorizar para recibir una identidad de carga de trabajo gestionada basada en la Google Cloud cuenta de servicio Google Cloud asociada a la VM.
    • Crea una política de certificación de carga de trabajo que permita que tu carga de trabajo reciba credenciales para la identidad de carga de trabajo gestionada. Para que se emitan credenciales para la identidad de carga de trabajo gestionada, la carga de trabajo debe estar en un proyecto especificado y tener adjunta la cuenta de servicio.
    • Configurar el Servicio de Autoridades de Certificación para que emita certificados para identidades de cargas de trabajo gestionadas:
      • Configurar el grupo de autoridades de certificación raíz
      • Configurar las ACs subordinadas
      • Autorizar identidades de carga de trabajo gestionadas para solicitar certificados del grupo de ACs

Obtener el archivo de configuración para subir los metadatos de partner

Tu administrador de seguridad crea un archivo JSON que contiene lo siguiente:

El archivo debe llamarse CONFIGS.json. Este archivo se usa al crear una plantilla de instancia para MIGs o al crear una VM individual.

El archivo CONFIGS.json debe ser similar al siguiente:

  {
  "wc.compute.googleapis.com": {
     "entries": {
        "certificate-issuance-config": {
           "primary_certificate_authority_config": {
              "certificate_authority_config": {
                 "ca_pool": "projects/PROJECT_ID/locations/SUBORDINATE_CA_POOL_REGION/caPools/SUBORDINATE_CA_POOL_ID"
              }
           },
           "key_algorithm": "rsa-2048"
        },
        "trust-config": {
           "POOL_ID.global.PROJECT_NUMBER.workload.id.goog": {
               "trust_anchors": [{
                  "ca_pool": "projects/PROJECT_ID/locations/SUBORDINATE_CA_POOL_REGION/caPools/SUBORDINATE_CA_POOL_ID"
                }]
           }
     }
  }
  },
  "iam.googleapis.com": {
     "entries": {
        "workload-identity": "spiffe://POOL_ID.global.PROJECT_NUMBER.workload.id.goog/ns/NAMESPACE_ID/sa/MANAGED_IDENTITY_ID"
     }
  }
  }
  

Habilitar identidades de carga de trabajo gestionadas en un grupo de instancias gestionado

Un grupo de instancias gestionado (MIG) es un grupo de instancias de máquina virtual (VM) que se trata como una sola entidad. Cada VM de un MIG se crea mediante una plantilla de instancia. Para habilitar las máquinas virtuales del MIG para que usen identidades de carga de trabajo gestionadas, especifica la configuración en la plantilla de instancia.

Crear una plantilla de instancia

Crea una plantilla de instancia con la función de identidades de carga de trabajo gestionadas habilitada. A continuación, usa esta plantilla para crear un grupo de instancias gestionado (MIG).

gcloud

Usa el comando gcloud beta compute instance-templates create para crear una plantilla de instancia que habilite las identidades de cargas de trabajo gestionadas.

gcloud beta compute instance-templates create INSTANCE_TEMPLATE_NAME \
    --service-account SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \
    --metadata enable-workload-certificate=true \
    --partner-metadata-from-file CONFIGS.json

Puede añadir más marcas al crear la plantilla de instancia para personalizar las VMs que crea, como especificar el tipo de máquina y la imagen, en lugar de usar los valores predeterminados.

Haz los cambios siguientes:

  • INSTANCE_TEMPLATE_NAME: el nombre de la nueva plantilla.
  • SERVICE_ACCOUNT_NAME: el nombre de la cuenta de servicio que puede recibir la identidad gestionada.
  • PROJECT_ID: el ID del proyecto en el que se creó la cuenta de servicio.
  • CONFIGS.json: archivo de configuración que contiene la configuración de emisión de certificados, la configuración de confianza y la identidad de carga de trabajo gestionada.

Para obtener más información, consulta Crear plantillas de instancia.

Crear un grupo de instancias gestionado a partir de la plantilla

Crea un grupo de instancias gestionado que use una plantilla de instancia que habilite las identidades de carga de trabajo gestionadas. Para obtener información sobre cómo crear la plantilla de instancia, consulta el artículo Crear una plantilla de instancia.

gcloud

Crea un MIG con la plantilla de instancia y el comando gcloud compute instance-groups managed create.

gcloud compute instance-groups managed create INSTANCE_GROUP_NAME \
    --size=SIZE \
    --template=INSTANCE_TEMPLATE_NAME \
    --zone=ZONE

Haz los cambios siguientes:

  • INSTANCE_GROUP_NAME: ID único del grupo de instancias gestionado. Para obtener más información sobre los nombres válidos, consulta Nombres de recursos.
  • SIZE: el tamaño del grupo de instancias gestionado
  • INSTANCE_TEMPLATE_NAME: el nombre de la plantilla de instancia que se usará al crear VMs en el MIG.
  • ZONE: la zona en la que se crearán las VMs

Para obtener información detallada sobre cómo crear MIGs, consulta Escenarios básicos para crear grupos de instancias gestionados (MIGs).

Habilitar identidades de carga de trabajo gestionadas en máquinas virtuales concretas

Puedes habilitar identidades de carga de trabajo gestionadas para una VM al crearla o actualizando los metadatos de partner de una VM que ya tengas.

Crear VMs con identidades de carga de trabajo gestionadas habilitadas

Cuando crees una VM, para habilitar la función de identidades de carga de trabajo gestionadas en ella, debes hacer lo siguiente:

  • Especificar una cuenta de servicio que usará la VM
  • Asigna el valor true al atributo de metadatos enable-workload-certificate.
  • Especifique la información de configuración de emisión y de confianza de certificados como metadatos del partner.

gcloud

Usa el comando gcloud beta compute instances create para crear una VM. Usa el archivo CONFIGS.json que te haya proporcionado tu administrador de seguridad o que hayas creado siguiendo las instrucciones de Crear un archivo de configuración para subir los metadatos del partner.

  1. Crea una VM con la función de identidades de carga de trabajo gestionadas habilitada.

    gcloud beta compute instances create INSTANCE_NAME \
       --zone=INSTANCE_ZONE \
       --service-account SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \
       --metadata enable-workload-certificate=true \
       --partner-metadata-from-file CONFIGS.json
    

    Puedes añadir líneas adicionales al comando para configurar la VM, como el tipo de máquina y la imagen, en lugar de usar los valores predeterminados. Para obtener más información, consulta Crear e iniciar una instancia de VM.

    Haz los cambios siguientes:

    • INSTANCE_NAME: un nombre único para la VM. Para obtener información sobre los nombres de instancias válidos, consulta el artículo Asignar nombres a los recursos.
    • INSTANCE_ZONE: la zona en la que se creará la VM.
    • SERVICE_ACCOUNT_NAME: el nombre de la cuenta de servicio que puede recibir la identidad gestionada.
    • PROJECT_ID: el ID del proyecto en el que se creó la cuenta de servicio.
    • CONFIGS.json: nombre del archivo de configuración que contiene la configuración de emisión de certificados, la configuración de confianza y la configuración de identidad de carga de trabajo gestionada.

Habilitar identidades de carga de trabajo gestionadas en máquinas virtuales

Para habilitar las identidades de carga de trabajo gestionadas en una VM, actualízala para configurar lo siguiente:

  • Si la VM aún no tiene una cuenta de servicio vinculada, crea una y vincúlala a la VM.
  • Asigna el valor true al atributo de metadatos enable-workload-certificate.
  • Especifica la información de configuración de emisión de certificados y de configuración de confianza como metadatos de partner.
  • Reinicia la VM.

gcloud

Esta tarea usa el archivo CONFIGS.json que te ha proporcionado tu administrador de seguridad o que has creado siguiendo las instrucciones de Crear un archivo de configuración para subir los metadatos del partner.

  1. Si la máquina virtual aún no tiene una cuenta de servicio vinculada, vincúlala.

  2. Actualiza los metadatos de una máquina virtual para habilitar las identidades de carga de trabajo gestionadas.

    gcloud beta compute instances add-metadata VM_NAME \
       --zone=ZONE \
       --metadata enable-workload-certificate=true
    

    Haz los cambios siguientes:

    • VM_NAME: el nombre de la VM
    • ZONE: la zona en la que se encuentra la VM
  3. Actualiza la configuración de una VM para añadir el archivo de configuración.

    gcloud beta compute instances update VM_NAME \
       --zone=ZONE \
       --partner-metadata-from-file CONFIGS.json
    

    Haz los cambios siguientes:

    • VM_NAME: el nombre de la VM
    • ZONE: la zona en la que se encuentra la VM
    • CONFIGS.json: archivo de configuración que contiene la configuración de emisión de certificados, la configuración de confianza y la identidad de carga de trabajo gestionada.
  4. Detén la VM.

    gcloud beta compute instances stop VM_NAME \
       --zone=ZONE
    

    Haz los cambios siguientes:

    • VM_NAME: el nombre de la VM
    • ZONE: la zona en la que se encuentra la VM.
  5. Inicia la VM.

    gcloud beta compute instances start VM_NAME \
       --zone=ZONE
    

    Haz los cambios siguientes:

    • VM_NAME: el nombre de la VM
    • ZONE: la zona en la que se encuentra la VM.

Acceder a las credenciales de carga de trabajo en una VM Linux

Después de configurar correctamente la autenticación de carga de trabajo a carga de trabajo mediante mTLS, puedes acceder a las credenciales emitidas en tu VM.

Hay dos formas de acceder a las credenciales de identidad de carga de trabajo gestionada de Compute Engine y al paquete de confianza asociado:

  • El sistema de archivos de la VM
  • Servidor de metadatos de Compute Engine

Acceder a las credenciales de la carga de trabajo y al paquete de confianza mediante el sistema de archivos de la VM

Con este método, las credenciales X.509 y el paquete de confianza se colocan en una ruta específica del sistema de archivos de la máquina virtual. Las aplicaciones pueden leer directamente las credenciales y el paquete de confianza del sistema de archivos. Para ver ejemplos de cómo obtener las credenciales, consulta los siguientes ejemplos en GitHub:

La máquina virtual debe ejecutar la versión 20231103.01 o una posterior del agente invitado de Compute Engine. Usa el siguiente comando para comprobar la versión del agente invitado de Compute Engine en tu VM:

gcloud beta compute instances get-serial-port-output INSTANCE_NAME \
   --zone=ZONE | grep "GCE Agent Started"

Si la versión del agente invitado es anterior a 20231103.01, puedes actualizarla siguiendo las instrucciones de Actualizar el entorno invitado.

Para que las credenciales de la carga de trabajo y el paquete de confianza estén disponibles en el sistema de archivos de una máquina virtual, sigue estos pasos:

  1. Instala o actualiza el agente invitado de Compute Engine a la versión 20231103.01 o a una posterior. El agente invitado hace lo siguiente:

    • Recupera automáticamente las credenciales y el paquete de confianza del servidor de metadatos de Compute Engine.
    • Asegura que las escrituras en el sistema de archivos sean atómicas al actualizar el certificado X.509 y la clave privada correspondiente.
    • Actualiza automáticamente las credenciales y el paquete de confianza, por ejemplo, cuando se rotan los certificados de mTLS.
  2. Después de instalar o actualizar el agente invitado de Compute Engine en el SO invitado, el trabajo de actualización de la carga de trabajo crea el directorio /var/run/secrets/workload-spiffe-credentials y le asigna los permisos 0755 (rwxr-xr-x).

    El directorio contiene los siguientes archivos creados con permisos de 0644 (rw-r--r--):

    • private_key.pem: una clave privada con formato PEM
    • certificates.pem: un paquete de certificados X.509 en formato PEM que se puede presentar a otras máquinas virtuales como cadena de certificados de cliente o usar como cadena de certificados de servidor.
    • ca_certificates.pem: un paquete de certificados X.509 en formato PEM que se usará como ancla de confianza al validar los certificados de los peers.

      spiffe://POOL_ID.global.PROJECT_NUMBER.workload.id.goog
      
    • config_status: un archivo de registro que contiene mensajes de error.

  3. Las aplicaciones pueden leer los certificados, la clave privada y el paquete de confianza directamente desde el sistema de archivos para establecer conexiones mTLS.

Acceder a las credenciales de la carga de trabajo y al paquete de confianza mediante el servidor de metadatos

Una aplicación que se ejecuta en una VM de Compute Engine puede consultar directamente los endpoints del servidor de metadatos y recuperar las credenciales y el paquete de confianza. La aplicación se encarga de comprobar periódicamente los endpoints del servidor de metadatos para obtener nuevas credenciales y actualizaciones del paquete de confianza.

El servidor de metadatos de Compute Engine expone tres endpoints HTTP para permitir que las aplicaciones que se ejecutan en la VM usen la función de identidades de carga de trabajo gestionadas.

  • gce-workload-certificates/config-status: un endpoint que contenga errores en los valores de configuración proporcionados a través de los metadatos de la VM.
  • gce-workload-certificates/workload-identities: un endpoint de identidades gestionadas por el plano de control de Compute Engine. Este endpoint contiene el certificado X.509 y la clave privada del dominio de confianza de la VM.
  • gce-workload-certificates/trust-anchors: un endpoint que contiene un conjunto de certificados de confianza para la validación de la cadena de certificados X.509 del peer.

Para obtener más información sobre cómo consultar los metadatos de una instancia de VM, consulta Acerca de los metadatos de máquina virtual.

Para acceder a las credenciales de carga de trabajo y al paquete de confianza mediante el servidor de metadatos, tu aplicación debe hacer lo siguiente:

  1. Consulta el endpoint gce-workload-certificates/config-status. Asegúrate de que el código de respuesta HTTP sea 200 y de que la respuesta no contenga ningún error partnerMetadataConfigsErrors. Si se producen errores de este tipo, actualiza la configuración correspondiente con valores válidos siguiendo los pasos que se indican en Actualizar la configuración de emisión y confianza de certificados.

    Para comprobar el valor, puedes ejecutar el siguiente comando en la VM:

    curl "http://metadata.google.internal/computeMetadata/v1/instance/gce-workload-certificates/config-status" -H "Metadata-Flavor: Google"
    

    El endpoint config-status devuelve una respuesta JSON con la siguiente estructura:

    {
        "partnerMetadataConfigsErrors": {
            "errors": {  // A map of errors keyed by attribute name.
                "ATTRIBUTE_NAME" : "ERROR_DETAILS",
                ...
            }
        }
    }
    
  2. Consulta el endpoint gce-workload-certificates/workload-identities. Comprueba que el código de respuesta HTTP sea 200. El endpoint devuelve una respuesta JSON con la siguiente estructura:

    {
     "workloadCredentials": {  // Credentials for the VM's trust domains
       "spiffe://POOL_ID.global.PROJECT_NUMBER.workload.id.goog/ns/NAMESPACE_ID/sa/MANAGED_IDENTITY_ID": {
          "certificatePem" : "X.509 certificate or certificate chain",
          "privateKeyPem" : "Private for X.509 leaf certificate"
       }
     }
    }
    

    Extrae el certificatePem y el privateKeyPem. Es fundamental que ambos valores se lean de la misma respuesta para evitar que no coincidan la clave privada y la pública en caso de que la infraestructura de Compute Engine haya actualizado las identidades de carga de trabajo gestionadas.

  3. Consulta el endpoint gce-workload-certificates/trust-anchors. Asegúrate de que el código de respuesta HTTP sea 200. La respuesta solo contendrá las anclas de confianza del dominio de confianza de SPIFFE, si se ha especificado. De lo contrario, la consulta devuelve un error. El endpoint trust-anchors devuelve una respuesta JSON con la siguiente estructura:

    {
        "trustAnchors": {  // Trust bundle for the VM's trust domains
            "POOL_ID.global.PROJECT_NUMBER.workload.id.goog": {
                "trustAnchorsPem" : "Trust bundle containing the X.509
                roots certificates"
            }
        }
    }
    

    El contenido de trustAnchorsPem contiene el paquete de confianza que se puede usar para autenticar las credenciales X.509 de los pares al establecer una conexión mTLS.

Actualizar las credenciales y el paquete de confianza

El plano de control de Compute Engine rota automáticamente las credenciales de identidad de la carga de trabajo gestionada y los anclajes de confianza periódicamente.

Si tus aplicaciones usan el sistema de archivos para acceder a las credenciales de la carga de trabajo y al paquete de confianza, el agente invitado de Compute Engine actualiza automáticamente las credenciales y el paquete de confianza. Por ejemplo, cuando se rotan los certificados de mTLS.

Si tus aplicaciones consultan el servidor de metadatos, las aplicaciones que se ejecutan en una VM deben consultar periódicamente los endpoints del servidor de metadatos para obtener el conjunto más reciente de credenciales de identidad de carga de trabajo gestionada y el paquete de confianza. Si no lo haces, las aplicaciones pueden dejar de funcionar debido a que el certificado ha caducado o a que se han producido cambios en el paquete de confianza, lo que puede provocar que falle el establecimiento de la conexión mTLS. Google recomienda que las aplicaciones consulten el servidor de metadatos para obtener las credenciales de identidad de carga de trabajo gestionadas y el paquete de confianza cada 5 minutos.

Actualizar la configuración de emisión y confianza de certificados

Puedes modificar la configuración de emisión de certificados y la configuración de confianza de una VM que use identidades de carga de trabajo gestionadas.

Actualizar la plantilla de instancia de un grupo de instancias gestionado

Para actualizar los valores de configuración de emisión de certificados y de configuración de confianza en una plantilla de instancia, debes crear una plantilla con los nuevos valores. Por lo tanto, no se admite la actualización de la configuración de emisión de certificados y de confianza de los grupos de instancias gestionadas (MIGs) que ya existen.

Actualizar máquinas virtuales de Compute Engine concretas

Para actualizar la configuración de emisión de certificados y la configuración de confianza, actualiza el contenido del archivo CONFIGS.json y usa el comando gcloud beta compute instances update para aplicar los cambios:

gcloud beta compute instances update INSTANCE_NAME \
    --partner-metadata-from-file FILENAME.json

Haz los cambios siguientes:

  • INSTANCE_NAME: el nombre de la máquina virtual cuyos valores de configuración quieres actualizar.
  • FILENAME: el nombre del archivo de configuración modificado; por ejemplo, CONFIGS.json

Solucionar problemas

Para consultar métodos que te ayuden a diagnosticar y resolver errores habituales relacionados con la obtención de credenciales de cargas de trabajo, consulta la documentación sobre cómo solucionar problemas de autenticación entre cargas de trabajo.

Siguientes pasos