Cómo configurar el servidor de correo Postfix y Dovecot con la base de datos (MariaDB) de forma segura - Parte 1


En esta serie de 3 artículos, discutiremos cómo configurar un servidor de correo Postfix con protección antivirus y contra correo no deseado en una caja CentOS 7. Tenga en cuenta que estas instrucciones también funcionan en otras distribuciones como RHEL/Fedora y Debian/Ubuntu.

Nuestro plan consiste en almacenar cuentas de correo electrónico y alias en una base de datos MariaDB que, para nuestra conveniencia, será administrada a través de phpMyAdmin.

Si elige no instalar phpMyAdmin, o está tratando con un servidor solo CLI, también le proporcionaremos el código equivalente para crear las tablas de la base de datos que se utilizarán en esta serie.

Dado que mantener un servidor de correo en funcionamiento es una de las tareas esenciales que generalmente se asignan a los administradores e ingenieros de sistemas, también brindaremos algunos consejos para ejecutar de manera eficiente este servicio crítico en un entorno de producción.

Crear registros A y MX para el dominio en DNS

Antes de continuar, hay algunos requisitos previos que deben cumplirse:

1. Necesitará un dominio válido registrado a través de un registrador de dominios. En esta serie usaremos www.linuxnewz.com , que fue registrado a través de GoDaddy.

2. Dicho dominio debe apuntar a la IP externa de su VPS o proveedor de alojamiento en la nube. Si tiene su propio servidor de correo, puede utilizar el servicio ofrecido por FreeDNS (requiere registro).

En cualquier caso, también debe configurar los registros A y MX para su dominio (puede obtener más información sobre los registros MX en estas preguntas frecuentes de Google).

Una vez agregados, puede buscarlos usando una herramienta en línea como MxToolbox o ViewDNS para asegurarse de que estén configurados correctamente.

Importante: tenga en cuenta que puede tomar un tiempo (1-2 días) hasta que los registros DNS se propaguen y su dominio esté disponible. Mientras tanto, puede acceder a su VPS a través de su dirección IP para realizar las tareas que se indican a continuación.

3. Configure el FQDN (Nombre de dominio completo) de su VPS:

# hostnamectl set-hostname yourhostname

para configurar el nombre de host del sistema, luego edite/etc/hosts de la siguiente manera (reemplace AAA.BBB.CCC.DDD, su nombre de host y su dominio con la IP pública de su servidor, su nombre de host y su dominio registrado):

AAA.BBB.CCC.DDD yourhostname.yourdomain.com       yourhostname

donde yourhostname es el nombre de host del sistema que se estableció previamente mediante el comando hostnamectl.

Instalación de paquetes de software necesarios

4. Para instalar los paquetes de software necesarios, como Apache, Postfix, Dovecot, MariaDB, PhpMyAdmin, SpamAssassin, ClamAV, etc., debe habilitar el repositorio EPEL:

# yum install epel-release

5. Una vez que haya seguido los pasos anteriores, instale los paquetes necesarios:

# yum update && yum install httpd httpd-devel postfix dovecot dovecot-mysql spamassassin clamav clamav-scanner clamav-scanner-systemd clamav-data clamav-update mariadb mariadb-server php phpMyAdmin
# aptitude update && aptitude install apache2 postfix dovecot-core dovecot-imapd dovecot-pop3d dovecot-lmtpd dovecot-mysql spamassassin clamav clamav-daemon clamav-base mariadb-client mariadb-server php5 phpMyAdmin

6. Inicie y habilite los servidores web y de bases de datos:

# systemctl enable httpd mariadb
# systemctl start httpd mariadb
# systemctl enable apache2 mariadb
# systemctl start apache2 mariadb

Cuando la instalación esté completa y el servicio anterior esté habilitado y en ejecución, comenzaremos configurando la base de datos y las tablas para almacenar información sobre las cuentas de correo de Postfix.

Creación de una base de datos de cuentas de correo de Postfix

Para simplificar, usaremos phpMyAdmin, una herramienta destinada a manejar la administración de bases de datos MySQL/MariaDB a través de una interfaz web, para crear y administrar la base de datos de correo electrónico.

Sin embargo, para iniciar sesión y utilizar esta herramienta, debemos seguir estos pasos:

7. Habilite la cuenta MariaDB (puede hacerlo ejecutando la utilidad mysql_secure_installation desde la línea de comandos, asignando una contraseña para el usuario raíz y estableciendo la configuración predeterminada propuesta por la herramienta EXCEPTO "No permitir el inicio de sesión de root de forma remota ? “:

o crear un nuevo usuario de base de datos:

MariaDB [(none)]> CREATE USER 'dba'@'localhost' IDENTIFIED BY 'YourPasswordHere';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON * . * TO 'dba'@'localhost';
MariaDB [(none)]> FLUSH PRIVILEGES;

Asegure Apache con un certificado

8. Dado que usaremos una aplicación web para administrar la base de datos del servidor de correo electrónico, debemos tomar las precauciones necesarias para proteger las conexiones al servidor. De lo contrario, nuestras credenciales de phpMyAdmin viajarán en texto sin formato a través del cable.

Para configurar Transport Layer Security (TLS) en su servidor, siga los pasos descritos en la Parte 8 de la serie RHCE: Implementación de HTTPS a través de TLS usando Network Security Service (NSS) para Apache antes de continuar.

Nota: si no tiene acceso a la consola del servidor, necesitará encontrar otra forma de generar la entropía necesaria durante la creación de la clave. En ese caso, es posible que desee considerar instalar rng-tools y ejecutar rngd -r/dev/urandom.

Configurar y proteger PhpMyAdmin

9. En /etc/httpd/conf.d/phpMyAdmin.conf (CentOS) o /etc/phpmyadmin/apache.conf (Debian y derivados), ubique todas las ocurrencias de las siguientes líneas y asegúrese de que apunten a la IP pública de su servidor:

Require ip AAA.BBB.CCC.DDD
Allow from AAA.BBB.CCC.DDD

Además, desactive los alias predeterminados y cree uno nuevo para acceder a su página de inicio de sesión de phpMyAdmin. Esto ayudará a proteger el sitio contra bots y atacantes externos que se dirijan a www.yourdomain.com/phpmyadmin o www.yourdomain.com/phpMyAdmin.

#Alias /phpMyAdmin /usr/share/phpMyAdmin
#Alias /phpmyadmin /usr/share/phpMyAdmin
Alias /managedb /usr/share/phpMyAdmin

Además, agregue la siguiente línea dentro de :

Require all granted

Crear Apache VirtualHost para dominio

10. Asegúrese de que su dominio se agregue a los sitios habilitados. Cree /etc/httpd/sites-available/linuxnewz.com.conf (CentOS) o /etc/apache2/sites-available/linuxnewz.com (Debian) con el siguiente contenido (asegúrese de que DocumentRoot, sites-available y sites -existen directorios habilitados):

<VirtualHost *:80>
    ServerName www.linuxnewz.com
    ServerAlias linuxnewz.com
    DocumentRoot /var/www/linuxnewz.com/public_html
    ErrorLog /var/www/linuxnewz.com/error.log
    CustomLog /var/www/linuxnewz.com/requests.log combined
    Options Indexes FollowSymLinks
</VirtualHost>

y el enlace simbólico:

# ln -s /etc/httpd/sites-available/linuxnewz.com.conf /etc/httpd/sites-enabled/linuxnewz.com.conf
# a2ensite linuxnewz.com

y tu estas listo.

Configurar la base de datos de correo electrónico de Postfix

11. Ahora puede abrir su interfaz phpMyAdmin en https://www.yourdomain.com/managedb (tenga en cuenta que managedb es el alias que configuramos anteriormente para el directorio de datos phpMyAdmin).

Si eso no funciona (lo cual puede ser causado por un retraso en la propagación o falta de configuración de los registros DNS) por el momento, puede intentar usar la dirección IP pública de su servidor en lugar de www.yourdomain.com:

En cualquier caso, después de iniciar sesión en phpMyAdmin, verá la siguiente interfaz. Haga clic en Nuevo en la sección de la izquierda:

Ingrese un nombre para la base de datos (EmailServer_db en este caso, no es necesario seleccionar una intercalación) y haga clic en Crear:

12. En la siguiente pantalla, elija un nombre para la primera tabla (donde almacenaremos los dominios que administrará este servidor de correo.

Tenga en cuenta que incluso cuando en esta serie solo administraremos un dominio, puede agregar más más adelante) y la cantidad de campos que desea en él, luego haga clic en Ir. Se le pedirá que nombre y configure esos dos campos, donde podrá proceder con seguridad como se indica en las siguientes imágenes:

Cuando elija PRIMARIO en Índice para DomainId, acepte los valores predeterminados y haga clic en Ir:

Alternativamente, puede hacer clic en Preview SQL para ver el código debajo del capó:

CREATE TABLE `EmailServer_db`.`Domains_tbl` ( `DomainId` INT NOT NULL AUTO_INCREMENT , `DomainName` VARCHAR(50) NOT NULL , PRIMARY KEY (`DomainId`)) ENGINE = InnoDB;

Cuando esté listo, haga clic en Guardar para confirmar los cambios. Luego podrá hacer clic en Nuevo en EmailServer_db para continuar creando tablas:

13. Ahora siga estos pasos para crear el resto de las tablas. Haga clic en la pestaña SQL e ingrese el código indicado para cada objeto de la base de datos.

Tenga en cuenta que en este caso optamos por crear la tabla mediante una consulta SQL debido a las relaciones que se deben establecer entre diferentes tablas:

CREATE TABLE `Users_tbl` ( 
    `UserId` INT NOT NULL AUTO_INCREMENT,  
    `DomainId` INT NOT NULL,  
    `password` VARCHAR(100) NOT NULL,  
    `Email` VARCHAR(100) NOT NULL,  
    PRIMARY KEY (`UserId`),  
    UNIQUE KEY `Email` (`Email`),  
    FOREIGN KEY (DomainId) REFERENCES Domains_tbl(DomainId) ON DELETE CASCADE 
) ENGINE = InnoDB; 

Debería recibir un mensaje de confirmación (si no, phpMyAdmin le pedirá errores de sintaxis):

CREATE TABLE `Alias_tbl` (
    `AliasId` INT NOT NULL AUTO_INCREMENT, 
    `DomainId` INT NOT NULL, 
    `Source` varchar(100) NOT NULL, 
    `Destination` varchar(100) NOT NULL, 
    PRIMARY KEY (`AliasId`), 
    FOREIGN KEY (DomainId) REFERENCES Domains_tbl(DomainId) ON DELETE CASCADE
) ENGINE = InnoDB;

(Haga clic en Ir en la parte inferior para continuar con la creación de la tabla).

Hasta este punto, debe tener la siguiente estructura de base de datos:

Lo que significa que está listo para comenzar a agregar algunos registros en la siguiente sección.

Creación de un dominio, usuarios y alias de Postfix

14. Ahora insertaremos los siguientes registros en las tres tablas. Las contraseñas de [correo electrónico protegido] y [correo electrónico protegido] se cifrarán y la declaración INSERT INTO Users_tbl.

Además, tenga en cuenta que los correos electrónicos enviados a [email protected] serán redirigidos a [email protected]:

INSERT INTO Domains_tbl (DomainName) VALUES ('linuxnewz.com');  
INSERT INTO Users_tbl (DomainId, password, Email) VALUES (1, ENCRYPT('PasswordForFirstEmailAccount', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), '[email protected]');  
INSERT INTO Users_tbl (DomainId, password, Email) VALUES (1, ENCRYPT('PasswordForSecondEmailAccount', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), '[email protected]');  
INSERT INTO Alias_tbl (DomainId, Source, Destination) VALUES (1, '[email protected]', '[email protected]');

Habiendo agregado nuestro dominio, dos cuentas de usuario y un alias de correo electrónico, estamos listos para continuar configurando nuestro servidor de correo electrónico en el próximo artículo de esta serie, donde configuraremos Dovecot y Postfix.

Resumen

En este artículo, enumeramos los paquetes necesarios para instalar un servidor de correo electrónico Postfix en un VPS CentOS 7 y explicamos cómo administrar la base de datos subyacente mediante phpMyAdmin.

En los siguientes dos artículos revisaremos la configuración de los dos programas que se encargarán de la distribución del correo electrónico para nuestro dominio (Parte 2) y le mostraremos cómo agregar protección contra spam y virus (Parte 3) para su servidor.

Hasta entonces, no dude en contactarnos mediante el formulario a continuación si tiene alguna pregunta o comentario.