Cómo instalar Postfix Dovecot MySQL SpamAssassin en Ubuntu 18.04 LTS

27 feb 2021 9 min di lettura
Cómo instalar Postfix Dovecot MySQL SpamAssassin en Ubuntu 18.04 LTS
Indice dei contenuti

Introducción

En este tutorial instalaremos y configuraremos un servidor de correo usando Postfix, Dovecot, MySQL y SpamAssassin en Ubuntu 18.04 LTS.

Prerrequisitos

Antes de configurar el servidor de correo, se deben cumplir los siguientes requisitos previos:

  • El dominio que está utilizando apunta correctamente a su servidor.
  • MySQL instalado y configurado (si MySQL no está instalado, recomiendo seguir esta sencilla guía ).
  • Usuario con privilegios de root (en esta guía usaremos el usuario root)

Opcional: certificados SSL. En esta guía utilizaré los certificados obtenidos con Let's Encrypt. Puede utilizar certificados SSL generados para servidores web, como Apache o Nginx.

Para generar certificados SSL con Let's Encrypt, siga estas guías: Genere certificados SSL para Nginx Genere certificados SSL para Apache

Configure e identifique su nombre de dominio completo (FQDN)

Un nombre de host es una etiqueta asignada a una computadora conectada a Internet y que se utiliza para identificar la máquina dentro de una red interna. Los nombres de host también son importantes porque forman parte del nombre de dominio completo (FQDN) de una computadora. La asignación de un FQDN a una computadora hace que sea accesible a través del sistema de nombres de dominio (DNS) público, que es Internet.

El nombre de host es el nombre que se asociará con el servidor, puede usar el que desee.

Configure o cambie el nombre de host desde la terminal, ejecute este comando:

hostnamectl set-hostname tuohostname

Siempre desde la terminal abre el archivo hosts:

nano /etc/hosts

Edite el archivo de hosts para que tenga el siguiente aspecto. Reemplace su nombre de host, dominio, tld y YourIP con sus datos.


127.0.0.1 localhost
 127.0.1.1 tuohostname.esempio.it tuohostname
 TuoIP tuohostname.esempio.it tuohostname

Guarde y cierre el archivo.

Para verificar el nombre de host, desde el tipo de terminal:

hostname

Para comprobar el dominio, desde la terminal:

hostname -d

Para verificar el FQDN, desde la terminal:

hostname -f

Resultado:


tuohostname.esempio.it

Es posible que sea necesario reiniciar el servidor.

Instalar Postfix y Dovecot

Desde la terminal:

sudo apt install postfix postfix-mysql dovecot-core dovecot-imapd dovecot-lmtpd dovecot-mysql

Durante la instalación, Postfix nos preguntará el tipo de configuración de correo. Seleccionar sitio de Internet

Posteriormente tendremos que ingresar, si aún no está presente, nuestro FQDN


System mail name:
 tuohostname.esempio.it

Configuración de MySQL

Cree una base de datos MySQL para configurar tres tablas diferentes: una para dominios, otra para usuarios y la última para alias.

Llamaremos a nuestra base de datos maildb. Puede utilizar el nombre que desee.

Cree la base de datos maildb:

mysqladmin -p create maildb

Inicie sesión en MySQL como root:

mysql -u root -p

Cree un nuevo usuario para la base de datos maildb:

GRANT SELECT ON maildb.* TO 'usermail'@'127.0.0.1' IDENTIFIED BY 'password';

Actualice los privilegios de MySQL para aplicar los permisos correctamente:

FLUSH PRIVILEGES;

Seleccione nuestra base de datos:

USE maildb;

Cree una tabla para los dominios reconocidos como dominios autorizados:


CREATE TABLE `virtual_domains` (
 `id` INT NOT NULL AUTO_INCREMENT,
 `name` VARCHAR(50) NOT NULL,
 PRIMARY KEY (`id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Cree una tabla para los usuarios agregando la dirección de correo electrónico y las contraseñas y asocie a cada usuario con un dominio:


CREATE TABLE `virtual_users` (
 `id` INT NOT NULL AUTO_INCREMENT,
 `domain_id` INT NOT NULL,
 `password` VARCHAR(106) NOT NULL,
 `email` VARCHAR(120) 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;

Cree una tercera tabla de alias virtual para especificar los correos electrónicos que se reenviarán al otro correo electrónico:


CREATE TABLE `virtual_aliases` (
 `id` INT NOT NULL AUTO_INCREMENT,
 `domain_id` INT 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;

Dominios virtuales

Agregue los dominios a la tabla virtual_domains. Puede agregar tantos dominios como desee, pero en este tutorial solo presentaremos el dominio principal (example.it) y el FQDN (yourhostname.example.it).


INSERT INTO `maildb`.`virtual_domains`
 (`id`,`name`)
 VALUES
 ('1', 'esempio.it'),
 ('2', 'tuohostname.esempio.it');

Correos electrónicos virtuales

Agregue la dirección de correo electrónico y las contraseñas asociadas para cada dominio. Asegúrese de cambiar toda la información con su información específica.


INSERT INTO `maildb`.`virtual_users`
 (`id`, `domain_id`, `password`, `email`)
 VALUES
 ('1', '1', ENCRYPT('password1', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), '[email protected]'),
 ('2', '1', ENCRYPT('password2', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), '[email protected]');


Alias virtuales

Agregue la dirección de correo electrónico (origen) que estamos a punto de reenviar a la otra dirección de correo electrónico (destino).


INSERT INTO `maildb`.`virtual_aliases`
 (`id`, `domain_id`, `source`, `destination`)
 VALUES
 ('1', '1', '[email protected]', '[email protected]');

Usando desde MySQL:

exit

Configurar Postfix

Configuraremos Postfix para administrar las conexiones SMTP y enviar mensajes para cada usuario introducido en la base de datos MySQL.

Cree una copia del archivo predeterminado en caso de que desee restaurar las configuraciones predeterminadas:

cp /etc/postfix/main.cf /etc/postfix/main.cf.orig

Abramos el archivo para editar:

nano /etc/postfix/main.cf

Comentamos o añadimos los parámetros TLS necesarios:


# TLS parameters
 #smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
 #smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
 #smtpd_use_tls=yes
 #smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
 #smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
 smtpd_tls_cert_file=/etc/letsencrypt/live/esempio.it/fullchain.pem
 smtpd_tls_key_file=/etc/letsencrypt/live/esempio.it/privkey.pem
 smtpd_use_tls=yes
 smtpd_tls_auth_only = yes

Luego agregue las siguientes líneas, después de los parámetros TLS:


smtpd_sasl_type = dovecot
 smtpd_sasl_path = private/auth
 smtpd_sasl_auth_enable = yes
 smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination

Comenta mydestination por defecto y agrega el nuestro:


#mydestination = $myhostname, tuohostname.esempio.it, localhost.esempio.it, localhost
 mydestination = localhost

Verifique el parámetro myhostname, debe configurarse con el FQDN:


myhostname = tuohostname.esempio.it

Agregue las siguientes líneas para la entrega de correo local y para que Postfix interactúe con dominios virtuales, usuarios y alias:


virtual_transport = lmtp:unix:private/dovecot-lmtp
 virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
 virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
 virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf

Guarde y cierre el archivo.

Cree tres archivos que asociaremos con el archivo main.cf para permitir que Postfix se conecte a MySQL:

nano /etc/postfix/mysql-virtual-mailbox-domains.cf

Agregue sus parámetros:


user = usermail
 password = password
 hosts = 127.0.0.1
 dbname = maildb
 query = SELECT 1 FROM virtual_domains WHERE name='%s'

Guarde y cierre el archivo.

Reiniciar Postfix:

service postfix restart

Compruebe si Postfix encuentra el dominio correcto, este comando debe devolver el valor 1:

postmap -q esempio.it mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf

Crea el segundo archivo:

nano /etc/postfix/mysql-virtual-mailbox-maps.cf

Agregue sus parámetros:


user = usermail
 password = password
 hosts = 127.0.0.1
 dbname = maildb
 query = SELECT 1 FROM virtual_users WHERE email='%s'

Guarde y cierre el archivo.

Reiniciar Postfix:

service postfix restart

Verifique que Postfix encuentre la primera dirección de correo electrónico, este comando debe devolver el valor 1:

postmap -q [email protected] mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf

Crea el tercer archivo:

nano /etc/postfix/mysql-virtual-alias-maps.cf

Agregue sus parámetros:


user = usermail
 password = password
 hosts = 127.0.0.1
 dbname = maildb
 query = SELECT destination FROM virtual_aliases WHERE source='%s'

Guarde y cierre el archivo.

Reiniciar Postfix:

service postfix restart

Verifique que Postfix encuentre los alias, este comando debe devolver el valor 1:

postmap -q [email protected] mysql:/etc/postfix/mysql-virtual-alias-maps.cf

Si desea habilitar el puerto 587 para conectarse de forma segura con clientes de correo electrónico, debe editar el archivo master.cf:

nano /etc/postfix/master.cf

Comente las siguientes líneas y agregue las que faltan:


submission inet n - - - - smtpd
 -o syslog_name=postfix/submission
 -o smtpd_tls_security_level=encrypt
 -o smtpd_sasl_auth_enable=yes
 -o smtpd_relay_restrictions=permit_sasl_authenticated,reject

ATENCIÓN a los espacios, si las líneas no están formateadas de la forma correcta, es posible que Postfix no funcione correctamente.

Reiniciar Postfix:

service postfix restart

Configurar Dovecot

Cree una copia de los siguientes 7 archivos para restaurar los valores predeterminados si es necesario. Ingrese los siguientes comandos uno a la vez:


cp /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf.orig
 cp /etc/dovecot/conf.d/10-mail.conf /etc/dovecot/conf.d/10-mail.conf.orig
 cp /etc/dovecot/conf.d/10-auth.conf /etc/dovecot/conf.d/10-auth.conf.orig
 cp /etc/dovecot/dovecot-sql.conf.ext /etc/dovecot/dovecot-sql.conf.ext.orig
 cp /etc/dovecot/conf.d/10-master.conf /etc/dovecot/conf.d/10-master.conf.orig
 cp /etc/dovecot/conf.d/10-ssl.conf /etc/dovecot/conf.d/10-ssl.conf.orig

Abra el siguiente archivo:

nano /etc/dovecot/dovecot.conf

Verifique que la siguiente línea no esté comentada:

!include conf.d/*.conf

Habilite los protocolos imap y lmtp (pop3 también se puede agregar si es necesario) en ! Include_try /usr/share/dovecot/protocols.d/*.protocol línea:

!include_try /usr/share/dovecot/protocols.d/*.protocol
 protocols = imap lmtp

Guarde y cierre el archivo.

Abra el siguiente archivo:

nano /etc/dovecot/conf.d/10-mail.conf

Busque el parámetro mail_location, descomente y cambie el valor así:


mail_location = maildir:/var/mail/vhosts/%d/%n

Busque el parámetro mail_privileged_group, descomente y cambie el valor así:


mail_privileged_group = mail

Guarde y cierre el archivo.

Cambiar los permisos

Cree una carpeta para cada dominio que agreguemos en la tabla MySQL:

mkdir -p /var/mail/vhosts/esempio.it

Cree un usuario y un grupo de vmail con id 5000:

groupadd -g 5000 vmail
useradd -g vmail -u 5000 vmail -d /var/mail

Cambiemos el propietario de la carpeta /var /mail:

chown -R vmail:vmail /var/mail

Editemos el siguiente archivo:

nano /etc/dovecot/conf.d/10-auth.conf

Descomente y cambie la siguiente línea así:


disable_plaintext_auth = yes

Cambie el siguiente parámetro auth_mechanisms:


auth_mechanisms = plain login

Comenta esta línea:


#!include auth-system.conf.ext

Descomente esta línea para habilitar la autorización de MySQL:

!include auth-sql.conf.ext

Guarde y cierre el archivo.

Cree un nuevo archivo donde insertar la información de autenticación:

nano /etc/dovecot/conf.d/auth-sql.conf.ext

Cambie o agregue las siguientes líneas:


passdb {
 driver = sql
 args = /etc/dovecot/dovecot-sql.conf.ext
 }
 userdb {
 driver = static
 args = uid=vmail gid=vmail home=/var/mail/vhosts/%d/%n
 }

Guarde y cierre el archivo.

Abra el siguiente archivo:

nano /etc/dovecot/dovecot-sql.conf.ext

Descomente el parámetro del controlador y agregue el valor de mysql:


driver = mysql

Descomente el parámetro de conexión e ingrese sus parámetros:


connect = host=127.0.0.1 dbname=maildb user=usermail password=password

Descomente el parámetro default_pass_scheme y cambie el valor:


default_pass_scheme = SHA512-CRYPT

Descomente el parámetro password_query y cambie el valor:


password_query = SELECT email as user, password FROM virtual_users WHERE email='%u';

Cambie el propietario y el grupo de la carpeta dovecot al usuario vmail:

chown -R vmail:dovecot /etc/dovecot
chmod -R o-rwx /etc/dovecot

Abra el siguiente archivo ( tenga cuidado con los cambios, verifique línea por línea):

nano /etc/dovecot/conf.d/10-master.conf

Cambie o agregue las siguientes líneas:


##Uncomment inet_listener_imap and modify to port 0
 service imap-login {
 inet_listener imap {
 port = 0
 }

 #Create LMTP socket and this configurations
 service lmtp {
 unix_listener /var/spool/postfix/private/dovecot-lmtp {
 mode = 0600
 user = postfix
 group = postfix
 }
 #inet_listener lmtp {
 # Avoid making LMTP visible for the entire internet
 #address =
 #port =
 #}
 }

Cambie el parámetro de autenticación del servicio:


service auth {

 unix_listener /var/spool/postfix/private/auth {
 mode = 0666
 user = postfix
 group = postfix
 }

 unix_listener auth-userdb {
 mode = 0600
 user = vmail
 #group =
 }

 #unix_listener /var/spool/postfix/private/auth {
 # mode = 0666
 #}

 user = dovecot
 }

Cambie el parámetro de servicio auth-worker:


service auth-worker {
 # Auth worker process is run as root by default, so that it can access
 # /etc/shadow. If this isn't necessary, the user should be changed to
 # $default_internal_user.
 user = vmail
 }

Guarde y cierre el archivo.

Abramos y modifiquemos las configuraciones SSL de Dovecot:

nano /etc/dovecot/conf.d/10-ssl.conf

Cambie el siguiente parámetro:


ssl = required

Cambie la ruta de los certificados SSL:


ssl_cert = </etc/letsencrypt/live/esempio.it/fullchain.pem
 ssl_key = </etc/letsencrypt/live/esempio.it/privkey.pem

Guarde y cierre el archivo.

Reiniciar Dovecot:

service dovecot restart

Verifique el estado de Dovecot y Postfix.

service dovecot status
service postfix status

Verifique si el puerto 993 está abierto y funcionando (si tiene habilitado pop3, verifique también el puerto 995:

telnet esempio.it 993

Configurar SpamAssassin

Para instalar SpamAssassin desde una terminal:

apt install spamassassin spamc

Cree un usuario para SpamAssassin:

adduser spamd --disabled-login

Abramos el siguiente archivo:

nano /etc/default/spamassassin

Cambie el parámetro ENABLE:


ENABLED=1

Cambiar el parámetro de inicio:


SPAMD_HOME="/home/spamd/"
 OPTIONS="--create-prefs --max-children 5 --username spamd --helper-home-dir ${SPAMD_HOME} -s ${SPAMD_HOME}spamd.log"

Cambie el parámetro PID_File:


PIDFILE="${SPAMD_HOME}spamd.pid"

Cambie el parámetro CRON para que SpamAssassin se actualice solo:


CRON=1

Guarde y cierre el archivo.

Abra el siguiente archivo para establecer las reglas antispam:

nano /etc/spamassassin/local.cf

SpamAssassin para cada correo determina si es superior a 5.0 en la verificación de correo no deseado, si es así, automáticamente se considerará correo no deseado:

Cambie o agregue los siguientes parámetros:


rewrite_header Subject ***** SPAM *****
 report_safe 0
 required_score 5.0
 use_bayes 1
 use_bayes_rules 1
 bayes_auto_learn 1
 skip_rbl_checks 0
 use_razor2 0
 use_dcc 0
 use_pyzor 0

Guarde y cierre el archivo.

Modifiquemos el archivo Postfix principal para que interactúe con SpamAssassin:

nano /etc/postfix/master.cf

Debajo de la línea:


smtp inet n - - - - smtpd

Para agregar:


 -o content_filter=spamassassin

Entonces:


smtp inet n - - - - smtpd
 -o content_filter=spamassassin

Al final del archivo, agregue estas líneas:


spamassassin unix - nn - - pipe
 user=spamd argv=/usr/bin/spamc -f -e
 /usr/sbin/sendmail -oi -f ${sender} ${recipient}

ATENCIÓN a los espacios, si las líneas no están formateadas correctamente, es posible que Postfix no funcione correctamente.

Guarde y cierre el archivo.

Iniciemos SpamAssassin y reiniciemos Postfix:

service spamassassin start
service postfix restart

Verifique el estado de SpamAssassin y Postfix:

service spamassassin status
service postfix status

La instalación y configuración de Postfix, Dovecot, MySQL y SpamAssasin ha finalizado.

Buy me a coffeeBuy me a coffee

Supportaci se ti piacciono i nostri contenuti. Grazie.

Successivamente, completa il checkout per l'accesso completo a Noviello.it.
Bentornato! Accesso eseguito correttamente.
Ti sei abbonato con successo a Noviello.it.
Successo! Il tuo account è completamente attivato, ora hai accesso a tutti i contenuti.
Operazione riuscita. Le tue informazioni di fatturazione sono state aggiornate.
La tua fatturazione non è stata aggiornata.