Autorizar o acesso de serviço a serviço

Se sua arquitetura usar vários serviços, você provavelmente precisará de credenciais para ativar a comunicação entre serviços. O Cloud Build oferece suporte integrado ao padrão OpenID Connect (OIDC) para autenticação e autorização seguras entre serviços.

É possível usar o Cloud Build para gerar tokens de ID. Com esses tokens, é possível chamar endpoints seguros no Cloud Build.

Por exemplo, se você estiver executando um aplicativo de plataforma sem servidor, como o Cloud Functions, o Cloud Run ou o App Engine, poderá interagir com o aplicativo com segurança dentro das cargas de trabalho do Cloud Build.

Antes de começar

  • Ative as APIs Cloud Build and IAM.

    Ative as APIs

  • Se você planeja usar essa conta para criar credenciais de curta duração, também precisa ativar a API Service Account Credentials do IAM.

    Ative a API

  • Para usar os exemplos de linha de comando neste guia, instale e configure a Google Cloud CLI.

  • Certifique-se de ter criado a conta de serviço a ser usada. Você precisa criar a conta no mesmo projeto do Google Cloud em que está executando as versões.

Permissões do IAM obrigatórias

A conta de serviço especificada pelo usuário precisa ter a permissão iam.serviceAccounts.getOpenIdToken.

Para instruções sobre como conceder papéis do IAM a uma conta de serviço, consulte Gerenciar o acesso a contas de serviço.

Métodos para receber um token de ID

Há duas maneiras de configurar suas etapas de build para receber tokens de ID:

  • usar a CLI gcloud
  • enviar uma solicitação direta ao servidor de metadados

Receber um token de ID com a gcloud

Nesta seção, o snippet de código a seguir demonstra como usar a CLI gcloud para receber 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
  }
}

Substitua:

  • TOKEN_AUDIENCE é o URL ou público-alvo para o qual receber o token de ID, como http://www.example.com.
  • SERVICE_ACCOUNT_ID é o endereço de e-mail ou o ID exclusivo da conta de serviço especificada pelo usuário. Por exemplo, service-account-name@project-id.iam.gserviceaccount.com.
  • LOGS_BUCKET_LOCATION é o bucket do Cloud Storage para armazenar registros da versão. Por exemplo, gs://mylogsbucket.

Enviar uma solicitação direta ao servidor de metadados

Nesta seção, o snippet de código a seguir demonstra como fazer uma solicitação direta ao servidor de metadados para receber 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
  }
}

Substitua:

  • TOKEN_AUDIENCE é o URL ou público-alvo para o qual receber o token de ID, como http://www.example.com.
  • SERVICE_ACCOUNT_ID é o endereço de e-mail ou o ID exclusivo da conta de serviço especificada pelo usuário. Por exemplo, service-account-name@project-id.iam.gserviceaccount.com.
  • LOGS_BUCKET_LOCATION é o bucket do Cloud Storage para armazenar registros do build. Por exemplo, gs://mylogsbucket.

Para mais instruções sobre como gerar e usar tokens de ID nas cargas de trabalho, consulte Métodos para receber um token de ID.

A seguir