Dspam
Sumario
Enlaces y referencias
- Lugares:
- Ref: Dspam - Community Driven Antispam Filter
- La propia documentación incluída en el paquete dspam-doc.
- Conceptos básicos:
- Tim Jackson ha escrito un artículo excelente sobre análisis de contenidos de correo usando exim4 y spamassasin. Sí, no está dedicado a dspam, pero su introducción y explicaciones sobre las dos fórmulas arriba expuestas es magnífica y lo he usado mucho para aclararme conceptos y tomar decisiones.
- El libro The Exim SMTP Mail Server (Official Guide for Release 4) de Philip Hazel, que adquirí hace un tiempo y que está resultando muy útil. Eso sí, habla mucho sobre la teoría subyacente del programa y no es, por tanto, un guía de consulta rápida ni nada similar.
- Jeffrey también explica qué es dspam y cómo funciona.
- Configuración:
- Valiosísimas notas de Jason Boxma al respecto.
- Configuración con abundantes comentarios, en un lugar para preparar fragmentos de código y documentación para envío y uso en redes IRC.
- Simon McVittie tiene un tutorial para configurar un servidor de correo en Debian con Exim, Clamav y dspam.
- Entrenamiento:
- Training DSPAM with scripts especializado más bien en OS/X pero con ejemplos válidos para aprender.
- Uso y experiencias:
- Notas para usuarios de la Universidad de Rice donde les explica cómo usar dspam en la red universitaria.
- Alan cuenta cómo le ha ido con dspam.
- Colección de artículos en unixcluster.dk.
- Nachos Rule! que cuenta que algunas direcciones ya están condenadas de por vida a recibir spam.
- Para maildrop:
- Ejemplos de configuración en una lista sobre postfix.
Notas y conceptos previos
Tras un par de días dedicado al nuevo filtro antispam llego a una serie de conclusiones fundamentales para guiarme en la implantación final.
La primera es que dspam sin entrenamiento nada de nada; la segunda es que la mayor parte de las configuraciones están pensadas para usarlo después de que el spam haya entrado, y no para pararlo en el diálogo SMTP, que era a lo que yo estaba antes acostumbrado.
He preparado algunos esquemas para ayudarme a entender las diferentes posibilidades en relación con exim, teniendo además en cuenta que existen dos maneras de usarlo desde este programa:
- Completo: cada llamada a dspam invoca al programa entero que intentará tomar los datos del directorio asignado al usuario, si dispone de éste.
- Cliente: usándo el programa exterior para conectar con un programa dspam en modo servidor, para lo cual es necesaria una configuración más concreta, que no viene por defecto en el paquete Debian. También es bueno saber que existe un programa llamado dspamc que incluye sólo el código para conectar con el servidor, por lo que se puede adivinar el ahorro de recursos en el ssistema.
dspam como transporte de correo
En el esquema podemos apreciar lo siguiente:
- dspam se invoca después de los filtros greylist y clamav (y tal vez en una comprobación MIME ó algún filtro más), cuando la sesión SMTP ha finalizado y ya tienes el mensaje en tu sistema. Sí, en ese momento se puede configurar el sistema para que, si detecta que es spam, no lo envíe y se intente retornar al emisor y sólo entregue el correo en caso contrario. El problema con este enfoque es que el spammer nunca se entera de si su correo ha llegado realmente ó no; sólo sabe que nuestro servidor lo ha aceptado y puede que llegue. Ante la duda es más que posible que nos apunte en su lista de objetivos para otros ataques (una conversación al respecto en la que además se defiende el filtrado por listas grises).
- Dado que estamos en fase de despacho de correo tenemos todos los datos necesarios para personalizar el análisis en busca de spam, según las preferencias y la base de spam de cada usuario. Si se emplea como filtro existen cosas (tal y como funciona exim) que no estarán disponibles; y entre esas cosas está $local_part y $domain (ahí es nada).
- El mensaje de correo, una vez analizado, es reinyectado en exim añadiéndole un cerrojo para que no vuelva a entrar en la comprobación de spam, y pase directamente a los despachadores reales de correo del sistema.
dspam como un filtro de contenido
En este caso el esquema cambia ligeramente:
Y ahora vemos que:
- El correo es analizado durante la fase DATA de la sesión SMTP por lo que es posible rechazarlo sin más contemplaciones, y el emisor (es decir, el spammer) sabrá que no lo hemos aceptado.
- Elimina la necesidad de crear rebotes a vete tú a saber dónde del correo que hemos aceptado.
- En caso de que alguno de los análisis fallen es posible decirle al MTA que prosiga y enrute el mensaje normalemente. Algo que en la fase anterior no estamos ya en condiciones de indicar.
Ahora bien, las desventajas son prácticamente de orden operativo, como muy bien explica Craig Sanders, y son en la práctica un mayor consumo de recursos, tanto en memoria como en tiempo de proceso. ¿ Esto es importante ? Pues depende de cuál sea la política del sitio, pero si no se cuenta con la capacidad de proceso suficiente se puede dar esta situación:
- Recibimos una conexión exterior para entregarnos el correo y abrimos una sesión SMTP.
- Pasamos la fase de cabeceras que aceptamos porque no vemos nada malo.
- Entramos en la fase de datos y comenzamos el proceso de filtrado efectuando llamadas a programas externos como los antivirus ó el filtro de spam.
- Nuestra CPU se ralentiza y el uso de memoria comienza a crecer, mientras mantenemos la conexión y la sesión abierta. Hay que recordar que el número de conexiones a un servidor de correo suele ser finito, y más en máquinas con poca capacidad.
- Aunque el RFC 2821 determina que se pueden esperar hasta 10 minutos dentro de la sesión para tener una confirmación (positiva ó negativa) de entrega de correo, es habitual que los servidores no esperen tanto, piensen que estás ocupado y corten la conexión para volver a intentarlo más tarde ... y así lo harán prácticamente todos por lo que, dado que no puedes atenderlos debido a tu carga de trabajo, te aseguras otra avalancha sin nada productivo para un poco más tarde.
Y aunque este caso sea de los peores escenarios, sin haber hecho nada realmente malo, no estarás entregando correo y eso es precisamente lo que quizás quieras evitar. :-)
Correspondencia entre mensaje y receptor
Este es un aspecto en el que muchas de las fuentes consultadas hacen incapié; no existe la seguridad de que la correspondencia entre mensaje y receptor sea uno a uno. Es decir, una dirección de correo de destino, cuando llega a un servidor, puede convertirse en muchas, tanto locales como foráneas. Así pues, pensar que en la fase de filtrado podemos tener esa información disponible es, cuando menos, ingenuo.
Conclusiones
Y estas son las conclusiones a las que he llegado:
- Mi interés principal es el despacho de correo en el servidor por lo que el uso del filtro será tras aceptar el mensaje, y no como filtro de contenido.
- No queremos perder correo en ningún caso, y dado que no es posible un filtro perfecto, y menos con dspam ya que tenemos que entrenarle, voy a optar por etiquetar el correo y despacharlo a los usuarios.
Y estoy rumiando estas otras ideas:
- Es muy posible que mantenga el filtro de listas grises si consigo un control más fino sobre su funcionamiento, y le incorporo algún tipo de capacidad de autowhitelist para las direcciones a las que uno de mis usuarios acaba de enviar correo (que viene a ser una consecuencia lógica, si envias un mensaje a alguien y esperas algún tipo de respuesta, lo lógico es que aparezca como fiable desde ese momento).
- Mantendré seguramente los dos sistemas de entrenamiento para el filtro: envío a direcciones especiales tipo spam-usuario@taquiones.net y una búsqueda regular en carpetas especiales.
Instalación y configuración
Los paquetes usados en la instalación (en un sistema Debian) han sido los siguientes: dspam, dspam-doc, dspam-webfronted, libdspam7 y libdspam7-drv-mysql.
La instalación no presenta problema alguno, y se conserva la buena costumbre de no arrancar el demonio hasta que el administrador no lo configure y así lo indique en su correspondiente archivo /etc/default/dspam.
La configuración, que reside en el archivo /etc/dspam/dspam.conf principalmente, podemos dividirla en varias áreas:
Almacenamiento y rutas de acceso
Estas son las opciones correspondientes:
Home /var/spool/dspam StorageDriver /usr/lib/dspam/libhash_drv.so
Lo intenté con el controlador para SQLite3 pero no funcionaba correctamente en modo demonio, porque al parecer esta versión no soporta el uso de hilos (threads) y daba insistentemente un error de library routine called out of sequence.
Posteriormente lo pasaré a PostgreSQL, cuando me decida a instalarlo en la máquina, pero por el momento tiene que ser así.
Los siguientes son parámetros relacionados con los archivos hash que usa para almacenar datos sobre spam
HashRecMax 98317 HashAutoExtend on HashMaxExtents 0 HashExtentSize 49157 HashMaxSeek 100 HashConnectionCache 10
y de los que sé que al menos es necesario HashAutoExtend, porque los archivos se llenan con una rapidez pasmosa y puede darse el caso de empezar a ver registros de error como este
May 22 15:04:10 daga dspam[19728]: hash table /var/spool/dspam/data/local/victor/victor.css full
Modo cliente/servidor
He elegido las siguientes opciones:
ServerMode dspam ServerPort 24 ServerDomainSocketPath "/var/run/dspam/dspam.sock" ServerPass.Relay1 "XXXX" ClientHost "/var/run/dspam/dspam.sock" ClientPort 24 ClientIdent "XXXX@Relay1"
porque de momento no tengo intención de usar la capadidad LMTP de dspam y creo que esto es suficiente.
Parámetros y algoritmos de análisis
No he querido introducir más cambios que los recomendados en casi todos los ejemplos que he podido ver por las mismas razones que antes, por desconocimiento.
TrainingMode teft Feature chained Feature tb=4 Feature whitelist Feature noise Algorithm graham burton PValue graham
He querido dejar estas preferencias activas
Preference "spamAction=tag" Preference "spamSubject=SPAM" Preference "signatureLocation=headers" Preference "showFactors=on"
que consiguen que el correo sea marcado y no puesto en cuarentena, que sean las cabeceras del mensaje las modificadas y no el cuerpo, y que en ellas se expliquen los motivos por los que se ha considerado spam (ó no).
Y las opciones que los usuarios pueden cambiar según sus preferencias individuales:
AllowOverride trainingMode AllowOverride spamAction spamSubject AllowOverride statisticalSedation AllowOverride enableBNR AllowOverride enableWhitelist AllowOverride signatureLocation AllowOverride showFactors AllowOverride optIn optOut AllowOverride whitelistThreshold
Despacho de correo
En este caso la opción
TrustedDeliveryAgent "/usr/sbin/exim -oMr spam-scanned "
me permite cortocircuitar el enrutado de correo como mostraré más adelante.
Varios
Estas son otras opciones que dejo para explicar también más adelante:
Notifications on PurgeSignatures 14 PurgeNeutral 30 PurgeUnused 60 PurgeHapaxes 15 PurgeHits1S 10 PurgeHits1I 10 LocalMX 127.0.0.1 SystemLog on UserLog on Opt out Include /etc/dspam/dspam.d/
siendo la última línea la que me permite separar la configuración en fragmentos más manejables.
Además, la línea Opt determina que todos los usuarios pasarán por el filtrado a menos que tengan un archivo concreto llamado 'usuario.nodspam' en el directorio /var/spool/dspam/opt-out/.
Integración con exim4
Para la integración de dspam en exim4 he optado, como he dicho, por convertirlo en un despachador, para lo que necesito seguir algunos pasos un tanto extraños inicialmente, pero con sentido al final.
Lo primero es crear un enrutador llamado spamscan con el siguiente aspecto:
spamscan: driver = accept no_verify condition = "${if and \ {{!eq {$received_protocol}{spam-scanned}} \ {!eq {$received_protocol}{local}} } \ {1}{0}}" transport = spamcheck require_files = /var/spool/dspam:+/usr/bin headers_add = "X-DSPAM-Check: by $primary_hostname on $tod_full"
del que cabe resaltar los siguiente:
- Sólo actúa sobre el correo si éste no tiene un protocolo de recepción local (no exterior vía red) ni tiene un protocolo falso denominado spam-scanned.
- En caso de cumplir la condición añade una cabecera al mensaje con la fecha y la máquina que lo analiza.
- Envía el correo al transporte spamcheck
Este enrutador está situado en el nivel 550 (que puede variar de instalación a instalación), pero que en la mía es necesario porque debe aparecer después de los enrutados de alias virtuales, alias del sistema y hubuser que sólo se usa en configuraciones de tipo servidor satélite pero que me he preferido respetar allí.
Ojo con esto, porque el orden es muy importante dado que queremos que se analice cada correo con respecto a las preferencias de usuarios finales en el sistema.
Después he creado un transporte llamado spamcheck de esta forma:
spamcheck: driver = pipe command = "/usr/bin/dspamc --mode=teft --deliver=innocent,spam --user $local_part -- -bm %u" current_directory = "/var/spool/dspam" user = dspam group = dspam home_directory = "/var/spool/dspam" log_output message_prefix = message_suffix = return_fail_output = true return_path_add = no
el cual, a menos que tenga un error grave, llama al programa externo dspamc (un cliente ligero de dspam) y le indica que analice el correo, lo marque como spam sí ó no y lo despache al usuario correspondiente según la variable $local_part, que en esta fase está completamente identificada.
Además al final de todo le proporcionamos parámetros extra para que se los pase al despachador final. Este, como hemos visto más arriba en la configuración del demonio, es exim y la llamada final quedaría como sigue:
/usr/sbin/exim -oMr spam-scanned -bm %u
siendo %u reemplazada por el nombre del usuario final.
Dado que utilizamos el parámetro -oMr para definir el protocolo de entrada como spam-scanned exim4 cortocircuitará el enrutador spamscan y pasará a los siguientes; estos en mi sistema son userforward, procmail, maildrop y local_user.
Hay un par de enrutadores y de transportes más destinados a crear un mecanismo para entrenar a dspam mediante envío de mensajes y sobre los que hablaré más tarde.
Por ahora tengo este esquema:
y este otro desde la perspectiva de los enrutadores y los transportes:
Puesta en marcha
Ponerlo en marcha sólo ha requerido lanzar el demonio dspam mediante herramientas estándar Debian y lanzar el correo a continuación:
# /etc/init.d/dspam start # /etc/init.d/exim4 start
Disposiciones globales
Utilizando el programa maildrop para el despacho final de correo a los usuarios, se me ha ocurrido que es muy necesario que todos ellos compartan las mismas reglas de filtrado, y así he visto que el programa, en modo despacho de correo individual que es como lo llaman desde exim, lee primero el archivo /etc/maildroprc y luego el archivo de usuario en $HOME/.mailfilter.
Así pues he incluído estos párrafos en dicho archivo global
DEFAULT="$HOME/Maildir" if (/X-DSPAM-Result:.*Spam/:h) { to "$DEFAULT/.Spam" }
de manera que todo aquél archivo que incluya un resultado positivo como spam (mirando una cabecera especial), vaya a parar a la carpeta correspondiente en cada uno.
La creación de la carpeta, eso sí, la he tenido que hacer a mano, aunque siempre se podría añadir lo siguiente para automatizarlo:
SPAM=$DEFAULT/.Spam `test -d $SPAM` if ($RETURNCODE != 0) { `maildirmake $SPAM` }
Mantenimiento
Las tareas de mantenimiento de dspam se circunscriben al mantenimiento de la base de datos de tokens de los usuarios, siendo las tareas principales las siguientes:
Limpiar tokens no utilizados
La siguiente orden limpiará la base de datos del usuario victor, borrando aquellos tokens cuya probabilidad esté entre 0,35 y 0,65 (de ser spam se entiende).
# dspam_clean -p0 victor dspam_clean starting PROCESSING USER: victor Processing sigs; age: 14 Processing probabilities; age: 0 Processing unused; any: 60 quota: 15 nospam: 10 onehit: 10 #
Borrar tokens caducos
Para eliminar aquellos tokens no utilizados durante un periodo concreto de tiempo se puede usar:
# dspam_clean -s victor dspam_clean starting PROCESSING USER: victor Processing sigs; age: 14 Processing probabilities; age: 30 Processing unused; any: 60 quota: 15 nospam: 10 onehit: 10
Usos y costumbres
Entrenando el filtro
Como no tenemos otra, es necesario entrenar a dspam y enseñarle qué es correo y qué es basura, y para ello tenemos varias posibilidades:
- Establecemos unas carpetas en cada cuenta de correo que guarden lo que creemos que es spam y lo que creemos que no, y dejamos que dspam las explore a su manera y tiempo y aprenda de ello.
- Envíamos copias del correo a unas cuentas especiales con el mismo propósito, pero sabiendo que el aprendizaje es tan inmediato como el despacho del correo.
Creo que podemos tener las dos cosas funcionando en paralelo perfectamente, con el añadido de disponer de una base de datos de spam global para el casi seguro caso de que los usuarios ignoren tus recomendaciones y te toque a tí mantenerla.
Agente de filtrado
/usr/bin/dspamc --class=innocent --source=error --stdout
El programa dspamc es el cliente (agente en la jerga del programa) que sirve como pasarela entre el servidor de correo y el sistema de filtrado. Tiene muchas opciones, pero me centro en este caso en las que sirve para entrenar al filtro.
Usando direcciones de correo especiales
Todos los usuarios del sitio tiene ya reconocidas unas direcciones especiales para entrenar al filtro de spam. Estas direcciones se forman con un prefijo y el nombre de la cuenta de correo del usuario.
- 'spam-' es el prefijo escogido para indicar que el filtro debe aprender que el mensaje que llega a ella es basura.
- 'nospam-' es el prefijo para lo contrario. Un mensaje recibido en esa dirección instruye al filtro para que aprenda lo que es un correo válido y, dado que quizás el mensaje se ha modificado nos lo reenvía para posterior archivo.
Usando carpetas especiales
Vamos a crear la misma infraestructura para todos los usuarios del sitio, y situaremos las siguientes carpetas bajo su buzón de entrada:
- Spam es donde se guardará aquél correo que sea marcado como correo basura por el filtro. En ella aparecen las siguientes carpetas:
- EstoEsSpam es el lugar al que moveremos ó copiaremos mensajes que sabemos que son spam y en donde el filtro aprenderá a reconocerlo. De los mensajes que aquí guardemos no recibiremos copia.
- NoEsSpam es el lugar al que copiaremos mensajes que sabemos que no son spam y creemos que el filtro se ha equivocado. Él aprenderá en este sitio qué mensajes consideramos válidos y nos enviará una copia una vez los tenga.
Un trabajo ejecutado regularmente recorre estas carpetas y usa su contenido para entrenar al filtro, borrando después su contenido.
Estadísticas
Existe un programa llamado dspam_stats que proporciona información sobre la efectividad del filtro desde el primer momento ó desde la última llamada al mismo.
La información que muestra es la siguiente:
victor: TP True Positives: 0 TN True Negatives: 3889 FP False Positives: 15046 FN False Negatives: 1769 SC Spam Corpusfed: 192 NC Nonspam Corpusfed: 0 TL Training Left: 0 SHR Spam Hit Rate 0.00% HSR Ham Strike Rate: 79.46% OCA Overall Accuracy: 18.78%
Y cada uno de los valores proporcionan pistas para saber qué está pasando:
- TP True Positives
- Esta cifra es el número total de mensajes clasificados como spam.
- TN True Negatives
- Esta cifra es el númeor total de mensajes clasificados como ham.
- FP False Positives
- Son los mensajes válidos, pero que han sido marcados equivocadamente como spam.
- FN False Negatives
- Son los mensajes no válidos (spam), pero que han sido marcados equivocadamente como ham.
- SC Spam Corpusfed
- Total de mensajes spam que han sido incorporados al filtro como corpus.
- NC Nonspam Corpusfed
- Idem pero para los mensajes ham.
- TL Training Left
- Número de mensajes que faltan para que el filtro finalice el proceso de aprendizaje inicial (por debajo de 2.500). Se le resta a esta cifra la suma de los mensajes que el filtro ha clasificado como ham (innocent_classified) más la de los mensajes que se le ha enseñado (innocent_learned).
- SHR Spam Hit Rate
- Este es el ratio de aciertos del filtro en cuando a clasificación de spam. Se obtiene con la siguiente fórmula
( 100.00 - ( spam_misclassified / all_spam ) * 100.00 )
siendo spam_misclassified el total de correos marcados erróneamente como spam y all_spam el número total de mensajes marcados como spam. - HSR Ham Strike Rate
- Igual que el anterior pero referido a los errores al clasificar mensajes --ham-- como --spam--; en este caso las variables son:
- innocent_classified
- all_innocent
- OCA Overall Accuracy
- Este es el indicador de precisión total, basado en la relación entre correos marcados como ham y la de marcados como spam.
Compartiendo información entre usuarios de dspam
dspam dispone de un mecanismo que permite a los usuarios compartir información acerca de qué es spam y que no, y que va a venirme muy bien dada la falta de interés de los usuarios por colaborar en el entrenamiento del filtro.
Este mecanismo son los grupos de usuarios de los que existen varios tipos en función del tipo de compartición de datos y necesidades de filtrado.
Permiten a usuarios con una dirección de comportamiento similar compartir un mismo diccionario mientras que mantienen buzones de cuarentena separados.
- Pros:
- El aprendizaje es rápido.
- Comparten un único alias para el spam.
- Utilizando el tipo MANAGED es posible compartir un buzón de cuarentena controlable por el administrador de grupos.
- Contras:
- La dirección de correo tiene que tener un comportamiento similar porque en caso contrario el nivel de aciertos del filtro será muy pobre.
- Si se comparte un buzón de cuarentena el administrador podría tener accesos a los correos personales que resultansen falsos positivos.
Inoculation
Este tipo de grupo permite que los usuarios tengan sus propios diccionarios de spam y se inocularán unos a otros automáticamente cuando reenvíen a sus alias de spam.
- Pros:
- Las direcciones de correo pueden tener comportamientos dispares puesto que los diccionarios son independientes.
- Contras:
- Un usuario no puede ser inmediatamente añadido a un grupo de este tipo, sino que es necesario que termine el periodo de adiestramiento de su filtro, porque en caso contrario acarrearía a los demás falsos positivos.
- Tampoco un usuario puede pertenecer a un grupo de este tipo y a un grupo shared al mismo tiempo.
Classification
En este tipo de grupo los usuarios forman parte de una red de resultados. Si dspam no está seguro sobre la clasificación de un correo comenzará un turno de consultas a los demás usuarios del grupo; si uno de ellos afirma que el mensaje es spam éste se marcará como tal.
Aviso: Un usuario puede ser miembro de un grupo tipo innoculation y classification al mismo tiempo, pero no puede pertenecer a un grupo classification y shared a la vez.
Global
Un grupo de este tipo permite a dspam proporcionarles un diccionario inicial, al estilo del filtrado genérico de spamassassin, a los nuevos usuarios hasta que ellos tengan uno adaptado a sus necesidades.
Cuando se crea un grupo de este tipo los usuarios que tengan menos de 1000 mensajes inocentes, menos de 250 mensajes spam ó si su filtro duda acerca de un mensaje consultará el diccionario global para que le enseñe.
Advertencia: el modo de entrenamiento en las preferencias de usuario globales debe ser cambiado a TOE (Train On Error) para evitar que las herramientas administrativas purgen los registros a los 90 días.
Merged
Estos grupos se asemejan a los de tipo global en que comparten el diccionario de un usuario global, al que se considera el antecesor del grupo.
La diferencia estriba en que los diccionarios son mezclados en tiempo de ejecución, sin necesidad de conmutar entre uno y otro, lo que también permite tratar a la base de datos del grupo como un ente único; de esta forma el aprendizaje es más rápido que los otros tipos, con el inconveniente de tener cuidado con la actualización del diccionario, puesto que afecta inmediatamente a todos los demás.
Un ejemplo para el token Viagra es el siguiente:
Fuente de datos | Puntuación para SPAM | Puntuación para inocente |
---|---|---|
Grupo | 10 | 0 |
Usuario | 5 | 15 |
El resultado de la mezcla anterior será de 15 puntos para SPAM y 15 para Inocente, por lo que la probabilidad se situará en el 50%. Por separado para el grupo sería spam con certeza, mientras que no para el usuario.
Definiendo grupos en dspam
Para definir un grupo de usuarios se usa un archivo llamado group en el directorio personal de dspam, que puede ser /var/dspam ó /var/spool/dspam dependiendo de la instalación.
El formato del fichero es muy simple, un registro por línea y los campos están separados por dos puntos; cada registro define un grupo, su tipo y los usuarios que a él pertenecen:
group1:shared:user1,user2,user3 group2:inoculation:user4,user5,user6
En el caso de los grupos de tipo global ó merge para designar a un usuario como antecesor, maestro ó guía de un grupo se prefija su nombre con un asterisco (*)
global:classification:*maestroarmero
En el caso de los grupos merged el nombre del grupo representa el nombre del usuario global con el cual mezclar a todos los demás.
grupo_mezclado:merged:* grupo_mezclado:merged:usuario1,usuario2,enesimo
dspam envenenado
Tras un periodo de uso de uno de mis programas (no suficientemente probado) he llegado a envenenar por completo mi base de datos de spam, de tal manera que a día de hoy ya no reconoce prácticamente nada como spam y tengo un buzón de entrada que da gusto verlo ;-)
La solución propuesta en la documentación de dspam es bastante clara; el filtro se debe educar de manera equilibrada entre spam y ham porque en caso contrario los resultados son tendenciosos. Como última instancia sugieren que se borre la base de datos y se reeduque el filtro con material fresco, y eso es lo que me temo que voy a tener que hacer, puesto que un vistazo a mis estadísticas muestran
# dspam_stats -H victor victor: TP True Positives: 0 TN True Negatives: 3880 FP False Positives: 15046 FN False Negatives: 1769 SC Spam Corpusfed: 192 NC Nonspam Corpusfed: 0 TL Training Left: 0 SHR Spam Hit Rate 0.00% HSR Ham Strike Rate: 79.50% OCA Overall Accuracy: 18.75%
que ahora mismo el filtro tiene muy poca fiabilidad. Se puede consultar el apartado correspondiente para entender mejor la información mostrada.
Preparando un corpus
Existe una utilidad llamada dspam_train que utiliza un par de buzones de tipo --maildir-- para entrenar el filtro. Como a primera vista me parece cómodo voy a crear dos carpetas en mi buzón llamadas CorpusHam y CorpusSpam, y voy a copiar en ellas un buen número de mensajes en español e inglés, intentando ser lo más ecuánime posible.
Eliminando la base de datos
Ahora, por las bravas, voy a eliminar mi base de datos de spam para empezar de nuevo:
# cd /var/spool/dspam # cd data/local # rm -rf victor
Eso sí, el servicio de correo ha sido detenido para no chocar con él en el siguiente paso.
Educando al filtro
# cd /home/victor # dspam_train victor Maildir/.Spam.CorpusSpam/cur Maildir/.Spam.CorpusHam/cur Taking Snapshot... victor TP: 39 TN: 47 FP: 0 FN: 8 SC: 0 NC: 0 Training Maildir/.Spam.CorpusHam/cur/ / Maildir/.Spam.CorpusSpam/cur corpora... [test: nonspam] 1184314160.P22358Q22M860661.daga result: PASS [test: spam ] 1184314064.P19928Q33.daga.taquio result: PASS ... ... ... [test: nonspam] 1184314160.P22358Q3M402099.daga. result: PASS [test: spam ] 1184314064.P19928Q31.daga.taquio result: PASS TRAINING COMPLETE Training Snapshot: victor TP: 695 TN: 513 FP: 0 FN: 4 SC: 0 NC: 0 SHR: 99.43% HSR: 0.00% OCA: 99.67% Overall Statistics: victor TP: 734 TN: 560 FP: 0 FN: 12 SC: 0 NC: 0 SHR: 98.39% HSR: 0.00% OCA: 99.08% #
y ahora le echamos un vistazo a las estadísticas del usuario
# dspam_stats -H victor victor: TP True Positives: 734 TN True Negatives: 560 FP False Positives: 0 FN False Negatives: 12 SC Spam Corpusfed: 0 NC Nonspam Corpusfed: 0 TL Training Left: 1940 SHR Spam Hit Rate 98.39% HSR Ham Strike Rate: 0.00% OCA Overall Accuracy: 99.08%
y vamos a comprobar si con algunos mensajes que conocemos el filtro tiene aciertos o no, aunque sabemos que es muy pronto para ello; según los autores el número de mensajes tiene que superar la cifra de 2500.
$ dspam --stdout --classify < ruta_al_mensaje_de_spam X-DSPAM-Result: victor; result="Spam"; class="Spam"; probability=1.0000; confidence=0.68; signature=46972193199353588779037
Lo que viene a decirnos que sí, que está funcionando por el momento. Veremos qué ocurre después, cuando llegue el correo real.