[howto] Debian 7.0 “Wheezy”: mail server con Postfix, Dovecot e mySql (parte 1)
Installazione dei pacchetti
Dopo aver completato l’installazione base di Debian 7 – ssh server e pacchetti di base in tasksel – eseguire
apt-get install postfix postfix-mysql dovecot-core dovecot-imapd dovecot-pop3d dovecot-lmtpd dovecot-mysql mysql-server
Durante il processo di installazione, fornire una password per l’utente root di mySql, quindi specificare Internet Site come configurazione per Postfix. Infine, indicare il nome di dominio completo del server di posta.
Configurazione di MySQL
Creazione di un nuovo database con tre tabelle: domini, utenti e alias e del relativo utente per l’accesso.
mysqladmin -p create mail
Accedere inserendo la password dell’utente root di mySql. Quindi, stabilire una connessione al db server attraverso il comando
mysql -p mail
specificando nuovamente la password di rotto di mySql. Questo è il prompt che certifica la connessione al db server:
mysql>
Creare un nuovo utente (e relativa password) per mySql a cui concedere i permessi di lettura sul database appena creato.
GRANT SELECT ON mail.* TO 'mailuser'@'127.0.0.1' IDENTIFIED BY 'mailpassword';
FLUSH PRIVILEGES;
Creazione della tabella per i domini che saranno gestiti dal server:
CREATE TABLE `virtual_domains` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Creazione della tabella per gli utenti e relative password (crittografate):
CREATE TABLE `virtual_users` (
`id` int(11) NOT NULL auto_increment,
`domain_id` int(11) NOT NULL,
`password` varchar(106) NOT NULL,
`email` varchar(100) 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;
Creazione della tabella per gli alias:
CREATE TABLE `virtual_aliases` (
`id` int(11) NOT NULL auto_increment,
`domain_id` int(11) 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;
Aggiunta di dati alle tabelle:
INSERT INTO `mailserver`.`virtual_domains`
(`id` ,`name`)
VALUES
('1', 'esempio.it');
INSERT INTO `mailserver`.`virtual_users`
(`id`, `domain_id`, `password` , `email`)
VALUES
('1', '1', ENCRYPT('password', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), 'info@esempio.it');
INSERT INTO `mailserver`.`virtual_aliases`
(`id`, `domain_id`, `source`, `destination`)
VALUES
('1', '1', 'esemopio@esempio.it', 'info@esempio.it');
Configurazione di Postfix
In this section, you’ll modify some of these Postfix configuration options:
- Domini, utenti e alias virtuali: consentono di evitare la creazione di un utente UNIX per ogni casella mail da gestire
- Database MySQL: backend di gestione semplice per aggiungere o rimuovere domini, caselle e alias
- Servizio Dovecot LMTP: Gestione delle mail in ingresso e salvataggio sul server
- Crittografia STARTTLS per tutte le connessioni: sicurezza maggiore
- Servizio Dovecot per l’autenticazione
Backup della configurazione attuale di Postfix
cp /etc/postfix/main.cf /etc/postfix/main.cf.orig
Modifica del file di configurazione main.cf
nano /etc/postfix/main.cf
Questa è la configurazione di default:
# See /usr/share/postfix/main.cf.dist for a commented, more complete version
# Debian specific: Specifying a file name will cause the first
# line of that file to be used as the name. The Debian default
# is /etc/mailname.
#myorigin = /etc/mailname
smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
biff = no
# appending .domain is the MUA's job.
append_dot_mydomain = no
# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h
readme_directory = no
# 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
# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for
# information on enabling SSL in the smtp client.
myhostname = hostname.example.com
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = example.com, hostname.example.com, localhost.example.com, localhost
relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
Commentare le linea relative alla sezione #TLS parameters, sostituendole con:
smtpd_tls_cert_file=/etc/ssl/certs/dovecot.pem
smtpd_tls_key_file=/etc/ssl/private/dovecot.pem
smtpd_use_tls=yes
smtpd_tls_auth_only = yes
Abilitare l’invio di mail dall’esterno attraverso autenticazione (gestita da Dovecot) aggiungendo le righe seguenti:
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 la riga mydestination esistente e sostituirla con una per localhost. Ciò cnsentirà di usare i domini virtuali elencati nella tabella del db. E’ importante che non ci sia sovrapposizione tra i domini elencati nel db e quelli elencati in mydestination.
#mydestination = example.com, hostname.example.com, localhost.example.com, localhost
mydestination = localhost
Aggiungere una riga per la consegna locale (il servizio che si occupa di depositare la mail nella casella individuale dell’utente) indicando a Postfix di non utilizzare il proprio LDA (Local Delivery Agent), utilizzando invece il servizio LMTP di Dovecot (Local Mail Transfer Protocol). Questa impostazione è valida per tutti i domini elencati nel db.
#Handing off local delivery to Dovecot's LMTP, and telling it where to store mail
virtual_transport = lmtp:unix:private/dovecot-lmtp
Aggiungere le righe seguenti per configurare i domini, gli utenti e gli alias virtuali.
#Virtual domains, users, and aliases
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 le modifiche apportate al file /etc/postfix/main.cf, quindi creare i tre file specificati poco sopra. Serviranno per indicare a Postfix come connettersi al db per recuperare domini, utenti e alias. Creare il file mysql-virtual-mailbox-domains.cf:
nano /etc/postfix/mysql-virtual-mailbox-domains.cf
con queste righe:
user = mailuser
password = mailpassword
hosts = 127.0.0.1
dbname = mail
query = SELECT 1 FROM virtual_domains WHERE name='%s'
Salvare i cambiamenti, quindi riavviare Postfix:
service postfix restart
Attraverso il comando di seguito è possibile verificare che Postfix trovi correttamente un dominio elencato nel db. L’istruzione dovrebbe ritornare 1.
postmap -q esempio.it mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
Quindi creare il file mysql-virtual-mailbox-maps.cf con questo comando:
nano /etc/postfix/mysql-virtual-mailbox-maps.cf
inserendo le seguenti righe:
user = mailuser
password = mailpassword
hosts = 127.0.0.1
dbname = mail
query = SELECT 1 FROM virtual_users WHERE email='%s'
Salvare le modifiche apportate, quindi riavviare Postfix:
service postfix restart
Per verificare che Postfix sia correttamente in grado di recuperare le mail dal db, eseguire il comando di seguito. Deve restituire 1:
postmap -q info@esempio.it mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
Infine, creare il file mysql-virtual-alias-maps.cf:
nano /etc/postfix/mysql-virtual-alias-maps.cf
ed inserire le seguenti righe:
user = mailuser
password = mailpassword
hosts = 127.0.0.1
dbname = mail
query = SELECT destination FROM virtual_aliases WHERE source='%s'
Salvare i cambiamenti, quindi riavviare Postfix:
service postfix restart
Verificare che Postfix sia in grado di trovare gli alias dal db attraverso il comando seguente. Dovrebbe restituire l’email a cui l’alias fa riferimento:
postmap -q esempio@esempio.it mysql:/etc/postfix/mysql-virtual-alias-maps.cf
Eventualmente, modificare il limite di dimensione di un messaggio
nano -w /etc/postfix/main.cf
editando il parametro message_size_limit
message_size_limit = 51200000 #50 Mb - default 10 Mb
A modifica apportata, rileggere la configurazione di Postfix
service postfix reload
Configurazione di Dovecot
Dovecot consente agli utenti di collegarsi e verificare la propria mailbox attraverso protocolli quali POP3 e IMAP. Inoltre, il servizio LMTP si occupa di smistare le mail salvandole nel percorso corretto in base al destinatario. Verrà configurato per:
– Gestire i protocolli IMAP, POP3, e LMTP
– Definire la posizione delle mail sul server (percorso)
– Usare mySql per l’autenticazione
– Configurare i socket necessari per l’autenticazione e per il servizio LMTP
Creazione di un backup dei file di configurazione attuali di Dovecot:
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
Modifica del file di configurazione principale:
nano /etc/dovecot/dovecot.conf
Verificare che il file dovecot.conf abbia la direttiva per includere gli altri file di configurazione. L’impostazione dovrebbe essere attiva per default:
!include conf.d/*.conf
Aggiungere le righe seguenti in per abilitare il supporto dei protocolli IMAP, POP3 e LMTP. Inserirle sotto la riga !include_try /usr/share/dovecot/protocols.d/*.protocol:
# Enable installed protocols
!include_try /usr/share/dovecot/protocols.d/*.protocol
protocols = imap pop3 lmtp
Salvare le modifiche apportate al file. Aprire il file /etc/dovecot/conf.d/10-mail.conf che controlla il modo in cui Dovecot interagisce con il file system del server per recuperare e salvare i messaggi.
nano /etc/dovecot/conf.d/10-mail.conf
Decommentare la variabile mail_location, ed impostarla come di seguito. Le mail verranno salvate in /var/mail/vhosts/dominio/utente/. Le variabili %d e %n identificano rispettivamente il dominio e il nome utente.
mail_location = maildir:/var/mail/vhosts/%d/%n
Modificare la variabile mail_privileged_group. In questo modo, Dovecot potrà scrivere nella cartella /var/mail/.
mail_privileged_group = mail
Salvare il file, quindi verificare i permessi della cartella /var/mail:
ls -ld /var/mail
drwxrwsr-x 2 root mail 4096 Mar 6 15:08 /var/mail
Creare la cartella /var/mail/vhosts/ e le cartelle per ogni dominio:
mkdir -p /var/mail/vhosts/esempio.it
Creare l’utente vmail con id utente e gruppo 5000 con i seguenti comandi. Questo utente avrà il compito di leggere le mail dal server.
groupadd -g 5000 vmail
useradd -g vmail -u 5000 vmail -d /var/mail
Cambiare l’owner della cartella /var/vmail/ e del suo contenuto assegnadoli all’utente/gruppo vmail:
chown -R vmail:vmail /var/mail
Modificare il file per l’autenticazione utente con il seguente comando.
nano /etc/dovecot/conf.d/10-auth.conf
Impostare i meccanismi di autenticazione:
auth_mechanisms = plain login
Commentare la seguente riga aggiungendo un cancelletto all’innizio (#):
#!include auth-system.conf.ext
Abiltare l’autenticazione su mySql decommentando la riga auth-sql.conf.ext:
#!include auth-system.conf.ext
!include auth-sql.conf.ext
#!include auth-ldap.conf.ext
#!include auth-passwdfile.conf.ext
#!include auth-checkpassword.conf.ext
#!include auth-vpopmail.conf.ext
#!include auth-static.conf.ext
Salvare le modifiche al file. Creare il file /etc/dovecot/conf.d/auth-sql.conf.ext per le informazioni per l’autenticazione.
nano /etc/dovecot/conf.d/auth-sql.conf.ext
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 le modifiche al file, quindi modificare il file /etc/dovecot/dovecot-sql.conf.ext con le informazioni di connessione:
nano /etc/dovecot/dovecot-sql.conf.ext
Decommentare e impostare il driver da utilizzare:
driver = mysql
Decommentare la riga connect e impostarla con i parametri corretti per la connessione al db:
connect = host=127.0.0.1 dbname=mail user=mailuser password=mailpassword
Decommentare la riga default_pass_scheme e impostarla a SHA512-CRYPT, indicando in che modo le password sono state crittografate nella tabella virtual_users del db.
default_pass_scheme = SHA512-CRYPT
Decommentare la riga password_query e impostarla come di seguito:
password_query = SELECT email as user, password FROM virtual_users WHERE email='%u';
Salvare le modifiche al file. Cambiare l’utente e il gruppo della cartella /etc/dovecot/ in vmail e dovecot con il seguente comando:
chown -R vmail:dovecot /etc/dovecot
Cambiare i permiessi alla cartella /etc/dovecot/ con il seguente comando:
chmod -R o-rwx /etc/dovecot
Modificare la configurazione del socket nel file 10-master.conf. Postifix utilizza queste informazioni per connettersi a Dovecot.
nano /etc/dovecot/conf.d/10-master.conf
Trovare la sezione service lmtp ed utilizzare la seguente configurazione:
service lmtp {
unix_listener /var/spool/postfix/private/dovecot-lmtp {
mode = 0600
user = postfix
group = postfix
}
# Create inet listener only if you can't use the above UNIX socket
#inet_listener lmtp {
# Avoid making LMTP visible for the entire internet
#address =
#port =
#}
}
Localizzare la sezione service auth ed utilizzare la configurazione seguente:
service auth {
# auth_socket_path points to this userdb socket by default. It's typically
# used by dovecot-lda, doveadm, possibly imap process, etc. Its default
# permissions make it readable only by root, but you may need to relax these
# permissions. Users that have access to this socket are able to get a list
# of all usernames and get results of everyone's userdb lookups.
unix_listener /var/spool/postfix/private/auth {
mode = 0666
user = postfix
group = postfix
}
unix_listener auth-userdb {
mode = 0600
user = vmail
#group =
}
# Postfix smtp-auth
#unix_listener /var/spool/postfix/private/auth {
# mode = 0666
#}
# Auth process is run as this user.
user = dovecot
}
Nella sezione service auth-worker, decommentare la riga user ed impostarla a vmail.
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 le modifiche al file. Verificare che esistano i certificati di Dovecot:
ls /etc/ssl/certs/dovecot.pem
ls /etc/ssl/private/dovecot.pem
Nel caso, collegarli con quelli presenti nella cartella di installazione di Dovecot:
ln -s /etc/dovecot/dovecot.pem /etc/ssl/certs/dovecot.pem
ln -s /etc/dovecot/private/dovecot.pem /etc/ssl/private/dovecot.pem
Modificare la configurazione dei certificati
nano /etc/dovecot/conf.d/10-ssl.conf
in questo modo:
ssl_cert = </etc/ssl/certs/dovecot.pem
ssl_key = </etc/ssl/private/dovecot.pem
Per forzare l’utilizzo di SSL:
ssl = required
altrimenti
ssl = no
Modificare il limite di connessioni per singolo IP nel caso di utilizzo in ambienti Terminal Services
nano -w /etc/dovecot/conf.d/20-imap.conf
editando la riga
# Maximum number of IMAP connections allowed for a user from each IP address.
# NOTE: The username is compared case-sensitively.
mail_max_userip_connections = 100
Salvare le modifiche, quindi riavviare Dovecot:
service dovecot restart
La configurazione è completata.
L’articolo è la traduzione (ridotta) del post Email with Postfix, Dovecot, and MySQL pubblicato sul sito Linode Library