Usuário Samba + LDAP alterando sua senha pelo browser
Publicado por richard giovanni jose bergonzi (última atualização em 19/06/2012)
[ Hits: 10.700 ]
Estava com dificuldades sobre isso, muitos usuários que usam GNU/Linux sentiam a necessidade de trocar sua senhas, mas vinham até a mim, que efetuava a alteração manualmente.
Pesquisei na net por vários dias e não encontrava uma solução, então encontrei um script em PHP que faz a troca de senha do usuário LDAP de uma rede implantada com Samba. Fiz as modificações e adequei à minha necessidade.
Segue o script.
Para que ele funcione deve-se editar os seguintes parâmetros:
$server
$port
$dn
Instalar o sudo e dentro do /etc/sudoers adicionar as seguintes linhas:
%sudo ALL=(ALL) ALL
www-data ALL=(ALL)NOPASSWD: /usr/sbin/smbldap-passwd
<?php $message = array(); $message_css = ""; function changePassword($user,$oldPassword,$newPassword,$newPasswordCnf){ global $message; global $message_css; $server = "localhost"; $port="389"; $dn = "ou=Usuarios,dc=3ciafron,dc=eb,dc=mil,dc=br"; error_reporting(0); ldap_connect($server, $port); $con = ldap_connect($server, $port); ldap_set_option($con, LDAP_OPT_PROTOCOL_VERSION, 3); // bind anon and find user by uid $user_search = ldap_search($con,$dn,"(|(uid=$user)(mail=$user))"); $user_get = ldap_get_entries($con, $user_search); $user_entry = ldap_first_entry($con, $user_search); $user_dn = ldap_get_dn($con, $user_entry); $user_id = $user_get[0]["uid"][0]; $user_givenName = $user_get[0]["givenName"][0]; $user_search_arry = array( "*", "ou", "uid", "mail", "passwordRetryCount", "passwordhistory" ); $user_search_filter = "(|(uid=$user_id)(mail=$user))"; $user_search_opt = ldap_search($con,$user_dn,$user_search_filter,$user_search_arry); $user_get_opt = ldap_get_entries($con, $user_search_opt); $passwordRetryCount = $user_get_opt[0]["passwordRetryCount"][0]; $passwordhistory = $user_get_opt[0]["passwordhistory"][0]; //$message[] = "Username: " . $user_id; //$message[] = "DN: " . $user_dn; //$message[] = "Current Pass: " . $oldPassword; //$message[] = "New Pass: " . $newPassword; /* Start the testing */ if ( $passwordRetryCount == 3 ) { $message[] = "Erro E101 - Sua conta está bloqueada!!!"; return false; } if (ldap_bind($con, $user_dn, $oldPassword) === false) { $message[] = "Erro E101 - Nome de usuário ou senha está errado."; return false; } if ($newPassword != $newPasswordCnf ) { $message[] = "Erro E102 - Suas novas senhas não correspondem!"; return false; } $encoded_newPassword = "{SSHA}" . base64_encode( pack( "H*", sha1( $newPassword ) ) ); $history_arr = ldap_get_values($con,$user_dn,"passwordhistory"); if ( $history_arr ) { $message[] ="Erro E102 - Sua senha corresponde a uma das 10 últimas senhas que você usou, você deve vir com uma nova senha"; return false; } if (strlen($newPassword) < 8 ) { $message[] = "Erro E103 - Sua nova senha é muito curta! <br/> Sua senha deve ter pelo menos 8 caracteres."; return false; } if (!preg_match("/[0-9]/",$newPassword)) { $message[] = "Erro E104 - Sua nova senha deve conter pelo menos um número."; return false; } if (!preg_match("/[a-zA-Z]/",$newPassword)) { $message[] = "Erro E105 - Sua nova senha deve conter pelo menos uma letra."; return false; } if (!preg_match("/[A-Z]/",$newPassword)) { $message[] = "Erro E106 - Sua nova senha deve conter pelo menos uma letra maiúscula."; return false; } if (!preg_match("/[a-z]/",$newPassword)) { $message[] = "Erro E107 - Sua nova senha deve conter pelo menos uma letra minúscula."; return false; } if (!$user_get) { $message[] = "Erro E200 -Unable to connect to server, você näo pode alterar sua senha, neste momento, desculpe."; return false; } $auth_entry = ldap_first_entry($con, $user_search); $mail_addresses = ldap_get_values($con, $auth_entry, "mail"); $given_names = ldap_get_values($con, $auth_entry, "givenName"); $password_history = ldap_get_values($con, $auth_entry, "passwordhistory"); $mail_address = $mail_addresses[0]; $first_name = $given_names[0]; /* And Finally, Change the password */ $entry = array(); $entry["userPassword"] = "$newPassword"; if (ldap_modify($con,$user_dn,$entry) === false){ $error = ldap_error($con); $errno = ldap_errno($con); $message[] = "E201 - Sua senha não pode ser a mudada entre em contato com o administrador."; $message[] = "$errno - $erro"; } else { $modf= "( echo {$_POST['novasenha1']} ; echo {$_POST['novasenha2']} ) | sudo /usr/sbin/smbldap-passwd {$_POST['usuario']}"; $cmd_exec = shell_exec($modf); $message_css = "yes"; mail($mail_address,"Aviso de alteracao de senha","caro $first_name"); $message[] = "a senha para $user_id foi alterada.<br/>e já se encontra ativa<br/>"; } } ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title>alteraçao senha aquid ldap</title> <style type="text/css"> body { font-family: Verdana,Arial,Courier New; font-size: 0.7em; } th { text-align: right; padding: 0.8em; } #container { text-align: center; width: 500px; margin: 5% auto; } .msg_yes { margin: 0 auto; text-align: center; color: green; background: #D4EAD4; border: 1px solid green; border-radius: 10px; margin: 2px; } .msg_no { margin: 0 auto; text-align: center; color: red; background: #FFF0F0; border: 1px solid red; border-radius: 10px; margin: 2px; } </style> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> </head> <body> <div id="container"> <h2><span id="result_box"><span title="alteraçao senha aquid ldap" onmouseover="this.style.backgroundColor='#ebeff9'" onmouseout="this.style.backgroundColor='#fff'">Página Alterar senha</span></span> usuários ldap</h2> <p> <span title="Sua nova senha deve ser de 8 caracteres ou mais e ter pelo menos:" onmouseover="this.style.backgroundColor='#ebeff9'" onmouseout="this.style.backgroundColor='#fff'">Sua nova senha deve ser de 8 caracteres ou mais e ter pelo menos: <br /> </span><span title="uma letra maiúscula, uma letra minúscula, e um número.." onmouseover="this.style.backgroundColor='#ebeff9'" onmouseout="this.style.backgroundColor='#fff'">uma letra maiúscula, uma letra minúscula, e um número. <br /> </span><span title="Você deve usar uma nova senha, a senha atual" onmouseover="this.style.backgroundColor='#ebeff9'" onmouseout="this.style.backgroundColor='#fff'">Você deve usar uma nova senha, a senha atual <br /> </span><span title="não pode ser o mesmo que sua nova senha." onmouseover="this.style.backgroundColor='#ebeff9'" onmouseout="this.style.backgroundColor='#fff'">não pode ser o mesmo que sua nova senha.</span></p> <?php if (isset($_POST["alterar"])) { changePassword($_POST['usuario'],$_POST['antigasenha'],$_POST['novasenha1'],$_POST['novasenha2']); global $message_css; if ($message_css == "yes") { ?><div class="msg_yes"><?php } else { ?><div class="msg_no"><?php $message[] = "Sua senha não foi alterada."; } foreach ( $message as $one ) { echo "<p>$one</p>"; } ?></div><?php } ?> <form action="<?php print $_SERVER['PHP_SELF']; ?>" name="passwordChange" method="post"> <table style="width: 400px; margin: 0 auto;"> <tr> <th>nome do usuário:</th><td><input name="usuario" type="text" size="20px" autocomplete="off" /></td></tr> <tr> <th>senha recente:</th><td><input name="antigasenha" size="20px" type="password" /></td></tr> <tr> <th>nova senha:</th><td><input name="novasenha1" size="20px" type="password" /></td></tr> <tr> <th>nova senha (repita):</th><td><input name="novasenha2" size="20px" type="password" /></td></tr> <tr><td colspan="2" style="text-align: center;" > <input name="alterar" type="submit" value="Alterar senha"/> <button onclick="$('frm').action='index.php';$('frm').submit();">Cancela</button> </td></tr> </table> </form> </div> </body> </html>
Função Anti MySQL Injection - Proteja sua aplicação!
LOGIN em php utilisando session e mysql!
Sistema de área restrista PHP/MYSQL
Geração de senhas e URL de vídeos Youtube e Vimeo
Enviar mensagem ao usuário trabalhando com as opções do php.ini
Meu Fork do Plugin de Integração do CVS para o KDevelop
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Compartilhamento de Rede com samba em modo Público/Anônimo de forma simples, rápido e fácil
Cups: Mapear/listar todas as impressoras de outro Servidor CUPS de forma rápida e fácil
Criando uma VPC na AWS via CLI
Tem como instalar o gerenciador AMD Adrenalin no Ubuntu 24.04? (15)
Tenho dois Link's ( IP VÁLIDOS ), estou tentando fazer o failover... (0)
Pendrive não formata de jeito nenhum (4)