使用 Istio + Dex 進行身份驗證¶
原文: Kubeflow: Authentication with Istio + Dex
多租戶是 Kubeflow 0.6 的核心功能,提供靈活的身份驗證方案對於企業用例非常重要。
在本文中,我們將探討如何利用 Istio 和開源組件的強大功能來創建靈活、健壯和乾淨的身份驗證解決方案。
該解決方案特別強大,因為:
- 它利用了 Istio 的特性並且不添加額外的組件。
- 它可以在任何 Kubernetes 集群上工作,並且不依賴於訪問 API-Server。
- 它是一個通用的解決方案,可以應用於 Kubeflow 以外的其他項目。
讓我們深入研究解決方案。
最終目標¶
我們將專注於使用 Istio 執行最終用戶身份驗證,這意味著我們的應用程序將不包含任何身份驗證邏輯!
用戶訪問應用程序的身份驗證將在 Istio 網關完成:所有流量進入集群的一個點。
身份驗證是開發人員可能選擇留給 Istio 的一個主要領域。這個想法很簡單:
- 傳入流量包括用於身份驗證的 JSON Web 令牌 (JWT)。
- JWT 由 Istio 網關驗證。
- 集群內的應用程序信任 JWT,因為它已通過網關驗證。
這樣,我們的應用程序根本不需要包含身份驗證邏輯!不幸的是,事情並沒有那麼簡單。
Istio 中的身份驗證¶
乍一看,Istio 似乎支持最終用戶身份驗證。
但是,請注意 Istio 如何只能執行最後一部分,令牌驗證(即驗證 JWT 並允許請求)。
問題是:我們首先要如何獲得該令牌?
讓我們先進入到 OpenID Connect (OIDC):一種使用標準化 OAuth2 流程對用戶進行身份驗證的方法。
OIDC 流程¶
一圖勝千言,我們來看看OIDC的流程是長什麼樣子的。
請注意 Istio 如何只能執行最後一部分,令牌驗證。因此,我們需要一個新實體來充當 OIDC 客戶端並執行流程。
Envoy - Istio 背後的力量¶
正如你們中的許多人已經知道的那樣,Istio 主要位於控制路徑中。在背後,數據由 Envoy 處理,這是一個非常高效和多功能的代理。
為什麼這是相關的?
Istio 允許您使用 EnvoyFilter 對象配置其底層 Envoy 代理。EnvoyFilter 對象使我們能夠在某些代理的數據路徑中插入 Envoy 過濾器。
在我們的例子中,我們想要配置 Istio 網關的 Envoy 代理。但是我們應該使用什麼過濾器呢?
ext_authz HTTP 過濾器¶
ext_authz
HTTP 過濾器是 Envoy 極其強大和通用的功能。
apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
name: authn-filter
spec:
workloadLabels:
istio: ingressgateway
filters:
- filterConfig:
httpService:
serverUri:
uri: http://authservice.istio-system.svc.cluster.local
cluster: outbound|8080||authservice.istio-system.svc.cluster.local
authorizationRequest:
allowedHeaders:
patterns:
- exact: "cookie"
filterName: envoy.ext_authz
filterType: HTTP
listenerMatch:
portNumber: 443
listenerType: GATEWAY
它的功能很簡單:
-
每個請求都被轉發到授權服務 (AuthService)。根據答案,該響應可以是:
- Accepted
- Rejected
- Redirected
OIDC AuthService¶
我們需要實現處理上列操作的組件。幸運的是,有一個開源工具我們可以重用它來達到這個目的,即 arrikto/oidc-authservice 項目。
整合¶
我們的 Istio 網關現在可以充當 OIDC 客戶端並執行整個流程以對用戶進行身份驗證。
讓我們使用流行的 OIDC 提供商 Dex 對其進行測試。
Dex 支持多種身份驗證後端,包括靜態用戶、LDAP 和外部身份提供程序,因此您可以擁有選擇的權力。
最終架構如下:
展示 Demo¶
所有上述功能都適用於 Kubeflow v1.7。
要安裝這個參考架構的方式, 請參考:手動安裝 Kubeflow。
只需按照上述文檔中的說明進行操作,您就應該擁有一個帶有 Kubeflow、Istio 和用於身份驗證的 Dex 的 Kubernetes 集群。
最後的想法¶
在本文中,我們解鎖了 Envoy Proxy 的強大功能,並使用 Istio 與 Dex 和 OIDC AuthService 一起構成了一個完整的 Authentication 架構。這使應用程序能夠將所有身份驗證邏輯卸載到 Istio 並專注於業務邏輯,這非常適合 Kubeflow 的面向微服務的架構。
Envoy 的 ext_authz
功能在 Istio 用戶群中並不是很出名,但它是一個非常強大的功能,使我們能夠與幾乎任何身份驗證方案集成。