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.
Tabla de contenidos
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í.