Herramientas de usuario

Herramientas del sitio


tutoriales:sistema_de_correo_virtual_con_postfix_mysql_y_dovecot

Sistema de correo virtual con Postfix, MySQL y Dovecot

Introducción

Esta guía permite construir un sistema de correo virtual utilizando MySQL como backend y Debian Squeeze, en estos momentos está en fase de desarrollo, por lo que pudieran faltar secciones y existir erratas. Es una guía bastante extensa porque todos los pasos se explican detalladamente y está basada fundamentalmente en esta guía http://workaround.org/ispmail/squeeze que se ha traducido, y ajustado a nuestras necesidades. Se asume que todos los comandos y tareas se hagan a través del usuario root.

Instalación de paquetes necesarios

Instalación de Postfix con soporte para MySQL

# aptitude install postfix postfix-mysql

Instalación de MySQL Server

# aptitude install mysql-server

Instalación de Dovecot con soporte para IMAP y POP3

# aptitude install dovecot-imapd dovecot-pop3

Notas:

  1. Todos estos paquetes se pueden instalar utilizando una sola línea, en esta guía se separan para dar una vista general de los paquetes necesarios.
  2. En esta guía el servidor MySQL se instala en el mismo servidor que Postfix, esto no quiere decir que no se pueda utilizar otro servidor existente en la red.
  3. Alternativamente se puede instalar phpMyAdmin para gestionar la base de datos, aunque todas las operaciones con esta se ilustrarán a través de la línea de comandos de MySQL.

Preparación de la base de datos

En esta sección se describe la preparación de la base de datos de MySQL que almacenará la información que controla el servidor. En este proceso se utilizarán consultas SQL, que se pueden entrar a través de la línea de comandos de mysql, pero para los menos experimentados o para más comodidad se sugiere el uso de phpMyAdmin. (esta sección no cubrirá phpMyAdmin).

Los siguientes comandos se utilizan para crear la base de datos:

# mysql -u root -p

mysql>
CREATE DATABASE vmail;
GRANT SELECT ON vmail.* TO 'admin'@'localhost' IDENTIFIED BY 'contraseña';
FLUSH PRIVILEGES;

Las entradas anteriores crean una base de datos con nombre vmail y se le concede permisos de solo lectura al usuario admin con contraseña contraseña que por supuesto debe ser cambiada por el usuario. Estos permisos son suficientes para que Postfix se integre con MySQL.

A continuación se crearán las tablas necesarias. En el shell de MySQL ingresar la siguiente línea de comandos para utilizar la base de datos creada anteriormente.

USE vmail;

Creación de la tabla virtual_domains

CREATE TABLE `virtual_domains` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

La siguiente tabla contiene información de las cuentas de los usuarios. Cada usuario tiene un nombre de usuario y una contraseña. Se usa para acceder a los buzones a través de POP3 o IMAP. El nombre de usuario es el mismo que el de entrada al sistema.

Creación de la tabla virtual_users

CREATE TABLE `virtual_users` (
`id` int(11) NOT NULL auto_increment,
`domain_id` int(11) NOT NULL,
`password` varchar(32) NOT NULL,
`email` varchar(100) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `email` (`email`),
FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

El campo email contiene la dirección de correo/nombre de usuario y el campo password contiene la contraseña del usuario encriptada en MD5. El campo clave email asegura que no existan dos usuarios idénticos.

Creación de la tabla virtual_aliases

CREATE TABLE `virtual_aliases` (
`id` int(11) NOT NULL auto_increment,
`domain_id` int(11) NOT NULL,
`source` varchar(100) NOT NULL,
`destination` varchar(100) NOT NULL,
PRIMARY KEY (`id`),
FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

La columna source contiene la dirección del usuario que quiere reenviar su correo. FOREIGN KEY indica que las entradas de las tablas virtual_users y virtual_aliases están conectadas a entradas de la tabla virtual_domains. Esto mantiene la base de datos consistente porque no se pueden crear alias virtuales o usuarios virtuales que no estén conectados a un dominio virtual. El sufijo ON DELETE CASCADE significa que si se elimina un registro de la tabla de referencia, también se eliminará en la tabla actual. De esta manera no se dejan entradas huérfanas accidentalmente.

Con las tablas creadas anteriormente tendremos la siguiente estructura:

Database: vmail
+-----------------+
|     Tables      |
+-----------------+
| virtual_aliases |
| virtual_domains |
| virtual_users   |
+-----------------+

virtual_aliases:
+----+-----------+-------------------+------------------+
| id | domain_id | source            | destination      |
+----+-----------+--------------------------------------+
|  1 |         1 | usuario2@dominio  | usuario@dominio  |
+----+-----------+--------------------------------------+
|  2 |         2 | usuario2@dominio2 | usuario@dominio2 |
+----+-----------+--------------------------------------+

virtual_domains:
+----+----------+
| id | name     |
+----+----------+
|  1 | dominio  |
+----+----------+
|  2 | dominio2 |
+----+----------+

virtual_users:
+----+-----------+----------------------------------+------------------+
| id | domain_id | password                         | email            |
+----+-----------+----------------------------------+------------------+
|  1 |         1 | 202cb962ac59075b964b07152d234b70 | usuario@dominio  |
+----+-----------+----------------------------------+------------------+
|  2 |         2 | 14cbfb845af1f030e372b1cb9275e6dd | usuario@dominio2 |
+----+-----------+----------------------------------+------------------+

Nota: Es posible realizar todas estas tareas en una sola línea de comandos aquí se explican detalladamente para una mejor comprensión de lo que se está implementando. Para esto simplemente se copian todas las líneas de comandos de mysql anteriores en un archivo de texto y nombrarlo por ejemplo vmail.sql y posteriormente en la línea de comandos del sistema, no de mysql ingresar esta línea:

mysql -u root -p < /ruta/al/archivo/vmail.sql

Insertar datos en la base de datos

En esta sección se agregará el dominio virtual dominio.org, la cuenta de usuario usuario@dominio.org y un forward de usuario2@dominio.org a usuario@dominio.org. En el shell de MySQL ingresar las siguientes entradas.

INSERT INTO `vmail`.`virtual_domains` (
`id` ,
`name`
)
VALUES (
'1', 'dominio.org'
);

INSERT INTO `vmail`.`virtual_users` (
`id` ,
`domain_id` ,
`password` ,
`email`
)
VALUES (
'1', '1', MD5( 'contraseña' ) , 'usuario@dominio.org'
);

INSERT INTO `vmail`.`virtual_aliases` (
`id`,
`domain_id`,
`source`,
`destination`
)
VALUES (
'1', '1', 'usuario2@dominio.org', 'usuario@dominio.org'
);

Conexión de Postfix con MySQL

La conexión de Postfix con MySQL se definen en archivos de configuración (cf).

virtual_mailbox_domain

Crear el archivo /etc/postfix/mysql_virtual_domains.cf

user = admin
password = contraseña
hosts = 127.0.0.1
dbname = vmail
query = SELECT 1 FROM virtual_domains WHERE name='%s'

Para que Postfix use el mapping a la base de datos:

# postconf -e virtual_mailbox_domains=mysql:/etc/postfix/mysql_virtual_domains.cf

Nota: postconf -e agrega la línea de configuración en /etc/postfix/main.cf. Además activa la nueva configuración instantáneamente, sin la necesidad de recargar Postfix. Alternativamente se puede ingresar esta línea de configuración directamente en el archivo de configuración de Postfix /etc/postfix/main.cf utilizando un editor de textos.

Para comprobar que esté funcionando este map

# postmap -q dominio.org mysql:/etc/postfix/mysql_virtual_domains.cf 

Se debe obtener “1” como resultado lo que significa que el dominio dominio.org es un dominio virtual existe.

virtual_mailbox_maps

Crear el archivo /etc/postfix/mysql_virtual_mailboxes.cf

user = admin
password = contraseña
hosts = 127.0.0.1
dbname = vmail
query = SELECT 1 FROM virtual_users WHERE email='%s'

Agregar el map a la configuración de Postfix

# postconf -e virtual_mailbox_maps=mysql:/etc/postfix/mysql_virtual_mailboxes.cf

Para comprobar que esté funcionando este map

# postmap -q usuario@dominio.org mysql:/etc/postfix/mysql_virtual_mailboxes.cf

El comando anterior debe devolver “1” lo que significa que usuario@dominio.org es un buzón de correo virtual existente.

virtual_alias_maps

Crear el archivo /etc/postfix/mysql_virtual_aliases.cf:

user = admin
password = contraseña
hosts = 127.0.0.1
dbname = vmail
query = SELECT destination FROM virtual_aliases WHERE source='%s'

Agregar el map a la configuración de Postfix

postconf -e virtual_alias_maps=mysql:/etc/postfix/mysql_virtual_aliases.cf

Para comprobar que está funcionando este map

# postmap -q usuario2@dominio.org mysql:/etc/postfix/mysql_virtual_aliases.cf

Deberá devolver: usuario@dominio.org

Permisos de los archivos de configuración

Es importante que los archivos que contienen contraseñas de conexión a la base de datos de MySQL estén protegidos de manera que solo los usuarios root y postfix puedan leerlos.

# chgrp postfix /etc/postfix/mysql_*.cf
# chmod 640 /etc/postfix/mysql_*.cf

Creación del usuario vmail

El usuario vmail será el dueño de todos los buzones de correo y es el que se utilizará para el manejo de todas las cuentas del sistema virtual.

# groupadd -g 5000 vmail
# useradd -g vmail -u 5000 vmail -d /home/vmail -m
# chown -R vmail:vmail /home/vmail
# chmod u+w /home/vmail

Configuración de Dovecot

Dovecot será el encargado de entregar el correo local, es más eficiente que Postfix en este aspecto.

protocols = imap imaps pop3 pop3s
disable_plaintext_auth = no
mail_location = maildir:/home/vmail/%d/%n/Maildir

protocol lda {
    auth_socket_path = /var/run/dovecot/auth-master
    postmaster_address = postmaster@domain.org
    mail_plugins = sieve
}

auth default {
    mechanisms = plain login
    passdb sql {
	args = /etc/dovecot/dovecot-sql.conf
    }

    userdb static {
	args = uid=5000 gid=5000 home=/home/vmail/%d/%n allow_all_users=yes
    }
    socket listen {
	master {
	    path = /var/run/dovecot/auth-master
	    mode = 0600
	    user = vmail
	}
	client {
	    path = /var/spool/postfix/private/auth
	    mode = 0660
	    user = postfix
	    group = postfix
	}
    }
}

Crear el archivo /etc/dovecot/dovecot-sql.conf que se encargará de la conexión de Dovecot con MySQL. Es importante que se susituyan los valores dbname, user y password por los que se utilizaron a la hora de la creación de la base de datos.

driver = mysql
connect = host=127.0.0.1 dbname=vmail user=admin password=contraseña
default_pass_scheme = PLAIN-MD5
password_query = SELECT email as user, password FROM virtual_users WHERE email='%u';

Editar /etc/postfix/master.cf y agregar las siguientes líneas al final del archivo. Esta línea indica a Postfix que Dovecot actuará como LDA (Local Delivery Agent) agente de entrega local.

Permisos de los archivos de configuración

Es importante cambiar los permisos de los archivos de configuración de Dovecot para que el usuario vmail pueda acceder a ellos ya que Postfix inicia la entrega con permisos del usuario vmail.

chgrp vmail /etc/dovecot/dovecot.conf
chmod g+r /etc/dovecot/dovecot.conf

También es necesario cambiar los permisos del archivo de configuración de la conexión de Dovecot con MySQL para ningún otro usuario pueda leer el contenido de este.

chown root:root /etc/dovecot/dovecot-sql.conf
chmod 600 /etc/dovecot/dovecot-sql.conf
dovecot unix - n n - - pipe
   flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -f ${sender} -d ${recipient}
tutoriales/sistema_de_correo_virtual_con_postfix_mysql_y_dovecot.txt · Última modificación: 2020/04/22 20:57 (editor externo)