This is an old revision of the document!
Table of Contents
SpamAssassin
Nuova pagina di appunti dedicata a SpamAssassin, basata sull'esperienza con SpamAssassin 3.2.4 su Debian Lenny.
Si è deciso di chiamare SpamAssassin non come filtro del programma di posta (Exim), ma come filtro sulla consegna in mailbox tramite procmail(1). Questo consente una migliore personalizzazione del sistema antispam per ogni singolo utente.
Come di consueto si installa la versione daemon (più performante) spamd e il relativo client spamc.
Troubleshooting
Come verificare cosa funziona e cosa no. Grazie a spamassassin –help oppure a man spamassassin-run si scopre il comando:
spamassassin --lint -D
che visualizza tanti messaggi di debug relativi al set di regole, riportando errori di sintassi ecc.
Per testare il funzionamento del filtro su un messaggio si esegue semplicemente:
cat messaggio_spam.txt | spamc | less
È possibile avere un rapporto dettagliato dell'analisi con i punteggi ottenuti dalle singole regole con il comando:
spamassassin -t < messaggio.txt
La scansione non passa per spamd, ma lancia un'istanza di spamassassin per la singola esecuzione. La configurazione usata dovrebbe essere quella di sistema in /etc/spamassassin. Utile ad esempio per testare delle variazioni sui punteggi assegnati tramite regole inserite in /etc/spamassassin/local.cf.
Problema con URIBL
Un messaggio contenente un link blacklisted non viene intercettato dalle regole URIBL_*, scopriamo perché. Anzitutto vediamo quali test vengono effettuati:
cat messaggio_spam.txt | spamc -y AWL,BAYES_00
Hanno dato risultati solo i test Auto-whitelist e Bayesian spam probability, mancano i risultati dei test URIBL_*.
Quando i test URIBL_ danno dei risultati si ha un output di questo tipo:
cat messaggio_spam.txt | spamc -y
RDNS_NONE,SPF_PASS,URIBL_AB_SURBL,URIBL_BLACK,URIBL_JP_SURBL,
URIBL_OB_SURBL,URIBL_SBL,URIBL_SC_SURBL,URIBL_WS_SURBL
e anche un dump delle richieste DNS originate dal server può rivelare se i test vengono effettuati:
tcpdump -i eth1 -n 'port 53' ... > 206.222.12.226.53: 62184% [1au] A? 26.16.57.88.plus.bondedsender.org. (62) ... > 209.67.211.202.53: 41563% [1au] TXT? 26.16.57.88.bl.spamcop.net. (55) ... > 217.23.130.99.53: 26316% [1au] TXT? 26.16.57.88.list.dsbl.org. (54)
Invece di passare per spamc/spamd proviamo a passare direttamente per spamassassin, si scopre che in questo caso i test URIBL vengono fatti:
cat messaggio_spam.txt | spamassassin | less
Riavviando il demone spamd il problema si risolve, quindi esiste qualche condizione (insufficienza di RAM?) che avvelena il demone senza ucciderlo del tutto, rendendolo quasi del tutto inefficace.
whitelist_from
Volendo mettere alcuni mittenti in whitelist è possibile fare quanto segue:
- Aggiungere una riga a
/etc/spamassassin/local.cf, che contenga:include whitelist_from
- Creare il file
/etc/spamassassin/whitelist_fromche contiene righe del tipowhitelist_from nome@dominio.org whitelist_from *@dominio.org whitelist_from *.dominio.org
Riavviare spamassassin.
Regole personalizzate
Si possono aggiungere delle regole personalizzate direttamente in /etc/spamassassin/local.cf oppure in un file incluso da esso con la direttiva include.
Ecco una semplice regola che controlla la presenza di un determinato header Sender: ed assegna un punteggio negativo (diminuendo cioè la possibilità che sia identificarlo come SPAM):
header SENDER_GOOGLE_CALENDAR Sender =~ /calendar-notification\@google\.com/ describe SENDER_GOOGLE_CALENDAR Sender is Google Calendar score SENDER_GOOGLE_CALENDAR -2.8
Fare attenzione alla stringa dopo il segno =~, si tratta di un'espressione regolare racchiusa tra slash. Alcuni caratteri come il punto e il simbolo @ devono essere preceduti da backslash perché sono simboli speciali nelle espressioni regolari.
AutoWhitelist
È possibile impostare forzatamente un punteggio SPAM molto alto (+100) o molto basso (-100) per un particolare indirizzo email nel proprio database $HOME/.spamassassin/auto-whitelist:
spamassassin --add-addr-to-blacklist='spammer@spam.net' spamassassin --add-addr-to-whitelist='niccolo@rigacci.org'
Per togliere l'indirizzo dal database si usa:
spamassassin --remove-addr-from-whitelist='niccolo@rigacci.org'
server reached --max-children setting
Qualche volta si trova nel file di log il messaggio di warning:
Jan 21 03:13:20 spamd[8175]: prefork: server reached --max-children setting, consider raising it Jan 21 03:13:35 spamd[874]: bayes: cannot open bayes databases /home/.../.spamassassin/bayes_* R/W: lock failed: Interrupted system call Jan 21 03:13:37 spamd[8175]: prefork: server reached --max-children setting, consider raising it
Debian mette in /etc/default/spamassassin l'opzione –max-children 5 e sconsiglia di modificarla. Per capire in quali circostanze avviene il problema eseguiamo il comando:
grep "prefork: child state" /var/log/syslog | less Jan 20 16:08:28 spamd[7122]: prefork: child states: II Jan 20 16:09:31 spamd[7122]: prefork: child states: II Jan 20 16:10:45 spamd[7122]: prefork: child states: II Jan 20 16:10:50 spamd[7122]: prefork: child states: BB Jan 20 16:10:50 spamd[7122]: prefork: child states: BBB Jan 20 16:10:50 spamd[7122]: prefork: child states: BBBB Jan 20 16:10:50 spamd[7122]: prefork: child states: BBBIB Jan 20 16:10:54 spamd[7122]: prefork: child states: BBBBB Jan 20 16:10:58 spamd[7122]: prefork: child states: BBBBB Jan 20 16:11:02 spamd[7122]: prefork: child states: BBBBB Jan 20 16:11:03 spamd[7122]: prefork: child states: BBBBB Jan 20 16:11:06 spamd[7122]: prefork: child states: BBBBB Jan 20 16:11:06 spamd[7122]: prefork: child states: BBBBI Jan 20 16:11:08 spamd[7122]: prefork: child states: BBIBI Jan 20 16:11:08 spamd[7122]: prefork: child states: IBIBI Jan 20 16:11:08 spamd[7122]: prefork: child states: IBIB Jan 20 16:11:09 spamd[7122]: prefork: child states: IBII Jan 20 16:11:09 spamd[7122]: prefork: child states: IBI Jan 20 16:11:10 spamd[7122]: prefork: child states: III Jan 20 16:11:10 spamd[7122]: prefork: child states: II Jan 20 16:12:59 spamd[7122]: prefork: child states: II Jan 20 16:13:10 spamd[7122]: prefork: child states: II
Come si vede si è verificato un burst di mail durato circa 20 secondi durante il quale i 5 processi figli erano Busy ed altre richieste non sono state soddisfatte (lo stato dei child process può essere Idle, Starting, Killed o Busy).
A seconda dei casi si può aumentare il numero dei processi figli oppure renderli più veloci. Ad esempio l'accesso alle preferenze dell'utente contenute in $HOME/.spamassassin/ probabilmente non è concorrente e blocca i processi successivi. Forse spostare le preferenze in un database potrebbe migliorare le prestazioni.
