Autoriza el acceso de servicio a servicio

Si en tu arquitectura usas varios servicios, es probable que necesites credenciales para habilitar la comunicación entre ellos. Cloud Build proporciona compatibilidad integrada con el estándar de OpenID Connect (OIDC) para la autenticación y autorización seguras entre servicios.

Puedes usar Cloud Build para generar tokens de ID. Con estos tokens, puedes llamar a extremos seguros desde Cloud Build.

Por ejemplo, si ejecutas una aplicación de plataforma sin servidores como Cloud Run Functions, Cloud Run o App Engine, puedes interactuar de forma segura con tu aplicación desde las cargas de trabajo de Cloud Build.

Antes de comenzar

  • Habilita las APIs de Cloud Build y IAM.

    Roles necesarios para habilitar las APIs

    Para habilitar las APIs, necesitas el rol de IAM de administrador de Service Usage (roles/serviceusage.serviceUsageAdmin), que contiene el permiso serviceusage.services.enable. Obtén más información para otorgar roles.

    Habilitar las API

  • Si planeas usar esta cuenta para crear credenciales de corta duración, también debes habilitar la API de Service Account Credentials.

    Roles necesarios para habilitar las APIs

    Para habilitar las APIs, necesitas el rol de IAM de administrador de Service Usage (roles/serviceusage.serviceUsageAdmin), que contiene el permiso serviceusage.services.enable. Obtén más información para otorgar roles.

    Habilitar la API

  • Para usar los ejemplos de la línea de comandos de esta guía, instala y configura Google Cloud CLI.

  • Asegúrate de haber creado la cuenta de servicio que deseas usar. Debes crear la cuenta en el mismo Google Cloud proyecto en el que ejecutas las compilaciones.

Permisos de IAM obligatorios

Tu cuenta de servicio especificada por el usuario debe tener el permiso iam.serviceAccounts.getOpenIdToken.

Para obtener instrucciones sobre cómo otorgar roles de IAM a una cuenta de servicio, consulta Administra el acceso a las cuentas de servicio.

Métodos para obtener un token de ID

Hay dos formas de configurar tus pasos de compilación para obtener tokens de ID:

  • Usa gcloud CLI.
  • Envía una solicitud directa al servidor de metadatos.

Obtén un token de ID a través de gcloud

En esta sección, el siguiente fragmento de código muestra cómo usar la gcloud CLI para obtener tokens de ID:

YAML

steps:

- name: 'gcr.io/cloud-builders/gcloud'
  script: 'gcloud auth print-identity-token --audiences ${_TOKEN_AUDIENCE} > /workspace/identity_token.txt'
  env:
  - _TOKEN_AUDIENCE=${_TOKEN_AUDIENCE}
service_account: '$_SERVICE_ACCOUNT'
substitutions:
  _TOKEN_AUDIENCE: 'TOKEN_AUDIENCE'
  _SERVICE_ACCOUNT_ID: 'SERVICE_ACCOUNT_ID'
  _SERVICE_ACCOUNT: 'projects/${PROJECT_ID}/serviceAccounts/${_SERVICE_ACCOUNT_ID}'
logsBucket: 'LOGS_BUCKET_LOCATION'
options:
  logging: GCS_ONLY
  dynamic_substitutions: true

JSON

{
  "steps": [
      {
          "name": "gcr.io/cloud-builders/gcloud",
          "script": "gcloud auth print-identity-token --audiences ${_TOKEN_AUDIENCE} > /workspace/identity_token.txt"
          "env": [
              "_TOKEN_AUDIENCE=${_TOKEN_AUDIENCE}"
          ]
      }
  ],
  "service_account": "$_SERVICE_ACCOUNT",
  "substitutions": {
      "_TOKEN_AUDIENCE": "TOKEN_AUDIENCE",
      "_SERVICE_ACCOUNT_ID": "SERVICE_ACCOUNT_ID",
      "_SERVICE_ACCOUNT": "projects/${PROJECT_ID}/serviceAccounts/${_SERVICE_ACCOUNT_ID}"
  },
  "logsBucket": "LOGS_BUCKET_LOCATION",
  "options": {
      "logging": "GCS_ONLY",
      "dynamic_substitutions": true
  }
}

Reemplaza lo siguiente:

  • TOKEN_AUDIENCE es la URL o el público objetivo para el que se obtendrá el token de ID, como http://www.example.com.
  • SERVICE_ACCOUNT_ID es la dirección de correo electrónico o el ID único de la cuenta de servicio especificada por el usuario. Por ejemplo, service-account-name@project-id.iam.gserviceaccount.com.
  • LOGS_BUCKET_LOCATION es el bucket de Cloud Storage para almacenar registros de compilación. Por ejemplo, gs://mylogsbucket.

Envía una solicitud directa al servidor de metadatos

En esta sección, el siguiente fragmento de código muestra cómo realizar una solicitud directa al servidor de metadatos para obtener tokens de ID:

YAML

steps:
- name: 'gcr.io/cloud-builders/curl'
  id: 'printTokenFromCurl'
  script: |
    curl -H 'Metadata-Flavor: Google' http://metadata/computeMetadata/v1/instance/service-accounts/default/identity?audience=${_TOKEN_AUDIENCE} -o /workspace/identity_token.txt
  env:
  - _TOKEN_AUDIENCE=${_TOKEN_AUDIENCE}
service_account: '$_SERVICE_ACCOUNT'
substitutions:
  _TOKEN_AUDIENCE: 'TOKEN_AUDIENCE'
  _SERVICE_ACCOUNT_ID: 'SERVICE_ACCOUNT_ID'
  _SERVICE_ACCOUNT: 'projects/${PROJECT_ID}/serviceAccounts/${_SERVICE_ACCOUNT_ID}'
logsBucket: 'LOGS_BUCKET_LOCATION'
options:
  logging: GCS_ONLY
  dynamic_substitutions: true

JSON

{
  "steps": [
      {
          "name": "gcr.io/cloud-builders/curl",
          "id": "printTokenFromCurl"
          "script": "curl -H 'Metadata-Flavor: Google' http://metadata/computeMetadata/v1/instance/service-accounts/default/identity?audience=${_TOKEN_AUDIENCE} -o /workspace/identity_token.txt"
          "env":
              "_TOKEN_AUDIENCE=${_TOKEN_AUDIENCE}"
      }
  ],
  "service_account": "$_SERVICE_ACCOUNT",
  "substitutions": {
      "_TOKEN_AUDIENCE": "TOKEN_AUDIENCE",
      "_SERVICE_ACCOUNT_ID": "SERVICE_ACCOUNT_ID",
      "_SERVICE_ACCOUNT": "projects/${PROJECT_ID}/serviceAccounts/${_SERVICE_ACCOUNT_ID}"
  },
  "logsBucket": "LOGS_BUCKET_LOCATION",
  "options": {
      "logging": "GCS_ONLY",
      "dynamic_substitutions": true
  }
}

Reemplaza lo siguiente:

  • TOKEN_AUDIENCE es la URL o el público objetivo para el que se obtendrá el token de ID, como http://www.example.com.
  • SERVICE_ACCOUNT_ID es la dirección de correo electrónico o el ID único de la cuenta de servicio especificada por el usuario. Por ejemplo, service-account-name@project-id.iam.gserviceaccount.com.
  • LOGS_BUCKET_LOCATION es el bucket de Cloud Storage para almacenar registros de compilación. Por ejemplo, gs://mylogsbucket.

Para obtener instrucciones adicionales sobre cómo generar y usar tokens de ID en tus cargas de trabajo, consulta Métodos para obtener un token de ID.

¿Qué sigue?