Apache htpasswd sicheres Passwort ändern
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".
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.