ldap no Ubuntu 16.04 – Credenciais inválidas (49)

ldap no Ubuntu 16.04 – Credenciais inválidas (49)

Estou tentando configurar uma instância LDAP local para poder depurar alguns softwares que usam LDAP para autenticação. Eu tinha isso funcionando corretamente no Ubuntu 14.04 LTS, mas tentando atualizar para o Ubuntu 16.04 LTS desativado por caixa e reinstalei do zero o Ubunut 16.04 LTS e não consigo fazer o LDAP funcionar corretamente depois de muita frustração.

Instalei o slapd e usei slapadd -l <file>para preencher meu banco de dados. Posso ver que meu arquivo foi carregado com 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

No entanto, meu código não pode ser autenticado no usuário 'smm' e não consigo definir uma senha para o usuário com ldappasswd -D "uid=smm,ou=People,dc=nodomain" -A -S -W. Ele solicita as senhas e falha com o mesmo erro:

Old password: 
Re-enter old password: 
New password: 
Re-enter new password: 
Enter LDAP Password: 
ldap_bind: Invalid credentials (49)

Eu também costumava dpkg-reconfigure slapddefinir uma senha root LDAP. No entanto, antes e depois da reconfiguração, recebo o mesmo erro. Aqui está o arquivo original que foi usado para preencher o banco de dados:

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

Claro, contém meu nome real e a string SSHA gerada por slappasswd.

Neste ponto, não sei por que não funciona e qual é o problema.

Responder1

Então, parece que o problema era que as senhas foram carregadas de uma forma que eu não as conhecia ou estavam faltando. Consegui redefinir efetivamente, primeiro a senha do administrador LDAP e depois a senha da conta do usuário usando o comando ldapmodify. Estou listando o que fiz abaixo na esperança de que ajude outra pessoa.

Redefinir senha de administrador LDAP

Primeiro, gerei o hash da senha com slappasswd.

root@laptop:/etc/ldap/slapd.d# slappasswd 
New password: 
Re-enter new password: 
{SSHA}<hash redacted>

Em seguida, precisei descobrir onde a senha do administrador foi definida. Eu fiz isso com:

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>

Seu dc pode ser diferente no comando, dependendo de como você configurou as coisas. Gostaria de poder dar uma resposta melhor do que essa sobre o que seu dc deveria ser, mas não entendo completamente o LDAP. Basicamente, tudo o que fiz foi em dc=nodomain. Você está configurado provavelmente será diferente.

Em seguida, usei o ldapmodify para redefinir a senha do administrador para algo que eu conheço. Observe que digitei o comando e as linhas que começam com "dc:", "replace:" e "olcRootPw:". Você precisa colocar uma linha em branco após a última linha para fazer com que o ldapmodify aplique os comandos anteriores.

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>

O oldcDatabasevalor é retirado do ldapsearchcomando e o seu pode ser diferente do meu. Se não houver um olcRootPw anterior nos resultados da pesquisa, talvez seja necessário usá-lo addem vez de replaceno comando de modificação acima.

Ctrl-C encerra nossa sessão ldapmodify.

Agora tenho uma senha de administrador LDAP que conheço e posso prosseguir com a redefinição de uma conta de usuário.

Redefinir senha do usuário LDAP

Usei o slappasswd para gerar um novo hash de senha para a senha do usuário. Este comando é o mesmo para ambas as redefinições de senha.

root@laptop:/etc/ldap/slapd.d# slappasswd 
New password: 
Re-enter new password: 
{SSHA}<hash redacted>

Em seguida, executei o comando ldapmodify, mas desta vez de forma um pouco diferente:

ldapmodify -H ldapi:/// -D "cn=admin,dc=nodomain" -W

A -Dopção informa ao LDAP que estou executando como administrador (ou quem está entre aspas depois de -D). Seu dcvalor pode ser diferente, é claro. A -Wopção diz ao LDAP para solicitar a senha do administrador.

Após inserir a senha do administrador LDAP (que redefini acima), dei o comando para definir a senha do usuário. Aqui está o que eu executei:

dn: uid=smm,ou=People,dc=nodomain
add: userPassword
userPassword: {SSHA}<new password hash>

A primeira linha é o dn para especificar qual usuário precisa de uma senha de redefinição. A segunda linha é um addcomando se userPassword não estiver definido ou um replacecomando se userPassword já estiver definido. A terceira linha é o novo hash de senha que o LDAP deve usar. Insira uma linha em branco após a terceira linha para informar ao ldapmodify que você concluiu a inserção do comando e ele deve executá-lo. Esperamos que você obtenha um resultado como:

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

Agora também tenho uma nova senha para meu usuário.

informação relacionada