Zum Hauptinhalt springen

Kubernetes

Laut der Kubernetes-Dokumentation, kann der API-Server von Kubernetes mit OpenID Connect (OIDC) authentifiziert werden. Dieser Artikel wird Sie anleiten, wie Sie die Authentifizierung in Kubernetes unter Verwendung von Casdoor konfigurieren.

Systemanforderungen

Bevor Sie beginnen, stellen Sie bitte sicher, dass Sie folgende Umgebung haben:

  • Ein Kubernetes-Cluster.
  • Eine Casdoor-Anwendung wie diese Demo-Website.
  • kubectl-Befehlswerkzeug (optional).
Notiz

Kubernetes oidc-issuer-url akzeptiert nur URLs, die das https://-Präfix verwenden. Ihre Casdoor-Anwendung sollte also auf einer HTTPS-Website bereitgestellt werden.

Schritt 1: Erstellen einer Casdoor-App und eines Benutzerkontos für die Authentifizierung

Gehen Sie zu Ihrer Casdoor-Anwendung und fügen Sie eine neue Anwendung namens Kubernetes hinzu. Bitte merken Sie sich den Name, Organization, client ID, client Secret und fügen Sie einige Grant-Typen zu dieser App hinzu.

Erstellen Sie eine Anwendung in Casdoor Grant-Typen

Als Nächstes fügen Sie einen neuen Benutzer zu der Anwendung hinzu, die Sie gerade erstellt haben. Bitte beachten Sie, dass die Organization und Signup application, die hier verwendet werden, der zuvor registrierten App entsprechen sollten.

Fügen Sie einen Benutzer in Casdoor hinzu

Schritt 2: Konfigurieren des Kubernetes API-Servers mit OIDC-Authentifizierung

Um das OIDC-Plugin zu aktivieren, müssen Sie die folgenden Flags auf dem API-Server konfigurieren:

  • --oidc-issuer-url: URL des Anbieters, der es dem API-Server ermöglicht, öffentliche Signaturschlüssel zu entdecken.
  • --oidc-client-id: Eine Client-ID, für die alle Token ausgestellt sein müssen.

Dieser Artikel verwendet Minikube zur Demonstration. Sie können das OIDC-Plugin für den API-Server von Minikube mit dem folgenden Befehl beim Start konfigurieren:

minikube start --extra-config=apiserver.oidc-issuer-url=https://demo.casdoor.com --extra-config=apiserver.oidc-client-id=294b09fbc17f95daf2fe

Schritt 3: OIDC-Authentifizierung testen

Authentifizierungsinformationen abrufen

Aufgrund des Fehlens einer Frontend in kubectl kann die Authentifizierung durch Senden einer POST-Anfrage an den Casdoor-Server durchgeführt werden. Hier ist der Code in Python, der eine POST-Anfrage an den Casdoor-Server sendet und das id_token und refresh_token abruft:

import requests
import json

url = "https://demo.casdoor.com/api/login/oauth/access_token"
payload = json.dumps({
"grant_type": "password",
"client_id": "Kubernetes",
"client_secret": "72c65c3912aec24a9f3ec41b65a7577114ed2bae",
"username": "user_3u94sf",
"password": "123456"
})
response = requests.request("POST", url, data=payload)

print(response.text)

Nachdem Sie diesen Code ausgeführt haben, sollten Sie eine ähnliche Antwort wie die folgende erhalten:

{
"access_token": "xxx",
"id_token": "yyy",
"refresh_token": "zzz",
"token_type": "Bearer",
"expires_in": 72000,
"scope": ""
}

Jetzt können Sie das id_token, das Sie gerade erhalten haben, verwenden, um sich beim Kubernetes API-Server zu authentifizieren.

HTTP-Anfragebasierte Authentifizierung

Fügen Sie das Token zum Anfrageheader hinzu.

curl https://www.xxx.com -k -H "Authorization: Bearer $(id_token)"
  • https://www.xxx.com ist die Bereitstellungsadresse des Kubernetes API-Servers.

Kubectl-Client-basierte Authentifizierung

Konfigurationsdatei-Methode

Schreiben Sie die folgende Konfiguration in die Datei ~/.kube/config. Sie sollten jedes Konfigurationselement in der obigen Konfigurationsdatei durch die Werte ersetzen, die Sie zuvor erhalten haben.

users:
- name: minikube
user:
auth-provider:
config:
client-id: Kubernetes
client-secret: 72c65c3912aec24a9f3ec41b65a7577114ed2bae
id-token: $(id_token)
idp-issuer-url: https://demo.casdoor.com
refresh-token: $(refresh_token)
name: oidc

Jetzt können Sie direkt mit kubectl auf Ihren API-Server zugreifen. Versuchen Sie, einen Testbefehl auszuführen.

kubectl cluster-info

Kommandozeilenargument-Methode

Alternativ können Sie sich authentifizieren, indem Sie das id_token direkt zu den Kommandozeilenparametern von kubectl hinzufügen.

kubectl --token=$(id_token) cluster-info