Script e cronjob per il sistema di learning e reporting di Spamassassin

20 giugno 2021 Roberto Puzzanghera0 commenti

Ora che abbiamo preparato i filtri antispam dobbiamo addestrare il nostro sistema bayesiano e inviare i report a Razor, Pyzor e Spamcop.

La cosa più ovvia che può venirci in mente di fare a questo punto è forse quella di lanciare sa_learn e spamassassin --report uno dopo l'altro al click sul bottone "Marca come Spam" della webmail Roundcube (vedere i driver cmd_learn e multi_driver del plugin markasjunk), ma questa scelta ha alcuni svantaggi importanti:

  • il processo di addestramento, la conseguente sincronizzazione del journal e la connessione ai vari network per il reporting può richiedere anche una decina di secondi, un tempo che i nostri utenti non sono disposti ad attendere.
  • cosa anche più grave, quando essi cliccano sul bottone "Marca come Spam" non è sempre detto che si tratti di un vero messaggo di posta indesiderata. Prendiamo ad esempio il classico caso delle newsletter a cui si sono regolarmente iscritti e che non vogliono più leggere, e che decidono di eliminare etichettandole come spamming anzichè inoltrare una regolare richiesta di cancellazione.

E' qundi più corretto eseguire questi due compiti durante la notte per mezzo di un cronjob (primo problema risolto), processando i soli messaggi di vero spam/ham che l'utente ha consapevolmente copiato in una cartella apposita (secondo problema).

Creare le "Teach" mailbox

Quando abbiamo configurato dovecot abbiamo preparato il codice per la creazione automatica delle mailbox TeachSpam e TeachNotSpam come figlie di Junk. Se questa è una nuova installazione o se si è configurato dovecot un po' di tempo fa controllare che si sia effettivamente configurato il file 15-mailboxes.conf di dovecot come segue:

 mailbox "Junk.TeachSpam" { 
   auto = subscribe 
   autoexpunge = 5d 
 } 
 mailbox "Junk.TeachNotSpam" { 
   auto = subscribe 
   autoexpunge = 30d 
 }

Impostare il cronjob

Ora scaricare il mio script

cd /usr/local/bin
wget https://notes.sagredo.eu/files/qmail/sa_cron.sh
chmod +x sa_cron.sh

e creare un cronjob che parta tutte le notti, per esempio

45 2 * * * /usr/local/bin/sa_cron.sh >> /var/log/cron

Se si lancia lo script senza passargli degli argomenti, esso eseguirà il lavoro per tutti gli utenti che hanno le mailbox .Junk.TeachSpam e .Junk.TeachNotSpam nelle loro Maildir.

Se invece si vuole testarlo per un singolo utente sarà sufficiente lanciarlo in questo modo:

sa_cron.sh username@domain.net

Modificare lo script settando DELETE_TEACH_DATA=1 se si vogliono cancellare i messaggi dopo che essi sono stati processati. Ho commentato la linea che cancella i messaggi della mailbox TeachNotSpam perchè non sono sicuro che sia una buona idea cancellare i messaggi che non sono spam.

Settare DEBUG=1 per lanciare sa_learn e spamassassin in modalità debug, di modo che i log mostrino ogni cosa.

Logrotate

Settare il logrotate dei file di log:

cat > /etc/logrotate.d/spam_reports << __EOF__
/var/log/spamassassin/spamassassin.log /var/log/spamassassin/sa_learn.log {
su root apache
rotate 5
daily
missingok
notifempty
delaycompress
create 664 root apache 
sharedscripts
}
__EOF__

Aggiungi un commento