📨 ¡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.
- Autenticación basada en cuentas del sistema
- Autenticación utilizando los archivos
/etc/passwd
y/etc/shadow
de Linux - Utilización de cuentas de usuario del sistema comunes
-
Manejar cuentas es engorroso y es difícil crear cuentas dedicadas para correo
-
Autenticación basada en usuarios virtuales (Virtual Users)
- Autenticación utilizando una base de datos separada (PostgreSQL, MySQL, etc.)
- Gestión de usuarios de correo dedicados, independiente de las cuentas del sistema
- 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
🛠️ 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
mail_domain
- Lista de dominios que el servidor de correo administrarámail_users
- Información de los usuarios de correo realesmail_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!)
Add a New Comment