Exim4: Smarthost con Account Multipli

Dove lavoro ho una connessione ADSL Telecom e – come capita ogni tanto – non si sa bene perché – quest’ultima ha deciso di cambiare il sistema relativo alla Posta Elettronica.

In particolare hanno cambiato il server SMTP e quello IMAP che ora sono, rispettivamente, out.impresasemplice.it e imap.impresasemplice.it .

Io ho un Server Linux, su cui gira una Debian con Exim4 e Fetchmal, usata per scaricare ed inviare la posta al server Telecom.

Uso questo metodo perché mi consente di avere in locale la posta, così che posso condividerla tra i vari PC, farne il controllo antivirus, antispam, Blacklist e quant’altro, tutto centralizzato e con un accesso più rapido di quello che avrei lasciando in remoto (per non parlare dello spazio).

Inoltre, il tutto, può avvenire per i vari account che il contratto ADSL ci fornisce.

Peccato che, a seguito del cambiamento, l’account secondario usato per l’ufficio dell’Amministrazione abbia cessato di funzionare.

Dopo molta tribolazione e ore passate al telefono con il Supporto Tecnico (molto gentile, devo dire) ne sono venuto a capo. Di fatto hanno inasprito i controlli effettuati sui client che inviano posta: in pratica hanno inibito la possibilità che un account di posta possa inviare mail specificando un indirizzo e-mail “From” diverso dal previsto.

Questo inibisce la possibilità che l’account venga usato per lo spam, falsificando il proprio indirizzo E-Mail.

Peccato che exim4, di default, prevede che ad un server SMTP – usato come smarthost – possa corrispondere una sola accoppiata username/password.

Per fare in modo che sia possibile, con il medesimo smarthost, associare una password ma soprattutto uno username diverso per ogni utente desiderato – prima si poteva usare lo username e la password dell’account principale, anche sugli account secondari – ho dovuto operare diverse modifiche, che vado di seguito ad elencare:

  1. Modifica del file exim4.conf.template ; previo backup, bisogna cercare la stringa “CONFDIR/passwd.client” e, laddove sono presenti le righe che contengono la variabile “$host“, sostituire quest’ultima con “$sender_address“. In pratica bisogna cambiare:
remote_smtp_smarthost:
 debug_print = "T: remote_smtp_smarthost for $local_part@$domain"
 driver = smtp
 hosts_try_auth = <; ${if exists{CONFDIR/passwd.client} \
 {\
 ${lookup{$host}nwildlsearch{CONFDIR/passwd.client}{$host_address}}\
 }\
 {} \
 }

in:

remote_smtp_smarthost:
 debug_print = "T: remote_smtp_smarthost for $local_part@$domain"
 driver = smtp
 hosts_try_auth = <; ${if exists{CONFDIR/passwd.client} \
 {\
 ${lookup{$sender_address}nwildlsearch{CONFDIR/passwd.client}{$host_address}}\
 }\
 {} \
 }

poi:

cram_md5:
driver = cram_md5
public_name = CRAM-MD5
client_name = ${extract{1}{:}{${lookup{$sender_address}nwildlsearch{CONFDIR/passwd.client}{$value}fail}}}
client_secret = ${extract{2}{:}{${lookup{$sender_address}nwildlsearch{CONFDIR/passwd.client}{$value}fail}}}

in:

 public_name = CRAM-MD5
 client_name = ${extract{1}{:}{${lookup{$sender_address}nwildlsearch{CONFDIR/passwd.client}{$value}fail}}}
 client_secret = ${extract{2}{:}{${lookup{$sender_address}nwildlsearch{CONFDIR/passwd.client}{$value}fail}}}

Infine abbiamo:

# this returns the matching line from passwd.client and doubles all ^
PASSWDLINE=${sg{\
 ${lookup{$host}nwildlsearch{CONFDIR/passwd.client}{$value}fail}\
 }\
 {\\N[\\^]\\N}\
 {^^}\
 }

che diventa:

# this returns the matching line from passwd.client and doubles all ^
PASSWDLINE=${sg{\
 ${lookup{$sender_address}nwildlsearch{CONFDIR/passwd.client}{$value}fail}\
 }\
 {\\N[\\^]\\N}\
 {^^}\
 }
  • Ora passiamo al file passwd.client ; previo backup anche di questo, dobbiamo scrivere i record relativi agli account che intendiamo gestire; di seguito propongo un esempio che penso sia chiaro:
# password file used when the local exim is authenticating to a remote
# host as a client.
#
# see exim4_passwd_client(5) for more documentation
#
# Example:
### email_address:login:password
utente_principale@dominio.191.it:utente_principale@dominio.191.it:password_utente_principale
alias_A@dominio.191.it:utente_principale@dominio.191.it:password_utente_principale
utente_A@dominio.191.it:utente_A@dominio.191.it:password_utente_A

Notare che, avendo la possibilità di creare degli Alias per ogni account, bisogna prevedere anch’essi.

Io penso che il file di configurazione creato dalla procedura automatica di Debian – all’atto dell’installazione di exim4 – sia già ok, tuttavia, vi fornisco il mio in modo che, in caso di problemi, possiate avere un termine di paragone:

# /etc/exim4/update-exim4.conf.conf
#
# Edit this file and /etc/mailname by hand and execute update-exim4.conf
# yourself or use 'dpkg-reconfigure exim4-config'
#
# Please note that this is _not_ a dpkg-conffile and that automatic changes
# to this file might happen. The code handling this will honor your local
# changes, so this is usually fine, but will break local schemes that mess
# around with multiple versions of the file.
#
# update-exim4.conf uses this file to determine variable values to replace
# the DEBCONFsomethingDEBCONF strings in the configuration template files.
#
# Most settings found in here do have corresponding questions in the
# Debconf configuration, but not all of them.
#
# This is a Debian specific file 

dc_eximconfig_configtype='smarthost'
dc_other_hostnames='dominio.191.it'
dc_local_interfaces=''
dc_readhost='dominio.191.it'
dc_relay_domains=''
dc_minimaldns='true'
dc_relay_nets='192.168.0.0/24'
dc_smarthost='out.impresasemplice.it'
CFILEMODE='644'
dc_use_split_config='false'
dc_hide_mailname='true'
dc_mailname_in_oh='true'
dc_localdelivery='mail_spool'

Cosa molto importante, alla quale bisogna prestare attenzione, sono i permessi, in particolare gli utenti di appartenenza dei files di configurazione. Questo è quello che bisognerebbe, grosso modo, avere:

drwxr-xr-x 9 root root         1024 2008-05-02 22:03 conf.d
-rw-r--r-- 1 root root           59 2010-11-17 18:06 exim4.conf.localmacros
-r--r--r-- 1 root root        75933 2011-03-11 16:21 exim4.conf.template
-r--r----- 1 root root           83 2011-03-05 12:21 passwd
-r--r----- 1 root Debian-exim   317 2011-03-11 16:31 passwd.client
drwxr-xr-x 2 root root         1024 2011-03-11 16:38 RCS
-rw-r--r-- 1 root root          151 2010-11-18 10:23 system.filter
-rw-r--r-- 1 root root         1122 2011-03-05 12:23 update-exim4.conf.conf

Notare che il file passwd.client appartiene a root:Debian-exim .

Infine, importantissimo, è necessario – se non presente – creare il file exim.conf.localmacros il cui contenuto deve essere:

MAIN_TLS_ENABLE = true
AUTH_CLIENT_ALLOW_NOTLS_PASSWORD=1

Se qualcosa non è chiaro, scrivetemi pure !

Autore: BuDuS

Disegnatore Meccanico, con la passione per l'Informatica. Come hobby, produco piccoli software di (in)utilità.