Ü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.

Früher 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-Pooladministrator“ (roles/iam.workloadIdentityPoolAdmin).

    Alternativ enthalten die einfachen Rollen „IAM-Inhaber“ (roles/owner) und „Bearbeiter“ (roles/editor) ebenfalls Berechtigungen zum Konfigurieren der Identitätsföderation. In einer Produktionsumgebung sollten Sie keine einfachen Rollen zuweisen, Sie können sie aber in einer Entwicklungs- oder Testumgebung gewähren.

  2. Aktualisieren Sie die Organisationsrichtlinie für Ihre Organisation, um die Föderation von AWS zuzulassen.

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

  4. Erstellen Sie ein Google Cloud-Dienstkonto.

  5. 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"

Die Antwort sieht in etwa so aus:

Created WorkloadIdentityPool [pool-id].

REST

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

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:

Die Methode gibt eine Operation mit langer Ausführungszeit zurück, die in etwa so aussieht:

{
  "name": "projects/project-number/locations/global/workloadIdentityPools/pool-id/operations/operation-id"
}

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 Das Hauptkonto, das von IAM authentifiziert wird. 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 Die AWS-Rolle im Format arn:aws:sts::account-id:assumed-role/aws-role.

    Sie können auch benutzerdefinierte Zuordnungen festlegen, auf die sich in IAM-Rollenbindungen verweisen lässt. 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 zur Festlegung der Attribute, 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 zu 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"

Die Antwort sieht in etwa so aus:

Created WorkloadIdentityPoolProvider [provider-id].

REST

Mit der Methode projects.locations.workloadIdentityPools.providers.create wird AWS als Anbieter hinzugefügt.

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:

Die Methode gibt eine Operation mit langer Ausführungszeit zurück, die in etwa so aussieht:

{
  "name": "projects/project-number/locations/global/workloadIdentityPools/pool-id/providers/provider-id/operations/operation-id"
}

Berechtigung zum Übernehmen der Identität eines Dienstkontos erteilen

Externe Identitäten können auf die meisten Google Cloud-Ressourcen nicht direkt zugreifen. Stattdessen legen Sie für diese Identitäten die Übernahme der Identität eines Dienstkontos fest und weisen dazu die Rolle „Workload Identity“ (roles/iam.workloadIdentityUser) zu.

Zum Hinzufügen dieser Rollenbindung für eine AWS-Rolle verwenden Sie das folgende 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: Den Hostnamen des Felds url, z. B. sts.amazonaws.com.
      • x-amz-date: Den Zeitpunkt, an dem Sie die Anfrage senden möchten, angegeben im Stringformat ISO 8601 Basic. Dieser wird in der Regel auf die aktuelle Uhrzeit eingestellt und zur Verhinderung von Replay-Angriffen verwendet.
      • x-goog-cloud-target-resource: Den vollständigen Ressourcennamen des Identitätsanbieters. Beispiel:
        //iam.googleapis.com/projects/project-number/locations/global/workloadIdentityPools/pool-id/providers/provider-id
        
      • x-amz-security-token (optional): Das AWS-Sitzungstoken, das bei temporären Sicherheitsanmeldedaten verwendet werden soll.

    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"
        },
        {
          "key": "x-amz-security-token",
          "value": "GizFWJTqYX...xJ55YoJ8E9HNU="
        }
      ]
    }
    
  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

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

    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": "//iam.googleapis.com/projects/project-number/locations/global/workloadIdentityPools/pool-id/providers/provider-id",
      "grantType": "urn:ietf:params:oauth:grant-type:token-exchange",
      "requestedTokenType": "urn:ietf:params:oauth:token-type:access_token",
      "scope": "https://www.googleapis.com/auth/cloud-platform",
      "subjectTokenType": "urn:ietf:params:aws:token-type:aws4_request",
      "subjectToken": "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. Rufen Sie generateAccessToken() auf, um das föderierte Token gegen ein Dienstkonto-Zugriffstoken auszutauschen. Eine begrenzte Anzahl an Google Cloud APIs unterstützt föderierte Tokens. Alle Google Cloud APIs unterstützen Dienstkonto-Zugriffstokens.

    REST

    Mit der Methode serviceAccounts.generateAccessToken der Service Credentials API kann ein OAuth 2.0-Zugriffstoken für ein Dienstkonto generiert werden.

    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