Hinzufügen von OAuth2 zu Jupyter Notebooks auf Kubernetes

Auf Geschwindigkeit ausgelegt: ~ 10 ms Latenz, auch unter Last
Unglaublich schnelle Methode zum Erstellen, Verfolgen und Bereitstellen Ihrer Modelle!
- Verarbeitet mehr als 350 RPS auf nur 1 vCPU — kein Tuning erforderlich
- Produktionsbereit mit vollem Unternehmenssupport
Wahre Gießerei Benutzer können Stellen Sie Jupyter Notebooks bereit auf ihren persönlichen Cloud-Konten wie AWS, Azure oder GCP. Mit dieser Funktion können sie mühelos Experimente zum maschinellen Lernen und Trainingsjobs auf ihren eigenen Computern durchführen. Anfänglich wurden Notebooks, die über TrueFoundry bereitgestellt wurden, mit einer Kombination aus Benutzername und Passwort gesichert. Als Reaktion auf weit verbreitete Kundenanfragen haben wir jedoch Single Sign-On integriert. Das bedeutet, dass Benutzer jetzt bequem mit demselben Login, das sie für TrueFoundry verwenden, auf ihre Notebooks zugreifen können. Dieser Blogbeitrag befasst sich mit den Einzelheiten, wie wir diese Funktion implementiert haben.

Notizbücher auf TrueFoundry
TrueFoundry verwendet intern einen Fork von Kubeflow Notebook Controller, um die Bereitstellung von Notebooks zu orchestrieren. Der Controller bietet verschiedene Funktionen, die wir nutzen, wie zum Beispiel:
- Vereinfachte Notebook-Spezifikation: Die Kubeflow Notebook-APIs sind einfach und der Controller orchestriert die Erstellung der Jupyter Notebook-Bereitstellungen.
- Automatisches Ausblenden: Der Controller fährt das Notebook nach einer bestimmten Zeit der Inaktivität automatisch herunter. Dies ist unglaublich nützlich für unsere Kunden, die Experimente auf Notebooks durchführen, die von GPU-Computern unterstützt werden.
- Persistentes Home-Verzeichnis: Der Controller sorgt für die Erstellung eines persistenten Volumes, das den Benutzerfortschritt sitzungsübergreifend auf dem Notebook speichert.
- Erweiterbare Basis-Images: Der Controller unterstützt eine Reihe von Basis-Notebook-Images von Jupyter Notebook und VS Code, die von TrueFoundry verwaltet werden. Der Benutzer kann die Funktionen dieser Docker-Images erweitern, indem er ein Startskript hinzufügt oder bestimmte Bibliotheken installiert.
Zum Kontext sieht ein einfaches Kubeflow Notebook-Objekt so aus:
API-Version: kubeflow.org/v1
Art: Notizbuch
Metadaten:
Name: mein-Notizbuch
spezifikation:
schablone:
spezifikation:
Behälter:
- Name: my-notebook
Bild: kubeflownotebookswg/jupyter:master
Argumente:
[
"start.sh „,
„Labor“,
„--labApp.token="“,
„--labapp.allow_remote_access='Wahr'“,
„--labapp.allow_root='Wahr'“,
„--labapp.ip='*'“,
„--labapp.base_url=/test/mein-notebook/“,
„--port=8888",
„--kein Browser“,
]
Basic Auth für Notebooks
Vor der Implementierung von OAuth2 bot TrueFoundry Benutzern die Möglichkeit, die Sicherheit ihrer öffentlichen Notebooks durch die Integration der Standardauthentifizierung zu erhöhen. Diese zusätzliche Sicherheitsebene war entscheidend, um sicherzustellen, dass nur autorisierte Personen auf den vertraulichen Inhalt dieser Notizbücher zugreifen konnten. Um diese Funktion zu implementieren, nutzte TrueFoundry die Funktionen von WebAssembly (Wasm) -Plugins innerhalb des Istio-Proxys, insbesondere der Proxy für Gesandte.
Istio, ein Open-Source-Service-Mesh, bietet ein Framework für die Verwaltung der Netzwerkkommunikation zwischen verschiedenen Service-Workloads. Mit Istio wurde TrueFoundry in die Lage versetzt, benutzerdefinierte Logik direkt in die Netzwerkebene einzufügen, die vom Envoy-Proxy verwaltet wird. Dieser Ansatz ermöglichte eine effektive Kontrolle und Sicherheit des Datenverkehrs, der zu und von ihren Jupyter-Notebooks fließt. Der Schlüssel zur Implementierung der Basisauthentifizierung war das WASMplugin, eine Funktion von Istio, die die Bereitstellung von WebAssembly-Modulen innerhalb des Envoy-Proxys erleichtert.
Dieses grundlegende WASM-Plugin für die Authentifizierung ist in eine Abfolge von Netzwerkfiltern innerhalb des Envoy-Proxys integriert. Diese Filter ermöglichen die Ausführung übergeordneter Funktionen in Bezug auf Zugriffskontrolle, Transformation, Datenanreicherung, Prüfung und mehr und verbessern so die allgemeine Sicherheit und Funktionalität des Service Mesh. Hier ist eine vereinfachte Version der Spezifikation für das Hinzufügen eines einfachen Authentifizierungsfilters zur Envoy-Filterkette:
API-Version: extensions.istio.io/v1alpha1
Art: WASM-Plugin
Metadaten:
Name: Basic-Auth
Namespace: istio-ingress
spezifikation:
Phase: AUTHN
Plugin-Konfiguration:
grundlegende Authentifizierungsregeln:
- Referenzen:
- Benutzer:Pass
Gastgeber: www.example.com
Präfix: /secret/
Selektor:
Labels abgleichen:
istio: ingressgateway
url: oci: //ghcr.io/istio-ecosystem/wasm-extensions/basic_auth:1.12.0
OAuth2 für Notebook
Für die Implementierung von OAuth2 in unseren Notebooks verwendeten wir einen Envoy-Filter, aber der Ansatz unterschied sich von dem der Standardauthentifizierung. Im Gegensatz zur Basisauthentifizierung, bei der wir bequem ein vorgefertigtes WASM-Plugin in die Filterkette einfügen konnten, benötigte OAuth2 eine maßgeschneidertere Lösung. Um dies zu erreichen, verwendeten wir einen HTTP-Filter, der speziell für OAuth entwickelt wurde. Bei TrueFoundry lässt sich unser Single Sign-On-System integrieren mit FusionAuth, der als unser OAuth-Anbieter fungiert.
So sieht die Envoy-Filter-Spezifikation aus — weitere Informationen finden Sie in den Kommentaren in der Datei:
API-Version: networking.istio.io/v1alpha3
Art: EnvoyFilter
Metadaten:
name: truefoundry-notebook-tfy-oauth2 # Name des EnvoyFilters
namespace: auth-test # Namespace, in dem der EnvoyFilter eingesetzt wird
spezifikation:
Workload-Selektor:
Beschriftungen:
truefoundry.com/application: truefoundry-notebook # Selektor für Workloads mit bestimmten Labels
Patches konfigurieren:
- Bewerben Sie sich bei: CLUSTER
Spiel:
Kontext: SIDECAR_OUTBOUND
Patch:
Bedienung: ADD
wert:
name: tfy-oauth2 # Name des Clusters für den OAuth2-Authentifizierungsdienst
type: LOGICAL_DNS # Art der Diensterkennung (DNS)
connect_timeout: 5s # Timeout für den Verbindungsaufbau
lb_policy: ROUND_ROBIN # Lastausgleichsrichtlinie
# andere Load Balancing-Konfiguration
- Anwenden auf: HTTP_FILTER
Spiel:
Kontext: SIDECAR_INBOUND
Zuhörer:
Filterkette:
filtern:
Name: „envoy.filters.network.http_connection_manager“
Unterfilter:
Name: envoy.filters.http.jwt_authn
Patch:
operation: INSERT_BEFORE # Diesen Filter vor dem JWT-Authentifizierungsfilter einfügen
wert:
name: envoy.filters.http.tfy-oauth # Name des OAuth-Filters
typ_config:
"@type „: type.googleapis.com/envoy.extensions.filters.http.oauth2.v3.oauth2
Konfiguration:
use_refresh_token: false # Ob ein Aktualisierungstoken verwendet werden soll
pass_through_matcher:
- Name: Autorisierung
present_match: true # Durchlaufen, wenn der Autorisierungsheader vorhanden ist
forward_bearer_token: true # Forward-Inhaber-Token an Upstream
auth_type: BASIC_AUTH # Art der verwendeten Authentifizierung
token_endpoint:
cluster: tfy-oauth2 # Cluster für Token-Endpunkt
uri: <token-endpoint-uri-of-oauth-provider>
Timeout: 5s # Timeout für Token-Endpunkt
Authorization_Endpunkt: <authorization-endpoint-uri-of-oauth-provider>
redirect_uri: https://%REQ(:authority)%/truefoundry-notebook/_auth/callback # Umleitungs-URI für Rückruf
Umleitungspfad_Matcher:
Pfad:
exakt: /truefoundry-notebook/_auth/callback # Pfad für die Umleitungs-URI
Abmeldepfad:
Pfad:
exact: /truefoundry-notebook/_auth/signout # Pfad zum Abmelden
Referenzen:
Kunden-ID: <client-id-for-oauth>
token_secret:
# Konfiguration zum Abrufen des Token-Geheimnisses
# Lesen Sie hier mehr darüber, wie wir Geheimnisse abrufen:
# https://www.envoyproxy.io/docs/envoy/latest/configuration/security/secret
hmac_secret:
# Konfiguration zum Abrufen von HMAC
Wenn ein Benutzer zum ersten Mal versucht, auf einen Dienst zuzugreifen, der durch den OAuth2-Filter geschützt ist, wird er zum authorization_endpoint. Dieser Endpunkt ist die URL unseres externen OAuth-Anbieters, bei dem es sich in unserer Implementierung um das FusionAuth-basierte TrueFoundry-Login-Modal handelt. Diese Umleitung ist ein wichtiger Schritt im OAuth-Prozess. Sie führt Benutzer zu einem sicheren Ort, an dem sie sich authentifizieren und somit die erforderlichen Berechtigungen für den Zugriff auf den Dienst gewähren können.
Sobald die Anmeldung abgeschlossen ist, leitet FusionAuth Sie weiter zum Umleitung_URI (in der Filterspezifikation konfiguriert), indem dort ein geheimer, temporärer Autorisierungscode hinzugefügt wird. Diese Anfrage wird vom Filter abgefangen und er sendet eine Anfrage an token_endpoint, tauscht den Code gegen ein JWT-Token aus. Schließlich setzt der Filter Cookies mit dem JWT-Token.
Nachfolgende Zugriffe auf den Dienst werden durch den HTTP-Filter geleitet, da das Cookie den Autorisierung Header mit JWT als Wert. Der Filter ist so konfiguriert, dass er solche Anfragen durchlässt (siehe pass_through_matcher in der Spezifikation). Um zu überprüfen, ob das JWT ein gültiges Token ist, erstellen wir eine RequestAuthentication-Richtlinie, die beim OAuth-Anbieter nachfragt:
API-Version: security.istio.io/v1beta1
Art: RequestAuthentication
Metadaten:
#...
spezifikation:
Selektor:
#...
JWT-Regeln:
- Emittent: „truefoundry.com“
Aus Headern:
- Name: Autorisierung
Präfix: „Träger“
Publikum:
- <client-id>
JWK sagt: <oauth-provider-jwks-uri>
ForwardOriginalToken: wahr
Schließlich fügen wir die Autorisierungsrichtlinie hinzu, die festlegt, welche Anfragen gelten sollen Authentifizierung anfordern zu. Wir möchten die Autorisierung auf alle Anfragen auf Port 8888 anwenden:
API-Version: security.istio.io/v1beta1
Art: AuthorizationPolicy
Metadaten:
Name: bestes Notebook-TFY-OAUTH2
Namespace: Auth-Test
spezifikation:
Selektor:
Labels abgleichen:
truefoundry.com/application: bestes Notizbuch
Aktion: VERWEIGERN
Regeln:
- von:
- Quelle:
NotRequestPrincipals: ["*"]
zu:
- Bedienung:
Anschlüsse:
- „8888"
TrueFoundry AI Gateway bietet eine Latenz von ~3—4 ms, verarbeitet mehr als 350 RPS auf einer vCPU, skaliert problemlos horizontal und ist produktionsbereit, während LiteLM unter einer hohen Latenz leidet, mit moderaten RPS zu kämpfen hat, keine integrierte Skalierung hat und sich am besten für leichte Workloads oder Prototyp-Workloads eignet.
Der schnellste Weg, deine KI zu entwickeln, zu steuern und zu skalieren















.png)





.png)






.webp)

.webp)



