Configura la federación de identidades para cargas de trabajo con certificados X.509

En esta guía, se describe cómo usar la federación de identidades para cargas de trabajo con certificados X.509 que emite tu autoridad certificadora (AC) para autenticarte en Google Cloud y acceder a Google Cloud recursos.

Si tus cargas de trabajo tienen un certificado de cliente mTLS, puedes registrar una o más AC con la federación de identidades para cargas de trabajo como entidades de confianza para autenticarte enGoogle Cloud . También puedes registrar AC intermedias.

Si usas la federación de identidades para cargas de trabajo, puedes permitir que estas cargas de trabajo obtengan credenciales Google Cloud de corta duración a través de una conexión TLS mutua (mTLS). Las cargas de trabajo pueden usar estas credenciales de corta duración para acceder a las APIs deGoogle Cloud .

Conceptos

Los conceptos de la integración basada en certificados X.509 incluyen los siguientes:

  • Un ancla de confianza es un certificado de AC que se considera la raíz de confianza. Cualquier cadena de certificados de cliente debe estar vinculada a una de las anclas de confianza.

  • Un AC intermedia es un certificado de autoridad certificadora opcional que ayuda a compilar la cadena de certificados del cliente.

  • Un almacén de confianza contiene los certificados del ancla de confianza y los certificados de la AC intermedios que se usan para validar la cadena de certificados de cliente. Una AC emite certificados de confianza para el cliente.

    Puedes subir los siguientes tipos de certificados de cliente al almacén de confianza:

    • Los certificados emitidos por CA de terceros que elijas
    • Certificados emitidos por tus AC privadas
    • Certificados firmados, como se describe en Crea certificados autofirmados

Antes de comenzar

Para comenzar a configurar la federación de Workload Identity, haz lo siguiente:

  1. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  2. Te recomendamos que uses un proyecto dedicado para administrar grupos de identidades para cargas de trabajo y proveedores.
  3. Verify that billing is enabled for your Google Cloud project.

  4. Enable the IAM, Resource Manager, Service Account Credentials, and Security Token Service APIs.

    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.

    Enable the APIs

Roles requeridos

Para obtener los permisos que necesitas para configurar la federación de Workload Identity, pídele a tu administrador que te otorgue los siguientes roles de IAM en el proyecto:

Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso a proyectos, carpetas y organizaciones.

También puedes obtener los permisos necesarios mediante roles personalizados o cualquier otro rol predefinido.

De manera alternativa, el rol básico de propietario de IAM (roles/owner) también incluye permisos para configurar la federación de identidades. No deberías otorgar funciones básicas en un entorno de producción, pero puedes otorgarlas en un entorno de desarrollo o de prueba.

Crea un almacén de confianza

En esta sección, se muestra cómo crear un almacén de confianza. A grandes rasgos, los pasos son los siguientes:

Genera certificados autofirmados

En esta sección, se muestra cómo generar claves y crear certificados firmados. Si ya creaste certificados, puedes omitir esta sección y continuar con Da formato a los certificados.

En esta sección, se usan comandos openssl para crear certificados raíz e intermedios.

Para generar un certificado raíz y un certificado intermedio firmado con los campos keyUsage y extendedKeyUsage válidos, haz lo siguiente:

  1. Crea un archivo de configuración openssl para crear tus certificados de firma. Como mínimo, el archivo es similar al siguiente, pero puedes establecer campos adicionales según sea necesario.

    cat > example.cnf << EOF
    [req]
    distinguished_name = empty_distinguished_name
    [empty_distinguished_name]
    # Kept empty to allow setting via -subj command-line argument.
    [ca_exts]
    basicConstraints=critical,CA:TRUE
    keyUsage=keyCertSign
    extendedKeyUsage=clientAuth
    [leaf_exts]
    keyUsage=critical,Digital Signature, Key Encipherment
    basicConstraints=critical, CA:FALSE
    EOF
    
  2. Crea el certificado raíz.

    openssl req -x509 \
        -new -sha256 -newkey rsa:2048 -nodes \
        -days 3650 -subj '/CN=root' \
        -config example.cnf \
        -extensions ca_exts \
        -keyout root.key -out root.cert
    
  3. Crea la solicitud de firma para el certificado intermedio.

    openssl req \
        -new -sha256 -newkey rsa:2048 -nodes \
        -subj '/CN=int' \
        -config example.cnf \
        -extensions ca_exts \
        -keyout int.key -out int.req
    
  4. Crea el certificado intermedio.

    openssl x509 -req \
        -CAkey root.key -CA root.cert \
        -set_serial 1 \
        -days 3650 \
        -extfile example.cnf \
        -extensions ca_exts \
        -in int.req -out int.cert
    
  5. Crea la solicitud de firma para el certificado de hoja.

    openssl req -new -sha256 -newkey rsa:2048 -nodes \
        -subj '/CN=example' \
        -config example.cnf \
        -extensions leaf_exts \
        -keyout leaf.key -out leaf.req
    
  6. Crea el certificado de hoja emitido por el certificado intermedio.

    openssl x509 -req \
        -CAkey int.key -CA int.cert \
        -set_serial 1 -days 3650 \
        -extfile example.cnf \
        -extensions leaf_exts \
        -in leaf.req -out leaf.cert
    

Da formato a los certificados

Para incluir certificados nuevos o existentes en un almacén de confianza, debes dar formato a los certificados en una cadena de una sola línea y almacenarlos en variables de entorno. Los certificados deben estar en formato PEM. Para dar formato a los certificados y almacenarlos en variables de entorno, haz lo siguiente:

  1. Guarda el certificado raíz como una cadena de una sola línea.

    export ROOT_CERT=$(cat root.cert | sed 's/^[ ]*//g' | sed -z '$ s/\n$//' | tr '\n' $ | sed 's/\$/\\n/g')
    
  2. Guarda un certificado intermedio como una cadena de una línea.

    export INTERMEDIATE_CERT=$(cat int.cert | sed 's/^[ ]*//g' | sed -z '$ s/\n$//' | tr '\n' $ | sed 's/\$/\\n/g')
    

Crea el almacén de confianza

En esta sección, crearás un almacén de confianza con un archivo con formato YAML que contenga tus anclas de confianza y AC intermedias.

Este archivo contiene el contenido del certificado de las variables de entorno que creaste en Da formato a los certificados. Para agregar anclas de confianza adicionales, agrega entradas trustAnchors adicionales en trustStore. Para agregar certificados de la AC intermedios adicionales, agrega entradas intermediateCas adicionales en trustStore.

Para crear el archivo de almacén de confianza, ejecuta el siguiente comando:

cat << EOF > trust_store.yaml
trustStore:
  trustAnchors:
  - pemCertificate: "${ROOT_CERT}"
  intermediateCas:
  - pemCertificate: "${INTERMEDIATE_CERT}"
EOF

Define una condición y la asignación de atributos

El certificado X.509 del cliente puede contener varios atributos. Debes seleccionar el atributo que deseas usar como identificador de asunto asignando google.subject en Google Cloud al atributo de tu certificado. Por ejemplo, si el atributo del certificado es el nombre común del sujeto, la asignación sería la siguiente: google.subject=assertion.subject.dn.cn

De manera opcional, puedes mapear atributos adicionales. Luego, puedes hacer referencia a estos atributos adicionales cuando otorgues acceso a los recursos.

Tus asignaciones de atributos pueden usar los atributos dentro del certificado de cliente, incluidos los siguientes:

  • serialNumberHex: Es el número de serie.
  • subject.dn.cn: Es el nombre común del sujeto.
  • subject.dn.o: El nombre de la organización del sujeto.
  • subject.dn.ou: Es la última unidad organizativa del sujeto.
  • issuer.dn.cn: Es el nombre común de la entidad emisora.
  • issuer.dn.o: Es el nombre de la organización emisora.
  • issuer.dn.ou: Es la última unidad organizativa de la entidad emisora.
  • san.dns: Es el primer nombre de DNS del nombre alternativo del sujeto.
  • san.uri: Es el primer URI del nombre alternativo del sujeto.
  • sha256Fingerprint: Hash del certificado de hoja SHA256 (Base64)

Debes asignar uno de estos atributos a google.subject para identificar de forma única al sujeto. Para protegerte contra las amenazas de falsificación de identidad, elige un atributo con un valor único que no pueda cambiarse. De forma predeterminada, el identificador google.subject se establece en el nombre común del asunto del certificado de cliente, assertion.subject.dn.cn.

De manera opcional, puedes definir una condición de atributo. Las condiciones de los atributos son expresiones CEL que pueden verificar los atributos de aserción y los atributos de destino. Si la condición del atributo se evalúa como true para una credencial determinada, se acepta la credencial. De lo contrario, se rechaza la credencial.

Puedes usar una condición de atributo para restringir qué sujetos pueden usar la federación de Workload Identity para obtener tokens de Google Cloudcorta duración.

Por ejemplo, la siguiente condición restringe el acceso a los certificados de cliente que contienen el ID de SPIFFE spiffe://example/path:

assertion.san.uri=="spiffe://example/path"

Configura la federación de Workload Identity

En esta sección, se muestra cómo configurar un grupo de Workload Identity y un proveedor de grupos de Workload Identity. Solo debes realizar estos pasos una vez para cada almacén de confianza. Luego, puedes usar el mismo grupo y proveedor de identidades para cargas de trabajo en varias cargas de trabajo y en varios proyectos de Google Cloud .

Crea el grupo de identidades para cargas de trabajo

  1. Para crear un nuevo grupo de Workload Identity, ejecuta el siguiente comando:

    gcloud iam workload-identity-pools create POOL_ID \
        --location="global" \
        --description="DESCRIPTION" \
        --display-name="DISPLAY_NAME"
    

    Reemplaza lo siguiente:

    • POOL_ID: el ID único para el grupo.
    • DISPLAY_NAME: el nombre del grupo.
    • DESCRIPTION: una descripción del grupo que eliges. Esta descripción aparece cuando otorgas acceso a identidades de grupo.

Crea el proveedor del grupo de identidades para cargas de trabajo

  1. Para agregar un proveedor de grupos de identidades para cargas de trabajo X.509, ejecuta el siguiente comando:

    gcloud iam workload-identity-pools providers create-x509 PROVIDER_ID \
        --location=global \
        --workload-identity-pool="POOL_ID" \
        --trust-store-config-path="TRUST_STORE_CONFIG" \
        --attribute-mapping="MAPPINGS" \
        --attribute-condition="CONDITIONS"
    

    Reemplaza lo siguiente:

    • PROVIDER_ID: Un ID de proveedor de grupos de identidades para cargas de trabajo único que elijas.
    • POOL_ID: El ID del grupo de identidades de cargas de trabajo que creaste antes.
    • TRUST_STORE_CONFIG: Es el archivo YAML del almacén de confianza.
    • MAPPINGS: Una lista separada por comas de las asignaciones de atributos que creaste antes en esta guía. Por ejemplo, google.subject=assertion.subject.dn.cn.
    • CONDITIONS: Opcional Es una condición de atributo que creaste antes en esta guía. Quita el parámetro si no tienes una condición de atributo.

Configura la aplicación de políticas de acceso adaptado al contexto para la federación de identidades para cargas de trabajo

Puedes reforzar la seguridad de los recursos contra los ataques de reproducción de tokens habilitando el acceso adaptado al contexto, que aplica la validación de mTLS para las solicitudes de acceso. En este proceso, una vinculación de mTLS incorpora políticas basadas en el contexto de transporte y usa el estado del certificado del cliente dentro de la sesión de TLS para tomar decisiones de autorización. En el caso de la federación de identidades para cargas de trabajo X.509, una vinculación de mTLS garantiza que todo el flujo de autenticación esté vinculado de forma segura a una carga de trabajo de confianza. Esto mitiga el riesgo de robo de credenciales, ya que la autenticación está vinculada a un extremo específico y de confianza.

Autentica una carga de trabajo

Debes realizar estos pasos una vez por cada carga de trabajo.

Permite que tu carga de trabajo externa acceda a los recursos de Google Cloud

Para proporcionar a tu carga de trabajo acceso a los recursos de Google Cloud , te recomendamos que otorgues acceso directo a los recursos al principal. En este caso, el principal es el usuario federado. Algunos Google Cloud productos tienen limitaciones de las APIs de Google Cloud. Si tu carga de trabajo llama a un extremo de API que tiene una limitación, puedes usar el robo de identidad temporal como cuenta de servicio. En este caso, el principal es la cuenta de servicioGoogle Cloud , que actúa como la identidad. Otorga acceso a la cuenta de servicio en el recurso.

Acceso directo a recursos

Puedes otorgar acceso a una identidad federada directamente en los recursos con la Google Cloud consola o gcloud CLI.

Console

Para usar la consola de Google Cloud para otorgar roles de IAM directamente en un recurso, debes ir a la página del recurso y, luego, otorgar el rol. En el siguiente ejemplo, se muestra cómo ir a la página de Cloud Storage y otorgar el rol de visualizador de objetos de almacenamiento (roles/storage.objectViewer) a una identidad federada directamente en un bucket de Cloud Storage.

  1. En la consola de Google Cloud , ve a la página Buckets de Cloud Storage.

    Ir a Buckets

  2. En la lista de buckets, haz clic en el nombre del bucket para el que deseas otorgar el rol.

  3. Elige la pestaña Permisos cerca de la parte superior de la página.

  4. Haz clic en el botón Otorgar acceso.

    Aparecerá el cuadro de diálogo Agregar principales.

  5. En el campo Nuevas principales, ingresa una o más identidades que necesiten acceso a tu bucket.

    Por tema

    principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/SUBJECT
    

    Reemplaza lo siguiente:

    • PROJECT_NUMBER: el número del proyecto
    • POOL_ID: el ID del grupo de cargas de trabajo
    • SUBJECT: El sujeto individual asignado desde tu IdP, por ejemplo, administrator@example.com

    Por grupo

    principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/group/GROUP
    

    Reemplaza lo siguiente:

    • PROJECT_NUMBER: el número del proyecto
    • WORKLOAD_POOL_ID: el ID del grupo de cargas de trabajo
    • GROUP: El grupo asignado desde tu IdP, por ejemplo: administrator-group@example.com

    Por atributo

    principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/attribute.ATTRIBUTE_NAME/ATTRIBUTE_VALUE
    

    Reemplaza lo siguiente:

    • PROJECT_NUMBER: el número del proyecto
    • WORKLOAD_POOL_ID: el ID del grupo de cargas de trabajo
    • ATTRIBUTE_NAME: Uno de los atributos que se asignó desde tu IdP
    • ATTRIBUTE_VALUE: el valor del atributo.
  6. Elige un rol (o roles) del menú desplegable Selecciona un rol. Las funciones que seleccionas aparecen en el panel con una descripción breve del permiso que otorgan.

  7. Haz clic en Guardar.

gcloud

Para usar la CLI de gcloud para otorgar roles de IAM en un recurso en un proyecto, haz lo siguiente:

  1. Obtén el número del proyecto en el que se define el recurso.

    gcloud projects describe $(gcloud config get-value core/project) --format=value\(projectNumber\)
    
  2. Otorga el acceso al recurso.

    Para usar gcloud CLI con el objetivo de otorgar el rol de Visualizador de objetos de almacenamiento (roles/storage.objectViewer) a identidades externas que cumplan con ciertos criterios, ejecuta el siguiente comando.

    Por tema

    gcloud storage buckets add-iam-policy-binding BUCKET_ID \
        --role=roles/storage.objectViewer \
        --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/SUBJECT"

    Por grupo

    gcloud storage buckets add-iam-policy-binding BUCKET_ID \
        --role=roles/storage.objectViewer \
        --member="principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/group/GROUP"

    Por atributo

    gcloud storage buckets add-iam-policy-binding BUCKET_ID \
        --role=roles/storage.objectViewer \
        --member="principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/attribute.ATTRIBUTE_NAME/ATTRIBUTE_VALUE"

    Reemplaza lo siguiente:

    • BUCKET_ID: Es el bucket en el que se otorgará acceso.
    • PROJECT_NUMBER: el número del proyecto que contiene el grupo de Workload Identity.
    • POOL_ID: el ID del grupo de identidades para cargas de trabajo
    • SUBJECT: el valor esperado para el atributo que asignaste a google.subject
    • GROUP: el valor esperado para el atributo que asignaste a google.groups
    • ATTRIBUTE_NAME: el nombre de un atributo personalizado en la asignación de atributos
    • ATTRIBUTE_VALUE: Es el valor del atributo personalizado en tu asignación de atributos.

    Puedes otorgar roles en cualquier Google Cloud recurso que admita políticas de permisos de IAM.

Uso de identidad temporal como cuenta de servicio

  1. Para crear una cuenta de servicio para la carga de trabajo externa, haz lo siguiente:

    1. Enable the IAM, Security Token Service, and Service Account Credentials APIs.

      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.

      Enable the APIs

    2. Crea una cuenta de servicio que represente la carga de trabajo. Te recomendamos que uses una cuenta de servicio dedicada para cada carga de trabajo. No es necesario que la cuenta de servicio esté en el mismo proyecto que el grupo de identidades para cargas de trabajo, pero debes consultar el proyecto que contiene la cuenta de servicio.

    3. Otorga acceso a la cuenta de servicio a los recursos a los que deseas que accedan las identidades externas.

  2. Para permitir que la identidad federada actúe en nombre de la cuenta de servicio, haz lo siguiente:

Console

Para usar la consola de Google Cloud para otorgar roles de IAM a una identidad federada con una cuenta de servicio, haz lo siguiente:

Cuenta de servicio en el mismo proyecto

  1. Para otorgar acceso mediante la identidad temporal como cuenta de servicio para una cuenta de servicio en el mismo proyecto, haz lo siguiente:

    1. Ve a la página Grupos de identidades para cargas de trabajo.

      Ir a Grupos de Workload Identity

    2. Selecciona Otorgar acceso.

    3. En el cuadro de diálogo Otorgar acceso a la cuenta de servicio, selecciona Otorgar acceso mediante la identidad temporal como cuenta de servicio.

    4. En la lista Cuentas de servicio, selecciona la cuenta de servicio para las identidades externas que actuarán en nombre de ella y haz lo siguiente:

    5. Para elegir qué identidades en el grupo pueden actuar en nombre de la cuenta de servicio, realiza una de las siguientes acciones:

      • Para permitir que solo las identidades específicas del grupo de identidades para cargas de trabajo actúen en nombre de la cuenta de servicio, selecciona Solo identidades que coinciden con el filtro.

      • En la lista Nombre del atributo, selecciona el atributo que deseas filtrar.

      • En el campo Valor del atributo, ingresa el valor esperado del atributo; por ejemplo, si usas una asignación de atributos google.subject=assertion.sub, establece el nombre del atributo en subject y el valor del atributo en el valor de la declaración sub en los tokens que emite tu proveedor de identidad externo.

    6. Para guardar la configuración, haz clic en Guardar y, luego, en Descartar.

Cuenta de servicio en otro proyecto

  1. Para otorgar acceso mediante la identidad temporal como cuenta de servicio para una cuenta de servicio en un proyecto diferente, haz lo siguiente:

    1. Ve a la página de cuentas de servicio.

      Ir a Cuentas de servicio

    2. Elige la cuenta de servicio de la que quieres usar la identidad.

    3. Haz clic en Administrar acceso.

    4. Haz clic en Agregar principal.

    5. En el campo Principal nuevo, ingresa uno de los siguientes identificadores principales para las identidades de tu grupo que actuarán en nombre de la cuenta de servicio.

      Por tema

      principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/SUBJECT
      

      Reemplaza lo siguiente:

      • PROJECT_NUMBER: el número del proyecto
      • POOL_ID: el ID del grupo de cargas de trabajo
      • SUBJECT: El sujeto individual asignado desde tu IdP, por ejemplo, administrator@example.com

      Por grupo

      principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/group/GROUP
      

      Reemplaza lo siguiente:

      • PROJECT_NUMBER: el número del proyecto
      • WORKLOAD_POOL_ID: el ID del grupo de cargas de trabajo
      • GROUP: El grupo asignado desde tu IdP, por ejemplo: administrator-group@example.com

      Por atributo

      principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/attribute.ATTRIBUTE_NAME/ATTRIBUTE_VALUE
      

      Reemplaza lo siguiente:

      • PROJECT_NUMBER: el número del proyecto
      • WORKLOAD_POOL_ID: el ID del grupo de cargas de trabajo
      • ATTRIBUTE_NAME: Uno de los atributos que se asignó desde tu IdP
      • ATTRIBUTE_VALUE: el valor del atributo.

      Junto al grupo

      principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/*
      

      Reemplaza lo siguiente:

      • PROJECT_NUMBER: el número del proyecto
      • WORKLOAD_POOL_ID: el ID del grupo de cargas de trabajo
    6. En Selecciona un rol, elige el rol de usuario de Workload Identity (roles/iam.workloadIdentityUser).

    7. Para guardar la configuración, haz clic en Guardar.

gcloud

Para otorgar el rol de usuario de Workload Identity (roles/iam.workloadIdentityUser) a un principal federado o a un conjunto de principales, ejecuta el siguiente comando. Para obtener más información sobre los identificadores principales de la federación de identidades para cargas de trabajo, consulta Tipos de principales.

Por tema

gcloud iam service-accounts add-iam-policy-binding SERVICE_ACCOUNT_EMAIL \
    --role=roles/iam.workloadIdentityUser \
    --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/SUBJECT"

Por grupo

gcloud iam service-accounts add-iam-policy-binding SERVICE_ACCOUNT_EMAIL \
    --role=roles/iam.workloadIdentityUser \
    --member="principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/group/GROUP"

Por atributo

gcloud iam service-accounts add-iam-policy-binding SERVICE_ACCOUNT_EMAIL \
    --role=roles/iam.workloadIdentityUser \
    --member="principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/attribute.ATTRIBUTE_NAME/ATTRIBUTE_VALUE"

Reemplaza lo siguiente:

  • SERVICE_ACCOUNT_EMAIL: La dirección de correo electrónico de la cuenta de servicio
  • PROJECT_NUMBER: el número del proyecto que contiene el grupo de Workload Identity.
  • POOL_ID: el ID del grupo de identidades para cargas de trabajo
  • SUBJECT: el valor esperado para el atributo que asignaste a google.subject
  • GROUP: el valor esperado para el atributo que asignaste a google.groups
  • ATTRIBUTE_NAME: el nombre de un atributo personalizado en la asignación de atributos
  • ATTRIBUTE_VALUE: Es el valor del atributo personalizado en tu asignación de atributos.

Descarga o crea una configuración de credenciales

Las bibliotecas cliente de Cloud y gcloud CLI pueden obtener credenciales externas de forma automática y usarlas para actuar en nombre de una cuenta de servicio. Para permitir que las bibliotecas y las herramientas completen este proceso, debes proporcionar un archivo de configuración de credenciales. En este archivo, se proporciona la siguiente información:

  • Dónde obtener credenciales externas
  • Qué grupo y proveedor de identidades para cargas de trabajo usar
  • Qué cuenta de servicio actuará en nombre de ella

Además, para la integración de certificados X.509, se requiere un archivo de configuración de certificado. Este archivo contiene rutas de acceso al certificado de cliente X.509 y a los archivos de claves privadas.

Crea archivos de configuración de credenciales y certificados que permitan que la biblioteca obtenga tokens de acceso con certificados X.509.

Acceso directo a recursos

Para crear archivos de configuración de credenciales y certificados para el acceso directo a los recursos con gcloud iam workload-identity-pools create-cred-config, haz lo siguiente:

gcloud iam workload-identity-pools create-cred-config \
  projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID \
    --credential-cert-path=CLIENT_CERT_PATH \
    --credential-cert-private-key-path=CLIENT_PRIVATE_KEY_PATH \
    --credential-cert-trust-chain-path=TRUST_CHAIN_PATH \
    --output-file=FILEPATH.json

Reemplaza lo siguiente:

  • PROJECT_NUMBER: Es el número del proyecto que contiene el grupo de identidades para cargas de trabajo.
  • POOL_ID: El ID del grupo de identidades para cargas de trabajo.
  • PROVIDER_ID: El ID del proveedor de grupos de identidades para cargas de trabajo.
  • CLIENT_CERT_PATH: Es la ruta de acceso al archivo del certificado del cliente.
  • CLIENT_PRIVATE_KEY_PATH: La ruta de acceso al archivo de claves privadas del certificado del cliente.
  • TRUST_CHAIN_PATH: Opcional Es la ruta de acceso del archivo de la cadena de confianza que contiene los certificados intermedios que no están configurados en el proveedor x509.
  • FILEPATH: El archivo en el que se guardará la configuración

Si ejecutas este comando, también se creará un archivo de configuración de certificado y se almacenará en la ubicación predeterminada de gcloud CLI:

  • Linux y macOS: ~/.config/gcloud/certificate_config.json

  • Windows: %APPDATA%\gcloud\certificate_config.json

Uso de identidad temporal como cuenta de servicio

Para crear archivos de configuración de credenciales y certificados con la identidad temporal como cuenta de servicio con gcloud iam workload-identity-pools create-cred-config, haz lo siguiente:

gcloud iam workload-identity-pools create-cred-config \
  projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID \
    --service-account=SERVICE_ACCOUNT_EMAIL \
    --service-account-token-lifetime-seconds=SERVICE_ACCOUNT_TOKEN_LIFETIME \
    --credential-cert-path=CLIENT_CERT_PATH \
    --credential-cert-private-key-path=CLIENT_KEY_PATH \
    --credential-cert-trust-chain-path=TRUST_CHAIN_PATH \
    --output-file=FILEPATH.json

Reemplaza lo siguiente:

  • PROJECT_NUMBER: Es el número del proyecto que contiene el grupo de identidades para cargas de trabajo.
  • POOL_ID: El ID del grupo de identidades para cargas de trabajo.
  • PROVIDER_ID: El ID del proveedor de grupos de identidades para cargas de trabajo.
  • SERVICE_ACCOUNT_EMAIL: Si usas la identidad temporal como cuenta de servicio, reemplaza por la dirección de correo electrónico de la cuenta de servicio.
  • SERVICE_ACCOUNT_TOKEN_LIFETIME: Es el ciclo de vida del token de acceso a la cuenta de servicio, en segundos, si usas la identidad temporal como cuenta de servicio. Si se omite, la vida útil predeterminada es de una hora. Omite esta marca si no usas la identidad temporal como cuenta de servicio. Para especificar un ciclo de vida de más de una hora, debes configurar la restricción de la política de la organización constraints/iam.allowServiceAccountCredentialLifetimeExtension.
  • CLIENT_CERT_PATH: Es la ruta de acceso al archivo del certificado del cliente.
  • CLIENT_PRIVATE_KEY_PATH: La ruta de acceso al archivo de claves privadas del certificado del cliente.
  • TRUST_CHAIN_PATH: Opcional Es la ruta de acceso del archivo de la cadena de confianza que contiene los certificados intermedios no configurados en el proveedor x509.
  • FILEPATH: El archivo en el que se guardará la configuración

Si ejecutas este comando, también se creará un archivo de configuración de certificado y se almacenará en la ubicación predeterminada de Google Cloud CLI:

  • Linux y macOS: ~/.config/gcloud/certificate_config.json

  • Windows: %APPDATA%\gcloud\certificate_config.json

Usa la configuración de credenciales para acceder a Google Cloud

Para permitir que las herramientas y las bibliotecas cliente usen tu configuración de credenciales, haz lo siguiente: Para obtener más información sobre las credenciales predeterminadas de la aplicación, consulta Cómo funcionan las credenciales predeterminadas de la aplicación.

  1. Inicializa una variable de entorno GOOGLE_APPLICATION_CREDENTIALS y configúrala en el archivo de configuración de credenciales:

    Bash

      export GOOGLE_APPLICATION_CREDENTIALS=`pwd`/FILEPATH.json
      
    Reemplaza FILEPATH por la ruta de acceso relativa al archivo de configuración de credenciales.

    PowerShell

      $env:GOOGLE_APPLICATION_CREDENTIALS = Resolve-Path 'FILEPATH.json'
      
    Reemplaza FILEPATH por la ruta de acceso relativa al archivo de configuración de credenciales.
  2. Asegúrate de que la biblioteca cliente pueda encontrar el archivo de configuración del certificado. El archivo de configuración del certificado se encuentra en una de las siguientes rutas:

    • Ruta de acceso predeterminada de gcloud CLI:

      • Linux y macOS: ~/.config/gcloud/certificate_config.json

      • Windows: %APPDATA%\gcloud\certificate_config.json

    • Es la ruta de acceso establecida en la variable de entorno GOOGLE_API_CERTIFICATE_CONFIG.

  3. Usa las siguientes bibliotecas cliente de Cloud que admiten la federación de identidades para cargas de trabajo con certificados X.509.

    Go

    Las bibliotecas cliente para Go admiten la federación de identidades para cargas de trabajo X.509 si usan la versión 0.16.0 o posterior del módulo cloud.google.com/go/auth y la versión 0.189.0 del módulo google.golang.org/api.

    Para comprobar qué versión de estos módulos usa tu biblioteca cliente, ejecuta el siguiente comando mientras estés en el directorio que contiene el archivo go.mod de tu módulo:

      go list -m cloud.google.com/go/auth
      go list -m cloud.google.com/api
    

    Python

    Las bibliotecas cliente para Python admiten la federación de identidades para cargas de trabajo X.509 si usan la versión 2.39.0 o posterior del paquete google-auth.

    Para verificar qué versión de este paquete usa tu biblioteca cliente, ejecuta el siguiente comando en el entorno en el que está instalado el paquete:

      pip show google-auth
    

    Si deseas especificar un ID del proyecto para el cliente de autenticación, puedes configurar la variable de entorno GOOGLE_CLOUD_PROJECT o permitir que el cliente busque el ID del proyecto automáticamente. Para encontrar el ID del proyecto de manera automática, la cuenta de servicio en el archivo de configuración debe tener el rol de Navegador (roles/browser) o un rol con permisos equivalentes en tu proyecto. Para obtener más información, consulta la guía del usuario del paquete google-auth.

  4. Si tu carga de trabajo se ejecuta en macOS, configura CLOUDSDK_PYTHON_SITEPACKAGES=1 para configurar gcloud CLI de modo que use bibliotecas de Python fuera de su directorio de instalación.

  5. Para autenticarte con gcloud CLI, ejecuta el siguiente comando:

    gcloud auth login --cred-file=FILEPATH.json
    

    Reemplaza FILEPATH por la ruta de acceso al archivo de configuración de credenciales.

    La compatibilidad con la federación de identidades para cargas de trabajo X.509 en gcloud CLI está disponible en la versión 538.0 y posteriores de gcloud CLI.

Obtén un token de acceso con una solicitud sin formato para acceder a Google Cloud

Crea la cadena de confianza

En este paso, se muestra cómo crear la cadena de confianza. Pasas la cadena de confianza en el campo subject_token cuando llamas al servicio de tokens de seguridad en una solicitud simple.

Da formato a los certificados que deben incluirse en la cadena como una lista con formato JSON, según se especifica en RFC 7515. El certificado de hoja que se usa para el protocolo de enlace mTLS debe especificarse como el primer elemento. Cada certificado del paquete debe ser una cadena codificada en base64.

  1. Guarda el certificado de hoja y el certificado intermedio en cadenas codificadas en base64.

    export LEAF_CERT=$(openssl x509 -in leaf.cert -out leaf.der -outform DER && cat leaf.der | openssl enc -base64 -A)
    
    export INTERMEDIATE_CERT=$(openssl x509 -in int.cert -out int.der -outform DER && cat int.der | openssl enc -base64 -A)
    
  2. Crea una lista de cadenas con formato JSON que se pueda pasar como subject_token en la llamada al Servicio de tokens de seguridad, más adelante en este documento.

    export TRUST_CHAIN="[\\\"${LEAF_CERT}\\\", \\\"${INTERMEDIATE_CERT}\\\"]"
    

Obtén un token de acceso

Para obtener el token de acceso, haz lo siguiente:

  1. Realiza el intercambio de tokens con mTLS y el certificado de cliente:

    curl --key CLIENT_CERT_KEY \
    --cert CLIENT_CERT \
    --request POST 'https://sts.mtls.googleapis.com/v1/token' \
    --header "Content-Type: application/json" \
    --data-raw '{
        "subject_token_type": "urn:ietf:params:oauth:token-type:mtls",
        "grant_type": "urn:ietf:params:oauth:grant-type:token-exchange",
        "audience": "WORKLOAD_IDENTITY_POOL_URI",
        "requested_token_type": "urn:ietf:params:oauth:token-type:access_token",
        "scope": "https://www.googleapis.com/auth/cloud-platform",
        "subject_token": "TRUST_CHAIN"
    }'
    

    Reemplaza lo siguiente:

    • CLIENT_CERT_KEY: la clave privada del certificado del cliente
    • CLIENT_CERT: el certificado de cliente
    • WORKLOAD_IDENTITY_POOL_URI: La URL del proveedor de grupos de identidades para cargas de trabajo en el siguiente formato:

      //iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID

    • TRUST_CHAIN: Es la cadena de confianza necesaria para verificar el certificado de hoja. Debe incluir, al menos, CLIENT_CERT como primer elemento. Si seguiste las instrucciones de la sección Cómo dar formato a los certificados, reemplaza TRUST_CHAIN por '"${TRUST_CHAIN}"'.

  2. Usa el token de acceso de portador que se generó en el paso anterior para acceder a los recursos deGoogle Cloud , por ejemplo:

    curl -X GET 'https://storage.googleapis.com/my_object' -H "Authorization: Bearer $ACCESS_TOKEN"
    

Límites

En la siguiente tabla, se enumeran los límites.

Elemento Límite Notas
Cantidad de anclas de confianza 3 Cada certificado no debe superar los 32 KB.
Cantidad de certificados intermedios 10 Cada certificado no debe exceder los 32 KB.
Cantidad de restricciones de nombres permitidas durante la validación de certificados raíz e intermedios 10
Certificados intermedios que comparten la misma información del sujeto y su clave pública 5 Este límite es para cada almacén de confianza.
Profundidad de la cadena de certificados 5 La profundidad máxima de una cadena de certificados, incluidos los certificados raíz y de cliente.
Cantidad de veces que se pueden evaluar los certificados intermedios cuando se intenta crear la cadena de confianza 100
Claves de certificados subidos y pasados del cliente

Las claves RSA pueden ser de 2048 a 4096 bits.

Los certificados ECDSA deben usar las curvas P-256 o P-384.

Se recomiendan RSA-2048 y P-256 para casos de uso normales. Usa otros para las prácticas recomendadas de seguridad.
Duración máxima del certificado de hoja 390 días. Se rechazarán los certificados de hoja emitidos hace más de 390 días.

¿Qué sigue?