在 ldap-2.4 中启用 TLS 后无法使用 EXTERNAL 身份验证

在 ldap-2.4 中启用 TLS 后无法使用 EXTERNAL 身份验证

我使用以下 LDIF 文件来激活 LDAP 服务器的 TLS 支持:

dn: cn=config
changetype: modify
add: olcTLSCipherSuite
olcTLSCipherSuite: NORMAL 
-
add: olcTLSCRLCheck
olcTLSCRLCheck: none
-
add: olcTLSVerifyClient
olcTLSVerifyClient: never
-
add: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/ssl/certs/CA.crt
-
add: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ssl/certs/server.pem
-
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ssl/private/key.pem

并使用以下 LDIF 强制客户端连接使用 TLS:

dn: cn=config
changetype: modify
add: olcSecurity
olcSecurity: tls=1

此后,我无法再使用“-Y EXTERNAL”来读取或修改配置模式。例如,如果我运行以下命令,则会收到 SASL 错误:

$ sudo ldapsearch -Q -Y EXTERNAL -H ldapi:/// -b "" -LLL -s base -Z supportedSASLMechanisms
ldap_sasl_interactive_bind_s: Authentication method not supported (7)
    additional info: SASL(-4): no mechanism available: 

如果我检查支持的 SASL 机制:

$ sudo ldapsearch -x -H ldapi:/// -b "" -LLL -s base -Z supportedSASLMechanisms
dn:
supportedSASLMechanisms: DIGEST-MD5
supportedSASLMechanisms: CRAM-MD5
supportedSASLMechanisms: NTLM
supportedSASLMechanisms: PLAIN
supportedSASLMechanisms: LOGIN

我确实看不到列表中包含的 EXTERNAL。我这里遗漏了什么?

这是在 Ubuntu-12.04 和 slapd-2.4.31 上。

答案1

如果无法访问正在运行的配置,您将不得不停止slapd并离线编辑配置。

  1. 停止slapdservice slapd stop
  2. 将配置数据库转储到文本文件:slapcat -F /etc/ldap/slapd.d -b cn=config -l config.ldif
  3. 将现有的配置数据库移开:mv /etc/ldap/slapd.d{,.old}
  4. 创建一个新的、空的配置数据库:

    mkdir /etc/ldap/slapd.d chown --reference=/etc/ldap/slapd.d.old /etc/ldap/slapd.d chmod --reference=/etc/ldap/slapd.d.old /etc/ldap/slapd.d

  5. 编辑转储config.ldif以删除您的olcSecurity设置(或添加olcRootDNolcRootPWcn=config,或任何其他您喜欢的更改)
  6. 将编辑后的 ​​LDIF 加载到新的空数据库中:slapadd -F /etc/ldap/slapd.d -b cn=config -l config.ldif

(以上假设您的配置位于/etc/ldap/slapd.d,这是 Debian 和 Ubuntu 中的默认设置。)

请注意,slapadd完整的 LDIF 应始终在空数据库中完成;因此,如果您犯了错误并slapadd失败了,请确保在重试之前清除部分数据库。

您可以在以下位置找到更多信息OpenLDAP 管理指南以及相关的手册页。

答案2

查看代码:在服务器端,服务器/slapd/daemon.c,在传入连接建立后不久,使用 uid 和 gid 设置 EXTERNAL 的 authid accept()。稍后,在服务器/slapd/connection.c如果 TLS 处于活动状态,它会用客户端证书中的名称覆盖该名称。由于您没有提供客户端证书,此时 authid 将被 NULL 覆盖,导致 EXTERNAL 不可用。

简而言之,如果 TLS 处于活动状态,则不使用 uid+gid authid。根据您的观点,这可以被视为一个错误;理想情况下,它会回退到 peercred ID。

也就是说,ldapi 上的 TLS 确实没有必要,因为本地套接字已经提供了完全的隐私;所以你可以olcSecurity只在自己的数据库上设置,而不要为前端设置它cn=config(参见例如这个帖子),或者您可以使用ssf=代替tls=并进行olcLocalSSF适当设置。或者,您可以使用不同的 DN 作为 的管理员cn=config,以便不依赖 peercred 功能。

答案3

谢谢 rtandy。我真的不想在 ldapi 上设置它,但不知道它也会受到影响。

问题是 EXTERNAL 是我可以修改的唯一方法,因此cn=config由于我失去了该访问权限并且没有cn=config按照建议创建另一个管理员,还有其他方法可以解决这个问题吗?

答案4

在我的系统上激活 starttls 后,使用 ldappi:/// 而不是 ldap:// 解决了这个问题

sudo ldapmodify -Y EXTERNAL -H ldapi://  -f pwd2.ldif 

起作用,而

sudo ldapmodify -Y EXTERNAL -f pwd2.ldif 

已报告

SASL/EXTERNAL 身份验证已启动 ldap_sasl_interactive_bind_s:未知身份验证方法 (-6) 附加信息:SASL(-4):没有可用机制:

相关内容