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

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

限制

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

事前準備

  1. 安裝 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 政策,將讀取該命名空間中 Secret 的權限授予 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.com 或 10.10.10.10:389。 字串
certificateAuthorityData 某些 LDAP 連線類型需要此設定 包含採用 Base64 編碼和 PEM 格式的 LDAP 伺服器憑證授權單位憑證。這項資訊僅適用於 ldaps 和 startTLS 連線。 字串
connectionType 是 連至 LDAP 伺服器時要使用的 LDAP 連線類型,預設值為 startTLS。insecure 模式只能用於開發,因為與伺服器的所有通訊都會以純文字形式進行。 字串
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。 字串

後續步驟

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