Uso de ACLs con el servidor de correo Exim4

En ocasiones necesitamos definir qué usuarios locales de un servidor pueden sacar correo y cuáles no. De esta forma, permitimos que puedan enviarse correo desde ese sistema (avisos, logs, etc.) pero impedimos en particular que un usuario determinado del sistema (por ejemplo www-data) pueda sacar correo descontroladamente (batched SMTP a través de una función de php5 o cualquier aplicación). Veremos cómo hacerlo con exim4 mediante el uso de ACLs.

El uso de las ACLs se define en /etc/exim4/exim4.conf.template (en una configuración de exim4 monolítica, en un solo fichero, como es nuestro caso). Vienen muchas ACLs definidas por defecto, no son parte de exim4 sino preparadas por los desarrolladores de Debian (véase para ello man exim4_files en Ubuntu/Debian). Todas ellas están orientadas a controlar conexiones SMTP reales (pues es lo normal). Sin embargo, nosotros no necesitamos controlar conexiones SMTP (no damos servicio externo), sino definir qué usuarios locales pueden sacar correo.

Para ello añadiremos una nueva ACL, llamada acl_not_smtp, orientada a controlar justamente las conexiones no-SMTP (aunque no incluida por Debian en la plantilla de ACLs). Incluiremos el siguiente código antes de cualquier sección begin.

#####################################################
### main/04_exim4-config_notsmtp
#####################################################

acl_not_smtp = acl_not_smtp

#####################################################
### end main/04_exim4-config_notsmtp
#####################################################

Seguimos editando /etc/exim4/exim4.conf.template. Más abajo, después de la orden begin acl, donde se especifican las distintas ACLs, incluimos el siguiente código (el orden de las ACLs es indiferente, lo importante es que sea en algún lugar después de begin acl y antes de que empiecen los siguientes begin):

#####################################################
########### non-SMTP ACLs ###########################
#####################################################
# The non-SMTP ACLs apply to all non-interactive incoming messages,
# that is, they apply to batched SMTP as well as to non-SMTP (local)
# messages.
# This is used to determine whitelisted local senders.
# Local addresses listed in CONFDIR/local_senders_allow are allowed
# to send mail. - 20130724

acl_not_smtp:
accept
senders = lsearch;/etc/exim4/local_senders_allow
logwrite = :main: accepting local user
deny
message = "sender envelope address $sender_address is locally DENIED. If you think this is wrong, get in touch with sysadmin"

De esta forma exim4 aceptará (accept) correo saliente de cualquier usuario local contenido en la lista blanca que acabamos de definir (/etc/exim4/local_senders_allow). Si el remitente no aparece en dicho fichero, exim4 abortará el envío (deny) y devolverá un mensaje de error.

Ahora debemos generar el fichero de configuración (hay que hacerlo siempre que modifiquemos la plantilla de configuración /etc/exim4/exim4.conf.template):

# update-exim4.conf

Y reiniciamos el servicio:

# service exim4 restart

La lista blanca /etc/exim4/local_senders_allow contendrá usuarios locales, uno por fila, con el formato usuario@example.local (que es como enmascaramos el dominio local). Por ejemplo:

# cat /etc/exim4/local_senders_allow
root@example.local
usuario1@example.local

En este caso, solo root y usuario1 podrá sacar correo de esa máquina.

Nota: No será necesario regenerar la plantilla ni reiniciar exim4 cada vez que modifiquemos este fichero de texto.

Conclusión: todo usuario local con la forma usuario@example.lan incluido en el fichero de texto /etc/exim4/local_senders_allow podrá sacar correo externo desde la máquina. Si no está incluido en ella (como es el caso de www-data), no podrá hacerlo.