Über Workload Identity-Föderation für GKE

In diesem Dokument wird die Identitätsföderation von Arbeitslasten für GKE beschrieben. Es wird auch erläutert, wie sie funktioniert, wie sich die Aktivierung auf Ihre GKE-Cluster auswirkt und wie Sie Kubernetes-Entitäten in IAM-Richtlinien (Identity and Access Management) Rollen zuweisen. In den meisten Fällen ist die Identitätsföderation von Arbeitslasten für GKE die empfohlene Methode, um den Zugriff Ihrer Arbeitslasten, die in GKE ausgeführt werden, auf Google Cloud -Dienste zu schützen und zu verwalten.

Dieses Dokument richtet sich an Sicherheitsexperten und Operatoren, die Arbeitslasten in GKE verwalten, für die der Zugriff auf andere Google Cloud-Dienste erforderlich ist. Weitere Informationen zu gängigen Rollen und Beispielaufgaben, auf die wir in Google Cloud Inhalten verweisen, finden Sie unter Häufig verwendete GKE-Nutzerrollen und ‑Aufgaben.

Terminologie

Auf dieser Seite wird zwischen Kubernetes-Dienstkonten und Identity and Access Management-Dienstkonten (IAM) unterschieden.

Kubernetes-Dienstkonten
Kubernetes-Ressourcen, die eine Identität für Prozesse bereitstellen, die in Ihren GKE-Pods ausgeführt werden
IAM-Dienstkonten
Google Cloud -Ressourcen, mit denen Anwendungen autorisierte Aufrufe anGoogle Cloud APIs ausführen können

Was ist die Identitätsföderation von Arbeitslasten für GKE?

In GKE ausgeführte Anwendungen benötigen möglicherweise Zugriff auf Google Cloud APIs wie die Compute Engine API, die BigQuery Storage API oder Machine Learning APIs.

Mit Workload Identity-Föderation für GKE können Sie IAM-Richtlinien verwenden, um Kubernetes-Arbeitslasten in Ihrem GKE-Cluster Zugriff auf bestimmteGoogle Cloud APIs zu gewähren, ohne dass eine manuelle Konfiguration oder weniger sichere Methoden wie Dienstkonto-Schlüsseldateien erforderlich sind. Mit Workload Identity-Föderation für GKE können Sie jeder Anwendung in Ihrem Cluster separate, detaillierte Identitäten und Autorisierungen zuweisen.

Dank der Identitätsföderation von Arbeitslasten für GKE muss keine Metadatenverbergung verwendet werden. Die vertraulichen Metadaten, die durch Metadatenverbergung geschützt werden, werden durch die Workload Identity-Föderation für GKE ebenfalls geschützt.

Die Identitätsföderation von Arbeitslasten für GKE ist über die IAM-Identitätsföderation von Arbeitslasten verfügbar, die Identitäten für Arbeitslasten bereitstellt, die in Umgebungen innerhalb und außerhalb von Google Cloudausgeführt werden. Sie können die IAM Workload Identity-Föderation verwenden, um sich sicher bei unterstützten Google Cloud APIs von Arbeitslasten aus zu authentifizieren, die z. B. auf AWS, Azure und selbst verwalteten Kubernetes ausgeführt werden. In GKE verwaltetGoogle Cloud den Workload Identity-Pool und die relevanten Anbieter für Sie. Es ist kein externer Identitätsanbieter erforderlich.

Funktionsweise der Identitätsföderation von Arbeitslasten für GKE

Wenn Sie die Identitätsföderation von Arbeitslasten für GKE in einem Cluster aktivieren, führt GKE Folgendes aus:

  • Erstellt einen festen Workload Identity-Pool für das Google Cloud-Projekt des Clusters im folgenden Format:

    PROJECT_ID.svc.id.goog
    

    Der Workload Identity-Pool bietet ein Namensformat, mit dem IAM die Anmeldedaten des Kubernetes-Dienstkontos verstehen und als vertrauenswürdig einstufen kann. GKE löscht diesen Workload Identity-Pool nicht, auch wenn Sie alle Cluster in Ihrem Projekt löschen.

  • Registriert den GKE-Cluster als Identitätsanbieter im Workload Identity-Pool.

  • Stellt den GKE-Metadatenserver bereit, der Anmeldedatenanfragen von Arbeitslasten auf jedem Knoten abfängt.

IAM-Zulassungsrichtlinien für Google Cloud Ressourcen erstellen

Um Zugriff über die Identitätsföderation von Arbeitslasten für GKE zu gewähren, erstellen Sie eine IAM-Zulassungsrichtlinie, die einem Hauptkonto Zugriff auf eine bestimmte Google Cloud Ressource gewährt, das der Identität Ihrer Anwendung entspricht. Sie können beispielsweise allen Pods, die das Kubernetes-Dienstkonto database-reader verwenden, Leseberechtigungen für einen Cloud Storage-Bucket erteilen.

Eine Liste der Ressourcen, die Zulassungsrichtlinien unterstützen, finden Sie unter Ressourcentypen, die Zulassungsrichtlinien akzeptieren.

Bedingungen in IAM-Richtlinien verwenden

Sie können den Umfang des Zugriffs auch einschränken, indem Sie Bedingungen in den Zulassungsrichtlinien festlegen. Bedingungen sind eine erweiterbare Methode, um festzulegen, wann eine Zulassungsrichtlinie angewendet werden soll. So können Sie beispielsweise mithilfe von Bedingungen vorübergehenden Zugriff auf eine Arbeitslast auf einer bestimmten Google Cloud -Ressource gewähren, sodass dieser Zugriff nicht manuell verwaltet werden muss.

Bedingungen können auch nützlich sein, wenn Sie Ihre Zulassungsrichtlinien auf Projekt-, Ordner- oder Organisationsebene festlegen, anstatt auf bestimmte Ressourcen wie Secret Manager-Secrets oder Cloud Storage-Buckets.

Wenn Sie Ihrer Zulassungsrichtlinie eine Bedingung hinzufügen möchten, verwenden Sie die folgenden Ressourcen:

Die folgenden Beispielausdrücke sind für häufige Szenarien, in denen Sie Bedingungen verwenden könnten. Eine Liste der in Ausdrücken verfügbaren Attribute finden Sie unter Attributreferenz für IAM-Bedingungen.

Beispiele für Bedingungsausdrücke
Zugriff vor der angegebenen Zeit zulassen
request.time < timestamp('TIMESTAMP')

Ersetzen Sie TIMESTAMP durch einen Zeitstempel in UTC, z. B. 2024-08-30T00:00:00.000Z.

Zugriff gewähren, wenn die Ressource in der Anfrage das angegebene Tag hat
resource.matchTag('TAG_KEY', 'TAG_VALUE')

Ersetzen Sie Folgendes:

  • TAG_KEY: der Tag-Schlüssel, der abgeglichen werden soll, z. B. env
  • TAG_VALUE: der Wert des Tags, z. B. dev

Kubernetes-Ressourcen in IAM-Richtlinien referenzieren

In Ihrer IAM-Richtlinie verweisen Sie auf eine Kubernetes-Ressource, indem Sie eine IAM-Hauptkonto-ID verwenden, um die Ressource auszuwählen. Diese Kennzeichnung hat die folgende Syntax:

PREFIX://iam.googleapis.com/projects/1234567890/locations/global/workloadIdentityPools/example-project.svc.id.goog/SELECTOR

In diesem Beispiel werden die folgenden Felder berücksichtigt:

  • PREFIX: muss je nach ausgewählter Ressource principal oder principalSet sein. principal gilt für eine bestimmte Ressource, z. B. ein einzelnes Dienstkonto. principalSet gilt für mehrere Ressourcen, die zur angegebenen Ressource gehören, wie z. B. alle Pods in einem bestimmten Cluster.
  • SELECTOR: Ein String, der einen Hauptkontotyp auswählt. Mit kubernetes.serviceaccount.uid/SERVICEACCOUNT_UID wird beispielsweise ein Dienstkonto anhand seiner UID ausgewählt.

In der folgenden Tabelle sind die unterstützten Prinzipaltypen in GKE aufgeführt:

Typ der Hauptkonto-ID Syntax
Alle Pods, die ein bestimmtes Kubernetes-Dienstkonto verwenden Wählen Sie das Dienstkonto nach Name aus:
principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/SERVICEACCOUNT

Ersetzen Sie Folgendes:

  • PROJECT_NUMBER: Ihre numerische Projektnummer. Informationen zum Ermitteln der Projektnummer finden Sie unter Projekte identifizieren.
  • PROJECT_ID: Projekt-ID in Google Cloud .
  • NAMESPACE: der Kubernetes-Namespace
  • SERVICEACCOUNT: Der Name des Kubernetes-Dienstkontos.

Dienstkonto anhand der UID auswählen
principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/kubernetes.serviceaccount.uid/SERVICEACCOUNT_UID

Ersetzen Sie Folgendes:

  • PROJECT_NUMBER: Ihre numerische Projektnummer. Informationen zum Ermitteln der Projektnummer finden Sie unter Projekte identifizieren.
  • PROJECT_ID: Projekt-ID in Google Cloud .
  • SERVICEACCOUNT_UID: die UID des ServiceAccount-Objekts auf dem API-Server.
Alle Pods in einem Namespace, unabhängig von Dienstkonto oder Cluster
principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/namespace/NAMESPACE

Ersetzen Sie Folgendes:

  • PROJECT_NUMBER: Ihre numerische Projektnummer. Informationen zum Ermitteln der Projektnummer finden Sie unter Projekte identifizieren.
  • PROJECT_ID: Projekt-ID in Google Cloud .
  • NAMESPACE: der Kubernetes-Namespace
Alle Pods in einem bestimmten Cluster
principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/kubernetes.cluster/https://container.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/clusters/CLUSTER_NAME

Ersetzen Sie Folgendes:

  • PROJECT_NUMBER: Ihre numerische Projektnummer. Informationen zum Ermitteln der Projektnummer finden Sie unter Projekte identifizieren.
  • PROJECT_ID: Projekt-ID in Google Cloud .
  • CLUSTER_NAME: Name Ihres GKE-Clusters.
  • LOCATION: Der Standort Ihres Clusters.

Anmeldedatenfluss

Wenn eine Arbeitslast eine Anfrage zum Zugriff auf eine Google Cloud API sendet, z. B. bei Verwendung einer Google Cloud Clientbibliothek, werden folgende Authentifizierungsschritte ausgeführt:

So erhält eine Arbeitslast ein IAM-Dienstkonto-Token mit Workload Identity.
Abbildung 1:Wie eine Arbeitslast ein föderiertes Zugriffstoken über die Identitätsföderation von Arbeitslasten für GKE abruft.
  1. Standardanmeldedaten für Anwendungen fordern ein Google Cloud -Zugriffstoken vom Compute Engine-Metadatenserver an, der auf der VM ausgeführt wird.
  2. Der GKE-Metadatenserver fängt die Tokenanfrage ab und fragt den Kubernetes API-Server nach einem Kubernetes-Dienstkonto-Token, mit dem die anfragende Arbeitslast identifiziert wird. Die Anmeldung erfolgt über ein vom API-Server signiertes JSON Web Token (JWT).
  3. Der GKE-Metadatenserver verwendet Security Token Service, um das JWT gegen ein kurzlebiges föderiertes Zugriffstoken auszutauschen, das auf die Identität der Kubernetes-Arbeitslast verweist.

Das vom Security Token Service zurückgegebene föderierte Zugriffstoken kann Einschränkungen beim Zugriff auf einige Google Cloud -Dienste haben, wie unter Unterstützte Produkte und Einschränkungen beschrieben. Wenn der ausgewählte Google Cloud -Dienst Einschränkungen hat, können Sie optional die Identitätsübernahme des Dienstkontos konfigurieren. Diese Methode führt zu einem Zugriffstoken für ein IAM-Dienstkonto, mit dem Ihre Arbeitslast auf den Zieldienst zugreifen kann. Weitere Informationen finden Sie unter Kubernetes-ServiceAccounts mit IAM verknüpfen.

Die Arbeitslast kann dann auf alle Google Cloud APIs zugreifen, auf die die IAM-Hauptkonto-ID der Arbeitslast zugreifen kann.

Kontingent für die Exchange Token API im Security Token Service

Die Exchange Token API im Security Token Service hat ein Kontingentlimit von 6.000 Anfragen pro Minute. Wenn Sie QUOTA_EXCEEDED-Fehler erhalten, können Sie auf der Seite Kontingente und Systemlimits eine Erhöhung des Token exchange requests per minute-Kontingents anfordern.

Identitätsgleichheit

Wenn die Metadaten in Ihrer Hauptkonto-ID für Arbeitslasten in mehreren Clustern, die gemeinsam einen Workload Identity-Pool nutzen, gleich sind, weil sie zum selben Google Cloud -Projekt gehören, identifiziert IAM diese Arbeitslasten als dieselben. Wenn Sie beispielsweise denselben Namespace in zwei Clustern haben und Zugriff auf diesen Namespace in IAM gewähren, erhalten die Arbeitslasten in diesem Namespace in beiden Clustern diesen Zugriff. Sie können diesen Zugriff auf bestimmte Cluster mithilfe von bedingten IAM-Richtlinien beschränken.

Betrachten Sie beispielsweise das folgende Diagramm. Cluster A und B gehören zum selben Workload Identity-Pool. Google Cloud identifiziert Anwendungen, die das Dienstkonto back-ksa im Namespace backend von Cluster A und Cluster B verwenden, als dieselbe Identität. IAM unterscheidet nicht zwischen den Clustern, die die Aufrufe ausführen.

Diagramm zur Identitätsgleichheit in einem Workload Identity-Arbeitspool
Abbildung 2 : Identitätsgleichheit beim Zugriff auf Google Cloud APIs mit der Identitätsföderation von Arbeitslasten für GKE.

Diese Identitätsgleichheit bedeutet auch, dass Sie jedem Cluster in einem bestimmten Workload Identity-Pool vertrauen können müssen. Wenn beispielsweise ein neuer Cluster, Cluster C im vorherigen Beispiel, einem nicht vertrauenswürdigen Team gehörte, kann es einen backend-Namespace erstellen und wie bei Cluster A und Cluster B über das Dienstkonto back-ksa auf Google Cloud APIs zugreifen.

Um einen nicht vertrauenswürdigen Zugriff zu vermeiden, platzieren Sie Ihre Cluster in separaten Projekten, damit sie unterschiedliche Workload Identity-Pools erhalten, oder achten Sie darauf, dass die Namespace-Namen voneinander verschieden sind, um eine gemeinsame Hauptkonto-ID zu vermeiden.

GKE-Metadatenserver

Wenn Sie die Identitätsföderation von Arbeitslasten für GKE für einen Cluster aktivieren, werden die Metadaten jedes Knotens im Cluster auf dem GKE-Metadatenserver gespeichert. Der GKE-Metadatenserver ist eine Teilmenge der Compute Engine-Metadatenserver-Endpunkte, die für Kubernetes-Arbeitslasten erforderlich sind.

Der GKE-Metadatenserver wird als DaemonSet mit einem Pod auf jedem Linux-Knoten oder einem nativen Windows-Dienst auf jedem Windows-Knoten im Cluster ausgeführt. Der Metadatenserver fängt HTTP-Anfragen an http://metadata.google.internal (169.254.169.254:80) ab. Mit der Anfrage GET /computeMetadata/v1/instance/service-accounts/default/token wird beispielsweise ein Token für das IAM-Dienstkonto abgerufen, dessen Identität der Pod annehmen soll. Der Traffic zum GKE-Metadatenserver verlässt nie die VM-Instanz, die den Pod hostet.

Token-Lebensdauer

Standardmäßig hat das zurückgegebene Zugriffstoken eine Lebensdauer von 1 Stunde (3.600 Sekunden). Um die Clientlatenz zu verringern, werden die Zugriffstokens vom GKE-Metadatenserver im Cache gespeichert. In einigen Fällen kann es vorkommen, dass das vom Metadatenserver zurückgegebene gecachte Token kurz vor dem Ablauf steht.

Cloud-Clientbibliotheken haben eine integrierte Logik, die standardmäßig prüft, ob das Zugriffstoken in den nächsten 3 Minuten und 45 Sekunden abläuft. Wenn das Token innerhalb des Ablaufzeitraums liegt, wird es von GKE aktualisiert. Bei nachfolgenden API-Aufrufen kann das aktualisierte Token verwendet werden.

Wenn Sie mit Ihrem eigenen Code direkt auf Google Cloud APIs zugreifen, implementieren Sie eine ähnliche Logik, um den Ablauf von Tokens zu verarbeiten. Ihr Code sollte Folgendes tun:

  1. Prüfen Sie, ob das Zugriffstoken nach 3 Minuten und 45 Sekunden abläuft. Der Parameter exp in der Token-Nutzlast gibt den Zeitstempel für den Ablauf des Tokens an.
  2. Wenn das Token in den nächsten 3 Minuten und 45 Sekunden abläuft, stellen Sie eine Tokenanfrage.

In den folgenden Tabellen wird die Teilmenge der auf dem GKE-Metadatenserver verfügbaren Compute Engine-Metadatenserver-Endpunkte beschrieben. Eine vollständige Liste der auf dem Compute Engine-Metadatenserver verfügbaren Endpunkte finden Sie unter Standardmäßige VM-Metadatenwerte.

Instanzmetadaten

Metadaten der Instanzen werden im folgenden Verzeichnis gespeichert.

http://metadata.google.internal/computeMetadata/v1/instance/

Eintrag Beschreibung
hostname

Der Hostname Ihres Knotens.

id

Die eindeutige ID Ihres Knotens.

service-accounts/

Ein Verzeichnis mit Dienstkonten, die mit diesem Knoten verknüpft sind. Für jedes Dienstkonto sind folgende Informationen verfügbar:

  • aliases
  • email: Die E-Mail-Adresse des Dienstkontos.
  • identity: Ein JSON-Webtoken (JWT), das für den Knoten eindeutig ist. Sie müssen in Ihrer Anfrage den Parameter audience angeben. Beispiel: ?audience=http://www.example.com
  • scopes: Die Zugriffsbereiche, die dem Dienstkonto zugewiesen sind.
  • token: Das OAuth 2.0-Zugriffstoken zur Authentifizierung Ihrer Arbeitslasten.
zone

Die Compute Engine-Zone Ihres GKE-Knotens.

Instanzattribute

Instanzattribute werden im folgenden Verzeichnis gespeichert:

http://metadata.google.internal/computeMetadata/v1/instance/attributes/

Eintrag Beschreibung
cluster-location

Die Compute Engine-Zone oder -Region Ihres Clusters.

cluster-name

Der Name Ihres GKE-Clusters.

cluster-uid

Die UID Ihres GKE-Clusters.

Die in der Tabelle aufgeführten Attribute sind die einzigen unterstützten Attribute. Wenn Sie versuchen, auf nicht unterstützte Attribute zuzugreifen, wird im gke-metadata-server-Pod im Namespace kube-system ein 404-Fehler generiert und protokolliert. Der Fehler sieht etwa so aus:

HTTP/404: generic::not_found: no child "", Reason: "NOT_FOUND", UserMessage: "Not Found"

Wenn Sie istio-proxy verwenden, wird eine Fehlermeldung wie die folgende angezeigt:

Error fetching GCP Metadata property gcp_gce_instance_template: metadata: GCE metadata "instance/attributes/UNSUPPORTED_ATTRIBUTE" not defined

Projektmetadaten

Metadaten von Clusterprojekten werden im folgenden Verzeichnis gespeichert.

http://metadata.google.internal/computeMetadata/v1/project/

Eintrag Beschreibung
project-id

Ihre Google Cloud Projekt-ID.

numeric-project-id

Ihre Google Cloud Projektnummer.

Einschränkungen der Identitätsföderation von Arbeitslasten für GKE

  • Sie können den Namen des Workload Identity-Pools, den GKE für Ihr Google Cloud Projekt erstellt, nicht ändern.

  • Wenn Sie Kubernetes-Dienstkonten mit IAM-Dienstkonten verknüpfen, um die Workload Identity-Föderation für GKE zu konfigurieren, gibt der GKE-Metadatenserver den Wert SERVICEACCOUNT_NAME.svc.id.goog als Dienstkonto-ID zurück. Diese Kennzeichnung verwendet nicht die standardmäßige IAM-Hauptkonto-ID-Syntax, was bei einigen programmatischen Vorgängen zu Fehlern führen kann. Wenn Sie die Dienstkonto-ID als IAM-Hauptkonto-ID abrufen möchten, fügen Sie Ihrem Kubernetes-ServiceAccount die Annotation iam.gke.io/return-principal-id-as-email: "true" hinzu.

  • Wenn GKE den GKE-Metadatenserver in einem Knotenpool aktiviert, können Pods nicht mehr auf den Compute Engine-Metadatenserver zugreifen. Stattdessen fängt der GKE-Metadatenserver Anfragen von diesen Pods an Metadatenendpunkte ab, mit Ausnahme von Pods, die im Hostnetzwerk ausgeführt werden.

  • Wenn Sie den Cloud Storage FUSE CSI-Treiber mit Standard-GKE-Clustern mit Version 1.33.3-gke.1226000 oder höher verwenden, können sich die Pods, die im Hostnetzwerk (hostNetwork: true) ausgeführt werden, mit ihrem eigenen Kubernetes-Dienstkonto authentifizieren. Weitere Informationen finden Sie unter Zugriff für Pods mit Hostnetzwerk konfigurieren.

  • Es dauert einige Sekunden, bis der GKE-Metadatenserver Anfragen für einen neu erstellten Pod akzeptiert. Daher können Versuche, sich mit Workload Identity-Föderation für GKE innerhalb der ersten Sekunden eines Pods zu authentifizieren, fehlschlagen. Wiederholen Sie den Aufruf, um das Problem zu beheben. Weitere Informationen finden Sie unter Fehlerbehebung.

  • In GKE integrierte Logging- und Monitoring-Agents verwenden weiterhin das Dienstkonto des Knotens.

  • Die Identitätsföderation von Arbeitslasten for GKE erfordert ein manuelles Einrichten des Knative Serving, um weiterhin Anfragemesswerte zur Verfügung zu stellen.

  • Die Identitätsföderation von Arbeitslasten für GKE legt ein Limit von 500 gleichzeitigen Verbindungen zum GKE-Metadatenserver für jeden Knoten fest. Zusätzliche gleichzeitige Aufrufe, die dieses Limit überschreiten, werden in eine Warteschlange gestellt und später verarbeitet. Dieser Warteschlangenmechanismus kann zu HTTP/499-Fehlern führen, wenn das Client-Zeitlimit erreicht wird, bevor der GKE-Metadatenserver die Anfrage verarbeiten kann.

  • Der GKE-Metadatenserver verwendet Arbeitsspeicherressourcen, die proportional zur Gesamtzahl der Kubernetes-Dienstkonten in Ihrem Cluster sind. Wenn Ihr Cluster mehr als 3.000 Kubernetes-Dienstkonten hat, beendet das Kubelet möglicherweise die Metadatenserver-Pods. Informationen zur Problemminderung finden Sie unter Fehlerbehebung.

  • Die Identitätsföderation von Arbeitslasten für GKE funktioniert innerhalb eines VPC Service Controls-Perimeters und ermöglicht den Zugriff auf Ressourcen darin. VPC Service Controls erzwingt jedoch keine Zugriffssteuerung für anbieterübergreifende Anfragen, die auf diesen föderierten Identitäten basieren. Sie können die Identität eines Dienstkontos übernehmen, um auf Ressourcen in einem anderen Perimeter zuzugreifen.

Alternativen zur Identitätsföderation von Arbeitslasten für GKE

Sie können eine der folgenden Alternativen zur Identitätsföderation von Arbeitslasten für GKE verwenden, um über GKE aufGoogle Cloud -APIs zuzugreifen. Wir empfehlen die Verwendung von Workload Identity-Föderation für GKE, da Sie für diese Alternativen bestimmte Sicherheitskompromisse eingehen müssen.

Nächste Schritte