Servizio di Posta con OpenBSD 7.6

di | Aprile 27, 2025

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

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