我正在尝试遵循几个关于设置 root LDAP 密码的教程(我们之前的系统管理员突然离开了),这些教程或多或少都说了同一件事:
- http://sysadminnotebook.blogspot.com/2014/06/change-root-dn-password-on-openldap.html
- https://tech.feedyourhead.at/content/openldap-set-config-admin-password
- https://www.linuxwave.info/2015/07/reset-openldap-default-admin-password.html
...但第一步就卡住了。这看起来很糟糕:
# ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b cn=config
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
No such object (32)
到目前为止我已经尝试过:
我可以通过从 slapd-config 文件中挖掘出该查询想要检索的数据来找到它:
# find /etc/ldap/slapd.d -type f -exec grep Root {} +
/etc/ldap/slapd.d/cn=config/olcDatabase={0}config.ldif:olcRootDN: cn=admin,cn=config
/etc/ldap/slapd.d/cn=config/olcDatabase={0}config.ldif:olcRootPW: {SSHA}[xxxxxx hash redacted xxxxxx]
/etc/ldap/slapd.d/cn=config/olcDatabase={1}hdb.ldif:olcRootDN: cn=admin,dc=example,dc=com
/etc/ldap/slapd.d/cn=config/olcDatabase={1}hdb.ldif:olcRootPW: {SSHA}[xxxxxx hash redacted xxxxxx]
并确认 slapd 在理论上已设置为读取这些文件:
# ps -ef | grep slapd
openldap 2244 1 0 Oct26 ? 00:00:16 /usr/sbin/slapd -h ldap:/// ldapi:/// ldaps:/// -g openldap -u openldap -F /etc/ldap/slapd.d
当我打开 ACL 日志记录(并从命令行运行;从 init.d 打开日志记录会使 slapd 在启动时挂起)时,我得到了以下信息:
5bdb2ef2 => access_allowed: search access to "cn=config" "entry" requested
5bdb2ef2 => acl_get: [1] attr entry
5bdb2ef2 => acl_mask: access to entry "cn=config", attr "entry" requested
5bdb2ef2 => acl_mask: to all values by "gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth", (=0)
5bdb2ef2 <= check a_dn_pat: *
5bdb2ef2 <= acl_mask: [1] applying none(=0) (stop)
5bdb2ef2 <= acl_mask: [1] mask: none(=0)
5bdb2ef2 => slap_access_allowed: search access denied by none(=0)
5bdb2ef2 => access_allowed: no more rules
有想法吗?
答案1
在许多现代 Linux 系统中,当安装了 openldap-server/slapd 时,由SASL/EXTERNAL
as标识的根目录gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
就是rootDN
或具有权限。manager
对于您现有的安装,目前情况并非如此。
如果您知道各种 rootDN 的密码,请使用它们。否则,将您的 rootDN(或其密码)替换为您可以使用的内容。您必须在 LDAP 之外通过编辑/etc/openldap/slapd.d/cn=config/olcDatabase={0}config.ldif
或等效程序并重新启动 slapd 来执行此操作。
答案2
我自己也曾遇到过这个问题,但对接受的答案并不满意,因为它指出了问题的原因,但在提供如何修复它的实际说明方面却非常有限。所以我继续搜索,然后偶然发现了这个问题。
前提
我喜欢使用这种 SASL/EXTERNAL 方法,当我尝试创建一个 docker 容器时,正确设置 slapd 是我的意图之一。问题是:如何设置访问权限。当使用选项选择的配置文件夹中不存在现有文件时,cn=config
容器会在首次启动时将一些初始 slapd.conf 文件转换为。因此必须有某种方法可以根据需要设置权限。cn=config
cn=config
-F
cn=config
分析
使用rootDN
似乎很奇怪,因为它是在不同的数据库范围内配置的,并且根据先前得到的cn=config
配置仍然绑定到不同的数据库。
此外,还cn=config
配置了授予none
所有人访问数据库中任何内容的权限cn=config
。检查文件/您的/配置/目录/cn = config / olcDatabase = {0} config.ldif:
# AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify.
# CRC32 e01f7658
dn: olcDatabase={0}config
objectClass: olcDatabaseConfig
olcDatabase: {0}config
olcAccess: {0}to * by * none
olcAddContentAcl: TRUE
olcLastMod: TRUE
olcMaxDerefDepth: 15
olcReadOnly: FALSE
olcRootDN: cn=config
olcSyncUseSubentry: FALSE
olcMonitoring: FALSE
structuralObjectClass: olcDatabaseConfig
entryUUID: a85462ad-0102-456d-a2d7-e6d082b7e613
creatorsName: cn=config
createTimestamp: 20190429143842Z
entryCSN: 20190429143842.339724Z#000000#000#000000
modifiersName: cn=config
modifyTimestamp: 20190429143842Z
它清楚地说明了这一点olcAccess: {0}to * by * none
,所以我很确定使用rootDN
也无济于事。
在现有的 LDAP 服务器中应用了不同的访问规则:
olcAccess: {0}to * by dn.exact=gidNumber=0+uidNumber=0,cn=peercred,cn=external
,cn=auth manage by * break
所以,这就是我所需要的!
解决方案
从 slapd.conf 转换为cn=config
slapd 时,其工具接受结果数据库的部分配置。olcDatabase={0}config
是名为 的数据库的结果 DN config
。因此,请在文件中添加该数据库的配置。以下摘录附加到我的 slapd.conf 文件末尾,已被采用来自之前链接的问题:
database config
access to *
by dn.exact="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" manage
by * read
不要忘记删除任何现有的配置文件夹cn=config
因此更新后的 slapd.conf 文件将再次转换为。