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

Wenn Sie OIDC Discovery für ein Cluster aktivieren, damit ein Anwendungspod eine Anforderung an eine externe API stellen kann, stellt Kubernetes Engine Folgendes bereit:
  • 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:

  1. 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 des aud-Claims in das JWT aufgenommen. Siehe Beispiel für Serviceaccounttoken.

  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. Der Identitätsprovider des externen Cloud-Providers verwendet JWKS, um das Serviceaccounttoken zu validieren, das ursprünglich vom Anwendungspod dargestellt wurde.
  7. Wenn das Serviceaccounttoken gültig ist, gibt der Identitätsprovider des externen Cloudproviders ein Zugriffstoken an den Anwendungspod zurück.
  8. 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:

Diese Abbildung zeigt den Tokenaustauschprozess, der im umgebenden Text beschrieben wird.

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:

  1. 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.
  2. Ü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).
  3. Wählen Sie Erweiterte Optionen anzeigen, und wählen Sie im Bereich OpenID Connect-(OIDC-)Discovery die Option OIDC-Discovery aktivieren aus.

  4. 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.
  5. 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:

  1. Um ein vorhandenes Cluster mit der Konsole zu aktualisieren, befolgen Sie die Anleitungen. Siehe Cluster aktualisieren.
  2. Wählen Sie auf der Seite Clusterdetails die Option Bearbeiten aus.

  3. Wählen Sie im Fenster Cluster bearbeiten im Bereich OpenID Connect-(OIDC-)Discovery die Option OIDC-Discovery aktivieren aus.

  4. 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":

  1. 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
        }
      }
    }
  2. Speichern und schließen Sie die Datei cluster-enable-oidc.json.
  3. 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 isOpenIdConnectDiscoveryEnabled der Ressource CreateClusterOptions bzw. der Ressource UpdateClusterOptionsDetails an.