Servidor de correo – Configuración Dovecot, SIEVE, ManageSIEVE (parte 7)

Esta es una entrada dentro de la serie para la instalación de un servidor de correo completo. Índice completo de contenidos pincha aquí.


En esta entrada vamos a configurar el servicio que gestiona las conexiones de lectura al buzón y gestiona los filtros que cada usuario configura a nivel individual o el administrador a nivel global.


Dovecot

Configuración

Primero creamos el buzón postmaster@tiraquelibras.com o un alias con esta misma dirección apuntando a otro buzón que tengamos ya creado, sin importar que coincidan sus dominios. Podemos crear el buzón accediendo a la interfaz web de gestión de la base de datos que hemos instalado en el servidor en una sección anterior. Para dirigirte a esta pincha aquí.

Copiamos todos los archivos de configuración originales:

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

Editamos el archivo /etc/dovecot/dovecot.conf y agregamos los protocolos:

## Dovecot configuration file
...
# Enable installed protocols
!include_try /usr/share/dovecot/protocols.d/*.protocol
protocols = imap pop3 lmtp
...
postmaster_address=postmaster@tiraquelibras.com

Editamos el archivo /etc/dovecot/conf.d/10-mail.conf que controla como Dovecot interactúa con el sistema de ficheros del servidor para almacenar y acceder a los mensajes:

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

Creamos el directorio para almacenar los dominios y buzones:

sudo mkdir -p /var/mail/vhosts/

Creamos el grupo vmail con ID 5000 y el usuario vmail que agregamos al grupo vmail creado. Este usuario del sistema leerá los mails del servidor:

sudo groupadd -g 5000 vmail

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

Cambiamos los permisos del directorio creado anteriormente para almacenar los dominios y buzones:

sudo chown -R vmail:vmail /var/mail

Ahora editamos el archivo /etc/dovecot/conf.d/10-auth.conf:

...
disable_plaintext_auth = yes
...
auth_mechanisms = plain login
...
!include auth-system.conf.ext
...
!include auth-sql.conf.ext
...

Ahora editamos el directorio /etc/dovecot/conf.d/auth-sql.conf.ext para indicar la información de autenticación y almacenamiento.

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

Actualizamos el archivo /etc/dovecot/dovecot-sql.conf.ext con la información de conexión del MySQL.

...
driver = mysql
...
connect = host=127.0.0.1 dbname=mailserver user=mailuser password=mailuserpass
...
default_pass_scheme = PLAIN-MD5
...
password_query = SELECT email as user, password FROM virtual_users WHERE email='%u' and active='1';
...

OJO, si queremos que los alias se usen como login también deberemos de cambiar la password_query con el siguiente contenido, pero yo no lo configuré en mi entorno:

password_query = SELECT email as user, password FROM virtual_users WHERE email=(SELECT destination FROM virtual_aliases WHERE source = '%u' and active='1') and active='1';

Cambiamos el propietario y grupo del directorio /etc/dovecot  por vmail y dovecot con el comando:

sudo chown -R vmail:dovecot /etc/dovecot

Ahora los permisos con:

sudo chmod -R o-rwx /etc/dovecot

Editamos el archivo /etc/dovecot/conf.d/10-master.conf en donde deshabilitamos el desencriptado IMAP y POP3 indicando los puertos de los protocolos a valor 0. Descomentamos las variables port  y ssl:

...
service imap-login {
  inet_listener imap {
    port = 0
  }
  inet_listener imaps {
    port = 993
    ssl = yes
  }
  ...
}
...
service pop3-login {
  inet_listener pop3 {
    port = 0
  }
  inet_listener pop3s {
    port = 995
    ssl = yes
  }
}
...

Y ahora el servicio lmtp:

...
service lmtp {
  unix_listener /var/spool/postfix/private/dovecot-lmtp {
    #mode = 0666i
    mode = 0600
    user = postfix
    group = postfix
  }
...
}

Ahora el servicio auth:

...
service auth {
  ...
  unix_listener /var/spool/postfix/private/auth {
    mode = 0660
    user = postfix
    group = postfix
  }

  unix_listener auth-userdb {
    mode = 0600
    user = vmail
  }
...
  user = dovecot
}
...

Y ahora el auth-worker:

...
service auth-worker {
  ...
  user = vmail
}

Para finalizar editamos el archivo /etc/dovecot/conf.d/10-ssl.conf para requerir SSL y agregar la ubicación de los certificados SSL, además de deshabilitar el protocolo SSLv3 MUY INSEGURO:

...
# SSL/TLS support: yes, no, required. <doc/wiki/SSL.txt>
ssl = required
... 	
ssl_cert = </etc/letsencrypt/live/correu2.yeloquehay.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/correu2.yeloquehay.com/privkey.pem
…
# SSL protocols to use
#ssl_protocols = !SSLv3
ssl_protocols = !SSLv3
…

Configuramos un log personalizado para Dovecot en el archivo /etc/dovecot/conf.d/10-logging.conf con los siguientes cambios:

…
# Log file to use for error messages. "syslog" logs to syslog,
# /dev/stderr logs to stderr.
#log_path = syslog
log_path = /var/log/dovecot.log
…
# mail_log plugin provides more event logging for mail processes.
plugin {
  # Events to log. Also available: flag_change append
  mail_log_events = delete undelete expunge copy mailbox_delete mailbox_rename
  # Available fields: uid, box, msgid, from, subject, size, vsize, flags
  # size and vsize are available only for expunge and copy events.
  mail_log_fields = uid box msgid size
}

##
## Log formatting.
##

# Prefix for each line written to log file. % codes are in strftime(3)
# format.
###log_timestamp = "%b %d %H:%M:%S "
log_timestamp = "%Y-%m-%d %H:%M:%S "

# Space-separated list of elements we want to log. The elements which have
# a non-empty variable value are joined together to form a comma-separated
# string.
login_log_format_elements = user=<%u> method=%m rip=%r lip=%l mpid=%e %c

# Login log format. %s contains login_log_format_elements string, %$ contains
# the data we want to log.
login_log_format = %$: %s

# Log prefix for mail processes. See doc/wiki/Variables.txt for list of
# possible variables you can use.
mail_log_prefix = "%s(%u): "

# Format to use for logging mail deliveries. See doc/wiki/Variables.txt for
# list of all variables you can use. Some of the common ones include:
#  %$ - Delivery status message (e.g. "saved to INBOX")
#  %m - Message-ID
#  %s - Subject
#  %f - From address
#  %p - Physical size
#  %w - Virtual size
###deliver_log_format = msgid=%m: %$
###deliver_log_format = msgid=%m: %$ : Subject: %s
deliver_log_format = Message-ID: %m - Subject: %s - From: %f - Size: %p - Status: %$

Ahora los eventos de Dovecot se escriben en el fichero /var/log/dovecot.log

Configuraciones adicionales

Subscribimos los directorios por defecto en el archivo /etc/dovecot/conf.d/15- mailboxes.conf:

…
  mailbox Drafts {
    special_use = \Drafts
    auto = subscribe
  }

#  mailbox Junk {
#    special_use = \Junk
#  }
 mailbox Spam {
     special_use = \Junk
     auto = subscribe
  }

  mailbox Trash {
    special_use = \Trash
    auto = subscribe
  }
…
  mailbox Sent {
    special_use = \Sent
    auto = subscribe
  }
#  mailbox "Sent Messages" {
#    special_use = \Sent
#  }
…	

En el archivo /etc/dovecot/conf.d/20-imap.conf cambiamos:

…
imap_logout_format = in=%i out=%o
…
protocol imap {
…
  mail_plugins = $mail_plugins mail_log notify
  # Maximum number of IMAP connections allowed for a user from each IP address.
  # NOTE: The username is compared case-sensitively.
  mail_max_userip_connections = 10
}

En el archivo /etc/dovecot/conf.d/20-pop3.conf cambiamos:

...
pop3_logout_format = top=%t/%p, retr=%r/%b, del=%d/%m, size=%s, deleted=%{deleted_bytes}
…
protocol pop3 {
…
 mail_plugins = $mail_plugins mail_log notify
  # Maximum number of POP3 connections allowed for a user from each IP address.
  # NOTE: The username is compared case-sensitively.
  mail_max_userip_connections = 10
}

Reiniciamos Dovecot con:

sudo systemctl restart dovecot

Error en los logs

Para evitar este tipo de errores en los logs del archivo auth.log:

Oct  1 09:58:01 h2847530 auth: pam_unix(dovecot:auth): authentication failure; logname= uid=5000 euid=5000 tty=doveco
Oct  1 09:58:04 h2847530 auth: pam_unix(dovecot:auth): check pass; user unknown
Oct  1 09:58:04 h2847530 auth: pam_unix(dovecot:auth): authentication failure; logname= uid=5000 euid=5000 tty=doveco
Oct  1 09:58:08 h2847530 auth: pam_unix(dovecot:auth): check pass; user unknown

Tenemos que editar el archivo /etc/dovecot/conf.d/auth-system.conf.ext. Primero hacemos una copia:

cp /etc/dovecot/conf.d/auth-system.conf.ext /etc/dovecot/conf.d/auth-system.conf.ext.orig

Luego lo editamos y comentamos las siguientes líneas:

…
###passdb {
###  driver = pam
  # [session=yes] [setcred=yes] [failure_show_msg=yes] [max_requests=<n>]
  # [cache_key=<key>] [<service name>]
  #args = dovecot
###}
…
###userdb {
  # <doc/wiki/AuthDatabase.Passwd.txt>
###  driver = passwd
  # [blocking=no]
  #args =

  # Override fields from passwd
  #override_fields = home=/home/virtual/%u
###}
…

Reiniciamos Dovecot y ya se solucionaría:

systemctl restart dovecot

Sieve y ManageSIEVE

Instalamos los paquetes necesarios:

apt-get install dovecot-sieve dovecot-managesieved

Habilitamos los plugins de Dovecot en el archivo /etc/dovecot/conf.d/20-lmtp.conf

protocol lmtp {
  # Space separated list of plugins to load (default is global mail_plugins).
  #mail_plugins = $mail_plugins
  portmaster_address = postmaster@yeloquehay.com
  mail_plugins = $mail_plugins sieve
}

Ahora editamos el archivo /etc/dovecot/conf.d/90-sieve.conf:

plugin {
   sieve = ~/.dovecot.sieve
   sieve_global_path = /var/lib/dovecot/sieve/default.sieve
   sieve_dir = ~/sieve
   sieve_global_dir = /var/lib/dovecot/sieve/
}

Y para finalizar en el archivo /etc/dovecot/dovecot.conf agregamos lo siguiente:

…
# Enable installed protocols
…
protocols = imap pop3 lmtp sieve
…

Archivo /etc/dovecot/conf.d/20-managesieve.conf

…
service managesieve-login {
  inet_listener sieve {
    port = 4190
  }
  inet_listener sieve_deprecated {
    port = 2000
  }
  # Number of connections to handle before starting a new process. Typically
  # the only useful values are 0 (unlimited) or 1. 1 is more secure, but 0
  # is faster. <doc/wiki/LoginProcess.txt>
  #service_count = 1
  # Number of processes to always keep waiting for more connections.
  #process_min_avail = 0
  # If you set service_count=0, you probably need to grow this.
  #vsz_limit = 64M
}
service managesieve {
  # Max. number of ManageSieve processes (connections)
  process_limit = 1024
}
…

Si hacemos un telnet al puerto de SIEVE 4190 vemos todos los comandos habilitados para este servicio:

# telnet X.X.X.X 4190
Trying 81.169.229.19...
Connected to 81.169.229.19.
Escape character is '^]'.
"IMPLEMENTATION" "Dovecot Pigeonhole"
"SIEVE" "fileinto reject envelope encoded-character vacation subaddress comparator-i;ascii-numeric relational regex imap4flags copy include variables body enotify environment mailbox date index ihave duplicate mime foreverypart extracttext"
"NOTIFY" "mailto"
"SASL" ""
"STARTTLS"
"VERSION" "1.0"
OK "Dovecot ready."

Vemos la información que hace referencia a SIEVE:

«IMPLEMENTATION» «Dovecot Pigeonhole»

«SIEVE» «fileinto reject envelope encoded-character vacation subaddress comparator-i;ascii-numeric relational regex imap4flags copy include variables body enotify environment mailbox date index ihave duplicate mime foreverypart extracttext»

IMPORTANTE, para que los filtros SIEVE funcionen, sobre todo al redireccionar o reenviar emails, debemos de cambiar los permisos del directorio de Postfix

chmod 755 -R /etc/postfix

Creamos el archivo SIEVE para las reglas globalesque afectarán a todos los mensajes que cumplan los requisitos indicados.

Creamos el directorio:

mkdir /var/lib/dovecot/sieve

Ahora el archivo dentro del directorio anterior /var/lib/dovecot/sieve/default.sieve con el siguiente contenido:

require "fileinto";
if header :contains "X-Spam-Flag" "YES" {
  fileinto "Junk";
}

Con esto conseguimos que los mensajes con la cabecera de SPAM se entreguen en el directorio pertinente.

Cambiamos el propietario del archivo

chown -R vmail:vmail /var/lib/dovecot

Compilamos el archivo SIEVE para que se aplique correctamente

sievec /var/lib/dovecot/sieve/default.sieve

En este archivo podemos configurar reenvíos a otros buzones, rechazos, almacenar en un directorio determinado, respuesta a mensajes, respuesta de no disponible, … indicando determinados patrones que se den en las cabeceras de los mensajes que reciba nuestra plataforma.


Índice general pincha aquí.