LDAP Tool Box Project Self Service Password

ltb-project_logo

O que é o LTB Self Service Password?

Quando eu estava a planejar uma implementação de servidor LDAP, pensei num problema bastante inconveniente que é o esquecimento de senha. Imagine uma horda de usuários invadindo a sua sala todos os dias para redefinir senha! Então, ao buscar por soluções, encontrei o LDAP Account Manager que possuia um módulo “Pro” para resetar senhas, mas esse era proprietário e fui obrigado a descartá-lo. Então, encontrei um projeto com um slogan bastante interessante: “LDAP Tool Box project, even LDAP administrators need help” , que em uma tradução livre significa “Projeto LDAP Tool Box, até mesmo os administradores LDAP precisam de ajuda”.

O LDAP Tool Box Project, ou simplesmente LTB, é uma compilação de ferramentas para administradores LDAP que visam facilitar a sua vida difícil. Entre tantas ferramentas, estava o Self Service Password (SSP) que é uma aplicação em PHP que permite aos usuários mudarem suas senhas em um diretório LDAP. Seus principais recursos são: política de senhas, redefinição por email, questão ou SMS e tem até recaptcha do Google.

Preparando o ambiente

O ambiente do servidor SSP será preparado em outro servidor separado do servidor LDAP.

Vamos supor que o fqdn do servidor seja meuid.dominio.local

No Debian Wheezy, instale os pacotes necessários:

# apt-get install apache2 php5 -y
# apt-get install php5-ldap
# apt-get install php5-mcrypt

Ative o módulo SSL no apache para que seus usuários executem a troca de senha através de uma conexão segura:

# a2ensite default-ssl
# a2enmod ssl
# /etc/init.d/apache2 restart

Force os usuários a serem direcionados de http para https adicionando as seguintes opções no arquivo 000-default:

# vim /etc/apache2/sites-enabled/000-default
...
 RedirectPermanent / https://meuid.dominio.local/
 UseCanonicalName Off

Instalando o SSP

Baixe a última versão do SSP na seção de downloads do site do projeto <http://ltb-project.org/>:

# wget -c http://tools.ltb-project.org/attachments/download/497/ltb-project-self-service-password-0.8.tar.gz

Descompacte o arquivo e mova o conteúdo para o diretório raíz do apache:

# tar zxvf ltb-project-self-service-password-0.8.tar.gz
# mv ltb-project-self-service-password-0.8/* /var/www/
# chown root.root -Rfv /var/www/

Pronto! O SSP está instalado e já estará acessível no endereço http://meuid.dominio.local

Configurando

O arquivo de configuração é comentado, portanto, torna-se uma ação bastante intuitiva.

# vim /var/www/conf/config.inc.php

No meu caso, o arquivo ficou assim:


Conectando via SSL

Caso tenha habilitado o TLS no servidor LDAP, é interessante que instale a ferramenta ldap-utils para executar alguns testes:

# apt-get install ldap-utils

Copiar o certificado auto-assinado da CA criado no servidor LDAP para o servidor SSP (no caso, em /etc/ldap/tls/cacert.pem).

Atenção: Não tive sucesso em conectar o SSP no LDAP por START_TLS. Portanto, no servidor LDAP, você deve ativar o serviço na depreciada porta ldaps para conectar por SSL. =(

Assim, faça a seguinte alteração:

# vim /etc/default/slapd
SLAPD_SERVICES="ldap:/// ldapi:/// ldaps:///"

Editar o arquivo de configuração do LDAP necessário para a conexão.

# vim /etc/ldap/ldap.conf
#
# LDAP Defaults
#
 # See ldap.conf(5) for details
# This file should be world readable but not world writable. 
BASE    dc=dominio,dc=local
#URI    ldap://ldap.example.com ldap://ldap-master.example.com:666
URI     ldaps://ldap.dominio.local
 #SIZELIMIT      12
#TIMELIMIT      15
#DEREF          never # TLS certificates (needed for GnuTLS)
#TLS_CACERT     /etc/ssl/certs/ca-certificates.crt
TLS_CERT /etc/ldap/tls/cacert.pem
TLS_REQCERT allow

Executar o teste:

# ldapsearch -x

Enviando email através de um servidor que exija autenticação

Caso seu servidor de email (de preferência um Zimbra 😀 ) exija autenticação, e eu espero que sim, instale a classe phpmailer para que seja possível enviar o “token” para o email do usuário:

# apt-get install libphp-phpmailer

Edite o arquivo index.php adicionando mais uma opção logo no início do arquivo na parte de “includes”:

# vim /var/www/index.php
require_once("libphp-phpmailer/class.phpmailer.php");

Alterar a função send_mail() da seguinte forma:

# vim /var/www/lib/functions.inc.php
function send_mail($mail, $mail_from, $subject, $body, $data) {      $result = false;      if (!$mail) {         error_log("send_mail: no mail given, exiting...");         return $result;     }      /* Replace data in mail, subject and body */     foreach($data as $key => $value ) {         $mail = str_replace('{'.$key.'}', $value, $mail);         $mail_from = str_replace('{'.$key.'}', $value, $mail_from);         $subject = str_replace('{'.$key.'}', $value, $subject);         $body = str_replace('{'.$key.'}', $value, $body);     }      /* Encode the subject */     mb_internal_encoding("UTF-8");     $subject = mb_encode_mimeheader($subject);      /* Set encoding for the body */     $header = "MIME-Version: 1.0\r\nContent-type: text/plain; charset=UTF-8\r\n";      /* envio de email */     $pmail = new PHPMailer();     $pmail->IsSMTP();     $pmail->SMTPSecure = "tls";     $pmail->SMTPAuth = true;     $pmail->CharSet = "utf-8";     $pmail->Host = "mail.dominio.local";     $pmail->Username = "registro";     $pmail->Password = "senha";     $pmail->SMTPDebug = 0;     $pmail->Port = 587;     $pmail->From = "$mail_from";     $pmail->Sender = "registro@dominio.local";     $pmail->FromName = "Registro - Instituição X";     $pmail->AddAddress("$mail");     $pmail->IsHTML(true);     $pmail->Subject = $subject;     $pmail->Body = $body;     $pmail->AltBody = $body;      $result = $pmail->Send();     $pmail->ClearAllRecipients();      /* Send the mail */     //if ($mail_from) {     //    $result = mail($mail, $subject, $body, $header."From: $mail_from\r\n","-f$mail_from");     //} else {     //    $result = mail($mail, $subject, $body, $header);     //}      return $result;  }

Espero que facilite a sua vida.

Ah! Gostaria de agradecer o Marcos Thomaz pela ajuda com o PHPMailer. Valeu PythonMan!!!