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, di giungere alla mailbox privata del destinatario (Bob).
- MDA (Mail Delivery Agent) permette al destinatario (Bob) di prelevare dalla propria mailbox, il messaggio ricevuto da Alice.
- 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 messaggio da una mailbox, e sia con l’MTA quando deve inviare messaggi ad altro destinatario.
Ho utilizzato OpenSMTP come MTA, Dovecot come MDA e Thurderbird|neomutt 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 (condiviso da OpenSMTP e Dovecot), e' |
#| necessario installare il pacchetto "opensmtp-table-passwd". L'inserimento |
#| dei dati in questo file 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
#.--------------------------------------------------------------------------.
#| Dichiarazione del filtro "rspamd" referenziato successivamente |
#| filter-rspamd e' un codice di interfaccia tra OpenSMTP e respamd. Per |
#| averlo e' necessario installare "opensmtp-filter-respamd", ed ovviamente |
#| "respamd" che si porta dietro "redis" per la gestione della cache. |
#'--------------------------------------------------------------------------'
filter "rspamd" proc-exec "/usr/local/libexec/smtpd/filter-rspamd"
#.--------------------------------------------------------------------.
#| Difinizione 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. Se la si invia solamente dall'interno, |
#| questa riga puo' essere omessa probabilmente. |
#| 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' essere un problema.[APERTO APERTO] |
#| L'hostname e' quanto riportato anche nel DNS con i record A |
#| (e non CN), MX e TEXT. Se non si integra con rspamd il filter |
#| va escluso. In caso contrario va ovviamente installato |
#| come detto prima "opensmtp-filter-respamd", "respamd" e "redis" |
#'--------------------------------------------------------------------'
listen on all port 25 tls pki "mail" hostname "mail.granito.org.uk" filter "rspamd"
#.--------------------------------------------------------------------.
#| 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 587 tls-require pki "mail" hostname "mail.granito.org.uk" auth <credentials> filter "rspamd"
#.----------------------------------------------------------------.
#| 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 "specialcatsteam.org" 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 virtuals è così impostata. Definisco l’utenza virtuale info, e 4 alias di questa : abute, hostmaster, postmaster e webmaster.
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
La tabella credentials contiene gli utenti, ed è simile al file passwd
alfree2$ doas cat /etc/mail/credentials
info@specialcatsteam.org:$2b$08$zWu2vbIkZVt/2JNb8p:vmail:2000:2000:/var/vmail/granito.org.org/info::userdb_mail=maildir:/var/vmail/granito.org.uk/info
to be continue