Introduzione

In questo tutorial installeremo e configureremo un server di posta (Mail Server) utilizzando Postfix, Dovecot, MySQL e SpamAssassin su Ubuntu 18.04 LTS.

Prerequisiti

Prima di configurare il server di posta, è necessario rispettare i seguenti prerequisiti:

  • Il dominio che utilizzi punta correttamente al tuo server.
  • MySQL installato e configurato (Se MySQL non è installato, consiglio di seguire questa semplice guida.)
  • Utente con privilegi di root (In questa guida utilizzeremo l'utente root)

Facoltativo: Certificati SSL. In questa guida utilizzerò i certificati ottenuti con Let's Encrypt. È possibile utilizzare i certificati SSL generati per i Web Server, come Apache o Nginx.

Per generare i certificati SSL con Let's Encrypt, segui queste guide:
Generare Certificati SSL Per Nginx
Generare Certificati SSL Per Apache

Configurare e identificare il tuo FQDN (Fully Qualified Domain Name)

Un hostname è un'etichetta assegnata a un computer connesso ad Internet e utilizzato per identificare la macchina all'interno di una rete interna. Gli hostname sono importanti anche perché fanno parte del Fully Qualified Domain Name (FQDN) di un computer. Assegnare un FQDN a un computer lo rende raggiungibile tramite il Domain Name System (DNS) pubblico, ovvero Internet.

L'hostname è il nome da associare al server, potete usare quello che volete.

Impostare o modificare l' hostname da terminale, dare questo comando:
hostnamectl set-hostname tuohostname

Semrpe da terminale aprire il file hosts:
nano /etc/hosts

Modificare il file hosts in modo che assomigli al seguente. Sostituire tuohostname, dominio, tld e TuoIP con i tuoi dati.

127.0.0.1     localhost
127.0.1.1     tuohostname.esempio.it tuohostname
TuoIP         tuohostname.esempio.it tuohostname

Salvare e chiudere il file.

Per controllare l'hostname, da terminale scrivere:
hostname

Per controllare il dominio, da terminale:
hostname -d

Per controllare l'FQDN, da terminale:
hostname -f

Risultato:

tuohostname.esempio.it

Potrebbe essere necessario riavviare il server.

Installare Postfix e Dovecot

Da terminale:
apt install postfix postfix-mysql dovecot-core dovecot-imapd dovecot-lmtpd dovecot-mysql

Durante l'installazione Postfix ci chiederà il tipo di configurazione della posta. Selezionare Internet Site

Successivamente dovremo inserire, se non è già presente, il nostro FQDN

System mail name:
tuohostname.esempio.it

Configurazione MySQL

Creare un database MySQL per configurare tre diverse tabelle: una per i domini, una per gli utenti e l'ultima per gli alias.

Chiameremo il nostro database maildb. Puoi usare qualunque nome tu voglia.

Creare il database maildb:
mysqladmin -p create maildb

Effettuare il login in MySQL come root:
mysql -u root -p

Creare un nuovo utente per il database maildb:
GRANT SELECT ON maildb.* TO 'usermail'@'127.0.0.1' IDENTIFIED BY 'password';

Effettuare un refresh dei privilegi MySQL per applicare correttamente i permessi:
FLUSH PRIVILEGES;

Selezionare il nostro database:
USE maildb;

Creare una tabella per i domini riconosciuti come domini autorizzati:

CREATE TABLE `virtual_domains` (
`id`  INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Creare una tabella per gli utenti aggiungendo l'indirizzo email e le password e associare ciascun utente ad un dominio:

CREATE TABLE `virtual_users` (
`id` INT NOT NULL AUTO_INCREMENT,
`domain_id` INT NOT NULL,
`password` VARCHAR(106) NOT NULL,
`email` VARCHAR(120) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `email` (`email`),
FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Creare una terza tabella per gli alias virtuali per specificare le email da inoltrare all'altra email:

CREATE TABLE `virtual_aliases` (
`id` INT NOT NULL AUTO_INCREMENT,
`domain_id` INT NOT NULL,
`source` varchar(100) NOT NULL,
`destination` varchar(100) NOT NULL,
PRIMARY KEY (`id`),
FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Domini Virtuali

Aggiungere i domini nella tabella virtual_domains. Puoi aggiungere tutti i domini che desideri, ma in questo tutorial introdurremo solo il dominio principale (esempio.it) e l'FQDN (tuohostname.esempio.it).

INSERT INTO `maildb`.`virtual_domains`
(`id` ,`name`)
VALUES
('1', 'esempio.it'),
('2', 'tuohostname.esempio.it');

Email Virtuali

Aggiungere l'indirizzo email e le password associate per ciascun dominio. Assicurati di cambiare tutte le informazioni con le tue informazioni specifiche.

INSERT INTO `maildb`.`virtual_users`
(`id`, `domain_id`, `password` , `email`)
VALUES
('1', '1', ENCRYPT('password1', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), '[email protected]'),
('2', '1', ENCRYPT('password2', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), '[email protected]');

Alias Virtuali

Aggiungere l'indirizzo email (fonte) che stiamo per inoltrare all'altro indirizzo email (destinazione).

INSERT INTO `maildb`.`virtual_aliases`
(`id`, `domain_id`, `source`, `destination`)
VALUES
('1', '1', '[email protected]', '[email protected]');

Usire da MySQL:
exit

Configurare Postfix

Configureremo Postfix per gestire le connessioni SMTP e inviare i messaggi per ogni utente introdotto nel database MySQL.

Creare una copia del file predefinito nel caso si desideri ripristinare le configurazioni di default:
cp /etc/postfix/main.cf /etc/postfix/main.cf.orig

Apriamo il file da modificare:
nano /etc/postfix/main.cf

Commentiamo o aggiungiamo i parametri TLS necessari:

# TLS parameters
#smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
#smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
#smtpd_use_tls=yes
#smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
#smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache 
smtpd_tls_cert_file=/etc/letsencrypt/live/esempio.it/fullchain.pem
smtpd_tls_key_file=/etc/letsencrypt/live/esempio.it/privkey.pem
smtpd_use_tls=yes
smtpd_tls_auth_only = yes

Successivamente aggiungere le seguenti righe, dopo i parametri TLS:

smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination

Commentare mydestination di default e aggiungere il nostro:

#mydestination = $myhostname, tuohostname.esempio.it, localhost.esempio.it, localhost
mydestination = localhost 

Verificare il parametro myhostname, deve essere impostato con l'FQDN:

myhostname = tuohostname.esempio.it

Aggiungere le seguenti righe per il recapito della posta locale e per far interagire Postfix con i domini virtuali, utenti e alias:

virtual_transport = lmtp:unix:private/dovecot-lmtp
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf

Salvare e chiudere il file.

Creare tre file che assoceremo al file main.cf per permettere a Postfix di connettersi a MySQL:
nano /etc/postfix/mysql-virtual-mailbox-domains.cf

Aggiungere i vostri parametri:

user = usermail
password = password
hosts = 127.0.0.1
dbname = maildb
query = SELECT 1 FROM virtual_domains WHERE name='%s'

Salvare e chiudere il file.

Riavviare Postfix:
service postfix restart

Verificare se Postfix trova il dominio corretto, questo comando dovrebbe ritornare il valore 1:
postmap -q esempio.it mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf

Creare il secondo file:
nano /etc/postfix/mysql-virtual-mailbox-maps.cf

Aggiungere i vostri parametri:

user = usermail
password = password
hosts = 127.0.0.1
dbname = maildb
query = SELECT 1 FROM virtual_users WHERE email='%s'

Salvare e chiudere il file.

Riavviare Postfix:
service postfix restart

Verificare che Postfix trovi il primo indirizzo email, questo comando dovrebbe ritornare il valore 1:
postmap -q [email protected] mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf

Creare il terzo file:
nano /etc/postfix/mysql-virtual-alias-maps.cf

Aggiungere i vostri parametri:

user = usermail
password = password
hosts = 127.0.0.1
dbname = maildb
query = SELECT destination FROM virtual_aliases WHERE source='%s'

Salvare e chiudere il file.

Riavviare Postfix:
service postfix restart

Verificare che Postfix trovi gli alias, questo comando dovrebbe ritornare il valore 1:
postmap -q [email protected] mysql:/etc/postfix/mysql-virtual-alias-maps.cf

Se si vuole abilitare la porta 587 per connettersi in modo sicuro con i client email è necessario modificare il file master.cf:
nano /etc/postfix/master.cf

Commentare le seguenti righe e aggiungere quelle mancanti:

submission inet n       -       -       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject

ATTENZIONE agli spazi, se le righe non sono formattate nel modo corretto Postfix potrebbe non funzionare correttamente.

Riavviare Postfix:
service postfix restart

Configurare Dovecot

Creare una copia dei successivi 7 file per poter ripristinare i valori di default nel caso fosse necessario.
Inserire i seguenti comandi uno alla volta:

cp /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf.orig
cp /etc/dovecot/conf.d/10-mail.conf /etc/dovecot/conf.d/10-mail.conf.orig
cp /etc/dovecot/conf.d/10-auth.conf /etc/dovecot/conf.d/10-auth.conf.orig
cp /etc/dovecot/dovecot-sql.conf.ext /etc/dovecot/dovecot-sql.conf.ext.orig
cp /etc/dovecot/conf.d/10-master.conf /etc/dovecot/conf.d/10-master.conf.orig
cp /etc/dovecot/conf.d/10-ssl.conf /etc/dovecot/conf.d/10-ssl.conf.orig

Aprire il seguente file:
nano /etc/dovecot/dovecot.conf

Verificare che la seguente riga non sia commentata:

!include conf.d/*.conf

Abilitare i protocolli imap e lmtp (se necessario è possibile aggiungere anche pop3) sotto !include_try /usr/share/dovecot/protocols.d/*.protocol line:

!include_try /usr/share/dovecot/protocols.d/*.protocol
protocols = imap lmtp

Salvare e chiudere il file.

Aprire il prossimo file:
nano /etc/dovecot/conf.d/10-mail.conf

Trovare il parametro mail_location, decommentarlo e cambiare il valore in questo modo:

mail_location = maildir:/var/mail/vhosts/%d/%n

Trovare il parametro mail_privileged_group, decommentarlo e cambiare il valore in questo modo:

mail_privileged_group = mail

Salvare e chiudere il file.

Cambiare i permessi

Creare una cartella per ogni dominio che aggiungiamo nella tabella di MySQL:
mkdir -p /var/mail/vhosts/esempio.it

Creare l'utente e il gruppo vmail con id 5000:
groupadd -g 5000 vmail

useradd -g vmail -u 5000 vmail -d /var/mail

Cambiamo il proprietario della cartella /var/mail:
chown -R vmail:vmail /var/mail

Modifichiamo il seguente file:
nano /etc/dovecot/conf.d/10-auth.conf

Decommentare e modificare la seguente riga in questo modo:

disable_plaintext_auth = yes

Modificare il seguente parametro auth_mechanisms:

auth_mechanisms = plain login

Commentare questa riga:

#!include auth-system.conf.ext

Decommentare questa riga per abilitare l'autorizzazione di MySQL:

!include auth-sql.conf.ext

Salvare e chiudere il file.

Creare un nuovo file dove inserire le informazione di autenticazione:
nano /etc/dovecot/conf.d/auth-sql.conf.ext

Modificare o aggiungere le seguenti righe:

passdb {
  driver = sql
  args = /etc/dovecot/dovecot-sql.conf.ext
}
userdb {
  driver = static
  args = uid=vmail gid=vmail home=/var/mail/vhosts/%d/%n
}

Salvare e chiudere il file.

Aprire il seguente file:
nano /etc/dovecot/dovecot-sql.conf.ext

Decommentare il parametro driver e aggiungere il valore mysql:

driver = mysql

Decommentare il parametro connect ed inserire i propri parametri:

connect = host=127.0.0.1 dbname=maildb user=usermail password=password

Decommentare il parametro default_pass_scheme e cambiare il valore:

default_pass_scheme = SHA512-CRYPT

Decommentare il parametro password_query e cambiare il valore:

password_query = SELECT email as user, password FROM virtual_users WHERE email='%u';

Cambiare il proprietario e il gruppo della cartella dovecot all'user vmail:
chown -R vmail:dovecot /etc/dovecot

chmod -R o-rwx /etc/dovecot

Aprire il seguente file (attenzione alle modifiche, controllare riga per riga):
nano /etc/dovecot/conf.d/10-master.conf

Modificare o aggiungere le seguenti righe:

##Uncomment inet_listener_imap and modify to port 0
service imap-login {
  inet_listener imap {
    port = 0
}

#Create LMTP socket and this configurations
service lmtp {
   unix_listener /var/spool/postfix/private/dovecot-lmtp {
	   mode = 0600
	   user = postfix
	   group = postfix
   }
  #inet_listener lmtp {
    # Avoid making LMTP visible for the entire internet
    #address =
    #port =
  #}
} 

Modificare il parametro service auth:

service auth {

  unix_listener /var/spool/postfix/private/auth {
  mode = 0666
  user = postfix
  group = postfix
  }

  unix_listener auth-userdb {
  mode = 0600
  user = vmail
  #group =
  }

  #unix_listener /var/spool/postfix/private/auth {
  # mode = 0666
  #}

  user = dovecot
}

Modificare il parametro service auth-worker:

service auth-worker {
  # Auth worker process is run as root by default, so that it can access
  # /etc/shadow. If this isn't necessary, the user should be changed to
  # $default_internal_user.
  user = vmail
}

Salvare e chiudere il file.

Apriamo e modifichiamo le configurazioni SSL di Dovecot:
nano /etc/dovecot/conf.d/10-ssl.conf

Cambiare il seguente parametro:

ssl = required

Modificare il percorso dei certificati SSL:

ssl_cert = </etc/letsencrypt/live/esempio.it/fullchain.pem
ssl_key = </etc/letsencrypt/live/esempio.it/privkey.pem

Salvare e chiudere il file.

Riavviare Dovecot:
service dovecot restart

Verificare lo stato di Dovecot e Postfix.
service dovecot status
service postfix status

Verificare se la porta 993 è aperta e funzionante (se avete abilitato pop3, verificare anche la porta 995:
telnet esempio.it 993

Configurare SpamAssassin

Per installare SpamAssassin da terminale:
apt install spamassassin spamc

Creare un utente per SpamAssassin:
adduser spamd --disabled-login

Apriamo il seguente file:
nano /etc/default/spamassassin

Modificare il il parametro ENABLE:

ENABLED=1

Modificare il parametro home:

SPAMD_HOME="/home/spamd/"
OPTIONS="--create-prefs --max-children 5 --username spamd --helper-home-dir ${SPAMD_HOME} -s ${SPAMD_HOME}spamd.log" 

Modificare il parametro PID_File:

PIDFILE="${SPAMD_HOME}spamd.pid"

Modificare il parametro CRON per fare in modo che SpamAssassin si aggiorni da solo:

CRON=1

Salvare e chiudere il file.

Aprire il seguente file per impostare le regole anti-spam:
nano /etc/spamassassin/local.cf

SpamAssassin per ogni mail determina se è superiore a 5.0 nel controllo spam, in tal caso, verrà automaticamente considerata spam:

Modificare o aggiungere i seguenti parametri:

rewrite_header Subject ***** SPAM *****
report_safe             0
required_score          5.0
use_bayes               1
use_bayes_rules         1
bayes_auto_learn        1
skip_rbl_checks         0
use_razor2              0
use_dcc                 0
use_pyzor               0

Salvare e chiudere il file.

Modifichiamo il file principale di Postfix per farlo interagire con SpamAssassin:
nano /etc/postfix/master.cf

Sotto la riga:

smtp      inet  n       -       -       -       -       smtpd

Aggiungere:

    -o content_filter=spamassassin

Quindi:

smtp      inet  n       -       -       -       -       smtpd
    -o content_filter=spamassassin

Alla fine del file aggiungere queste righe:

spamassassin unix -     n       n       -       -       pipe
  user=spamd argv=/usr/bin/spamc -f -e
  /usr/sbin/sendmail -oi -f ${sender} ${recipient}

ATTENZIONE agli spazi, se le righe non sono formattate nel modo corretto Postfix potrebbe non funzionare correttamente.

Salvare e chiudere il file.

Avviamo SpamAssassin e riavviamo Postfix:
service spamassassin start
service postfix restart

Controllare lo stato di SpamAssassin e di Postfix:
service spamassassin status
service postfix status

L'installazione e la configurazione di Postfix, Dovecot, MySQL e SpamAssassin su Ubuntu 18.04 LTS è terminata.