Table of Contents

spamass-milter

Come impostare un filtro SpamAssassin sulla posta in arrivo, con Postfix.

La posta viene filtrata sia quando è destinata agli utenti locali, sia quando ne viene fatto il relay. Nel primo caso vengono usate le preferenze Spamassassin dell'utente, nel secondo caso invece quelle dell'utente nobody oppure spamass-milter (non si è capito bene come mai: due comportamenti diversi su due server diversi).

Installazione e configurazione

Su una Debian 10 Buster, installare il pacchetto spamass-milter.

Quando il demone spamass-milter è in esecuzione crea il socket /var/spool/postfix/spamass/spamass.sock che è raggiungibile da Postfix anche nel suo chroot.

La configurazione predefinita è in /etc/default/spamass-milter:

OPTIONS="-u spamass-milter -i 127.0.0.1"

L'opzione -i indica di ignorare i messaggi da localhost (127.0.0.1). L'opzione -u viene invece usata solo per i messaggi con destinatari multipli; quando c'è un solo destinatario il milter ricava il nome utente da passare a spamc dalla local-part del destinatario (cioè la parte che precede il simbolo @), se il messaggio ha destinatari multipli viene invece passato l'utente indicato da questa opzione.

ATTENZIONE: Questa configurazione va bene per i messaggi in arrivo destinati ad utenti locali, infatti consente di far girare spamc a nome dell'utente finale ed utilizzare le sue preferenze contenute in $HOME/.spamassassin/. La stessa configurazione non va bene per il relay di messaggi, in quel caso infatti non ha senso estrarre la local-part del destinatario, che certamente non è un utente locale!

Configurazione system-wide

Se si desidera filtrare con il milter i messaggi in uscita è pertanto necessario chiamare spamc passando un generico utente di sistema, le preferenze impostate per quell'utente non saranno pertanto per-user, ma system-wide.

In tal caso configurare il demone mettendo in /etc/default/spamass-milter:

#OPTIONS="-d func,misc -i 127.0.0.1 -r -1"
OPTIONS="-i 127.0.0.1 -r -1"

Per rileggere la configurazione è necessario un systemctl restart spamass-milter.service.

L'opzione -d attiva alcuni parametri di debug che si possono togliere una volta in produzione, l'opzione -r associata al valore -1 respingere il messaggio se la scansione di SpamAssassin dà esito positivo (il messaggio è SPAM), pertanto verranno applicate le impostazioni personali dell'utente a nome di cui viene invocato spamc. Altrimenti con il parametro -r si può indicare il punteggio SPAM da usare come soglia di caso positivo.

Il milter gira a nome dell'utente spamass-milter, la sua home directory è /var/lib/spamass-milter/. È necessario creare questa directory perché spamass-milter possa scrivere le proprie preferenze:

mkdir /var/lib/spamass-milter
chown spamass-milter:spamass-milter /var/lib/spamass-milter
chmod 750 /var/lib/spamass-milter

Alla prima esecuzione del filtro viene creato il file con le preferenze /var/lib/spamass-milter/.spamassassin/user_prefs, è possibile poi ad esempio aggiungere:

required_score   12.0

Configurazione Postfix

Per aggiungere il filtro milter è sufficiente mettere in /etc/postfix/main.cf:

# Mail filter: spamass-milter
smtpd_milters = unix:spamass/spamass.sock

Ovviamente con la regola generica smtpd_milters il filtro sarà applicato a tutti i messaggi (in entrata e in uscita).

Nel nostro caso invece vogliamo applicare il filtro solo sui messaggi in uscita, per evitare di fare SPAM relay a qualche utente che ha avuto l'account hackerato. I messaggi in arrivo invece sono filtrati a valle, con un filtro utente invocato dal Local Delivery Agent (dovecot-lda, procmail o maildrop, per citarne tre).

Ecco come applicare il filtro solo per gli utenti autenticati che accedono al servizio submission sulla porta 587. In master.cf si aggiunge il parametro -o smtpd_milters al servizio submission:

submission inet n       -       y       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_tls_auth_only=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  -o smtpd_milters=$mua_milters
  -o smtpd_sender_restrictions=$mua_sender_restrictions
  -o smtpd_relay_restrictions=$mua_relay_restrictions

in main.cf si definisce il $mua_milters:

# Restriction applied as smtpd_milters over SUMBISSION/587.
mua_milters = unix:spamass/spamass.sock