本文介紹如何使用自建的Keycloak作為IdP來提供身份服務,實現網格內應用的單點登入。網格內應用無需實現認證、鑒權邏輯,通過配置ASM的自訂授權服務,即可通過OIDC協議使用Keycloak完成單點登入。鑒權通過後,請求將攜帶Keycloak中的使用者資訊一同發往應用。
前提條件
已建立ASM執行個體。具體操作,請參見建立ASM執行個體。
已建立Kubernetes託管版叢集。具體操作,請參見建立ACK託管叢集。
已添加叢集到ASM執行個體。具體操作,請參見添加叢集到ASM執行個體。
已為default命名空間啟用Sidecar自動注入。具體操作,請參見啟用自動注入。
相關概念
|
概念 |
說明 |
|
IdP |
Identity Provider的縮寫,身份供應商。例如,您可以通過帳號+密碼的形式來驗證您的身份。當您使用支付寶帳號登入優酷,這個情境中支付寶即為IdP。 |
|
OIDC |
OIDC是OpenID Connect的簡稱,是一個基於OAuth 2.0協議的身份認證標準協議。更多資訊,請參見OpenID Connect。 |
|
Scope |
OIDC中的概念,每一個IdP同時也儲存了使用者的各種資訊,例如Email、設定檔等,這些分類被稱為Scope。在通過IdP進行Authentication(登入操作)時,一些IdP會要求選擇允許訪問使用者的哪些資料,每一個類別都對應一個Scope。 |
操作步驟
步驟一: 部署示範應用和Keycloak
參照下方YAML,使用kubectl apply -n default -f xxx.yaml命令,將Httpbin應用部署至ACK叢集的default命名空間。
參照下方YAML,使用kubectl apply -n default -f xxx.yaml命令,將Keycloak應用部署至ACK叢集的default命名空間。
步驟二:將示範應用和Keycloak通過ASM網關暴露至公網
本文樣本使用HTTPS(連接埠:443)訪問示範應用,使用HTTP(連接埠:80)訪問Keycloak控制台。
為HTTPS服務建立認證,命名為myexample-credential。更多內容,請參見通過ASM網關啟用HTTPS安全服務。
使用如下YAML在ASM叢集建立網關規則和虛擬服務,將Keycloak露出在公網。
使用http://${入口網關地址}在瀏覽器訪問Keycloak應用。
單擊Administration Console,使用部署Keycloak時指定的Admin和PassWord進行登入。
步驟三:配置Keycloak
在Keycloak左側導覽列,在Master下拉式清單中單擊Create Realm。
在建立Realm配置導航頁面建立新的Client。在General Settings頁簽中,Client type選擇OpenID Connect,Client ID設定為oauth2proxy。在Capability config頁簽中,開啟Client authentication,關閉Authorization,Authentication flow僅勾選Standard flow和Direct access grants。
建立完成後,在Realm頁面建立User。單擊Save。其中Username設定為asm-test,並開啟Email verified。
在User details頁面,單擊Credentials。
在彈出的對話方塊,設定登入密碼。單擊Save。其中將Temporary設定為Off。
建立一個Realm Role。單擊Save。其中Role name設定為test-role。
在User details頁面,選擇Role mapping。
在Role mapping頁面,單擊Assign role。將步驟六建立的Role分配給目前使用者。
建立Client Scope。單擊Save。其中Name設定為test_scope,Protocol選擇OpenID Connect,開啟Display on consent screen和Include in token scope。
在Client Scope頁面,單擊mappers添加一個Mapper。單擊Save。其中Mapper type選擇Audience,Name設定為test-mapper,Included Client Audience選擇oauth2proxy,開啟Add to access token。
單擊scope,選中步驟六建立的Role左側的複選框,單擊Assign。
在Client設定介面,單擊client scope,以default方式添加client scope。
添加叢集oauth2-proxy的Valid redirect URls。單擊Save。在Settings頁簽的Access settings地區,在Valid redirect URIs中填入
https://${ASM網關地址}/oauth2/callback。
該操作步驟的樣本裡只有Keycloak服務使用HTTP協議,其餘服務均使用HTTPS。所以redirect URI的格式為:https://${您的ASM網關地址}/oauth2/callback。
至此,Keycloak已經全部設定好。您需要記錄以下資訊:
建立Realm的ID:Test-oidc。
Realm中建立的Client ID:oauth2proxy。
Client設定中,Credentials子選項卡中的client secret。
步驟四:啟用ASM自訂授權,配置OIDC單點登入
-
登入ASM控制台,在左側導覽列,選擇。
-
在網格管理頁面,單擊目標執行個體名稱,然後在左側導覽列,選擇。
在自訂授權服務頁面,單擊關聯自訂授權服務,選擇OIDC身份認證授權服務。設定OIDC身份認證授權服務參數,單擊建立。
在關聯自訂授權服務面板中,選擇OIDC身份認證授權配置類型,配置相關參數。
請您根據之前建立的OIDC應用的相關資訊,填寫以下欄位,您可以使用ASM網關作為登入重新導向地址。更多關於Cookie Secret,請參見Cookie Secret的產生。
IdP OIDC Issuer URL:http://${ASM網關地址}/realms/${keycloak中建立的realm}。
ClientID、Client Secret:使用上一步驟中記錄的參數。
Scopes:該參數中的OpenID為必填項,請您根據實際情況進行填寫。
參照如下樣本,建立VirtualService。
apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: oauth2-vs namespace: istio-system spec: gateways: - ingressgateway hosts: - '*' http: - match: - uri: prefix: /oauth2 name: oauth2 route: - destination: host: asm-oauth2proxy-httpextauth-oidc.istio-system.svc.cluster.local port: number: 4180說明route欄位的host請您替換為您的ACK叢集中istio-system namespace下對應的Oauth2Proxy的Service名稱。
為防止VirtualService衝突,請避免其他VirtualService匹配首碼為《/oauth2》的路徑。
步驟五:建立授權策略
-
在網格管理頁面,單擊目標執行個體名稱,然後在左側導覽列,選擇。
在授權策略詳情頁面,單擊使用YAML建立。
在建立頁面,選擇命名空間和情境模板,配置如下YAML檔案,然後單擊建立。
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: oidc namespace: istio-system spec: action: CUSTOM provider: name: httpextauth-oidc rules: - to: - operation: notPorts: - '80' selector: matchLabels: istio: ingressgateway說明AuthorizationPolicy指定了訪問除了80以外的其它連接埠,均需要進行授權。
provider name填寫您關聯的自訂授權服務的名稱,您可以在自訂授權服務的列表中進行尋找。
步驟六:驗證
在瀏覽器中訪問${ASM網關外部IP:80}。
預期結果:頁面顯示OAuth2 Proxy登入頁面,包含Sign in with OpenID Connect按鈕,則證明單點登入已經生效。
單擊Sign in with OpenID Connect,在Keycloak的登入頁面,請輸入您在步驟一中建立的測試帳號以及密碼,單擊登入。
預期結果:成功登入後,顯示httpbin.org頁面,包含HTTP Methods、Auth、Status codes、Request Inspection等介面分類。
單擊Request inspection,選擇。
預期結果:執行後,在Server response的響應體中可以看到要求標頭資訊,其中包含Authorization: Bearer {JWT}欄位,表明請求已攜帶Keycloak頒發的JWT令牌。
請將上一步驟中Bearer之後請求攜帶的JWT在JWT Debugger中進行解析。更多關於JWT Debugger的內容,請參見JWT debugger。
預期結果:解析成功後,可以看到JWT的HEADER中演算法為RS256,PAYLOAD中包含realm_access(角色資訊)、preferred_username(使用者名稱)、client_id(oauth2proxy)等Claims,表明JWT已通過ASM校正且附帶了Keycloak中儲存的使用者資訊。