Combattere lo SPAM con exim

Affrontare lo SPAM è una guerra continua, con regole e situazioni che cambiano di frequente. Riporto qui di seguito alcune considerazioni legate alla configurazione di exim4, in particolare su Debian.

Non elencherò qui le soluzioni più diffuse, come utilizzare spamassassin per la verifica della posta in ingresso, oppure utilizzare le varie blacklist per negare l’accesso a server poco accreditati. Invece, scriverò solo metodi aggiuntivi, per rafforzare ulteriormente il server.

Nome account diverso dal nome della casella di posta elettronica

Molto spesso, chi raccoglie indirizzi di posta elettronica tramite ricerceh su web o tramite la lettura delle rubriche private, tenta poi l’accesso al server di posta utilizzando come nome utente l’indirizzo di posta, con o senza il dominio.

Per esempio, se sulla macchina «macchina.tld» esiste un utente Francesco Rossi con una utenza «francesco», molto probabilmente esistena la casella di posta «francesco@macchina.tld». Se si fa un server di posta, dedicato alla parte SMTP e/o IMAP, vanno definite le utenze e le caselle di posta. Il suggerimento è di usare utenze diverse dalle caselle di posta. Ad esempio, si può dare a Francesco l’utenza «kl2482gg@macchina.tld» che corrisponda alla casella di posta «francesco@macchina.tld».

In questo modo, chi conoscerà la casella di posta «francesco@macchina.tld» tenterà di accedere usando l’utenza «francesco» oppure «francesco@macchina.tld», che non esistono.

Geolocalizzazione

Altra cosa importante è che le credenziali vengono comunque rubate, in un modo o nell’altro, magari tramite virus. Una volta che queste sono in mano agli spammer, verranno effettuate migliaia di connessioni correttamente autenticate verso il server SMTP, che accetterà i messaggi SPAM e cercherà di inviarli.

Una via per limitare questo attacco, è quella di bloccare email inviate da IP stranieri. Per farlo conviene mettere un log per tracciare le nazioni dalle quali si riceve la posta autenticata e capire quali siano le nazioni valide. Su Debian c’è un pacchetto chiamato «geoip-database» che contiene l’elenco degli IP con l’indicazione della nazione di appartenenza. Per exim esiste una libreria dinamica (disponibile qui) che permette di interrogare quel database. Una volta compilata e installata seguendo le istruzioni sul sito della libreria, si devono aggiungere alcuni file di configurazione a exim. Il primo crea una variabile con la nazione dell’IP, chiamiamolo «/etc/exim4/conf.d/acl/exim4-config_check_geoip_parte1»:

#imposta la variabile acl_c_geoip_country_code
warn set acl_c_geoip_country_code = \
${dlfunc{/usr/local/lib/exim4/exim-geoipv6-dlfunc.so}\
{geoip_country_code}{$sender_host_address}}

Il secondo usa la variabile per bloccare l’accesso, chiamiamolo «/etc/exim4/conf.d/acl/exim4-config_check_geoip_parte2»:

#
# Controllo dell'IP origine della connessione.
# Utilizza una libreria e il database degli IP
# la libreria è https://github.com/snabb/exim-geoipv6-dlfunc
# il database e' nel pacchetto geoip-database
#

# nella fase di test, aggiungo una intestazione per controllare la
# variabile
#warn
# condition = ${if def:acl_c_geoip_country_code}
# authenticated = *
# log_message = Accesso autenticato dalla nazione $acl_c_geoip_country_code

# nella fase di test, aggiungo una intestazione per controllare
# l'indirizzo se non è nel database
warn
!condition = ${if def:acl_c_geoip_country_code}
authenticated = *
!hosts = 10.0.0.0/24
log_message = Accesso autenticato da un IP sconosciuto e non della LAN

# accetta email che arrivano da IP della LAN a condizione che
# sia stata fatta l'autenticazione
accept
authenticated = *
hosts = 10.0.0.0/24
log_message = Accesso autenticato da computer in LAN

# accetta email che arrivano da IP di nazioni conosciute, ma mancanti dal database,
# a condizione che sia stata fatta l'autenticazione
accept
authenticated = *
# 88.209.103.0 - 88.209.103.255, Monaco-Telecom, MC
hosts = 88.209.103.0/24
log_message = Accesso autenticato da computer in LAN
# accetta email che arrivano da IP in Francia e Monaco a condizione
# che sia stata fatta l'autenticazione
accept
authenticated = *
condition = ${if def:acl_c_geoip_country_code}
condition = ${if inlist{$acl_c_geoip_country_code}{FR:IT:MC}}
log_message = Accesso autenticato da IP della nazione $acl_c_geoip_country_code

# blocca i messaggi per i quali è stata fatta l'autenticazione SMTP,
# cioè si conosce la password, ma vengono da una naziona conosciuta
# e straniera
# nota: in alcuni casi, acl_c_geoip_country_code non viene inizializzata
# perché l'IP non è nel database. In quel caso, non si entra in questa
# regola
deny
authenticated = *
condition = ${if def:acl_c_geoip_country_code}
!condition = ${if inlist{$acl_c_geoip_country_code}{FR:IT:MC}}
message = Authenticated access from foreign country denied.
log_message = Accesso autenticato da nazione non autorizzata. Rifiutato.

Infine, per fare usare questi due file ad exim, è necessario modificare il file con le opzioni locali, come ad esempio, «/etc/exim4/conf.d/main/000_local_options» aggiungendovi quest righe:

# controllo accessi tramite verifica geografica
CHECK_RCPT_LOCAL_ACL_FILE = /etc/exim4/conf.d/acl/exim4-config_check_geoip_parte1
CHECK_DATA_LOCAL_ACL_FILE = /etc/exim4/conf.d/acl/exim4-config_check_geoip_parte2

Con la geolocalizzazione si bloccano le richieste dall’estero, ma questo potrebbe essere un problema se uno si spostasse all’estero, magari in vacanza. Va quindi usata con attenzione.

Una seconda possibilità, più onerosa dal punto di vista computazionale, è quella di fare il controllo antispam, con spamassassin o altro, anche ai messaggi che arrivano da connessioni autenticate.