我使用以下 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
并离线编辑配置。
- 停止
slapd
:service slapd stop
- 将配置数据库转储到文本文件:
slapcat -F /etc/ldap/slapd.d -b cn=config -l config.ldif
- 将现有的配置数据库移开:
mv /etc/ldap/slapd.d{,.old}
创建一个新的、空的配置数据库:
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
- 编辑转储
config.ldif
以删除您的olcSecurity
设置(或添加olcRootDN
和olcRootPW
到cn=config
,或任何其他您喜欢的更改) - 将编辑后的 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):没有可用机制: