使用 OIDC 設定 GKE Identity Service 的叢集
本文適用於叢集管理員或應用程式運算子,他們想在個別叢集上設定 GKE Identity Service,讓開發人員和其他使用者透過OpenID Connect (OIDC) 供應商的現有身分詳細資料登入叢集。
必要條件
- 叢集必須是內部部署 (VMware 或裸機)、AWS 或 Azure 上的 GKE 叢集。連結的叢集或 GKE 叢集不支援叢集專屬的 OIDC 設定。
- 如要透過 Google Cloud 控制台進行驗證,您必須將要設定 OIDC 驗證的每個叢集註冊至專案機群。
事前準備
- 開始設定前,請確認平台管理員已提供「向供應商註冊 GKE Identity Service」中的所有必要資訊,包括 GKE Identity Service 的用戶端 ID 和密碼。
確認您已安裝下列指令列工具:
- 最新版 Google Cloud CLI,其中包含
gcloud
,這是與 Google Cloud互動的指令列工具。如需安裝 Google Cloud CLI,請參閱安裝指南。 kubectl
,可對 Kubernetes 叢集執行指令。如需安裝kubectl
,請按照這些操作說明操作。
如果您使用 Cloud Shell 做為與 Google Cloud互動的 Shell 環境,系統會為您安裝這些工具。
- 最新版 Google Cloud CLI,其中包含
請確認您已初始化 gcloud CLI,以便搭配註冊叢集的專案使用。
如要透過堡壘主機連線至目前虛擬私有雲外部的 AWS 或 Azure GKE 叢集控制平面,請務必先建立堡壘主機,並在設定前啟動 8118 連接埠的 SSH 通道。然後在按照本指南操作時,在
kubectl
指令前加上HTTPS_PROXY=http://localhost:8118
。如果您啟動 SSH 通道時使用其他通訊埠,請將8118
替換為您選取的通訊埠。
設定叢集
如要將叢集設為使用所選供應商,GKE Identity Service 需要您指定身分識別提供者詳細資料、JWT 權杖中的資訊 (用於識別使用者),以及註冊 GKE Identity Service 做為用戶端應用程式時提供的其他資訊。
舉例來說,假設您的供應商建立的身分權杖包含下列欄位 (和其他欄位),其中 iss
是身分識別提供者 URI,sub
用於識別使用者,而 groupList
則列出使用者所屬的安全群組:
{ 'iss': 'https://server.example.com' 'sub': 'u98523-4509823' 'groupList': ['developers@example.corp', 'us-east1-cluster-admins@example.corp'] ... }
...您的設定會包含下列對應欄位:
issuerURI: 'https://server.example.com' userClaim: 'sub' groupsClaim: 'groupList' ...
平台管理員或貴機構的身分管理員,應會提供您建立設定所需的大部分資訊。
GKE Identity Service 會使用名為 ClientConfig 的 Kubernetes 自訂資源類型 (CRD) 進行叢集設定,並提供欄位,讓 GKE Identity Service 與身分識別提供者互動時可使用所有資訊。每個 GKE 叢集在 kube-public
命名空間中都有名為 default
的 ClientConfig 資源,您將按照下列操作說明,使用設定詳細資料更新該資源。
如要查看熱門供應商的特定設定範例,請參閱「供應商專屬設定」。
kubectl
如要編輯預設 ClientConfig,請確認您能透過 kubectl
連線至叢集,然後執行下列指令:
kubectl --kubeconfig=KUBECONFIG_PATH edit ClientConfigs default -n kube-public
將 KUBECONFIG_PATH
替換為叢集 kubeconfig 檔案的路徑,例如 $HOME/.kube/config
。
文字編輯器會載入叢集的 ClientConfig 資源。新增 spec.authentication.oidc
物件,如下所示。請勿修改任何已寫入的預設資料。
apiVersion: authentication.gke.io/v2alpha1
kind: ClientConfig
metadata:
name: default
namespace: kube-public
spec:
authentication:
- name: NAME
oidc:
certificateAuthorityData: CERTIFICATE_STRING
clientID: CLIENT_ID
clientSecret: CLIENT_SECRET
deployCloudConsoleProxy: PROXY_BOOLEAN
extraParams: EXTRA_PARAMS
groupsClaim: GROUPS_CLAIM
groupPrefix: GROUP_PREFIX
issuerURI: ISSUER_URI
kubectlRedirectURI: KUBECTL_REDIRECT_URI
scopes: SCOPES
userClaim: USER_CLAIM
userPrefix: USER_PREFIX
enableAccessToken: ENABLE_ACCESS_TOKEN
proxy: PROXY_URL
# Rest of the resource is managed by Google. DO NOT MODIFY.
...
您可以根據需求,在 ClientConfig
中設定多個身分識別提供者。這項功能可簡化管理作業並提供彈性,讓您在統一的設定資源中設定各種驗證方法。下列範例 ClientConfig
會以驗證優先順序的必要順序,定義多個身分識別提供者。
apiVersion: v1
items:
- apiVersion: authentication.gke.io/v2alpha1
kind: ClientConfig
...
spec:
authentication:
- aws:
region: us-west-2
name: AWS Login
- ldap:
...
- saml:
...
- azureAD:
...
- oidc:
name: Okta OIDC
...
-oidc:
name: Google OIDC
...
下表說明 ClientConfig oidc
物件的欄位。大部分欄位都是選填欄位。您需要新增的欄位取決於身分識別提供者,以及平台管理員為 GKE Identity Service 設定提供者時選擇的設定選項。
欄位 | 必填 | 說明 | 格式 |
---|---|---|---|
名稱 | 是 | 您要用來識別這項設定的名稱,通常是身分識別提供者名稱。設定名稱開頭須為英文字母,其後最多可接 39 個小寫英文字母、數字或連字號,但結尾不得為連字號。 | 字串 |
certificateAuthorityData | 否 | 身分識別提供者的 PEM 編碼憑證字串 (由平台管理員提供)。並把產生的字串另列一行加入 certificateAuthorityData 。 |
字串 |
clientID | 是 | 向 OIDC 提供者註冊 GKE Identity 服務時傳回的用戶端 ID。 | 字串 |
clientSecret | 否 | OIDC 用戶端應用程式與 OIDC 供應商之間共用的密鑰。 | 字串 |
deployCloudConsoleProxy | 否 | 指定是否部署 Proxy,讓 Google Cloud 控制台連線至無法透過網際網路公開存取的內部部署身分識別提供者。預設值為 false 。 |
布林值 |
extraParams | 否 | 要傳送至身分識別提供者的其他 key=value 參數,以逗號分隔的清單形式指定,例如 `prompt=consent,access_type=offline`。 | 以半形逗號分隔的清單 |
groupsClaim | 否 | 供應商用來傳回帳戶安全性群組的 JWT 憑證附加資訊 (欄位名稱)。 | 字串 |
groupPrefix | 否 | 如有多個身分識別提供者 (通常是提供者名稱) 的設定,請在安全群組名稱前方加上前置字串,以免與存取控制規則中的現有名稱衝突。 | 字串 |
issuerURI | 是 | 向識別資訊提供者提出授權要求的 URI。URI 必須使用 HTTPS,且結尾不得為正斜線。 | 網址字串 |
kubectlRedirectURI | 是 | gcloud CLI 使用的重新導向網址和通訊埠,通常由平台管理員在註冊時指定,格式通常為 http://localhost:PORT/callback 。 |
網址字串 |
範圍 | 是 | 要傳送給 OpenID 供應商的其他範圍。舉例來說,Microsoft Azure 和 Okta 需要 offline_access 範圍。 |
以半形逗號分隔的清單 |
userClaim | 否 | 供應商用來識別使用者帳戶的 JWT 憑證附加資訊 (欄位名稱)。如果您未在此指定值,GKE Identity Service 會使用「sub」,這是許多供應商使用的使用者 ID 聲明。視 OpenID 供應商而定,您可以選擇其他憑證附加資訊,例如「電子郵件地址」或「姓名」。「電子郵件地址」以外的憑證附加資訊都必須在前方加上核發者網址,以免發生命名衝突。 | 字串 |
userPrefix | 否 | 如不想使用預設前置字串,請輸入要加在使用者憑證附加資訊前方的字串,避免與現有名稱衝突。 | 字串 |
enableAccessToken | 否 | 啟用之後,當使用者透過指令列登入時,GKE Identity Service 就能使用識別資訊提供者的使用者資訊端點來取得群組資訊。如果您有提供者 (例如 Okta) 會從這個端點提供群組憑證附加資訊,這樣就能使用安全性群組進行授權。如未設定,系統會視為 false 。 |
布林值 |
proxy | 否 | 用於連線至身分識別提供者的 Proxy 伺服器位址 (如適用),舉例來說,如果叢集位於私人網路中,且需要連線至公開身分識別提供者,您可能就需要設定這項功能。例如 http://user:password@10.10.10.10:8888 。 |
字串 |
完成 ClientConfig 後,請儲存檔案,這會更新叢集上的 ClientConfig。如果發生任何語法錯誤,系統會提示您重新編輯設定,以修正錯誤。
供應商專屬設定
本節提供一些常見 OIDC 供應商的設定指引,包括可複製並以您自己的詳細資料編輯的設定範例。
Azure AD
這是使用 Azure AD 設定 GKE Identity Service 的預設設定。透過這項設定,GKE Identity Service 可以從 Azure AD 取得使用者和群組成員資格資訊,並根據群組設定 Kubernetes 角色型存取控制 (RBAC)。不過,使用這項設定時,每位使用者只能擷取約 200 個群組。
如需為每位使用者擷取超過 200 個群組,請參閱 Azure AD (進階) 的操作說明。
...
spec:
authentication:
- name: oidc-azuread
oidc:
clientID: CLIENT_ID
clientSecret: CLIENT_SECRET
cloudConsoleRedirectURI: https://console.cloud.google.com/kubernetes/oidc
extraParams: prompt=consent, access_type=offline
issuerURI: https://login.microsoftonline.com/TENANT_ID/v2.0
kubectlRedirectURI: http://localhost:PORT/callback
scopes: openid,email,offline_access
userClaim: email
# Rest of the resource is managed by Google. DO NOT MODIFY.
...
更改下列內容:
- CLIENT_ID:向供應商註冊 GKE Identity Service 時傳回的用戶端 ID。
- CLIENT_SECRET:OIDC 用戶端應用程式與 OIDC 提供者之間共用的密鑰。
- TENANT:待驗證的 Azure AD 帳戶種類。如果帳戶隸屬於某個用戶群,支援的值則為用戶群 ID 或用戶群名稱。租戶名稱也稱為「主網域」。如要瞭解如何找出這些值,請參閱「找出 Microsoft Azure AD 租戶 ID 和主要網域名稱」。
- PORT:gcloud CLI 所用重新導向網址的通訊埠號碼,由平台管理員在註冊時指定。
Azure AD (進階)
透過 Azure AD 的這項選用設定,GKE Identity Service 就能使用 Microsoft Graph API 擷取使用者和群組資訊,且每位使用者可擁有的群組數量沒有限制。
如要瞭解支援這項設定的平台,請參閱「Azure AD 進階設定」。
如果每位使用者需要擷取的群組少於 200 個,建議您使用 ClientConfig 中的 oidc
錨點,採用預設設定。詳情請參閱 Azure AD 的操作說明。
以下範例設定中的所有欄位皆為必填。
...
spec:
authentication:
- name: NAME
proxy: PROXY_URL
azureAD:
clientID: CLIENT_ID
clientSecret: CLIENT_SECRET
tenant: TENANT_ID
kubectlRedirectURI: http://localhost:PORT/callback
groupFormat: GROUP_FORMAT
userClaim: USER_CLAIM
# Rest of the resource is managed by Google. DO NOT MODIFY.
...
更改下列內容:
- NAME:您要用來識別這項設定的名稱,通常是身分識別提供者名稱。設定名稱開頭須為英文字母,其後最多可接 39 個小寫英文字母、數字或連字號,但結尾不得為連字號。
- PROXY_URL:用來連線至身分識別供應商的 Proxy 伺服器位址 (如適用)。舉例來說,如果叢集位於私人網路中,且需要連線至公開身分識別提供者,您可能就需要設定這項功能。例如:
http://user:password@10.10.10.10:8888
。 - CLIENT_ID:向供應商註冊 GKE Identity Service 時傳回的用戶端 ID。
- CLIENT_SECRET:OIDC 用戶端應用程式與 OIDC 提供者之間共用的密鑰。
- TENANT:待驗證的 Azure AD 帳戶種類。如果帳戶隸屬於某個用戶群,支援的值則為用戶群 ID 或用戶群名稱。租戶名稱也稱為「主網域」。如要瞭解如何找出這些值,請參閱「找出 Microsoft Azure AD 租戶 ID 和主要網域名稱」。
- PORT:gcloud CLI 所用重新導向網址的通訊埠號碼,由平台管理員在註冊時指定。
- GROUP_FORMAT:您要擷取群組資訊的格式。這個欄位可以採用與使用者群組的
ID
或NAME
相對應的值。請注意,這項設定目前僅適用於裸機 Google Distributed Cloud 部署作業中的叢集。 - USER_CLAIM (選用):供應商用來識別帳戶的 JWT 憑證附加資訊 (欄位名稱)。如果您未在此指定值,GKE Identity Service 會依序使用「email」、「preferred_username」或「sub」中的值來擷取使用者詳細資料。這個屬性可從 GKE Enterprise 1.28 版開始使用。
Okta
以下說明如何使用使用者和群組設定驗證,並以 Okta 做為身分識別提供者。Anthos Identity Service 可透過這項設定,使用存取權權杖和 Okta 的使用者資訊端點,擷取使用者和群組憑證附加資訊。
...
spec:
authentication:
- name: okta
oidc:
clientID: CLIENT_ID
clientSecret: CLIENT_SECRET
cloudConsoleRedirectURI: https://console.cloud.google.com/kubernetes/oidc
enableAccessToken: true
extraParams: prompt=consent
groupsClaim: groups
issuerURI: https://OKTA_ISSUER_URI/
kubectlRedirectURI: http://localhost:PORT/callback
scopes: offline_access,email,profile,groups
userClaim: email
# Rest of the resource is managed by Google. DO NOT MODIFY.
...
群組存取限制
對於 Okta 使用者,如果使用者所屬群組名稱的串連長度少於 170000 個字元,Anthos Identity 服務就能擷取這些使用者的群組資訊。根據 Okta 的群組長度上限,這大約對應至 650 個群組的成員資格。如果使用者加入過多群組,驗證呼叫就會失敗。
後續步驟
套用設定後,請繼續設定叢集的使用者存取權。