本文档适用于在集群上设置 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 只能与 VMware(用户集群)和裸金属上的 Google Distributed Cloud 部署搭配使用。
准备工作
- 确保您已安装以下命令行工具:
- 确保您已初始化用于您项目的 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
配置的格式:
apiVersion: authentication.gke.io/v2alpha1 kind: ClientConfig metadata: name: default namespace: kube-public spec: 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
中配置多个身份提供方。这可以简化管理并提供灵活性,从而在统一的配置资源中配置各种身份验证方法。以下示例 ClientConfig
按所需的身份验证优先顺序定义了多个身份提供方。
apiVersion: v1
items:
- apiVersion: authentication.gke.io/v2alpha1
kind: ClientConfig
...
spec:
authentication:
- aws:
region: us-west-2
name: AWS Login
- ldap:
...
- saml:
...
- azureAD:
...
- oidc:
name: Okta OIDC
...
-oidc:
name: Google OIDC
...
下表介绍了 ClientConfig
CRD 中的字段:
字段 | 必需 | 说明 | 格式 |
---|---|---|---|
名称 | 是 | 用于标识此 LDAP 配置的名称 | 字符串 |
主机 | 是 | LDAP 服务器的主机名或 IP 地址。端口是可选项,如果未指定,则默认为 389。例如 ldap.server.example.com 或 10.10.10.10:389 。
|
字符串 |
certificateAuthorityData | 对于某些 LDAP 连接类型而言为必填项 | 包含用于 LDAP 服务器的 Base64 编码的 PEM 格式的证书授权机构证书。只能为 ldaps 和 startTLS 连接提供此字段。 |
字符串 |
connectionType | 是 | 连接到 LDAP 服务器时使用的 LDAP 连接类型。默认为 startTLS 。 insecure 模式只能用于开发目的,因为与服务器的所有通信都将以明文显示。 |
字符串 |
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 设置为 userPrincipalName 时,用户将能够以 bsmith 身份登录,但用户的实际 RBAC 政策将写作 bsmith@example.com 。建议使用 userPrincipalName ,因为该项对于每个用户都是唯一的。如果未指定,则默认为 userPrincipalName 。 |
字符串 |
loginAttribute | no | 与输入用户名匹配的特性的名称。此字段用于在 LDAP 数据库(例如 (<LoginAttribute>=<username>) )中查找用户,并与可选过滤条件字段结合使用。默认为 userPrincipalName 。 |
字符串 |
群组(可选字段) | |||
baseDN | 是 | LDAP 目录中子树的位置,用于搜索群组条目。 | 字符串 |
过滤条件 | no | 搜索用户所属的群组时使用的可选过滤条件。该项可用于明确匹配特定群组,以减少为每个用户返回的群组数量。默认为 (objectClass=Group) 。 |
字符串 |
identifierAttribute | no | 用户所属的每个群组的标识名。例如,如果设置为 distinguishedName ,则应将 RBAC 和其他群组预期值写为完整的 DN。如果未指定该项,则默认为 distinguishedName 。 |
字符串 |
后续步骤
应用配置后,继续使用 GKE Identity Service 设置用户对集群的访问权限。