本頁面說明如何設定驗證,從外部身分識別提供者 (IdP) 存取 Google Kubernetes Engine (GKE) 叢集。
本頁內容適用於平台管理員和營運人員,以及使用支援 OpenID Connect (OIDC) 或安全宣告標記語言 (SAML) 2.0 的外部 IdP 的身分和帳戶管理員。
閱讀本頁內容前,請務必熟悉下列驗證和 OpenID 概念:
GKE 中的外部 IdP 驗證方法
建議:員工身分聯盟
員工身分聯盟是 IAM 功能,可讓您從支援 OIDC 或 SAML 2.0 的任何外部 IdP 進行驗證。 Google Cloud 員工身分聯盟不需要在叢集中安裝任何項目,適用於 Autopilot 叢集和標準叢集,且內建於 Google Cloud。詳情請參閱 IAM 說明文件中的員工身分聯盟。
不建議 - GKE 適用的 Identity 服務
只有在 GKE Standard 叢集中,GKE 也支援 GKE 適用的 Identity Service。GKE 適用的 Identity Service 僅限 OIDC IdP,且會在叢集中安裝其他元件。GKE 強烈建議使用員工身分聯盟,而非 GKE 適用的 Identity 服務。
事前準備
開始之前,請確認你已完成下列工作:
- 啟用 Google Kubernetes Engine API。 啟用 Google Kubernetes Engine API
- 如要使用 Google Cloud CLI 執行這項工作,請安裝並初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行
gcloud components update
,取得最新版本。
注意事項
無論是員工身分聯盟或 GKE 適用的 Identity 服務,都不支援無頭系統。瀏覽器式驗證流程會提示您同意並授權使用者帳戶。
在 GKE 中使用員工身分聯盟
如要在 GKE 叢集中使用員工身分聯盟,請完成下列步驟:
- 為貴機構和外部 IdP 設定員工身分聯盟。 如需操作說明,請參閱「設定員工身分聯盟」。
- 從外部 IdP 設定存取權,以便存取 Google Cloud 員工身分聯盟控制台。詳情請參閱設定使用者對控制台的存取權 (聯盟)。
使用下列任一授權機制設定使用者存取權:
請要求使用者完成下列步驟,存取叢集:
- 使用聯合身分登入 gcloud CLI。
- 執行
gcloud container clusters get-credentials
,設定 kubectl 對特定叢集進行驗證。
使用 RBAC 設定叢集的使用者存取權
Google Cloud 會使用主體 ID 識別工作團隊身分集區中的使用者。您可以在 Kubernetes RBAC 政策或 IAM 政策中參照這些主體 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 政策中代表員工集區使用者」。
以下範例說明如何授予工作站叢集範圍的 Secrets 唯讀存取權,給工作團隊集區中 IdP 權杖具有 access_level="sensitive"
屬性的任何實體。full-time-employees
請將下列 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 繫結至任何主體後,該主體就能查看密鑰。
將下列 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/attribute.access_level/sensitive apiGroup: rbac.authorization.k8s.io roleRef: kind: ClusterRole name: secret-viewer apiGroup: rbac.authorization.k8s.io
這個 ClusterRoleBinding 會將
secret-viewer
ClusterRole 授予任何具有access_level="sensitive"
屬性的使用者。部署 ClusterRole 和 ClusterRoleBinding:
kubectl apply -f secret-viewer-cluster-role.yaml kubectl apply -f secret-viewer-cluster-role-binding.yaml
登入及驗證叢集
- 請使用者使用 Google Cloud CLI 登入。 Google Cloud
使用者可以透過下列方式設定 kubectl,向叢集進行驗證:
gcloud container clusters get-credentials
將 GKE 適用的 Identity Service 叢集遷移至員工身分聯盟
如果您在現有 GKE 叢集中使用 GKE 適用的 Identity 服務,請遷移至員工身分聯盟。這些方法會使用不同的語法參照相同主體,如下表所示:
GKE 適用的 Identity Service 語法 | 員工身分聯盟語法 |
---|---|
amal@example.com |
principal://iam.googleapis.com/locations/global/workforcePools/full-time-employees/subject/amal@example.com
|
sre-group |
principalSet://iam.googleapis.com/locations/global/workforcePools/full-time-employees/group/sre-group
|
如要將叢集遷移至使用員工身分聯盟,請按照下列步驟操作:
為貴機構和外部 IdP 設定員工身分聯盟。 如需操作說明,請參閱「設定員工身分聯盟」。
更新叢集中任何 RoleBinding 和 ClusterRoleBinding 的資訊清單,使用 Workforce Identity Federation 識別碼語法。請使用下列其中一種方式:
程式輔助更新:安裝並執行
gke-identity-service-migrator
公用程式。如需操作說明,請參閱GoogleCloudPlatform/gke-utilities
存放區 README。這項公用程式會找出使用 GKE Identity Service 語法的現有 RBAC 繫結,並建立使用對應 Workforce Identity Federation 主體 ID 的新資訊清單。
手動更新:針對參照已驗證使用者或群組的每個繫結,建立物件資訊清單檔案的個別副本,並使用 Workforce Identity Federation 識別碼語法。
將更新後的 RoleBinding 和 ClusterRoleBinding 資訊清單套用至叢集。
測試使用者透過員工身分聯盟驗證身分時,是否能存取相同資源。
從叢集中移除過時的 RBAC 繫結。
使用 GKE 適用的 Identity Service
如要在 GKE Standard 模式叢集上設定及使用 GKE 適用的 Identity Service,叢集管理員請執行下列操作:
叢集管理員為 GKE 設定 Identity Service 後,開發人員即可登入叢集並通過驗證。
Identity Service for GKE 建立的 Kubernetes 物件
下表說明在叢集上啟用 GKE 適用的 Identity Service 時建立的 Kubernetes 物件:
Kubernetes 物件 | |
---|---|
anthos-identity-service |
Namespace 用於 GKE 適用的 Identity Service 部署作業。 |
kube-public |
Namespace 用於 default 用戶端設定檔。 |
gke-oidc-envoy |
LoadBalancer OIDC 要求的端點。預設為外部。如果是在沒有外部 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 驗證 ID 權杖,並為 ClientConfig 資源提供驗證許可控制器 Webhook。在 anthos-identity-service 命名空間中建立。 |
gke-oidc-operator |
Deployment 協調用戶端設定和 gke-oidc-envoy
LoadBalancer。在 anthos-identity-service 命名空間中建立。 |
gke-oidc-certs |
Secret 包含叢集憑證授權單位 (CA) 和 LoadBalancer 的 TLS 憑證。 在 anthos-identity-service 命名空間中建立 |
default |
ClientConfig CRD 包含 OIDC 參數,例如偏好的驗證方法、身分識別提供者設定,以及使用者和群組聲明對應。用於驗證 ID 權杖。叢集管理員會使用這項設定,在發布給開發人員前設定 OIDC 設定。 在 kube-public 命名空間中建立 |
在叢集上啟用 GKE Identity Service
根據預設,Identity and Access Management (IAM) 是叢集驗證程序中的識別資訊提供者。如要透過第三方身分識別提供者使用 OIDC,您可以使用 Google Cloud CLI,在新或現有叢集上啟用 GKE 適用的 Identity Service。
在新叢集上啟用 GKE Identity Service
如要建立啟用 GKE 適用的 Identity 服務的叢集,請執行下列指令:
gcloud container clusters create CLUSTER_NAME \
--enable-identity-service
將 CLUSTER_NAME
替換為新叢集的名稱。
在現有叢集上啟用 GKE 專用的 Identity Service
如要在現有叢集上啟用 GKE 適用的 Identity Service,請執行下列指令
gcloud container clusters update CLUSTER_NAME \
--enable-identity-service
將 CLUSTER_NAME
替換為叢集名稱。
設定 GKE 適用的 Identity Service
您可以下載並修改 default
ClientConfig,設定 GKE 適用的 Identity 服務參數。
下載
default
ClientConfig: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 適用的 Identity Service 預設包含一組公開根憑證。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
取得 ID 權杖,其中包含email
聲明中的電子郵件地址。
- Microsoft Azure 和 Okta 需要
USER
:身分識別權杖中的使用者聲明。GROUPS
:身分識別權杖中的群組聲明。USER_PREFIX
:在使用者憑證附加資訊的前方加上此字串,可避免與現有的名稱衝突。根據預設,系統會將簽發者前置字串附加至提供給 Kubernetes API 伺服器的userID
(除非使用者聲明為email
)。產生的使用者 ID 為ISSUER_URI#USER
。建議使用前置字串,但您可以將USER_PREFIX
設為-
,停用前置字串。GROUP_PREFIX
:在群組憑證附加資訊的前方加上此字串,即可避免與現有的名稱衝突。舉例來說,如果您有兩個名為「foobar」的群組,加上前置字串「gid-」後,群組名稱就會變成「gid-foobar」。foobar
gid-
產生的群組為gid-foobar
。
套用更新後的設定:
kubectl apply -f client-config.yaml
套用這項設定後,GKE 適用的 Identity Service 會在叢集內執行,並透過
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
檔案發送給開發人員。
在採用嚴格政策的叢集上設定 GKE 適用的 Identity 服務
如要設定 GKE 適用的 Identity Service,讓叢集在嚴格的網路政策下正常運作,請按照下列步驟操作:
- 新增 TCP 通訊埠
15000
的防火牆規則,允許控制平面與ClientConfig
驗證 Webhook 通訊。 - 如果
gke-oidc-envoy
是以內部負載平衡器形式建立,請在 VPC 中公開該負載平衡器。 - 如果您的政策會拒絕叢集內的流量,請新增 TCP 通訊埠
8443
的防火牆規則,允許gke-oidc-envoy
部署作業與gke-oidc-service
部署作業通訊。
GKE 專用 Identity Service 元件 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 適用的 Identity 服務後,您可以將靜態 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
。獲派這個角色的人員可以取得、監控及列出叢集中的任何密鑰。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 適用的 Identity Service
您可以使用 gcloud CLI 停用 GKE 適用的 Identity Service。如要停用 GKE Identity Service,請執行下列指令:
gcloud container clusters update CLUSTER_NAME \
--no-enable-identity-service