本文永久链接: https://www.xtplayer.cn/rancher/authentication/rancher2-openldap-authentication/

版本支持: Rancher v2.0.5+

注意 在开始之前,请熟悉 外部身份验证配置和主要用户 的概念。

如果您的组织使用 LDAP 进行用户身份验证,则可以将 Rancher 与 OpenLDAP 服务集成,以提供统一的用户身份验证。

OpenLDAP 身份验证流程

  1. 当用户尝试使用 LDAP 账号登录 Rancher 时,Rancher 使用具有 搜索目录和读取用户/组权限 的服务帐户创建对 LDAP 服务器的初始绑定(账号初始化)。
  2. 然后,Rancher 使用基于提供的用户名和配置的属性映射的搜索过滤器在目录中搜索用户。
  3. 找到用户后,使用用户的 DN 和提供的密码对另一个 LDAP 绑定请求进行身份验证。
  4. 验证成功后,Rancher 将从用户对象的成员资格属性中解析组成员资格,并根据配置的用户映射属性执行组搜索。

注意 在配置之前请先熟悉 外部身份验证配置和主要用户的概念

先决条件

必须使用 LDAP 绑定帐户(也称为服务帐户)配置 Rancher,以搜索和检索用户和组相关的 LDAP 条目。建议不要使用管理员帐户或个人帐户,而是在 OpenLDAP 中创建一个专用帐户,对配置的搜索路径下的用户和组只具有只读访问权限(见下文)。

配置步骤

打开 OpenLDAP 配置页面

  1. 使用系统默认的 admin 帐户登录 Rancher UI。
  2. 全局 视图中,导航到 安全 > 认证页面
  3. 选择 OpenLDAP,将显示 配置 OpenLDAP 服务器 表单。

OpenLDAP 服务器配置

使用 TLS? 如果 OpenLDAP 服务器使用的是自签名证书,或不是来自权威的证书颁发机构,请确保有 PEM 格式的 CA 证书(与所有的中间证书连接)。您必须在配置期间设置证书,以便 Rancher 能够验证证书链。

OpenLDAP 服务器参数

参数描述
Hostname指定 OpenLDAP 服务器的主机名或 IP 地址
端口指定 OpenLDAP 服务器正在侦听的端口,未加密的 LDAP 通常使用标准端口 389,而 LDAPS 使用端口 636
TLS选中此框以启用基于 SSL/TLS 的 LDAP(通常称为 LDAPS)。如果服务器使用 自签名/企业签名 的 SSL 证书,则还需要粘贴 CA 证书。
服务器连接超时Rancher 在考虑服务器不可达之前等待的持续时间(以秒为单位)。
服务帐户用于绑定、搜索和检索 LDAP 条目的服务帐户(DN)。
服务帐号密码服务帐户密码。
用户搜索起点用户搜索起点,所有用户都基于此 DN 以及子目录进行搜索。例如:ou=people,dc=acme,dc=com
用户组搜索起点用户组搜索起点,所有用户组都基于此 DN 以及子目录进行搜索。如果留空,将会基于 用户搜索起点 进行搜索。例如:ou=groups,dc=acme,dc=com

自定义架构配置

如果您的 OpenLDAP 不是标准 OpenLDAP 架构,则必须自定义架构以匹配相应字段。

请注意,Rancher 使用本节中配置的属性映射来构造搜索过滤器并解析组成员身份。因此,始终建议您验证此处的配置是否与您的 OpenLDAP 架构中使用的字段匹配。

如果您不熟悉 OpenLDAP 服务器中使用的 用户/组 架构,请咨询 LDAP 管理员,或参阅 Active Directory 身份验证文档中的使用 ldapsearch 识别搜索库和架构部分。

用户架构配置

下表详细介绍了用户架构配置的参数。

参数描述
对象类别域中用于用户对象的对象类的名称。如果已定义,则只指定对象类的名称——不要将其包含在 LDAP 包装器中,例如&(objectClass=xxxx)
用户名属性用户属性,其值适合作为显示名称。
登录属性该属性的值与用户登录 Rancher 时输入的 用户名 匹配,通常是 uid
用户成员属性包含用户所属组的专有名称的用户属性,通常这是 memberOfisMemberOf
搜索属性当用户输入文本以在 UI 中添加 用户或组 时,Rancher 会查询 LDAP 服务器并尝试通过此设置中提供的属性来匹配用户。通过使用竖线(“ |”)符号将多个属性分开,可以指定多个属性。
用户启用的属性如果您的 OpenLDAP 服务器的架构支持用户属性,可以对其值进行评估以确定该帐户是禁用还是锁定,请输入该属性的名称。默认的 OpenLDAP 模式不支持此功能,并且该字段通常应留空。
禁用状态位掩码这是 禁用/锁定 的用户帐户的值。如果 User Enabled Attribute 为空,则忽略该参数。

用户组架构配置

下表详细说明了组架构配置的参数。

参数描述
对象类别域中用于分组条目的对象类的名称。如果已定义,则只指定对象类的名称——不要将其包含在 LDAP 包装器中,例如 &(objectClass=xxxx)
名称属性组属性,其值适合于显示名称。
组成员用户属性user attribute 的名称,其格式与 Group Member Mapping Attribute 中的组成员匹配 。
组成员映射属性包含组成员的组属性的名称。
搜索属性将组添加到 UI 中的集群或项目 时,用于构造搜索过滤器的属性。请参阅用户架构 Search Attribute 说明 。
组 DN 属性组属性的名称,其格式与用户的组成员资格属性中的值匹配。请参阅 User Member Attribute
嵌套组成员此设置定义 Rancher 是否搜索嵌套的组成员。仅当您的组织使用这些嵌套成员时才使用(即您具有包含其他组作为成员的组)。如果使用 Shibboleth,则禁用此选项。

配置脚本

#!/bin/bash
export RANCHER_DOMAIN="rancher.yourdomain.com"
export RANCHER_TOKEN="token-xxxxx:xxxx"
export ACCESS_MODE="unrestricted"
export CONNECTION_TIMEOUT="5000"
export LDAP_HOST="ldap.yourdomain.com"
export LDAP_PORT="636"
export TLS="true"
export SA_DN="uid=x,ou=x,o=x,dc=yourdomain,dc=com"
export SA_PW="sa_password"
export USER_SEARCHBASE="ou=x,o=x,dc=yourdomain,dc=com"
export USERNAME="username"
export PASSWORD="password"

curl -u $RANCHER_TOKEN "https://${RANCHER_DOMAIN}/v3/openLdapConfigs/openldap?action=testAndApply" \
-H 'content-type: application/json' \
-H 'accept: application/json' \
--data-binary '{"ldapConfig":{"accessMode":"'"${ACCESS_MODE}"'","baseType":"authConfig","connectionTimeout":"'"${CONNECTION_TIMEOUT}"'","enabled":true,"groupDNAttribute":"entryDN","groupMemberMappingAttribute":"member","groupMemberUserAttribute":"entryDN","groupNameAttribute":"cn","groupObjectClass":"groupOfNames","groupSearchAttribute":"cn","id":"openldap","labels":{"cattle.io/creator":"norman"},"name":"openldap","nestedGroupMembershipEnabled":false,"port":"'"${LDAP_PORT}"'","servers":["'"${LDAP_HOST}"'"],"serviceAccountDistinguishedName":"'"${SA_DN}"'","tls":"'"${TLS}"'","type":"openLdapConfig","userDisabledBitMask":0,"userLoginAttribute":"uid","userMemberAttribute":"memberOf","userNameAttribute":"cn","userObjectClass":"inetOrgPerson","userSearchAttribute":"uid|sn|givenName","userSearchBase":"'"${USER_SEARCHBASE}"'","serviceAccountPassword":"'"${SA_PW}"'","groupSearchBase":null},"enabled":true,"username":"'"${USERNAME}"'","password":"'"${PASSWORD}"'"}' --compressed --insecure