Añadir automáticamente un Disclaimer a todos los correos de un dominio en Postfix

Últimamente está muy «de moda» añadir un disclaimer a los correos corporativos, con un montón de mensajes legales amenazantes o con información, y la forma mas simple suele ser añadirlo en el cliente de correo, sin embargo, esto complica la actualización en caso de que el mensaje cambie, por lo que, como siempre, tener la configuración centralizada suele ser la mejor opción. En este artículo veremos como configurar Postfix para que añada una firma a todos los correos salientes de un dominio en concreto…

En este artículo asumiremos que Postfix ya está correctamente instalado y funcional en el sistema, de tal forma que nos centraremos en la instalación y configuración de alterMIME. Además, para salirnos un poco de la tónica habitual, esta vez lo instalaremos en Ubuntu en lugar de en CentOS.

Instalando alterMIME

En este caso la instalación es tremendamente sencilla, pues alterMIME viene en los repositorios estandar de Ubuntu:

apt-get update
apt-get install altermime

En el siguiente paso crearemos el usuario filter con el directorio home en /var/spool/filter, ya que será el usuario que utilizará alterMIME. El parámetro -r de useradd creará una System Account, de tal manera que el UID estará en el rango de las mismas, y no habrá inforamción del aging en el shadow, además, el directorio home del usuario NO será creado.

useradd -r -c "Postfix Filters" -d /var/spool/filter filter
mkdir /var/spool/filter
chown filter:filter /var/spool/filter
chmod 750 /var/spool/filter

Después, crearemos el fichero /etc/postfix/disclaimer, que será el que ejecute alterMIME. El paquete de Ubuntu de alterMIME viene con un script de ejemplo, que podemos copiar y adaptar para nuestras necesidades

cp /usr/share/doc/altermime/examples/postfix_filter.sh /etc/postfix/disclaimer
chgrp filter /etc/postfix/disclaimer
chmod 750 /etc/postfix/disclaimer

El problema del script por defecto es que no distingue entre correos enviados o recibidos, simplemente añadiría el texto a todos los correos, sin embargo, esto no es lo que queremos. Además, en mi caso, yo lo quiero para un dominio en concreto, pero no para todos, por lo que he modificado el script un poco para cumplir con las especificaciones de lo que necesito

#!/bin/sh
# Localize these.
INSPECT_DIR=/var/spool/filter
SENDMAIL=/usr/sbin/sendmail

####### Changed From Original Script #######
DISCLAIMER_DOMAIN="DOMINIO.TLD"
####### Changed From Original Script END #######

# Exit codes from <sysexits.h>
EX_TEMPFAIL=75
EX_UNAVAILABLE=69

# Clean up when done or when aborting.
trap "rm -f in.$$" 0 1 2 3 15

# Start processing.
cd $INSPECT_DIR || { echo $INSPECT_DIR does not exist; exit
$EX_TEMPFAIL; }

cat >in.$$ || { echo Cannot save mail to file; exit $EX_TEMPFAIL; }

####### Changed From Original Script #######
# Obtain From address
from_address=`grep  "From:" in.$$ | grep "@" | cut -d ":" -f 2 `

# Check if the domain is the one we want
email_domain=`echo "${from_address}" | /bin/grep -c "${DISCLAIMER_DOMAIN}"`

# If the domain is the one we're looking for, execute altermime
if [ ${email_domain} -eq 1 ]; then
  /usr/bin/altermime --input=in.$$ \
                   --disclaimer=/etc/postfix/disclaimer.txt \
                   --disclaimer-html=/etc/postfix/disclaimer.txt || \
                    { echo Message content rejected; exit $EX_UNAVAILABLE; }
fi
####### Changed From Original Script END #######

$SENDMAIL -oi "$@" <in.$$

exit $?

Después, deberemos editar el fichero /etc/postfix/disclaimer.txt para incluir el texto que queramos que sea añadido como firma de todos los emails salientes del dominio DOMINIO.TLD. Nuevamente el paquete de alterMIME incluye uno de ejemplo por si queremos usarlo: /usr/share/doc/altermime/examples/disclaimer.txt

Una vez que ya tenemos el script listo y el texto en su sitio, procederemos a modificar Postfix para que ejecute nuestro script, para ello, editaremos el fichero /etc/postfix/master.cf

# POSTFIX(1) master(5) configuration file - auto-generated by i-MSCP
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
#
# ==========================================================================
# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (yes)   (never) (100)
# ==========================================================================
smtp      inet  n       -       y       -       -       smtpd
 -o content_filter=dfilt:
[...]
submission inet n       -       y       -       -       smtpd
 -o content_filter=dfilt:
[...]

Y añadiremos estas dos líneas al final del mismo fichero

dfilt     unix    -       n       n       -       -       pipe
    flags=Rq user=filter argv=/etc/postfix/disclaimer-f ${sender} -- ${recipient}

Una vez que tenemos listos los cambios, procedemos a reiniciar postfix

systemctl restart postfix

Comprobamos en el /var/log/syslog que postfix no devuelva ningún error, y ya estaría listo!

Dejo como posibles mejoras para el lector la modificación del script para que compruebe mas de un dominio y seleccione diferentes textos de disclaimer según el dominio, cambio que debería ser bastante sencillo. Mi agradecimiento a Falko Timme, que escribió un artículo en HowtoForge en el cual me he basado para escribir este artículo. Thanks Falko!

Como siempre, espero que os haya sido de utilidad y gracias por visitarme!

Málaga, Marzo de 2020