Esta guía explica cómo proteger con contraseña los directorios web (con usuarios de una base de datos MySQL) con mod_authn_dbd en Apache2 en un servidor Debian 8 (Jessie). Es una alternativa a los archivos de contraseñas de texto sin formato proporcionados por mod_auth y le permite usar la sintaxis SQL normal para crear/modificar eliminar usuarios. También puede configurar mod_authn_dbd para autenticarse en una tabla de usuario de MySQL existente. apache mod_authn_dbd reemplaza a mod_auth_mysql.
1 nota preliminar
Uso vhost http://www.example.com aquí con el archivo de configuración de vhost /etc/apache2/sites-available/example.com.vhost y la raíz del documento /var/www/www.example.com/web. Quiero proteger con contraseña el directorio /var/www/example.com/web/protecteddir en este tutorial (se traduce a http://www.example.com/protecteddir/).
Puede usar este tutorial para el servidor LAMP básico si aún no tiene Apache instalado.
2 Instalación de MySQL o MariaDB
Usaré MariaDB, una bifurcación de MySQL aquí en lugar de MySQL. Pero MySQL también funciona si lo prefieres. Para instalar MariaDB, ejecutamos:
apt-get -y install mariadb-server mariadb-client
Se le pedirá que proporcione una contraseña para el usuario root de MySQL:
Nueva contraseña para el usuario "root" de MariaDB:<-- yourrootsqlpassword
Repetir la contraseña para el usuario "root" de MariaDB:<-- yourrootsqlpassword
Instale el módulo DBD MySQL:
apt-get install libaprutil1-dbd-mysql
Luego, habilite el módulo mod_authn_dbd :
a2enmod dbd
a2enmod authn_dbd
authn_socache
Reiniciar Apache:
service apache2 restart
3 Configuración mod_authn_dbd
Puede encontrar la documentación para mod_authn_dbd en la documentación de Apache aquí http://httpd.apache.org/docs/current/mod/mod_authn_dbd.html.
Después de leer estos dos archivos, creamos una base de datos MySQL llamada examplecomdb en la que crearemos la tabla mysql_auth que contendrá nuestros usuarios y contraseñas. Además de eso, creamos el usuario de MySQL examplecom_admin; este usuario será utilizado por mod_auth_mysql para conectarse a MySQL más adelante:
mysqladmin -u root -p create examplecomdb
mysql -u root -p
GRANT SELECT, INSERT, UPDATE, DELETE ON examplecomdb.* TO 'examplecom_admin'@'localhost' IDENTIFIED BY 'examplecom_admin_password';
GRANT SELECT, INSERT, UPDATE, DELETE ON examplecomdb.* TO 'examplecom_admin'@'localhost.localdomain' IDENTIFIED BY 'examplecom_admin_password';
FLUSH PRIVILEGES;
(Reemplace examplecom_admin_password con una contraseña de su elección).
USE examplecomdb;
create table mysql_auth (
username varchar(255) not null,
passwd varchar(255),
groups varchar(255),
primary key (username)
);
(Por supuesto, también puede usar las tablas existentes que contienen sus credenciales de usuario y también puede tener campos adicionales en la tabla, como un campo que define si un usuario está activo o no, por ejemplo).
Ahora insertamos la prueba de usuario en nuestra tabla mysql_auth con la prueba de contraseña; este usuario pertenece al grupo testgroup.
La contraseña debe tener un hash, usaré un hash SHA1 aquí, el hash se puede crear con el comando htpasswd en el shell de Linux:
htpasswd -bns test test
El resultado es este:
test:{SHA}qUqP5cyxm6YcTAhz05Hph5gvu9M=
La primera parte es el nombre de usuario "test", separado por ":" y luego viene la contraseña codificada. Necesitamos la contraseña cifrada "{SHA}qUqP5cyxm6YcTAhz05Hph5gvu9M=" solo para insertarla en nuestra base de datos de usuarios. La consulta de MySQL es esta:
INSERT INTO `mysql_auth` (`username`, `passwd`, `groups`) VALUES('test', '{SHA}qUqP5cyxm6YcTAhz05Hph5gvu9M=', 'testgroup');
Luego dejamos el shell de MySQL:
quit
La configuración de mod_authn_dbd para incluirse en el archivo vhost, no puede agregarse dentro de un archivo .htaccess. Por lo tanto, editamos el archivo vhost y agregamos la siguiente configuración al final del archivo:
nano /etc/apache2/sites-available/example.com.vhost
[...] # mod_dbd configuration
DBDriver mysql
DBDParams "dbname=examplecomdb user=examplecom_admin pass=examplecom_admin_password"
DBDMin 4
DBDKeep 8
DBDMax 20
DBDExptime 300
<Directory "/var/www/example.com/web/protecteddir">
# mod_authn_core and mod_auth_basic configuration
# for mod_authn_dbd
AuthType Basic
AuthName "My Server"
# To cache credentials, put socache ahead of dbd here
AuthBasicProvider socache dbd
# Also required for caching: tell the cache to cache dbd lookups!
AuthnCacheProvideFor dbd
AuthnCacheContext my-server
# mod_authz_core configuration
Require valid-user
# mod_authn_dbd SQL query to authenticate a user
AuthDBDUserPWQuery "SELECT passwd FROM mysql_auth WHERE username = %s"
</Directory>
Recargar Apache:
service apache2 reload
Si tiene campos adicionales en su tabla MySQL que definen si un usuario puede iniciar sesión o no (por ejemplo, un campo llamado activo), puede agregarlo a la consulta de usuario de SQL de esta manera:
[...] AuthDBDUserPWQuery "SELECT passwd FROM mysql_auth WHERE username = %s and active = 'yes'" [...]
La directiva require valid-user hace que cada usuario enumerado en la tabla mysql_auth pueda iniciar sesión siempre que proporcione la contraseña correcta. Si solo desea que ciertos usuarios puedan iniciar sesión, usaría algo como
[...] require user jane joe [...]
en cambio. Y si solo desea que los miembros de ciertos grupos puedan iniciar sesión, usaría algo como esto:
[...] require group testgroup [...]
¡Eso es todo! Ahora intente acceder a http://www.example.com/protecteddir/ y se le pedirá un nombre de usuario y una contraseña:
4 Enlaces
- Apache:http://httpd.apache.org/
- Debian:http://www.debian.org/
- mod_authn_dbd: http://httpd.apache.org/docs/current/mod/mod_authn_dbd.html