LDAP Tool Box Project Self Service Password

Publicado por Geowany Galdino em 12/03/2014

[ Hits: 9.523 ]

 


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 = "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:
Outras dicas deste autor

QJoyPad - Ampliando o poder do seu joystick

Leitura recomendada

Netflix nativo no Slackware 14.2 usando Firefox

Pacote do BrOffice 3.1.1 para Slackware

Usando LANMAP para criar uma imagem da rede local

OpenOffice.org utilizando programas externos

EasyMP3Gain no Debian, Ubuntu e derivados

  

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




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts