Einführung: Was ist Workload Identity Federation?
Workload Identity Federation (WIF) ermöglicht es Arbeitslasten, die in der Google Cloud ausgeführt werden (z. B. GKE-Pods), sicher auf AWS-Ressourcen (wie S3) zuzugreifen, ohne statische AWS-Anmeldedaten zu speichern. Anstatt langlebige Zugriffsschlüssel zu verwenden, tauschen GCP-Workloads Google-Identitäts-Tokens für temporäre AWS-Anmeldeinformationen über AWS STS (Security Token Service) aus.
Anwendungsfall
- Ein Pod, der auf Google Kubernetes Engine (GKE) läuft, muss:
- S3-Buckets auflisten
- Herunter-/Hochladen von Dateien auf Amazon S3
Ohne:
- Speichern von AWS-Anmeldeinformationen (keine aws_access_key_id oder secret_access_key in der Konfiguration)
Hochrangige Schritte
- Aktivieren der Workload Identity Federation in GCP
- Erstellen Sie einen AWS IAM OIDC Provider, um GCP zu vertrauen
- Erstellen einer AWS IAM-Rolle für GCP-Arbeitslasten
- Erstellen eines Workload-Identitätspools in GCP
- Einen Workload-Identitätsanbieter in GCP erstellen
- Zuordnung des GCP-Service-Kontos zur AWS IAM-Rolle
- Test der Authentifizierung von GCP zu AWS

Schritt-für-Schritt-Anleitung: Aktivieren der Workload Identity Federation in GCP
Prüfen Sie, ob Workload Identity Federation aktiviert ist:
$ gcloud container clusters describe CLUSTER_NAME \
--project=YOUR_PROJECT_ID \
--location=GKE_REGION \
--format="value(workloadIdentityConfig.workloadPool)"
Beispiel:
$ gcloud container clusters describe mgr-main-sbx \
--project=mgr-product-sbx \
--location=europe-west1 \
--format="value(workloadIdentityConfig.workloadPool)"
Ausgabe:
mgr-product-sbx.svc.id.goog
Wenn er nicht aktiviert ist, führen Sie ihn aus:
$ gcloud container clusters update CLUSTER_NAME \
--workload-pool=YOUR_PROJECT_ID.svc.id.goog \
--project=YOUR_PROJECT_ID \
--location=GKE_REGION
Erstellen Sie einen AWS IAM OIDC-Anbieter, um GCP zu vertrauen
So erstellen Sie den Anbieter:
$ aws iam create-open-id-connect-provider \
--url https://sts.googleapis.com \
--client-id-list sts.amazonaws.com \
--thumbprint-list 08745487ghdud7e7eh1f2a07e452f36f6
Überprüfen Sie, ob der OIDC-Provider erstellt wurde:
$ aws iam list-open-id-connect-providers
Erstellen Sie ein GCP-Service-Konto für AWS-Zugang
Erstellen Sie einen GCP Service Account (poc-gcp-to-aws-sa@mgr-product-sbx.iam.gserviceaccount.com) und erstellen Sie einen Schlüssel für diesen SA:
$ gcloud iam service-accounts create poc-gcp-to-aws-sa --project=YOUR_PROJECT_ID --display-name="GCP to AWS Service Account"
Beispiel:
$ gcloud iam service-accounts create poc-gcp-to-aws-sa \ --project=mgr-product-sbx \ --display-name="GCP to AWS Service Account" --role="roles/iam.serviceAccountTokenCreator"
Geben Sie SA die Berechtigung, Token zu erhalten/zu erstellen!
Token zum Testen erhalten
$ gcloud auth activate-service-account --key-file=mgr-product-sbx-24aa6b13e9a7.json
$ TOKEN=$(gcloud auth print-identity-token --impersonate-service-account=poc-gcp-to-aws-sa@mgr-product-sbx.iam.gserviceaccount.com)
$ echo $TOKEN | jq -R 'split(".") | .[1] | @base64d | fromjson'
Erstellen einer von GCP vertrauenswürdigen AWS IAM-Rolle
Datei erstellen poc-trust-policy.json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {"Federated": "accounts.google.com"},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"accounts.google.com:aud": "<azp-value>",
"accounts.google.com:oaud": "<aud-value>",
"accounts.google.com:sub": "<sub-value>"
}
}
}
]
}
Für "aud", "oaud" und "sub" wird die Ausgabe von SA TOKEN verwendet.
accounts.google.com:oaud Bedingungsschlüssel stimmt mit dem Feld aud (AUDIENCE) auf dem Google-ID-Token überein.
accounts.google.com:aud Bedingungsschlüssel stimmt mit dem Feld azp (AUTHORIZED_PARTY) auf dem Google-ID-Token überein.
accounts.google.com:sub Bedingungsschlüssel stimmt mit dem Feld sub (SUBJECT) auf dem Google ID-Token überein.
Erstellen Sie die AWS-Rolle
$ aws iam create-role \
--role-name GCPWorkloadIAMRole \
--assume-role-policy-document file://poc-trust-policy.json
Zuweisung der Richtlinie "AmazonS3ReadOnlyAccess" zu dieser Rolle (für den späteren Test).
Erstellen eines Workload-Identitätspools in GCP
Konfigurieren der Workload Identity Federation
$ gcloud iam workload-identity-pools create "POOL_NAME" \
--project=YOUR_PROJECT_ID \
--location="global" \
--display-name="AWS Workload Identity Pool"
Beispiel:
$ gcloud iam workload-identity-pools create "poc-aws-pool" --project=mgr-product-sbx --location="global" --display-name="AWS Workload Identity Pool"
Einen Workload-Identitätsanbieter in GCP erstellen
Damit wird der Pool mit AWS verbunden.
$ gcloud iam workload-identity-pools providers create-oidc "PROVIDER_NAME" \
--project=PROJECT_NAME \
--location="global" \
--workload-identity-pool="POOL_NAME" \
--display-name="AWS OIDC Provider" \
--issuer-uri="https://sts.amazonaws.com" \
--allowed-audiences="sts.amazonaws.com" \
--attribute-mapping="google.subject=assertion.sub,google.groups=assertion.groups"
Beispiel:
$ gcloud iam workload-identity-pools providers create-oidc "aws-provider"
--project=mgr-product-sbx
--location="global"
--workload-identity-pool="poc-aws-pool"
--display-name="AWS OIDC Provider"
--issuer-uri="https://sts.amazonaws.com"
--allowed-audiences="sts.amazonaws.com"
--attribute-mapping="google.subject=assertion.sub,google.groups=assertion.groups"
Die Ausgabe wird sein:
projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/poc-aws- pool/providers/aws-provider
Binden Sie das GCP-Servicekonto an die AWS-Rolle
Workloads erlauben, dieses Servicekonto zu übernehmen
$ gcloud iam service-accounts add-iam-policy-binding \
poc-gcp-to-aws-sa@YOUR_PROJECT_ID.iam.gserviceaccount.com \
--role roles/iam.workloadIdentityUser \
--member "principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_NAME/subject/arn:aws:iam::AWS_ACCOUNT_ID:role/ROLE_NAME"
Ein Beispiel:
$ gcloud iam service-accounts add-iam-policy-binding poc-gcp-to-aws-sa@mgr-product-sbx.iam.gserviceaccount.com
--role roles/iam.workloadIdentityUser
--member "principal://iam.googleapis.com/projects/960144414359/locations/global/workloadIdentityPools/poc-aws-pool/subject/arn:aws:iam::211125558983:role/GCPWorkloadIAMRole"
Testen Sie die Integration
$ gcloud auth activate-service-account --key-file=mgr-product-sbx-e284c02e086c.json
TOKEN=$(gcloud auth print-identity-token --impersonate-service-account=poc-gcp-to-aws-sa@mgr-product-sbx.iam.gserviceaccount.com)
$ echo $TOKEN | jq -R 'split(".") | .[1] | @base64d | fromjson'
$ aws sts assume-role-with-web-identity --role-arn "arn:aws:iam::211125558983:role/GCPWorkloadIAMRole" --role-session-name "gcp-session" --web-identity-token "$TOKEN" --query 'Credentials'
Die Ausgabe sollte etwa so aussehen:

export AWS_ACCESS_KEY_ID="YOUR_ACCESS_KEY_ID"
export AWS_SECRET_ACCESS_KEY="YOUR_SECRET_ACCESS_KEY"
export AWS_SESSION_TOKEN="YOUR_SESSION_TOKEN"
Test S3 Zugang
$ aws s3 ls
Ausgabe:
2024-11-09 07:19:45 baseline-tfstates-211125558983
2024-11-09 07:37:41 billing-export-211125558983
2024-11-20 13:12:19 gar-credential-provider-test
$ aws iam list-roles
Ausgabe:
An error occurred (AccessDenied) when calling the ListRoles operation: User: arn:aws:sts::211125558983:assumed-role/GCPWorkloadIAMRole/gcp-session is not authorized to perform: iam:ListRoles on resource: arn:aws:iam::211125558983:role/ because no identity-based policy allows the iam:ListRoles action
Ergebnis: Sicherer AWS-Zugang von GCP ohne Speicherung von Schlüsseln
Dieses Setup ermöglicht GCP Workloads wie GKE-Pods sicher auf AWS zugreifen, ohne jemals langlebige Geheimnisse zu verwalten oder einzubetten. Mit Workload Identity Federation stellen Sie sicher:
- Starke Cloud-übergreifende Identität
- Bessere Sicherheitsvorkehrungen
- Vereinfachter Lebenszyklus von Berechtigungsnachweisen