Servidor de correo – Configuración MySQL e instalación PHPMyAdmin (parte 5)

Esta es una entrada dentro de la serie para la instalación de un servidor de correo completo. Índice completo de contenidos pincha aquí.


En esta entrada vamos a crear la base de datos para nuestro servidor de correo, en la cual figurarán tanto los dominios, como los buzones y los alias para buzones que formarán lo que será nuestro ecosistema personal de correo electrónico para nuestros dominios.


Securizar instalación de MySQL

A continuación, securizamos la instalación de MySQL con el comando

mysql_secure_installation

Cambiamos la contraseña de root, desactivamos el login para usuario anónimo, desactivamos el login remoto de root, borramos la base de datos de test, recargamos los privilegios de tablas, todo ello contestando a las preguntas que nos irá realizando el asistente:

  • Remove anonymous users?
  • Disallow root login remotely?
  • Remove test database and access to it?
  • Reload privilege tables now?

Crear la base de datos

Creamos la base de datos con el siguiente comando, con el usuario root que usamos para la instalación:

mysqladmin -u root -p create mailserver

Creamos un usuario para que solo tenga acceso a esta base de datos, cambiando la password por la que se quiera configurar:

 

GRANT SELECT ON mailserver.* TO ‘mailuser’@’127.0.0.1’ IDENTIFIED BY ‘supersecretpassword’;

Reiniciamos privilegios

FLUSH PRIVILEGES;

Crear tabla de dominios

Cambiamos a la base de datos creada:

use mailserver;

Creamos la tabla para los dominios virtual_domains:

CREATE TABLE `virtual_domains` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(50) NOT NULL,
  `active` BOOLEAN NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Crear tabla de usuarios y credenciales

Creamos la tabla para los buzones y credenciales virtual_users:

CREATE TABLE `virtual_users` (
  `id` int(11) NOT NULL auto_increment,
  `domain_id` int(11) NOT NULL,
  `password` varchar(106) NOT NULL,
  `email` varchar(100) NOT NULL,
  `quota` varchar(10) NOT NULL,
  `active` BOOLEAN NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `email` (`email`),
  FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Las credenciales vamos a almacenarlas en MD5, por lo que el tipo de campo será varchar de 106 caracteres, ya que la codificación la haremos fuera de la base de datos.


Crear tabla de alias

Creamos la tabla de alias para usuarios virtual_aliases:

CREATE TABLE `virtual_aliases` (
  `id` int(11) NOT NULL auto_increment,
  `domain_id` int(11) NOT NULL,
  `source` varchar(100) NOT NULL,
  `destination` varchar(100) NOT NULL,
  `active` BOOLEAN NOT NULL,
  PRIMARY KEY (`id`),
  FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Agregar dominios

Agregamos varios dominios a la tabla virtual_domains:

INSERT INTO `mailserver`.`virtual_domains`
  (`id` ,`name` , `active`)
VALUES
  ('1', 'domain.com', true),
  ('2', 'hostname.tiraquelibras.com', true),
  ('3', 'hostname', true),
  ('4', 'localhost.tiraquelibras.com', true),
  ('5', 'tiraquelibras.com', true);

El ID que se indica en cada entrada es importante para los siguientes dos puntos.


Crear un buzón de pruebas

Creamos un buzón de prueas email1@tiraquelibras.com, para realizar pruebas de login y envío/recepción en las siguientes entradas:

INSERT INTO `mailserver`.`virtual_users`
  (`id`, `domain_id`, `password` , `email`, `active`)
VALUES
  ('1', '5', MD5(‘secretpasswd’), 'email1@tiraquelibras.com', true);

PHPMyAdmin

Instalaicón

Creamos un usuario específico para acceder a la interfaz web distinto de root y reiniciamos los privilegios:

grant all on *.* to 'phpmyadmin'@'localhost' identified by 'supersecretpasswdforphpmyadmin' with grant option;
flush privileges;

Ahora instalamos los paquetes de PHP:

apt-get -y install php7.0 libapache2-mod-php7.0

Se instalan varios paquetes adiccionales.

Reiniciamos Apache:

service apache2 restart

Ahora tenemos que instalar el soporte MySQL para PHP:

apt-get -y install php7.0-mysql

Reiniciamos de nuevo Apache:

service apache2 restart

Confirmamos que la caché OPCache para optimizar el rendimiento de Apache2 se encuentra instalada correctamente:

# php7.0 --version
PHP 7.0.33-0+deb9u3 (cli) (built: Mar  8 2019 10:01:24) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies
    with Zend OPcache v7.0.33-0+deb9u3, Copyright (c) 1999-2017, by Zend Technologies

Vemos que la caché está instalada con la información mostrada:

with Zend OPcache

Si no la tuviéramos sería necesario instalarla con el comando:

apt-get -y install php7.0-opcache

Otra caché muy útil es APCu, la cual es libre para cachear y optimizar código intermedio de PHP:

apt-get -y install php-apcu

Reiniciamos de nuevo Apache:

service apache2 restart

Instalamos PHPMyAdmin:

apt-get -y install phpmyadmin

Y seguimos los pasos del asistente.

Indicamos que será para Apachd2:

Empieza a reconfigurar Apache2 hasta que nos pregunta por la base de datos para phpmyadmin con dbconfig-common, le indicamos que sí:

Nos pregunta por la contraseña para la aplicación, indicamos la del usuario creado antes y la confirmamos:

Ahora accediendo a la URL http://X.X.X.X/phpmyadmin, siendo X.X.X.X la IP de tu servidor en el que estás trabajando, accedemos a la interfaz Web, con las credenciales del usuario creadas al principio de este apartado.

Vemos que la configuración web para PHPMyAdmin se encuentra en el directorio /etc/apache2/conf-enabled/phpmyadmin.conf

Habilitamos la extensión de PHP mbstring que será usada para administrar variables NON-ASCII y convertirlas en variables de diferentes codificaciones:

sudo phpenmod mbstring

Reiniciamos Apache2:

systemctl restart apache2

Configurar autenticación Apache

Securizamos la instancia PHPMyAdmin, al ser un objetivo habitual de los atacantes. Hay que tener una preocupación extra para impedir accesos no autorizados. Usaremos la autenticación de Apache con .htaccess y funcionalidades de autorización.

Primero debemos de habilitar el uso de .htaccess editando la configuración de Apache editando el archivo

/etc/apache2/conf-available/phpmyadmin.conf y agregando la directiva AllowOverride All en la sección <Directory /usr/share/phpmyadmin>:

...
<Directory /usr/share/phpmyadmin>
    Options SymLinksIfOwnerMatch
    DirectoryIndex index.php
    AllowOverride All
...

Guardamos y reiniciamos Apache para implementar los cambios:

systemctl restar apache2

Ahora creamos el archivo .htaccess en el directorio en donde se encuentra la instancia de PHPMyAdmin, en nano /usr/share/phpmyadmin/.htaccess, y agregamos el siguiente contenido:

AuthType Basic
AuthName "Restricted Files"
AuthUserFile /etc/phpmyadmin/.htpasswd
Require valid-user

Para la localización indicada en el parámetro AuthUserFilen vamos a crear un archivo de contraseñas con la utilizada htpasswd, indicando el username que queramos:

sudo htpasswd -c /etc/phpmyadmin/.htpasswd username

En nuestro caso usaremos el mismo que para el acceso a PHPMyAdmin:

sudo htpasswd -c /etc/phpmyadmin/.htpasswd userforphpmyadmin

Agregamos la password y la confirmamos.

Ahora si queremos agregar nuevos usuarios usaríamos el comando sin la opción -c.

Al acceder a la URL http://X.X.X.X/phpmyadmin, siendo X.X.X.X la IP de tu servidor en el que estás trabajando, nos pedirá la credencial de acceso que acabamos de crear.

Configurar certificado SSL

Ahora securizamos con un certificado autofirmado.

Primero nos aseguramos que el módulo ssl está instalado y activado para Apache2 y lo reiniciamos:

a2enmod ssl

service apache2 restart

Creamos una entrada en nuestro DNS, por ejemplo phpmyadmin.tiraquelibras.com, e instalamos un certificado de Let’s Ecrypt para este dominio, indicando que redirija a HTTPS.

Creamos un VirtualHost para este dominio nuevo nano /etc/apache2/sites-available/phpmyadmin.tiraquelibras.com con el siguiente contenido:

<VirtualHost *:80>

ServerAdmin email@email.com # Indicar un email correcto.
ServerName phpmyadmin.tiraquelibras.com
DocumentRoot /var/www/html/phpmyadmin.tiraquelibras.com

ErrorLog ${APACHE_LOG_DIR}/phpmyadmin.tiraquelibras.com_error.log
CustomLog ${APACHE_LOG_DIR}/phpmyadmin.tiraquelibras_access.log combined

<Directory /usr/share/phpmyadmin>
    Allow from all
    Deny from None
    Order Allow,Deny
</Directory>

<Location /phpmyadmin>
    Allow from all
    Deny from None
    Order Allow,Deny
</Location>

</VirtualHost>

Este contenido nos va a permitir acceder a PHPMyAdmin desde el dominio creado.

Ahora habilitamos el dominio

a2ensite phpmyadmin.tiraquelibras.com.conf

para que cree el link simbólico con el directorio sites-enabled.

Reiniciamos Apache

systemctl restart apache2

Ahora creamos el certificado de Let’s Encrypt para el dominio phpmyadmn.tiraquelibras.com y le indicamos que haga la redirección a HTTPS. Para más información sobre certificados Let’s Encrypt puedes visitar la entrada para Centos pinchando aquí o para Debian pinchando aquí:

certbot --apache -d phpmyadmin.tiraquelibras.com

Esto modifica los archivos de configuración del VirtualHost para HTTP y crea el de HTTPS en el archivo que hemos creado en el paso anterior /etc/apache2/sites-available/strato.yeloquehay.com.conf

...
RewriteEngine on
RewriteCond %{SERVER_NAME} =strato.yeloquehay.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
...

Y se creó el siguiente archivo para HTTPS en el archivo /etc/apache2/sites-available/strato.yeloquehay.com-le-ssl.conf:

<IfModule mod_ssl.c>
<VirtualHost *:443>

ServerAdmin email@email.com # Indicar un email correcto.
ServerName phpmyadmin.tiraquelibras.com
DocumentRoot /var/www/html/phpmyadmin.tiraquelibras.com

ErrorLog ${APACHE_LOG_DIR}/phpmyadmin.tiraquelibras.com_error.log
CustomLog ${APACHE_LOG_DIR}/phpmyadmin.tiraquelibras_access.log combined

<Directory /usr/share/phpmyadmin>
    Allow from all
    Deny from None
    Order Allow,Deny
</Directory>

<Location /phpmyadmin>
    Allow from all
    Deny from None
    Order Allow,Deny
</Location>



SSLCertificateFile /etc/letsencrypt/live/phpmyadmin.tiraquelibras.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/phpmyadmin.tiraquelibras.com/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>

Ahora agregamos al final del archivo sudo nano /etc/phpmyadmin/config.inc.php la siguiente línea:

$cfg['ForceSSL'] = true;

Y para acabar modificamos el archivo /usr/share/phpmyadmin/.htaccess para redirigir la URL si accedemos a la IP del servidor en lugar de al nombre de dominio, cambiando X.X.X.X por la IP del servidor en el que estás trabajando:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^X.X.X.X
RewriteRule (.*) https://phpmyadmin.tiraquelibras.com/phpmyadmin [R=301,L]

<If "%{HTTPS} == 'on'">
AuthType Basic
AuthName "Restricted Files"
AuthUserFile /etc/phpmyadmin/.htpasswd
Require valid-user
</If>

con esto ya tendríamos acceso a la URL https://phpmyadmin.tiraquelibras.com/phpmyadmin, pudiendo administrar la base de datos de dominios, buzones y alias.


Índice general pincha aquí.