Questa è la seconda parte di un serie di appunti, su come installare un server di Posta affidabile e sicuro su OpenBSD. Nella prima parte che trovate QUI (che consiglio di leggere), è descritta l’installazione e la configurazione della MTA, che mi ha permesso di effettuare un primo test di ricezione mail da un dominio esterno. In questa seconda parte andrò ad installare e configurare l’MDA, nel mio caso Dovecot (https://dovecot.org/), che mi permetterà di leggere la posta ricevuta tramite IMAP.
Iniziamo.

Per prima cosa vado ad installare Dovecot. Su OpenBSD è pacchettizato con o senza api-gss. Scelgo di installare la build base. L’ultima al momento disponibile (23/11/2025) è la 2.3.21.1p1v0, che si porta dietro 2 librerie da cui dipende : libstemmer e libexttextcat.
alfree$ doas pkg_add dovecot
quirks-7.103 signed on 2025-10-13T22:55:16Z
Ambiguous: choose package for dovecot
a 0: <None>
1: dovecot-2.3.21.1p1v0
2: dovecot-2.3.21.1p1v0-gssapi
Your choice: 1
dovecot-2.3.21.1p1v0:libstemmer-2.2.0: ok
dovecot-2.3.21.1p1v0:libexttextcat-3.4.7: ok
dovecot-2.3.21.1p1v0: ok
The following new rcscripts were installed: /etc/rc.d/dovecot
See rcctl(8) for details.
New and changed readme(s):
/usr/local/share/doc/pkg-readmes/dovecot
Il redme che suggerisce di leggere, dice :
+-----------------------------------------------------------------------
| Running dovecot on OpenBSD
+-----------------------------------------------------------------------
By default, the Dovecot processes run in the login(1) class of "dovecot".
The capability database file is located at /etc/login.conf.d/dovecot
For larger servers these numbers and memory limits (e.g. datasize
and stacksize) may also need to be increased. Please report any
changes and experiences to the package maintainers so that we can
update this file for future versions.
A quanto pare, Dovecot necessita di aprire in Lettura/Scrittura tra i 1024 e 2048 file per funzionare correttamente, che non è il default, quindi è necessario specificarlo. A questo ci ha pensato il manutentore del pacchetto per OpenBSD che ci fornisce con l’installazione già una possibile configurazione impostata.
alfree$ cat /etc/login.conf.d/dovecot
dovecot:\
:openfiles-cur=1024:\
:openfiles-max=2048:\
:tc=daemon:
In alternativa avremmo potuto aggiungere l’intero blocco anche direttamente nel file /etc/login.conf. Dovecot per funzionare correttamente necessità di raddoppiare gli openfiles-max e openfiles-cur.
alfree$ less /etc/login.conf
__CUT__
default:\
:path=/usr/bin /bin /usr/sbin /sbin /usr/X11R6/bin /usr/local/bin /usr/local/sbin:\
:umask=022:\
:datasize-max=1536M:\
:datasize-cur=1536M:\
:maxproc-max=256:\
:maxproc-cur=128:\
:openfiles-max=1024:\
:openfiles-cur=512:\
:stacksize-cur=4M:\
:localcipher=blowfish,a:\
:tc=auth-defaults:\
:tc=auth-ftp-defaults:
__CUT__
Configurazione
Creare il seguente file di configurazione per Dovecot (/etc/dovecot/local.conf)
alfree$ cat /etc/dovecot/local.conf
auth_mechanisms = plain
first_valid_uid = 2000
first_valid_gid = 2000
mail_location = maildir:/var/vmail/%d/%n
mail_plugin_dir = /usr/local/lib/dovecot
mbox_write_locks = fcntl
mmap_disable = yes
#------------------------------------------------------------------#
# Filesystem IMAP
#------------------------------------------------------------------#
namespace inbox {
inbox = yes
location =
mailbox Archive {
auto = subscribe
special_use = \Archive
}
mailbox Drafts {
auto = subscribe
special_use = \Drafts
}
mailbox Junk {
auto = subscribe
special_use = \Junk
}
mailbox Sent {
auto = subscribe
special_use = \Sent
}
mailbox Trash {
auto = subscribe
special_use = \Trash
}
prefix =
}
#------------------------------------------------------------------#
# User Credentials
#------------------------------------------------------------------#
passdb {
args = scheme=CRYPT username_format=%u /etc/mail/credentials
driver = passwd-file
name =
}
service imap-login {
inet_listener imap {
port = 0
}
}
#------------------------------------------------------------------#
# Listen - Identity SSL
#------------------------------------------------------------------#
ssl_cert = </etc/ssl/mail.crt
ssl_key = </etc/ssl/private/mail.key
#------------------------------------------------------------------#
# User Database
#------------------------------------------------------------------#
userdb {
args = username_format=%u /etc/mail/credentials
driver = passwd-file
name =
}
alfree$
[Blocco 49-53 | Credenziali Utente] Viene definito lo specifico driver da utilizzare per l’autenticazione “passwd-file”, quindi esplicitamente il metodo di autenticazione è a credenziali. Al driver vengono passati i parametri indispensabili per svolgere la verifica di esistenza della coppia user/passwd, ossia dove si trova su filesystem il file passwd, l’utenza che sta tentanto di autenticarsi (username_format=%u) ed infine in che modo la password è memorizzata all’interno dello store (CRYPT = in forma cifrata)
[Blocco 70-74 | Database Utente] Viene definito lo specifico driver da utilizzare “passwd-file” per identificare il Database Utente, in cui son memorizzate le sue mail. Al driver vengono passati come parametri indispensabili per svolgere tale compito, ossia dove si trova su filesystem il file passwd, l’utenza da ricercare.
Come è possibile subito notare, i parametri : userdb e passwd utilizzano il medesimo driver e medesimo file target, questo perchè abbiamo deciso di utilizzare un unico store nel formato passwd per memorizzare user-id, password e database.
[Blocco 64-65 | Listen – Identity SSL] Identità Privata/CertificatoX.509 per la configurazione SSL del Listenet del server IMAP. In questo esempio, viene utilizzata la stessa identità sia per OpenSMTP che per Dovecot. Nulla ci vieta di averne due separate nel caso risiedano, anche se non ne avverto l’esigenza di farlo.
[Blocco 14-44 | MailBox IMAP – Filesystem] Struttura a directory del filesystem IMAP
Co-proprietà di /etc/mail/credentials tra OpenSMTP e Dovecot
Il file di credenziali (/etc/mail/credentials) è condiviso sia dall’OpenSMTP e sia da Dovecot, sicchè è necessario applicare l’ownership in qualche modo ad entrambi gli utenti che fan girare questi due server. Attualmente l’owner è di OpenSMTP (_smtpd:_smtpd).
alfree$ ls -la /etc/mail/credentials
-r--r----- 1 _smtpd _smtpd 180 Nov 25 02:26 /etc/mail/credentials
La comproprietà del file si risolve impostando come gruppo proprietario quello di dovecot
alfree$ doas chgrp _dovecot /etc/mail/credentials
alfree$ ls -la /etc/mail/credentials
-r--r----- 1 _smtpd _dovecot 180 Nov 25 02:26 /etc/mail/credentials
Ora, possiamo prima abilitare il servizio, in modo tale che venga avviato al reboot della macchina, e poi avviarlo a mano. Se l’avvio dovesse restituire un errore di fallimento generico, rieseguire il comando direttamente (doas dovecot) per avere un’evidenza di dettaglio del problema, quasi sempre relativo a qualche parametro di configurazione (ad esempio un file referenziato non trovato o non accessibile per problemi di permessi)
alfree$ doas rcctl enable dovecot
alfree$ doas rcctl start dovecot
Test#1 — Verifica di esistenza di un’utenza (casella)
Questo primo test ci permette di verificare che dovecot riesca ad accedere correttamente al file delle credenziali (/etc/mail/credentials), che dovrà aprire il lettura per il controllo di esistenza dell’utente fornito.
Se l’utente trovato, l’admin restituisce i suoi attributi, ossia mailbox ed home (al momento non mi è chiara la differenza visto che sono valorizzati con identico valore), owner della mailbox.
# Ricerca di un utente esistente
alfree$ doas doveadm user info@granito.org.uk
field value
uid 2000
gid 2000
home /var/vmail/granito.org.uk/info
mail maildir:/var/vmail/granito.org.uk/info
# Ricerca di un utente inesistente
alfree$ doas doveadm user pingopallino@granito.org.uk
userdb lookup: user pingopallino@granito.org.uk doesn't exist
field value
# Ricerca di un utente esistente, non avendoci però i diritti per accedere al file delle credenziali
alfree$ doveadm user info@granito.org.uk
Error: net_connect_unix(/var/dovecot/stats-writer) failed: Permission denied
doveadm(info@granito.org.uk)<99147><>: Error: auth-master: userdb lookup(info@granito.org.uk): Auth USER lookup failed
field value
alfree$
Test#2 — Test di Autenticazione (impostato metodo a credenziali)
Questa test ci permette di verificare che la configurazione applicata, relativa all’autenticazione è corretta, oltre a verificare l’autheticazione stessa, cioè dell’esistenza della coppia user/password.
Se l’utente trovato, l’admin restituisce i suoi attributi, ossia mailbox ed home (al momento non mi è chiara la differenza visto che sono valorizzati con identico valore), owner della mailbox ed auth_mech (anche qui il PLAIN non mi è chiaro a cosa si riferisce, probabilmente all’invio della password nella fase di autenticazione, visto che l’attributo è assende nel precedente test di semplice verifica di esistenza dell’utente ).
alfree$ doas doveadm auth login info@granito.org.uk
Password: *****************************
passdb: info@granito.org.uk auth succeeded
extra fields:
user=info@granito.org.uk
userdb extra fields:
info@granito.org.uk
mail=maildir:/var/vmail/granito.org.uk/info
uid=2000
gid=2000
home=/var/vmail/granito.org.uk/info
auth_mech=PLAIN
alfree$
Continua………….