Pregunta

Mi pregunta es simple.

Cómo permitir a los usuarios cambiar sus contraseñas almacenadas en algún archivo htpasswd en Linux sin revelar el contenido de los archivos o permitir a los usuarios modificar otras contraseñas?

He intentado escribir un guión para hacer ese trabajo usando ssh y de usuario diseñada especialmente, pero conduce noway.

Por favor, ayuda. Estoy utilizando el servidor Debian "Lenny".

¿Fue útil?

Solución

El archivo htpasswd Apache no soporta ninguna funcionalidad sombra. Para ello hay que evitar que los usuarios tienen acceso al servidor web con el fin de mantenerlos alejados del archivo de contraseñas. Por lo que la única solución es su enfoque basado en SSH o cualquier otra solución remota. La siguiente descripción explicará cómo escribir una secuencia de comandos SSH para cambiar la contraseña sólo si el usuario sabe que su antigua contraseña. El principal problema es que Apache no proporciona una herramienta de línea de comandos para verificar una contraseña en un archivo htpasswd. Pero esto se puede hacer a mano.

La siguiente descripción supone que el usuario del servidor web es www-data y que el directorio personal del usuario es /var/www.

En primer lugar hay que crear un archivo htpasswd, que es modificable por el usuario del servidor web:

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

A continuación, hay que agregar las claves de todos sus usuarios en el fichero de authorized_keys del usuario del servidor web. Usted tiene que prefijar cada línea con la opción command.

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

Cada vez que un usuario se conecta con su llave sólo el .htpasswd.sh es ejecutado. Los usuarios no tienen ningún acceso shell al servidor web.

Este es el script para cambiar la contraseña:

#! /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 difícil es la verificación de la contraseña. Se realiza mediante la lectura de la sal vieja y el cifrado de la contraseña con la sal de edad. El resultado se compara con la contraseña cifrada en el archivo htpasswd.

Ahora el usuario puede conectarse al servidor web con el fin de cambiar la contraseña:

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

Todo el mundo sólo puede cambiar su propia contraseña y nadie tiene acceso a las contraseñas cifradas de los demás usuarios. Esta solución tiene un beneficio adicional sobre el uso del programa de htpasswd original en un script de shell, debido a que las contraseñas nunca se usan como argumento de línea de comandos. Esto no sería posible con htpasswd, porque no puede leer la contraseña de stdin como mkpasswd.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top