libapache2-mod-auth-mysql
está descontinuado en Ubuntu 18.04, por lo que para configurar la autenticación Basic en Apache es necesario utilizar authn_dbd
. En este caso se usa autenticación Basic porque Digest no funciona :( por lo que es necesario utilizar https (cosa que es recomendable siempre).
Primero hay que activar los siguientes módulos de apache:
1 |
a2enmod authn_dbd authn_socache auth_digest authz_dbd socache_shmcb |
Hay que crear el fichero /etc/apache2/mysql_auth_virtualhost.inc
en el que tendremos la configuración a añadir a todos los virtualhosts en los que utilizaremos alguna autenticación. Esta configuración indica el servidor MySQL y las credenciales de la conexión a la tabla MySQL de usuarios y grupos:
1 2 3 4 5 6 |
DBDriver mysql DBDParams host=mysqlserver,port=3306,dbname=apache_auth,user=usuario_db,pass=password_db DBDMin 4 DBDKeep 8 DBDMax 20 DBDExptime 300 |
Hay que cear el fichero /etc/apache2/mysql_auth_directory.inc
, donde tendremos la configuración a incluir en cada directiva <Directory>
para activar la autenticación para dicho directorio:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
AuthType Basic ### Rellenar en <Directory> lo siguiente: # AuthName "To fill by each directory" # Require dbd-group group_name # Require valid-user ### dbd-group significa que el usuario ha de pertenecer a un grupo concreto, y valid-user permite que acceda cualquier usuario autenticado, independientemente del grupo. AuthBasicProvider socache dbd AuthDigestProvider socache dbd AuthDBDUserPWQuery "SELECT passwd FROM mysql_auth WHERE username = %s" AuthzDBDQuery "SELECT groups FROM mysql_groups WHERE username = %s" # No funciona con Digest # AuthDBDUserRealmQuery "SELECT passwd FROM mysql_auth WHERE username = %s" AuthnCacheProvideFor dbd AuthnCacheContext my-server |
Configurar cada VirtualHost con lo siguiente:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Include mysql_auth_virtualhost.inc <Directory /var/www/directorio_seguro> Options FollowSymLinks Indexes AllowOverride All AuthName "SeccionA" Include mysql_auth_directory.inc Order deny,allow Allow from all Require dbd-group grupo_BD </Directory> |
Configuración de la Base de Datos
Estas son las tablas que contienen los usuarios y grupos a los que pertenecen:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
CREATE TABLE IF NOT EXISTS <code>mysql_auth</code> ( username</code> varchar(50) NOT NULL, passwd</code> varchar(150) NOT NULL, PRIMARY KEY (<code>username</code>) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; CREATE TABLE IF NOT EXISTS <code>mysql_groups</code> ( username</code> varchar(50) NOT NULL, groups</code> varchar(50) NOT NULL, PRIMARY KEY (<code>username</code>,<code>groups</code>), KEY <code>username</code> (<code>username</code>), KEY <code>groups</code> (<code>groups</code>) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; |
En la tabla mysql_auth
hay una fila por usuario y en la tabla mysql_groups
hay una fila por cada grupo al que pertenece un usuario (en groups realmente se indica único grupo, nombre mal elegido en su día).
Las contraseñas las creo del tipo bcrypt (que es la más segura por el momento:
1 |
htpasswd -nB </code>nombre_usuario |
y en el campo mysql_auth.passwd
copio el hash creado con bcrypt: $2y$05$Uy3ert...