为 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 components update
    gcloud components install kubectl
  5. 请确保平台管理员已为您提供所需的所有提供方信息。如需了解详情,请参阅配置 LDAP 提供方以向集群进行身份验证

在设置过程中,您可能需要参考 LDAP 服务器的文档。以下管理员指南介绍了一些常用 LDAP 提供方的配置,包括在哪里查找登录 LDAP 服务器并配置集群所需的信息:

填充 LDAP 服务账号密钥

集群需要服务账号密钥才能向 LDAP 服务器进行身份验证并检索用户详细信息。LDAP 身份验证支持以下机制:

  • 基本身份验证,即:使用用户名和密码。
  • 客户端证书身份验证,即:使用客户端私钥和客户端证书。

您或您的平台管理员应按照配置 LDAP 提供方以向集群进行身份验证中的说明获取有关提供方的此信息。如需将 LDAP 服务器登录信息提供给集群,您需要创建包含 LDAP 登录详细信息的 Kubernetes Secret。以下示例展示了如何为这两种身份验证类型配置 Secret。这些示例显示了要应用于 anthos-identity-service 命名空间的 Secret。

下面是基本身份验证 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 是您为此 Secret 选择的名称。将用户名和密码值替换为您在上一步中获得的用户名和密码。 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。默认情况下,系统组件有权读取此命名空间中的 Secret。如需使用其他命名空间,请更改 Secret 中的元数据,然后添加新的 RBAC 政策,以向 anthos-identity-service 命名空间中的 default ServiceAccount 授予读取该命名空间中 Secret 的权限,如下所示:

---
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 的名称和命名空间,该 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.com10.10.10.10:389 字符串
certificateAuthorityData 对于某些 LDAP 连接类型而言为必填项 包含用于 LDAP 服务器的 Base64 编码的 PEM 格式的证书授权机构证书。只能为 ldapsstartTLS 连接提供此字段。 字符串
connectionType 连接到 LDAP 服务器时使用的 LDAP 连接类型。默认为 startTLSinsecure 模式只能用于开发目的,因为与服务器的所有通信都将以明文显示。 字符串
serviceAccountSecret
name 存储 LDAP 服务账号凭据的 Kubernetes Secret 的名称。 字符串
命名空间 存储 LDAP 服务账号凭据的 Kubernetes Secret 的命名空间。 字符串
type 定义服务账号密钥的格式,以支持不同类型的密钥。如果您在 Secret 配置中指定 basic-auth,则此项应为 basic,否则应为 tls。如果未指定,则默认为 basic 字符串
user
baseDN LDAP 目录中要搜索用户条目的子树位置。 字符串
filter 搜索用户时要应用的可选过滤条件。这可用于进一步限制允许登录的用户账号。如果未指定,则默认为 (objectClass=User) 字符串
identifierAttribute 确定在用户进行身份验证后要将哪个属性用作其用户身份。这不同于 loginAttribute 字段,后者允许用户使用用户名登录,但其实际标识符是电子邮件地址或完整的标识名 (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 字符串

后续步骤

应用配置后,继续设置用户从外部提供方访问集群的权限