本頁面說明如何設定 Google Kubernetes Engine (GKE) 叢集的驗證機制,以便透過外部識別資訊提供者 (IdP) 進行驗證。
本頁面適用於平台管理員和操作員,以及使用支援 OpenID Connect (OIDC) 或安全宣告標記語言 (SAML) 2.0 的外部 IdP 的身分和帳戶管理員。
閱讀本頁面前,請確認您已熟悉下列驗證和 OpenID 概念:
GKE 中的外部 IdP 驗證方式
建議:員工身分聯盟
員工身分聯盟是一項 IAM 功能,可讓您從任何支援 OIDC 或 SAML 2.0 的外部 IdP 驗證 Google Cloud 。員工身分聯盟不需要在叢集內安裝任何項目,可與 Autopilot 叢集和 Standard 叢集搭配使用,並內建於 Google Cloud。詳情請參閱 IAM 說明文件中的「員工身分聯盟」一節。
不建議:Identity Service for GKE (已淘汰)
GKE 也支援 GKE 的身分識別服務,但僅限 GKE Standard 叢集。GKE 的身分識別服務僅限用於 OIDC IdP,且會在叢集中安裝其他元件。GKE 強烈建議使用員工身分聯盟,而非 GKE 適用的 Identity Service。另請注意,Identity Service for GKE 有一項已知限制,會導致無法自動調度資源。
事前準備
開始之前,請確認您已執行下列工作:
- 啟用 Google Kubernetes Engine API。 啟用 Google Kubernetes Engine API
- 如要使用 Google Cloud CLI 執行這項工作,請安裝並初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行
gcloud components update指令,取得最新版本。較舊的 gcloud CLI 版本可能不支援執行本文件中的指令。
注意事項
Workforce Identity Federation 和 Identity Service for GKE 都不支援無頭系統。瀏覽器驗證流程會提示您同意並授權使用者帳戶。
在 GKE 中使用員工身分聯盟
如要在 GKE 叢集中使用員工身分聯盟,請按照下列步驟操作:
- 為貴組織和外部 IdP 設定員工身分聯盟。如需操作說明,請參閱「設定員工身分聯盟」。
- 設定從外部 IdP 存取 Google Cloud 員工身分聯盟控制台。詳情請參閱「設定使用者對控制台的存取權 (聯合)」。
使用下列其中一種授權機制設定使用者存取權:
請使用者按照下列步驟存取叢集:
- 使用聯合身分登入 gcloud CLI。
- 執行
gcloud container clusters get-credentials,設定 kubectl 向特定叢集進行驗證。
使用 RBAC 設定叢集的使用者存取權
Google Cloud 會使用主體 ID 識別員工身分集區中的使用者。您可以在 Kubernetes RBAC 政策或 IAM 政策中參照這些主體 ID,將權限授予個人或使用者群組。使用 RBAC 時,您無法參照 IdP 權杖包含的其他自訂斷言。RBAC 僅支援使用者和群組的主體 ID。
下表列出單一使用者和群組的主體 ID 範例:
| 身分 | 主體 ID |
|---|---|
| 單一使用者 | principal://iam.googleapis.com/locations/global/workforcePools/WORKFORCE_IDENTITY_POOL/subject/SUBJECT_ATTRIBUTE_VALUE 更改下列內容:
例如: principal://iam.googleapis.com/locations/global/workforcePools/full-time-employees/subject/amal@example.com |
| 群組中的所有使用者 | principalSet://iam.googleapis.com/locations/global/workforcePools/WORKFORCE_IDENTITY_POOL/group/GROUP_NAME 更改下列內容:
例如: principalSet://iam.googleapis.com/locations/global/workforcePools/full-time-employees/group/sre |
如要瞭解員工身分聯盟支援的所有主體 ID,請參閱「在 IAM 政策中代表員工集區使用者」。
以下範例說明如何將 Secret 的叢集層級唯讀存取權,授予 full-time-employees 工作團隊集區中,IdP 權杖屬於 sre 群組的任何實體。
將下列 ClusterRole 資訊清單儲存為
secret-viewer-cluster-role.yaml:apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: secret-viewer rules: - apiGroups: [""] resources: ["secrets"] verbs: ["get", "watch", "list"]繫結這個 ClusterRole 的任何主體都能查看 Secret。
將下列 ClusterRoleBinding 資訊清單儲存為
secret-viewer-cluster-role-binding.yaml:apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: users-view-secrets subjects: - kind: Group name: principalSet://iam.googleapis.com/locations/global/workforcePools/full-time-employees/group/sre apiGroup: rbac.authorization.k8s.io roleRef: kind: ClusterRole name: secret-viewer apiGroup: rbac.authorization.k8s.io這個 ClusterRoleBinding 會將
secret-viewerClusterRole 授予sre群組中的任何使用者。部署 ClusterRole 和 ClusterRoleBinding:
kubectl apply -f secret-viewer-cluster-role.yaml kubectl apply -f secret-viewer-cluster-role-binding.yaml
登入並驗證叢集
- 請使用者透過 Google Cloud CLI 登入。
使用者可以透過下列方式,設定 kubectl 向叢集進行驗證:
gcloud container clusters get-credentials
使用 Identity Service for GKE
如要在 GKE Standard 模式叢集上設定及使用 Identity Service for GKE,叢集管理員必須執行下列操作:
叢集管理員設定 GKE 專用身分識別服務後,開發人員即可登入叢集並進行驗證。
由 GKE 的身分識別服務建立的 Kubernetes 物件
下表說明在叢集上啟用 GKE 的身分識別服務時,系統建立的 Kubernetes 物件:
| Kubernetes 物件 | |
|---|---|
anthos-identity-service |
Namespace用於 GKE 部署作業的 Identity Service。 |
kube-public |
Namespace用於 default 用戶端設定檔。 |
gke-oidc-envoy |
LoadBalancerOIDC 要求的端點。預設為外部。如果是在沒有外部 IP 端點的叢集中建立,端點會位於叢集虛擬私有雲內部。 在 anthos-identity-service 命名空間中建立。 |
gke-oidc-service |
ClusterIP促進 gke-oidc-envoy 部署作業和 gke-oidc-service 部署作業之間的通訊。在 anthos-identity-service 命名空間中建立。 |
gke-oidc-envoy |
Deployment執行向 gke-oidc-envoy LoadBalancer 公開的 Proxy。與 gke-oidc-service 通訊,驗證身分權杖。做為 Kubernetes API 伺服器的 Proxy,並在將要求傳遞至 API 伺服器時模擬使用者。在 anthos-identity-service 命名空間中建立。 |
gke-oidc-service |
Deployment驗證身分權杖,並提供 ClientConfig 資源的驗證許可 Webhook。在 anthos-identity-service 命名空間中建立。 |
gke-oidc-operator |
Deployment協調用戶端設定和 gke-oidc-envoy LoadBalancer。在 anthos-identity-service 命名空間中建立。 |
gke-oidc-certs |
Secret包含 LoadBalancer 的叢集憑證授權單位 (CA) 和 TLS 憑證。 在 anthos-identity-service 命名空間中建立 |
default |
ClientConfig CRD包含 OIDC 參數,例如偏好的驗證方式、識別資訊提供者設定,以及使用者和群組宣告對應。用於驗證身分權杖。叢集管理員會使用這個指令設定 OIDC 設定,然後再發布給開發人員。 在 kube-public 命名空間中建立 |
為叢集啟用 Identity Service for GKE
根據預設,Identity and Access Management (IAM) 會設為叢集驗證的身分識別提供者。如要透過第三方識別資訊提供者使用 OIDC,您可以使用 Google Cloud CLI,在新叢集或現有叢集上啟用 Identity Service for GKE。
在新叢集上啟用 Identity Service for GKE
如要建立已啟用 GKE 身分識別服務的叢集,請執行下列指令:
gcloud container clusters create CLUSTER_NAME \
--enable-identity-service
將 CLUSTER_NAME 替換為新叢集的名稱。
在現有叢集上啟用 Identity Service for GKE
如要在現有叢集上啟用 Identity Service for GKE,請執行下列指令
gcloud container clusters update CLUSTER_NAME \
--enable-identity-service
將 CLUSTER_NAME 替換為叢集名稱。
設定 GKE 的身分識別服務
您可以下載並修改 default ClientConfig,設定 GKE 適用的 Identity Service 參數。
下載
defaultClientConfig:kubectl get clientconfig default -n kube-public -o yaml > client-config.yaml使用偏好的設定更新
spec.authentication區段:apiVersion: authentication.gke.io/v2alpha1 kind: ClientConfig metadata: name: default namespace: kube-public spec: name: cluster-name server: https://192.168.0.1:6443 authentication: - name: oidc oidc: clientID: CLIENT_ID certificateAuthorityData: OIDC_PROVIDER_CERTIFICATE extraParams: EXTRA_PARAMS issuerURI: ISSUER_URI cloudConsoleRedirectURI: https://console.cloud.google.com/kubernetes/oidc kubectlRedirectURI: KUBECTL_REDIRECT_URL scopes: SCOPES userClaim: USER groupsClaim: GROUPS userPrefix: USER_PREFIX groupPrefix: GROUP_PREFIX更改下列內容:
CLIENT_ID:向 OIDC 供應商提出驗證要求的用戶端應用程式 ID。OIDC_PROVIDER_CERTIFICATE:(選用) OIDC 供應商的 PEM 憑證。如果 OIDC 供應商使用自行簽署的憑證,這個欄位可能會有幫助。GKE 的身分識別服務預設包含一組公開根憑證。EXTRA_PARAMS:要傳送至 OIDC 供應商的其他鍵/值參數。- 如要授權群組,請使用
resource=token-groups-claim。 - 如要驗證 Microsoft Azure 和 Okta,請使用
prompt=consent。 - 如果是 Cloud Identity,請使用
prompt=consent,access_type=offline。
- 如要授權群組,請使用
ISSUER_URI:傳送 OIDC 授權要求的網址,例如https://example.com/adfs。Kubernetes API 伺服器會使用這個網址,探索用於驗證權杖的公開金鑰。URI 必須使用 HTTPS。如果是 Cloud Identity,請使用https://accounts.google.com。KUBECTL_REDIRECT_URL:kubectl oidc login用於授權的重新導向網址。這通常採用http://localhost:PORT/callback格式,其中PORT是開發人員工作站上大於1024的任何可用通訊埠,例如http://localhost:10000/callback。您必須向 OIDC 供應商註冊網址,做為用戶端應用程式的授權重新導向網址。如果您使用 Google Identity 做為 OIDC 供應商,請參閱「設定重新導向 URI」一文的操作說明。SCOPES:要傳送至 OIDC 提供者的其他範圍。- Microsoft Azure 和 Okta 需要
offline_access範圍。 - 如果是 Cloud Identity,請使用
openid, email取得在email宣告中包含電子郵件地址的 ID 權杖。
- Microsoft Azure 和 Okta 需要
USER:身分權杖中的使用者聲明。GROUPS:身分權杖中的群組要求。USER_PREFIX:在使用者憑證附加資訊的前方加上此字串,即可避免與現有名稱衝突。根據預設,系統會將核發者前置字元附加至提供給 Kubernetes API 伺服器的userID(除非使用者憑證為email)。產生的使用者 ID 為ISSUER_URI#USER。建議您使用前置字串,但可以將USER_PREFIX設為-,停用前置字串。GROUP_PREFIX:在群組憑證附加資訊的前方加上此字串,即可避免與現有的名稱衝突。舉例來說,若您有兩個名為「foobar」的群組,加上前置字串「gid-」後,產生的群組為gid-foobar。
套用更新後的設定:
kubectl apply -f client-config.yaml套用這項設定後,Identity Service for GKE 會在叢集內執行,並在
gke-oidc-envoy負載平衡器後方提供要求。spec.server欄位中的 IP 位址必須是負載平衡器的 IP 位址。如果變更spec.server欄位,kubectl指令可能會失敗。複製
client-config.yaml設定檔:cp client-config.yaml login-config.yaml使用
spec.authentication.oidc區段中的clientSecret設定更新login-config.yaml設定檔。clientSecret: CLIENT_SECRET將
CLIENT_SECRET替換為 OIDC 用戶端應用程式與 OIDC 供應商之間共用的密鑰。將更新後的
login-config.yaml檔案提供給開發人員。
在具有嚴格政策的叢集上設定 Identity Service for GKE
如要設定 GKE 適用的身分識別服務,讓其在具有嚴格網路政策的叢集上正常運作,請按照下列步驟操作:
- 新增
TCP 通訊埠
15000的防火牆規則,允許控制層 與ClientConfig驗證用 Webhook 通訊。 - 如果
gke-oidc-envoy是以內部負載平衡器的形式建立,請在虛擬私有雲中公開。 - 如果您的政策會拒絕叢集內的流量,請為 TCP 通訊埠
8443新增防火牆規則,允許gke-oidc-envoy部署作業與gke-oidc-service部署作業通訊。
GKE 元件 0.2.20 以上版本的身分識別服務不會使用 TCP 通訊埠 15000。如果元件版本為 0.2.20 以上,則不需為通訊埠 15000 新增防火牆規則。如要檢查元件版本,請執行下列指令:
kubectl describe deployment gke-oidc-envoy -n anthos-identity-service \
| grep "components.gke.io/component-name: gke-oidc" -A1
在負載平衡器中新增自訂屬性
設定 GKE 專用身分識別服務後,您可以將自訂註解和屬性 (例如靜態 IP 位址) 新增至 gke-oidc-envoy 負載平衡器。如要編輯 gke-oidc-envoy 服務,請執行下列指令:
kubectl edit service gke-oidc-envoy -n anthos-identity-service
如要進一步瞭解如何為 GKE 設定 TCP/UDP 負載平衡,請參閱「LoadBalancer 服務參數」。
為叢集建立 RBAC 政策
管理員可以使用 Kubernetes 角色式存取控管 (RBAC),將存取權授予已驗證的叢集使用者。如要為叢集設定 RBAC,您必須為每位開發人員授予 RBAC 角色。如要授予特定命名空間中資源的存取權,請建立角色和 RoleBinding。如要授予整個叢集的資源存取權,請建立 ClusterRole 和 ClusterRoleBinding。
舉例來說,假設使用者需要查看整個叢集中的所有 Secret 物件。請按照下列步驟,將必要的 RBAC 角色授予這位使用者。
將下列 ClusterRole 資訊清單儲存為
secret-viewer-cluster-role.yaml。獲派這個角色的使用者可以取得、監控及列出叢集中的任何 Secret。apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: secret-viewer rules: - apiGroups: [""] # The resource type for which access is granted resources: ["secrets"] # The permissions granted by the ClusterRole verbs: ["get", "watch", "list"]套用 ClusterRole 資訊清單:
kubectl apply -f secret-viewer-cluster-role.yaml將下列 ClusterRoleBinding 資訊清單儲存為
secret-viewer-cluster-role-binding.yaml。繫結會將secret-viewer角色授予用戶端設定檔中定義的使用者名稱。apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: people-who-view-secrets subjects: - kind: User name: ISSUER_URI#USER apiGroup: rbac.authorization.k8s.io roleRef: kind: ClusterRole name: secret-viewer apiGroup: rbac.authorization.k8s.io更改下列內容:
ISSUER_URI:用戶端設定檔中spec.authentication.oidc.issuerURI的核發者 URI。USER:權杖中的使用者 ID,位於用戶端設定檔中spec.authentication.oidc.userClaim設定的宣告名稱下方。
套用 ClusterRoleBinding 資訊清單:
kubectl apply -f secret-viewer-cluster-role-binding.yaml
登入並驗證叢集
開發人員從管理員收到 OIDC 設定檔後,即可向叢集進行驗證。
下載管理員提供的
login-config.yaml檔案。安裝 Google Cloud CLI SDK,其中提供獨立的 OIDC 元件。執行下列指令即可安裝:
gcloud components install kubectl-oidc驗證叢集:
kubectl oidc login --cluster=CLUSTER_NAME --login-config=login-config.yaml網路瀏覽器會開啟,以便完成驗證程序。
通過驗證後,即可執行
kubectl指令,例如:kubectl get pods
停用 GKE 的身分識別服務
您可以使用 gcloud CLI 停用 Identity Service for GKE。如要停用 Identity Service for GKE,請執行下列指令:
gcloud container clusters update CLUSTER_NAME \
--no-enable-identity-service
已知限制
gke-oidc-envoy 元件負責使用 Identity Service for GKE 向叢集進行驗證,其副本數量固定。也就是說,系統不會自動調度資源來處理增加的流量。在區域叢集中,這個元件會部署三個副本。
您無法直接調度 gke-oidc-envoy 部署作業資源。強烈建議您改用員工身分聯盟,享有更穩固、可擴充的解決方案。