我在使用运行时配置 (cn=config) 修改 OpenLDAP 安装的架构时遇到了麻烦。我想做的是修改现有属性并将新属性添加到自定义架构。当我尝试应用更改时,我收到的错误是“没有这样的对象”或“没有这样的值”。使用 JXplorer 浏览器时,错误是:
javax.naming.NameNotFoundException: [LDAP: error code 32 - No Such Object]; remaining name 'cn={15}mySchema,cn=schema,cn=config'
从命令行对 ldif 文件使用 ldapmodify 会引发相同的错误:
ldapmodify -h ldap://localhost/cn=config -x -p 389 -D cn=admin,cn=config -W -f modify.ldif
modifying entry "cn={15}mySchema,cn=schema,cn=config"
ldap_modify: No such object (32)
但奇怪的是,即使出现此错误,更改仍会提交给 slapd 服务的当前实例。例如,如果我添加了新属性并修改了对象以包含这些属性,那么这些属性在使用该对象的条目中可用。我可以继续仿佛更改已生效。但是,如果重新启动 slapd 服务,则更改将被恢复。
如果我删除 ldif 文件中 DN 的前导 {15} 或属性值上的类似前缀,我会收到相同的错误(尽管可能由于不同的原因):
modifying entry "cn=mySchema,cn=schema,cn=config"
ldap_modify: No such object (32)
matched DN: cn=schema,cn=config
此外,我可以毫无问题地修改 cn=config 的其他条目(例如 olcDatabase={-1}frontend,cn=config),并且更改在服务重启后仍然有效。只有当我尝试修改 cn=schema,cn=config 下的条目时才会发生错误。
服务器运行的是 CentOS 6.2,64 位,使用 OpenLDAP 2.4.23,通过 yum 安装。我尝试了多种浏览器(JXplorer、Softerra LDAP Administrator)以及命令行,结果都一样。slapd.d 目录的所有者/组是 ldap/ldap,即使将架构文件的权限修改为 777,也不会有任何变化。在端口 636 上使用 TLS(浏览器或命令行)也没有任何效果。
有人可以对此进行一些解释并解释什么可能阻止我通过 cn=config 修改模式吗?
编辑:这是modify.ldif的内容:
dn: cn={15}mySchema,cn=schema,cn=config
changetype: modify
add: olcAttributeTypes
olcAttributeTypes: ( 1.3.6.1.4.00000.2.3.14 NAME 'myTest' DESC 'This is only a test' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} )
我们使用公司的 PEN 代替 00000,并且没有其他属性使用该 OID。我发现在属性值中添加数字前缀没有什么区别,但是前缀对于 DN 来说是必需的;如果没有它,错误就是它所说的,目录不会被修改。
答案1
如果条目中还有其他属性,olcAttributeTypes
那么您必须执行replace
不add
并列出 LDAP 中已有的所有其他属性。
尝试使用ldapvi
它进行编辑,它会自动完成。
编辑:如果这不起作用,那么您需要停止slapd
并手动编辑文件/etc/ldap/slap.d/
。当更改相对频繁时,这肯定不是一个解决方案...
编辑架构cn=config
是一项新功能,您可能发现了一个错误(可能已在最新版本中修复)。检查 OpenLDAP 变更日志并尝试使用最新版本。
答案2
我在 Ubuntu 上的 OpenLDAP 中仍然看到同样的行为。我一直试图替换 OpenLDAP 实例上的 SSL 证书,但发现 Ubuntu wiki 站点上的说明不起作用:
https://help.ubuntu.com/lts/serverguide/openldap-server.html#openldap-tls
具体来说,这些说明:
创建包含以下内容的文件 certinfo.ldif(请进行相应调整,我们的示例假设我们使用以下方式创建证书 https://www.cacert.org):
dn: cn=config changetype: modify replace: olcTLSCACertificateFile olcTLSCACertificateFile: /etc/ssl/certs/cacert.pem - replace: olcTLSCertificateFile olcTLSCertificateFile: /etc/ssl/certs/ldap01_slapd_cert.pem - replace: olcTLSCertificateKeyFile olcTLSCertificateKeyFile: /etc/ssl/private/ldap01_slapd_key.pem
使用 ldapmodify 命令通过 slapd-config 数据库告诉 slapd 我们的 TLS 工作:
sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f /etc/ssl/certinfo.ldif
(请注意,我已经将原始的添加命令更改为替换,但是原始的添加命令在全新安装时也不起作用)。
我在这个 CentOS 网站上找到了一份技术说明:
2.2.2.2. 修改配置条目和属性的限制
修改服务器条目和属性时存在某些限制:
The cn=monitor entry and its child entries are read-only and cannot be modified, except to manage ACIs. If an attribute is added to cn=config, the server ignores it. If an invalid value is entered for an attribute, the server ignores it. Because ldapdelete is used for deleting an entire entry, use ldapmodify to remove an attribute from an entry.
这条注释好像是在说您不能使用 ldapmodify 向 cn=config 添加属性。我以为您修改 cn=config 的方式是使用 ldapmodify。
我看到其他帖子似乎也表明了这种情况。我已在 OpenLDAP 邮件列表中提出了一个问题,并将根据收到的任何答案更新我的帖子。