Wie können Benutzer das Linux-Passwort über den Webbrowser ändern? [geschlossen]


7

Ich bin nicht sicher, ob dies eine Stackoverflow-Frage oder ein Serverfehler ist, aber hier ist:

Ich habe einen Ubuntu 10.04-Dateiserver (Samba / FTP / HTTP) und möchte Benutzern die Möglichkeit geben, ihr Kennwort für den Server mithilfe ihres Webbrowsers zu ändern.

Ich habe ein ähnliches Skript geschrieben, bevor ich PHP und ein Durcheinander von Exec verwendet habe, aber ich glaube, dass dies nicht sicher ist, da es von jemandem angehört werden kann, der sich die Liste der Prozesse auf dem Server ansieht.

Gibt es eine Art Plugin (PHP oder Python oder anderes), das dies einfach kann?

Ich benutze lieber nichts wie webmin / usermin, da es dafür übertrieben ist.


Wenn Sie nicht möchten, dass exec()Argumente in der Prozessliste angezeigt werden, fügen Sie sie nicht einexec() . Verwendung popen()mit stdin/ stdout.
user1686

@grawity, ist proc_open()sicher?
wag2639

Dies hängt von Ihrer Definition von "sicher" ab. Aber ja, es ist sicherer als exec(), weil niemand (außer dem open'ed-Programm selbst) sehen kann, was geschrieben wurdestdin
user1686

Antworten:


4

web-chpass kann Passwörter über PAM ändern.


Das sah sehr vielversprechend aus, aber ich weiß nicht wirklich, wie man Perl-CGI benutzt, und es sieht etwas veraltet aus.
wag2639

@ wag2639: Ich denke nicht, dass "datiert" ein Problem ist; Die PAM-Schnittstelle ist immer noch dieselbe.
user1686

2

Ich bevorzuge 2 separate Prozesse. Ein Prozess stellt eine Anfrage, indem eine spezielle Datei in einem speziellen Ordner abgelegt wird. Zweitens durchläuft ein Cron-Job den Ordner und erfüllt die Kennwortänderungsanforderungen.

Das aufrufende Skript muss lediglich die Datei in den Ordner ablegen (sofern es über die entsprechenden Berechtigungen verfügt).

Weitere Informationen und Skripte finden Sie unter diesem Link: http://sylnsr.blogspot.com/2012/09/keep-unix-password-in-sync-with.html


1

Wenn Sie Samba als PDC ausführen, können Sie damit Benutzern ermöglichen, ihr Kennwort mit Strg + Alt + Löschen zu ändern. Es tut mir leid, wenn diese Antwort nicht zu Ihnen passt, aber ich kann noch keine Commets posten oder so ...

    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

oder das Systemprogramm:

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*

Suchen Sie nach "Passwortsynchronisation" in der Mitte des Dokuments und erklären Sie besser, wie es funktioniert: http://www.samba.org/samba/docs/using_samba/ch09.html#samba2-CHP-9-SECT-4.3


1

Die wahrscheinlich beste Lösung wäre die Verwendung einer LDAP-Schnittstelle (z. B. aus dem Programmierframework) oder eines sofort einsatzbereiten Frontends wie Webmin.


Ich wollte Usermin verwenden, aber es würde nicht funktionieren und ich weiß nicht, wie ich diagnostizieren soll. Gibt es Alternativen?
wag2639

0

Nach stundenlanger Online-Recherche konnte ich keine super gute Option finden, also habe ich diesen Hack implementiert. Es nutzt diesen Artikel für das Ändern von Passwörtern mit PHP.

Ich verwende auch das PECL: PAM-Paket , um eine kleine Überprüfung hinzuzufügen.

Diese Seite befindet sich in einem sicheren HTTPS-Ordner (automatische Umleitung über .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>

Ich habe diese Frage / Antwort auch unter /programming/3032785/php-pam-to-change-user-password/3067974#3067974 veröffentlicht

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.