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

本頁面說明如何設定 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 叢集中使用員工身分聯盟,請按照下列步驟操作:

  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,將權限授予個人或使用者群組。使用 RBAC 時,您無法參照 IdP 權杖包含的其他自訂斷言。RBAC 僅支援使用者和群組的主體 ID。

下表列出單一使用者和群組的主體 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 政策中代表員工集區使用者」。

以下範例說明如何將 Secret 的叢集層級唯讀存取權,授予 full-time-employees 工作團隊集區中,IdP 權杖屬於 sre 群組的任何實體。

  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 的任何主體都能查看 Secret。

  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/group/sre
      apiGroup: rbac.authorization.k8s.io
    roleRef:
      kind: ClusterRole
      name: secret-viewer
      apiGroup: rbac.authorization.k8s.io
    

    這個 ClusterRoleBinding 會將 secret-viewer ClusterRole 授予 sre 群組中的任何使用者。

  3. 部署 ClusterRole 和 ClusterRoleBinding:

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

登入並驗證叢集

  1. 請使用者透過 Google Cloud CLI 登入。
  2. 使用者可以透過下列方式,設定 kubectl 向叢集進行驗證:

    gcloud container clusters get-credentials
    

使用 Identity Service for GKE

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

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

叢集管理員設定 GKE 專用身分識別服務後,開發人員即可登入叢集並進行驗證。

由 GKE 的身分識別服務建立的 Kubernetes 物件

下表說明在叢集上啟用 GKE 的身分識別服務時,系統建立的 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
驗證身分權杖,並提供 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 參數。

  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 的身分識別服務預設包含一組公開根憑證。
    • 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 權杖。
    • USER:身分權杖中的使用者聲明。
    • GROUPS:身分權杖中的群組要求。
    • USER_PREFIX:在使用者憑證附加資訊的前方加上此字串,即可避免與現有名稱衝突。根據預設,系統會將核發者前置字元附加至提供給 Kubernetes API 伺服器的 userID (除非使用者憑證為 email)。產生的使用者 ID 為 ISSUER_URI#USER。建議您使用前置字串,但可以將 USER_PREFIX 設為 -,停用前置字串。
    • GROUP_PREFIX:在群組憑證附加資訊的前方加上此字串,即可避免與現有的名稱衝突。舉例來說,若您有兩個名為「foobar」的群組,加上前置字串「gid-」後,產生的群組為 gid-foobar。
  3. 套用更新後的設定:

    kubectl apply -f client-config.yaml
    

    套用這項設定後,Identity Service for GKE 會在叢集內執行,並在 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 檔案提供給開發人員。

在具有嚴格政策的叢集上設定 Identity Service for GKE

如要設定 GKE 適用的身分識別服務,讓其在具有嚴格網路政策的叢集上正常運作,請按照下列步驟操作:

  1. 新增 TCP 通訊埠 15000 的防火牆規則,允許控制層 與 ClientConfig 驗證用 Webhook 通訊。
  2. 如果 gke-oidc-envoy 是以內部負載平衡器的形式建立,請在虛擬私有雲中公開。
  3. 如果您的政策會拒絕叢集內的流量,請為 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 角色授予這位使用者。

  1. 將下列 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"]
    
  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 的身分識別服務

您可以使用 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 部署作業資源。強烈建議您改用員工身分聯盟,享有更穩固、可擴充的解決方案。

後續步驟