本文介紹如何在ASM中實現網格內應用的單點登入。
前提條件
建立ASM企業版執行個體。具體操作,請參見建立ASM執行個體。
已建立Kubernetes託管版叢集。具體操作,請參見建立ACK託管叢集。
已添加叢集到ASM執行個體。具體操作,請參見添加叢集到ASM執行個體。
已為default命名空間啟用Sidecar自動注入。具體操作,請參見啟用自動注入。
背景資訊
當前很多應用都需要進行存取控制,登入成功的使用者才有許可權訪問。隨著系統複雜度的提升,“單點登入”成為了一個很好的解決方案,您可以使用一個帳號登入多個系統。ASM提供的自訂授權服務,可以無侵入地實現網格內應用的單點登入。
使用ASM實現單點登入,可以降低應用的改造、營運等成本。本文使用阿里雲IDaaS執行個體作為身份提供方,實現單點登入到網格內應用服務。網格內應用無需實現認證、鑒權邏輯,通過配置ASM自訂鑒權接入到阿里雲IDaaS或任意支援OIDC協議的IdP進行鑒權和登入流程,鑒權通過後,將應用的請求以及認證資訊一同發往應用,應用可基於身份資訊進行相應業務處理。
相關概念
概念 | 說明 |
IdP | Identity Provider的縮寫,身份供應商。例如,您可以通過帳號+密碼的形式來驗證您的身份。當您使用支付寶帳號登入優酷,這個情境中支付寶即為IdP。 |
OIDC | OIDC是OpenID Connect的簡稱,是一個基於OAuth 2.0協議的身份認證標準協議。更多資訊,請參見OpenID Connect。 |
Scope | OIDC中的概念,每一個IdP同時也儲存了使用者的各種資訊,例如Email、設定檔等,這些分類被稱為Scope。在通過IdP進行Authentication(登入操作)時,一些IdP會要求選擇允許訪問使用者的哪些資料,每一個類別都對應一個Scope。 |
步驟一:建立EIAM雲身份服務執行個體及測試帳號
登入EIAM雲身份服務控制台,建立IDaaS執行個體。
說明一個IDaaS執行個體可以被視為一個帳號系統。建立一個IDaaS執行個體,相當於建立了一個獨立的帳號系統。
在EIAM 雲身份服務頁面,單擊目標IDaaS執行個體名稱。
在左側導覽列,選擇 。
在賬戶頁面的賬戶頁簽,單擊建立賬戶。
在建立賬戶面板,設定賬戶資訊,然後單擊確定。
步驟二:添加和配置OIDC應用
您可以將IDaaS執行個體中的應用理解為介面。IDaaS執行個體可以用不同的應用暴露介面,以各種方式進行單點登入。本文使用OIDC應用進行示範。
在雲身份服務控制台左側導覽列,單擊應用。
在應用頁面,單擊添加應用。
在添加應用頁面,單擊標準協議頁簽,在OIDC卡片中單擊添加應用。
在添加應用 - OIDC 協議對話方塊,配置應用程式名稱,然後單擊立即添加。
在OIDC應用詳情頁面,選擇 。
在單點登入配置頁面,設定登入Redirect URI。單擊顯示進階配置,在使用者資訊範圍,選擇您需要擷取的資訊,然後單擊儲存。
說明本例中的Redirect URI設定為
http://${ASM網關的CLB地址}/oauth2/callback
。請將${}
替換為您實際的地址。在OIDC應用詳情頁面,選擇 ,然後單擊添加授權。
在添加應用授權對話方塊,為步驟一建立的使用者授權,然後單擊儲存授權。
完成OIDC應用的配置後,您需要記錄當前應用的Issuer、client_id、client_secret等配置資訊,以便在ASM中配置單點登入使用。
Issuer:在OIDC應用的 地區擷取。
client_id、client_secret:在OIDC應用的通用配置地區擷取。
步驟三:部署測試應用並將其暴露於網關
本文使用httpbin應用作為測試,該應用可以輔助查看請求內容,便於驗證登入後從IdP處擷取的資訊。
使用以下內容,在ACK叢集的default命名空間下部署httpbin應用。
使用以下內容,在ASM控制台配置網關規則至對應的ASM執行個體。具體操作,請參見管理網關規則。
apiVersion: networking.istio.io/v1beta1 kind: Gateway metadata: name: ingressgateway namespace: istio-system spec: selector: app: istio-ingressgateway servers: - hosts: - '*' port: name: http number: 80 protocol: HTTP
使用以下內容,將虛擬服務應用到ASM執行個體。具體操作,請參見管理虛擬服務。
該虛擬服務指定了一條指向httpbin應用的預設路由規則。
apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: ingressgateway-vs namespace: istio-system spec: gateways: - ingressgateway hosts: - '*' http: - name: default route: - destination: host: httpbin.default.svc.cluster.local port: number: 8000
配置完網關規則和虛擬服務後,您可以直接通過
curl -I http://${ASM網關外部IP:80}
命令,訪問httpbin服務。樣本輸出:
步驟四:啟用ASM自訂授權服務,配置OIDC單點登入
登入ASM控制台,在左側導覽列,選擇 。
在網格管理頁面,單擊目標執行個體名稱,然後在左側導覽列,選擇 ,然後單擊關聯自訂授權服務。
在關聯自訂授權服務頁面,單擊OIDC身份認證授權服務頁簽,進行相關配置,然後單擊建立。
說明OIDC應用的相關資訊由步驟二擷取。您可以使用ASM網關作為登入重新導向地址。關於Cookie Secret的更多資訊,請參見Cookie Secret的產生。
使用資料平面叢集KubeConfig,執行以下命令,擷取OIDC外部授權服務網域名稱。
kubectl get svc -n istio-system|grep oauth2proxy|awk -F' ' '{print $1}'
使用以下內容,建立VirtualService,接收ASM網關的認證請求。
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: # 上一步擷取的外部授權服務網域名稱。 port: number: 4180
重要為防止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: - {} selector: matchLabels: istio: ingressgateway
說明該權限原則會對所有進入ASM網關的請求進行授權。
步驟六:結果驗證
在瀏覽器中訪問http://${ASM網關外部IP:80}。
顯示如下頁面,說明單點登入生效。
單擊Sign in with OpenID Connect。
預期結果:
在阿里雲IDaaS的登入頁面,輸入步驟一建立的測試帳號以及密碼,然後單擊登入。
預期結果:
單擊Request inspection,選擇 。
預期結果:
將上一步驟中Bearer之後請求攜帶的JWT在JWT Debugger中進行解析。
關於JWT Debugger的更多資訊,請參見JWT debugger。
預期結果:解析成功後,您可以看到如上資訊。其中附帶IDaaS中儲存的使用者資訊,並且當前的JWT已經經過了ASM的校正。