Hace poco instale spamassasin para entender su funcionamiento y me sorprende lo poco que necesita de atención humana, pero eso sí, hay cosillas que es mejor echarle un ojo para entender como funciona.
Lo que vamos a analizar a continuación, usualmente está resuelto de manera transparente al usuario o incluso al administrador de sistemas, especialmente si usan paneles de control, pero como siempre, aquí jugamos por los Loles.
Este Post pertenece a la categoría SEGURIDAD
Puedes encontrar todos los artículos en orden cronológico en la etiqueta POSTFIX
Introducción
Voy a ser sincero. Subestimaba muy duro a SpamAssassin. Probablemente por las experiencias ya muy antiguas que tuve con mi primer hosting o tal vez por asumir que el hecho de que haya correos de spam muy tontos fingiendo ser paneles de administración de hosting, me hizo pensar que si existen, seguro es porque pasan. Pero tras las primeras pruebas, ha logrado neutralizar todo el spam sin tener que configurar nada. Es muy bueno y parece que puede ser mejor.
Hoy me llegó un correo que, por otro lado, es Spam, pero no fue detectado. SpamAssasin lo analizo, pero le puso una calificación de 3.0 de 5. Insuficiente para ser movido a la bandeja de spam, pero suficiente para ser sospechoso. Aquí los elementos de alarma detectados por la herramienta:
- Fallo de DKIM (Suplantación de identidad): La cabecera muestra dkim=fail reason=»key not found en DNS». El remitente afirma ser de Asia-cargo.com.cn, pero el servidor de correo descubrió que la firma digital de ese dominio no existe o está mal configurada. Esto es un indicador clásico de que alguien está intentando falsificar la identidad (Sporting) de esa empresa de carga.
- Inconsistencia de dominios: El correo dice venir de un rebote de ai-freight.com (en el campo Return-Path), pero la firma digital que falla intenta validar a Asia-cargo.com.cn. Que usen múltiples dominios extraños en un solo envío es una táctica típica para evadir filtros.
- Tácticas de ocultamiento (Pruebas de SpamAssassin):HTML_OBFUSCATE_10_20: El correo usa código HTML diseñado específicamente para esconder texto o enlaces a los filtros automáticos.
- MPART_ALT_DIFF: La versión de texto plano del correo y la versión HTML son muy diferentes. Los spammers hacen esto para mostrarle una cosa amigable al usuario (HTML) y un texto aleatorio al filtro para confundirlo.
- URIBL_BLOCKED: Tu servidor no pudo consultar las listas negras de enlaces porque superó la cuota de consultas gratuitas, lo que significa que SpamAssassin no pudo verificar si los enlaces internos del correo eran peligrosos.
Por cierto, tengo esta novedad; URIBL_BLOCKED
Esto sucede porque mi servidor, al pertenecer al rango de IP de Digital Ocean, fue bloqueado por qué… pues porque al ser un proveedor barato de vps, lo usan hartísimo para spam. No puedo cambiar eso, así que no puedo contar con ese tipo de filtros.
Haciendo algunos ajustes
¿Cómo funciona el aprendizaje en SpamAssassin?
SpamAssassin no analiza los correos con un simple «pasa o no pasa». Utiliza dos pilares:
- Reglas de red y formato: Verifica si el remitente tiene DKIM/SPF válido, si el HTML está oculto, etc.
- Filtro Bayesiano (SA-lean): Analiza la frecuencia de las palabras. Si en 100 correos de spam se repite la palabra «LCL Cargo», el sistema aprende estadísticamente que esa combinación de palabras es altamente sospechosa.
Si ejecutaste el comando en una carpeta con 3 correos y el sistema reportó que solo examinó uno, se debe a dos razones:
- Toques duplicados: SpamAssassin calcula un identificador único (huella digital o Message-ID) para cada correo. Si ya había procesado esos correos antes, los ignora para no duplicar la estadística.
- Falta de información: Si un correo es extremadamente corto o idéntico a uno ya aprendido, el contador no se incrementa.
Para ver qué ha aprendido en específico, no puedes ver una lista de «palabras exactas», pero sí puedes ver las estadísticas globales de su cerebro con este comando:
sa-learn --dump magic
Esto te mostrará cuántos correos buenos (Ham) y malos (Spam) ha memorizado, junto con el número de «toques» (palabras/patrones) que tiene guardados.
Una observación importante:
El filtro Bayesiano no se activará de forma automática hasta que haya aprendido de al menos 200 correos de spam y 200 correos de ham (legítimos).
El comando para aprendizaje bayesiano
Dado que estamos explorando un ambiente muy manual, sin panel de control ni nada, necesitamos hacer algunos procesos para ejecutar y activar el aprendizaje bayesiano.
En un entorno manual con formato Maildir (donde cada correo es un archivo físico dentro del servidor), la carpeta Junk se divide en dos sub carpetas: new (correos nuevos sin leer) y cur (correos ya vistos).
Para forzar a SpamAssassin a aprender de todo lo que tú o tus usuarios hayan movido a la carpeta de correo no deseado, usa el siguiente comando:
sa-learn --spam /home/usuario/Maildir/.Junk/{cur,new}
Automatización con Tareas Cron (Por Usuario)
No queremos ejecutar este comando a mano todos los días. Lo ideal es que el propio usuario del sistema (o el usuario que corre el servicio de correo, por ejemplo vmail si usas usuarios virtuales) ejecute la tarea por las noches.
Abre el crontab del usuario específico (reemplaza usuario por el nombre real en tu sistema):
crontab -u usuario -e
Añade la siguiente línea para que se ejecute todas las noches a las 12:00 AM:
0 0 * * * sa-learn --spam /home/usuario/Maildir/.Junk/{cur,new} > /dev/null 2>&1
(El redireccionamiento > /dev/null 2>&1 evita que el servidor te envíe un correo interno cada vez que se ejecute la tarea cron).
Moviendo el Spam automáticamente con Reglas Sieve
SpamAssassin solo se encarga de «marcar» el correo (usualmente añade X-Spam-Flag: YES o X-Spam-Status: Yes en las cabeceras). No lo mueve de carpeta.
Para moverlo automáticamente a la carpeta Junk, usamos Sieve (a través de Dovelo). (no haré un tutorial de como instalarlo, pues hay mucha información al respecto, pero tal vez analice como activarlo)
Crear el archivo de reglas del usuario
Crea un archivo llamado.dovelo.sieve en el directorio home del usuario:
nano /home/usuario/.dovecot.sieve
Pegar la regla de filtrado
Pega el siguiente código estándar de Sieve. Este script lee las cabeceras que inyectó SpamAssassin; si ve que está marcado como spam, lo mueve a la carpeta correspondiente:
require ["fileinto", "mailbox"]; # Si SpamAssassin marcó el correo con la cabecera X-Spam-Flag en YES if header :contains "X-Spam-Flag" "YES" { # Crea la carpeta Junk si no existe y mueve el correo ahí fileinto :create "Junk"; stop; }
Permisos correctos
Es vital que el archivo pertenezca al usuario del correo y no a robot, de lo contrario Dovelo no podrá leerlo:
chown usuario:usuario /home/usuario/.dovecot.sieve
chmod 600 /home/usuario/.dovecot.sieve
Unas cuantas curiosidades
Hay un comportamiento por default que tiene spamassassin que me gusto mucho y es que si bien conserva el asunto del correo, en el cuerpo te entrega un resumen de por qué cree que es spam y claro, su calificación, mientras que en el adjunto puedes encontrarte con el correo de spam en sí, en formato .eml, el cual puedes descargar y abrir sin ningún problema (no des clic a enlaces, ni cargues contenidos remotos ni abras adjuntos eso sí)
Esto lo hace por pura seguridad, para evitar que tu cliente de correo ejecute código HTML malicioso o cargue imágenes espía automáticamente.
Si prefieres que el correo te llegue completo a la bandeja Junk (manteniendo su formato original, pero con las cabeceras modificadas de SpamAssassin para que Sieve lo mueva), debes cambiar la configuración global.
Abre el archivo de configuración global:
nano /etc/mail/spamassassin/local.cf
Busca la línea reportaje (o agrégala si no existe) y cámbiala a 0:
Reportaje 0
- 0: Desactivado. El correo llega íntegro, solo se modifican las cabeceras (ideal para entornos modernos).
- 1: Activado (por defecto). Empaqueta el correo en un adjunto de texto.
Reinicia el servicio para aplicar el cambio:
systemctl restart spamassassin
El filtro puede aprender que es lo bueno
El filtro bayesiano no puede solo aprender de lo malo; necesita un punto de comparación. Si SpamAssassin comete un falso positivo (marcar como spam un correo que sí querías), debes rescatarlo. Una vez que muevas manualmente ese correo de la carpeta Junk de vuelta a la Inbox (Bandeja de entrada), debes decirle a SpamAssassin que se equivocó usando –ham:
sa-learn --ham /home/usuario/Maildir/{cur,new}
Conclusiones
Los spammers son cada vez más ingeniosos para mandar spam, pero la verdad es que la mayor parte del tráfico es obsoleto. Mensajes enviados desde bots que han sido abandonados y que no se han actualizado por años, así que basta con herramientas sencillas. Aun así, SpamAssasin no es una herramienta sencilla, sino una muy poderosa que puede facilitar mucho el trabajo administrativo y de seguridad. Por supuesto, complementado con directivas de seguridad ampliamente aceptadas, como rechazar correos que no tengan DKIM válido o dominios comprobables.
Notas adicionales:
Este artículo fue corregido utilizando LanguageTools mediante un plug-in para wordpress. Estaré probándolo en adelante para ver que tal le va, pero si alguien ve algún error o incoherencia, agradecería que me lo comuniquen. Es interesante usar este sistema, pero me costó un montón que trabaje de manera no destructiva.

