Dienst-zu-Dienst-Zugriff autorisieren

Wenn Ihre Architektur mehrere Dienste verwendet, benötigen Sie wahrscheinlich Anmeldedaten um die Kommunikation zwischen Diensten zu ermöglichen. Cloud Build bietet integrierte Unterstützung für den OpenID Connect (OIDC)-Standard für die sichere Authentifizierung und Autorisierung zwischen Diensten.

Sie können mit Cloud Build ID-Tokens generieren. Mit diesen Tokens können sichere Endpunkte aus Cloud Build aufrufen.

Wenn Sie beispielsweise eine serverlose Plattformanwendung wie Cloud Run-Funktionen, Cloud Run oder App Engine können Sie von Cloud Build-Arbeitslasten aus mit Ihrer Anwendung interagieren.

Hinweise

  • Enable the Cloud Build and IAM APIs.

    Enable the APIs

  • Wenn Sie dieses Konto zum Erstellen kurzlebiger Anmeldedaten verwenden möchten: müssen Sie auch die IAM Service Account Credentials API aktivieren.

    Enable the API

  • Um die Befehlszeilenbeispiele in dieser Anleitung zu verwenden, installieren und Konfigurieren Sie die Google Cloud CLI.

  • Achten Sie darauf, dass Sie das Dienstkonto erstellt haben, das Sie verwenden möchten. Sie müssen das Konto in demselben Google Cloud-Projekt erstellen, in dem Sie Builds ausführen.

Erforderliche IAM-Berechtigungen

Ihr benutzerdefiniertes Dienstkonto muss die Berechtigung „iam.serviceAccounts.getOpenIdToken“.

Eine Anleitung zum Gewähren von IAM-Rollen für ein Dienstkonto finden Sie unter Zugriff auf Dienstkonten verwalten

Methoden zum Abrufen eines ID-Tokens

Es gibt zwei Möglichkeiten, Ihre Buildschritte so zu konfigurieren, dass ID-Tokens abgerufen werden:

  • die gcloud CLI verwenden
  • eine direkte Anfrage an den Metadatenserver senden

ID-Token über gcloud abrufen

In diesem Abschnitt wird mit dem folgenden Code-Snippet gezeigt, wie Sie mit der gcloud CLI ID-Tokens abrufen:

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

Ersetzen Sie Folgendes:

  • TOKEN_AUDIENCE ist die URL oder Zielgruppe für Fordern Sie das ID-Token an, z. B. http://www.example.com.
  • SERVICE_ACCOUNT_ID ist die E-Mail-Adresse oder eindeutige ID. für das benutzerdefinierte Dienstkonto. Beispiel: service-account-name@project-id.iam.gserviceaccount.com.
  • LOGS_BUCKET_LOCATION ist der Cloud Storage-Bucket. zum Speichern von Build-Logs. Beispiel: gs://mylogsbucket.

Direkte Anfrage an den Metadatenserver senden

In diesem Abschnitt zeigt das folgende Code-Snippet, wie Sie eine direkte an den Metadatenserver, um ID-Tokens abzurufen:

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

Ersetzen Sie Folgendes:

  • TOKEN_AUDIENCE ist die URL oder Zielgruppe für Fordern Sie das ID-Token an, z. B. http://www.example.com.
  • SERVICE_ACCOUNT_ID ist die E-Mail-Adresse oder eindeutige ID. für das benutzerdefinierte Dienstkonto. Beispiel: service-account-name@project-id.iam.gserviceaccount.com.
  • LOGS_BUCKET_LOCATION ist der Cloud Storage-Bucket, in dem Build-Logs gespeichert werden. Beispiel: gs://mylogsbucket.

Weitere Informationen zum Generieren und Verwenden von ID-Tokens in Ihren Arbeitslasten finden Sie unter Siehe Methoden zum Abrufen eines ID-Tokens.

Nächste Schritte