In questo appunto, descriverò la procedura utilizzata per avviare un servizio di posta elettronica su un piccolo server con OpenBSD 7.6. L’argomento non è proprio semplicissimo.
Supponiamo che Alice e Bob vogliano comunicare in sicurezza tramite la Posta elettronica.
Le componenti da considerare son 3 :
- MTA (Mail Trasport Agent) permette al messaggio inviato da Alice (mittente), di giungere alla mailbox privata di Bob (destinatario).
- MDA (Mail Delivery Agent) permette al destinatario (Bob) di prelevare dalla propria mailbox, il messaggio ricevuto da Alice (o da chiunque altro mittente).
- MUA (Mail User Agent) è il client di posta, che tramite l’MDA, preleva dal server i messaggi parcheggiati nella mailbox. Il MUA si interfaccia, lato server, sia con l’MDA quando deve leggere/prelevare i messaggi da una propria mailbox, e sia con l’MTA quando dovrà inviare messaggi ad altro destinatario.

Quindi l’MTA e l’MDA sono componenti che girano su quello che generalmente chiamiamo “Server di Posta“, mentre il MUA (spesso, ma non sempre) è installato sulle nostre postazioni (PC, dispositivi mobili).
Ho semplificato molto l’architettura, volutamente, per non rendere troppo complicato l’argomento. Per dirne una : quasi sempre il servizio di posta relativo ad un dominio, anche domestico, dovrebbe essere erogato almeno 2 macchine bilanciate per favorire la normale manutenzione senza dare disservizio.
Passiamo alla realizzazione. Ho utilizzato OpenSMTP come MTA, Dovecot come MDA e Thurderbird|neomutt|RainLoop come MUA.
OpenSMTP (MTA)

SMTPd è preinstallato con OpenBSD. Ne è stato eseguito un port anche su GNU/Linux e altri sistemi BSD. Sicuramente è impacchettato su Debian GNU/Linux, ArchLinux, e probabilmente anche Slackware. Comunque per maggiori dettagli fate riferimento al sito web ufficiale OpenSMTPd
Di seguito il mio file di configurazione per smtpd. Successivamente ne dettaglierò le singole sezioni.
alfree2$ cat /etc/mail/smtpd.conf
# $OpenBSD: smtpd.conf,v 1.14 2019/11/26 20:14:38 gilles Exp $
# This is the smtpd server system-wide configuration file.
# See smtpd.conf(5) for more information.
#.---------------------------------------------------------------.
#| |
#| File di configurazone Principale di OpenSMTP |
#| (versione customizzata) |
#| |
#'---------------------------------------------------------------'
#.-----------------------------------------------------------------------.
#| Identita' digitale del Server. -- al momento e' self-signed -- |
#'-----------------------------------------------------------------------'
pki "mail" cert "/etc/ssl/mail.crt"
pki "mail" key "/etc/ssl/private/mail.key"
#.---------------------------------------------------------------------------.
#| Tabelle Alias, Credenziali ed Utenti Virtuali utilizzati da OpenSMTP. |
#| Per avere gli utenti virtuali, memorizzati nel file /etc/mail/credentials |
#| nel formato simil-passwd-unix, e' necessario installare il pacchetto |
#| "opensmtp-table-passwd". L'inserimento dei dati in questo file (al |
#| momento) e' manuale e abbastanza noioso. La password e' mantenuta |
#| cifrata, la forma cifrata e' ottenuta col comando : |
#| smtpctl encrypt <password> |
#| alfree2# smtpctl encrypt miapassword |
#| $2b$08$1emmtK5qvdss6kdv2mOll.oWqByZn19wgR5FCM7rC8wo1sQDDP4bK |
#'---------------------------------------------------------------------------'
table aliases file:/etc/mail/aliases
table credentials passwd:/etc/mail/credentials
table virtuals file:/etc/mail/virtuals
#.--------------------------------------------------------------------.
#| Definizione Listen |
#|--------------------------------------------------------------------|
#| 1) Porta 25 la usano chi ti manda la posta dall'esterno, |
#| utilizzando altri smtp-server, "on all" significa su tutte le |
#| interfacce di rete. |
#| La porta viene specificata, ma forse non serve farlo perche' |
#| e' quella di default, dall'esterno puntano li. Non so se |
#| tramite record MX e' possibile specificarne un'altra. |
#| pki specifica l'identita'digitale, al momento self-signed |
#| detto. Non so se questo puo' rapprentare un problema. |
#| L'hostname e' quanto riportato anche nel DNS con i record A |
#| (e non CN), MX e TEXT. |
#| 2) Porta 587 la possono usare gli utenti di OpenSMTP per inviare |
#| una e-mail. Se l'esigenza e' inviare da locale allora |
#| l'interfaccia di esposizione puo' essere impostta a lo0 |
#| Nel caso in cui l'utente e' remoto al server (ad esempio dal |
#| proprio PC con thunderbird, allora deve essere esposta sulla |
#| specifica interfaccia pubblica oppure su tutte (all). |
#'--------------------------------------------------------------------'
listen on all port 25 tls pki "mail" hostname "mail.granito.org.uk"
listen on all port 587 tls-require pki "mail" hostname "mail.granito.org.uk" auth <credentials>
#.----------------------------------------------------------------.
#| Sezione Azioni. (Referenziate nella sezioe Match) |
#'----------------------------------------------------------------'
action "local_mail" mbox alias <aliases>
action "domain_mail" maildir "/var/vmail/granito.org.uk.org/%{dest.user:lowercase}" virtual <virtuals>
action "outbound" relay
#.-----------------------------------------------------------.
#| Sezione Match. |
#| 1) local->local => azione "local_mail" |
#| 2) local->any => azione "outbound" |
#| 3) any-user->any => azione "outbound" |
#| 4) any->domain => azione "domain_mail" |
#'-----------------------------------------------------------'
match from any for domain "granito.org.uk" action "domain_mail"
match from local for local action "local_mail"
match from local for any action "outbound"
match auth from any for any action "outbound"
# :::... EOF
Riga 16 e 17 : Chiave Privata e Certificato SSL
E’ necessario avere un’identità digitale SSL, ossia una chiave privata ed il corrispondente certificato (x509) firmato da una Certification Authority riconosciuta. Se momentaneamente non ne avete una, potete generarne una, autocertificandola.
doas su -
cd /etc/ssl
openssl genrsa -out private/mail.key 4096
openssl req -x509 -new -nodes -key private/mail.key -out mail.crt -days 3650 -sha256
Blocco 30-32 : Definizione Tabelle Aliases, Credentials e Virtuals
Il termine Tabelle indica essenzialmente un file di configurazione secondario, dedicato a contenere una specifica tipologia di informazioni, nel nostro caso specifico: aliases, utenti ed utenti virtuali.
La tabella aliases l’ho lasciata inalterata.
La tabella credentials contiene gli utenti, ed ha un formato simile al file passwd di unix. Di seguito il significato delle colonne previste :
- Utenza (ossia il nome casella di posta elettronica da creare, nel caso specifico info@granito.org.uk)
- Password nel formato cifrato, ottenibile tramite il comando “smtpctl encrypt <password>”
alfree2# smtpctl encrypt miapassword
$2b$08$1emmtK5qvdss6kdv2mOll.oWqByZn19wgR5FCM7rC8wo1sQDDP4bK
alfree2$ doas cat /etc/mail/credentials
info@granito.org.uk:$2b$08$zWu2vbIkZVt/2JNb8p:vmail:2000:2000:/var/vmail/granito.org.uk/info::userdb_mail=maildir:/var/vmail/granito.org.uk/info
La tabella virtuals definisce gli eventuali alias. Nel caso specifico, per l’utenza virtuale info, definisco i seguenti 4 alias : abuse, hostmaster, postmaster e webmaster. Qualsiasi mail inviata ad uno degli 4 alias verrà recapitata automaticamente alla casella reale info@granito.org.uk
alfree2$ cat /etc/mail/virtuals
abuse@granito.org.uk: info@granito.org.uk
hostmaster@granito.org.uk: info@granito.org.uk
postmaster@granito.org.uk: info@granito.org.uk
webmaster@granito.org.uk: info@granito.org.uk
info@granito.org.uk: vmail
to be continue