Publicado por & archivado en Apache.

La autentificación de Apache (esa ventana emergente que pide usuario y contraseña), normalmente se usa desde una lista de usuarios en un archivo de texto o con una base de datos de Berkeley, pero en ocasiones puede ser útil pedir usuario y contraseña consultando una base de datos MySQL.

 

Cuando fui a hacer esto para algunas de mis páginas, me encontré con que el paquete mod_auth_mysql que se instalaba en Debian Etch con un simple apt-get, había desaparecido en Debian Lenny y que la versión que me instalaba Squeeze no funcionaba bien, así que sólo quedaba la opción de compilarlo.

NOTA: Tras actualizar a Debian Wheezy y Debian Jenny, el problema persiste, aunque Ubuntu si ha incluido un módulo auth para MySQL:

apt-cache search libapache2-mod-auth-mysql
libapache2-mod-auth-mysql - Apache 2 module for MySQL authentication

 

Debian sigue sin incluir este módulo en los repositorios. Hay que tener cuidado porque el libapache2-mod-auth-mysql de Ubuntu no es el mismo y la sintaxis de uso es distinta.

 

Instrucciones para compilar mod_auth_mysql en Debian:

1.- Instala los paquetes necesarios para compilar y parchear módulos de Apache:


apt-get install apache2-prefork-dev libmysqlclient15-dev patch

 
2.- Crea una carpeta donde compilar el módulo:


mkdir auth-mysql
cd auth-mysql/

 
3.- Descarga mod_auth_mysql y el parche para Apache 2 (dejo enlaces a las versiones que estoy usando que seguro funcionan).


wget http://intervia.com/download/mod_auth_mysql-3.0.0.tar.gz
wget http://intervia.com/download/apache22.diff

 
4.- Descomprime el tgz y mueve el parche a la carpeta:


tar xzf mod_auth_mysql-3.0.0.tar.gz
mv apache22.diff mod_auth_mysql-3.0.0
cd mod_auth_mysql-3.0.0

 
5.- Parchea el mod_auth_mysql:


patch -p0 < apache22.diff mod_auth_mysql.c

 
6.- Si tienes Debian 7 Wheezy o posterior (cualquier distribución que use Apache 2.4), modifica el archivo mod_auth_mysql.c antes de compilar el módulo, ábrelo y haz estos tres cambios:


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Línea 908:
  return r->connection->remote_ip;
 
Cámbialo por:
  return r->connection->client_ip;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Línea 1273:
const apr_array_header_t *reqs_arr = ap_requires(r);
 
Cámbialo por:
const apr_array_header_t *reqs_arr = NULL;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Línea 1275:
const array_header *reqs_arr = ap_requires(r);
 
Cámbialo por:
const array_header *reqs_arr = NULL;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 
7.- Compila el módulo de Apache con el APache eXtenSion tool:


apxs2 -c -L/usr/lib/mysql -I/usr/include/mysql -lmysqlclient -lm -lz mod_auth_mysql.c
apxs2 -i mod_auth_mysql.la

 
8.- Copia el módulo compilado en su ubicación final:


echo "LoadModule mysql_auth_module /usr/lib/apache2/modules/mod_auth_mysql.so" > /etc/apache2/mods-available/auth_mysql.load

 
9.- Por último, activa el módulo en Apache y reinicia para que funcione:


a2enmod auth_mysql
/etc/init.d/apache2 restart

 
Si por algún motivo no tuvieras a2enmod, puedes activar el módulo creando directamente el enlace simbólico:


ln -s /etc/apache2/mods-available/auth_mysql.load /etc/apache2/mods-enabled/auth_mysql.load

 

Ahora ya puedes validar usuarios en apache desde una base de datos MySQL, tanto desde el archivo de configuración de Apache en /etc/sites-enabled/000-default (o como se llame en tu instalación), como desde un archivo .htaccess dentro de un directorio.

 

Si es en el archivo de configuración de apache, iría dentro de la etiqueta <directory>, por ejemplo, para proteger el acceso a http://example.com/admin/, suponiendo que las páginas están en /var/www/admin/ y que nuestra base de datos guarda las contraseñas en md5:


<Directory /var/www/admin/>
AuthName "Acceso para administración"
AuthType Basic
AuthBasicAuthoritative off
AuthMySQLAuthoritative on
AuthMySQLEnable On
AuthUserFile /dev/null
AuthMySQLHost localhost
AuthMySQLUser usuario_mysql
AuthMySQLPassword contraseña_usuario_mysql
AuthMySQLDB base_de_datos
AuthMySQLUserTable nombre_tabla
AuthMySQLNameField campo_usuario
AuthMySQLPasswordField campo_contraseña
AuthMySQLPwEncryption md5

Require valid-user
</Directory>

 

Para incluirlo dentro de un archivo .htaccess, es exactamente lo mismo, pero quitando las etiquetas «directory», del inicio y fin,  es decir, quitando <Directory /var/www/admin/> del principio y </Directory> del final.

 

El campo de la contraseña se puede manejar con distintos formatos de cifrado o en texto plano.

– Para texto plano:  none
– Cifrados soportados: aes | crypt | md5 | scrambled | sha1

 

Lamentablemente no es capaz de manejar, que yo sepa, contraseñas con «salt», por ejemplo phpBB y OSCommerce usan md5 con salt, literalmente «sal», que es un añadido adicional al md5 (como la sal que adereza la comida), para aumentar la seguridad. Cuando llevan salt, el campo de la contraseña, al verlo con phpmyadmin o el gestor que uses, suele llevar dos partes separadas por dos puntos, por ejemplo, 344fe0e6f894eb96721beeb043fdb0c8:4a, este por ejemplo es el formato de OSC, el «salt» es el 4a del final separado de la contraseña md5 por dos puntos.

 

En estos casos, si queremos autentificación básica, siempre se puede modificar la rutina que escribe la contraseña para que añada una que vaya sólo con md5 en un nuevo campo.

 

En mi caso, utilizo mod_auth_sql para poner una barrera de acceso en aplicaciones que son potencialmente peligrosas, por ejemplo, para acceder a phpmyadmin, wordpress, horde y otras, de esta forma, aun teniendo un exploit de una versión aun no actualizada, como ya me ha ocurrido, para que alguien pueda aplicarlo necesita tener un usuario válido registrado en la base de datos.

 

Hacer esto supone que para acceder a estas aplicaciones hay que introducir dos veces el usuario y contraseña, una en la ventana emergente de la autentificación de Apache y una segunda en la propia aplicación, pero a cambio, se aumenta mucho la seguridad de los servidores, por lo que los usuarios responden positivamente al explicárselo y no supone tanto incordio, ya que es posible gusrdar las contraseñas en el navegador.

 

 

2 Comentarios para “Autentificación básica de Apache desde MySQL”

    • admin

      Yo lo he compilado también en Apache 2.4, pero si, es cierto que inicialmente esto era para usar en la versión 2.2.

      Responder

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *