OAuth2 toevoegen aan Jupyter Notebooks op Kubernetes

Gebouwd voor snelheid: ~10ms latentie, zelfs onder belasting
De razendsnelle manier om je modellen te bouwen, volgen en implementeren!
- Verwerkt 350+ RPS op slechts 1 vCPU — geen tuning nodig
- Productieklaar met volledige enterprise-ondersteuning
TrueFoundry-gebruikers kunnen Jupyter Notebooks implementeren op hun eigen cloudaccounts, zoals AWS, Azure of GCP. Deze functie stelt hen in staat om eenvoudig machine learning-experimenten en training jobs uit te voeren op hun eigen machines. In eerste instantie werden notebooks die via TrueFoundry werden geïmplementeerd beveiligd met een gebruikersnaam-wachtwoordcombinatie. Als antwoord op veelvuldige verzoeken van klanten hebben we echter Single Sign-On geïntegreerd. Dit betekent dat gebruikers nu eenvoudig toegang hebben tot hun notebooks met dezelfde inloggegevens die ze voor TrueFoundry gebruiken. In deze blogpost gaan we dieper in op de details van hoe we deze functie hebben geïmplementeerd.

Notebooks op TrueFoundry
TrueFoundry gebruikt intern een fork van de Kubeflow Notebook Controller om de implementatie van notebooks te orchestreren. De controller biedt verschillende functies waar wij gebruik van maken, zoals:
- Vereenvoudigde notebook spec: De Kubeflow Notebook API's zijn eenvoudig en de controller orchestreert de aanmaak van de Jupyter Notebook-deployments.
- Automatische culling: De controller sluit het notebook automatisch af na een bepaalde periode van inactiviteit. Dit is ontzettend nuttig voor onze klanten die experimenten uitvoeren op notebooks die worden aangedreven door GPU-machines.
- Permanente home directory: De controller zorgt voor het aanmaken van een persistent volume dat de voortgang van de gebruiker op het notebook over sessies heen opslaat.
- Uitbreidbare base images: De controller ondersteunt een reeks base notebook images van Jupyter Notebook en VS Code die worden onderhouden door TrueFoundry. De gebruiker kan de functionaliteit van deze Docker-images uitbreiden door een opstartscript toe te voegen of specifieke bibliotheken te installeren.
Ter illustratie ziet een eenvoudig Kubeflow Notebook-object er als volgt uit:
apiVersion: kubeflow.org/v1
kind: Notebook
metadata:
name: my-notebook
spec:
template:
spec:
containers:
- name: my-notebook
image: kubeflownotebookswg/jupyter:master
args:
[
"start.sh",
"lab",
"--LabApp.token=''",
"--LabApp.allow_remote_access='True'",
"--LabApp.allow_root='True'",
"--LabApp.ip='*'",
"--LabApp.base_url=/test/my-notebook/",
"--port=8888",
"--no-browser",
]
Basic Auth voor Notebooks
Voordat OAuth2 werd geïmplementeerd, bood TrueFoundry gebruikers de optie om de beveiliging van hun openbare notebooks te verhogen door basic authentication te integreren. Deze extra beveiligingslaag was essentieel om ervoor te zorgen dat alleen geautoriseerde personen toegang hadden tot de gevoelige inhoud van deze notebooks. Om deze functie te implementeren, maakte TrueFoundry gebruik van de mogelijkheden van WebAssembly (Wasm) plugins binnen de Istio proxy, specifiek de Envoy proxy.
Istio, een open-source service mesh, biedt een framework voor het beheren van netwerkcommunicatie tussen verschillende service-workloads. Met Istio was TrueFoundry in staat om aangepaste logica direct in te voegen in de netwerklaag, die wordt beheerd door de Envoy proxy. Deze aanpak maakte een effectieve controle en beveiliging mogelijk van het netwerkverkeer van en naar hun Jupyter Notebooks. De sleutel tot de implementatie van basic auth was de WasmPlugin, een functie van Istio die de implementatie van WebAssembly-modules binnen de Envoy proxy vergemakkelijkt.
Deze basic authentication WasmPlugin is geïntegreerd in een reeks netwerkfilters binnen de Envoy proxy. Deze filters maken de uitvoering mogelijk van functies op hoger niveau met betrekking tot toegangscontrole, transformatie, data-verrijking, auditing en meer, waardoor de algehele beveiliging en functionaliteit van de service mesh worden verbeterd. Hier is een vereenvoudigde versie van de spec voor het toevoegen van een basic auth filter aan de Envoy filter chain:
apiVersion: extensions.istio.io/v1alpha1
kind: WasmPlugin
metadata:
name: basic-auth
namespace: istio-ingress
spec:
phase: AUTHN
pluginConfig:
basic_auth_rules:
- credentials:
- user:pass
hosts: www.example.com
prefix: /secret/
selector:
matchLabels:
istio: ingressgateway
url: oci://ghcr.io/istio-ecosystem/wasm-extensions/basic_auth:1.12.0
OAuth2 voor Notebook
Voor het implementeren van OAuth2 in onze notebooks hebben we een Envoy filter gebruikt, maar de aanpak verschilde van die van basic authentication. In tegenstelling tot basic auth, waarbij we eenvoudig een vooraf gebouwde WasmPlugin in de filter chain konden invoegen, vereiste OAuth2 een meer op maat gemaakte oplossing. Om dit te bereiken, hebben we een HTTP filter gebruikt dat specifiek is ontworpen voor OAuth. Bij TrueFoundry integreert ons Single Sign-On systeem met FusionAuth, dat dient als onze OAuth provider.
Zo ziet de spec van het Envoy Filter eruit – raadpleeg de opmerkingen in het bestand voor meer details:
apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
name: truefoundry-notebook-tfy-oauth2 # Name of the EnvoyFilter
namespace: auth-test # Namespace where the EnvoyFilter is deployed
spec:
workloadSelector:
labels:
truefoundry.com/application: truefoundry-notebook # Selector targeting workloads with specific labels
configPatches:
- applyTo: CLUSTER
match:
context: SIDECAR_OUTBOUND
patch:
operation: ADD
value:
name: tfy-oauth2 # Name of the cluster for OAuth2 authentication service
type: LOGICAL_DNS # Type of service discovery (DNS)
connect_timeout: 5s # Timeout for establishing a connection
lb_policy: ROUND_ROBIN # Load balancing policy
# other load balancing config
- applyTo: HTTP_FILTER
match:
context: SIDECAR_INBOUND
listener:
filterChain:
filter:
name: "envoy.filters.network.http_connection_manager"
subFilter:
name: envoy.filters.http.jwt_authn
patch:
operation: INSERT_BEFORE # Inserting this filter before the JWT auth filter
value:
name: envoy.filters.http.tfy-oauth # Name of the OAuth filter
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.http.oauth2.v3.OAuth2
config:
use_refresh_token: false # Whether to use a refresh token
pass_through_matcher:
- name: Authorization
present_match: true # Pass through if Authorization header is present
forward_bearer_token: true # Forward bearer token to upstream
auth_type: BASIC_AUTH # Type of authentication used
token_endpoint:
cluster: tfy-oauth2 # Cluster for token endpoint
uri: <token-endpoint-uri-of-oauth-provider>
timeout: 5s # Timeout for token endpoint
authorization_endpoint: <authorization-endpoint-uri-of-oauth-provider>
redirect_uri: https://%REQ(:authority)%/truefoundry-notebook/_auth/callback # Redirect URI for callback
redirect_path_matcher:
path:
exact: /truefoundry-notebook/_auth/callback # Path for redirect URI
signout_path:
path:
exact: /truefoundry-notebook/_auth/signout # Path for signout
credentials:
client_id: <client-id-for-oauth>
token_secret:
# configuration to fetch token secret
# read more about how we fetch secrets here:
# https://www.envoyproxy.io/docs/envoy/latest/configuration/security/secret
hmac_secret:
# configuration to fetch hmac
Wanneer een gebruiker voor het eerst probeert toegang te krijgen tot een service die wordt beschermd door het OAuth2-filter, wordt deze omgeleid naar de authorization_endpoint. Dit eindpunt is de URL van onze externe OAuth Provider, wat in onze implementatie de op FusionAuth gebaseerde TrueFoundry-inlogmodal is. Deze omleiding is een cruciale stap in het OAuth-proces, waarbij gebruikers naar een veilige locatie worden geleid waar ze zich kunnen authenticeren en vervolgens de benodigde machtigingen voor toegang tot de service kunnen verlenen.
Zodra de inlog is voltooid, leidt FusionAuth u om naar de redirect_uri (geconfigureerd in de filter-specificatie), waarbij een geheime, tijdelijke autorisatiecode wordt toegevoegd. Dit verzoek wordt onderschept door het filter en er wordt een verzoek gedaan naar token_endpoint, waarbij de code wordt ingewisseld voor een JWT-token. Ten slotte stelt het filter cookies in met het JWT-token.
Vervolgtoegang tot de service wordt doorgestuurd via het HTTP Filter omdat de cookie de Authorization header instelt met het JWT als waarde. Het filter is geconfigureerd om dergelijke verzoeken door te laten (zie pass_through_matcher in de spec). Om te valideren dat het JWT een geldig token is, maken we een RequestAuthentication-policy aan die controleert bij de OAuth provider:
apiVersion: security.istio.io/v1beta1
kind: RequestAuthentication
metadata:
# ...
spec:
selector:
# ...
jwtRules:
- issuer: "truefoundry.com"
fromHeaders:
- name: Authorization
prefix: "Bearer "
audiences:
- <client-id>
jwksUri: <oauth-provider-jwks-uri>
forwardOriginalToken: true
Ten slotte voegen we de Authorization Policy toe die specificeert op welke verzoeken RequestAuthentication moet worden toegepast. We willen autorisatie toepassen op alle verzoeken op poort 8888:
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: best-notebook-tfy-oauth2
namespace: auth-test
spec:
selector:
matchLabels:
truefoundry.com/application: best-notebook
action: DENY
rules:
- from:
- source:
notRequestPrincipals: ["*"]
to:
- operation:
ports:
- "8888"
TrueFoundry AI Gateway levert een latentie van ~3–4 ms, verwerkt 350+ RPS op 1 vCPU, schaalt moeiteloos horizontaal en is klaar voor productie, terwijl LiteLLM last heeft van hoge latentie, moeite heeft boven een gemiddeld aantal RPS, geen ingebouwde schaling heeft en het meest geschikt is voor lichte workloads of prototypes.



















.png)


.webp)



.webp)








.webp)





