quinta-feira, 14 de outubro de 2010

Autenticando no Active Directory com PHP via LDAP

Autenticando no Active Directory com PHP via LDAP

 Como tive muitos problemas para conseguir Autenticar no Active Directory via PHP estou postando o procedimento que achei e conseguir conectar, caso alguem precise ta aqui o exemplo. CREDITOS PARA KINN COELHÃO !
criado por Pablo Augusto
Tive muitas dificuldades para obter informações de como realmente o PHP se comunica com o LDAP, e de como implementar esta tecnologia em meu ambiente de trabalho, mas com um pouco de esforço (e algum conhecimento de inglês) consegui tornar esta uma realidade em minha empresa. Para outras pessoas, que como eu, queiram implementar esse tipo de autenticação esse artigo vai ser muito útil.

O que é o LDAP

O Lightweight Directory Access Protocol (LDAP) é um protocolo para acesso e modificação de informações de diretório através da rede. O LDAP permite que você localize pessoas, organizações, e outros recursos tais como arquivos e dispositivos na rede, seja na Internet ou numa Intranet.

Para entendermos melhor podemos tomar como comparação os programas de banco de dados. O MySQL, MSSQL Server e Oracle dentre tantos outros são SGBDs com características e definições próprias, mas para qualquer um a linguagem universal de comunicação e acesso a dados é o SQL. O LDAP nada mais é, do que a linguagem de comunicação entre qualquer aplicação com o Active Directory.

Mais informações sobre o LDAP:
- LDAP Zone http://www.ldapzone.com/
- ldapman.org http://www.ldapman.org/ apresenta alguns bons artigos introdutórios.
- The LDAP Schema Repository http://ldap.akbkhome.com/ esse é indispensável.

Isto depende muito do cenário tecnológico no qual que você se encontra. O requisito mínimo indispensável para que você possa desfrutar desta tecnologia, é ter acesso à um ambiente que conte com algum servidor da plataforma WINDOWS que ofereça o recurso do AD (Active Directory). Se você já não se enquadra neste requisito não há possibilidades, até onde conheço, para realizar tal tarefa.

O segundo requisito é você entender a estrutura do AD de seu domínio. No meu caso foi à parte realmente mais complicada pois, a empresa no qual trabalho tem uma arvore de AD muito vasta e complexa, contando com muitos usuários subdivididos em vários domínios e em suas respectivas Ous (Organizations Units). Se você não entende muito bem essa linguagem, recomendo que pesquise informações sobre como funciona o AD antes de prosseguir, abaixo seguem link de sites que podem ajudar no processo de aprendizado sobre o AD:

- http://www.microsoft.com/brasil/technet/centralwindows/centromigracao/activedirectory/gerenciando.mspx
- http://support.microsoft.com/default.aspx?scid=kb;en-us;325284

Agora que já conhece o PHP, LDAP e o AD, você tem respaldo suficiente para analisar (tomando como base o contexto no qual sua empresa ou cliente esta inserido) para avaliar se esta é a melhor solução a se adequar ao seu caso. Lembre-se cada caso é um caso, e por isso devemos analisar cuidadosamente todos os casos antes de definir qual o melhor método de autenticação para nossa(s) aplicação(ões).

Para ajudar a entender melhor tome como exemplo o meu caso:

Trabalho em uma empresa com rede corporativa com Windows 2003 Server e Active Directory integrado. Por definição da equipe de Segurança da Informação, todo e qualquer acesso as dados da empresa via computador, só é liberado após o login do usuário com sua CHAVE e SENHA de acesso; essa senha é indiscutivelmente de acesso pessoal e individual à cada usuário da empresa. A autenticação nada mais é do que uma conta no AD. Sendo assim podemos concluir que todo usuário que utilize um computador na empresa esta OBRIGATORIAMENTE autenticado no AD com sua chave e senha.



Sendo assim se para acessar qualquer informação ou aplicação dentro da rede da minha empresa o usuário já esta logado, a autenticação via LDAP me pareceu a mais vantajosa, pois não deixará de englobar nenhum usuário da empresa, bem como tornará o acesso corporativo.

Desta maneira ao alterar a senha no AD o usuário estará automaticamente “replicando” sua senha para todos as demais aplicações que tem a autenticação efetivada através do protocolo LDAP. Por esse dentre outros fatores achei que a melhor opção (neste caso) seria a autenticação via LDAP.

Agora imagine a seguinte situação:

Uma empresa outra também conta com um quadro praticamente igual ao da minha empresa, só a questão de CHAVES de usuário ela trata de forma bem diferente. Ao envés de cada usuário ter sua CHAVE de acesso, cada setor tem sua CHAVE. Imagine como seria se apenas um usuário de um dado setor tivesse de ter permissão em um determinado sistema. Nesse caso apenas a autenticação via LDAP no AD não seria suficiente, nós teríamos de implantar a parte, um outro nível de autenticação para verificar se além de ter acesso a CHAVE do setor o usuário tema cesso ao sistema.

Isso tornará um pouco mais trabalhoso o sistema de autenticação, e já que teremos de criar um banco de dados para cadastrar os usuários que terão esse “acesso em particular” ao sistema, por que não autenticar direto desse novo banco poupando código de programação e processamento autenticando do AD? São casos a se estudar e avaliar qual será a melhor opção a se adotar.

Espero que essa breve descrição tenha lhe ajudado a refletir se este tipo de autenticação é a melhor para o desenvolvimento de sua aplicação tomando por base os prós e contras.

Para poder habilitar o suporte ao LDAP em um ambiente com Apache/PHP é necessário seguir os seguintes passos:

- Abrir o arquivo php.ini e descomentar a linha:


;extension=php_ldap.dll

- Em seguida restartar o serviço do Apache

Acessando o AD com PHP



Primeiro para acessar um servidor AD devemos indicar ao PHP qual o servidor queremos conectar e criar uma conexão, para isso usamos a função:


ldap_connect(”server”);

O uso desta função é bem simples, abaixo segue um exemplo:

phpif (!($connect = @ldap_connect(”127.0.0.1”))) {
    die("Não foi possível se conectar com o servidor de AD");
} else {
    echo Conectado com sucesso !!!”;
}
?>

No exemplo acima $connect é a variável que irá receber o ponteiro da conexão caso o PHP consiga estabelecer uma conexão com o AD. Como pode ter observado “127.0.0.1” é o IP do servidor, mas também poderíamos se comunicar com o servidor AD pelo nome sem problemas

phpif (!($connect = @ldap_connect(”localhost”))) {
    die("Não foi possível se conectar com o servidor de AD");
} else {
    echo Conectado com sucesso !!!”;
}
?>

OBS: Não se esqueça que o parâmetro de connect(); tem de ser uma string.

Agora que já conectamos ao servidor é necessário efetuarmos a autenticação com o mesmo, para isso o php tem a função:

ldap_bind($connect, $user, $password);

Exemplo:

phpif (!($connect = @ldap_connect(”localhost”))) {
    die("Não foi possível se conectar com o servidor de AD");
} else {
    echo Conectado com sucesso !!!<br>”;
}
if (!($bind = @ldap_bind($connect, $usr, $ pass))) { 
    //se não validar 
    echo Usuário ou senha incorretos !!!”;
} else {
    //se validar 
    echo Usuário autenticado !!!”;
}
?>

Após ter conectado com o servidor o ponteiro para esta conexão é armazenado na variável $connect que é passado para a função ldap_bind();

Os outros dois parâmetros desta função são um usuário e uma senha válidos no AD. Uma observação importante é que usuário na verdade é composta da seguinte forma: "DOMÍNIO\USUARIO"

Caso o domínio da minha empresa seja "futura.com" e eu queira autenticar o usuário "rodrigo" o script ficaria da seguinte forma:

phpif (!($connect = @ldap_connect(”localhost”))) {
    die("Não foi possível se conectar com o servidor de AD");
} else {
    echo Conectado com sucesso !!!<br>”;
}
if (!($bind = @ldap_bind($connect, futura.com\rodrigo”, $ pass))) { 
    //se não validar 
    echo Usuário ou senha incorretos !!!”;
} else {
    //se validar 
    echo Usuário autenticado !!!”;
}
?>
Mais adiante publicarei um artigo sobre como recuperar qualquer dado do AD de um determinado usuário, como senha, data de expiração da conta, tipo de conta, e-mail, telefone, ou seja, qualquer dado de um usuário do AD que esteja disponível para consulta.



Abaixo segue apenas a função completa de autenticação de usuários para posterior utilização e estudo:


php/********************************************* 
Função de validação no AD via protocolo LDAP 
Pablo Augusto: olafekorkan@gmail.com 

como usar: 
valida_ldap("servidor", "domínio\usuário", "senha"); 

Obs: o usuário deve estar no formato "DOMINIO\USUARIO" 
*********************************************/ 
function valida_ldap($srv, $usr, $pwd)
{
    $ldap_server = $srv; 
    $auth_user = $usr; 
    $auth_pass = $pwd; 

    // Tenta se conectar com o servidor 
    if (!($connect = @ldap_connect($ldap_server))) {
        return FALSE;
    }

    // Tenta autenticar no servidor 
    if (!($bind = @ldap_bind($connect, $auth_user, $auth_pass))) { 
        // se não validar retorna false 
        return FALSE;
    } else {
        // se validar retorna true 
        return TRUE;
    }
} // fim função conectar ldap 
// EXEMPLO do uso dessa função
if (valida_ldap("meu_servidor", "meu_dominio\meu_usuario", "minhasenha")) {
    echo "usuário autenticado";
} else {
    echo "usuário ou senha inválida";
}
?>
 
----------------------------------------------------------------------------
 
Abraços !! 

Mailson Leal
Programador / Analista de Sistemas / Consultor de Rede de Computadores.

Nenhum comentário:

Postar um comentário