📨 ¡Primero, lea el artículo anterior!
Este es el quinto artículo de la serie "Construcción de un servidor de correo en Linux".
En el artículo anterior, analizamos cuatro archivos de configuración esenciales de Dovecot. Si aún no lo ha leído, le recomiendo que lo revise primero.
👉 Artículo anterior: Análisis de los archivos de configuración esenciales de Dovecot


🔄 Guía de reordenación
En el artículo anterior, se anunció que "en el siguiente artículo se tratará la configuración de auth-sql.conf.ext", pero,
mientras escribía, decidí que explicar el diseño de la tabla de la base de datos primero tiene más sentido lógico.

Por lo tanto, en este artículo abordaremos el concepto de usuarios virtuales de Dovecot y el diseño de tablas de PostgreSQL,
y en el siguiente artículo explicaré la configuración de auth-sql.conf.ext que vincula Dovecot y PostgreSQL.


🎯 ¿Qué son los usuarios virtuales de Dovecot? ¿Por qué son necesarios?

Existen dos formas principales de autenticar usuarios en Dovecot.

  1. Autenticación basada en cuentas del sistema
  2. Autenticación utilizando los archivos /etc/passwd y /etc/shadow de Linux
  3. Utilización de cuentas de usuario del sistema comunes
  4. Manejar cuentas es engorroso y es difícil crear cuentas dedicadas para correo

  5. Autenticación basada en usuarios virtuales (Virtual Users)

  6. Autenticación utilizando una base de datos separada (PostgreSQL, MySQL, etc.)
  7. Gestión de usuarios de correo dedicados, independiente de las cuentas del sistema
  8. Alta seguridad y escalabilidad, adecuado para un gran servicio de correo

Planeamos construir un entorno de usuarios virtuales utilizando PostgreSQL.
Es decir, se autentica extrayendo información de usuario de la base de datos sin crear cuentas de Linux reales.

🔹 Ventajas de un entorno de usuarios virtuales

  • Mayor seguridad al estar separado de las cuentas del sistema
  • Facilidad para agregar o eliminar cuentas de usuario
  • Soporte para múltiples dominios (gestión de varios dominios de correo en un solo servidor)
  • Alta escalabilidad y fácil gestión

Pigeon holding a letter near a database


🛠️ Diseño de tablas en PostgreSQL

Para administrar adecuadamente a los usuarios virtuales en Dovecot, se necesitan al menos 3 tablas.

1️⃣ Estructura de tablas necesarias

  1. mail_domain - Lista de dominios que el servidor de correo administrará
  2. mail_users - Información de los usuarios de correo reales
  3. mail_alias - Gestión de alias de correo electrónico (reenvío)

La razón para separar estas funciones es la escalabilidad y la facilidad de mantenimiento.
Resulta muy útil cuando se quiere operar varios dominios de correo o reenviar ciertos correos electrónicos a otra dirección.


2️⃣ Esquema de tablas y ejemplos de SQL

📌 1. mail_domain (gestión de lista de dominios)
Esta tabla gestiona los dominios que el servidor de correo permitirá.
Es decir, define dominios de correo como example.com y mydomain.com.

CREATE TABLE mail_domain (
    id SERIAL PRIMARY KEY,
    domain_name VARCHAR(255) NOT NULL UNIQUE,
    active BOOLEAN DEFAULT TRUE,
    created_at TIMESTAMP DEFAULT NOW()
);

🔹 Descripción
- domain_name → Dominio de correo (por ejemplo: example.com)
- active → Si el dominio se utilizará (puede ser desactivado)
- created_at → Fecha de creación

Ejemplo de inserción de datos de muestra

INSERT INTO mail_domain (domain_name) VALUES ('example.com');
INSERT INTO mail_domain (domain_name) VALUES ('mydomain.com');

📌 2. mail_users (cuentas de usuarios de correo)
Aquí se almacenan los datos de las cuentas de los usuarios que usarán el correo.
Cada usuario debe pertenecer a un dominio específico.

CREATE TABLE mail_users (
    id SERIAL PRIMARY KEY,
    domain_id INT NOT NULL REFERENCES mail_domain(id) ON DELETE CASCADE,
    email VARCHAR(255) NOT NULL UNIQUE,
    password TEXT NOT NULL,
    home_directory TEXT NOT NULL,
    created_at TIMESTAMP DEFAULT NOW()
);

🔹 Descripción
- domain_id → Conectado con el id de la tabla mail_domain (dominio al que pertenece el usuario de correo)
- email → Dirección de correo electrónico del usuario (user@example.com)
- password → Almacena la contraseña encriptada
- home_directory → Ruta donde se almacenará el correo (/var/mail/vmail/user@example.com)
- created_at → Fecha de creación de la cuenta

Ejemplo de inserción de datos de muestra

INSERT INTO mail_users (domain_id, email, password, home_directory)
VALUES (1, 'user@example.com', 'hashed_password_here', '/var/mail/vmail/user@example.com');

📌 3. mail_alias (alias de correo electrónico / reenvío) Se necesita para reenviar una dirección de correo a otra o usar varios alias para una sola dirección.

CREATE TABLE mail_alias (
    id SERIAL PRIMARY KEY,
    domain_id INT NOT NULL REFERENCES mail_domain(id) ON DELETE CASCADE,
    source_email VARCHAR(255) NOT NULL,
    destination_email VARCHAR(255) NOT NULL,
    created_at TIMESTAMP DEFAULT NOW()
);

🔹 Descripción

  • source_email → Dirección de correo electrónico original (ej: contact@example.com)
  • destination_email → Dirección de correo electrónico a la que se reenviará (ej: admin@example.com)
  • Realiza la función de reenviar automáticamente un correo a otra dirección

Ejemplo de inserción de datos de muestra

INSERT INTO mail_alias (domain_id, source_email, destination_email)
VALUES (1, 'contact@example.com', 'admin@example.com');

Ahora, los correos enviados a contact@example.com se reenviarán automáticamente a admin@example.com.

🔍 Tablas recomendadas para futuras expansiones

Además de operar un servicio de correo básico, se pueden ampliar las funciones adicionales. A continuación se presentan ejemplos de tablas que podrían ser expandidas en el futuro.

Nombre de tabla Rol
mail_quota Limitar el tamaño del correo por usuario
mail_blacklist Lista de correos electrónicos bloqueados
mail_whitelist Lista de correos electrónicos permitidos
mail_forwarding Reenvío a cuentas de correo externas
mail_autoresponder Gestionar mensajes de respuesta automática
mail_address_book Gestionar la libreta de direcciones interna

🏁 Resumen y siguientes pasos

Contenido tratado en este artículo
- El concepto y la necesidad de usuarios virtuales de Dovecot
- Diseño de tablas de PostgreSQL (mail_domain, mail_users, mail_alias)
- Recomendación de tablas adicionales para la expansión en la gestión del correo

Avance del próximo artículo: configuración de auth-sql.conf.ext y métodos de hashing de contraseñas
Ahora que las tablas de la base de datos están preparadas, en el siguiente artículo explicaré cómo Dovecot obtiene información de usuario de PostgreSQL para autenticar,
y también trataré sobre el método de hashing de contraseñas que se usará en las cuentas de usuario de correo.

En particular, compararemos las características y diferencias de seguridad de los métodos MD5, SHA-256, BCRYPT, y observaremos en detalle cómo se aplican en Dovecot y PostgreSQL.

👉 Próximo artículo: configuración de auth-sql.conf.ext y método de hashing de contraseñas (¡Próximamente!)