使用 LDAP 设置 GKE Identity Service

本文档适用于在集群上设置 GKE Identity Service 的集群管理员或应用运维人员。本文档介绍如何使用首选轻量级目录访问协议 (LDAP) 提供商(包括 Microsoft Active Directory)在集群上设置 GKE Identity Service。本文档假定您或您的平台管理员已按照为 GKE Identity Service 设置 LDAP 提供商中的说明获取 LDAP 提供商的登录详细信息。

如需详细了解 GKE Identity Service 的工作原理和其他设置选项,请参阅概览。如需了解如何以开发者或其他集群用户身份使用此服务访问集群,请参阅使用 GKE Identity Service 访问集群

使用 LDAP 的 GKE Identity Service 目前只能与 GKE on VMware(用户集群)和 GKE on Bare Metal 搭配使用。

准备工作

  1. 确保您已安装以下命令行工具:

    • 最新版本的 Google Cloud CLI,其中包含用于与 Google Cloud 交互的命令行工具 gcloud。如果您需要安装 Google Cloud CLI,请参阅安装指南
    • kubectl,用于对 Kubernetes 集群运行命令。如果您需要安装 kubectl,请参阅安装指南

    如果您使用 Cloud Shell 作为与 Google Cloud 交互的 Shell 环境,则系统会为您安装这些工具。

  2. 确保您已初始化用于您项目的 gcloud CLI。

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

填充 LDAP 服务账号密钥

GKE Identity Service 需要服务账号密钥才能向 LDAP 服务器进行身份验证并检索用户详细信息。LDAP 身份验证、基本身份验证(使用用户名和密码向服务器进行身份验证)或客户端证书(使用客户端私钥和客户端证书)允许两种类型的服务账号。您或您的平台管理员应按照为 GKE Identity Service 设置 LDAP 提供商中的说明获取有关提供商的此信息。

如需将 LDAP 服务器登录信息提供给 GKE Identity Service,您需要创建 Kubernetes Secret 资源,其中包含为 GKE Identity Service 设置 LDAP 提供商中的登录详细信息。

以下示例展示了如何为这两种服务账号类型配置 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,我们推荐采用这种方法。这是因为默认情况下,GKE Identity Service 有权读取 anthos-identity-service 中的 Secret。如果要使用其他命名空间,请更改 Secret 中的元数据,然后添加新的 RBAC 政策以授予 GKE Identity Service 读取该命名空间中 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
---

配置集群

GKE Identity Service 使用特殊的 Kubernetes 自定义资源类型 (CRD) 来配置名为 ClientConfig 的集群,其中包含有关身份提供方的信息的字段以及它需要返回用户信息的参数。您的 ClientConfig 配置还包括您在上一部分创建和应用的 Secret 中的 Secret 名称和命名空间,从而允许 GKE Identity Service 向 LDAP 服务器进行身份验证。

如需将配置应用到您的集群,请在 kube-public 命名空间中修改 clientconfig 类型的 KRM 默认对象:

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

其中,USER_CLUSTER_KUBECONFIG 是集群的 kubeconfig 文件的路径。如果 kubeconfig 中有多个上下文,则会使用当前上下文。运行该命令之前,您可能需要将当前上下文重置为正确的集群。

下面展示了 ClientConfig 配置的格式:

authentication:
  - name: NAME_STRING
    ldap:
      host: HOST_NAME
      certificateAuthorityData: CERTIFICATE_AUTHORITY_DATA
      connectionType: CONNECTION_TYPE
      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 CRD 中的字段:

字段 需要 说明 形式
名称 用于标识此 LDAP 配置的名称 字符串
主机 LDAP 服务器的主机名或 IP 地址。端口是可选项,如果未指定,则默认为 389。例如 ldap.server.example.com10.10.10.10:389 字符串
certificateAuthorityData 对于某些 LDAP 连接类型而言为必填项 包含用于 LDAP 服务器的 Base64 编码的 PEM 格式的证书授权机构证书。只能为 ldapsstartTLS 连接提供此字段。 字符串
connectionType 连接到 LDAP 服务器时使用的 LDAP 连接类型。默认为 startTLSinsecure 模式只能用于开发目的,因为与服务器的所有通信都将以明文显示。 字符串
serviceAccountSecret
名称 存储 LDAP 服务账号凭据的 Kubernetes Secret 的名称。 字符串
命名空间 存储 LDAP 服务账号凭据的 Kubernetes Secret 的命名空间。 字符串
type 定义服务账号密钥的格式,以支持不同类型的密钥。如果您在 Secret 配置中指定 basic-auth,则此项应为 basic,否则应为 tls。如果未指定,则默认为 basic 字符串
用户
baseDN LDAP 目录中子树的位置,用于搜索用户条目。 字符串
过滤条件 no 搜索用户时要应用的可选过滤条件。这可用于进一步限制允许登录的用户账号。如果未指定,则默认为 (objectClass=User) 字符串
identifierAttribute no 确定在用户进行身份验证后要将其哪个特性用作其用户身份。这不同于 loginAttribute 字段,后者允许用户使用用户名登录,但其实际标识符是电子邮件地址或完整的标识名 (DN)。例如,将 loginAttribute 设置为 sAMAccountName 并将 identifierAttribute 设置为 userPrincipleName 时,用户将能够以 bsmith 身份登录,但用户的实际 RBAC 政策将写作 bsmith@example.com。建议使用 userPrincipleName,因为该项对于每个用户都是唯一的。如果未指定,则默认为 userPrincipleName 字符串
loginAttribute no 与输入用户名匹配的特性的名称。此字段用于在 LDAP 数据库(例如 (<LoginAttribute>=<username>))中查找用户,并与可选过滤条件字段结合使用。默认为 userPrincipleName 字符串
group(可选字段)
baseDN LDAP 目录中子树的位置,用于搜索群组条目。 字符串
过滤条件 no 搜索用户所属的群组时使用的可选过滤条件。该项可用于明确匹配特定群组,以减少为每个用户返回的群组数量。默认为 (objectClass=Group) 字符串
identifierAttribute no 用户所属的每个群组的标识名。例如,如果设置为 distinguishedName,则应将 RBAC 和其他群组预期值写为完整的 DN。如果未指定该项,则默认为 distinguishedName 字符串

后续步骤

应用配置后,继续使用 GKE Identity Service 设置用户对集群的访问权限