Pods für den Zugriff auf Nicht-OCI-Ressourcen mit OpenID Connect-(OIDC-)Discovery autorisieren
Erfahren Sie, wie Sie mit OpenID Connect-(OIDC-)Discovery Anwendungspods authentifizieren, die auf Clustern ausgeführt werden, die Sie mit Container Engine for Kubernetes (OKE) erstellen, damit die Pods Service-APIs bei externen Cloud-Providern aufrufen können.
Möglicherweise möchten Sie, dass Anwendungspods, die auf einem Kubernetes-Cluster ausgeführt werden, das Sie mit der Kubernetes-Engine erstellt haben, mit Cloud-Service-APIs kommunizieren, die auf externen Cloud-Providern (wie GCP, AWS und Azure) gehostet werden. Um die Sicherheit der von einem externen Cloudprovider gehosteten Ressourcen sicherzustellen, muss die auf dem Cluster ausgeführte Anwendung die Identität authentifizieren und verwalten. Die direkte Verwaltung von Zugangsdaten kann jedoch ein umständlicher Prozess für Anwendungen sein, und die Schlüsselrotation ist ein manueller Prozess mit erheblichem Overhead.
OpenID Connect (OIDC) ist ein Industriestandard, um solche Integrationen einfacher zu gestalten. OpenID Connect ist eine Identitätsschicht, die auf OAuth 2.0 basiert. OpenID Connect unterstützt ein Discovery-Protokoll (oft als "OIDC Discovery" bezeichnet), das ein Konfigurationsdokument des OpenID-Providers (auch als "Discovery-Dokument" bezeichnet) zur Authentifizierung von Anwendungen verwendet.
Kubernetes Engine unterstützt OIDC Discovery und ermöglicht es Ihnen, Anwendungen zu erstellen, die mit anderen Cloud-Services interagieren, ohne dass Hard Code geschrieben und API-Authentifizierungsschlüssel manuell rotiert werden müssen. Sie können OIDC Discovery optional aktivieren, wenn Sie ein erweitertes Cluster mit Kubernetes Engine erstellen oder aktualisieren.
Wenn Sie OIDC Discovery für ein Cluster aktivieren, wird das Service-Account-Token der Anwendung auf hoher Ebene authentifiziert und (falls gültig) gegen ein Zugriffstoken ausgetauscht. Das Zugriffstoken wird dann verwendet, um die Anwendung mit der API im externen Cloud-Provider zu authentifizieren.
Weitere Informationen hierzu finden Sie unter Discovery des Serviceaccountausstellers in der Kubernetes-Dokumentation.
OIDC Discovery im Detail
Kubernetes stellt jedem auf einem Cluster ausgeführten Anwendungspod einen Serviceaccount zur Verfügung und erstellt ein Serviceaccounttoken für jeden Serviceaccount. Kubernetes verwaltet den Lebenszyklus von Serviceaccount-Token. Das Serviceaccounttoken ist ein Bearer-Token, das die Anwendung an API-Anforderungen anhängt und als JSON Web Token (JWT) strukturiert ist.
Wenn Sie OIDC Discovery für ein Cluster aktivieren, zeigt Kubernetes Engine einen OIDC-Aussteller an und fügt die URL des OIDC-Ausstellers dem Serviceaccounttoken als Wert des iss
-Claims hinzu.
Der Speicherort eines OIDC-Discovery-Dokuments ist relativ zur URL des OIDC-Ausstellers und ein öffentlich zugänglicher und nicht authentifizierter bekannter Endpunkt. Das OIDC-Discovery-Dokument enthält den öffentlich zugänglichen und nicht authentifizierten Speicherort eines JSON Web Key Sets (JWKS), das die Public Keys zur Prüfung des Serviceaccounttokens enthält. Der Identitätsprovider des externen Cloud-Providers verwendet das OIDC-Discovery-Dokument, um das JWKS zu suchen, und verwendet das JWKS, um das Serviceaccounttoken zu prüfen.
Für zusätzliche Sicherheit erfordert die von einem Anwendungspod aufgerufene Cloud-Service-API möglicherweise, dass eine bestimmte Zielgruppe im Serviceaccounttoken vorhanden ist, das Kubernetes erstellt. Wenn die Cloud-Service-API eine bestimmte Zielgruppe erfordert, können Sie diese Zielgruppe angeben, indem Sie die Eigenschaft audience
eines prognostizierten Volumes im Podmanifest festlegen. Die angegebene Zielgruppe ist als Wert des aud
-Claims im Serviceaccounttoken enthalten und kann dann vom externen Cloudprovider verifiziert werden. Sie können auch einen Gültigkeitszeitraum für das Serviceaccounttoken angeben, indem Sie den Wert der Eigenschaft expirationSeconds
des prognostizierten Volumes im Podmanifest festlegen. Weitere Informationen hierzu finden Sie unter ServiceAccount Token-Volume-Projektion in der Kubernetes-Dokumentation.
Wenn der Identitätsprovider des externen Cloud-Providers das Serviceaccounttoken erfolgreich mit JWKS prüft, tauscht der Identitätsprovider das Serviceaccounttoken gegen ein Zugriffstoken aus. Mit dem Zugriffstoken wird dann die Anwendung authentifiziert, und die Anwendung wird autorisiert, die API auf dem externen Cloud-Provider zu verwenden.
OIDC Discovery-Tokenaustauschprozess
- Ein OIDC-Aussteller. Der OIDC-Aussteller wird über HTTPS mit einem öffentlich vertrauenswürdigen TLS/SSL-Zertifikat angegeben.
- Ein JSON Web Key Set (JWKS), das die Public Keys enthält, mit denen das Serviceaccounttoken verifiziert wird. Das JWKS wird in einem öffentlich zugänglichen und nicht authentifizierten Bucket im Object Storage-Service gespeichert. Siehe JWKS-Beispiel.
- Ein OIDC-Discovery-Dokument (im JSON-Format), das den Speicherort des JWKS enthält. Das Discovery-Dokument wird in einem öffentlich zugänglichen und nicht authentifizierten Bucket im Object Storage-Service gespeichert. Siehe Beispiel für Discovery-Dokumente.
Wenn Sie einen Anwendungspod definieren, der Anforderungen an eine externe API sendet, und wenn der Identitätsprovider des externen Cloud-Providers eine bestimmte Zielgruppe im Serviceaccounttoken erwartet, geben Sie eine prognostizierte serviceAccountToken
im Podmanifest an, und legen Sie die Eigenschaft audience
entsprechend fest. Siehe Beispiel für Podmanifest.
Im Folgenden finden Sie eine Übersicht über den Tokenaustauschprozess:
-
Wenn Sie den Anwendungspod im Cluster erstellen, gibt Kubernetes dem Pod ein Serviceaccounttoken. Das Serviceaccounttoken enthält die URL des Kubernetes-Engine-OIDC-Ausstellers als Wert des
iss
-Claims im JWT. Wenn Sie eine Zielgruppe im Podmanifest angegeben haben, wird die Zielgruppe als Wert desaud
-Claims in das JWT aufgenommen. Siehe Beispiel für Serviceaccounttoken. - Der Anwendungspod stellt eine Anforderung an eine API in einem externen Cloud-Provider und stellt das codierte Serviceaccount-Token dem externen Cloud-Provider im Autorisierungsheader der API-Anforderung dar.
- Der Identitätsprovider des externen Cloud-Providers decodiert das Serviceaccounttoken, extrahiert die URL des Kubernetes-Engine-OIDC-Ausstellers aus dem
iss
-Claim, hängt/.well-known/openid-configuration
als Speicherort des OIDC-Discovery-Dokuments an die URL an und sendet eine Anforderung an diese URL, um das Discovery-Dokument abzurufen. - Der Kubernetes-Engine-OIDC-Aussteller gibt das OIDC-Discovery-Dokument zurück, das die URL des Speicherorts des JWKS im Feld
jwks_uri
enthält. Siehe Beispiel für Discovery-Dokumente. - Der Identitätsprovider des externen Cloud-Providers extrahiert die URL aus dem OIDC-Discovery-Dokument und sendet eine Anforderung an diese URL, um das JWKS abzurufen. Siehe JWKS-Beispiel.
- Der Identitätsprovider des externen Cloud-Providers verwendet JWKS, um das Serviceaccounttoken zu validieren, das ursprünglich vom Anwendungspod dargestellt wurde.
- Wenn das Serviceaccounttoken gültig ist, gibt der Identitätsprovider des externen Cloudproviders ein Zugriffstoken an den Anwendungspod zurück.
- Der Anwendungspod stellt das Zugriffstoken für die API im externen Cloud-Provider dar, um seine Identität zu beweisen, und führt API-Anforderungen erfolgreich aus.
Der Tokenaustauschprozess ist im folgenden Diagramm dargestellt:
Hinweise zur OIDC-Discovery
Beachten Sie bei der Verwendung von OIDC Discovery die folgenden Punkte:
- OIDC Discovery wird auf Clustern unterstützt, auf denen Kubernetes-Version 1.21 oder höher ausgeführt wird.
- OIDC Discovery wird nur in VCN-nativen Clustern (Clustern mit Kubernetes-API-Endpunkten in einem Subnetz in Ihrem eigenen VCN) unterstützt. Siehe In VCN-native Cluster migrieren.
- OIDC Discovery wird auf verwalteten Knoten, virtuellen Knoten und selbstverwalteten Knoten unterstützt.
- OIDC Discovery wird auf erweiterten Clustern (aber nicht auf einfachen Clustern) unterstützt.
Beispiel für Podmanifest, Serviceaccounttoken, Discovery-Dokument und JWKS für OIDC Discovery
Beispiel für Podmanifest
Ein Beispielmanifest für einen Anwendungspod, der eine Cloud-Service-API aufruft. In diesem Beispiel erwartet der Identitätsprovider des externen Cloud-Providers, dass das Serviceaccounttoken eine Zielgruppe mit dem Namen vault
angibt:
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- image: nginx
name: nginx
volumeMounts:
- mountPath: /var/run/secrets/tokens
name: vault-token
serviceAccountName: build-robot
volumes:
- name: vault-token
projected:
sources:
- serviceAccountToken:
path: vault-token
expirationSeconds: 7200
audience: vault
Beispiel für Serviceaccounttoken
Ein Beispielserviceaccounttoken, das Kubernetes unter Beispiel für Podmanifest für den Pod erstellen kann:
{
"aud": [
"vault"
],
"exp": 1731613413,
"iat": 1700077413,
"iss": "https://objectstorage.us-ashburn-1.oci.customer-oci.com/n/okecustprod/b/oidc/o/{discoveryUUID}",
"kubernetes.io": {
"namespace": "kube-system",
"node": {
"name": "127.0.0.1",
"uid": "58456cb0-dd00-45ed-b797-5578fdceaced"
},
"pod": {
"name": "build-robot-69cbfb9798-jv9gn",
"uid": "778a530c-b3f4-47c0-9cd5-ab018fb64f33"
},
"serviceaccount": {
"name": "build-robot",
"uid": "a087d5a0-e1dd-43ec-93ac-f13d89cd13af"
},
"warnafter": 1700081020
},
"nbf": 1700077413,
"sub": "system:serviceaccount:kube-system:build-robot"
}
Beispiel für ein Discovery-Dokument
Ein Beispiel-Discovery-Dokument, das von der Kubernetes-Engine ausgegeben werden kann, einschließlich des Speicherorts des durch das Feld jwks_uri
angegebenen JWKS:
{
"issuer": "https://objectstorage.us-ashburn-1.oci.customer-oci.com/n/okecustprod/b/oidc/o/{discoveryUUID}",
"jwks_uri": "https://objectstorage.us-ashburn-1.oci.customer-oci.com/n/okecustprod/b/oidc/o/{discoveryUUID}/jwks",
"response_types_supported": [
"id_token"
],
"subject_types_supported": [
"public"
],
"id_token_signing_alg_values_supported": [
"RS256"
]
}
JWKS-Beispiel
Beispiel-JWKS zur Authentifizierung des Serviceaccounttokens:
{
"keys": [
{
"kty": "RSA",
"kid": "42148Kf",
"use": "sig",
"alg": "RS256",
"n": "iGaLqP6y-SJCCBq5Hv6pGDbG_SQ______asdf3sC",
"e": "AQAB"
},
{
"kty": "RSA",
"kid": "bEaunmA",
"use": "sig",
"alg": "RS256",
"n": "BISvILNyn-lUu4goZSXBD9ackM9______RpUlq2w",
"e": "AQAB"
}
]
}
Cluster für OIDC-Discovery aktivieren
Damit Anwendungspods, die auf einem Cluster ausgeführt werden, das Sie mit der Kubernetes Engine erstellen, beim Zugriff auf APIs, die auf einem externen Cloud-Provider gehostet werden, mit OIDC Discovery authentifiziert werden können, müssen Sie die Eigenschaft OIDC-Discovery aktivieren des Clusters festlegen.
Cluster für die OIDC-Discovery mit der Konsole aktivieren
Neues Cluster erstellen, das für OIDC Discovery aktiviert ist
So erstellen Sie ein Cluster und aktivieren die Authentifizierung von Anwendungspods, die auf dem Cluster ausgeführt werden, mit OIDC Discovery beim Zugriff auf APIs, die auf einem externen Cloud-Provider gehostet werden:
- Befolgen Sie die Anweisungen zum Erstellen eines Clusters mit dem Workflow "Benutzerdefinierte Erstellung". Siehe Cluster mit explizit definierten Einstellungen im Workflow "Benutzerdefinierte Erstellung" mit der Konsole erstellen.
-
Übernehmen Sie auf der Seite "Cluster erstellen" entweder einfach die Standardkonfigurationsdetails für das neue Cluster, oder geben Sie Alternativen wie folgt ein:
- Name: Der Name des neuen Clusters. Akzeptieren Sie den Standardnamen, oder geben Sie einen Namen Ihrer Wahl ein. Geben Sie keine vertraulichen Informationen ein.
- Compartment: Das Compartment, in dem das neue Cluster erstellt werden soll.
- Kubernetes-Version: die Version von Kubernetes, die auf den Control-Plane-Knoten des Clusters ausgeführt werden soll Akzeptieren Sie die Standardversion, oder wählen Sie eine Version aus. Die ausgewählte Kubernetes-Version bestimmt unter anderem das Standardset der Zulassungscontroller, die im erstellten Cluster aktiviert sind (siehe Unterstützte Zulassungscontroller).
-
Wählen Sie Erweiterte Optionen anzeigen, und wählen Sie im Bereich OpenID Connect-(OIDC-)Discovery die Option OIDC-Discovery aktivieren aus.
- Geben Sie andere Konfigurationsdetails für das neue Cluster ein, wie unter Cluster mit explizit definierten Einstellungen im Workflow "Benutzerdefinierte Erstellung" mit der Konsole erstellt werden beschrieben.
-
Wählen Sie Cluster erstellen aus, um das neue Cluster jetzt zu erstellen.
Vorhandenes Cluster bearbeiten, um OIDC Discovery zu aktivieren
So aktualisieren Sie ein vorhandenes Cluster, damit auf dem Cluster ausgeführte Anwendungspods sich beim Zugriff auf APIs, die auf einem externen Cloud-Provider gehostet werden, mit OIDC Discovery authentifizieren können:
- Um ein vorhandenes Cluster mit der Konsole zu aktualisieren, befolgen Sie die Anleitungen. Siehe Cluster aktualisieren.
-
Wählen Sie auf der Seite Clusterdetails die Option Bearbeiten aus.
-
Wählen Sie im Fenster Cluster bearbeiten im Bereich OpenID Connect-(OIDC-)Discovery die Option OIDC-Discovery aktivieren aus.
-
Wählen Sie Speichern aus, um die Änderungen zu speichern.
Cluster für die OIDC-Discovery mit der CLI aktivieren
Informationen zur Verwendung der CLI finden Sie unter Befehlszeilenschnittstelle (CLI). Eine vollständige Liste der Flags und Optionen, die für CLI-Befehle verfügbar sind, finden Sie in der Befehlszeilenreferenz.
Cluster erstellen und OIDC Discovery aktivieren
Um mit der CLI ein erweitertes Cluster zu erstellen, das mit OIDC Discovery Anwendungspods beim Zugriff auf APIs authentifiziert, die auf einem externen Cloud-Provider gehostet werden, nehmen Sie den Parameter --open-id-connect-discovery-enabled
in den Befehl oci ce cluster create
auf.
Beispiel:
oci ce cluster create \
--compartment-id ocid1.compartment.oc1..aaaaaaaa______n5q \
--name sales \
--vcn-id ocid1.vcn.oc1.phx.aaaaaaaa______lhq \
--type ENHANCED_CLUSTER \
--kubernetes-version v1.25.4 \
--service-lb-subnet-ids "[\"ocid1.subnet.oc1.phx.aaaaaaaa______g7q"]" \
--endpoint-subnet-id ocid1.subnet.oc1.phx.aaaaaaaa______sna \
--endpoint-public-ip-enabled true \
--endpoint-nsg-ids "[\"ocid1.networksecuritygroup.oc1.phx.aaaaaaaa______5qq\"]" \
--cluster-pod-network-options '[{"cniType":"OCI_VCN_IP_NATIVE"}]' \
--open-id-connect-discovery-enabled true
Cluster zum Aktivieren der OIDC-Discovery bearbeiten
Um ein erweitertes Cluster mit der CLI zu aktualisieren und OIDC Discovery zur Authentifizierung von Anwendungspods beim Zugriff auf APIs zu verwenden, die auf einem externen Cloud-Provider gehostet werden, setzen Sie das Attribut isOpenIdConnectDiscoveryEnabled
auf "true":
- Erstellen Sie in einem geeigneten Editor eine JSON-Datei mit einem Namen Ihrer Wahl (bei diesen Anweisungen wird davon ausgegangen, dass die Datei
cluster-enable-oidc.json
genannt wird), die Folgendes enthält:{ "options": { "openIdConnectDiscovery": { "isOpenIdConnectDiscoveryEnabled": true } } }
- Speichern und schließen Sie die Datei
cluster-enable-oidc.json
. -
Aktualisieren Sie das Cluster, indem Sie Folgendes eingeben:
oci ce cluster update --cluster-id <cluster-ocid> --from-json file://<path-to-file>
Hierbei gilt:
--cluster-id <cluster-ocid>
ist die OCID des Clusters, in dem Sie die OIDC-Discovery aktivieren möchten.--from-json file://<path-to-file>
gibt den Speicherort der Datei an, die beim Aktualisieren des Clusters verwendet werden soll.
Beispiel:
oci ce cluster update --cluster-id ocid1.cluster.oc1.iad.aaaaaaaaaf______jrd --from-json file://./cluster-enable-oidc.json
Cluster für OIDC-Discovery mit der API aktivieren
Führen Sie den Vorgang CreateCluster aus, um ein Cluster zu erstellen, oder den Vorgang UpdateCluster, um ein Cluster zu bearbeiten, und geben Sie true
als Wert des Attributs
der Ressource CreateClusterOptions bzw. der Ressource UpdateClusterOptionsDetails an.isOpenIdConnectDiscoveryEnabled