2. Configuración de Exim4
Nota
La configuración básica de Exim4 para los dos modos de configuración de este manual son similares. De hecho este documento es el mismo que para el caso de Configuración Macro-Servidor
La diferencia está en el siguiente capítulo: Configuración simplificada con usuarios virtuales
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:
Instalar el paquete exim4-daemon-heavy.
Configurar Exim4 para que divida la configuración en pequeños ficheros.
Crear un fichero para definir las variables globales a usar con Exim4.
Establecer el nombre de correo:
/etc/mailname
Establecer los puertos de escucha, 587 y 465 para que se entregue el correo saliente.
Activar cifrado SSL/TLS.
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:
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:
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.
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.
En
/etc/mailname
establezco el mismo nombre.En
/etc/exim4/update-exim4.conf.conf
establezco:c_other_hostnames='vps3.20cones.org'
En
/etc/hostname
pongovps3
como nombre de máquina.En
/etc/hosts
me aseguro tener la línea127.0.1.1 vps3.20cones.org vps3
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:
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
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:
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:
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 autoridadesfullchain.pem
. Esto es importante para evitar problemas en clientes tipo Outlook/etc/exim4/exim.key
(clave privada) hacia el ficheroprivkey.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