26 de Noviembre, 2006

Correcciones al filtro bayesiano

Los filtros bayesianos son una herramienta muy útil a la hora de tratar el spam, como ya hemos hablado por aquí. Este tipo de programas tienen la particularidad de requerir entrenamiento inicial, y posteriores correciones porque el spam que recibimos puede ir cambiando y el filtro deber ir adaptándose a la nueva situación. Hablamos de falsos positivos y negativos hace un tiempo.

Podemos enfrentarnos al problema desde diferentes enfoques, aunque personalmente prefiero que la solución parta desde la misma aplicación de correo electrónico.

La implementación más brillante, en mi opinión, implica el uso de un servicio IMAP para recoger el correo, porque nos permite ordenar los mensajes en carpetas que se encuentran en el servidor. Si designamos carpetas con significado especial, podremos mediante un proceso periódico reclasificar los errores con los mensajes que nos encontremos allí.

Este modelo lo siguien la mayoría de los servicios de correo electrónico gratuito basado en web. Hay una carpeta spam o bulk mail, por ejemplo, donde podemos dejar los mensajes que consideramos que son correo no deseado y que el sistema no ha clasificado correctamente. Un proceso en el servidor reclasificará esos mensajes antes de borrarlos, y el filtro bayesiano mejorará gracias a estos ajustes.

Otra opción sería las clasificaciones bajo demanda, y es lo que estuve programando ayer. Es muy sencillo: se configura en el servidor un alias que apunta a un programa que se encarga de reclasificar los adjuntos en MIME tipo RFC822 (esto es: un correo electrónico como adjunto).

Esta reclasificación en mi caso, trabajando con bogofilter y bogom, es automática en base a la cabecera X-Bogosity que se encuentra en los correos ya clasificados. El programa básicamente hace una corrección moviendo el mensaje de un tipo de resultado al opuesto.

Mi propuesta es bogohelper.pl (programado en Perl :D), y es muy fácil de integrar con bogom.

Para instalarlo solo hay que copiarlo en nuestra path, por ejemplo en /usr/local/bin, y ajustar sus permisos.

Es necesario tener en nuestro sistema el módulo Email::MIME (y sus dependencias), además de contra con una instalación sana de Perl ;). En OpenBSD hay que usar cpan(1), porque el módulo no está empaquetado en los ports. Además hay que instalar p5-LWP-UserAgent-Determined para que funcione cpan, cosa que me ha llevado de cabeza un buen rato :S.

El programa tiene que ejecutarse con un usuario sin privilegios, cocretamente el mismo que corre bogom, porque el acceso a la base de datos de bogofilter debe estar restringido a este usuario. En mi caso, trabajando con sendmail, el MTA corre como root y por lo tanto los scripts se ejecutan con los privilegios adecuados para que la herramienta suplante al usuario adecuado.

Si no fuera así, como es el caso de sendmail en OpenBSD, habrá que trabajar un poco más indicando que será un ejecutable con suid.

En OpenBSD el proceso del MTA corre como el usuario daemon, así que tendríamos que hacer lo siguiente:

# chown root:daemon /usr/local/bin/bogohelper.pl
# chmod 4710 /usr/local/bin/bogohelper.pl

De esta forma el MTA podrá ejecutar el programa, aunque sea con sus permisos, y no habrá problemas para cambiar a otro usuario con los privilegios adecuados.

La configuración del fichero aliases es tan simple como añadir:

entrenador: "|/usr/local/bin/bogohelper.pl -u _milter"

Ejecutamos newaliases y listo. Se ejecutará el programa con el usuario _milter, que es el que emplea el bogom, y la dirección de correo a donde enviaremos los correos con los adjuntos a corregir será entrenador@nuestro-dominio.

Finalmente comentar que hay que tener presentes algunas consideraciones en lo que respecta a la seguridad:

  • La dirección es preferible emplearla desde redes controladas, o al menos nunca debería ser pública. Obviamente, virtualmente cualquiera puede enviar enviar correos y hacer correcciones ;).
  • El programa permite indicar una expresión regular que se aplica contra la cabecera From, y si no ajusta positivamente, no se procesa el correo. No es genial, pero puede valer a modo de contraseña.
  • Hay que ser cuidadoso con los permisos de bogohelper.pl. Los ejecutables con suid son peligrosos si no se tratan adecuadamente. Hay que prestar especial atención si tenemos usuarios con cuentas shell en esa máquina, aunque con los permisos que he propuesto no habrá ningún peligro.

Tampoco hay mucho más que contar. El script es muy sencillo y fácil de auditar, además de que no creo que tenga problemas (porque sigue el mantra KISS, claro :P). Lo he hecho para mi uso personal y ya que estamos, lo comparto. Pero ya saben ustedes eso de sin garantías ;).

Anotación por Juan J. Martínez, clasificada en: openbsd, antispam, hacks.

Los comentarios están cerrados: los comentarios se cierran automáticamente una vez pasados 30 días. Si quieres comentar algo acerca de la anotación, puedes hacerlo por e-mail.

Algunas anotaciones relacionadas: