使用外部識別資訊提供者向 GKE 進行驗證


本頁面說明如何設定驗證,從外部身分識別提供者 (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 叢集中使用員工身分聯盟,請完成下列步驟:

  1. 為貴機構和外部 IdP 設定員工身分聯盟。 如需操作說明,請參閱「設定員工身分聯盟」。
  2. 從外部 IdP 設定存取權,以便存取 Google Cloud 員工身分聯盟控制台。詳情請參閱設定使用者對控制台的存取權 (聯盟)
  3. 使用下列任一授權機制設定使用者存取權:

  4. 請要求使用者完成下列步驟,存取叢集:

    1. 使用聯合身分登入 gcloud CLI
    2. 執行 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

更改下列內容:

  • WORKFORCE_IDENTITY_POOL:工作團隊身分集區的名稱。
  • SUBJECT_ATTRIBUTE_VALUE:身分權杖主體聲明中的屬性值。舉例來說,這可能是 SAML 2.0 聲明中 NameID 欄位的值。

例如:

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

更改下列內容:

  • WORKFORCE_IDENTITY_POOL:工作團隊身分集區的名稱。
  • GROUP_NAME:驗證使用者所屬的群組名稱。IdP 權杖中的聲明必須具有對應至 Google Cloud google.groups 屬性的屬性對應

例如:

principalSet://iam.googleapis.com/locations/global/workforcePools/full-time-employees/group/sre

如要瞭解員工身分聯盟支援的每個主體 ID,請參閱「在 IAM 政策中代表員工集區使用者」。

以下範例說明如何授予工作站叢集範圍的 Secrets 唯讀存取權,給工作團隊集區中 IdP 權杖具有 access_level="sensitive" 屬性的任何實體。full-time-employees

  1. 請將下列 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 繫結至任何主體後,該主體就能查看密鑰。

  2. 將下列 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" 屬性的使用者。

  3. 部署 ClusterRole 和 ClusterRoleBinding:

    kubectl apply -f secret-viewer-cluster-role.yaml
    kubectl apply -f secret-viewer-cluster-role-binding.yaml
    

登入及驗證叢集

  1. 請使用者使用 Google Cloud CLI 登入。 Google Cloud
  2. 使用者可以透過下列方式設定 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

如要將叢集遷移至使用員工身分聯盟,請按照下列步驟操作:

  1. 為貴機構和外部 IdP 設定員工身分聯盟。 如需操作說明,請參閱「設定員工身分聯盟」。

  2. 更新叢集中任何 RoleBinding 和 ClusterRoleBinding 的資訊清單,使用 Workforce Identity Federation 識別碼語法。請使用下列其中一種方式:

    • 程式輔助更新:安裝並執行 gke-identity-service-migrator 公用程式。如需操作說明,請參閱 GoogleCloudPlatform/gke-utilities 存放區 README

      這項公用程式會找出使用 GKE Identity Service 語法的現有 RBAC 繫結,並建立使用對應 Workforce Identity Federation 主體 ID 的新資訊清單。

    • 手動更新:針對參照已驗證使用者或群組的每個繫結,建立物件資訊清單檔案的個別副本,並使用 Workforce Identity Federation 識別碼語法。

  3. 將更新後的 RoleBinding 和 ClusterRoleBinding 資訊清單套用至叢集。

  4. 測試使用者透過員工身分聯盟驗證身分時,是否能存取相同資源。

  5. 從叢集中移除過時的 RBAC 繫結。

  6. 停用 GKE 適用的 Identity Service

使用 GKE 適用的 Identity Service

如要在 GKE Standard 模式叢集上設定及使用 GKE 適用的 Identity Service,叢集管理員請執行下列操作:

  1. 在叢集上啟用 GKE Identity Service
  2. 設定 GKE 適用的 Identity Service
  3. 為叢集建立 RBAC 政策

叢集管理員為 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 服務參數。

  1. 下載 default ClientConfig:

    kubectl get clientconfig default -n kube-public -o yaml > client-config.yaml
    
  2. 使用偏好設定更新 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_URLkubectl 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 聲明中的電子郵件地址。
    • USER:身分識別權杖中的使用者聲明。
    • GROUPS:身分識別權杖中的群組聲明。
    • USER_PREFIX:在使用者憑證附加資訊的前方加上此字串,可避免與現有的名稱衝突。根據預設,系統會將簽發者前置字串附加至提供給 Kubernetes API 伺服器的 userID (除非使用者聲明為 email)。產生的使用者 ID 為 ISSUER_URI#USER。建議使用前置字串,但您可以將 USER_PREFIX 設為 -,停用前置字串。
    • GROUP_PREFIX:在群組憑證附加資訊的前方加上此字串,即可避免與現有的名稱衝突。舉例來說,如果您有兩個名為「foobar」的群組,加上前置字串「gid-」後,群組名稱就會變成「gid-foobar」。foobargid-產生的群組為 gid-foobar
  3. 套用更新後的設定:

    kubectl apply -f client-config.yaml
    

    套用這項設定後,GKE 適用的 Identity Service 會在叢集內執行,並透過 gke-oidc-envoy 負載平衡器處理要求。「spec.server」欄位中的 IP 位址必須是負載平衡器的 IP 位址。如果變更 spec.server 欄位,kubectl 指令可能會失敗。

  4. 複製 client-config.yaml 設定檔:

    cp client-config.yaml login-config.yaml
    
  5. spec.authentication.oidc 區段中,使用 clientSecret 設定更新 login-config.yaml 設定檔。

    clientSecret: CLIENT_SECRET
    

    CLIENT_SECRET 替換為 OIDC 用戶端應用程式與 OIDC 供應商之間共用的密鑰。

  6. 將更新後的 login-config.yaml 檔案發送給開發人員。

在採用嚴格政策的叢集上設定 GKE 適用的 Identity 服務

如要設定 GKE 適用的 Identity Service,讓叢集在嚴格的網路政策下正常運作,請按照下列步驟操作:

  1. 新增 TCP 通訊埠 15000 的防火牆規則,允許控制平面與 ClientConfig 驗證 Webhook 通訊。
  2. 如果 gke-oidc-envoy 是以內部負載平衡器形式建立,請在 VPC 中公開該負載平衡器
  3. 如果您的政策會拒絕叢集內的流量,請新增 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。如要授予整個叢集的資源存取權,請建立 ClusterRoleClusterRoleBinding

舉例來說,假設使用者需要查看叢集中的所有 Secret 物件,下列步驟會將必要的 RBAC 角色授予這位使用者。

  1. 將下列 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"]
    
  2. 套用 ClusterRole 資訊清單:

    kubectl apply -f secret-viewer-cluster-role.yaml
    
  3. 將下列 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 中設定的聲明名稱下方。
  4. 套用 ClusterRoleBinding 資訊清單:

    kubectl apply -f secret-viewer-cluster-role-binding.yaml
    

登入及驗證叢集

開發人員可從管理員取得 OIDC 設定檔,並向叢集進行驗證。

  1. 下載管理員提供的 login-config.yaml 檔案。

  2. 安裝 Google Cloud CLI SDK,其中提供獨立的 OIDC 元件。執行下列指令即可安裝:

    gcloud components install kubectl-oidc
    
  3. 驗證叢集:

    kubectl oidc login --cluster=CLUSTER_NAME --login-config=login-config.yaml
    

    系統會開啟網頁瀏覽器,讓你完成驗證程序。

  4. 完成驗證後,您就可以執行 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

後續步驟