web-dev-qa-db-ja.com

Ubuntu 16.04のLDAP-無効な資格情報(49)

認証にLDAPを使用するいくつかのソフトウェアをデバッグできるように、ローカルLDAPインスタンスをセットアップしようとしています。私はこれをUbuntu 14.04 LTSで正常に機能させていましたが、Ubuntu 16.04 LTSにアップグレードしようとすると、NubuntedでNubuntu 16.04 LTSを再インストールしました。

私は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

もちろん、私の実名とslappasswdによって生成されたSSHA文字列が含まれています。

この時点で、なぜ機能しないのか、何が問題なのか迷っています。

したがって、問題は、パスワードが私が知らない方法でロードされたか、欠落していたことでした。最初に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です。 2行目は、userPasswordが設定されていない場合はaddコマンド、userPasswordがすでに設定されている場合はreplaceコマンドです。 3行目は、LDAPが使用する新しいパスワードハッシュです。 3行目の後に空白行を入力して、コマンドの入力が完了し、コマンドを実行する必要があることをldapmodifyに伝えます。うまくいけば、次のような結果が得られます。

modifying entry "uid=smm,ou=People,dc=nodomain"

これで、ユーザーの新しいパスワードも取得できました。