.png)
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 slapd
definir 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 oldcDatabase
valor é retirado do ldapsearch
comando 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 add
em vez de replace
no 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 -D
opção informa ao LDAP que estou executando como administrador (ou quem está entre aspas depois de -D). Seu dc
valor pode ser diferente, é claro. A -W
opçã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 add
comando se userPassword não estiver definido ou um replace
comando 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.