Problemas del spamassasin
| Actualización |
|
|
Ya se encuentra en un estado bastante estable (ya no hay cambios constantes de
formatos y opciones). Lo estoy usando hace menos de un mes, hace más de una
semana que no recibo ningún spam. Y lo más importante, no ha dado ningún
positivo en todo ese tiempo.
|
Actualizado el fichero de spams, hay más de mil.
Cuidado: Si "entrenáis" al bogofilter con esos 1000 spams, tenéis que
entrenarlo con el menos 3000 mensajes buenos (mantener la relación 1-3), sino
dará muchos falsos positivos al principio.
|
El problema fundamental con el
spamassasin es que está basado en el reconocimiento de
patrones de texto usando reglas, lo que obliga a estar continuamente
actualizando y agregando nuevas reglas para adaptarse a los cambios
que introducen los spammers en sus mensajes. Además hay
que elaborar reglas para cada lenguaje.
No sólo eso, para poder
actualizar y mejorar la detección hay que introducir nuevas
reglas, lo que hace que el proceso de análisis de cada mensaje
sea aún más lento de lo que ya es actualmente, entre
otras cosas porque está implementado en Perl y tiene que
trabajar con muchas reglas.
Y no acaba aquí, en problema que
creo que es el más grave, es que puede
dar falsos positivos. Los falsos positivos son mensajes que no
son spams, pero son considerados como tal por el filtro. Que de vez
en cuando, como así sucede, llegue un spam que haya pasado el
filtro (falso negativo), no pasa nada, pero los falsos
positivos es lo peor que puede pasar, ya que puedes perder o
dejar de leer mensajes importantes.
Me ha pasado bastante con amigos que me
escriben en catalán, y con muchos mensajes de la lista de
Bulma (las cabeceras “anti-abuse” que pone el mailman son
consideradas como cabeceras de spammers por el spamassassin). Así
que me decidí a probar otras cosas, el spamassasin aunqueme
convenció en un principio, al poco tiempo mostró sus
problemas.
Un plan para el spam
Durante un tiempo estuve investigando
que métodos había para detección de spams,
pensaba que la lógica difusa podía ser una solución,
hasta que encontré el ensayo de Paul Graham, “A
Plan for Spam”. En dicho ensayo Paul Graham opina que los
métodos basados en reglas no sirven para detectar spams, no
sólo por los problemas mencionados anteriormente, sino porque
sería muy fácil para los spammers encontrar los
trucos para saltarse las reglas de filtrados, ya
que son de dominio público y común para todas las
instalaciones.
La solución, según él
(y yo también :-) pasa por usar métodos que “aprendan”
de los mensajes que recibe cada usuario y generar su propia base de
datos de palabras. Esta base de datos sirve para calcular las
probabilidades combinadas de que un mensaje sea o no spam.
El método “bayesiano”
que propone es muy interesante, aunque
ha recibido críticas y sugerencias, ya que en éste
caso el filtro se adaptaría
automáticamente al idioma y tipos de mensajes que recibe cada
uno.
El problema fundamental de ésta
aproximación es que hay que entrenar inicialmente al
programa con un conjunto relativamente de mensajes spams y otros
válidos para que arme su base de datos inicial. A partir de
allí el programa puede aplicar los métodos bayesianos y
usar esos mismos mensajes, ya clasificados como spam o no, para
realimentar la base de datos.
Fue así que encontré una
implementación, levemente mejorada, de éste método,
el bogofilter.
Bogofilter
El bogofilter
es una implementación, muy eficiente, en C y con db2 para
almacenar las palabras y sus apariciones en mensajes programado por
Eric Raymond. Al día que estoy escribiendo ésto, el
bogofilter está en su versión 0.7.4cvs1004 y a pesar que
sufrió bastantes cambios “molestos” en los
formatos utilizados (que obligaban a regenerar la base de datos por
cada actualización), desde hace un par de semanas que no veo
cambios de éste tipo, por lo que se puede estar casi tranquilo
que no habrá trabajos “complejos” de migración
hasta su versión estable.
Funcionamiento
Bogofilter mantiene un par de bases de
datos en el directorio $HOME/.bogofilter/:
Cada una de ellas mantiene una lista de
“tokens” (palabras) junto con la cantidad de veces que
esa palabra ha aparecido en mensajes válidos o spams. Esos
números son usados para calcular la probabilidad de que el
mensaje sea un spam.
Una vez que se han calculado las
probabilidades, se usan aquellas más alejadas de la media para
combinarlas usando el Teorema de Bayes de probabilidades combinadas.
Si la probabilidad combinada es mayor que 0.9, bogofilter retorna 1,
caso contrario retorna 0.
La fiabilidad del bogofilter depende
exclusivamente de la cantidad de palabras que tenga en su base de
datos, mientras más tenga y mayor se la cantidad de
aparciciones de cada palabra en un mensaje válido o spam,
mejores serán sus resultados.
Si sólo le enseñanmos al
principio cuales son mensajes válidos, no podrá
detectar los spams. Al contrario, si sólo le
“enseñamos”
spams, considerará a muchos mensajes válidos como spams
(falsos positivos...). O sea, el aprendizaje
inicial es importantísimo, y nos ahorrará mucho
trabajo de mantenimiento de la base de datos.
En resumen, lo que hay que hacer,
además de instalar el programa (apt-get install bogofilter
:-), son los siguientes pasos:
Entrenarlo con un conjunto
relativamente grande de mensajes válidos que tengamos
almacenados.
Entrenarlo con un conjunto grande
de spams (no os preocupéis, os doy una lista de más de
700 spams).
Configurar el .procmailrc.
Seguimiento y mantenimiento de los
primeros días.
|