Table of Contents

Spamassassin e ClamAV

Appunti per Debian Woody e Debian Sarge, con server SMTP Exim.

Spamassassin

Si desidera far girare la versione daemon di spamassassin (spamd) che resta in ascolto sulla porta 783 tcp. Exim chiamerà spamc (il client) per filtrare le mail locali prima di consegnarle.

Per l'avvio del demone spamd si mette ENABLED=1 in /etc/default/spamassassin.

Con Spamassassin versione 2 è necessario anche impostare OPTIONS=“-F 0” per rimuovere la linea “From ” all'inizio della mail. Questo perché le mail filtrate verranno nuovamente passate ad Exim. In presenza del “From ” Exim riscriverebbe gli header della mail considerando tutto il testo originale (header compresi) come body. Tolta invece l'opzione -c proposta da Debian, altrimenti spamd tenta di creare un file con le user pref nella home dell'utente. Nel nostro caso spamd viene chiamato prima del delivery come utente mail, non come utente finale e le preferenze cadrebbero tutte in /var/mail/.

Con Spamassassin versione 3 si consiglia OPTIONS=“–max-children 5 –helper-home-dir”, si toglie invece l'opzione –create-prefs, come per la versione 2 (vedere spamd(8) per le opzioni).

La configurazione di spamassassin (come e cosa controllare) è in /etc/spamassassin/local.cf. Ecco un esempio per una versione 3:

# See 'perldoc Mail::SpamAssassin::Conf' for details of what can be
# tweaked.

# Use a more efficient, but non-NFS-safe, locking mechanism.
lock_method flock

# Hits required before a mail is considered spam. Default: 5
required_hits 4.5

# The subject lines of suspected spam will be tagged.
rewrite_header Subject *****SPAM*****

# Incoming spam is only modified by adding some "X-Spam-"
# headers and no changes will be made to the body.
report_safe 0

# Whitelist mail from Tripwire.
header   LOCAL_RCVD Received =~ /from localhost \(\[127.0.0.1\] helo=.*\)\s.*\sfor <root\@localhost>/
describe LOCAL_RCVD Received from localhost
score    LOCAL_RCVD -5

# Blacklist messages where Sanitized found a virus.
body     SANITIZED /^\*\*\*\*\*ANTIVIRUS\*\*\*\*\*/
describe SANITIZED Sanitizer removed a virus from the message
score    SANITIZED 10

File di configurazione

I file di configurazione vengono cercati in /etc/spamassassin/. Per prima cosa SpamAssassin (solo la versione 3) cerca dei file con estensione *.pre, poi vengono cercati i file con estensione *.cf. I file vengono considerati in ordine alfabetico. Nei file di configurazione si può anche sfruttare la direttiva include.

Collegamento a Exim 3

In /etc/exim/exim.conf si definisce un director spamcheck_director che viene messo per primo, così ogni mail locale - se soddisfa le condizioni - viene gestita da questo director e passata allo spamcheck_transport.

spamcheck_director:
    # Do not use this director when verifying a local-part at SMTP-time
    no_verify
    # When to scan a message :
    #   -   it isn't already flagged as spam
    #   -   it isn't already scanned
    #   -   it didn't originate locally (as long as I don't harbor spammers :-))
    #   -   $local_part is in /etc/exim/spam_check_mbox
    condition = "${if and { {!def:h_X-Spam-Flag:} {!eq {$received_protocol}{spam-scanned}} {!eq {$received_protoc
    driver = smartuser
    transport = spamcheck_transport

Tra le condizioni che devono essere vere per filtrare il messaggio c'è che la local_part dell'indirizzo (a sinistra della “@”) deve essere presente in /etc/exim/spam_check_mbox.

Lo spamcheck_transport filtra il messaggio con spamd e poi lo ripresenta ad Exim:

spamcheck_transport:
    driver = pipe
    command = "/usr/sbin/exim -oMr spam-scanned -bS"
    bsmtp = all
    transport_filter = "/usr/bin/spamc -f"
    home_directory = "/tmp"
    current_directory = "/tmp"
    # Must use a privileged user to set $received_protocol on the way back in!
    user = mail
    group = mail
    log_output = true
    return_fail_output = true
    return_path_add = false
    prefix =
    suffix =

L'opzione -f di spamc è valida per la versione 2 di Spamassassin, indica che il messaggio deve comunque passare se per caso il demone spamd fallisce l'esecuzione.

Collegamento a Exim 4

Ecco i file di configurazione per un Exim4 e Spamassassin 3. Anche questa configurazione consente di applicare il filtro SpamAssassin in modo selettivo alle mail in arrivo. Bisogna definire un router che seleziona le mail in arrivo da filtrare. Il router deve comparire prima degli altri:

### router/010_local-spamcheck
#################################
# SpamAssassin router

spamcheck_router:
  no_verify
  check_local_user
  # When to scan a message :
  #   -   it isn't already flagged as spam
  #   -   it isn't already scanned
  #   -   .spamcheck exists for this user
  condition = \
  "${if and { {!def:h_X-Spam-Flag:} \
              {!eq {$received_protocol}{spam-scanned}} \
            }\
            {1}{0}\
    }"
  require_files = $home/.spamcheck
  driver = accept
  transport = spamcheck_transport

Il router seleziona il messaggio e lo passa al transport che provvedere ad effettuare la scansione e il reinoltro ad Exim stesso per la consegna finale. Ecco la definizione del transport:

### transport/90_local-spamcheck

# Transport for SpamAssassin: mail is filtered with spamc
# and piped back to Exim.
#
spamcheck_transport:
    driver = pipe
    command =  /usr/sbin/exim4 -oMr spam-scanned -bS
    use_bsmtp = true
    transport_filter = /usr/bin/spamc
    home_directory = "/tmp"
    current_directory = "/tmp"
    # must use a privileged user to set $received_protocol on the way
    user = Debian-exim
    group = Debian-exim
    log_output = true
    return_fail_output = true
    return_path_add = false
    message_prefix =
    message_suffix =

Le mail vengono date nuovamente ad Exim, ma questa volta il received_protocol viene forzato a spam-scanned, in modo che non vengano controllate una seconda volta. Per fare questo bisogna che l'user che reinoltra la mail (exim gira come utente Debian-exim) sia indicato come trusted_user. Bisogna quindi creare il file /etc/exim4/conf.d/main/00_local:

### main/00_local
#################################

MAIN_TRUSTED_USERS = Debian-exim

sa-learn

Con il comando sa-learn si possono allenare i filtri bayesiani di SpamAssassin. Lo si deve lanciare a nome dell'utente sotto cui gira SpamAssassin. Negli esempi precedenti si tratta dell'utente mail in quanto SpamAssassin è stato configurato come filtro di sistema. Il materiale imparato viene salvato in $HOME/.spamassassn/bayes*, si tratta di un database dinamico che prevede anche un journal, conviene consolidarlo con –sync ad esempio prima di copiarlo su un'altro host.

Supponiamo che /home/salearn/Maildir/cur sia una directory dove sono raccolti tutti i messaggi di spam e mail sia l'utente con cui gira SpamAssassin:

su - mail
sa-learn --spam /home/salearn/Maildir/cur
sa-learn --sync
sa-learn --backup > bayes.backup
sa-learn --restore bayes.backup

Gli ultimi due comandi mostrano come si fa il backup e il restore del database dei filtri bayesiani.

sa-update

Con sa-update si possono scaricare e tenere aggiornate le collezioni di regole che SpamAssassin utilizza per assegnare punteggio. Si possono tenere aggiornate sia le regole predefinite di SpamAssassin che delle collezioni aggiuntive scelte in base alle proprie esigenze.

Si deve scegliere un canale da cui prelevare le nuove regole, esiste il sito SARE che contiene una buona galleria di canali. Si è provato con saupdates.openprotect.com e www.malware.com.br.

ATTENZIONE a dove vengono messi i file scaricati! Dal manuale di SpamAssassin: The SpamAssassin rule base, text templates, and rule description text are loaded from configuration files. Default configuration data is loaded from the first existing directory in:

Nota: la man page Debian indica la directory /usr/share/spamassassin più volte!

Il pacchetto Debian di spamassassin mette le regole predefinite - se non si attiva la funzione di aggiornamento automatico - in /usr/share/spamassassin, quindi è indispensabile mettere le regole aggiuntive in una directory diversa dal default di sa-update che è /var/lib/spamassassin/3.001004/, altrimenti le regole aggiuntive oscurerebbero quelle predefinite di spamassassin. La directory si indica con il parametro –updatedir:

sa-update --nogpg --channel saupdates.openprotect.com --updatedir /usr/local/lib/sare

Nella directory /usr/local/lib/sare/saupdates_openprotect_com/ vengono piazzati due file (uno con estensione .pre e uno con estensione .cf) più una sottidirectory con la collezione delle regole.

Spamassassin considera nelle directory di configurazione prima i file con estensione .pre e poi quelli con estensione .cf in ordine lessicografico, si può pertanto aggiungere in coda al file /etc/spamassassin/local.cf le seguenti righe:

include /usr/local/lib/sare/saupdates_openprotect_com.pre
include /usr/local/lib/sare/saupdates_openprotect_com.cf

Prima di riavviare il demone conviene verificare la sintassi delle nuove regole:

spamassassin --debug  --nocreate-prefs --lint
echo "rm -r /root/.spamassassin"
/etc/init.d/spamassassin restart

Se vogliamo scaricare automaticamente ogni giorno le nuove regole si imposta CRON=1 in /etc/default/spamassassin, in tal caso il cronjob /etc/cron.daily/spamassassin provvede a scaricare le nuove regole in /var/lib/spamassassin/3.001004.

ATTENZIONE: Potrebbe capitare che le nuove regole scaricate abbiano un problema, in tal caso il demone Spamassassin potrebbe pure morire con il messaggio di errore:

spamd[6433]: config: no rules were found! Do you need to run 'sa-update'?

Sembra che per risolvere sia sufficiente eliminare la directory /var/lib/spamassassin/3.004001/.

La versione dell'aggiornamento installato si ricava dalla prima riga dal file /var/lib/spamassassin/3.004001/updates_spamassassin_org.cf:

# UPDATE version 1869319

La versione disponibile si ottiene con una interrogazione DNS. Avendo installato SpamAssassin versione 3.4.1 si interroga:

host -t TXT  1.4.3.updates.spamassassin.org
1.4.3.updates.spamassassin.org is an alias for 3.3.3.updates.spamassassin.org.
3.3.3.updates.spamassassin.org descriptive text "1869319"

Per effettuare un check dell'aggiornamento, senza eseguirlo:

sa-update -D -v --checkonly

ATTENZIONE: Con Debian 10 Buster viene installato SpamAssassin 3.4.2, quindi cambia ad esempio la directory con gli aggiornamenti: /var/lib/spamassassin/3.004002/.

ClamAV

Debian Woody

Una versione più recente di Clamav è disponibile come backport da www.backports.org, conviene aggiungere queste righe a /etc/apt/sources.list

deb     http://www.backports.org/debian         stable        clamav
deb-src http://www.backports.org/debian         stable        clamav

Interessa la versione demone dello scanner, più performante. Anche gli aggiornamenti verranno scaricati in atuomatico da un demone (clamav-freshclam) oppure da cronjob.

Si devono installare quindi i seguenti pacchetti (nota: clamav e clamav-freshclam devono essere installati con una sola esecuzione di dpkg):

C'è un errore nel postints di clamav-daemon (corretto dalla versione 0.67-7), il file /etc/logrotate.d/clamav-daemon che viene installato ha la riga create dentro la sezione postrotate/endscript. E' stato corretto mettendo il create prima della sezione.

Debian Sarge

Con Debian Sarge si installano i seguenti pacchetti:

Si vuole l'aggiornamento via cron (/etc/cron.d/clamav-freshclam) piuttosto che far girare freshclam come demone (eventuale configurazione in /etc/clamav/freshclam.conf). Il database dei virus conosciuti viene memorizzato in /var/lib/clamav/.

Per controllare un file, una directory o una Maildir si puo' usare:

clamscan /path/to/file
clamscan -r /directory/
clamscan -r --mbox /home/user/Maildir/

Il codice di ritorno significa:

 0  No virus found.
 1  Virus(es) found.
>1  Altri errori.

Sanitizer

Installato Sanitizer da Debian testing (non ci sono dipendenze!), creato un file di configurazione ad-hoc: /etc/sanitizer.conf. Predisposta la directory /home/quarantine/ per ricevere gli allegati infetti. Appartiene a mail:mail, mode 0750. Per testare sanitizer come filtro su un messaggio di posta:

cat message | sanitizer /etc/sanitizer.cfg