Domanda

La mia domanda è semplice.

Come per consentire agli utenti di modificare le password memorizzate in qualche file htpasswd in linux senza rivelare il contenuto dei file o consentire agli utenti di modificare le password di altri?

Ho cercato di scrivere uno script per fare quel lavoro usando ssh e user appositamente progettato, ma conduce noway.

Si prega di aiuto. Sto usando server Debian "Lenny".

È stato utile?

Soluzione

Il file htpasswd Apache non supporta alcuna funzionalità ombra. Perciò bisogna evitare che gli utenti che accedono al web server al fine di tenerli lontani dal file delle password. Quindi l'unica soluzione è il tuo approccio basato SSH o qualsiasi altra soluzione remota. La descrizione che segue spiegherà come scrivere uno script di comandi SSH per cambiare la password solo se l'utente conosce la sua vecchia password. Il problema principale è che Apache non fornisce uno strumento a riga di comando per verificare una password in un file htpasswd. Ma questo può essere fatto a mano.

La seguente descrizione presuppone che l'utente del server web è www-data e che la home directory dell'utente è /var/www.

Per prima cosa devi creare un file htpasswd, che è scrivibile dall'utente del server web:

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

Poi si deve aggiungere le chiavi di tutti gli utenti al file authorized_keys del web server. Bisogna prefisso ogni riga con l'opzione command.

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

Ogni volta che un utente si connette con la sua chiave solo il .htpasswd.sh viene eseguito. Gli utenti non hanno alcun accesso alla shell al server web.

Questo è lo script per modificare la password:

#! /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 parte difficile è la verifica della password. E 'fatto con la lettura del vecchio sale e criptare la vecchia password con il vecchio sale. Il risultato viene confrontato con la vecchia password cifrata nel file htpasswd.

Ora l'utente può connettersi al server web al fine di modificare la password:

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

Chiunque può modificare solo la propria password e nessuno ha accesso alle password criptate degli altri utenti. Questa soluzione ha un ulteriore vantaggio sull'utilizzo del programma htpasswd originale in uno script di shell, perché le password non vengono mai utilizzati come argomento della riga di comando. Questo non sarebbe possibile con htpasswd, perché non può leggere la password da stdin come mkpasswd.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top