GNU/Linux >> Tutoriales Linux >  >> Debian

Cómo proteger directorios con contraseña con mod_authn_dbd y MySQL en Apache (Debian 8)

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

Debian
  1. Cómo instalar y proteger phpMyAdmin con Apache en Ubuntu 18.04

  2. Cómo instalar y asegurar phpMyAdmin con Apache en Debian 9

  3. Cómo instalar y configurar Zabbix en Debian 9 Linux

  4. Cómo agregar y eliminar usuarios en Debian 9

  5. Cómo crear y eliminar un usuario en Debian 9

Cómo instalar WordPress con Apache y Let's Encrypt SSL en Debian 11

Cómo instalar y configurar el servidor web Apache con host virtual en Debian 10

Cómo agregar y eliminar usuarios en Debian

Cómo instalar Apache con PHP-FPM en Debian 10

¿Cómo instalar y configurar Apache en Debian 11?

Cómo instalar Drupal con Apache en Debian y Ubuntu