Serveur mail Postfix et Dovecot

Sources de la documentation :

Procédure validée sur Debian 9.

Présentation du projet

Nous souhaitons installer un serveur SMTP Postfix et un serveur IMAP Dovecot. Nous utiliserons SpamAssassin pour lutter contre les courriers indésirables. Nous configurerons également notre serveur afin d'être validé et reconnu comme émetteur de mails valides. Les comptes utilisateurs de notre serveur mail seront consignés dans une base MariaDB afin de permettre une plus grande souplesse de configuration.

Cette documentation est destinée à la fois aux personnes souhaitant installer leur serveur en réseau local ou pour un site Internet. Si vous êtes dans le premier cas, ignorez les étapes concernant l'installation d'un serveur public.

Pré-requis

Nous allons utiliser une base LAMP pour notre serveur. Pour cela, nous installons les paquets suivants :

apt -y install apache2 php7.0 libapache2-mod-php7.0 mariadb-server

Nous allons configurer Apache. Pour cela, éditez le fichier /etc/apache2/sites-available/000-default.conf et éditez la ligne suivante :

#ServerName www.example.com

Dé-commentez la et replacez le nom de domaine par celui sur lequel vous installez votre serveur mail :

ServerName example.com

Créez le fichier /etc/apache2/sites-available/thunderbird-autoconfig.conf comme suit :

<VirtualHost *:80>
ServerName autoconfig.example.com
DocumentRoot /var/www/html/autoconfig/
<Directory /var/www/html/autoconfig/>
        Options -Indexes +FollowSymLinks +MultiViews -Includes -ExecCGI
        AllowOverride None
        Order allow,deny
        allow from all
</Directory>
</VirtualHost>

Activez le site et rechargez la configuration Apache :

a2ensite thunderbird-autoconfig
service apache2 reload

Configurez les entrées suivantes sur le DNS de votre nom de domaine en remplaçant le domaine et l'IP :

example.com. IN A 1.2.3.4
example.com. IN MX example.com.
autoconfig.example.com IN CNAME example.com.
example.com. IN TXT "v=spf1 a mx -all"

Pour un serveur public

Si votre serveur mail est destiné à être utilisé sur Internet, vous devez disposer d'un nom de domaine et d'une IP fixe. Assurez-vous que les ports TCP 25, 80, 443, 465 et 993 sont ouverts et que vous pouvez y accéder depuis Internet.

Nous allons installer Let's Encrypt afin d'obtenir un certificat SSL reconnu. Pour cela, exécutez les commandes suivantes et suivez l'assistant en choisissant le mode Secure qui redirige tout trafic HTTP sur HTTPS :

apt -y install python-certbot-apache
certbot --authenticator webroot --installer apache --webroot-path /var/www/html -d example.com

Éditez la table cron de l'utilisateur root et renseignez la ligne suivante afin de demander automatiquement le renouvellement du certificat tous les dimanches :

0 3 * * 0 certbot renew

Configurez l'entrée suivante sur le DNS de votre FAI en remplaçant le domaine et l'IP :

4.3.2.1.in-addr.arpa. IN PTR example.com

Installation des paquets

Nous allons ici installer tout ce qui est nécessaire à notre serveur mail :

Postfix
Serveur SMTP en charge du transfert des mails.
Dovecot
Serveur IMAP en charge de fournir les mails aux clients de messagerie.
SpamAssassin
Filtre anti-spam
ClamAV
Antivirus
OpenDKIM
Outil de génération de la clef DKIM
apt -y install postfix postfix-mysql dovecot-core dovecot-imapd dovecot-lmtpd \
dovecot-managesieved dovecot-mysql dovecot-sieve spamassassin spamc clamav-daemon clamav \
clamsmtp opendkim opendkim-tools

Lors de l'installation, Postfix vous demande les questions suivantes :

Configuration type du serveur de messagerie
Site Internet
Domaine
Votre domaine

Initialisation de la base de données

Le serveur Postfix gère par défaut les utilisateurs en provenance du système d'authentification Unix. Nous souhaitons utiliser à la place des utilisateurs virtuels stockés dans la base de données. Pour cela, nous allons créer la base de données stockant les comptes utilisateurs et les alias.

Connectez-vous à la base de données MariaDB :

mysql -u root -p

Saisissez les commandes suivantes afin de créer la base de données :

CREATE DATABASE postfix;
USE postfix;

CREATE TABLE addresses (
	email VARCHAR(50) NOT NULL PRIMARY KEY,
	active TINYINT(1) NOT NULL DEFAULT 1,
	passwd VARCHAR(106) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE aliases (
	source VARCHAR(50) NOT NULL PRIMARY KEY,
	target VARCHAR(50) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE USER 'postfix'@'localhost' IDENTIFIED BY 'MonMotDePasseBaseDeDonnees';
GRANT SELECT ON postfix.addresses TO 'postfix'@'localhost';
GRANT SELECT ON postfix.aliases TO 'postfix'@'localhost';

Nous allons créer un premier utilisateur comme suit :

INSERT INTO postfix.addresses (email, active, passwd) VALUES ("antoine@example.com", 1, ENCRYPT('MotDePasseEmail', CONCAT('$6$', SUBSTRING(SHA(RAND()));

Nous allons créer un premier alias comme suit :

INSERT INTO postfix.aliases (source, target) VALUES ("apernot@example.com", "antoine@example.com");

Configuration de Postfix

Inscrivez votre domaine dans le fichier /etc/mailname.

Créez l'utilisateur gérant les utilisateurs virtuels et le répertoire stockant les mails :

useradd -d /var/mail -U -u 5000 vmail
mkdir -p /var/mail/vmail/example.com
chown -R vmail:vmail /var/mail/vmail 

Éditez le fichier /etc/postfix/main.cf. Nous effectuerons les modifications suivantes :

Saisissez votre nom de domaine dans le champ myhostname :

myhostname = example.com

Retirez votre domaine du champ mydestination. Il est en effet impossible qu'un domaine soit affecté à des utilisateurs réels et virtuels à la fois.

Éditez la configuration propre à la gestion des domaines virtuels et la sécurité :

ssl = required
ssl_cert = <:/etc/letsencrypt/live/example.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/example.com/privkey.pem 

virtual_mailbox_domains = example.com
virtual_mailbox_base = /var/mail/vmail
virtual_gid_maps = static:5000
virtual_uid_maps = static:5000
virtual_minimum_uid = 5000
virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_aliases.cf
virtual_transport = lmtp:unix:private/dovecot-lmtp
smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_tls_auth_only = yes

smtpd_recipient_restrictions =
    permit_mynetworks,
    permit_sasl_authenticated,
    reject_unauth_destination,
    reject_invalid_hostname,
    reject_unauth_pipelining,
    reject_non_fqdn_sender,
    reject_unknown_sender_domain,
    reject_non_fqdn_recipient,
    reject_unknown_recipient_domain,
    permit

# Signature DKIM
milter_default_action = accept
milter_protocol = 2
smtpd_milters = inet:localhost:8892
non_smtpd_milters = inet:localhost:8892

# ClamAV
strict_rfc821_envelopes = yes
disable_vrfy_command = yes
smtpd_helo_required = yes
smtpd_client_restrictions =
smtpd_helo_restrictions =
smtpd_sender_restrictions =

content_filter = scan:localhost:10026

Modifiez les lignes suivantes dans le fichier /etc/postfix/master.cf en prenant garde à ce que les options (commençant par -o) doivent être précédées par au moins un espace :

smtp      inet  n       -       y       -       -       smtpd
  -o content_filter=spamassassin
submission inet n       -       y       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
smtps     inet  n       -       y       -       -       smtpd
  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
lmtp      unix  -       -       y       -       -       lmtp
spamassassin unix -     n       n       -       -       pipe
  user=debian-spamd argv=/usr/bin/spamc -f -e /usr/sbin/sendmail -oi -f ${sender} ${recipient}

scan      unix  -       -       n       -       16      smtp
   -o smtp_send_xforward_command=yes
   -o disable_dns_lookups=yes
   -o smtp_data_done_timeout=1200
 
localhost:10025 inet  n -       n       -       16      smtpd
   -o content_filter=
   -o local_recipient_maps=
   -o relay_recipient_maps=
   -o smtpd_restriction_classes=
   -o smtpd_client_restrictions=
   -o smtpd_helo_restrictions=
   -o smtpd_sender_restrictions=
   -o smtpd_recipient_restrictions=permit_mynetworks,reject
   -o mynetworks_style=host
   -o smtpd_authorized_xforward_hosts=127.0.0.0/8

Créez le fichier /etc/postfix/mysql_virtual_mailbox_maps.cf et saisissez la configuration :

user = postfix
password = MonMotDePasseBaseDeDonnees
hosts = localhost
dbname = postfix
query = SELECT 1 FROM addresses WHERE email = '%s'

Testez en saisissant la commande suivante :

postmap -q antoine@example.com mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf

Si vous obtenez 1, la configuration est correcte.

Configuration d'OpenDKIM

Modifiez le fichier /etc/opendkim.conf :

Domain                  example.com
KeyFile                 /etc/postfix/dkim/mail.private
Selector                mail
SOCKET                  inet:8892@localhost

Dans le fichier /etc/default/opendkim, modifiez la ligne suivante :

SOCKET="inet:8892@localhost"

Créez et allez dans le dossier accueillant la clef, puis générez la.

mkdir /etc/postfix/dkim/
cd /etc/postfix/dkim/
opendkim-genkey -t -s mail -d example.com

Configurez une entrée TXT (ou DKIM) dans votre DNS avec le contenu du fichier /etc/postfix/dkim/mail.txt.

Configuration de Dovecot

Configurez le serveur Dovecot. Pour cela, nous allons modifier les lignes suivantes dans le fichier /etc/dovecot/conf.d/10-mail.conf :

mail_location = maildir:/var/mail/vmail/%d/%n
mail_privileged_group = vmail

Le réglage des méthodes d'authentification se fait en modifiant le fichier /etc/dovecot/conf.d/10-auth.conf :

auth_mechanisms = plain login
#!include auth-system.conf.ext
!include auth-sql.conf.ext

Modifiez le fichier /etc/dovecot/conf.d/10-master.conf :

service lmtp { 
    unix_listener /var/spool/postfix/private/dovecot-lmtp {
        mode = 0600
        user = postfix 
        group = postfix 
    } 
} 
 
service auth { 
    unix_listener /var/spool/postfix/private/auth {
        mode = 0666
        user = postfix 
        group = postfix
    } 
}
    
#unix_listener auth-userdb {
  #mode = 0666
  #user =
  #group =
#}

service imap-login {
  inet_listener imap {
  }
  inet_listener imaps {
    port = 993
    ssl = yes
  }
}

Renseignez les requêtes utilisées par Dovecot pour rechercher les utilisateurs virtuels dans la base de données en éditant le fichier /etc/dovecot/dovecot-sql.conf.ext :

driver = mysql
connect = host=127.0.0.1 dbname=postfix user=postfix password=MonMotDePasseBaseDeDonnees
default_pass_scheme = SHA512-CRYPT
password_query = \
   SELECT email as username, passwd AS password FROM addresses WHERE email = '%u'
user_query = \
   SELECT 5000 AS uid, 5000 as gid, email, '/var/mail/vmail/%d/%n' AS home \
   FROM addresses WHERE email = '%u'
iterate_query = SELECT email AS user FROM addresses

Configuration de SpamAssassin

Le filtre spam nécessite la mise à jour automatique en éditant le fichier /etc/default/spamassassin :

CRON=1

Si, au lieu de mettre les spam en pièce-jointe, vous souhaitez simplement les étiqueter comme tel, modifiez la ligne suivante dans le fichier /etc/spamassassin/local.cf :

report_safe 0

Activez le service au démarrage :

systemctl enable spamassassin.service

Configuration du système d'auto-configuration Thunderbird

Créez le fichier /var/www/html/autoconfig/mail/config-v1.1.xml :

<?xml version="1.0" encoding="UTF-8"?>
<clientConfig version="1.1">
  <emailProvider id="example.com">
    <domain>example.com</domain>
    <displayName>Mon domaine</displayName>
    <displayShortName>MonDomaine</displayShortName>
    <incomingServer type="imap">
      <hostname>example.com</hostname>
      <port>993</port>
      <socketType>SSL</socketType>
      <authentication>password-cleartext</authentication>
      <username>%EMAILADDRESS%</username>
    </incomingServer>
    <outgoingServer type="smtp">
      <hostname>example.com</hostname>
      <port>465</port>
      <socketType>SSL</socketType>
      <authentication>password-cleartext</authentication>
      <username>%EMAILADDRESS%</username>
    </outgoingServer>
  </emailProvider>
</clientConfig>

Démarrage et tests du service

Redémarrez les services :

service apache2 restart
service opendkim restart
service postfix restart
service dovecot restart
service spamassassin restart
service clamsmtp restart
service clamav-daemon restart