使用 OpenID Connect (OIDC) 進行驗證

瞭解如何設定 AWS 上的 GKE,使用 OpenID Connect (OIDC) 驗證使用者叢集。本主題說明如何使用任何 OpenID 提供者設定 GKE on AWS。

如要將使用 OIDC 驗證的叢集升級至 Kubernetes 1.21,請參閱「升級至 1.21」。

如要瞭解 GKE on AWS 驗證流程,請參閱「驗證」。

總覽

GKE on AWS 支援 OIDC,可做為與使用者叢集 Kubernetes API 伺服器互動的驗證機制。透過 OIDC,您可以使用貴機構建立、啟用及停用使用者帳戶的標準程序,管理 Kubernetes 叢集的存取權。

事前準備

  • 本主題假設您熟悉下列驗證和 OpenID 概念:

  • 每位開發人員的本機都必須安裝 Google Cloud CLI。

  • 不支援無螢幕系統。如要進行驗證,您必須在本機開啟瀏覽器,並執行 gcloud CLI。瀏覽器隨即會提示您授權使用者帳戶。

  • 如要透過 Google Cloud 控制台進行驗證,您必須向 Google Cloud註冊要設定 OIDC 驗證的每個叢集。

職位

本主題將介紹三種角色:

  • 機構管理員:選擇 OpenID 提供者,並向該提供者註冊用戶端應用程式。

  • 叢集管理員:建立一或多個使用者叢集,並為使用叢集的開發人員建立驗證設定檔。

  • 開發人員:在一個或多個叢集上執行工作負載,並使用 OIDC 進行驗證。

選擇 OpenID 提供者

本節內容適用於機構管理員

您可以選擇使用任何 OpenID 供應商。如需通過認證的供應商清單,請參閱「OpenID 認證」。

建立重新導向網址

本節內容適用於機構管理員

OpenID 提供者會使用重新導向網址傳回 ID 權杖。您必須為 gcloud CLI 和Google Cloud 控制台建立重新導向網址。

設定 gcloud CLI 重新導向網址

設定 OpenID 提供者時,請將 CLI 重新導向網址指定為 http://localhost:PORT/callback

PORT 替換為大於 1024 的通訊埠號碼。

設定 Google Cloud 主控台重新導向網址

Google Cloud 控制台的重新導向網址為:

https://console.cloud.google.com/kubernetes/oidc

設定 OIDC 供應商時,請將 https://console.cloud.google.com/kubernetes/oidc 指定為其中一個重新導向網址。

向 OpenID 提供者註冊用戶端應用程式

本節內容適用於機構管理員

開發人員必須先向 OpenID 提供者註冊這兩個用戶端,才能透過 Google Cloud CLI 或 Google Cloud 控制台 使用 OpenID 提供者。註冊步驟如下:

  • 瞭解供應商的核發者 URI。gcloud CLI 或Google Cloud 控制台會將驗證要求傳送至這個 URI。

  • 使用重新導向網址 (包括通訊埠號碼) 設定供應商,以供 gcloud CLI 使用。

  • 使用 Google Cloud 控制台的重新導向網址設定供應商, https://console.cloud.google.com/kubernetes/oidc

  • 建立單一用戶端 ID,供供應商用來識別 Google Cloud CLI 和Google Cloud 控制台。

  • 建立單一用戶端密鑰,供 gcloud CLI 和 Google Cloud 控制台用來向 OpenID 提供者進行驗證。

  • 建立自訂範圍,供 gcloud CLI 或 Google Cloud 控制台 用來要求使用者的安全性群組。

  • 建立自訂憑證附加資訊名稱,供應商會使用這個名稱傳回使用者的安全性群組。

設定叢集

本節適用於叢集管理員

如要設定 OIDC 驗證,您需要使用叢集的驗證詳細資料,設定使用者叢集的 AWSCluster 資源。AWSCluster 的詳細資料會用於設定 Google Cloud 控制台和 GKE Enterprise 的 Authentication Plugin 的 OIDC。設定包含下列 OIDC 資訊:

authentication:
  awsIAM:
    adminIdentityARNs:
      - AWS_IAM_ARN
  oidc:
  -   certificateAuthorityData: CERTIFICATE_STRING
      clientID: CLIENT_ID
      clientSecret: CLIENT_SECRET 
      extraParams:  EXTRA_PARAMS
      groupsClaim:  GROUPS_CLAIM
      groupPrefix:  GROUP_PREFIX
      issuerURI:  ISSUER_URI
      kubectlRedirectURI:  KUBECTL_REDIRECT_URI
      scopes:  SCOPES
      userClaim:  USER_CLAIM
      userPrefix:  USER_PREFIX

驗證欄位

下表說明 authentication.awsIAM.adminIdentityARNs 物件的欄位。

下表說明 `oidc` 物件的欄位。
欄位 必填 說明 格式
adminIdentityARNs 是,如果設定 OIDC。 AWS IAM 身分 (使用者或角色) 的 Amazon Resource Name (ARN),由 GKE on AWS 授予叢集管理員存取權。範例:arn:aws:iam::123456789012:group/Developers 字串
欄位 必填 說明 格式
certificateAuthorityData OIDC 供應商的 PEM 編碼憑證 (採用 Base64 編碼)。如要建立字串,請將憑證 (包含標頭) 的編碼方式改為 Base64 格式,並把產生的字串另列一行加入 certificateAuthorityData。示例: certificateAuthorityData: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tC...k1JSUN2RENDQWFT== 字串
clientID 向 OpenID 供應商提出驗證要求時使用的用戶端應用程式 ID。 字串
clientSecret OIDC 用戶端應用程式與 OIDC 供應商之間共用的密鑰。 字串
extraParams 要傳送給 OpenID 供應商的其他鍵/值參數。如要授權群組,請傳遞 resource=token-groups-claim

如果授權伺服器提示您同意,請將 extraParams 設為 prompt=consent,以便透過 Microsoft Azure 和 Okta 進行驗證。如果是 Cloud Identity,請將 extraParams 設為 prompt=consent,access_type=offline

以半形逗號分隔的清單
groupsClaim 供應商用來傳回安全性群組的 JWT 憑證附加資訊。 字串
groupPrefix 在群組憑證附加資訊的前方加上此字串,即可避免與現有的名稱衝突。 舉例來說,假設您有兩個名為「foobar」的群組,加上前置字串「gid-」後,群組名稱就會變成「gid-foobar」。foobargid-gid-foobar 字串
issuerURI 會將授權要求傳送給 OpenID 的網址,例如 https://example.com/adfs。Kubernetes API 伺服器會使用這個網址,探索用於驗證權杖的公開金鑰。URI 必須使用 HTTPS。 網址字串
kubectlRedirectURI 用於授權的重新導向網址「kubectl」。 網址字串
範圍 要傳送給 OpenID 供應商的其他範圍。Microsoft Azure 和 Okta 需要 offline_access 範圍。 以半形逗號分隔的清單
userClaim 用來當做使用者名稱的 JWT 憑證附加資訊。視 OpenID 供應商而定,您可以選擇其他憑證附加資訊,例如電子郵件地址或姓名。不過,電子郵件地址以外的憑證附加資訊都必須在前方加上核發者網址,以免發生命名衝突。 字串
userPrefix 在使用者名稱憑證附加資訊的前方加上此字串,可避免與現有的名稱衝突。字串

範例:授權使用者和群組

許多供應商會在權杖中編碼使用者識別屬性,例如電子郵件和使用者 ID。不過,這些屬性會對驗證政策造成隱含風險:

  • 使用者 ID 會讓政策難以閱讀和稽核。
  • 使用電子郵件地址可能會造成可用性風險 (如果使用者變更主要電子郵件地址),以及安全性風險 (如果電子郵件地址可以重新指派)。

建議您使用群組政策,而非指派使用者 ID,因為群組政策不僅可持續存在,也更容易稽核。

假設供應商建立的 ID 權杖包含下列欄位:

{
  'iss': 'https://server.example.com'
  'sub': 'u98523-4509823'
  'groupList': ['developers@example.corp', 'us-east1-cluster-admins@example.corp']
  ...
}

根據這個權杖格式,您會填入設定檔的 oidc 規格,如下所示:

issuerURL: 'https://server.example.com'
username: 'sub'
usernamePrefix: 'uid-'
group: 'groupList'
groupPrefix: 'gid-'
extraParams: 'resource=token-groups-claim'
...

建立使用者叢集後,您可以使用 Kubernetes 角色型存取權控管 (RBAC) 機制,將特殊存取權授予已通過驗證的使用者。

在下列範例中,您會建立 ClusterRole,授予使用者叢集密鑰的唯讀存取權,並建立 ClusterRoleBinding 資源,將角色繫結至已驗證的群組。

  1. 定義 ClusterRole。將下列 YAML 複製到名為 secret-reader-role.yaml 的檔案。

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: secret-reader
    rules:
    - apiGroups: [""]
      # The resource type for which access is granted
      resources: ["secrets"]
      # The permissions granted by the ClusterRole
      verbs: ["get", "watch", "list"]
    
  2. 定義 ClusterRoleBinding。將下列 YAML 複製到名為 secret-reader-admins.yaml 的檔案。

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: read-secrets-admins
    subjects:
      # Allows anyone in the "us-east1-cluster-admins" group to
      # read Secrets in any namespace within this cluster.
    - kind: Group
      name: gid-us-east1-cluster-admins # Name is case sensitive
      apiGroup: rbac.authorization.k8s.io
      # Allows this specific user to read Secrets in any
      # namespace within this cluster
    - kind: User
      name: uid-u98523-4509823
      apiGroup: rbac.authorization.k8s.io
    roleRef:
      kind: ClusterRole
      name: secret-reader
      apiGroup: rbac.authorization.k8s.io
    
  3. 使用 kubectlsecret-reader-role.yamlsecret-reader-admins.yaml 套用至叢集。

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl apply -f secret-reader-role.yaml && \
      kubectl apply -f secret-reader-admins.yaml
    

    read-secrets-admins 中獲得存取權的使用者,現在可以讀取叢集中的密鑰。

建立登入設定

本節適用於叢集管理員

建立使用者叢集後,您需要使用 gcloud anthos create-login-config 為叢集產生設定檔。

  1. anthos-aws 目錄中,使用 anthos-gke 將環境切換至使用者叢集。

    cd anthos-aws
    env HTTPS_PROXY=http://localhost:8118 \
      anthos-gke aws clusters get-credentials CLUSTER_NAME
    CLUSTER_NAME 替換為使用者叢集名稱。

  2. 使用 gcloud anthos 建立設定。

    gcloud anthos create-login-config --kubeconfig usercluster-kubeconfig
    

    usercluster-kubeconfig 替換為使用者叢集的 kubeconfig 檔案路徑。在 Linux 和 macOS 上,這個檔案預設位於 ~/.kube/config

這個指令會產生檔案 (kubectl-anthos-config.yaml),其中包含開發人員用來透過 gcloud CLI 向叢集驗證身分的設定資訊。請勿修改這個檔案。

如要進一步瞭解 kubectl-anthos-config.yaml 的內容,請參閱附錄

發布登入設定

將設定檔發送給需要向使用者叢集驗證身分的使用者。您可以透過下列方式發布設定:

  • 將檔案放在預設目錄中。
  • 安全地發布檔案。
  • 將檔案託管在 HTTPS 伺服器上。

登入設定預設目錄

各作業系統的設定檔預設儲存位置如下:

Linux
$HOME/.config/google/anthos/kubectl-anthos-config.yaml,其中 $HOME 是使用者的主目錄。
macOS
$HOME/Library/Preferences/google/anthos/kubectl-anthos-config.yaml,其中 $HOME 是使用者的主目錄。
Windows
%APPDATA%/google/anthos/kubectl-anthos-config.yaml,其中 %APPDATA% 是使用者的應用程式資料目錄。

登入設定發布後,開發人員即可設定 gcloud CLI 來存取叢集。

升級至 Kubernetes 1.21 後修改叢集

將叢集升級至 Kubernetes 1.21 後,您必須設定 GKE Identity Service,並從叢集的設定中移除 OIDC 資訊。如要更新設定,請按照下列步驟操作:

  1. 按照「升級叢集」中的步驟操作。

  2. anthos-aws 目錄中,使用 anthos-gke 將環境切換至使用者叢集。

    cd anthos-aws
    env HTTPS_PROXY=http://localhost:8118 \
      anthos-gke aws clusters get-credentials CLUSTER_NAME
    CLUSTER_NAME 替換為使用者叢集名稱。

  3. 在文字編輯器中開啟包含 AWSCluster 的資訊清單。 保持檔案開啟,並使用 oidc 物件的值,按照「為 GKE Identity Service 設定叢集」中的步驟操作。

  4. anthos-aws 目錄使用 anthos-gke 將環境切換至管理服務。

    cd anthos-aws
    anthos-gke aws management get-credentials

  5. 在文字編輯器中開啟建立 AWSCluster 的 YAML 檔案。如果沒有初始 YAML 檔案,可以使用 kubectl edit

    編輯 YAML

    如果您按照「建立使用者叢集」一文中的操作說明進行,YAML 檔案會命名為 cluster-0.yaml。在文字編輯器中開啟這個檔案。

    kubectl edit

    如要使用 kubectl edit 編輯 AWSCluster,請執行下列指令:

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl edit awscluster cluster-name
    

    cluster-name 替換為您的 AWSCluster。舉例來說,如要編輯預設叢集 cluster-0,請執行下列指令:

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl edit awscluster cluster-0
    
  6. 從叢集資訊清單中刪除 oidc 物件。

  7. 儲存檔案。如果您使用 kubectl editkubectl 會自動套用變更。如果您要編輯 YAML 檔案,請使用下列指令將檔案套用至管理服務:

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl apply -f cluster-0.yaml
    

    管理服務隨後會更新 AWSCluster。

設定 gcloud 以存取叢集

本節適用於開發人員或叢集管理員

必要條件

如要完成這個部分,請完成下列事項:

  • 登入設定
  • 更新後的 gcloud CLI 版本,其中包含 anthos-auth 元件。

    gcloud components update
    gcloud components install anthos-auth
    
  • 執行下列指令,確認 gcloud CLI 是否已成功安裝。如果安裝成功,指令應會傳回必要引數和可用選項的詳細資料。

    gcloud anthos auth
    

驗證叢集

您可以透過下列方式驗證叢集:

  • 在本機電腦上使用 gcloud CLI。
  • 透過安全殼層通道,在遠端電腦上使用 gcloud CLI。
  • 使用 Google Cloud 主機上的「連線」。

gcloud local

使用 gcloud anthos auth login 透過登入設定驗證叢集。

如果您將登入設定放在預設位置,且已設定叢集名稱,即可使用 gcloud anthos auth login,不必提供任何選項。您也可以使用選用參數,設定叢集、使用者和其他驗證詳細資料。

預設

gcloud anthos auth login --cluster CLUSTER_NAME

CLUSTER_NAME 替換為完整叢集名稱。例如: projects/my-gcp-project/locations/global/memberships/cluster-0-0123456a

選用參數

gcloud anthos auth login 支援下列選用參數:

gcloud anthos auth login --cluster CLUSTER_NAME \
--user USERNAME --login-config ANTHOS_CONFIG_YAML \
--login-config-cert LOGIN_CONFIG_CERT_PEM \
--kubeconfig=KUBECONFIG --dry-run

下表說明這些參數。

參數 說明
cluster 要驗證的叢集名稱。預設為 `kubectl-anthos-config.yaml` 中的叢集。
user kubeconfig 中的憑證使用者名稱。預設值為 {cluster-name}-anthos-default-user
login-config 叢集管理員為開發人員產生的設定檔路徑,或是代管該檔案的網址。預設值為 kubectl-anthos-config.yaml
login-config-cert 如果使用網址 (login-config),則為建立 HTTPS 連線的 CA 憑證檔案路徑。
kubeconfig 包含權杖的 kubeconfig 檔案路徑。預設值為 $HOME/.kube/config`
模擬測試 測試指令列選項,不必變更設定或叢集。

gcloud anthos login 指令會啟動瀏覽器,要求使用者以企業憑證登入、執行 OIDC 憑證交換,並取得相關權杖。接著,gcloud CLI 會將權杖寫入 kubeconfig 檔案。kubectl 會使用這個檔案向使用者叢集進行驗證。

如要確認驗證是否成功,請使用 kubeconfig 檔案執行任何 kubectl 指令:

env HTTPS_PROXY=http://localhost:8118 \
  kubectl get nodes --kubeconfig my.kubeconfig

gcloud 隧道

如要從遠端電腦驗證使用者叢集,可以使用 SSH 通道進行驗證。如要使用通道,驗證設定檔必須位於遠端電腦,且您必須能從本機連線至 Open ID 提供者。

在本機上執行下列指令:

ssh USERNAME@REMOTE_MACHINE -L LOCAL_PORT:localhost:REMOTE_PORT

更改下列內容:

  • USERNAME,並使用有權透過 SSH 存取遠端機器的使用者。

  • REMOTE_MACHINE 搭配遠端電腦的主機名稱或 IP 位址。

  • LOCAL_PORT 是本機電腦上可用的通訊埠,ssh 會使用這個通訊埠建立通道連線至遠端電腦。

  • REMOTE_PORT 是您為 OIDC 重新導向網址設定的通訊埠。通訊埠號碼是驗證設定檔 kubectlRedirectURI 欄位的一部分。

在 SSH 殼層中執行下列指令,啟動驗證:

gcloud anthos auth login --login-config AUTH_CONFIG_FILE

AUTH_CONFIG_FILE 替換為遠端電腦上驗證設定檔的路徑。gcloud CLI 會在遠端電腦上執行網頁伺服器。

在本機電腦上,透過瀏覽器前往 http://localhost:LOCAL_PORT/login,然後按照 OIDC 登入流程操作。

遠端電腦上的 kubeconfig 檔案現在已包含存取使用者叢集的權杖。

在 SSH 殼層中,確認您有權存取使用者叢集:

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get nodes

控制台

您可以使用 Google Cloud 控制台進行驗證,方法是在 Google Cloud 控制台的 Kubernetes 叢集頁面中啟動驗證流程:

  1. 開啟 Google Cloud 控制台:

    前往 Kubernetes 叢集頁面

  2. 在清單中找出 GKE on AWS 叢集,然後按一下「登入」

  3. 選取「Authenticate with the Identity Provider configured for the cluster」(透過為叢集設定的識別資訊提供者完成驗證),然後按一下「LOGIN」(登入)

    系統會將您重新導向至身分識別提供者,您可能需要登入或同意 Google Cloud 控制台存取您的帳戶。 然後系統會將您重新導向至 Google Cloud 控制台的「Kubernetes clusters」(Kubernetes 叢集) 頁面。

更新 OIDC 設定

如要更新叢集上的 OIDC 設定,請使用 kubectl edit 指令。

env HTTPS_PROXY=http://localhost:8118 \
  kubectl edit clientconfigs -n kube-public default

kubectl 工具會在預設編輯器中載入 ClientConfig 資源。如要更新設定,請儲存檔案。kubectl 工具會更新叢集上的 ClientConfig 資源。

如要瞭解 ClientConfig 資源的內容,請參閱下一節。

附錄:登入設定範例

範例如下 kubectl-anthos-config.yaml。這個範例僅供瞭解內容。建議您一律使用 gcloud anthos create-login-config 產生檔案。

apiVersion: authentication.gke.io/v2alpha1
kind: ClientConfig
metadata:
 name: default
 namespace: kube-public
spec:
  authentication:
  - name: oidc
    oidc:
      clientID: CLIENT_CONFIG
      clientSecret: CLIENT_SECRET
      extraParams: resource=k8s-group-claim,domain_hint=consumers
      certificateAuthorityData:   CERTIFICATE_STRING
      issuerURI: https://adfs.contoso.com/adfs
      kubectlRedirectURI: http://redirect.kubectl.com/
      scopes: allatclaim,group
      userClaim: "sub"
      groupsClaim: "groups"
    proxy: PROXY_URL #Optional
  certificateAuthorityData: CERTIFICATE_AUTHORITY_DATA
  name: projects/my-project/locations/global/membership/cluster-0
  server: https://192.168.0.1:PORT
  preferredAuthentication: oidc

如要瞭解欄位內容,請參閱「驗證欄位」。

後續步驟

部署第一個工作負載至 GKE on AWS。