為機群成員叢集設定 LDAP 驗證

本文說明叢集管理員或應用程式運算子如何設定 Kubernetes 叢集,以支援來自第三方輕量型目錄存取協定 (LDAP) 提供者的驗證,例如 Microsoft Entra ID 或 Google LDAP。詳情請參閱「關於使用第三方身分驗證」。

限制

您必須使用支援 LDAP 的叢集類型

事前準備

  1. Install the Google Cloud CLI.

  2. 若您採用的是外部識別資訊提供者 (IdP),請先使用聯合身分登入 gcloud CLI

  3. 執行下列指令,初始化 gcloud CLI:

    gcloud init
  4. 初始化 gcloud CLI 後,請更新 gcloud CLI 並安裝必要元件:

    gcloud components update
    gcloud components install kubectl
  5. 請確認平台管理員已提供所有必要的供應商資訊。詳情請參閱「設定 LDAP 供應商,以便向叢集進行驗證」。

在整個設定過程中,您可能需要參閱 LDAP 伺服器的說明文件。下列管理員指南說明如何為部分熱門 LDAP 供應商設定,包括如何找到登入 LDAP 伺服器及設定叢集所需的資訊:

填入 LDAP 服務帳戶密碼

叢集需要服務帳戶密碼,才能向 LDAP 伺服器驗證身分並擷取使用者詳細資料。LDAP 驗證支援下列機制:

  • 基本驗證:使用使用者名稱和密碼。
  • 用戶端憑證驗證:使用用戶端私密金鑰和用戶端憑證。

您或平台管理員應已從「設定 LDAP 供應商,以驗證叢集」一文中取得供應商的相關資訊。如要讓叢集使用 LDAP 伺服器登入資訊,您必須建立包含 LDAP 登入詳細資料的 Kubernetes 密鑰。下列範例說明如何為兩種驗證類型設定密鑰。範例顯示密鑰套用至 anthos-identity-service 命名空間。

以下是基本驗證的密鑰設定範例:

apiVersion: v1
kind: Secret
metadata:
  name: SERVICE_ACCOUNT_SECRET_NAME
  namespace: "anthos-identity-service"
type: kubernetes.io/basic-auth     # Make sure the type is correct
data:
  username: USERNAME  # Use a base64-encoded username
  password: PASSWORD  # Use a base64-encoded password

其中, SERVICE_ACCOUNT_SECRET_NAME 是您為這個 Secret 選擇的名稱。 將使用者名稱和密碼值,換成您在上一步取得的使用者名稱和密碼。 USERNAME 是 Base64 編碼的使用者名稱 PASSWORD 是 Base64 編碼的密碼

以下是用戶端憑證密鑰設定範例:

apiVersion: v1
kind: Secret
metadata:
  name: SERVICE_ACCOUNT_SECRET_NAME
  namespace: anthos-identity-service
type: kubernetes.io/tls            # Make sure the type is correct
data:
  # the data is abbreviated in this example
  tls.crt: |
       MIIC2DCCAcCgAwIBAgIBATANBgkqh ...
  tls.key: |
       MIIEpgIBAAKCAQEA7yn3bRHQ5FHMQ ...

SERVICE_ACCOUNT_SECRET_NAME 替換成您為這個 Secret 選擇的名稱。將 TLS 憑證和金鑰值,換成您在上一步取得的編碼憑證和金鑰值。

範例顯示密鑰已套用至 anthos-identity-service 命名空間。根據預設,系統元件有權讀取這個命名空間中的 Secret。如要使用其他命名空間,請變更密鑰中的中繼資料,然後新增 RBAC 政策,將讀取該命名空間中密鑰的權限授予 anthos-identity-service 命名空間中的 default ServiceAccount,如下所示:

---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: NAMESPACE
  name: ais-secret-reader-role
rules:
- apiGroups: [""]
  resources: ["secrets"]
  verbs: ["get","list"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: ais-secret-reader-role-binding
  namespace: NAMESPACE
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: ais-secret-reader-role
subjects:
- kind: ServiceAccount
  name: default
  namespace: anthos-identity-service
---

設定叢集

如要使用 LDAP 設定叢集的驗證,請將下列資訊新增至名為 ClientConfig 的 Kubernetes 自訂資源

  • 身分識別提供者和參數的相關資訊,這些參數必須傳回使用者資訊。
  • 您在先前建立及套用的密鑰名稱和命名空間,可讓叢集向 LDAP 伺服器進行驗證。

如要設定叢集,請編輯 kube-public命名空間中的 default ClientConfig:

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG -n kube-public edit clientconfig default

USER_CLUSTER_KUBECONFIG 替換為叢集的 kubeconfig 檔案路徑。如果 kubeconfig 中有多個環境,系統會使用目前的環境。執行指令前,您可能需要將目前的環境重設為正確的叢集。

以下顯示 ClientConfig 設定的格式:

apiVersion: authentication.gke.io/v2alpha1
kind: ClientConfig
metadata:
  name: default
  namespace: kube-public
spec:
  authentication:
  - name: NAME
    ldap:
      certificateAuthorityData: CERTIFICATE_AUTHORITY_DATA
      connectionType: CONNECTION_TYPE
      host: HOST_NAME
      serviceAccountSecret:
        name: SERVICE_ACCOUNT_SECRET_NAME
        namespace: NAMESPACE
        type: SECRET_FORMAT
      user:
        baseDN: BASE_DN
        filter: FILTER
        identifierAttribute: IDENTIFIER_ATTRIBUTE
        loginAttribute: LOGIN_ATTRIBUTE
      group:
        baseDN: BASE_DN
        filter: FILTER
        identifierAttribute: IDENTIFIER_ATTRIBUTE

您可以在同一個 ClientConfig 中新增多個 OIDC、LDAP 和 SAML 識別資訊提供者設定。叢集會依定義順序,嘗試使用每項設定進行驗證,並在首次驗證成功後停止。以下 ClientConfig 範例會依特定順序定義多個身分識別提供者:

apiVersion: authentication.gke.io/v2alpha1
kind: ClientConfig
metadata:
  name: default
  namespace: kube-public
spec:
  authentication:
  - aws:
      region: us-west-2
    name: AWS Login
  - ldap:
  # Multiple lines are omitted here.
  - saml:
  # Multiple lines are omitted here.
  - azureAD:
  # Multiple lines are omitted here.
  - oidc:
    name: Okta OIDC
  # Multiple lines are omitted here.
  - oidc:
    name: Google OIDC
  # Multiple lines are omitted here.

ClientConfig LDAP 欄位

下表說明 ClientConfig ldap 物件的欄位。您需要新增的欄位取決於識別資訊提供者權杖,以及平台管理員設定提供者的方式。

欄位 必填 說明 格式
name 識別這項 LDAP 設定的名稱 字串
主機 LDAP 伺服器的主機名稱或 IP 位址。通訊埠為選用項目,如未指定,則預設為 389。例如 ldap.server.example.com10.10.10.10:389 字串
certificateAuthorityData 特定 LDAP 連線類型必須提供此資訊 包含採用 Base64 編碼和 PEM 格式的 LDAP 伺服器憑證授權單位憑證。這項資訊僅適用於 ldapsstartTLS 連線。 字串
connectionType 連至 LDAP 伺服器時要使用的 LDAP 連線類型,預設值為 startTLSinsecure 模式只能用於開發,因為與伺服器的所有通訊都會以純文字形式進行。 字串
serviceAccountSecret
name 儲存 LDAP 服務帳戶憑證的 Kubernetes 密鑰名稱。 字串
命名空間 儲存 LDAP 服務帳戶憑證的 Kubernetes 密鑰命名空間。 字串
類型 定義服務帳戶密鑰的格式,以便支援不同類型的密鑰。如果您在 Secret 設定中指定 basic-auth,則應為 basic,否則應為 tls。如未指定,則預設為 basic 字串
使用者
baseDN LDAP 目錄中子樹的位置,用來搜尋使用者項目。 字串
篩選器 搜尋使用者時要套用的篩選器 (選用)。這項功能可用於進一步限制允許登入的使用者帳戶。如未指定,則預設為 (objectClass=User) 字串
identifierAttribute 決定通過驗證的使用者用來表示身分的屬性。這與 loginAttribute 欄位不同,可讓使用者透過使用者名稱登入,但實際 ID 為電子郵件地址或完整辨別名稱 (DN)。舉例來說,如果將 loginAttribute 設為 sAMAccountName,並將 identifierAttribute 設為 userPrincipalName,使用者就能以 bsmith 登入,但使用者實際的 RBAC 政策會寫成 bsmith@example.com。建議使用 userPrincipalName,因為每位使用者都有專屬的 ID。如未指定,則預設為 userPrincipalName 字串
loginAttribute 用來比對輸入使用者名稱的屬性名稱。這項屬性用於在 LDAP 資料庫中尋找使用者 (例如 (<LoginAttribute>=<username>)),並與選用篩選器欄位合併。預設值為 userPrincipalName 字串
group (選填欄位)
baseDN LDAP 目錄中子樹的位置,用來搜尋群組項目。 字串
篩選器 搜尋使用者所屬群組時要套用的篩選器 (選用)。這項功能可用於明確比對特定群組,減少每個使用者傳回的群組數量。預設值為 (objectClass=Group) 字串
identifierAttribute 使用者所屬各群組的識別名稱。舉例來說,如果設為 distinguishedName,則 RBAC 和其他群組期望值應以完整 DN 形式撰寫。如未指定,則預設為 distinguishedName 字串

後續步驟

套用設定後,請繼續設定外部供應商對叢集的存取權