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".

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top