Frage

Meine Frage ist einfach.

Wie die Benutzer ihre Passwörter in einigen htpasswd-Datei unter Linux gespeichert ändern, ohne die Dateien Inhalt enthüllt oder können Benutzer andere Passwörter ändern?

Ich habe versucht, ein Skript zu schreiben, diesen Job mit ssh zu tun und specialy gestalteten Benutzer führt aber noway.

Bitte Hilfe. Ich verwende Debian-Server "Lenny".

War es hilfreich?

Lösung

Der Apache htpasswd Datei unterstützt keine Schatten-Funktionalität. Daher Sie die Benutzer zu verhindern, haben Ihren Web-Server, um den Zugriff auf sie von der Passwortdatei fern zu halten. So ist die einzige Lösung ist, Ihr SSH-basierter Ansatz oder jede andere Remote-Lösung. Die folgende Beschreibung wird erklärt, wie eine SSH-Befehlsskript zu schreiben, nur um das Passwort zu ändern, wenn der Benutzer sein altes Passwort kennt. Das Hauptproblem ist, dass Apache nicht ein Kommandozeilen-Tool ist ein Kennwort in einer htpasswd Datei zu überprüfen. Aber dies kann von Hand gemacht werden.

Die folgende Beschreibung geht davon aus, dass der Web-Server-Benutzer ist www-data und dass das Home-Verzeichnis des Benutzers /var/www.

Als erstes müssen Sie eine htpasswd-Datei erstellen, die von den Web-Server Benutzer beschreibbar ist:

# ls -la .htpasswd
-rw-r--r-- 1 www-data root 18 10. Mai 16:30 .htpasswd

Dann haben Sie die Schlüssel aller Benutzer auf die authorized_keys-Datei des Web-Server-Benutzer hinzuzufügen. Sie haben jede Zeile mit der command Option Präfix.

# cat .ssh/authorized_keys 
command="/var/www/.htpasswd.sh" ssh-rsa AAAA... user@host

Jedes Mal, wenn ein Benutzer eine Verbindung mit seinem Schlüssel nur wird die .htpasswd.sh ausgeführt. Der Anwender hat keinen Shell-Zugriff auf den Web-Server.

Dies ist das Skript, das Passwort zu ändern:

#! /bin/bash

HTPASSWD=/var/www/.htpasswd

die () { echo "$*" >&2 ; exit 1 ; }

read -p 'Enter user name: ' USER
read -s -p 'Old password: ' OLDPW ; echo
read -s -p 'New password: ' NEWPW0 ; echo
read -s -p 'Re-type new password: ' NEWPW1 ; echo

if LINE=$(grep ^"$USER": "$HTPASSWD")
then
    echo "$LINE" | sed 's/.*:\(..\)\(.\+\)/\1 \2/' | { 
        read SALT CRYPT
        if [[ "$SALT$CRYPT" = $(echo "$OLDPW" | mkpasswd -sS "$SALT") ]] ; then
            if [ "$NEWPW0" != "$NEWPW1" ] ; then
                die "Password verification error!"
            fi
            PWS=$(grep -v ^"$USER:" "$HTPASSWD")
            {
                echo "$PWS"
                echo -n "$USER:"
                echo "$NEWPW0" | mkpasswd -s
            } > "$HTPASSWD"
            echo "Updating password for user $USER."
        else
            die "Password verification error!"
        fi
    }
else
    die "Password verification error!"
fi

Der schwierige Teil ist die Passwortüberprüfung. Es erfolgt durch das alte Salz zu lesen und das alte Passwort mit dem alten Salz verschlüsselt. Das Ergebnis wird im Vergleich mit dem alten verschlüsselten Passwort in der htpasswd Datei.

Nun kann der Benutzer auf die Webserver verbinden, um das Passwort zu ändern:

$ ssh www-data@localhost
Enter user name: szi
Old password: 
New password: 
Re-type new password: 
Updating password for user szi.
Connection to localhost closed.

Jeder kann nur sein eigenes Passwort ändern und niemand hat Zugriff auf die verschlüsselten Passwörter der anderen Benutzer. Diese Lösung hat einen zusätzlichen Vorteil über das ursprüngliche htpasswd Programm in einem Shell-Skript verwenden, da die Passwörter nie als Befehlszeilenargument verwendet. Dies wäre nicht möglich, mit htpasswd, weil es nicht das Passwort von stdin wie mkpasswd lesen kann.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top