LDAP Tool Box Project Self Service Password

Publicado por Geowany Galdino em 12/03/2014

[ Hits: 6.407 ]

 


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 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 = "[email protected]";
$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 = "[email protected]";
    $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:
Outras dicas deste autor

QJoyPad - Ampliando o poder do seu joystick

Leitura recomendada

Alternativa ao Format Factory para Linux

Instalando o Real Player 11 no Ubuntu Linux

Instalando o CUPS 1.4svn

Instalando USB Stick Formater no Ubuntu 16.04

Zabbix - Monitorando temperatura do processador em servidores Windows

  

Comentários
[1] Comentário enviado por rodrigo.muller em 12/03/2014 - 13:58h

Esta ferramenta é muito interessante.

Com a mesma finalidade existe também o PWM, que é um projeto open-source, desenvolvido em Java.
No site do projeto tem mais informações: https://code.google.com/p/pwm/

Espero ter ajudado de alguma forma.

[2] Comentário enviado por geowany em 12/03/2014 - 14:05h


[1] Comentário enviado por rodrigo.muller em 12/03/2014 - 13:58h:

Esta ferramenta é muito interessante.

Com a mesma finalidade existe também o PWM, que é um projeto open-source, desenvolvido em Java.
No site do projeto tem mais informações: https://code.google.com/p/pwm/

Espero ter ajudado de alguma forma.


Obrigado pela dica, Rodrigo! Eu cheguei a ver o pwm mas não me atrevi a testá-lo por ser em java.



Contribuir com comentário