Sincronizando Bases OpenLDAP e Active Directory

O objetivo do artigo é a centralização da base de usuários, ou seja, por um fim a vários logins e senhas de uma rede com vários serviços autenticados. Abordarei um cenário que replica alterações na base OpenLDAP para o Active Directory.

[ Hits: 56.056 ]

Por: Evandro Nabor em 14/02/2013


Senhas



O único problema da solução é com relação às senhas, pois não é possível empurrar os Hashs dos usuários do OpenLDAP para dentro do Active Directory, já que este usa um tipo diferente de Hash. Também não é possível ler senhas do Active Directory.

A solução que encontrei para este caso, foi a padronização de uma tela para os usuários alterarem suas senhas. Esta tela pode ser uma página em PHP que insira o Hash da senha digitada, tanto na base OpenLDAP quanto no Active Directory.

Existem muitos tutoriais sobre como desenvolver uma página desse tipo para inserir a senha no OpenLDAP. Para o Active Directory, chame esse script em sua página com os devidos parâmetros (créditos a: www.barncrew.com) que ele irá inserir a senha de maneira correta na base:

# chpass_ad.pl
#
# Para usar: ./chpass_ad.pl usuario senha
#
#!/usr/bin/perl -w


use Net::LDAP;
use Unicode::String qw(utf8);

# ARGV dos parametros usuario e senha
my $username = $ARGV[0];
my $passwd = $ARGV[1];

### ActiveDirectory Server
my $adsvr='172.31.1.99';
my $adbinddn='cn=LSC,cn=users,dc=texas,dc=local';
my $adpw='3v4ndrO';

########## ActiveDirectory #############
# Conecta do AD

my $ad=Net::LDAP->new($adsvr,
   version => 3,
   scheme => 'ldaps',
   port => 636,
   )
or die "nao eh possivel conectar $adsvr: $@";

# faz a busca com o usuario passado
$result=$ad->bind($adbinddn, password=>$adpw);

# procura o usuario q sera trocada senha
$result = $ad->search(
   base => "cn=users,dc=texas,dc=local",
   filter => "(samAccountName=$username)",
   attrs => ['distinguishedName']
   );

$result->code && die $result->error;
if ($result->entries != 1 ) { die "ERRO: Usuario nao encontrado no AD: $username" };

my $entry = $result->entry(0);
my $dnad = $entry->get_value('distinguishedName');
my $unicodePwd = utf8(chr(34).$passwd.chr(34))->utf16le();

# muda a senha !
$result = $ad->modify(
$dnad,
   replace => {
     unicodePwd  => $unicodePwd,
   }
);

$result->code && die $result->error;
print "AD : FEITO: ${username} password mudado.\n";

$ad->unbind();

Conclusão

A solução proposta é capaz de resolver problemas em redes que precisam de centralização de usuários quando a necessidade de operação com bases diferentes é imprescindível.

Os parâmetros usados nos programas envolvidos foram preparados para o cenário proposto, mas, posteriores alterações podem e devem ser feitas para correta implementação em um ambiente de produção.

Página anterior    

Páginas do artigo
   1. Introdução
   2. Instalação e configuração
   3. Iniciando a sincronização
   4. Senhas
Outros artigos deste autor

Bind consultando zonas em base LDAP

Leitura recomendada

Instalando Servidor RackTables para Documentação de Rede

Asterisk - Configuração de Ramais SIP

VOIP - Interceptando tráfego de pacotes

Servidor DNS: Debian 9 Stretch

Asterisk - Configuração de conferência com PIN

  
Comentários
[1] Comentário enviado por jfernandes em 16/02/2013 - 18:01h

Amigo, parabéns pelo artigo.
Tenho uma questão pra todos ...
Tenho um cliente que tem sua base em LDAP, e por enquanto não quer migrar para o AD da Microsoft, porém, contudo, todavia, ele quer uma solução que vamos instalar ( Xen Desktop ) que precisa do Active Directory da Microsoft para autenticação de seus usuários, não sei se conhecem o Xen Desktop, mas é uma solução de virtualização de estação de trabalho, e necessita de um login no AD.
Pergunta..... com esse seu tutorial, poderei implementar essa solução no cliente ?
Fico no aguardo, e mais uma vez, parabéns pelo artigo.
Joel Fernandes

[2] Comentário enviado por evandronabor em 17/02/2013 - 09:59h

Com certeza voce poderá usa-lo para isso.
Voce pode subir um servidor AD e seguir o meu artigo que todas as suas contas do OpenLDAP serão replicadas para o AD.
Quando a base estiver replicada é so voce colocar o comando de sincronização no crontab para ser executada quando voce quiser para manter a integridade das bases.

A unica questao que é preciso atençao é com relação as senhas pois como eu havia dito não é possivel sincroniza-las.
De uma boa lida no artigo e porcure mais informações no site do LSC. é possivel sim implementa-lo do jeito que voce precisa sem problemas.

Att.

[3] Comentário enviado por fernandofrauches em 22/02/2013 - 09:41h

Parabéns pelo artigo....
Muito bom...
Estou com um problema aqui na empresa relacionado a seu artigo.
No seu artigo vc faz a sincronização nesse sentido OpenLDAP -> Active Directory, é possivel fazer a sincronização no sentido contrario? OpenLDAP <- Active Directory? Se sim, tem alguma dica de como?
Desde ja obrigado.

[4] Comentário enviado por evandronabor em 22/02/2013 - 09:48h

Sim é possivel fazer. Basicamente voce vai inverter o SRC e o DST, verifique no site do LSC tem muitos exemplos de como fazer lá.

[5] Comentário enviado por acunhasp em 26/02/2013 - 14:13h

bom tarde amigo, o meu retorna o seguinte erro:
Error opening the LDAP connection to the destination!
Fev 26 14:05:23 - ERROR - Error while synchronizing ID {uid=edsonb}: java.lang.RuntimeException: java.lang.RuntimeException: Error getting context DN from LDAP provider url
Será que pode me ajudar?

[6] Comentário enviado por lanzao em 10/09/2013 - 12:09h

tem como migrar do ad para o ldap?

[7] Comentário enviado por geowany em 12/03/2014 - 00:51h


[1] Comentário enviado por jfernandes em 16/02/2013 - 18:01h:

Amigo, parabéns pelo artigo.
Tenho uma questão pra todos ...
Tenho um cliente que tem sua base em LDAP, e por enquanto não quer migrar para o AD da Microsoft, porém, contudo, todavia, ele quer uma solução que vamos instalar ( Xen Desktop ) que precisa do Active Directory da Microsoft para autenticação de seus usuários, não sei se conhecem o Xen Desktop, mas é uma solução de virtualização de estação de trabalho, e necessita de um login no AD.
Pergunta..... com esse seu tutorial, poderei implementar essa solução no cliente ?
Fico no aguardo, e mais uma vez, parabéns pelo artigo.
Joel Fernandes


Acredito que instalar o AD não é a melhor solução. Já tentou colocar o samba.schema nesse ldap e adicionar os atributos na contas de usuário para que se tornem samba accounts? Assim fica compatível com os atributos necessários do AD.


Contribuir com comentário