Bogofilter: Filtre bayesià AntiSpam

Al igual que la majoria d’internautes, ja estava cansat de rebre spam (publicitat no demanada) a la meva bústia de correu electrònic i per això em vaig decidir a provar algun mètode per combatre’l. Va ser així com vaig trobar els anomenats filtres bayesians, al contrari del filtres habituals com SpamAssasin, aquests no es basen en regles predefinides que fan que un correu sigui catalogat com spam o no, la tecnica es diferent…

Els filtres bayesians el que fan es “apendre” quin mail es spam i quin no, per tant hem d’ensenyar-los nosaltres. Aquest és el primer inconvenient, durant un temps hem d’anar indicant al filtre que el correu tal és spam y que el correu pascual no ho és. En cas de que feu col·lecció de missatges amb publicitat sempre es pot dir de cop que tots aquells són spam i viceversa, si tenim correu normal que reben acumulat dons podem indicar que aquest no es spam.

El filtre aprèn tenint en compte les paraules que apareixen més sovint a correus no sol·licitats i a correus normals. Això també pot fer que si inicialment li mostrem una gran quantitat de correu normal i molt pocs d’spam, llavors a l’hora de catalogar correu futur casi sempre dirà que es tracta d’spam (també passaria lo mateix si fem lo contrari).

La implementació de filtre bayesià que he escollit després de provar uns quants ha sigut Bogofilter. Aquest em permet utilitzar-ho en conjunt amb procmail (classificador de mail entrant). Al meu ordinador baixo/envio els mails amb la combinació getmail + procmail + exim, per tant bogofilter era una solució perfecte.

Com que disposo de bastants mails normals que rebo cada dia i també d’uns quants correus spam en bústies diferents, lo primer va ser “ensenyar” a bogofilter a diferenciar-los:

bogofilter -s < mail/spam bogofilter -n < /var/mail/INBOX

La primera comanda indiquem que tots els mails d’aquesta bústia són spam i a la segona que tots són correus normals.

A més de la bústia principal amb mails normals també tinc tot un seguit de bústies independents a on es guarden els correus de les diferents llistes de correu a les que estic subscrit, aquestes no les tinc en compte ja que amb procmail les filtraré abans de passar-li el filtre antispam. Veiem la configuració de procmail (arxiu .procmailrc del directori personal de l’usuari):


# BACKUP DE LOS ULTIMOS 200 EMAILS
:0 c
/home/user/mail/backup

:0 ic: /home/user/mail/backup/.locked
| cd /home/user/mail/backup && rm -f dummy `ls -t msg.* | sed -e 1,200d`

# LISTA DE NEWSLETTER GENTOO
:0:
* ^.*gentoo-gwn@gentoo.org
/home/user/mail/gentoo-gwn

###### ANTI SPAM #######
:0fw
| bogofilter -f -p -u -e
# -f)isher, -p)assthrough -u)pdate, -l)og -e)xitcode 0 for spam and ham
# -v)erbose

:0:
* ^X-Bogosity: (Spam|Yes)
/home/user/mail/spam

:0:
* ^X-Bogosity: Unsure
/home/user/mail/spam-unsure
########################

Com es pot veure al inici sempre faig una còpia de seguretat del mail rebut per si hagués algun problema, a més només guarda els últims 200 mails, així no m’he de preocupar de anar esborrant copies de seguretat antigues.

A continuació faig la catalogació de totes les meves llistes de correu, en aquest cas només he ficat una d’exemple. Dono per suposat que el correu que compleixi aquestes regles no és spam (és lo més habitual).

Finalment afegeixo el filtre antispam, primer crido a bogofilter per que comprovi el mail i afegeixi una capçalera indicant si es spam, si esta insegur o si no es spam. A més, faig que ja s’actualitzi la base de coneixement guardant aquest tipus de mail com spam o no. A continuació fiquem en una bústia els mails que són spam, a una altra els que no esta segur i finalment amb el correu normal no fem res, es a dir, anirà a parar a la bústia predeterminada de l’usuari.

Amb el temps veurem que tindrem falsos positius (detectat spam que no és) i falsos negatius (detectat com a correu normal un mail que és spam). Això es molt habitual al principi, el filtre encara no té prou coneixement (sobretot si no teníem ja una bústia amb spam per ensenyar-li). Com que amb la configuració de procmail hem fet que la base de coneixement del filtre s’actualitzi quan cataloga el mail, resultarà que tenim 1 mail spam catalogat com correu normal o al contrari, per això haurem de desfer el canvi. Guardarem el mail en un arxiu i executàrem:


bogofilter -Ns < fals-negatiu bogofilter -Sn < fals-positiu

El primer treu de la base de coneixements un mail que es spam i ha sigut catalogat com a correu normal i el segon justament lo contrari. Així continuarà aprenent.

Personalment no fa encara molt que ho utilitzo, encara tinc algun fals-negatiu però espero que millori amb el temps. Lo bo d’aquests filtres es que no es basa en cadenes predefinides com SpamAssasin i per tant els spammers no poden adaptar-se per intentar evitar-ho.

També existeixen implementacions més senzilles d’utilitzar com la que porta Mozilla Mail o Thunder Bird. El filtre bayesià està integrat al propi client de correu.

Com apunt final, pel que el nostre correu passi per procmail…

Si utilitzem fetchmail per baixar el correu, aquest l’enviará directament al nostre servidor de mail local, en el meu cas exim. Això depen del servidor, hi ha alguns que automàticament passa el mail al procmail amb la configuració de l’usuari a qui va dirigit el mail i d’altres que s’ha despecificar, com per exemple exim que l’usuari ha de tenir al seu directori personal l’arxiu .forward amb:

|exec /usr/bin/procmail

En el cas que utilitzem getmail per baixar el correu (és el que jo utilitzo pq fetchmail reescriu capçaleres i em donava errors amb certs mails, en canvi getmail em funciona perfecte), aquest no necessita un servidor de mail local estil exim, així que a la configuració de l’usuari .getmail/getmailrc:


[default]
verbose = 0
readall = 0 # Retrieve only new messages by default
delete = 1 # Delete mail after retrieval by default
message_log = “”
timeout = 60 # TCP timeout value; increase if on a poor connection or
# slow POP3 server. getmail defaults to a 180 second timeout.
max_message_size = 2097152 #0 means no limit.
use_apop = 0 # Use APOP authentication for this account instead of cleartext PASS
postmaster = “|/usr/bin/procmail 2>&1”
port = 110
no_delivered_to = 1 # Don’t add a Delivered-To: header for this mailbox
no_received = 1 # Don’t add a Received: header for this mailbox

[NomDelCompte]
server = pop.server.es
username = “usuari”
password = “pass” # Se puede comentar esta linea y lo preguntara al ejecutar getmail
#delete = 0 # Don’t delete messages immediately after retrieval
#delete_after = 10 # Instead, delete them 10 days after first retrieving them
# No “local” directives necessary.

La part important és la de postmaster = “|/usr/bin/procmail 2>&1” que es la que envia els mails a procmail.

Això es tot, espero que ús sigui útil 🙂
Autor: marble

This entry was posted in Internet. Bookmark the permalink.

One Response to Bogofilter: Filtre bayesià AntiSpam

  1. sergi says:

    Ara m’habíes deixat amb el dubte, perquè haguès jurat que l’spamassassin si que feia servir algorismes bayesians des de fa unes quantes versions. Avui he llegit la resposta que confirma la meva teoria a la llista de bulma de part d’en Ricardo Galli. Com que és força interessant i deixa al bogofilter per sota l’spamassassin (i m’agraden aquestes lluites i discussions al món del programari lliure), posso la transcripció sencera:


    Además el spamassassin aprende muy bien solito. Al principio sólo se basa
    en sus reglas y va creando la base de datos d buenas y spams dependiendo
    de los puntos (sólo si son muy altos o muy bajos). Luego empieza a usar
    la base de datos para sus cálculos bayesianos.

    Lo mejor de todo es que desde el primer día y sin entrenamiento ya filtra
    un huevo, y no su método bayesiano no degenera tan rápidamente como el
    bogofilter, al estar “realimentado” por su motor de reglas.

    si el programari lliure no és la resposta, la pregunta és incorrecta

Leave a Reply