Instalando un antispam con SpamAssassin y Postfix

Instalando un antispam con SpamAssassin y Postfix

Tras leer la documentación oficial y varias guías de como hacerlo, vamos a explicar nuestra experiencia de cómo instalar el antispam SpamAssassin sobre CentOS 6.0 (válido también para el resto de distribuciones) utilizando el servicio de correo Postfix, consiguiendo unos muy buenos resultados para mantenernos libres de spam en nuestros correos.

Esta guía está basada en otras (indicadas como referencias) y extendida y más ampliamente explicada en algunos conceptos en los que hemos tenido problemas.

Instalar Perl

En primer lugar instalaremos Perl si no lo tenemos instalado:

yum install perl
yum install perl-Mail-DKIM.noarch
yum install spamassassin

En este punto, en nuestro caso nos hemos encontrado con alguna dificultad ya que las librerías de SpamAssassin requerían Perl 5.8.8 y CentOS 6.0 nos acababa de instalar Perl 6.0, por lo que existirán conflictos en paquetes con dependencias sin resolver.

error: Failed dependencies:
perl(:MODULE_COMPAT_5.8.8)
Tenemos dos opciones para solucionarlo:
  • Actualizar a CentOS 6.2. Si nuestro servidor no está en producción o estamos seguros de lo que hacemos, tal vez sea la mejor opción.
  • Instalar RPMs de la versión 6.2. Hemos elegido esta opción ya que el servidor en concreto sobre el que lo hemos hecho ya está en producción y nos provocaba bastante incertidumbre el hecho de qué pasará tras actualizar. Tras buscar en los repositorios oficiales de CentOS hemos elegido uno de ellos como éste ftp://centos.arcticnetwork.ca/pub/centos/6.2/os/x86_64/Packages/  y lo hemos instalado a la vieja usanza, con rpm -Uvh rutadelpaquete.rpm todos los paquetes que están dentro de los paquetes requeridos

Configurando SpamAssassin

En primer lugar crearemos el usuario de SpamAssassin
useradd -d /home/spamfilter -s /bin/false spamfilter
chmod 766 /home/spamfilter
Crear el archivo
nano /etc/mail/spamassassin/local.cf
y pegar
# Puntuación para ser marcado spam
required_hits 5.0
# Texto que se antepondrá al asunto de los emails que sean spam
rewrite_header Subject [*****SPAM*****]
# Encapsular spam en un adjunto al email de aviso
report_safe 1
# Habilitar systema Bayes
use_bayes 1
# Autoaprendizaje
bayes_auto_learn 1
bayes_path /home/spamfilter/
bayes_file_mode 0666
# Comprobaciones de spam
skip_rbl_checks 0
use_razor2 1
use_dcc 1
use_pyzor 1

Comprobar si la configuración es correcta:

spamassassin --lint

Posiblemente nos avise de algunos warnings referentes a las comprobaciones de spam, pero en principio no tiene mayor importancia.

Configurando Postfix

Editar /etc/postfix/master.cf. Reemplazaremos la directiva smtp por lo siguiente
smtp inet n - n - - smtpd
   -o content_filter=spamfilter:dummy
spamfilter unix - n n - - pipe
   flags=Rq user=spamfilter argv=/usr/local/bin/spamfilter.sh -f ${sender} -- ${recipient}

Editar /etc/postfix/main.cf

strict_rfc821_envelopes = yes
disable_vrfy_command = yes
smtpd_helo_required = yes
smtpd_client_restrictions =
smtpd_helo_restrictions =
smtpd_sender_restrictions =
smtpd_recipient_restrictions =
   permit_mynetworks,
   permit_sasl_authenticated,
   reject_unauth_destination,
   reject_invalid_hostname,
   reject_unauth_pipelining,
   reject_non_fqdn_sender,
   reject_unknown_sender_domain,
   reject_non_fqdn_recipient,
   reject_unknown_recipient_domain,
   check_client_access hash:$config_directory/access_client,
   check_sender_access hash:$config_directory/access_sender
   permit

Conectando Postfix a SpamAssassin

Buscar los binarios spamc y sendmail (variará según la distribución)
locate spamc
 /usr/bin/spamc
locate sendmail
 /usr/sbin/sendmail

Crear el siguiente script shell

nano /usr/local/bin/spamfilter.sh

y pegar

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

Debemos tener mucho cuidado con las rutas, ya que si ponemos mal las rutas los correos no llegarán o llegarán vacíos

chmod 755 /usr/local/bin/spamfilter.sh
chown spamfilter:spamfilter /usr/local/bin/spamfilter.sh

Reiniciamos servicios

/etc/init.d/spamassassin start
/etc/init.d/postfix restart

Actualizar spam assassin y añadirlo al inicio del arranque de Linux

Actualizaremos el servicio de cron

crontab -e

y añadiremos la siguiente línea para ejecutarse todos los viernes a las 8:01

01  8  *  *  5  sa-update && service spamassassin restart

Por último lo añadimos a los scripts de inicio de CentOS

chkconfig --add spamd

Borrando el spam recibido

SpamAssassin no recomienda borrar el correo marcado spam por si ocurren falsos positivos, pero aún así vamos a filtrar los que claramente sean spam.

mkdir /var/spamchk
chmod -R 777 /var/spamchk 
chown -R spamfilter:spamfilter /var/spamchk

Hacemos una copia de seguridad de /usr/local/bin/spamfilter.sh a simple_spamfilter.sh y editaremos el archivo poniendo

#!/bin/sh

# Variables
SENDMAIL="/usr/sbin/sendmail -i"
EGREP=/bin/egrep
TMPFILE=/tmp/spamchk.$$
SIDELINE_DIR=/var/spamchk
# Puntuación mínima del correo para ser tratado como spam
SPAMLIMIT=10
# Limpiamos el archivo temporal
trap "rm -f $TMPFILE" 0 1 2 3 15
# Guardamos el mensaje temporalmente en $TMPFILE
cat | /usr/bin/spamc -u filter | sed 's/^.$/../' > $TMPFILE
# Comprobamos si el correo está marcado con un alto nivel de spam
if $EGREP -q "^X-Spam-Level: *{$SPAMLIMIT,}" < $TMPFILE
then
  # Opción 1: guardarlos en el disco duro
  # mv $TMPFILE $SIDELINE_DIR/`date +%Y-%m-%d_%R`-$$
  # Opción 2: Envíalo a una cuenta de correo de spam para tenerlos guardados
   $SENDMAIL spam@xxxx.xx < $TMPFILE
  # Opción 3: Borra el mensaje
  # rm -f $TMPFILE
else
$SENDMAIL "$@" < $TMPFILE
fi
# Postfix devuelve el estado de salida de la llamada a sendmail command.
exit $?

El umbral para tratar los correos de spam es la variable SPAMLIMIT. Un valor de 10 es un buen valor inicial, pero deberemos ir cambiándolo hasta afinar con el valor más correcto. Aconsejamos un valor mínimo de 5.

Desinstalando Spam Assassin

Si tenemos algún problema, podemos desinstalarlo editando /etc/postfix/master.cf reemplazando el contenido

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

después reinicia los servicios

/etc/init.d/spamassassin start
/etc/init.d/postfix restart

Instalando una interfaz web para SpamAssassin: webuserprefs

El hecho de tener que aprender o estar revisando la documentación para modificar el archivo de configuración es bastante tedioso. Podemos instalar la interfaz gráfica webuserprefs (hecha en PHP) que nos ayudará en ello.

En nuestro caso crearemos desde Plesk un subdominio para ello. No es necesario, ya que podremos instalarlo en una carpeta, pero por comodidad lo hemos hecho así: webuserprefs.xxxxxxx.xxx

Borramos todo el contenido que por defecto trae Plesk y nos situaremos en el directorio objetivo para descargarnos la última versión de webuserprefs (0.6 en el momento de escribir esta guía).

Lo descomprimiremos y daremos permisos necesarios.

wget http://downloads.sourceforge.net/project/webuserprefs/webuserprefs/0.6/webuserprefs-0.6.tar.gz
tar xvzf webuserprefs-0.6.tar.gz
chown -R user:group *

Protegeremos el subdominio mediante "Plesk protected directories system", si no usamos Plesk deberemos usar el sistema de usuarios de Apache y htaccess.

La aplicación webuserprefs modifica el archivo $HOME/.spamassassin/user_prefs donde $HOME es el directorio home del usuario que ejecuta spamd (podemos saberlo ejecutando de nuevo spamassassin --lint) pero como webuserprefs es una aplicación web, las restricciones de PHP open_basedir no nos van a permitir modificarlo. A partir de ahora, $WEBUSERPREFS será el directorio donde está webuserprefs.
Una forma fácil es crear ese archivo en el directorio donde esté la raíz de webuserprefs y crear un enlace símbólico desde $HOME/.spamassassin/user_prefs a éste.
touch $WEBUSERPREFS/user_prefs
chmod 666 $WEBUSERPREFS/user_prefs
cd $HOME/.spamassassin
ln -s $WEBUSERPREFS/user_prefs user_prefs

Éste archivo estará protegido mediante el usuario y contraseña de htaccess y tampoco contiene información sensible, como mucho redes o dominios desde no se acepta emails.

Finalmente editaremos webuserprefs desde su archivo de configuración buscando las siguientes líneas y cambiándolas a:

// require("auth/server.php");
$user_prefs     = "user_prefs";
$group_sort     = "yes";

Fuentes

Este artículo es una mezcla con añadidos y modificaciones en varias partes de éste de las siguientes fuentes:

Comentarios

Comentario de jjandres - 12 de Noviembre de 2013 - 06:29
El * de la expresión regular debe estar escapado: if $EGREP -q "^X-Spam-Level: *{$SPAMLIMIT,}" < $TMPFILE de no estarlo devolverá todos los mensajes como spam. Saludos
Comentario de Alex - 28 de Noviembre de 2014 - 12:39
Hola. ¿como puedo probar que el antispam funciona correctamente? gracias
Ha habido un error en el envío
Comentario enviado. Será revisado por la moderación antes de ser publicado.

Deja tu comentario

Tu nombre:
Tu email:
Tu comentario: