配置 LDAP 连接
为 IBM® Cloud Private 集群配置 LDAP(轻量级目录访问协议)连接。
您必须使 LDAP 目录与 IBM Cloud Private 集群连接。 然后,您可以将用户从 LDAP 目录添加到集群。
支持以下 LDAP 类型:
- IBM Tivoli Directory Server
- IBM Lotus Domino
- IBM SecureWay Directory Server
- Novell eDirectory
- Sun Java™ System Directory Server
- Netscape Directory Server
- Microsoft Active Directory
- 定制
注:您可以在设置 LDAP 服务器时配置帐户锁定策略。 帐户锁定策略通过在多次登录尝试失败时限制帐户访问来提供更多安全性。
所需用户类型或访问级别:集群管理员
配置 LDAP over SSL
您可以使用 SSL(安全套接字层)保护 LDAP 连接。 您必须准备 IBM Cloud Private 集群,以连接到 LDAP over SSL (LDAPS) 目录。
在开始之前,必须导入用于设置 LDAPS 目录的公用或专用 SSL 证书。
检索 SSL 证书
如果您有 LDAP 服务器的 SSL 证书,请继续对 SSL 证书进行编码。
如果您没有 LDAP 服务器的 SSL 证书,请完成下列步骤来检索 SSL 证书:
注:您需要使用 ldapsearch 程序来运行这些命令。 您可以通过在 Ubuntu 上运行 apt install ldap-utils 以及在 Red Hat Enterprise Linux (RHEL) 上运行 yum install openldap-clients 来安装它。
-
请确保
/etc/openldap/cacerts目录中没有 SSL 证书。 -
运行下面的
ldapsearch命令来检索证书名称:ldapsearch -H <LDAP server URL> -d 1 -b <searchbase> -D "" -s base "(<filter>)"其中,
- LDAP 服务器 URL 是 LDAP 目录域名及端口。 格式:
ldaps://<LDAP server domain name or IP address>:<port>。 - -d 是调试级别。
- -b 是搜索条件。
- -D 是绑定 DN。 这是可选参数。
- -s 是搜索范围。
- filter 是 LDAP 过滤器。 缺省过滤器:
(objectClass=*)。
以下是示例命令和输出:
$ ldapsearch -H ldaps://corp.example.com:636 -d 1 -b o=example.com -D "" -s base "(objectclass=*)" ldap_url_parse_ext(ldaps://corp.example.com:636) ldap_create ldap_url_parse_ext(ldaps://corp.example.com:636/??base) ldap_sasl_bind ldap_send_initial_request ldap_new_connection 1 1 0 ldap_int_open_connection ldap_connect_to_host: TCP corp.example.com:636 ldap_new_socket: 3 ldap_prepare_socket: 3 ldap_connect_to_host: Trying 9.17.186.253:636 ldap_pvt_connect: fd: 3 tm: -1 async: 0 attempting to connect: connect success TLS: certdb config: configDir='/etc/openldap' tokenDescription='ldap(0)' certPrefix='cacerts' keyPrefix='cacerts' flags=readOnly TLS: cannot open certdb '/etc/openldap', error -8018:Unknown PKCS #11 error. TLS: could not get info about the CA certificate directory /etc/openldap/cacerts - error -5950:File not found. TLS: certificate [CN=DigiCert Global Root G2,OU=www.digicert.com,O=DigiCert Inc,C=US] is not valid - error -8172:Peer's certificate issuer has been marked as not trusted by the user.. TLS: error: connect - force handshake failure: errno 2 - moznss error -8172 TLS: can't connect: TLS error -8172:Peer's certificate issuer has been marked as not trusted by the user.. ldap_err2string ldap_sasl_bind(SIMPLE): Can't contact LDAP server (-1)证书信息位于输出的
TLS: certificate [CN=DigiCert Global Root G2,OU=www.digicert.com,O=DigiCert Inc,C=US]is not valid - error -8172:Peer's certificate issuer has been marked as not trusted by the user..部分。 - LDAP 服务器 URL 是 LDAP 目录域名及端口。 格式:
-
在 Web 浏览器中找到证书,使用 PEM 格式将其导出到文件,并使用
.crt扩展名来保存 PEM 文件。
注:如果有多个证书,那么以 PEM 格式将每个证书导出到文件,并使用.crt扩展名保存 PEM 文件。 - 将该
.crt文件复制到 IBM Cloud Private 集群的主节点。
准备单个 LDAPS 连接
如果要配置单个 LDAPS 连接,请完成对 SSL 证书进行编码一节中的步骤。
对 SSL 证书进行编码
完成以下步骤,按照 base64 格式对证书进行编码:
- 登录 IBM Cloud Private 集群的主节点。
- 如果 LDAP 服务器使用链式证书(根 CA 和中间证书),那么在编码前将证书组合到一个文件。使用以下命令以将证书附加到一个文件:
cat <first_cert.pem> <second_cert.pem>..<n_cert.pem> > combined_cert.pem -
按照 base64 格式对证书进行编码。
cat <LDAPS SSL certificate name>.crt | base64 -w 0输出类似于以下代码:
LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUdDRENDQS9DZ 0F3SUJBZ0lRS3k1dTZ0bDFObXdVaW03Ym8zeU1CekFOQmdrcWhraUc5 ... lDOHg0OU9oZ1E9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KDQo=
接下来,准备集群。
准备多个 LDAPS 连接
如果要配置多个 LDAPS 连接,请先在 platform-auth-ldaps-ca-cert 的“data”>“certificate”一节中检查是否已有证书。如果已有证书,请完成以下各节中的步骤:
如果没有任何证书,请完成对 SSL 证书进行编码中的步骤。
检索当前证书
您可以使用管理控制台或命令行界面 (CLI) 来检索证书。
如果使用的是管理控制台,请执行以下步骤:
- 以集群管理员身份登录management console。
- 从导航菜单中,单击配置 > 私钥。
- 找到
platform-auth-ldaps-ca-cert,然后单击操作 > 编辑。 这将显示编辑密匙窗口。 -
从“data”>“certificate”一节复制 base64 编码证书值。
"data": { "certificate": "LS0tLS1...ASDFASDo=" }, -
转换现有的编码证书,并将其保存到文件中。
echo "<copied_cert_value>" | base64 --decode > existing_cert.pem
如果使用的是 CLI,请执行以下步骤:
- 访问主节点的 CLI。您需要使用 Kubernetes 命令行工具
kubectl来完成以下任务。 有关安装和配置kubectl的更多信息,请参阅从 kubectl CLI 访问您的集群。 - 获取 base64 证书。
kubectl -n kube-system get secret platform-auth-ldaps-ca-cert -o "jsonpath={.data['certificate']}" | base64 --decode > existing_cert.pem
接下来,对 SSL 证书进行编码。
对 SSL 证书进行编码
完成以下步骤,按照 base64 格式对证书进行编码:
- 登录 IBM Cloud Private 集群的主节点。
-
如果 LDAP 服务器使用链式证书(根 CA 和中间证书),那么在编码前将证书组合到一个文件。使用以下命令以将证书附加到一个文件:
cat <first_cert.pem> <second_cert.pem>..<n_cert.pem> > combined_cert.pem -
将现有证书添加到新证书中,或者添加到联合证书中(如果您使用链式证书)。
cat existing_cert.pem <new_cert.pem or combined_cert.pem> > final_combined_cert.pem -
按照 base64 格式对证书进行编码。
cat <LDAPS SSL certificate name>.crt | base64 -w 0输出类似于以下代码:
LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUdDRENDQS9DZ 0F3SUJBZ0lRS3k1dTZ0bDFObXdVaW03Ym8zeU1CekFOQmdrcWhraUc5 ... lDOHg0OU9oZ1E9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KDQo=
接下来,请完成准备集群一节中的步骤。
准备集群
您可以使用管理控制台或 CLI 来准备集群。
如果使用的是管理控制台,请执行以下步骤:
- 以集群管理员身份登录management console。
- 从导航菜单中,单击配置 > 私钥。
- 找到
platform-auth-ldaps-ca-cert,然后单击操作 > 编辑。 这将显示编辑密匙窗口。 -
将 base64 证书粘贴到以下部分中:
"data": { "certificate": "" },更新后的部分类似于以下文本:
"data": { "certificate": "LS0tLS1<very_long_base64_string>ASDFASDo=" }, - 单击提交。
- 从导航菜单中,单击工作负载 > DaemonSet。
- 找到
auth-idp,然后单击操作 > 编辑。 这将显示编辑 DaemonSet 窗口。 - 单击提交,无需执行任何更改。 此步骤将最新的私钥和 ConfigMap 值重新装入到
auth-idpPod 中。 -
请稍候一两分钟,然后检查是否已在 Pod 上装载该证书。
-
获取
auth-idpPod。kubectl -n kube-system get pods | grep auth-idp -
检查是否已在 Pod 上装载该证书。
kubectl -n kube-system exec -it auth-idp-<pod-id> -c platform-auth-service cat /opt/ibm/ldaps/ldaps-ca.crt
-
如果使用的是 CLI,请执行以下步骤:
- 访问主节点的 CLI。您需要使用 Kubernetes 命令行工具
kubectl来完成以下任务。 有关安装和配置kubectl的更多信息,请参阅从 kubectl CLI 访问您的集群。 -
将 LDAPS CA 证书私钥复制到文件:
kubectl get secret platform-auth-ldaps-ca-cert -o yaml -n kube-system > platform-auth-ldaps-ca-cert-secret.yaml -
复制 base64 证书并将其粘贴到
platform-auth-ldaps-ca-cert-secret.yaml文件中。 -
获取安全服务 DaemonSet YAML 文件:
kubectl -n kube-system get ds auth-idp -o yaml > auth-idp.yaml -
应用更改:
kubectl apply -f platform-auth-ldaps-ca-cert-secret.yamlkubectl apply -f auth-idp.yaml
接下来,完成连接到 LDAP 目录部分中的步骤。
连接到 LDAP 目录
执行以下步骤,以设置 LDAP 连接。
- 以管理员身份登录。
- 从导航菜单中,单击管理 > 身份 & 访问权。
- 单击创建连接。这将显示“LDAP 连接”页面。
-
输入以下详细信息,以设置 LDAP 连接。
LDAP 连接
输入连接信息。
- 名称:LDAP 连接的唯一名称。 格式:1 - 50 个字母数字字符,允许使用的特殊字符为:
-_ - 类型:要连接到的 LDAP 目录的类型。 从列表中选择。 格式:1 - 255 个字母数字字符,允许使用空格,但不允许使用特殊字符。
-
URL:LDAP 目录域名或 IP 地址和 LDAP 端口号。 域名必须以
ldap://开头。 URL 示例:ldap://corpldap.abc.com:389或ldap://10.10.10.1:389。对于 LDAPS,必须使用域名,并且 URL 必须以
ldaps://开头。 示例 URL:ldaps://corpldap.abc.com:636。注:如果无法使用主机名连接到 LDAPS 服务器,请在本地 DNS 中添加 LDAPS 服务器的 IP 地址和主机名。必须可从 IBM Cloud Private 主节点解析 LDAPS 服务器主机名。
LDAP 认证
输入认证信息。
- 基本 DN:搜索条件的专有名称。 示例:dc=abc,dc=com。 格式:1 - 255 个字母数字字符,允许使用的特殊字符为:
=。,- - 绑定 DN:允许其搜索基本 DN 的用户。 示例:cn=admin,dc=abc,dc=com。 这是可选参数。 如果未在
绑定 DN参数中指定用户,那么将建立 LDAP 连接而不进行认证。 格式:0 - 255 个字母数字字符,允许使用空格,允许使用的特殊字符为:=。,- -
绑定 DN 密码:在
Bind DN中提及的用户的密码。如果未在绑定 DN 中指定用户,那么该参数不是必需参数。 最多允许 255 个字符。您可以单击测试连接来验证 LDAP 连接详细信息是否有效。
LDAP 过滤器
输入有关搜索过滤器的信息。 关于按 LDAP 类型划分的缺省 LDAP 过滤器,请参阅按 LDAP 类型划分的缺省 LDAP 过滤器。
- 组过滤器:用于搜索组的过滤器子句。 格式:1 - 255 个字母数字字符,允许使用的特殊字符为:空格,
=;。,&%(){}<>| - 组标识映射:用于将组名称映射到 LDAP 条目的过滤器。 格式:1 - 255 个字母数字字符,允许使用的特殊字符为:空格,
*:=;。,&%(){} - 组成员标识映射:用于将用户映射到组的过滤器。 格式:1 - 255 个字母数字字符,允许使用的特殊字符为:空格,
*:=;。,&%(){} - 用户过滤器:用于搜索用户的过滤器子句。 格式:1 - 255 个字母数字字符,允许使用的特殊字符为:空格,
=;。,&%(){}<>| - 用户标识映射:用于将组名称映射到 LDAP 条目的过滤器。 格式:1 - 255 个字母数字字符,允许使用的特殊字符为:空格,
*:=;。,&%(){}
- 名称:LDAP 连接的唯一名称。 格式:1 - 50 个字母数字字符,允许使用的特殊字符为:
-
单击连接。
现在,您的 IBM Cloud Private 集群已连接到 LDAP 目录。
接下来,可以将 LDAP 用户和用户组添加到 IBM Cloud Private 集群中。 关于添加用户的更多信息,请参阅将用户添加到团队中和将组添加到团队中。
按 LDAP 类型划分的缺省 LDAP 过滤器
| 属性名称 | 数据类型 | 缺省值 |
|---|---|---|
| groupFilter | 字符串 | (&(cn=%v)(objectclass=groupOfUniqueNames)) |
| groupIdMap | 字符串 | *:cn |
| groupMemberIdMap | 字符串 | groupOfUniqueNames:uniquemember |
| userFilter | 字符串 | (&(emailAddress=%v)(objectclass=person)) |
| userIdMap | 字符串 | *:uid |
| 属性名称 | 数据类型 | 缺省值 |
|---|---|---|
| groupFilter | 字符串 | (&(cn=%v)(objectclass=groupOfUniqueNames)) |
| groupIdMap | 字符串 | *:cn |
| groupMemberIdMap | 字符串 | groupOfUniqueNames:uniquemember |
| userFilter | 字符串 | (&(uid=%v)(objectclass=ePerson)) |
| userIdMap | 字符串 | *:uid |
| 属性名称 | 数据类型 | 缺省值 |
|---|---|---|
| groupFilter | 字符串 | (&(cn=%v)(objectclass=group)) |
| groupIdMap | 字符串 | *:cn |
| groupMemberIdMap | 字符串 | memberOf:member |
| userFilter | 字符串 | (&(sAMAccountName=%v)(objectclass=user)) |
| userIdMap | 字符串 | user:sAMAccountName |
| 属性名称 | 数据类型 | 缺省值 |
|---|---|---|
| groupFilter | 字符串 | (&(cn=%v)(objectclass=dominoGroup)) |
| groupIdMap | 字符串 | *:cn |
| groupMemberIdMap | 字符串 | dominoGroup:member |
| userFilter | 字符串 | (&(uid=%v)(objectclass=Person)) |
| userIdMap | 字符串 | person:uid |
| 属性名称 | 数据类型 | 缺省值 |
|---|---|---|
| groupFilter | 字符串 | (&(cn=%v)((objectclass=groupOfNames)(objectclass=groupOfUniqueNames))) |
| groupIdMap | 字符串 | *:cn |
| groupMemberIdMap | 字符串 | groupOfNames:member;groupOfUniqueNames:uniqueMember |
| userFilter | 字符串 | (&(uid=%v)(objectclass=ePerson)) |
| userIdMap | 字符串 | *:uid |
| 属性名称 | 数据类型 | 缺省值 |
|---|---|---|
| groupFilter | 字符串 | (&(cn=%v)(objectclass=ldapsubentry)) |
| groupIdMap | 字符串 | *:cn |
| groupMemberIdMap | 字符串 | nsRole:nsRole |
| userFilter | 字符串 | (&(uid=%v)(objectclass=inetOrgPerson)) |
| userIdMap | 字符串 | inetOrgPerson:uid |
| 属性名称 | 数据类型 | 缺省值 |
|---|---|---|
| groupFilter | 字符串 | (&(cn=%v)((objectclass=groupOfNames)(objectclass=groupOfUniqueNames))) |
| groupIdMap | 字符串 | *:cn |
| groupMemberIdMap | 字符串 | groupOfNames:member;groupOfUniqueNames:uniqueMember |
| userFilter | 字符串 | (&(uid=%v)(objectclass=inetOrgPerson)) |
| userIdMap | 字符串 | inetOrgPerson:uid |
| 属性名称 | 数据类型 | 缺省值 |
|---|---|---|
| groupFilter | 字符串 | (&(cn=%v)(objectclass=groupOfNames)) |
| groupIdMap | 字符串 | *:cn |
| groupMemberIdMap | 字符串 | groupOfNames:member |
| userFilter | 字符串 | (&(cn=%v)(objectclass=Person)) |
| userIdMap | 字符串 | person:cn |