Como permitir que os usuários alterem a senha do linux no navegador da web? [fechadas]

7

Não tenho certeza se essa é uma pergunta sobre o stackoverflow ou um serverfault, mas aqui está:

Eu tenho um servidor de arquivos Ubuntu 10.04 (Samba / FTP / HTTP) e gostaria de ter a capacidade de fornecer aos usuários a capacidade de alterar sua senha para o servidor usando seu navegador da Web.

Eu escrevi um script semelhante antes de usar o PHP e uma confusão de exec, mas acredito que não é seguro, porque pode ser ouvido por alguém olhando para a lista de processos no servidor.

Existe algum tipo de plugin (PHP ou Python ou outro) que possa fazer isso facilmente?

Eu prefiro não usar algo como webmin / usermin, pois é um exagero para isso.

    
por wag2639 11.06.2010 / 04:16

5 respostas

0

Depois de horas de pesquisa on-line, não consegui encontrar uma boa opção, por isso, implementei esse hack. Ele usa este artigo para alterar as senhas usando PHP.

Eu também estou usando o pacote PECL: PAM para adicionar um pouco de verificação.

Esta página está em uma pasta HTTPS segura (redirecionamento automático via .htaccess)

<?php

$messages = array();

function change_password ($user, $currpwd, $newpwd) {

    // Open a handle to expect in write mode
    $p = popen('/usr/bin/expect','w');

    // Log conversation for verification
    $log = '/tmp/passwd_' . md5($user . time());
    $cmd .= "log_file -a \"$log\"; ";

    // Spawn a shell as $user
    $cmd .= "spawn /bin/su $user; ";
    $cmd .= "expect \"Password:\"; ";
    $cmd .= "send \"$currpwd\r\"; ";
    $cmd .= "expect \"$user@\"; ";

    // Change the unix password
    $cmd .= "send \"/usr/bin/passwd\r\"; ";
    $cmd .= "expect \"(current) UNIX password:\"; ";
    $cmd .= "send \"$currpwd\r\"; ";
    $cmd .= "expect \"Enter new UNIX password:\"; ";
    $cmd .= "send \"$newpwd\r\"; ";
    $cmd .= "expect \"Retype new UNIX password:\"; ";
    $cmd .= "send \"$newpwd\r\"; ";
    $cmd .= "expect \"passwd: password updated successfully\"; ";

    // Commit the command to expect & close
    fwrite($p, $cmd); pclose ($p);

    // Read & delete the log
    $fp = fopen($log,r);
    $output = fread($fp, 2048);
    fclose($fp); unlink($log);
    $output = explode("\n",$output);

    return (trim($output[count($output)-2]) == 'passwd: password updated successfully') ? true : false;
}

function process_post() {

    if ((!isset($_SERVER['HTTP_REFERER'])) 
        || (strpos($_SERVER['HTTP_REFERER'], $_SERVER['SCRIPT_NAME']) === FALSE)) {

        echo "GO AWAY!";
        exit();
        return FALSE;

    }

    global $messages;

    $username           = trim($_POST['username']);
    $password_current   = trim($_POST['password_current']);
    $password_new       = trim($_POST['password_new']);
    $password_confirm   = trim($_POST['password_confirm']);

    // Check for blanks
    if ($username == '' || $password_current == '' || $password_new == '' || $password_confirm == '') {
        array_push(&$messages, "ERROR: You cannot leave any field empty.");
        return FALSE;
    }

    // Check username
    if (!ctype_alnum($username)) {
        array_push(&$messages, "ERROR: You've entered an invalid username.");
        return FALSE;
    }

    // Check to see if new password is correctly typed
    if ($password_new != $password_confirm) {       
        array_push(&$messages, "ERROR: New Password and Confirmation do not match.");
        return FALSE;
    }

    // Check if current password is valid (not really neccessary)
    if (!pam_auth($username, $password_current, &$error, FALSE)) {
        if (trim($error) == "Permission denied (in pam_authenticate)")
            array_push(&$messages, "ERROR: You've username/password was not accepted.");    
        else
            array_push(&$messages, "ERROR: " . $error);
        return FALSE;
    }

    if (change_password ($username, $password_current, $password_new))
        array_push(&$messages, "Password Successfully Changed");
    else 
        array_push(&$messages, "ERROR: Password change failed.");

}

if ($_SERVER['REQUEST_METHOD'] == 'POST') process_post();


?><html>
<head>


<title>Passwords</title>

<style type="text/css">

body {
    font-family: Verdana, Arial, sans-serif;
    font-size: 12px;
}

label {
    width: 150px;
    display: block;
    float: left;
}

input {
    float: left;
}

br {
    clear: both;
}

.message {
    font-size: 11px;
    font-weight: bold;
}

.error {
    color:#C00;
}


</style>

</head>


<body>

<h2>Change Passwords</h2>

<form action="<?= $_SERVER['SCRIPT_NAME'] ?>" method="post">

<fieldset>

<? if (count($messages) != 0) { 

    foreach ($messages as $message) { ?>

<p class="message<?= ((strpos($message, 'ERROR:') === FALSE) ? '' : ' error') ?>"><?= $message ?></p>

<? } } ?>

<label>Username: </label>
<input type="text" name="username" /><br />

<label>Current Password:</label>
<input type="password" name="password_current" /><br />

<label>New Password:</label>
<input type="password" name="password_new" /><br />

<label>Confirm Password:</label>
<input type="password" name="password_confirm" /><br />

<input type="reset" value="Reset" /> <input type="submit" value="Submit" />

</fieldset>


</form>


</body>
</html>

Também tenho esta pergunta / resposta publicada em link

    
por 18.06.2010 / 09:52
4

web-chpass pode alterar senhas por meio do PAM.

    
por 11.06.2010 / 12:54
2

Eu prefiro usar dois processos separados. Um processo faz uma solicitação descartando um arquivo especial em uma pasta especial. Segundo, uma tarefa cron percorre a pasta e cumpre as solicitações de alteração de senha.

Tudo o que o script de chamada precisa fazer é soltar o arquivo na pasta (desde que tenha permissões para isso.

Por favor, veja este link para mais detalhes e para obter os scripts: link

    
por 21.09.2012 / 01:15
1

Se você estiver executando o Samba como um PDC, poderá usá-lo para permitir que os usuários alterem suas senhas usando ctrl + alt + delete. Eu sinto muito se o anwser este não combina com você mas eu não posso postar commets ou ainda assim ...

    unix password sync = Yes

    passwd program = /usr/bin/php -f /my_folder/my_own_script.php %u
    passwd chat = "password:" %n\n "changed"
    passwd chat debug = yes

ou o programa do sistema:

passwd program = /usr/bin/passwd %u
passwd chat = *New*UNIX*password* %n\n *ReType*new*UNIX*password* %n\n  *passwd:*all*authentication*tokens*updated*successfully*

pesquise por "Sincronização de senhas", está no meio do documento e explica melhor como funciona: link

    
por 11.06.2010 / 04:46
1

Provavelmente, a melhor solução seria usar algum tipo de interface LDAP (por exemplo, da estrutura de programação), ou front-out pronto, como o Webmin.

    
por 11.06.2010 / 11:21