2011-01-19 15 views
8

Mi pregunta es simple.Apache htpasswd cambio de contraseña segura

¿Cómo se permite 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?

Intenté escribir una secuencia de comandos para hacer ese trabajo utilizando ssh y un usuario especialmente diseñado, pero no lleva a la realidad.

Por favor ayuda. Estoy usando el servidor de Debian "Lenny".

+0

¿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

Respuesta

16

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.

Cuestiones relacionadas