SPAM e spamassassin

29.01.2004 Alberto Cammozzo


E' attivo, per gli indirizzi @stat.unipd.it un programma per filtrare la posta indesiderata, comunemente chiamata SPAM.
Questo programma, spamassassin, si basa su filtri probabilistici personalizzabili, quindi permette di essere adattato secondo le esigenze personali.
Nella configurazione attiva per .stat.unipd.it, spamassassin viene attivato da un altro programma, chiamato procmail, che si occupa di consegnare la posta nelle caselle inbox degli utenti.
Come default spamassassin modifica il subject della mail considerata spam e aggiunge la stringa *****SPAM*****, ma si puo' istruire procmail in modo che la mail considerata SPAM venga archiviata automaticamente in un folder apposito, non comparendo piu' in inbox.
Si sconsiglia vivamente di far in modo che la posta marcata SPAM venga buttata automaticamente, perche' sara' impossibile verificare se il filtro, sbagliando, abbia marcato come spam una mail buona (falso positivo). Inoltre il mittente riterra' la mail come consegnata.

Come archiviare automaticamente la posta considerata SPAM da spamassassin

  1. Creare i file con i permessi giusti:
    ssh utente@lisa
    
    touch Mail/SPAM
    chmod 600 Mail/SPAM
    
  2. Modificare il file .procmailrc nella home:
    vi .procmailrc
    
    Aggiungere alla fine le righe:
    :0:
    * ^X-Spam-Status: Yes
    Mail/SPAM
    
    Fare molta attenzione nell'editare .procmailrc, perche errori possono avere conseguenze su tutta la corrispondenza in arrivo.
    Il file dovra' apparire esattamente cosi':
    :0fw: spamassassin.lock
    | /usr/bin/spamassassin
    
    :0:
    * ^X-Spam-Status: Yes
    Mail/SPAM
    
    Per comodita' il file cosi' preparato e' gia' stato approntato in /etc/skel e puo' essere copiato, a condizione che l'utente non abbia gia' modificato .procmailrc per le proprie esigenze.
In sintesi tutta l'operazione puo' essere compiuta dall'utente con questi comandi:
touch Mail/SPAM
chmod 600 Mail/SPAM
cp /etc/skel/.procmailrc-filespam .procmailrc
L'amministratore puo' effettuare la stessa operazione su richiesta dell'utente dopo aver dato il comando su - username.

Dal momento della modifica del file .procmailrc la posta marcata come spam da spamassassin verra' automaticamente inserita nel folder di posta SPAM.
Per verificare il corretto funzionamento basta inviarsi un messaggio la cui identificazione come SPAM e' certa e verificare se finisce in Mail/SPAM.

Come addestrare e personalizzare SpamAssassin

Questo si ottiene modificando il file .spamassassin/user_prefs nella home directory di ciascun utente.
Addestrare spamassassin significa tarare il filtro bayesiano in modo che si adatti allo spam e alla mail buona che effettivamente abbiamo ricevuto finora. Questa operazione dovrebbe aumentare la probabilita' di intercettare il vero spam e diminuire quella dei falsi positivi (mail buona considerata spam per errore).
ssh lisa
cd Mail
sa-learn --showdots --mbox --spam [nome mailbox piena SOLO di SPAM]
sa-learn --showdots --mbox --ham [nome mailbox piena SOLO di mail buona]
La prima operazione (quella sullo spam, con '--spam') va compiuta se spamassassin lascia passare troppo spam. Va eseguita su una mailbox piena di spam non intercettato. E' percio buoba abitudine salvare lo spam non intercettato in una mailbox apposita (diversa da 'SPAM') allo scopo di addestrare spamassassin
La seconda operazione (quella sulla mail buona, con '--ham') va fatta solo se spamcop sbaglia e genera falsi positivi.

Per personalizzare spamassassin si intende fare una di queste due operazioni:
ssh lisa
vi .spamassassin/user_prefs

# required_hits         5
# whitelist_from        someone@somewhere.com
Queste due righe possono essere decommentate (rimosso il #) e personalizzate: al posto del 5 puo' essere messo un numero piu' alto per ridurre la sensibilita' di spamassassin, o piu' basso per aumentarla.
La riga whitelist serve a inserire indirizzi di corrispondenti dai quali sicuramente non riceviamo SPAM. Decommentare la riga e aggiungere l'indirizzo buono al posto di someone@somewhere.com

Come respingere posta indesiderata al mittente in base al contenuto degli header

Postfix prevede la possibilita' di respingere i messaggi in base alla presenza di alcune stringhe in particolari campi dell'header. Il mittente ricevera' come motivazione del rifiuto Message content rejected

Dettagli della configurazione:
In /etc/postfix/main.cf e' presente la riga:

header_checks = regexp:/etc/postfix/header_checks
che indica il file ove andranno specificate, come regular expressions le stringhe che identificheranno il messaggio indesiderato.
Questo il suo contenuto ad oggi:
#SUBJECT
/^Subject: retire early.*$/ REJECT
/^Subject: Nuovo Documento Microsoft Word (3).*$/ REJECT
/^Subject: Tami thought you'd be interested in this!!!!.*$/ REJECT 
/^Subject: Got Debt? [7xkeh].*/ REJECT
/^Subject: RE: WINNER CONFIRMATION .*/ REJECT
/^Subject: Now You Can Run A Background and Asset Search!!!.*/ REJECT
/^Subject: Get Out of Debt NOW! [qcx4l].*/ REJECT
/^Subject: global exposure - we do the work pt1108.*/ REJECT
/^Subject: 10e global exposure - we do the work.*/ REJECT
/^Subject: .*agra Can Kill You! 26.*/ REJECT
/^Subject: Mens Health Manual\.\.\.\.\.\..*/ REJECT
/^Subject: Tired of paying to much for inkjets.*/ REJECT
/^Subject: 3D Java Internet Casino.*/ REJECT
/^Subject: Unreal 20138 .*/ REJECT
/^Subject: Vazna informacija! .*/ REJECT
/^Subject: A troyan Horse is on your PC.*/ REJECT
/^Subject: Attention: to all gamers.*/ REJECT
/^Subject: You are an idiot.*/ REJECT
#FROM
/^From: "Martina & Laura" / REJECT
/^From: "Gray" <@msn.com>.*$/ REJECT
/^From: "James" <@msn.com>.*$/ REJECT
/^From: mikeee1029@servicenetbest.com.*$/ REJECT 
/^From: beene12981@servicenetbest.com.*$/ REJECT
La sintassi e' semplice:
/REGEXP/ REJECT
Trattandosi di regular expression, ^ significa inzio stringa, $ fine stringa, .* e' "qualsiasi stringa", . e' "qualsiasi carattere" (compreso il punto, quindi).
Nel caso si ricevano numerosi messaggi con delle costanti nell'header, tipo Subject o From invariante, si possono respingere subito, senza appesantire la macchina con le ricerche statistiche di spamassassin.
ATTENZIONE! Un errore a questo livello puo' causare il rifiuto di tutta la posta in ingresso.
Dopo aver modificato il file puo' rendersi necessario il comando /etc/init.d/postfix reload

Come identificare i top-spammer dai log di postfix

Dal mailserver, utente root:
cd /var/log
grep reject mail.log.0 | cut -f 4 -d: | sort | uniq > rej
head rej
tail rej
fgrep -f rej mail.log.0 | grep client= | cut -f 3 -d[ | cut -f 1 -d] | sort > rejip
freq < rejip | sort -rn | head -10
Al posto di mail.log.0 usare il file di log he si intende analizzare.
Le righe head rej tail rej servono a vedere se nell'elenco degli identificativi dei messaggi respinti ci sono stringhe spurie, che vanno eliminate editando il file rej.
Il file rej dovra' contenere solo gli ID dei messaggi respinti, tipo:
 0000DAFE8840
 0002EAFE8602
 0003BAFE8818
 00043AFE85F1
 00059AFE8850
 

L'output della procedura dovrebbe darci i 10 IP dai quali sono provenuti piu' messaggi respinti: non necessariamente saranno messaggi di SPAM o virus.
Facendo grep dell'IP nel file mail.log.0 si sapra' anche per quale motivo e si potranno estrarre le porzioni di log rilevanti, da allegare eventualmente ad una mail di protesta.
Con il comando host IP e whois IP si potranno raccogliere piu' informazioni su chi sara' il destinatario della eventuale protesta.

Come identificare i top-virus-sender di log di amavis

Dal server dove gira amavis (clamd):
cd /var/lib/amavis/virusmails
for i in  *-?? ; do cat $i | head -20  | egrep "\[*.\.*.\.*.\.*.\]\)$" | cut -f 2 -d[ | cut -f 1 -d] | cut -f 1-3 -d. ; done  | sort | freq | sort -n
Per il log 'storico':
for i in  *.gz ; do zcat $i | head -20  | egrep "\[*.\.*.\.*.\.*.\]\)$" | cut -f 2 -d[ | cut -f 1 -d] | cut -f 1-3 -d. ; done  | sort | freq | sort -n
In output le reti di classe C che hanno generato piu' virus.
Possono essere filtrate dal firewall con
for i in IP IP ; do  boogie $i.0/24; done
(comando da dare sul firewall)