venerdì 14 marzo 2008

Pythonfilter: antispam e antivirus per Courier-mta

Il server di posta Courier-mta è uno dei miei preferiti da tempo. Ne ho alcune installazioni funzionanti da qualche anno e non ho mai avuto problemi o strane sorprese. Trovo la configurazione di tutti i servizi relativamente facile, e apprezzo la sua spartanissima interfaccia web (opzionale) che rende ancora più semplice la configurazione.

Per una delle macchine su cui gira Courier (un vecchio server Debian che passando per vari aggiornamenti adesso è Etch) ero alla ricerca di un sistema per implementare le greylist. Per chi non lo sapesse il sistema delle greylist si basa su un semplicissimo dato di fatto: la maggior parte degli spammatori professionisti usano software appositamente realizzati che, al contrario dei server di posta convenzionali, prevedono un solo tentativo di invio per ogni messaggio. Se il primo invio, per qualsiasi motivo, non avviene correttamente il messaggio non verrà più inviato. Le greylist sfruttano questa peculiarità dei messaggi di spam. Semplificando molto, funzionano restituendo un errore temporaneo ai messaggi provenienti da mittenti sconosciuti. Se il messaggio proviene da un server normale, pochi minuti dopo verrà inviato nuovamente, il mittente finirà in whitelist (non verrà più filtrato) ed il messaggio sarà correttamente processato. Se invece il messaggio proveniva da uno spammatore, semplicemente non arriverà mai più.

La prima volta che ho sentito parlare di greylist e che ho provato a utilizzarle (credo nel 2004, usando l'ottimo ASSP) ho osservato che circa il 90% delle mail non venivano inviate una seconda volta. Decisamente un bel lavoro in meno per il server di posta e per eventuali altri filtri antivirus o antispam!! E da allora la situazione non è cambiata molto, probabilmente perchè la gestione delle code di invio risulta totalmente antieconomica per l'invio di grossi volumi di spam. Ci sono purtroppo alcuni (pochi per fortuna) server normali mal configurati che non effettuano un secondo invio, ma sono regolarmente segnalati in apposite liste disponibili su internet. In tutte le implementazioni di greylist che conosco esiste la possibilità di inserire i loro indirizzi ip manualmente o in automatico tra quelli da non filtrare.

Sul vecchio server Debian il sistema antispam (spamprobe, con filtraggio individuale per ogni utente), pur funzionando piuttosto bene come percentuale di identificazione, era ormai costretto a classificare un numero enorme di messaggi, ed i falsi negativi, pur essendo una percentuale esigua rispetto al volume di spam ricevuto, cominciavano ad essere in numero tale da rappresentare un vero fastidio per gli utenti. Il primo effetto è stato quello che gli utenti talvolta, invece di classificare correttamente gli spam nell'apposita cartella, li cancellavano direttamente non permettendo al database dell'antispam di aggiornarsi correttamente. Il risultato finale è stato che il filtro Bayesiano di alcuni utenti negli ultimi tempi, invece di imparare a riconoscere correttamente nuovi tipi di spam perchè segnalati dall'utente medesimo, perdeva sempre più colpi. Ho pensato quindi di "aiutarlo" filtrando tutti i messaggi attraverso il sistema delle greylist. Ma per vari motivi non volevo mettere "davanti" al server di posta un proxy filtrante sul modello di ASSP, volevo qualcosa di semplice che si integrasse con courier ed il suo sistema di filtri.

Così mi sono imbattuto in courier-pythonfilter (o semplicemente pythonfilter) e ho deciso di provarlo. Pythonfilter è un filtro creato per Courier col quale si possono attivare diversi moduli che ampliano le funzionalità del server. Ad esempio, oltre alla funzionalità che stavo cercando - le greylist - sono presenti i moduli per utilizzare Clamav e SpamAssassin.

L'installazione è molto semplice. Innanzitutto ci si assicuri di avere installato (su Debian e derivati) il pacchetto python-gdbm. Se si desidera utilizzare anche il filtraggio antivirus con clamav va installato anche python-clamav. python-spf va installato se si desidera usare uno dei moduli che utilizzano il protocollo spf.

Si scarica l'ultima versione di pythonfilter, attualmente courier-pythonfilter-1.0.tar.gz. Si decompime usando tar zxf courier-pythonfilter-1.0.tar.gz. Si entra nella directory courier-pythonfilter-1.0 e si installa digitando questi comandi (da console, come root):

python setup.py install

mkdir /var/state/pythonfilter

chown daemon:daemon /var/state/pythonfilter

ln -s /usr/bin/pythonfilter /usr/lib/courier/filters/

I file di configurazione sono due:

/etc/pythonfilter.conf contiene la lista dei moduli da attivare (di default sono tutti commentati) e /etc/pythonfilter-modules.conf, che contiene le configurazioni particolari per ogni modulo (anche questo tutto commentato poichè i valori di default sono già accettabili).

Abilitati i moduli che si ritengono utili si digita semplicemente:

filterctl start pythonfilter

Tutto questo senza riavviare nessun servizio :-)

Attualmente ho abilitato i moduli noduplicates (verifica tra gli alias che lo stesso destinatario non sia presente più volte negli header di un messaggio), clamav (che a questo punto sostituisce clamcour), auto_whitelist (esamina i messaggi inviati da utenti autenticati e mette automaticamente in whitelist i destinatari), whitelist_relayclients (non filtra i messaggi che provengono da macchine autorizzate al relay), whitelist_auth (mette in whitelist gli utenti autenticati), whitelist_block (metti in whitelist gli indirizzi che hanno un campo BLOCK libero in smtpaccess.dat - vedi "man makesmtpaccess"), greylist, ratelimit (blocca temporaneamente i server da cui provengono troppi messaggi per unità di tempo), whitelist_dnswl (consulta una lista pubblica di mail server ufficiali e mette in whitelist il mittente se corrisponde), whitelist_spf (mette in whitelist il mittente se il controllo del record spf va a buon fine).

Per scaricare una lista dei server che mal digeriscono le greylist e formattarla per l'uso con courier si lancia questo comando:

wget -O - 'http://cvs.puremagic.com/viewcvs/*checkout*/greylisting/schema/whitelist_ip.txt?rev=1.16' \

| grep '^[[:digit:]]' | sed -e 's/[[:blank:]].*\|$/\tallow,BLOCK/' \

> /etc/courier/smtpaccess/nogreylisting

seguito da:

makesmtpaccess

Però attenzione che se già esiste un file nella directory /etc/courier/smtpaccess sono possibili duplicati e il comando "makesmtpaccess" restituirà un errore di questo genere: "Cannot store record for 127.0.0.1 - duplicate or out of disk space." Occorre rimuovere i duplicati da /etc/courier/smtpaccess/nogreylisting (sono generalmente l'indirizzo di loopback - 127.0.0.1 - e altri indirizzi di classe privata ad essere già presenti in altro file) e rilanciare il comando "makesmtpaccess". La lista di cui sopra comunque NON contiene alcuni server italiani mal configurati che vanno quindi aggiunti a mano, tra cui i server di Alice che hanno il brutto vizio di perdersi le mail senza avvisare nessuno se la prima trasmissione non è andata a buon fine. Ovviamente questo potrebbe creare seri problemi agli utenti. Per chi fosse interessato a provare questo meccanismo ho preparato il file smtp_list_it che contiene molti tra i principali server smtp italiani (non necessariamente bacati), già formattata per essere inserita in /etc/courier/smtpaccess assieme alla lista di cui sopra.

Una volta aggiornate le liste e ricaricate in courier usando makesmtpaccess non è necessario riavviare o ricaricare pythonfilter.

Nessun commento:

Posta un commento