2. Configuración de Exim4 para un macro-servidor

Para la configuración propuesta es necesario instalar Exim4 con el soporte incluido para todas sus funciones (bases de datos, antivirus, antispam, etc.). En Debian en un paquete diferente al paquete básico exim4. La configuración a realizar es la siguiente:

  1. Instalar el paquete exim4-daemon-heavy.

  2. Configurar Exim4 para que divida la configuración en pequeños ficheros.

  3. Crear un fichero para definir las variables globales a usar con Exim4.

  4. Establecer el nombre de correo: /etc/mailname

  5. Establecer los puertos de escucha, 587 y 465 para que se entregue el correo saliente.

  6. Activar cifrado SSL/TLS.

  7. Configurar correctamente los certificados usando LetsEncrypt/Certbot

2.1. Instalación de Exim4 y configuración básica

La instalación es fácil, lo único es, no equivocarse de paquete:

apt install exim4-daemon-heavy

Una vez instalado las opciones básicas de configuración se encuentran en el fichero /etc/exim4/update-exim4.conf.conf. La primera es establecer el formato de almacenamiento de los correos recibidos al formato Maildir mediante este cambio:

Fichero /etc/exim4/update-exim4.conf.conf
dc_localdelivery='maildir_home'

Sin entrar en profundidad el motivo de este cambio son las copias de seguridad incrementales, ya que este formato tiene un fichero por correo mientras que con MBox cualquier nuevo correo requiere una copia completa del fichero.

2.2. Configuración dividida en ficheros

La configuración de Exim4 es un fichero muy extenso con multitud de opciones. La configuración predeterminada de Debian incluye una plantilla en /etc/exim4/exim4.conf.template y se puede ver lo extensa que es. Esta plantilla trae multitud de variables para pre-establecer antes de procesar la plantilla y así para generar un fichero de configuración.

Para dar mayor flexibilidad al proceso de configuración de Exim4, Debian incluye la posibilidad de dividir la configuración en multiples ficheros. Este modo se activa editando el fichero indicado de la siguiente forma:

Fichero /etc/exim4/update-exim4.conf.conf
dc_use_split_config='true'

Con este modo, se generara la plantilla a concatenando de manera ordenada (alfabéticamente ) multiples ficheros, obtenidos el directorio /etc/exim4/conf.d. El comando ejecutable encargado de esto es update-exim4.conf --check que sirve para comprobar la sintaxis antes de reiniciar el servicio.

Advertencia

No se debe ejecutar update-exim4.conf sin el argumento –check, ya que se genera una nueva configuración y Exim4 la puede recargar en cualquier momento si está en ejecución.

A lo largo de este manual se irán añadiendo ficheros en el directorio /etc/exim4/conf.d para configurar el servidor. Para comenzar, se creará un fichero donde establecer las variables globales aplicadas a toda la plantilla de configuración de la siguiente forma:

touch /etc/exim4/conf.d/main/00_exim4-config_custom

Este fichero será el primero incluido cuando se genere la configuración de Exim4 ya que se concatenan por orden alfabético, comenzando en el directorio conf.d/main.

2.3. Configurar mailname, hosts y hostname

Esta parte de la configuración es un poco caótica. Según la política de Debian es recomendable establecer el nombre del servidor de correo en el fichero /etc/mailname (Ref. https://wiki.debian.org/EtcMailName). En teoría, el fichero /etc/mailname contiene el nombre de dominio con el que se rellenan los correos locales que se puedan generar dentro del sistema, principalmente afecta a los automáticos, como por ejemplo, el cron.

El problema es que cada MTA se comporta como le parece, así que no entro en detalles y dejo el modo en que lo configuro en todas las máquinas. Como ejemplo, expongo la configuración de un VPS que por ahora opera correctamente con el correo.

  1. Al VPS le doy un sub-nombre de algunos de mis dominios: vps3.20cones.org, es decir, incluyo una entrada DNS hacia la IP pública con ese nombre.

  2. En /etc/mailname establezco el mismo nombre.

  3. En /etc/exim4/update-exim4.conf.conf establezco: c_other_hostnames='vps3.20cones.org'

  4. En /etc/hostname pongo vps3 como nombre de máquina.

  5. En /etc/hosts me aseguro tener la línea 127.0.1.1  vps3.20cones.org vps3

  6. Si tienes IPv6 lo anterior lo debes repetir también para ::1 vps3.20cones.org vps3

Nota

El fichero /etc/hostname debe contener sólo el nombre de la máquina sin el dominio asociado, el nombre completo (FQDN) se obtiene desde /etc/hosts (Ref. man hostname)

Es recomendable reiniciar la máquina y probar los siguientes comandos para revisar el resultado:

hostname
vps3

hostname -d
20cones.org

hostname -f
vps3.20cones.org

2.4. Respuesta SMTP HELO

Si los cambios hechos en la sección anterior son correctos, Exim4 debería tomar como nombre primario vps3.20cones.org y responder de la siguiente forma en el puerto 25 (usando netcat):

nc localhost 25

220 vps3.20cones.org ESMTP Exim 4.94.2 Mon, 13 Feb 2023 18:00:56 +0100

HELO mail.art-website.com

250 vps3.20cones.org Hello localhost [::1]

quit

221 vps3.20cones.org closing connection

Pero aquí surge un problema, algunos sistemas de correo espera que la respuesta al comando HELO/EHLO sea la resolución inversa de la IP a la que se han conectado y en mi caso tengo como resolución inversa mail.art-website.com. Las soluciones serían:

  1. Cambiar el fichero host de la máquina para que la línea sea: 127.0.1.1 mail.art-website.com mail vps3. Pero dejo vps3 para no crear un problema al resolver el nombre de máquina establecido en /etc/hostname

  2. Forzar a Exim4 a usar un nombre determinado en la respuesta 220, para Exim4 es el denominado primary_hostname.

Por diversos motivos que no tiene sentido contar aquí siempre estoy usando la segunda opción, personalmente me ofrece mayor flexibilidad de configuración. Así, optando por ella, la primera variable a establecer en el fichero /etc/exim4/conf.d/main/00_exim4-config_custom sería la siguiente:

# Reply to HELO/EHLO
primary_hostname = mail.art-website.com

Realizando el cambio y reiniciando el servicio con systemctl restart exim4 la respuesta HELO debería ser la deseada.

2.5. Configuración de puertos

Además del puerto 25, Exim4 debe escuchar en los puertos 587 (submission) y 465 [1] (obsoleto). Se supone que por estos puertos los usuarios de correo entregan a Exim4 los correos para enviar, quedando actualmente el puerto 25 reservado para la comunicación entre MTAs. Esta configuración se establece cambiando lo siguiente:

Fichero /etc/exim4/update-exim4.conf.conf
dc_local_interfaces='0.0.0.0.25 : 0.0.0.0.587 : 0.0.0.0.465'

2.6. SSL/TLS

Para activar TLS y forzar cifrado en el puerto 465 es necesario establecer ciertas variables en la plantilla de configuración. Usando el fichero creado en Configuración dividida en ficheros hay que añadir lo siguiente:

Fichero /etc/exim4/conf.d/main/00_exim4-config_custom
MAIN_TLS_ENABLE = yes
# Avoid starttls in this port
tls_on_connect_ports = 465

La segunda directiva activa el cifrado automático (sin necesidad de starttls) en el puerto 465, ya que es el comportamiento esperado por los clientes en ese puerto.

Con los certificados hay que tener cuidado, los ficheros por defecto son /etc/exim4/exim.crt y /etc/exim4/exim.key, la mejor opción es hacer enlaces simbólicos para no alterar más ficheros de configuración. Pero antes hay que tener certificados válidos, en la siguiente sección muestro como trabajar con LetsEncrypt y Certbot.

2.7. Certificados digitales

Para activar el cifrado es necesario disponer de certificados digitales que no sean autofirmados. Para que todo opere correctamente, sobre todos para los clientes externos, la mejor opción es obtener un certificado LetsEncrypt con Certbot para el nombre de dominio que se esté usando en la Resolución inversa y en la Respuesta SMTP HELO. En mi configuración es mail.art-website.com.

Advertencia

Antes de continuar asegúrate de tener la resolución inversa bien configurada como se explica en Resolución inversa

Si no tienes los certificados para realizar pruebas es crear certificados auto-firmados pero éstos darán error cuando se conecten los clientes de correo.

Llegado a este punto supongo que se tienen los certificados obtenidos con Certbot, e mi caso en el directorio /etc/letsencrypt/live/mail.art-website.com tal y como muestro a continuación:

ls -l /etc/letsencrypt/live/mail.art-website.com
lrwxrwxrwx 1 root root      45 ene  4 08:30 cert.pem -> ../../archive/mail.art-website.com/cert12.pem
lrwxrwxrwx 1 root root      46 ene  4 08:30 chain.pem -> ../../archive/mail.art-website.com/chain12.pem
lrwxrwxrwx 1 root root      50 ene  4 08:30 fullchain.pem -> ../../archive/mail.art-website.com/fullchain12.pem
lrwxrwxrwx 1 root root      48 ene  4 08:30 privkey.pem -> ../../archive/mail.art-website.com/privkey12.pem
-rw-r--r-- 1 root ssl-cert 692 mar 12  2021 README

cd /etc/letsencrypt/archive/mail.art-website.com
ls -l *12*
-rw-r--r-- 1 root ssl-cert 1858 ene  4 08:30 cert12.pem
-rw-r--r-- 1 root ssl-cert 3749 ene  4 08:30 chain12.pem
-rw-r--r-- 1 root ssl-cert 5607 ene  4 08:30 fullchain12.pem
-rw-r----- 1 root ssl-cert 1704 ene  4 08:30 privkey12.pem

Los permisos, concretamente el grupo, diferirá en el segundo listado mostrado. Esto es debido a que la configuración predeterminada de Debian 11 con Certbot, no contempla como compartir los certificados entre diferentes programas. Hay multiples formas de hacerlo, pero hay un paquete Debian llamado ssl-cert pensado compartir certificados. Si se instala, crea el grupo de usuarios «ssl-cert» pensado para este fin.

No de debe crear el grupo ssl-cert manualmente, lo mejor es instalar ssl-cert y verificar que se crear el grupo:

apt install ssl-cert
getent group ssl-cert

ssl-cert:x:118:

Con este grupo se compartirán los certificados entre los programas que necesiten los certificados: Exim4, Dovecot, Apache2, etc. y, comenzando con Exim4, para que todo opere correctamente hay que hacer cambios en los permisos de /etc/letsencrypt. Se establecerá el grupo a todos los ficheros y directorios de manera recursiva y además, activando el bit «s» (sticky) de grupo en todos los sub-directorios. Con esto último, los nuevos ficheros y directorios se creen, pertenecerán automáticamente a este grupo. Los comandos son los siguientes:

chown -R root:ssl-cert /etc/letsencrypt
find /etc/letsencrypt -type d  -exec chmod g+s {} \;
chmod -R g+r /etc/letsencrypt

El último paso es añadir el usuario del sistema usado por Exim4 al grupo ssl-cert para que pueda leer los certificados y claves:

id Debian-exim
uid=109(Debian-exim) gid=115(Debian-exim) groups=115(Debian-exim)

adduser Debian-exim ssl-cert
Añadiendo al usuario `Debian-exim' al grupo `ssl-cert' ...
Añadiendo al usuario Debian-exim al grupo ssl-cert
Hecho.

id Debian-exim
uid=109(Debian-exim) gid=115(Debian-exim) groups=115(Debian-exim),118(ssl-cert)

Para finalizar la configuración prefiero enlazar simbólicamente los ficheros predeterminados de Exim4 para hacer los mínimos cambios en la configuración de Exim4:

  • /etc/exim4/exim.crt (certificado digital) hacia el fichero del certificado con la cadena completa de autoridades fullchain.pem. Esto es importante para evitar problemas en clientes tipo Outlook

  • /etc/exim4/exim.key (clave privada) hacia el fichero privkey.pem

Los comandos serían:

cd /etc/exim4
ln -s /etc/letsencrypt/live/mail.art-website.com/fullchain.pem exim.crt
ln -s /etc/letsencrypt/live/mail.art-website.com/privkey.pem exim.key
systemctl restart exim4

Configuración alternativa

Alternativamente a los enlaces simbólicos es posible redefinir dos variables para establecer la ruta absoluta del certificado y de la clave privada: MAIN_TLS_CERTIFICATE y MAIN_TLS_PRIVATEKEY Consistiría en añadir en /etc/exim4/conf.d/main/00_exim4-config_custom

MAIN_TLS_CERTIFICATE = /etc/letsencrypt/archive/mail.art-website.com/privkey.pem
MAIN_TLS_PRIVATEKEY = /etc/letsencrypt/archive/mail.art-website.com/fullchain.pem

La configuración se puede testar desde línea de comandos según sea cada puerto/protocolo, con los siguientes comandos:

openssl s_client -connect mail.art-website.com:465
openssl s_client -starttls smtp  -connect  mail.art-website.com:587

Notas