changement de mot de passe sécurisé Apache
Question
Ma question est simple.
Comment permettre aux utilisateurs de changer leurs mots de passe stockés dans un fichier d'htpasswd sous Linux sans révéler le contenu des fichiers ou permettre aux utilisateurs de modifier d'autres mots de passe?
J'ai essayé d'écrire un script pour faire ce travail en utilisant ssh et l'utilisateur specialy conçu, mais elle conduit noway.
S'il vous plaît aider. J'utilise le serveur Debian "Lenny".
La solution
Le fichier htpasswd
Apache ne supporte pas toutes les fonctionnalités d'ombre. Pour cela vous devez empêcher les utilisateurs accédant à votre serveur web afin de les tenir à l'écart du fichier de mot de passe. Donc, la seule solution est votre approche basée sur SSH ou toute autre solution à distance. La description suivante expliquera comment écrire un script de commande SSH pour changer le mot de passe que si l'utilisateur connaît son ancien mot de passe. Le principal problème est que Apache ne fournit pas un outil de ligne de commande pour vérifier un mot de passe dans un fichier htpasswd
. Mais cela peut être fait à la main.
La description suivante suppose que l'utilisateur du serveur Web est www-data
et que le répertoire personnel de l'utilisateur est /var/www
.
D'abord, vous devez créer un fichier htpasswd, qui est accessible en écriture par l'utilisateur du serveur Web:
# ls -la .htpasswd
-rw-r--r-- 1 www-data root 18 10. Mai 16:30 .htpasswd
Ensuite, vous devez ajouter les clés de tous les utilisateurs dans le fichier authorized_keys
de l'utilisateur du serveur web. Vous devez préfixer chaque ligne avec l'option command
.
# cat .ssh/authorized_keys
command="/var/www/.htpasswd.sh" ssh-rsa AAAA... user@host
Chaque fois qu'un utilisateur se connecte avec sa clé que le .htpasswd.sh
est exécuté. Les utilisateurs n'ont pas accès shell au serveur Web.
Ceci est le script pour changer le mot de passe:
#! /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
La partie la plus délicate est la vérification de mot de passe. Il se fait en lisant le vieux sel et chiffrer l'ancien mot de passe avec l'ancien sel. Le résultat est comparé avec l'ancien mot de passe crypté dans le fichier htpasswd
.
Maintenant, l'utilisateur peut se connecter au serveur Web afin de changer le mot de passe:
$ 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.
Tout le monde peut changer que son mot de passe et personne n'a accès aux mots de passe cryptés des autres utilisateurs. Cette solution a un avantage sur l'utilisation du programme de htpasswd
original dans un script shell, parce que les mots de passe ne sont jamais utilisés comme argument de ligne de commande. Ce ne serait pas possible avec htpasswd
, car il ne peut pas lire le mot de passe stdin comme mkpasswd
.