Greylistd, un demone per gestire le greylist con Exim4
Greylistd e` un semplice demone che permette, interrogato da Exim via socket, di gestire il greylisting delle mail in arrivo. In Debian e` presente come pacchetto, e per installarlo e` sufficiente usare il comando
apt install greylistd
Se usate la configurazione standard debian di Exim, troverete una pagina di help che spiega cosa fare per attivarlo come ultimo passo della procedura di installazione. Se invece usate una configurazione personalizzata di Exim dovrete fare da soli. In questa pagina spiego come Greylistd interagisce con la configurazione di Exim che e` descritta qui: ../Exim4-Dovecot
Configurazione di Greylistd
La configurazione di Greylistd e` in /etc/greylistd/config ed e` semplice ma non totalmente documentata. Il file config contiene la configurazione minimale. Quella che sto usando io e` quella di default di Debian, con tre modifiche:
- Ho ridotto a 30 secondi il valore di "retryMin".
- Ho messo a true le due variabili singlecheck e singleupdate, allo scopo di "ammorbidire" il controllo, facendo in modo che prima mail "buona" da un dato mail server "sblocchi" tutte le mail successive da quel mail server. (In altri termini una volta che una mail è stata accettata considero buone le email successive dal medesimo indirizzo ip anche se sono destinate ad utenti diversi dalla prima)
retryMin = 30 singlecheck = true singleupdate = true
Modificata la configurazione, riavviare greylistd con il solito /etc/init.d/greylistd restart
NOTA BENE: Il file /etc/greylistd/whitelist-hosts non viene usato in questa configurazione.
Configurazione di Exim4
Se avete installato la configurazione che trovate in ../Exim4-Docevot allora non dovete fare altro che abilitare l'uso delle greylist come indicato in ../Exim4-Docevot.
Se state configurando il vostro Exim per i cavoli vostri, questo e` un esempio di ACL che usa greylistd, da mettere nella vostra configurazione di Exim, nel gruppo delle ACL che fanno il check dell' RCPT (acl_smtp_rcpt). Questa acl considera le subnet /24 e non i singoli host, per evitare di greylistare enne volte quelle mail che vengono da sistemi grandi che hanno piu` server smtp che ci contattano a rotazione per mandarci la stessa mail. E` ovvio che non e` una soluzione che funziona al 100%, ma e` meglio che niente.
Per evitare di avere ritardi mostruosi nelle email che vengono da sistemi che hanno centinaia di server SMTP (o per altri motivi) è possibile inserire degli indirizzi (anche con netmask) dentro al file definito nella variabile NOGREYLIST. Dentro questo file si possono inserire solo indirizzi ip (v4 e v6) con o senza una netmask; per esempio "192.168.0.0/24", uno per riga.
# Variabili che uso nella ACL # Se non volete usarle, potete semplicemente togliere le relative condition dalla ACL: GREYLISTING=enabled NOGREYLIST=/etc/exim4/nogrey.list
# implementazione delle greylist a mezzo del demone greylistd. # Se la mail non e` stata rifiutata prima, arriva qui e viene verificata la greylist prima # di venire eventualmente accettata dalle ACL che seguono. # notare che non considero il singolo host, ma la net /24 a cui esso appartiene. # questo e` un rilassamento del controllo per evitare di ritardare all'infinito mail che vengono # da sistemi che hanno diversi server smtp che lavorano in parallelo. # Se l'host si trova nella lista NOGREYLIST allora il controllo viene saltato e la mail accettata # immediatamente. defer message = Sender is greylisted. Please try again later. !authenticated = * condition = ${if eq {GREYLISTING} {enabled} {true}{false}} !hosts = ${if exists{NOGREYLIST}{net-iplsearch;NOGREYLIST}{}} condition = ${if eq {grey}\ {${readsocket{/var/run/greylistd/socket}\ {${mask:$sender_host_address/24} \ $sender_address \ $local_part@$domain}\ {5s}{}{} }}\ {true}{false}} log_message = Greylisted $sender_host_address $sender_address $local_part@$domain
Se preferite considerare ogni host singolarmente e non accettare mail da tutta la /24 relativa, la acl diventa:
# implementazione delle greylist a mezzo del demone greylistd. defer message = Sender is greylisted. Please try again later. !authenticated = * condition = ${if eq {GREYLISTING} {enabled} {true}{false}} !hosts = ${if exists{NOGREYLIST}{net-iplsearch;NOGREYLIST}{}} condition = ${if eq {grey}\ {${readsocket{/var/run/greylistd/socket}\ $sender_host_address \ $sender_address \ $local_part@$domain}\ {5s}{}{} }}\ {true}{false}} log_message = Greylisted $sender_host_address $sender_address $local_part@$domain
Gestione di greylistd
Potete "fare cose" a greylistd mentre gira con il comando greylist
Per esempio ecco alcuni comandi:
il comando greylist list mostra la lista attuale degli indirizzi email che sono nella white list
il comando greylist list --grey mostra la lista attuale degli indirizzi email che sono nella grey list
il comando greylist list --black mostra la lista attuale degli indirizzi email che sono nella black list
il comando graylist stats mostra una statistica delle mail che si trovano nei vari stati di grey/white/black list.
Script per aiutarsi a generare whitelist
Volendo, come descritto prima, inserire per esempio tutti gli host SMTP di Google o quelli di Office365 dentro il file NOGREYLIST, possiamo usare uno script come questo: https://github.com/equk/spf_list/
Trovate una copia degli script anche qui: spf_list-master.zip nel caso in cui quel repo un giorno venga cancellato. Lo script che ci interessa è spf_list.sh e possiamo usarlo per esempio come segue:
bash spf_list.sh google.com | tail -n +3 >> nogrey.list bash spf_list.sh outlook.com | tail -n +3 >> nogrey.list
Consigli vari
Se avete piu` di un MX (avete un secondario) vi consiglio di mettere il secondario in whitelist sul primario in qualche modo in modo che il suo traffico verso il primario non sia greylistato, e inoltre DOVETE abilitare il greylisting, e in generale le stesse ACL antispam che adottate sul primario anche sul secondario. Se non lo fate, la mail che sarebbe stata bloccata vi arrivera` tutta lo stesso, a mezzo del vostro secondario che è più permissivo del primario.