No estás usando esta distribución?

Selecciona una versión o distribución diferente

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:

Resultado de dnsdumpster.com

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
Configurar VirtualHost por dominio en Apache [Debian, Ubuntu, CentOS]
En este caso vamos a utilizar Apache y para ello vamos a tener que configurar un VirtualHost para un subdominio.

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.

Instalación de phpMyAdmin bajo un VirtualHost en GNU/Linux
PhpMyADmin es una herramienta destinada a gestionar y administrar bases de datos MySQL/MariaDB a través de una interfaz web.

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');
Haz que cada palabra cuente: tu donación nos inspira a seguir creando contenido. Accede al apartado de Donación para hacer tu aportación