我正在尝试设置一个本地 LDAP 实例,以便调试一些使用 LDAP 进行身份验证的软件。我让这个在 Ubuntu 14.04 LTS 上正常工作,但是试图通过盒子升级到 Ubuntu 16.04 LTS,我重新安装了从头开始的 Ubunut 16.04 LTS,并且在非常沮丧之后无法让 LDAP 正常工作。
我安装了 slapd 并用于slapadd -l <file>
填充我的数据库。我可以看到我的文件已加载ldapsearch -x
:
# extended LDIF
#
# LDAPv3
# base <dc=nodomain> (default) with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
# nodomain
dn: dc=nodomain
objectClass: top
objectClass: dcObject
objectClass: organization
o: nodomain
dc: nodomain
# admin, nodomain
dn: cn=admin,dc=nodomain
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
# People, nodomain
dn: ou=People,dc=nodomain
objectClass: organizationalUnit
ou: People
# Groups, nodomain
dn: ou=Groups,dc=nodomain
objectClass: organizationalUnit
ou: Groups
# miners, Groups, nodomain
dn: cn=miners,ou=Groups,dc=nodomain
objectClass: posixGroup
cn: miners
gidNumber: 5000
# smm, People, nodomain
dn: uid=smm,ou=People,dc=nodomain
uid: smm
sn: McCants
givenName: Stephen
cn: Stephen McCants
displayName: Stephen McCants
uidNumber: 10000
gidNumber: 5000
gecos: Stephen McCants
loginShell: /bin/bash
homeDirectory: /home/smm
objectClass: top
objectClass: posixAccount
objectClass: shadowAccount
objectClass: inetOrgPerson
objectClass: person
# search result
search: 2
result: 0 Success
# numResponses: 7
# numEntries: 6
但是,我的代码无法针对用户 'smm' 进行身份验证,并且我无法为用户设置密码ldappasswd -D "uid=smm,ou=People,dc=nodomain" -A -S -W
。它提示我输入密码,然后失败并出现相同的错误:
Old password:
Re-enter old password:
New password:
Re-enter new password:
Enter LDAP Password:
ldap_bind: Invalid credentials (49)
我还用来dpkg-reconfigure slapd
设置 LDAP root 密码。但是,在重新配置之前和之后,我都会遇到同样的错误。这是用于填充数据库的原始文件:
n: ou=People,dc=nodomain
objectClass: organizationalUnit
ou: People
structuralObjectClass: organizationalUnit
entryUUID: 03a28690-1834-1033-87f5-8b9136017cf0
creatorsName: cn=admin,dc=nodomain
createTimestamp: 20140123043856Z
entryCSN: 20140123043856.559226Z#000000#000#000000
modifiersName: cn=admin,dc=nodomain
modifyTimestamp: 20140123043856Z
dn: ou=Groups,dc=nodomain
objectClass: organizationalUnit
ou: Groups
structuralObjectClass: organizationalUnit
entryUUID: 03b017e2-1834-1033-87f6-8b9136017cf0
creatorsName: cn=admin,dc=nodomain
createTimestamp: 20140123043856Z
entryCSN: 20140123043856.648148Z#000000#000#000000
modifiersName: cn=admin,dc=nodomain
modifyTimestamp: 20140123043856Z
dn: cn=miners,ou=Groups,dc=nodomain
objectClass: posixGroup
cn: miners
gidNumber: 5000
structuralObjectClass: posixGroup
entryUUID: 03b537ae-1834-1033-87f7-8b9136017cf0
creatorsName: cn=admin,dc=nodomain
createTimestamp: 20140123043856Z
entryCSN: 20140123043856.681730Z#000000#000#000000
modifiersName: cn=admin,dc=nodomain
modifyTimestamp: 20140123043856Z
dn: uid=smm,ou=People,dc=nodomain
uid: smm
sn: <my name>
givenName: <my name>
cn: <my name>
displayName: <my name>
uidNumber: 10000
gidNumber: 5000
gecos: <my name>
loginShell: /bin/bash
homeDirectory: /home/smm
structuralObjectClass: inetOrgPerson
entryUUID: 983bd260-1835-1033-87fb-8b9136017cf0
creatorsName: cn=admin,dc=nodomain
createTimestamp: 20140123045015Z
objectClass: top
objectClass: posixAccount
objectClass: shadowAccount
objectClass: inetOrgPerson
objectClass: person
userPassword: <redacted>
entryCSN: 20140123054441.631096Z#000000#000#000000
modifiersName: cn=admin,dc=nodomain
modifyTimestamp: 20140123054441Z
当然,包含我的真实姓名并包含由slappasswd
.
在这一点上,我不知道为什么它不起作用以及问题是什么。
因此,问题似乎在于密码以我不知道或丢失的方式加载。我能够有效地重置,首先是 LDAP 管理员密码,然后是使用 ldapmodify 命令的用户帐户密码。我在下面列出了我所做的事情,希望对其他人有所帮助。
重置 LDAP 管理员密码
首先,我使用 slappasswd 生成了密码哈希。
接下来,我需要找到设置管理员密码的位置。我这样做了:
您的 dc 在命令中可能会有所不同,具体取决于您的设置方式。希望我能给出一个比这更好的答案,关于你应该是什么,但我并不完全理解 LDAP。基本上,我所做的一切都在 dc=nodomain 下。您的配置可能会有所不同。
接下来,我使用 ldapmodify 将管理员密码重置为我知道的密码。请注意,我输入了命令和以“dc:”、“replace:”和“olcRootPw:”开头的行。您需要在最后一行之后放置一个空行,以使 ldapmodify 应用前面的命令。
该
oldcDatabase
值是从ldapsearch
命令中提取的,您的值可能与我的不同。如果搜索结果中没有以前的 olcRootPw,您可能需要在上面的修改命令中使用add
而不是。replace
Ctrl-C 结束我们的 ldapmodify 会话。
现在我有一个我知道的 LDAP 管理员密码,可以继续重置用户帐户。
重置 LDAP 用户密码
我使用 slappasswd 为用户密码生成一个新的密码哈希。此命令对于两次密码重置都是相同的。
接下来,我运行了 ldapmodify 命令,但这次有点不同:
该
-D
选项告诉 LDAP 我以管理员身份运行(或 -D 后引号中的任何人)。当然,您的dc
价值可能会有所不同。该-W
选项告诉 LDAP 提示我输入管理员密码。输入 LDAP 管理员密码(我在上面重置)后,我给出了设置用户密码的命令。这是我跑的:
第一行是 dn,用于指定哪个用户需要重置密码。
add
如果未设置 userPassword,则第二行是命令,如果replace
已设置 userPassword,则为命令。第三行是 LDAP 应该使用的新密码哈希。在第三行之后输入一个空行,告诉 ldapmodify 您已完成输入命令并且它应该运行它。希望你得到如下结果:现在我也为我的用户设置了一个新密码。