LDAP Tool Box Project Self Service Password
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!!!
Show de bola seu artigo Geowany! Agora é dobrar as mangas e mãos a obra.