Configurar autenticación en Apache con authn_dbd y MySQL

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:

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:

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:

Configurar cada VirtualHost con lo siguiente:

Configuración de la Base de Datos

Estas son las tablas que contienen los usuarios y grupos a los que pertenecen:

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:

y en el campo mysql_auth.passwd copio el hash creado con bcrypt: $2y$05$Uy3ert...

Redirigir las peticiones HTTP a HTTPS en Apache

Aquí se muestra la configuración de VirtualHost para que toda petición HTTP sea redirigida a HTTPS:

Cómo comprar un certificado SSL

Para que no se me olvide a mí mismo, en namecheap.com venden certificados baratos para páginas web. Lo primero que hay que elegir es cuántos dominios queremos que abarque:

  • Single Domain: un único dominio como por ejemplo www.foo.com o blabla.foo.com.
  • Multiple Domain: hasta 3 dominios de los anteriores, por cuestiones de que salgan más baratos.
  • Wildcard: Cubre todos los subdominios de un dominio *.foo.com.

Adicionalmente, hay que elegir qué nivel de certificación queremos entre:

  • Domain Validation (DV): Es más barato. Simplemente certifica que el dominio es el que dice ser. Para páginas personales que queremos que utilicen https.
  • Organization Validation (OV): Piden más información para certificar que la empresa que está detraś es la que dice ser.
  • Extended Validation (EV): La más cara y en la que piden más datos y realizan más validaciones antes de concederte el certificado, hace que en la barra del navegador aparezca la empresa en color verde.

Los pasos para obtener un certificado wildcard en namecheap son:

1.- Comprar el certificado (en mi caso Domain Validation Wildcard), indicado si es para configurar Apache, Tomcat u otro. Apache en este caso de ejemplo.

2.- Generar un CSR (Certificate Signing Request) de Apache:

En el caso de certificados para dominios wildcard:
Common Name: *.dominio.com
Password: un valor vacío.
Company name: un valor vacío.
Organization Name: NA
Organizational Unit Name: NA

(un poco más de información en la página de namecheap sobre CSR para Apache)

Después copiar el contenido del CSR a la web de namecheap en un formulario (uno de los pasos tras para comprar el certificado). Y copiar el .key a etc/apache2/certs o /etc/ssl, por ejemplo, porque lo necesitaremo más adelante.

3.- Seleccionar el modo de validación que posee el dominio. con esto namecheap podrá comprobar que, efectivamente, somos dueños del dominio. Existe validación por http, DNS y por email. En mi caso lo realicé mediante validación por correo. Al comprar el dominio configuré que todo el correo que llegue a admin@dominio.com sea redireccionado a mi correo personal.

4.- Indicar la dirección de correo a la que enviarán un .zip con el fichero de certificado .crt y un fichero “bundle” .ca-bundle para configurar Apache.

5.- En la cuenta de correo admin@dominio.com (o la indicada) llegará el correo de validación que se trata de introducir un código en una URL indicada.

6.- Nos llegará el fichero .zip con el fichero de certificado .crt y un fichero “bundle” .ca-bundle para configurar Apache que copiaremos al servidor (en /etc/apache2/certs o /etc/ssl por ejemplo).

7.- Activar mod_ssl de Apache: a2enmod mod_ssl.

8.- Configurar los virtualhosts para que utilicen el certificado:

9.- Reiniciar Apache: service apache2 restart