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.