jueves, 13 de marzo de 2014

Filtrando adjuntos en Postfix

Hoy en día usar una lista de distribución de correos para divulgar información es algo obsoleto, pero si parte del público de esa lista no tiene acceso a Internet es una buena alternativa. El problema viene cuando los administradores de esas listas comienzan a enviar mensajes con imágenes, documentos Word y PDFs incluso a aquellas personas de una intranet con acceso a la página donde están publicadas esas mismas informaciones. Peor si esas mismas personas acceden por módem analógico a su correo (sí, todavía sucede). Uno puede intentar decirles que envíen los mensajes sólo en texto plano o que reduzcan el tamaño, pero ellos también pueden no hacerte caso y seguir haciendo lo mismo.

Se me ocurrió que podía configurar el servidor Postfix para que le quitara todos los adjuntos que no fueran texto plano a los mensajes que vinieran de esas listas con destino a mis usuarios. Parece trivial, sin embargo tiene truco.

Lo primero es detectar que el correo viene de una lista y lo más conveniente es revisar las cabeceras del mensaje. Usamos para ello en el archivo /etc/postfix/main.cf:

header_checks = regexp:/etc/postfix/header_checks

y en /etc/postfix/header_checks

/List-Id: <test.listas.example.com>/ FILTER delattach:

Con esto lograremos que cada vez que llegue un mensaje y tenga en su encabezado

List-Id:  <test.listas.example.com>
sea procesado por el transporte delattach. Éste encabezado podemos encontrarlo mirando el código fuente de cualquier mensaje enviado desde la lista.

Para definir el transporte delattach agregamos en el archivo /etc/postfix/master.cf la siguiente línea:

delattach unix    -       n       n       -       20      pipe
   flags=Rq user=nobody argv=/usr/local/bin/delattach.py ${sender} ${recipient}

El script delattach.py se puede descargar desde aquí y es una modificación del que se describe en éste post. Su función es revisar cada una de las partes del mensaje, si alguna no es del tipo text/plain la descarta y luego le inyecta de el mensaje modificado a Postfix a través del puerto 10025. Postfix debe ser configurado para escuchar en ese puerto en localhost en /etc/postfix/master.cf agregando:

127.0.0.1:10025 inet n  -   -   -   -  smtpd
    -o content_filter=
    -o local_recipient_maps=
    -o relay_recipient_maps=
    -o smtpd_restriction_classes=
    -o smtpd_delay_reject=no
    -o smtpd_client_restrictions=permit_mynetworks,reject
    -o smtpd_helo_restrictions=
    -o smtpd_sender_restrictions=
    -o smtpd_recipient_restrictions=permit_mynetworks,reject
    -o mynetworks_style=host
    -o mynetworks=127.0.0.0/8
    -o strict_rfc821_envelopes=yes
    -o smtpd_error_sleep_time=0
    -o smtpd_soft_error_limit=1001
    -o smtpd_hard_error_limit=1000
    -o smtpd_client_connection_count_limit=0
    -o smtpd_client_connection_rate_limit=0
    -o receive_override_options=no_header_body_checks,no_unknown_recipient_checks,no_address_mappings

Esta ultima configuración es la que generalmente se escribe cuando se va a utilizar algun servicio anti-spam como Amavis.