exim4, múltiples dominios y sympa … (I)

… para gestionar listas de correo.

Tenemos un servidor de correo que siempre ha despachado hacia una máquina externa y ahora estamos albergando un puñado de dominios para los que queremos un tratamiento independizado.

Las cuestiones que hay que tocar son las siguientes:

  1. Recepción de correo
    1. Cifrado para conexiones seguras
    2. Reconocimiento de los dominios locales
    3. Alias y redirecciones específicas para cada dominio
    4. Despacho local de correo si es necesario
    5. Transportes especiales para buzones artificiales como las listas de correo
  2. Envío de correo
    1. Cifrado para conexiones seguras
    2. Acreditación de usuarios dependientes de cada dominio
    3. Firma de mensajes con claves separadas por dominio
    4. Uso de servidores de despacho remotos si el dominio lo requiere.

Cifrado de conexiones

Esta es una cuestión importante. Dado que vamos a utilizar los certificados para el dominio creados con Let’s Encrypt a priori no hay necesidad de tener uno por cada dominio alojado. El serviodor acepta las conexiones como un todo. Luego es cuando filtra y clasifica.

Así que, una vez obtenidos los archivos, e instalados en su sitio (/etc/ssl/domain/) lo normal es indicarle a exim4 dónde encontrarlos.En el archivo conf.d/main/03_exim4-config_tlsoptions podemos especificar su localización:

MAIN_TLS_ENABLE=yes
MAIN_TLS_CERTIFICATE=/etc/ssl/esferas.org/fullchain.pem
MAIN_TLS_PRIVATEKEY=/etc/ssl/esferas.org/privkey.pem 

No hay que olvidar instalar los archivos con el grupo adecuado y añadir el usuario que emplea Debian para exim al grupo correspondiente.

~$ getent passwd | egrep -i exim
Debian-exim:x:104:109::/var/spool/exim4:/bin/false
~$ sudo adduser Debian-exim ssl-cert
[sudo] password for osr:
Añadiendo al usuario Debian-exim' al grupossl-cert' …
Añadiendo al usuario Debian-exim al grupo ssl-cert
Hecho.
~$

Reconocimiento de dominios locales …

… y alias y redirecciones específicas para cada dominio.

Exim4 tiene una forma sencilla de gestionar dominios virtuales. Hay dos tipos como bien dice la documentación: uno en el que todas las direcciones de correo se trasladan a un dominio interno (como por ejemplo victor@empresa.net a victor@interno.empresa.net) y otro en el que existen buzones locales para cada cuenta en cada dominio.

En realidad se pueden dar varias combinaciones de este tipo y como en mi situación estoy gestionando varios entornos con necesidades diferentes he intentado que estén lo más separados posible. Primero he creado un árbol de dominios y luego he ido añadiendo los archivos necesarios a cada uno:

El árbol de momento está así:

root@esferas:/etc/exim4# tree -puag domains/
domains/
├── [drwxr-xr-x root Debian-exim] esferas.org
│   └── [-rw-r----- root Debian-exim] aliases
├── [drwxr-xr-x root Debian-exim] osteoluna.es
└── [drwxr-xr-x root Debian-exim] vistanieve.net
3 directories, 1 file

Teniendo el archivo aliases el siguiente contenido:

#
# Alias de correo para esferas.org
#

# Cuentas administrativas
mailer-daemon: postmaster
postmaster: root
abuse: root
spam: root
root: victor

# Cuentas de usuario
victor: victor@taquiones.net

Para que exim emplee esta estructura se crea un enrutador con la siguiente forma:

virtual:
  driver = redirect
  domains = dsearch;/etc/exim4/domains
  data = ${lookup{$local_part}lsearch{/etc/exim4/domains/$domain_part/aliases}}
  no_more

Este enrutador funciona de la siguiente manera:

  1. Comprueba con dsearch que existe en el directorio /etc/exim4/domains un archivo con el nombre del dominio tratado.
  2. Busca la parte local de la dirección en el archivo de alias del dominio.
  3. Al ser un enrutador de tipo redirección el resultado -si encuentra algo- es una nueva dirección de envío.

Hay otra opción más completa que he encontrado aquí y que añade un cambio interesante, concretamente el que consigue que los dominios virtuales se consulten dinámicamente buscando en el directorio.

Primero se cambia el archivo de definiciones en conf.d/main/01_exim4-config_listmacrosdefs

domainlist local_domains = @:localhost:dsearch;/etc/exim4/domains

Para añadir el enrutador que menciono en conf.d/router/350_exim4-config_vdom_aliases:

#
#       Enrutador para dominios locales virtuales
#
vdom_aliases:
        driver = redirect
        allow_defer
        allow_fail 
        domains = dsearch;/etc/exim4/domains
        data = ${expand:${lookup{$local_part}lsearch*@{/etc/exim4/domains/$domain/aliases}}}
        retry_use_local_part
        pipe_transport = address_pipe
        file_transport = address_pipe
        no_more

Referencias