為機群成員叢集設定 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 Secret。以下範例說明如何為這兩種驗證類型設定祕密。範例顯示 Secret 套用至 anthos-identity-service 命名空間。

以下是基本驗證 Secret 設定範例:

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 是您為這個密鑰選擇的名稱。將使用者名稱和密碼值替換為上一步取得的使用者名稱和密碼。 USERNAME 是採用 Base64 編碼的使用者名稱 PASSWORD 是採用 Base64 編碼的密碼

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

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自訂資源:

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

後續步驟

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