15 de Septiembre, 2005

Vuele con nosotros

Ayer tuve el primer percance desde que estoy usando bogofilter y bogom para filtrar el spam que se recibe en el servidor.

La cosa ha empezado tímidamente, yo nunca me hubiera imaginado hasta dónde ibamos a llegar...

(12:56:55) Pedro: oye bs cada cuanto tiempo recoge el correo de usebox?
(12:57:23) jjm: cada 10 minutos
(12:57:43) Pedro: ok
(12:57:52) Pedro: es q estoy esperando un correo importantillo

Pero el tiempo pasa... y el correo no llega. Hay que decir que no es la primera vez que este usuario sospecha que el servidor se ha tragado un correo, así que, por si acaso, él pregunta.

(13:18:41) Pedro: hum no me llega el correo
(13:18:50) jjm: déjame ver
(13:18:51) Pedro: mira a ver si en el spam hay alguno de aerlingus.com
... mirando los logs ...
(13:20:28) jjm: sip
(13:20:31) jjm: te lo ha pillado como spam
(13:20:38) Pedro: joder pos vaya gracia XD
(13:20:40) jjm: qué era?
(13:20:43) Pedro: q son mis billetes de avión!
(13:20:58) jjm: puedes hacer que los vuelvan a mandar?
(13:21:18) jjm: puedo hacer que no se filtren los correos de ese dominio

Pero aún quedaba lo peor por venir :(. La fase de negación de la realidad.

(13:24:15) Pedro: no me llega
(13:24:18) Pedro: Xd
(13:24:35) jjm: el qué no te llega?
(13:25:22) Pedro: el correo filtrado
(13:25:24) Pedro: intenta enviarmelo
(13:25:38) Pedro: q estan los datos de los billetes de avion =/
(13:25:42) jjm: a ver
(13:25:44) jjm: FILTRADO
(13:25:47) jjm: se ha rechazado
(13:25:49) jjm: ese correo ya no existe... voló
(13:25:57) Pedro: joder =/

Se podría decir que ese es el momento. Solo puedo imaginar la cara que puso Pedro, aunque nos podemos hacer una idea.

Sí, en efecto, es una putada. Las acciones BOFH inconscientes ¿cuentan? Es la primera vez que pasa desde que pusiera en marcha el sistema, y ya sabemos que si el correo fue rechazado es porque tenía forma de spam. Así que me he planteado poner medios para que esto no vuelva a pasar :(.

El caso es que uno de los atractivos de emplear un milter es que se puede dar una respuesta activa contra el spammer. Si empleamos un mailer como procmail para filtrar los mensajes, no podemos rechazar el correo en su fase de entrega porque ya se ha entregado.

La primera solución (temporal), para que Pedro reciba su correo importantillo, es cambiar la política de reject a pass, de forma que se deje pasar a todos los mensajes, incluso los identificados como spam. Luego en el cliente se clasifica atendiendo a la cabecera X-Bogosity con valores yes o no.

De esta forma perdemos la respuesta activa y no deja de ser un incordio ir borrando la carpeta con la basura, porque solo verificaremos las excepciones, que son muy raras (como ha sido este caso de Pedro).

Recordemos que bogom está diseñado para trabajar con una base de datos global para todo el sistema, lo que lo hace indicado especialmente para empresas o entidades que tienen un perfil de correo homogéneo (en este servidor, por ejemplo, no es frecuente pedir billetes de avión a empresas con nombres particulares :D). Así que no tiene sentido estudiar el spam por usuario. Dicho esto, voy a implementar dos medidas:

  • forward_spam: Esta es sencilla y ya estaba lista para la siguiente versión del milter. La propuso un usuario que quería revisar ocasionalmente el correo clasificado como spam en busca de excepciones. Las principales pegas son que requiere la política pass y que solo reenvía el mensaje, recibiendo el destinatario original su copia.
  • quarantine_mdir: Esta la estoy acabando de implementar. Siempre le viene a todo el mundo a la cabeza el formato mbox para almacenar correo, y en este caso guardar una copia del mensaje en un fichero es un problema (el milter es multi-hilo, y habría que andar con locks sobre el mbox). Yo he decidido emplear maildir. En el formato maildir cada correo se entrega en un fichero diferente dentro de un directorio, con lo que se evita el tema de los locks y se puede guardar copia del correo clasificado como spam fácilmente incluso con la política reject.

La única pega es que quarantine_mdir debe ser incompatible con body_limit (que indica qué cantidad de cuerpo de mensaje se le pasa a bogofilter para análisis -con unos KBs es suficiente-, interesante para servidores muy ocupados), pero cabe pensar que un servidor con mucho volumen de correo no querrá guardar copia del spam para buscar posibles problemas.

De esta forma, si se sospecha que se puede haber filtrado un mensaje, aún tendremos una copia del mismo que se puede recuperar.

Mientras tanto espero que Pedro pueda conseguir los datos de sus billetes y sigua volando con nosotros :).

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

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: