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: 54.855 ]

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

Tutorial hadoop - Guia prático de um cluster com 3 computadores

Ansible - Instalação em massa Agent Zabbix

Nagios enviando alertas via WhatsAPP

AWS - VPN IPSEC com Libreswan

Zoneminder: Substituindo um Unifi NVR

  
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




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts