El archivo Apache htpasswd
no admite ninguna funcionalidad oculta. Por lo tanto, debe evitar que los usuarios accedan a su servidor web para mantenerlos alejados del archivo de contraseña. Entonces, la única solución es su enfoque basado en SSH o cualquier otra solución remota. La siguiente descripción explicará cómo escribir un script de comando SSH para cambiar la contraseña solo si el usuario conoce su contraseña anterior. 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 puede hacerse a mano.
En la siguiente descripción se supone que el usuario del servidor web es www-data
y que el directorio de inicio 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
entonces usted tiene que agregar las claves de todos sus usuarios en el fichero de authorized_keys
del usuario del servidor web. Debe agregar un prefijo a cada línea con la opción command
.
# cat .ssh/authorized_keys
command="/var/www/.htpasswd.sh" ssh-rsa AAAA... [email protected]
Cada vez que un usuario se conecta con su llave sólo el .htpasswd.sh
es ejecutado. Los usuarios no tienen acceso de shell al servidor web.
Esta es la secuencia de comandos 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 hace leyendo la sal antigua y encriptando la contraseña anterior con la sal antigua. El resultado se compara con la contraseña cifrada anterior en el archivo htpasswd
.
Ahora el usuario puede conectarse al servidor web con el fin de cambiar la contraseña:
$ ssh [email protected]
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 original htpasswd
en un script de shell, porque las contraseñas nunca se usan como un argumento de línea de comando. Esto no sería posible con htpasswd
, porque no puede leer la contraseña de stdin como mkpasswd
.
¿Seguro que quieres apegarte a htpasswd? mod_auth en Apache puede usar otros backends, base de datos LDAP (mod_authnz_ldap), base de datos SQL (mod_authn_dbd), etc. – regilero