En los siguientes 4 artículos veremos como configurar un servidor de correo seguro con Postfix y Dovecot. Además almacenaremos los dominios, los usuarios y los alias en una base de datos con MariaDB.
Durante el proceso también instalaremos RoundCube para poder enviar e-mails desde el cliente web. Tanto RoundCube como el servidor de correo completo estará configurado bajo SSL.
Todo el proceso lo realizaremos bajo Debian 10, pero la configuración es muy similar en otras distribuciones como Ubuntu o CentOS.
Configuración DNS y hostname
Lo primero que haremos será configurar nuestro dominio para que funcione bajo un servidor de correo. Para ello necesitamos configurar registros tipo A, MX y SPF.
Una configuración similar a esta:

Luego configuramos el FQDN en nuestro servidor:
hostnamectl set-hostname dominio.com
Luego modificaremos el fichero /etc/hosts
y añadiremos la IP de nuestro servidor y luego el dominio principal:
[IP_Servidor] dominio.com mail.dominio.com mail
Instalación y configuración de Apache
Deberemos de instalar y configurar correctamente un servidor web para poder alojar diferentes aplicaciones web que vamos a tener que instalar (phpmyadmin y roundcube), para ello instalamos Apache y otros paquetes necesarios:
apt install apache2 certbot python-certbot-apache mariadb-client mariadb-server php7.3 php7.3-mysql php7.3-mbstring
Habilitamos los servicios en el arranque:
systemctl enable apache2 mariadb
systemctl start apache2 mariadb

Luego creamos un fichero de configuración de Apache para phpMyAdmin y Roundcube que pondremos en dos VirtualHost diferentes, por lo que tendremos que crear dos ficheros en /etc/apache2/sites-available
con el siguiente contenido:
<VirtualHost *:80>
ServerName dominio.com
ServerAlias www.dominio.com
DocumentRoot /var/www/html/vhosts/dominio.com/www
ErrorLog /var/www/html/vhosts/dominio.com/logs/error.log
LogLevel warn
CustomLog /var/www/html/vhosts/dominio.com/logs/access.log combined
Options Indexes FollowSymLinks
</VirtualHost>
En mi caso, crearé un subdominio para phpMyAdmin (db.dominio.com
) y otro para RoundCube (webmail.dominio.com
).
Creamos los directorios necesarios y ponemos los permisos correctos:
mkdir -p /var/www/html/vhosts/db.dominio.com/{www,logs}
mkdir -p /var/www/html/vhosts/webmail.dominio.com/{www,logs}
chown www-data.www-data -R /var/www/html/vhosts/db.dominio.com
chown www-data.www-data -R /var/www/html/vhosts/webmail.dominio.com
Habilitamos el dominio y reiniciamos Apache:
a2ensite phpmyadmin.conf roundcube.conf
systemctl restart apache2
Luego con Certbot agregamos el certificado para db.dominio.com
y webmail.dominio.com
certbot
Instalación de phpMyAdmin
Como que en Debian 10 han eliminado el paquete phpMyAdmin de repositorios, tendremos que descargarlo e instalarlo manualmente.
Para realizar esta instalación deberemos de seguir las instrucciones de este otro tutorial donde explica como configurar phpMyAdmin en un VirtualHost.

Creación de la base de datos para las cuentas de correo de Postfix
Para simplificar, usaremos phpMyAdmin, una herramienta destinada a gestionar y administración de bases de datos MySQL/MariaDB a través de una interfaz web.
Sin embargo, para iniciar sesión y utilizar esta herramienta, debemos de crear un usuario y habilitar el inicio de sesión remotamente.
Para ello debemos de ejecutar lo siguiente y dejaremos la configuración por defecto excepto la opción «Disallow root login remotely«:

Iniciamos sesión con root
en MySQL y creamos el usuario y le damos permisos:
mysql -u root -p
MariaDB > CREATE USER 'dba'@'localhost' IDENTIFIED BY 'YourPasswordHere';
MariaDB > GRANT ALL PRIVILEGES ON * . * TO 'dba'@'localhost';
MariaDB > FLUSH PRIVILEGES;
Configuración de la base de datos
Ahora deberemos de acceder a phpMyAdmin usando el subdominio que hemos creado anteriormente http://db.dominio.com
y deberemos de acceder con el usuario dba
:

Después de iniciar sesión en phpMyAdmin, tendremos que crear la base de datos:

Haremos clic en Nueva y luego crearemos la base de datos bajo el nombre EmailServer_db. En el desplegable, pondremos la opción Collation (cotejamiento).

Tras seleccionar la Base de Datos que hemos creado iremos a la pestaña SQL y añadiremos lo siguiente para crear las tablas necesarias:

CREATE TABLE `Alias_tbl` (
`AliasId` int(11) NOT NULL,
`DomainId` int(11) NOT NULL,
`Source` varchar(100) NOT NULL,
`Destination` varchar(100) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `Domains_tbl` (
`DomainId` int(11) NOT NULL,
`DomainName` varchar(50) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `Users_tbl` (
`UserId` int(11) NOT NULL,
`DomainId` int(11) NOT NULL,
`password` longtext NOT NULL,
`Email` varchar(100) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
ALTER TABLE `Alias_tbl`
ADD PRIMARY KEY (`AliasId`),
ADD KEY `DomainId` (`DomainId`);
ALTER TABLE `Domains_tbl`
ADD PRIMARY KEY (`DomainId`);
ALTER TABLE `Users_tbl`
ADD PRIMARY KEY (`UserId`),
ADD UNIQUE KEY `Email` (`Email`),
ADD KEY `DomainId` (`DomainId`);
ALTER TABLE `Alias_tbl`
MODIFY `AliasId` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3;
ALTER TABLE `Domains_tbl`
MODIFY `DomainId` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=5;
ALTER TABLE `Users_tbl`
MODIFY `UserId` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=4;
ALTER TABLE `Alias_tbl`
ADD CONSTRAINT `Alias_tbl_ibfk_1` FOREIGN KEY (`DomainId`) REFERENCES `Domains_tbl` (`DomainId`) ON DELETE CASCADE;
ALTER TABLE `Users_tbl`
ADD CONSTRAINT `Users_tbl_ibfk_1` FOREIGN KEY (`DomainId`) REFERENCES `Domains_tbl` (`DomainId`) ON DELETE CASCADE;
Al final, tenemos que tener algo parecido a esto:

Creando dominios, usuarios y alias en la Base de Datos de Postfix
Ahora que ya tenemos la base de datos creada con todas las tablas necesarias, deberemos de agregar los datos.
Para ello tendremos que ejecutar las siguientes consultas SQL. Para añadir un dominio:
INSERT INTO Domains_tbl (DomainName) VALUES ('dominio.com');
Para añadir cuentas de correo:
INSERT INTO Users_tbl (DomainId, password, Email) VALUES (1, ENCRYPT('PasswordForFirstEmailAccount', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), 'admin@dominio.com');
INSERT INTO Users_tbl (DomainId, password, Email) VALUES (1, ENCRYPT('PasswordForSecondEmailAccount', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), 'postmaster@dominio.com');
Para añadir alias en las cuentas de correo:
INSERT INTO Alias_tbl (DomainId, Source, Destination) VALUES (1, 'superadmin@dominio.com', 'admin@dominio.com');
Comentarios