Autoriser l'accès de service à service

Si votre architecture utilise plusieurs services, vous aurez probablement besoin d'identifiants pour permettre la communication entre les services. Cloud Build est compatible avec la norme OpenID Connect (OIDC), qui permet de sécuriser l'authentification et l'autorisation entre les services.

Vous pouvez utiliser Cloud Build pour générer des jetons d'identification. Ces jetons vous permettent d'appeler des points de terminaison sécurisés depuis Cloud Build.

Par exemple, si vous exécutez une application de plate-forme sans serveur telle que Cloud Functions, Cloud Run ou App Engine, vous pouvez interagir en toute sécurité avec votre application depuis les charges de travail Cloud Build.

Avant de commencer

  • Activer les API Cloud Build and IAM.

    Activer les API

  • Si vous prévoyez d'utiliser ce compte pour créer des identifiants éphémères, vous devez également activer l'API d'identifiants de compte de service IAM.

    Activer l'API

  • Pour utiliser les exemples de ligne de commande de ce guide, installez et configurez la Google Cloud CLI.

  • Assurez-vous d'avoir créé le compte de service que vous souhaitez utiliser. Vous devez créer le compte dans le même projet Google Cloud que celui où vous exécutez les compilations.

Autorisations IAM requises

Votre compte de service spécifié par l'utilisateur doit disposer de l'autorisation iam.serviceAccounts.getOpenIdToken.

Pour obtenir des instructions sur l'attribution de rôles IAM à un compte de service, consultez la page Gérer l'accès aux comptes de service.

Méthodes pour obtenir un jeton d'ID

Il existe deux façons de configurer vos étapes de compilation pour obtenir des jetons d'ID:

  • utiliser la gcloud CLI
  • envoyer une requête directe au serveur de métadonnées

Obtenir un jeton d'ID via gcloud

Dans cette section, l'extrait de code suivant montre comment obtenir des jetons d'ID à l'aide de gcloud CLI:

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
  }
}

Remplacez les éléments suivants :

  • TOKEN_AUDIENCE est l'URL ou l'audience cible pour laquelle obtenir le jeton d'ID, par exemple http://www.example.com.
  • SERVICE_ACCOUNT_ID est l'adresse e-mail ou l'ID unique du compte de service spécifié par l'utilisateur. Par exemple, service-account-name@project-id.iam.gserviceaccount.com.
  • LOGS_BUCKET_LOCATION est le bucket Cloud Storage où stocker les journaux de compilation. Par exemple, gs://mylogsbucket.

Envoyer une requête directe au serveur de métadonnées

Dans cette section, l'extrait de code suivant montre comment envoyer une requête directe au serveur de métadonnées afin d'obtenir des jetons d'identification:

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
  }
}

Remplacez les éléments suivants :

  • TOKEN_AUDIENCE est l'URL ou l'audience cible pour laquelle obtenir le jeton d'ID, par exemple http://www.example.com.
  • SERVICE_ACCOUNT_ID est l'adresse e-mail ou l'ID unique du compte de service spécifié par l'utilisateur. Par exemple, service-account-name@project-id.iam.gserviceaccount.com.
  • LOGS_BUCKET_LOCATION est le bucket Cloud Storage où stocker les journaux de compilation. Par exemple, gs://mylogsbucket.

Pour obtenir des instructions supplémentaires sur la génération et l'utilisation de jetons d'ID dans vos charges de travail, consultez la section Méthodes d'obtention d'un jeton d'ID.

Étapes suivantes