Selfhostare un server mail con Mailcow

Questo articolo illustra come utilizzare Mailcow per gestire un server di posta personale. Vengono forniti dettagli su come impostare il server, gestire i certificati SSL e creare caselle di posta per utenti e team, garantendo un controllo totale sulle proprie email.

  ·   10 min read

Mailcow è una suite software open source progettata per semplificare la gestione di un server di posta elettronica. Combina tutti i componenti chiave - Postfix, Dovecot, SOGo (webmail), antivirus e altro - e fornisce un’interfaccia web pulita per gestire utenti, domini e caselle di posta.

Inoltre, il contenuto delle mail è criptato sul server, come emerge dalla guida ufficiale, dalla quale si legge che mails are stored compressed (lz4) and encrypted. The key pair can be found in crypt-vol-1.

Prerequisiti #

Sono necessari alcuni prerequisiti e precisamente:

  • Un server o una VM accessibile via SSH e con Docker installato. Un VPS puó essere acquistato, ad esempio, da Contabo
  • Un indirizzo IP statico che non sia stato inserito in una qualche blacklist
  • Un nome di dominio valido, acquistabile da diversi provider, come OVH
  • Conoscenza di base dei protocolli email, come SMTP, IMAP4 e POP3
  • Familiarità con i record DNS, in particolare coi record MX, SPF, DKIM e DMARC

Per la configurazione di un VPS, é consigliata la lettura dell’articolo Mettere in sicurezza un VPS

Record DNS #

La sigla DNS sta per Domain Name System, sistema dei nomi di dominio. Si tratta in sostanza della rubrica telefonica del web in cui i domini sono organizzati e identificati. Così come una rubrica telefonica traduce un nome come Pizzeria da Gigi nel numero di telefono da chiamare, il DNS traduce un indirizzo web come www.novemila.org nell’indirizzo IP assegnato al dispositivo che ospita la risorsa.

Ad un nome DNS possono corrispondere diversi tipi di informazioni. Per questo motivo, esistono diversi tipi di record, ognuno con uno scopo specifico:

  • Tipo A (Address Record): associa un nome di dominio a un indirizzo IPv4, un processo noto come DNS lookup
  • Tipo AAAA (Address Record): simile al tipo A, ma associa un nome di dominio a un indirizzo IPv6
  • Tipo MX (Mail Exchange Record): indica il server di posta autorizzato a ricevere email per un determinato dominio
  • Tipo CNAME (Canonical Name Record): associa un nome di dominio canonico a un alias. Ad esempio, blog.example.com potrebbe essere collegato a example.com
  • Tipo PTR (Pointer Record): utilizzato per la reverse DNS lookup, associa un indirizzo IP a un nome di dominio
  • Tipo TXT: associa una stringa di testo a un dominio. I record TXT sono spesso utilizzati per configurazioni relative alla posta elettronica, come SPF, DKIM e DMARC, per migliorare la sicurezza e l’autenticità delle comunicazioni email

Record MX #

I record MX indicano al protocollo SMTP quale sia il server deputato a ricevere il messaggio di posta elettronica per un dominio specifico. Per individuare dove sia localizzato il destinatario della email, infatti, il protocollo interroga il sistema DNS affinché fornisca l’indirizzo esatto dove poter recapitare il messaggio. Un comando per verificare quali siano i server autorizzati per un dominio é il seguente:

dig tutanota.com MX

;; ANSWER SECTION:
tutanota.com.		600	IN	MX	0 mail.tutanota.de.

Record SPF #

SPF (Sender Policy Framework) è un record TXT che dichiara quali sono gli indirizzi IP autorizzati ad inviare email per un dominio.

In pratica, il record SPF consente ai destinatari di verificare la validità delle email ricevute, contribuendo a prevenire lo spoofing e l’invio di email di phishing. Lo spoofing é una tecnica di attacco informatico che consiste nella creazione di email con indirizzo del mittente contraffatto. Viene comunemente usata per email spam e phishing al fine di ingannare il destinatario circa l’origine del messaggio.

Record DKIM #

Il DKIM (DomainKeys Identified Mail) è un sistema che consente di firmare digitalmente i messaggi in uscita dai server SMTP. Questa firma digitale permette ai destinatari di verificare l’autenticità del mittente e la provenienza del messaggio, contribuendo così a garantire l’integrità delle comunicazioni via email.

Il funzionamento del DKIM si basa sulla crittografia asimmetrica, che utilizza una coppia di chiavi: una privata e una pubblica. La chiave privata è mantenuta segreta dal proprietario del dominio e viene utilizzata per firmare digitalmente le email inviate. La chiave pubblica è pubblicata nel record TXT del dominio e consente ai server di posta dei destinatari di verificare la validità della firma digitale.

Record DMARC #

Il DMARC (Domain-based Message Authentication, Reporting & Conformance) consente al proprietario del dominio di definire una policy che istruisce i provider di servizi di posta su come gestire le email che non superano i controlli SPF e DKIM.

Per ulteriori informazioni, visitare la pagina SPF DKIM DMARC

UFW #

Per prima cosa, sul server é necessario aprire le seguenti porte:

ufw allow 25,443,465,587,993,4190/tcp

In particolare:

  • 25: questa è la porta standard per SMTP. È utilizzata per l’invio di email senza crittografia, il che significa che le informazioni vengono trasmesse in chiaro
  • 443: utilizzata per il traffico HTTPS
  • 465: questa porta è utilizzata per SMTPS (SMTP Secure), che implementa la crittografia tramite TLS (Transport Layer Security)
  • 587: questa porta è utilizzata per SMTP con il comando STARTTLS, che consente di avviare una connessione sicura utilizzando TLS
  • 993: utilizzata per la ricezione di email tramite IMAP, con crittografia garantita da certificati SSL/TLS
  • 4190: utilizzata per la gestione delle regole di filtraggio delle email tramite il protocollo Sieve, consentendo agli utenti di configurare filtri e azioni automatiche sulle loro caselle di posta

DNS setup #

Attraverso il pannello del provider da cui abbiamo acquistato il dominio, è necessario creare i seguenti record DNS:

# Name              Type       Value
mail                IN A       ${IP_ADDRESS}
autodiscover        IN CNAME   mail.novemila.org. (${MAILCOW_HOSTNAME})
autoconfig          IN CNAME   mail.novemila.org.
@                   IN MX 10   mail.novemila.org.

I record CNAME autodiscover e autoconfig consentono ai client di posta di trovare automaticamente le impostazioni del server, evitando configurazioni manuali da parte dell’utente.

SPF, DMAC e DKIM #

@                   IN TXT     "v=spf1 mx a -all"
_dmarc              IN TXT     "v=DMARC1; p=reject; rua=mailto:reports@novemila.org"
dkim._domainkey     IN TXT     # Da generare successivamente, durante il setup di Mailcow

Nello specifico, il record MX indica che il server di posta mail.novemila.org è responsabile della ricezione delle email per il dominio novemila.org, con una priorità di 10. "v=spf1 mx a -all" consente esclusivamente ai server di posta elencati nei record MX e agli indirizzi IP associati ai record A del dominio di inviare email per questo dominio. -all indica che qualsiasi altro server non specificato nei precedenti record non è autorizzato a inviare email per questo dominio. Il segno meno (-) indica un rifiuto rigoroso, quindi i messaggi provenienti da server non autorizzati devono essere scartati.

Reverse DNS #

Il record PTR deve corrispondere al ${MAILCOW_HOSTNAME}, in questo caso mail.novemila.org. Questa impostazione di trova solitamente nel pannello di amministrazione del provider da cui abbiamo acquistato il VPS o il dominio.

nslookup 95.111.234.107

107.234.111.95.in-addr.arpa name = mail.novemila.org.

Configurazione avanzata #

Per una configurazione avanzata, fare riferimento a The advanced DNS configuration.

# Name              Type       Priority Weight Port    Value
_autodiscover._tcp  IN SRV     10        1      443      mail.novemila.org. 
_imaps._tcp         IN SRV     10        1      993      mail.novemila.org.
_sieve._tcp         IN SRV     10        1      4190     mail.novemila.org.
_smtps._tcp         IN SRV     10        1      465      mail.novemila.org.
_submission._tcp    IN SRV     10        1      587      mail.novemila.org.
_submissions._tcp   IN SRV     10        1      465      mail.novemila.org.

Installazione di Mailcow #

Innanzitutto, occorre installare Docker e Docker Compose, seguendo la procedura ufficiale. Per l’installazione di Mailcow, collegarsi al VPS via SSH e seguire i seguenti passaggi:

sudo -i

umask
0022 # <- Verificare che sia 0022
cd /opt
git clone https://github.com/mailcow/mailcow-dockerized
cd mailcow-dockerized

Eseguire quindi lo script ./generate_config.sh per generare il file di configurazione. Utilizzare ${MAILCOW_HOSTNAME} come hostname quando richiesto.

Editare il file mailcow.conf per modifica la configurazione se necessario. Le uniche modifiche che abbiamo apportato sono le seguenti:

# ------------------------------
# mailcow web ui configuration
# ------------------------------
MAILCOW_HOSTNAME=mail.novemila.org
HTTP_PORT=3020
HTTP_BIND=127.0.0.1
HTTPS_PORT=8443
HTTPS_BIND=127.0.0.1

# Obtain certificates for autodiscover.* and autoconfig.* domains.
# This can be useful to switch off in case you are in a scenario where a reverse proxy already handles those.
# There are mixed scenarios where ports 80,443 are occupied and you do not want to share certs
# between services. So acme-mailcow obtains for maildomains and all web-things get handled
# in the reverse proxy.
AUTODISCOVER_SAN=n

# Additional server names for mailcow UI
#
# Specify alternative addresses for the mailcow UI to respond to
# This is useful when you set mail.* as ADDITIONAL_SAN and want to make sure mail.maildomain.com will always point to the mailcow UI.
# If the server name does not match a known site, Nginx decides by best-guess and may redirect users to the wrong web root.
# You can understand this as server_name directive in Nginx.
# Comma separated list without spaces! Example: ADDITIONAL_SERVER_NAMES=a.b.c,d.e.f
ADDITIONAL_SERVER_NAMES=novemila.org
# Skip running ACME (acme-mailcow, Let's Encrypt certs) - y/n
SKIP_LETS_ENCRYPT=y
ALLOW_ADMIN_EMAIL_LOGIN=n
USE_WATCHDOG=n
IPV4_NETWORK=172.40.1

Se si utilizza un reverse proxy, come Caddy, si consiglia di associare HTTPS all’indirizzo 127.0.0.1 (localhost) su una porta a scelta, come la 3020, e HTTP a 127.0.0.1 su una porta a scelta, come la 8080. È fondamentale non utilizzare le porte 8081, 9081, 9082 o 65510, poiché queste porte sono riservate o potrebbero causare conflitti con altri servizi.

Inoltre, è possibile disabilitare tutti i container e i servizi non utilizzati e non necessari. Nel nostro caso, poiché non utilizziamo IPv6 e abbiamo scelto Caddy come reverse proxy per la gestione dei certificati, abbiamo disabilitato i container acme-mailcow, ipv6nat-mailcow e watchdog-mailcow, semplicemente commentandoli nel file docker-compose.yml.

Per disabilitare IPv6, basta seguire la procedura ufficiale.

Tutti i file di configurazione si trovano su Gitea.

Nel caso di problemi con la risoluzione dei nomi dal container Postfix, occorre usare un resolver esterno, seguendo la documentazione Using an external DNS service

Configurazione di Caddy #

Aggiungere le seguenti righe nel file /etc/caddy/Caddyfile:

# MAILCOW

mail.novemila.org autodiscover.novemila.org autoconfig.novemila.org {
	log {
		output file /var/log/caddy/mail.novemila.org.log {
			roll_disabled
			roll_size 512M
			roll_uncompressed
			roll_local_time
			roll_keep 3
			roll_keep_for 48h
		}
	}

	reverse_proxy 127.0.0.1:3020
}

Inoltre, in /etc/opt/mailcow-dockerized, creare lo script deploy-certs.sh:

#!/bin/bash
MAILCOW_HOSTNAME=mail.novemila.org
CADDY_CERTS_DIR=/var/lib/caddy/.local/share/caddy/certificates/acme-v02.api.letsencrypt.org-directory
MD5SUM_CURRENT_CERT=($(md5sum /opt/mailcow-dockerized/data/assets/ssl/cert.pem))
MD5SUM_NEW_CERT=($(md5sum $CADDY_CERTS_DIR/$MAILCOW_HOSTNAME/$MAILCOW_HOSTNAME.crt))

if [ $MD5SUM_CURRENT_CERT != $MD5SUM_NEW_CERT ]; then
        cp $CADDY_CERTS_DIR/$MAILCOW_HOSTNAME/$MAILCOW_HOSTNAME.crt /opt/mailcow-dockerized/data/assets/ssl/cert.pem
        cp $CADDY_CERTS_DIR/$MAILCOW_HOSTNAME/$MAILCOW_HOSTNAME.key /opt/mailcow-dockerized/data/assets/ssl/key.pem
        postfix_c=$(docker ps -qaf name=postfix-mailcow)
        dovecot_c=$(docker ps -qaf name=dovecot-mailcow)
        nginx_c=$(docker ps -qaf name=nginx-mailcow)
        docker restart ${postfix_c} ${dovecot_c} ${nginx_c}

else
        echo "Certs not copied from Caddy (Not needed)"
fi

Poiché Caddy gestisce i certificati autonomamente, questo script include i certificati generati da Caddy in mailcow. Potrebbe essere eseguito come un cronjob ogni ora:

0 * * * * /bin/bash /path/to/script/deploy-certs.sh >/dev/null 2>&1

Si consiglia di testarne prima l’esecuzione ./deploy-certs.sh.

Se tutto é andato a buon fine, riavviare caddy col comando systemctl restart caddy.service.

Avvio dei container #

Per avviare lo stack, eseguire i seguenti comandi:

docker-compose pull  
docker-compose up -d  

Ora che il server Mailcow è attivo e funzionante, è il momento di configurarlo per gestire effettivamente le email. Prima di tutto, accedere all’interfaccia di amministrazione di Mailcow, attraverso l’url https://${MAILCOW_HOSTNAME}/admin

Verrà chiesto di accedere utilizzando le credenziali predefinite:

admin
moohoo

che sono da cambiare immediatamente.

Gli utenti che utilizzano le caselle di posta elettronica possono continuare a effettuare il login utilizzando l’URL standard, https://${MAILCOW_HOSTNAME}.

mailcow-login

Configurazione di Mailcow #

Aggiunta di un dominio #

Con l’accesso amministrativo, aggiungere il proprio dominio, nel nostro caso novemila.org. Una volta aggiunto, cliccare sul pulsante Add domain and restart SOGo.

mailcow-add-domain

mailcow-add-domain

mailcow-add-domain

Generare le chiavi DKIM #

mailcow-dkim

Una volta generata la chiave, bisogna copiarla e creare il seguente record TXT dal pannello di configurazione del proprio dominio:

dkim._domainkey IN TXT "****"

Creazione mailbox #

Da Mail Setup > Mailboxes nella dashboard di Mailcow, sará possibile aggiungere le nuove caselle di posta.

mailcow-mailbox

Ovviamente, sará possibile aggiungere tutte le caselle di posta di cui si ha bisogno, sia per se stessi che per altre persone.

Creazione di alias e filtri #

Una volta effettuato il login, sarà possibile creare degli alias, anche a scadenza, per la propria casella di posta. Gli alias sono indirizzi email alternativi che reindirizzano i messaggi alla casella principale. Questa funzionalità è utile per gestire meglio le comunicazioni, filtrare le email in arrivo e sopratutto per mantenere la propria privacy: utilizzando alias temporanei, è possibile evitare di condividere il proprio indirizzo email principale con terze parti.

alias-mail

É possibile infine creare dei filtri personalizzati dalle preferenze del proprio account:

mailcow-filter

Testing #

Per verificare che tutto sia impostato correttamente, esistono diversi tool:

email-testing-tool

Configurazione MUA #

Il MUA (Mail User Agent) è l’applicazione utilizzata dagli utenti per inviare e ricevere email. Può essere accessibile tramite un browser web oppure tramite applicazioni installate localmente, come Thunderbird.

Per configurare Thunderbird, seguire la pagina dedicata Setup Mozilla Thunderbird. Purtroppo, la versione mobile non supporta l’autodiscover. All’indirizzo del server, bisognerá inserire ${MAILCOW_HOSTNAME}, nel nostro caso mail.novemila.org, sia per il server in entrata che per quello in uscita:

thunderbird-config

Alternativa #

Una alternativa a Mailcow portrebbe essere Stalwart.

Riferimenti #