Autoriza el acceso de servicio a servicio

Si tu arquitectura usa varios servicios, es probable que necesites credenciales para habilitar la comunicación entre servicios. Cloud Build proporciona compatibilidad integrada con el estándar 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 Functions, Cloud Run o App Engine, puedes interactuar de forma segura con ella desde las cargas de trabajo de Cloud Build.

Antes de comenzar

  • Habilita las API de Cloud Build and IAM.

    Habilita las API

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

    Habilita 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 proyecto de Google Cloud en el que ejecutas las compilaciones.

Permisos de IAM obligatorios

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

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

Métodos para obtener un token de ID

Existen dos maneras de configurar los pasos de compilación para obtener tokens de ID:

  • usar gcloud CLI
  • enviar una solicitud directa al servidor de metadatos

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

En esta sección, en el siguiente fragmento de código, se 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 obtener 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, en el siguiente fragmento de código, se 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 obtener 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

Si quieres obtener instrucciones adicionales para generar y usar tokens de ID en tus cargas de trabajo, consulta Métodos para obtener un token de ID.

¿Qué sigue?