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:
sudo 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 SpamAssasin è terminata.