我正在尝试设置本地 LDAP 实例,以便可以调试一些使用 LDAP 进行身份验证的软件。我在 Ubuntu 14.04 LTS 上可以正常工作,但尝试升级到 Ubuntu 16.04 LTS 时却被 box 破坏了,我重新安装了 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 根密码。但是,在重新配置之前和之后,我都遇到了同样的错误。这是用于填充数据库的原始文件:
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
当然,包含我的真实姓名,并包含生成的 SSHA 字符串slappasswd
。
此刻,我不知道为什么它不起作用以及问题出在哪里。
答案1
因此,问题似乎是密码加载的方式让我不知道它们或它们丢失了。我能够有效地重置,首先是 LDAP 管理员密码,然后是使用 ldapmodify 命令重置用户帐户密码。我在下面列出了我所做的事情,希望它能帮助其他人。
重置 LDAP 管理员密码
首先,我使用 slappasswd 生成密码哈希。
root@laptop:/etc/ldap/slapd.d# slappasswd
New password:
Re-enter new password:
{SSHA}<hash redacted>
接下来,我需要找到设置管理员密码的位置。我这样做了:
root@laptop:/etc/ldap/slapd.d# ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b cn=config olcRootDN=cn=admin,dc=nodomain dn olcRootDN olcRootPW
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
dn: olcDatabase={1}mdb,cn=config
olcRootDN: cn=admin,dc=nodomain
olcRootPW: {SSHA}<hash redacted>
您的 dc 在命令中可能会有所不同,具体取决于您的设置方式。希望我能给出比这更好的答案,说明您的 dc 应该是什么,但我并不完全了解 LDAP。基本上,我所做的一切都是在 dc=nodomain 下进行的。您的配置可能会有所不同。
接下来,我使用 ldapmodify 将管理员密码重置为我知道的密码。请注意,我输入了命令和以“dc:”、“replace:”和“olcRootPw:”开头的行。您需要在最后一行后面添加一个空行,以使 ldapmodify 应用前面的命令。
root@laptop:/etc/ldap/slapd.d# ldapmodify -Y EXTERNAL -H ldapi:///
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
dn: olcDatabase={1}mdb,cn=config
replace: olcRootPW
olcRootPW: {SSHA}<new hash from slappasswd>
该oldcDatabase
值是从ldapsearch
命令中提取的,您的值可能与我的值不同。如果搜索结果中没有以前的 olcRootPw,您可能需要在上面的修改命令中使用add
而不是。replace
Ctrl-C 结束我们的 ldapmodify 会话。
现在我有一个知道的 LDAP 管理员密码,可以继续重置用户帐户。
重置 LDAP 用户密码
我使用 slappasswd 为用户密码生成新的密码哈希值。此命令对于两次密码重置都相同。
root@laptop:/etc/ldap/slapd.d# slappasswd
New password:
Re-enter new password:
{SSHA}<hash redacted>
接下来,我运行了 ldapmodify 命令,但这次略有不同:
ldapmodify -H ldapi:/// -D "cn=admin,dc=nodomain" -W
该-D
选项告诉 LDAP 我以管理员身份运行(或 -D 后面引号中的任何人)。dc
当然,您的值可能不同。该-W
选项告诉 LDAP 提示我输入管理员密码。
输入 LDAP 管理员密码(我在上面重置过)后,我输入了设置用户密码的命令。以下是我运行的内容:
dn: uid=smm,ou=People,dc=nodomain
add: userPassword
userPassword: {SSHA}<new password hash>
第一行是 dn,用于指定哪个用户需要重置密码。第二行是命令(add
如果未设置 userPassword)或replace
命令(如果已设置 userPassword)。第三行是 LDAP 应使用的新密码哈希。在第三行后输入一个空白行,以告知 ldapmodify 您已完成输入命令并且应该运行该命令。希望您得到如下结果:
modifying entry "uid=smm,ou=People,dc=nodomain"
现在我的用户也有一个新密码了。