AntiSPAM con SpamAssassin

Si no haces esto probablemente estés recibiendo montones de correo basura cada día. Es uno de los grandes problemas del correo y una de las tareas que más CPU consumen, pero necesarias para nuestros usuarios, y para ahorrar tiempo cada dia. Podemos configurar SpamAssassin de varias maneras, pero creo que es importante dar a los usuarios algo de voz en el tema (después de esta guía, los usuarios no podrán hacer cambios por ellos mismos, deberíamos crear una interfaz web para ello, pero tendrán la posibilidad de adiestrar el filtro de spam, y por otro lado, el administrador podrá hacer cambios fácilmente en las preferencias de un usuario en particular.

Para esta guía, como en las anteriores, estaré utilizando un servidor Ubuntu Server 12.04, por lo que utilizaré comandos como apt-get y sudo que puede que no estén disponibles en tu distribución. Pero los ficheros de configuración (al menos los contenidos) y el uso básico de las herramientas sí debe coincidir.

Primero, vamos a describir lo que vamos a hacer:

  • Instalar spamassassin, y configurarlo para comprobar si cada mensaje entrante es spam. Los mensajes estarán marcados, tanto en sus cabeceras como en el asunto del mensaje.
  • Hacer que spamassassin pueda utilizar varias configuraciones: de usuario, de dominio, o global, en ese orden, así un usuario podrá cambiar algunas propiedades sin afectar a los demás.
  • SpamAssassin puede utilizar filtros bayesianos, o lo que es lo mismo, aprende a detectar qué es spam y qué no, por lo que periodicamente vamos a recorrer las bandejas de correo basura de nuestros usuarios para marcar los mensajes sospechosos. Eso sí, cada usuario tendrá sus datos de forma única.
  • Instalar sieve y configurar scripts para hacer que el correo basura se mueva automáticamente a la carpeta destinada para tal fin.

Vamos a almacenar los datos de spamassassin (configuración y datos del filtro bayesiano) en nuestra base de datos MySQL. Podríamos usar también postgreSQL o SQLite, pero ya que tenemos una MySQL, vamos a aprovecharla.

Primero, instalaremos los programas necesarios (spamassassin,  sieve y algunos motones antispam en línea, podemos quitarlos si queremos, pero agilizarán el proceso):

$ sudo apt-get install spamassassin mailutils razor pyzor

Ahora, vamos a mirar los ficheros de configuración, empezando por /etc/default/spamassassin (no escribiremos el fichero completo, sólo las líneas que debemos cambiar):

# Change to one to enable spamd
ENABLED=1

OPTIONS="--create-prefs --max-children 5 --helper-home-dir -q -x -u mail"

NICE="--nicelevel 10"

Con esto, activamos el demonio, definimos opciones de inicio y establecemos la prioridad a 10 haciendo que el proceso se ejecute con baja prioridad y así no entorpezca otras tareas (si vemos que en nuestro servidor va demasiado lento podemos poner un número menor o comentar la línea)

Ahora /etc/spamassassin/local.cf

rewrite_header Subject *****SPAM*****
lock_method flock
required_score 5.0
use_bayes 1
bayes_auto_learn 1
bayes_ignore_header X-Bogosity
bayes_ignore_header X-Spam-Flag
bayes_ignore_header X-Spam-Status
skip_rbl_checks 0
pyzor_options --homedir /var/spool/pyzor
use_razor2 1
razor_timeout 5
use_pyzor 1
pyzor_timeout 5
report_contact  administrator@email.ext

Casi todo ha sido quitar comentarios de líneas, excepto las seis últimas:

  • rewrite_header Subject *****SPAM*****: Definimos el asunto del mensaje marcado como correo basura, escribiendo *****SPAM***** al principio.
  • lock_method flock : Establecemos la manera de bloquear ficheros o peticiones de base de datos, para ello usaremos flock (pero si estamos utilizando nfs es recomendable utilizar nfssafe)
  • required_score : Puntuación mínima para marcar un mensaje como SPAM.
  • use_bayes 1 : Usa el filtro bayesiano. Conoce nuevas formas de spam con información estadística de correos que sabemos seguro que son basura.
  • bayes_auto_learn 1 : Hace que el filtro antispam aprenda automáticamente de los mensajes
  • bayes_ignore_header : El filtro bayesiano toma atajos cuando ciertas cabeceras aparecen en el correo, pero en ocasiones los mensajes nos llegan de fuera con estas cabeceras (por ejemplo en listas de correo), y no podemos confiar en ellas porque nos confundirían.
  • pyzor-options : Opciones del motor pyzor
  • skip_rbl_checks 0 : No se salta los tests RBL. Estos tests vienen de Realtime Blackhole List (o Realtime BlackLists) desde Internet. Son bases de datos que almacenan IPs y nombres de dominio que han sido reportadas como fuentes de correo basura. Nos ahorrará tiempo y CPU.
  • use_razor2 / use_pyzor : Usa otras bases de datos online
  • razor/pyzor_timeout : Timeout for para esas bases de datos
  • report_contact : Presenta el e-mail del administrador en los mensajes recibidos como SPAM, para futuros comentarios de los usuarios.

Ahora configuramos pyzor:

$ sudo mkdir /var/spool/pyzor
$ sudo pyzor --homedir /var/spool/pyzor discover
$ sudo chown -R mail:mail /var/spool/pyzor
$ sudo chmod -R +x /var/spool/pyzor

En este punto podemos hacer una pequeña prueba del sistema, para ello reiniciamos (o iniciamos por primera vez) el servicio spamassassin y “enviamos” mensajes de prueba a spamc (cliente spamassassin), a ver si todo va bien:

$ sudo service spamassassin restart

$ cat /usr/share/doc/spamc/sample-spam.txt | spamc

Veremos algunas cabeceras nuevas en el resultado

Subject: *****SPAM***** Test spam mail (GTUBE)
Date: Wed, 23 Jul 2003 23:30:00 +0200
Message-Id: <GTUBE1.1010101@example.net>
X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on cloud
X-Spam-Flag: YES
X-Spam-Level: **************************************************
X-Spam-Status: Yes, score=1000.0 required=5.0 tests=GTUBE,NO_RECEIVED,
        NO_RELAYS autolearn=no version=3.3.2

Ahora vamos a integrar todo esto con postfix, por lo que editaremos /etc/postfix/master.cf para hacer que el correo pase por nuestro filtro:

smtp    inet    n       -       n       -       -       smtpd
   -o content_filter=spamfilter:dummy
spamfilter unix -       n       n       -       -       pipe
   flags=Rq user=mail argv=/usr/local/bin/spamfilter.sh -f ${sender} -- ${recipient}

#smtp      inet  n       -       n       -       -       smtpd

Debemos comentar la línea existente de smtp, y escribir la nueva, con esto haremos que el mensaje pase a través del filtro spamfilter.sh (que crearemos más adelante) y tras ello, entregaremos el mensaje.

Creamos entonces /usr/local/bin/spamfilter.sh y ponemos lo siguiente (en el futuro modificaremos los contenidos de este archivo para incluir más opciones):

#!/bin/bash
/usr/bin/spamc | /usr/sbin/sendmail -i "$@"
exit $?

Damos a spamfilter.sh permiso de ejecución

$ sudo chown mail:mail spamfilter.sh 
$ sudo chmod +x spamfilter.sh

Ahora tenemos la misma configuración para todos los usuarios y no irá mal, pero los usuarios no tendrán nada que hacer si reciben falsos positivos o negativos. Además, en este punto, los usuarios tendrán que crear sus propios filtros redirigir (o eliminar) los mensajes etiquetados como *****SPAM*****

Sólo queda reiniciar el servidor postfix y probar el envío de un mensaje desde nuestro cliente de correo favorito. Si ves que no llega como spam, al menos visualiza el código fuente y asegúrate de que las cabeceras X-Spam estén ahí, eso será que funciona:

$ sudo service postfix restart

 

 

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *