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 possuía um módulo
Pro para resetar senhas, mas, esse era proprietário e me obrigou 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 e-mail, 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.
Obs.: 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
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
<VirtualHost *:80>
...
RedirectPermanent / https://meuid.dominio.local/
UseCanonicalName Off
</VirtualHost>
Reinicie o Apache:
# /etc/init.d/apache2 restart
Instalando o SSP
Baixe a última versão do SSP, na seção de downloads do site do projeto:
# 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
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:
<?php
$ldap_url = "ldaps://ldap.dominio.local";
$ldap_binddn = "cn=admin,dc=dominio,dc=local";
$ldap_bindpw = "123456";
$ldap_base = "dc=dominio,dc=local";
$ldap_login_attribute = "uid";
$ldap_fullname_attribute = "cn";
$ldap_filter = "(&(objectClass=person)($ldap_login_attribute={login}))";
$ad_mode = false;
$ad_options['force_unlock'] = false;
$ad_options['force_pwd_change'] = false;
$samba_mode = true;
$shadow_options['update_shadowLastChange'] = false;
$hash = "SSHA";
$pwd_min_length = 6;
$pwd_max_length = 128;
$pwd_min_lower = 0;
$pwd_min_upper = 0;
$pwd_min_digit = 0;
$pwd_min_special = 0;
$pwd_special_chars = "^a-zA-Z0-9";
$pwd_no_reuse = true;
$pwd_complexity = 0;
$pwd_show_policy = "onerror";
$pwd_show_policy_pos = "above";
$who_change_password = "user";
$use_questions = true;
$answer_objectClass = "extensibleObject";
$answer_attribute = "info";
$use_tokens = true;
$crypt_tokens = true;
$token_lifetime = "3600";
$mail_attribute = "mail";
$mail_from = "registro@dominio.local";
$notify_on_change = true;
$use_sms = false;
$sms_attribute = "mobile";
$smsmailto = "{sms_attribute}@service.provider.com";
$smsmail_subject = "Provider code";
$sms_message = "{smsresetmessage} {smstoken}";
$sms_token_length = 6;
$show_help = true;
$lang ="en";
$logo = "style/ltb-logo.png";
$debug = false;
$keyphrase = "secret";
$login_forbidden_chars = "*()&|";
$use_recaptcha = false;
$recaptcha_publickey = "";
$recaptcha_privatekey = "";
$recaptcha_theme = "white";
$recaptcha_ssl = false;
$default_action = "change";
?>
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 e-mail através de um servidor que exija autenticação:
Caso seu servidor de e-mail (de preferência um Zimbra. :D) exija autenticação, e eu espero que sim, instale a classe
PHPMailer, para que seja possível enviar o
token para o e-mail 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.
Referências: