Über AWS auf Ressourcen zugreifen

In diesem Dokument erfahren Sie, wie Sie mithilfe von Identitätsföderation über Amazon Web Services (AWS) auf Google Cloud-Ressourcen zugreifen.

In der Vergangenheit haben Anwendungen, die außerhalb von Google Cloud ausgeführt werden, Dienstkontoschlüssel für den Zugriff auf Google Cloud-Ressourcen verwendet. Mithilfe der Identitätsföderation können Sie zulassen, dass ein AWS-Nutzer oder eine Rolle die Identität eines Dienstkontos übernehmen kann. Dadurch kann Ihre Arbeitslast direkt mit einem kurzlebigen Zugriffstoken auf Google Cloud-Ressourcen zugreifen und der mit Dienstkontoschlüsseln verbundene Wartungs- und Sicherheitsaufwand entfällt.

Hinweis

  1. Sie benötigen die Rolle "Workload Identity Pool Administrator" (roles/iam.workloadIdentityPoolAdmin).

    Die einfachen IAM-Rollen "Inhaber" (roles/owner) und "Bearbeiter" (roles/editor) gewähren auch die Berechtigung zum Konfigurieren der Identitätsföderation. Wir empfehlen jedoch, die Rolle "Workload Identity Pool Administrator" zu verwenden, um keinen unnötigen Zugriff auf Google Cloud-Ressourcen zu gewähren.

  2. Erstellen Sie eine AWS-Rolle und notieren Sie sich den Amazon Resource Name (ARN).

  3. Erstellen Sie ein Google Cloud-Dienstkonto.

  4. Gewähren Sie dem Dienstkonto Zugriff, um die für Ihre Arbeitslast erforderlichen Google Cloud APIs aufzurufen.

Workload Identity-Pool erstellen

Ein Workload Identity-Pool ist ein Container für eine Sammlung externer Identitäten. Workload Identity-Pools sind voneinander isoliert, ein einzelner Pool kann jedoch eine beliebige Anzahl von Dienstkonten imitieren. Im Allgemeinen empfehlen wir, für jede Umgebung einen neuen Pool zu erstellen, z. B. für Entwicklung, Staging oder Produktion. Dies bedeutet in der Regel, einen Pool pro AWS-Konto zu erstellen.

Sie müssen eine ID angeben, um einen neuen Workload Identity-Pool zu erstellen. Sie können auch eine optionale Beschreibung und einen Anzeigenamen angeben.

gcloud

Führen Sie den Befehl gcloud beta iam workload-identity-pools create aus, um einen Workload Identity-Pool zu erstellen:

gcloud beta iam workload-identity-pools create pool-id \
    --location="global" \
    --description="description" \
    --display-name="display-name"

REST API

Mit der Methode projects.locations.workloadIdentityPools.create wird ein Workload Identity-Pool erstellt.

HTTP-Methode und URL:

POST https://iam.googleapis.com/v1beta/projects/project-id/locations/global/workloadIdentityPools?workloadIdentityPoolId=pool-id

JSON-Text anfordern:

{
  "description": "description",
  "display-name": "display-name"
}

Wenn Sie die Anfrage senden möchten, maximieren Sie eine der folgenden Optionen:

 

AWS als Identitätsanbieter hinzufügen

Zum Konfigurieren von AWS als Identitätsanbieter für den Workload Identity-Pool sollten Sie mindestens Folgendes angeben:

  • Eine ID für den Anbieter.

  • Die Workload Identity-Pool-ID aus dem vorherigen Abschnitt in diesem Dokument.

  • Ihre AWS-Konto-ID.

Sie können auch mehrere optionale Parameter angeben:

  • Einen Anzeigenamen und eine Beschreibung.

  • Eine Liste von Attributzuordnungen, die die Attribute in einem AWS-Token den Attributen in einem Google-Token zuordnen. Standardmäßig verwendet jeder Pool die folgenden Attributzuordnungen, die die meisten gängigen Szenarien abdecken:

    Google AWS Beschreibung
    google.subject assertion.arn Die Haupt-IAM führt die Authentifizierung durch. Dies ist auch der Betreff in den Logeinträgen in Cloud Logging. Diese Zuordnung wird automatisch mit dem ARN im Format arn:aws:sts::[ACCOUNT-ID]:assumed-role/[AWS-ROLE]/[AWS-SESSION-NAME] dargestellt.
    attribute.aws_role AWS-Rolle AWS-Rolle im Format arn:aws:sts::[ACCOUNT-ID]:assumed-role/[AWS-ROLE].

    Sie können auch benutzerdefinierte Zuordnungen festlegen, auf die Sie in IAM-Bindungen verweisen können. Verwenden Sie assertion, um auf die AWS-Anmeldedaten zu verweisen, google für Google-Attribute und attribute für benutzerdefinierte Attribute. Im folgenden Beispiel besteht eine Zuordnung von attribute.aws_account zu assertion.account, zusätzlich zur Standardzuordnung für google.subject:

    google.subject=assertion.arn,
    attribute.aws_account=assertion.account
    

    Eine Liste der Attribute von AWS-Tokens, auf die Sie verweisen können, finden Sie in der Dokumentation zu GetCallerIdentity(). Beachten Sie, dass in der AWS-Dokumentation für die Attribute die Camel-Case-Schreibweise verwendet wird, während bei der Attributzuordnung die Kleinschreibung zur Anwendung kommt. Aus Account wird beispielsweise assertion.account.

    Für komplexere Assertions können Sie die Common Expression Language verwenden. Beispiel:

    attribute.environment=assertion.arn.contains(":instance-profile/Production") ? "prod" : "test"
    

    Verwenden Sie die CEL-Funktion extract(), wenn Sie auf einen bestimmten Teil eines Attributs in einem Ausdruck verweisen möchten. Diese Funktion extrahiert einen Wert basierend auf einer von Ihnen bereitgestellten Vorlage aus einem Attribut. Weitere Informationen zu extract() finden Sie unter Werte aus Attributen extrahieren.

    Mit der Funktion has() können Sie prüfen, ob Anmeldedaten ein Attribut enthalten.

  • Eine Attributbedingung zum Angeben von Attributen, die das Hauptkonto enthalten muss. Die Bedingung kann sowohl für externe als auch für Google-Anmeldedaten gelten. Alle Anfragen, die die Bedingung nicht erfüllen, werden abgelehnt.

    Attributbedingungen werden als CEL-Ausdruck formatiert, der einen booleschen Wert zurückgibt. Die folgende Anfrage lehnt beispielsweise Anfragen von Identitäten ab, die keine bestimmte AWS-Rolle haben:

    attribute.aws_role == "role-mapping"
    

    Weitere Informationen zu gängigen Anwendungsfällen für Attributbedingungen finden Sie in der Übersicht zur Workload Identity-Föderation.

Im folgenden Beispiel wird gezeigt, wie Sie AWS als Identitätsanbieter hinzufügen:

gcloud

Führen Sie den Befehl gcloud beta iam workload-identity-pools providers create-aws aus, um AWS als Identitätsanbieter hinzuzufügen:

gcloud beta iam workload-identity-pools providers create-aws provider-id \
  --workload-identity-pool="pool-id"
  --account-id="aws-account-id"
  --location="global"

REST API

Die Methode projects.locations.workloadIdentityPools.providers.create fügt AWS als Anbieter hinzu.

HTTP-Methode und URL:

POST https://iam.googleapis.com/v1beta/projects/project-id/locations/global/workloadIdentityPools/pool-id/providers?workloadIdentityPoolProviderId=provider-id

JSON-Text anfordern:

{
  "aws": {
    "accountId": "aws-account-id"
  }
}

Wenn Sie die Anfrage senden möchten, maximieren Sie eine der folgenden Optionen:

 

Identität eines Dienstkontos übernehmen

Sie können Workload Identity-Pools und Identitäten, die von ihren Anbietern föderiert werden, Rollen auf Ressourcen mit IAM zuweisen. Die Workload Identity-Nutzerrolle (roles/iam.workloadIdentityUser) gewährt die Berechtigung, die Identität eines Dienstkontos zu übernehmen. Dadurch können externe Identitäten auf Google Cloud-Ressourcen zugreifen.

Weisen Sie Rollen stattdessen einzelnen Identitäten im Identitätspool für Arbeitslasten zu oder deaktivieren Sie die Domain-Einschränkungen für Ihre Organisation.

Um diese Bindung für eine AWS-Rolle hinzuzufügen, verwenden Sie das Format:

attribute.aws_role/arn:aws:sts::aws-account-id:assumed-role/aws-role-name

Beispiel:

gcloud iam service-accounts add-iam-policy-binding service-account-email \
  --role roles/iam.workloadIdentityUser \
  --member "principalSet://iam.googleapis.com/projects/project-number/locations/global/workloadIdentityPools/pool-id/attribute.aws_role/arn:aws:sts::aws-account-id:assumed-role/aws-role-name"

Fügen Sie diese Bindung für einen AWS-Nutzer hinzu:

subject/arn:aws:sts::aws-account-id:assumed-role/aws-role-name/aws-session-name

Informationen zum Extrahieren der AWS-Rollensitzung von einem AWS-ARN finden Sie in der AWS-Dokumentation unter IAM-Kennungen.

Im folgenden Beispiel wird das Hinzufügen einer Bindung für einen AWS-Nutzer veranschaulicht:

gcloud iam service-accounts add-iam-policy-binding service-account-email \
  --role roles/iam.workloadIdentityUser \
  --member "principal://iam.googleapis.com/projects/project-number/locations/global/workloadIdentityPools/pool-id/subject/arn:aws:sts::aws-account-id:assumed-role/aws-role-name/aws-session-name

Sie können den Zugriff auch basierend auf benutzerdefinierten Attributen gewähren. Beispiel:

gcloud iam service-accounts add-iam-policy-binding service-account-email \
  --role="roles/iam.workloadIdentityUser" \
  --member="principalSet://iam.googleapis.com/projects/project-number/locations/global/workloadIdentityPools/pool-id/attribute.custom-attribute/arn:aws:sts::aws-account-id:aws-role-name"

Wenn Sie den Zugriff widerrufen möchten, ersetzen Sie add-iam-policy-binding durch remove-iam-policy-binding.

Außerdem können Sie über die REST API oder Clientbibliotheken Bindungen hinzufügen oder widerrufen. Weitere Informationen finden Sie unter Zugriff auf Ressourcen erteilen, ändern und entziehen.

Austausch eines AWS-Tokens gegen ein Google-Token

Sobald eine AWS-Rolle oder ein Nutzer die Identität eines Dienstkontos übernehmen kann, können Sie dessen AWS-Anmeldedaten gegen Google-Anmeldedaten tauschen. Im Rahmen des Austauschs übergeben Sie eine serialisierte Version einer Anfrage mit der AWS-Methode GetCallerIdentity() an den Security Token Service. Dadurch kann Google Cloud die Identität des AWS-Hauptkontos prüfen und bestätigen, dass es berechtigt ist, die Identität eines Dienstkontos zu übernehmen.

So tauschen Sie Anmeldedaten aus:

  1. Temporäre AWS-Anmeldedaten abrufen

  2. Erstellen Sie mithilfe von Signature Version 4 eine serialisierte signierte Anfrage an die AWS-Methode GetCallerIdentity().

    Die Anfrage enthält die folgenden Felder:

    • url: Die URL des AWS STS-Endpunkts für GetCallerIdentity(), z. B. https://sts.amazonaws.com?Action=GetCallerIdentity&Version=2011-06-15. Regionale Endpunkte werden ebenfalls unterstützt.
    • method: Die HTTP-Anfragemethode: POST.
    • headers: Die HTTP-Anfrageheader, die Folgendes enthalten müssen:
      • Authorization: Die Anfragesignatur.
      • host: Der Hostname des Felds url. Beispiel: sts.amazonaws.com.
      • x-amz-date: Die Zeit, zu der Sie die Anfrage senden werden, im String-Format ISO 8601 Basic. Sie wird in der Regel auf die aktuelle Uhrzeit eingestellt und zur Verhinderung von Replay-Angriffen verwendet.
      • x-goog-cloud-target-resource: Der vollständige Ressourcenname des Identitätsanbieters. Das HTTPS-Präfix ist optional, z. B. sind beide der Folgenden gültig:
        //iam.googleapis.com/projects/project-number/locations/global/workloadIdentityPools/pool-id/providers/provider-id
        https://iam.googleapis.com/projects/project-number/locations/global/workloadIdentityPools/pool-id/providers/provider-id
        

    Eine Anfrage sieht etwa so aus:

    {
      "url": "https://sts.amazonaws.com?Action=GetCallerIdentity&Version=2011-06-15",
      "method": "POST",
      "headers": [
        {
          "key": "Authorization",
          "value" : "AWS4-HMAC-SHA256 Credential=AKIASOZTBDV4D7ABCDEDF/20200228/us-east-1/sts/aws4_request, SignedHeaders=host;x-amz-date,Signature=abcedefdfedfd"
        },
        {
          "key": "host",
          "value": "sts.amazonaws.com"
        },
        {
          "key": "x-amz-date",
          "value": "20200228T225005Z"
        },
        {
          "key": "x-goog-cloud-target-resource",
          "value": "//iam.googleapis.com/projects/12345678/locations/global/workloadIdentityPools/my-pool/providers/my-aws-provider"
        }
      ]
    }
    
  3. Übergeben Sie die serialisierte Anfrage an die Methode token() des Security Token Service, um die AWS-Anmeldedaten gegen ein föderiertes Zugriffstoken auszutauschen:

    REST API

    Mit der Methode token wird das Token eines Drittanbieters gegen ein Google-Token ausgetauscht.

    Ersetzen Sie diese Werte in den folgenden Anweisungen:

    • project-number: Ihre Google Cloud-Projektnummer.
    • pool-id: Die ID des Workload Identity-Pools, den Sie zuvor in dieser Anleitung erstellt haben.
    • provider-id: Die ID des AWS-Identitätsanbieters, den Sie zuvor in dieser Anleitung konfiguriert haben.
    • aws-request: Die serialisierte, signierte Anfrage an GetCallerIdentity(), formatiert als URL-codiertes JSON.

    HTTP-Methode und URL:

    POST https://sts.googleapis.com/v1beta/token

    JSON-Text anfordern:

    {
      "audience": "https://iam.googleapis.com/projects/project-number/locations/global/workloadIdentityPools/pool-id/providers/provider-id",
      "grant_type": "urn:ietf:params:oauth:grant-type:token-exchange",
      "requested_token_type": "urn:ietf:params:oauth:token-type:access_token",
      "scope": "https://www.googleapis.com/auth/cloud-platform",
      "subject_token_type": "urn:ietf:params:aws:token-type:aws4_request",
      "subject_token": "aws-request"
    }
    

    Wenn Sie die Anfrage senden möchten, maximieren Sie eine der folgenden Optionen:

     

    Die Methode gibt ein föderiertes Token zurück.

  4. Tauschen Sie mit generateAccessToken() das föderierte Token gegen ein OAuth 2.0-Zugriffstoken aus:

    REST API

    Die Methode serviceAccounts.generateAccessToken der Service Account Credentials API generiert ein OAuth 2.0-Zugriffstoken für ein Dienstkonto.

    Ersetzen Sie diese Werte in den folgenden Anweisungen:

    • project-id: Ihre Google Cloud-Projekt-ID.
    • sa-id: Die ID Ihres Dienstkontos. Dies kann entweder die E-Mail-Adresse des Dienstkontos im Format sa-name@project-id.iam.gserviceaccount.com oder die eindeutige numerische ID des Dienstkontos sein.
    • token: Das föderierte Zugriffstoken.

    HTTP-Methode und URL:

    POST https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/sa-name@project-id.iam.gserviceaccount.com:generateAccessToken

    JSON-Text anfordern:

    {
      "scope": [
        "https://www.googleapis.com/auth/cloud-platform"
      ]
    }
    

    Wenn Sie die Anfrage senden möchten, maximieren Sie eine der folgenden Optionen:

    Wenn die Anfrage generateAccessToken erfolgreich war, enthält der Antworttext ein OAuth 2.0-Zugriffstoken und eine Ablaufzeit. Das accessToken kann dann verwendet werden, um eine Anfrage im Namen des Dienstkontos zu authentifizieren, bis die expireTime erreicht wurde:

    {
      "accessToken": "eyJ0eXAi...NiJ9",
      "expireTime": "2020-04-07T15:01:23.045123456Z"
    }
    

Sobald Sie ein Zugriffstoken für ein Dienstkonto haben, können Sie damit Google Cloud APIs aufrufen. Dazu nehmen Sie das Token in den Header Authorization Ihrer Anfrage auf:

Authorization: Bearer access-token

Die Anfrage ist als Dienstkonto autorisiert.

Nächste Schritte