- Modifié
19/10/2016 : Ce tutoriel date de 2014 et n'est aujourd'hui plus maintenu faute de temps. Si quelqu'un est intéressé pour le reprendre, faites moi signe par MP. Par contre, je continuerai de faire évoluer et de maintenir l'image Docker https://github.com/hardware/mailserver
Installation sécurisée d'un serveur de mail avec Postfix, Dovecot et Rainloop
Bonjour,
Voici un petit tutoriel pour vous aider à installer un serveur mail sous GNU/Linux. Ce tutoriel a été réalisé sous Debian 7 "wheezy" mais la plupart des commandes peuvent être adaptées pour être utilisées sur d'autres distributions. Cette aide n'est volontairement pas exhaustive car le sujet traité peut-être assez complexe quand on le traite de manière plus approfondi et ainsi garder un tuto plus accessible (et beaucoup moins long...). Bien sur, ce tutoriel s'adresse à des personnes qui ont déjà une bonne expérience en administration système sous Linux car il est très important de comprendre ce que l'on fait afin de mieux réagir en cas de disfonctionnement (surtout dans le cas où l'on se sert tous les jours de son serveur pour envoyer/reçevoir des mails).
A la fin de ce tutoriel, vous devriez normalement être capable d'envoyer et de reçevoir des emails à partir du client web Rainloop ou avec n'importe quel client mail desktop (Thunderbird, outlook, Claws Mail, Evolution...etc) ainsi qu'avec un nombre quasi illimité d'adresses email virtuelles.
Le'ts Go !
Ce tutoriel est compatible avec Debian 7 “wheezy” et Debian 8 “jessie”
Pré-requis :
Un nom de domaine (avec un accès aux DNS et fichiers de zone)
Nginx
PHP
OpenSSL
MySQL
ATTENTION : Pour suivre ce tuto, il est impératif que vous sachiez comment configurer votre nom de domaine. Connaitre le fonctionnement des DNS (Domain Name System) serait un gros plus. Si ce n'est pas le cas, vous ne pourrez pas suivre ce tutoriel correctement. Allez voir le cours suivant pour apprendre à configurer votre nom de domaine : http://fr.openclassrooms.com/informatique/cours/gerer-son-nom-de-domaine
ATTENTION : Il vous faut un serveur LEMP (Linux, Nginx, MySQL, PHP) fonctionnel avant de continuer. Si ce n'est pas le cas, allez voir un de ces articles. Vous pouvez choisir un serveur web différent de celui utilisé dans ce tutoriel (Nginx) mais ça sera à vous de le configurer correctement.
Pensez aussi à mettre à jour votre système avant de commencer :
apt-get update && apt-get dist-upgrade
Changelog :
Un changelog est disponible sur Github pour que vous puissiez suivre les évolutions du tutoriel facilement.
>> CHANGELOG <<
Script d'auto-installation :
Un script d'installation automatique est disponible dans ce topic : http://mondedie.fr/d/5793/1
Ce script n'est plus maintenu, voir en dessous pour une solution automatisée via Docker.
Image docker :
https://github.com/hardware/mailserver
Schéma :
Voici un schéma représentant l'organisation du serveur mail :
Un petit conseil : à chaque fois que vous vous apprêtez à installer un ensemble de logiciels sur votre serveur, essayez de dessiner le schéma correspondant, d'une part ça va vous faciliter la tâche pour imbriquer les différentes couches logicielles et d'autre part vous aurez une vision plus concrète de ce que vous allez faire.
Configuration du nom d'hôte, du FQDN et du champ MX :
Le nom d'hôte, le FQDN (Fully Qualified Domain Name), et l'enregistrement MX de votre serveur doivent être configurés côté serveur mais aussi au niveau des DNS de votre nom de domaine, si c'est déjà le cas, vous pouvez directement aller à la partie 1, sinon suivez les instructions ci-dessous :
Le nom d'hôte (hostname) est un surnom que vous donnez à un équipement réseau (comme un serveur, un poste de travail, une imprimante...etc) permettant de l'identifier de manière unique au sein d'un réseau local et d'y accéder sans connaître par coeur l'adresse ip associée.
Le FQDN permet de rendre un équipement réseau accessible partout sur internet et de l'identifier aussi de manière unique.
Dans la suite de ce tutoriel, nous allons utiliser les caractéristiques suivantes (à adapter selon votre configuration) :
- Nom de domaine principal : domain.tld
- Nom d'hôte : hostname
- FQDN : hostname.domain.tld
- MX : mail.domain.tld
Pour modifier le nom d'hôte, exécutez la commande suivante (n'oubliez pas de remplacer "hostname" par le nom d'hôte de votre serveur) :
echo "hostname" > /etc/hostname
Pour modifier le FQDN, il faut editer le fichier /etc/hosts :
# vim /etc/hosts
127.0.0.1 localhost.localdomain localhost
IP DU SERVEUR hostname.domain.tld hostname
Redémarrez le serveur pour prendre en compte le changement de nom d'hôte. Ensuite il faut associer le FQDN avec l'adresse IP de votre serveur. Pour cela, vous devez mettre à jour le fichier de zone de votre domaine depuis le site de votre registrar ou sinon directement avec BIND si votre serveur fait office de serveur DNS.
Le plus important dans cette partie, c'est de faire pointer le FQDN ET le MX vers l'adresse IP de votre serveur. L'enregistrement MX permet de déterminer vers quel serveur un email doit être acheminé, si quelqu'un vous envoie un message depuis Gmail par exemple, les serveurs de google vont automatiquement intérroger cette entrée pour savoir où transmettre le message. Donc si cette entrée est pas ou mal définie, vous ne reçevrez jamais d'emails.
A la fin du tutoriel, les enregistrements DNS de votre domaine devront ressembler à ceci :
HOSTNAME CLASS RECORD TYPE VALUE
------------------------------------------------------------------------------------------------
@ IN A ipv4 du serveur
hostname IN A ipv4 du serveur
mail IN A ipv4 du serveur
postfixadmin IN CNAME hostname
rainloop IN CNAME hostname
@ IN MX 10 mail.domain.tld.
; Les enregistrements suivants sont facultatifs :
smtp IN CNAME hostname
imap IN CNAME hostname
; Les enregistrements suivants sont facultatifs mais permettent de rendre plus crédible
; son serveur mail sur le réseau (aux yeux des autres serveurs de mail comme Gmail,
; Outlook & co...).
@ IN TXT "v=spf1 a mx ip4:IPv4 DU SERVEUR ~all"
mail._domainkey IN TXT "k=rsa; p=CLE PUBLIQUE DKIM"
_dmarc IN TXT "v=DMARC1; p=reject; rua=mailto:postmaster@domain.tld; ruf=mailto:admin@domain.tld; fo=0; adkim=s; aspf=s; pct=100; rf=afrf; sp=reject"
_domainkey IN TXT "o=-; r=postmaster@domain.tld"
Rechargez la configuration de BIND en redémarrant le service (ne pas oublier de modifier la valeur du serial pour indiquer que le fichier de zone a été mis à jour !!) :
service bind9 restart
Attendez quelques minutes que les DNS se propagent, vous pouvez suivre l'avancement avec ce site par exemple : https://www.whatsmydns.net/ :
Et pour finir modifiez le reverse depuis l'interface de votre hébergeur, par exemple chez Kimsufi :
1 - Installation de postfix
On commence par installer Postfix avec le support de mysql. Les domaines, comptes utilisateurs et alias seront ainsi gérés directement au sein d'une base de données, que vous pourrez administrer grâce à vos outils habituels, comme phpMyAdmin par exemple.
apt-get install postfix postfix-mysql
Lors de l'installation de Postfix, vous devez choisir le type du serveur de messagerie, choisissez "Site Internet" pour utiliser SMTP :
Ensuite une autre fenêtre apparaît et vous demande le nom du système de mail, entrez alors le FQDN de votre serveur.
2 - Création de la base de donnée
# Connexion au serveur MySQL en tant que root
mysql -u root -p
# Création de la base de données "postfix"
mysql> CREATE database postfix;
# Création de l'utilisateur "postfix" et ajout des permissions
mysql> CREATE USER 'postfix'@'localhost' IDENTIFIED BY 'MOT DE PASSE';
mysql> GRANT USAGE ON *.* TO 'postfix'@'localhost';
mysql> GRANT ALL PRIVILEGES ON postfix.* TO 'postfix'@'localhost';
# On quitte la console MySQL
mysql> exit
Vous pouvez aussi passer par phpMyAdmin en créant un nouvel utilisateur nommé postfix qui a tous les privilèges sur la bdd postfix.
3 - Installation et configuration de PostfixAdmin
Liens utiles :
http://postfixadmin.sourceforge.net/
PostfixAdmin est une interface web qui permet de gérer simplement vos domaines, vos adresses virtuelles ainsi que vos alias. Dès que vous aurez besoin d'une nouvelle adresse email, c'est par cette interface qu'il faudra passer.
Il faut dans un premier temps télécharger l'archive la plus récente et la décompresser sur le serveur :
cd /var/www
wget http://downloads.sourceforge.net/project/postfixadmin/postfixadmin/postfixadmin-2.92/postfixadmin-2.92.tar.gz
tar -xzf postfixadmin-2.92.tar.gz
mv postfixadmin-2.92 postfixadmin
rm -rf postfixadmin-2.92.tar.gz
chown -R www-data:www-data postfixadmin
apt-get install php5-imap
Editez le fichier de configuration et modifiez les paramètres suivants :
# vim /var/www/postfixadmin/config.inc.php
$CONF['configured'] = true;
$CONF['default_language'] = 'fr';
$CONF['database_type'] = 'mysqli';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = 'postfix';
$CONF['database_password'] = 'MOT DE PASSE';
$CONF['database_name'] = 'postfix';
$CONF['admin_email'] = 'admin@domain.tld';
$CONF['domain_path'] = 'YES';
$CONF['domain_in_mailbox'] = 'NO';
$CONF['fetchmail'] = 'NO';
Ajouter un nouveau virtual host Nginx (à adapter selon votre configuration) :
# vim /etc/nginx/sites-enabled/postfixadmin.conf
server {
listen 80;
server_name postfixadmin.domain.tld;
root /var/www/postfixadmin;
index index.php;
charset utf-8;
location / {
try_files $uri $uri/ index.php;
}
location ~* \.php$ {
include /etc/nginx/fastcgi_params;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
Redémarrez Nginx pour prendre en compte le nouveau vhost :
service nginx restart
Lancez l'assistant d'installation de PostfixAdmin à l'adresse suivante et suivez les indications :
Le script créé toutes les tables nécessaires au bon fonctionnement de Postfix. En bas de la page générez le hash du mot de passe d'installation et créez un compte administrateur (exemple : admin@domain.tld). C'est à partir de ce compte que vous allez gérer toutes vos adresses emails. Attention: admin@domain.tld n'est qu'un compte administrateur, l'adresse email n'existe pas. Si vous voulez la créer, il faudra passer par postfixadmin, comme on va le voir par la suite.
Il ne vous reste plus qu'à mettre le hash généré par l'assistant dans le fichier config.inc.php :
# vim /var/www/postfixadmin/config.inc.php
$CONF['setup_password'] = 'HASH';
Vous pouvez maintenant vous connecter via le formulaire de connexion :
On va commencer par ajouter un nouveau domaine, dans notre exemple il s'agit de domain.tld :
Et une adresse email, par exemple admin@domain.tld et contact@domain.tld :
Voila, vous avez ajouté votre première adresse email, like a boss, maintenant on va passer aux choses sérieuses
4 - Configuration de Postfix
Maintenant nous allons devoir configurer Postfix pour qu'il prenne en charge correctement les connexions SMTP et l'envoie des messages sur le réseau pour chaque utilisateur créé via PostfixAdmin.
Faites une sauvegarde du fichier de conf de Postfix :
cp /etc/postfix/main.cf /etc/postfix/main.cf.bak
Ce fichier de configuration est assez complexe, on va voir ensemble comment le configurer correctement. J'ai séparé par bloc de configuration pour que ça soit plus facile à comprendre. Vous retrouverez à la fin de cette section l'ensemble de la configuration de Postfix, n'hésitez pas à faire un diff avec le votre pour voir si vous n'avez pas fait d'erreur.
On va commencer par définir quelques règles (restrictions) au niveau du protocole SMTP afin de sécuriser les échanges et avoir un cadre plus restrictif lors de l'envoie des emails. Attention un client mail mal configuré ou obsolète peut ne pas fonctionner avec cette configuration, à vous d'adapter la configuration en fonction de vos besoins.
# vim /etc/postfix/main.cf
# Règles sur les adresses de destination
# permit_sasl_authenticated : Accepter la connexion lorsque le client est authentifié
# reject_non_fqdn_recipient : Refuser les adresses de destinations invalides (non FQDN)
smtpd_recipient_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_non_fqdn_recipient,
reject_unauth_destination,
reject_unknown_recipient_domain,
reject_rbl_client zen.spamhaus.org
# Règles sur l'échange HELO qui survient avant la connexion
# reject_invalid_helo_hostname : Refuser les échanges HELO invalides
# reject_non_fqdn_helo_hostname : Refuser les noms d'hôte invalides (non FQDN)
# reject_unknown_helo_hostname : Refuser les noms d'hôte qui n'ont pas de champ DNS A ou MX dans leurs DNS.
smtpd_helo_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_invalid_helo_hostname,
reject_non_fqdn_helo_hostname,
# reject_unknown_helo_hostname
# Règles de connexion des clients
# permit_sasl_authenticated : Accepter la connexion lorsque le client est authentifié
# reject_plaintext_session : Refuser les connexions non sécurisées
# reject_unauth_pipelining : Refuser les défauts lors de la connexion
smtpd_client_restrictions =
permit_mynetworks,
permit_inet_interfaces,
permit_sasl_authenticated,
# reject_plaintext_session,
# reject_unauth_pipelining
# Règles sur les expéditeurs
# reject_non_fqdn_sender : Refuser les expéditeurs invalides (non FQDN)
# reject_unknown_sender_domain : Refuser les expéditeurs qui n'ont pas de champ DNS A ou MX dans leurs DNS.
# reject_sender_login_mismatch : Refuser les expéditeurs locaux non authentifiés
smtpd_sender_restrictions =
reject_non_fqdn_sender,
reject_unknown_sender_domain,
reject_sender_login_mismatch
Ensuite nous allons définir les paramètres de chiffrement via TLS :
# Smtp ( OUTGOING / Client )
smtp_tls_loglevel = 1
smtp_tls_security_level = may
smtp_tls_CAfile = /etc/ssl/certs/ca.cert.pem
smtp_tls_protocols = !SSLv2, !SSLv3
smtp_tls_mandatory_protocols = !SSLv2, !SSLv3
smtp_tls_mandatory_ciphers = high
smtp_tls_exclude_ciphers = aNULL, eNULL, EXPORT, DES, 3DES, RC2, RC4, MD5, PSK, SRP, DSS, AECDH, ADH
smtp_tls_note_starttls_offer = yes
# ---------------------------------------------------------------------------------------------------
# Smtpd ( INCOMING / Server )
smtpd_tls_loglevel = 1
smtpd_tls_auth_only = yes
smtpd_tls_security_level = may
smtpd_tls_received_header = yes
smtpd_tls_protocols = !SSLv2, !SSLv3
smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3
smtpd_tls_mandatory_ciphers = medium
# Infos (voir : postconf -d)
# Medium cipherlist = aNULL:-aNULL:ALL:!EXPORT:!LOW:+RC4:@STRENGTH
# High cipherlist = aNULL:-aNULL:ALL:!EXPORT:!LOW:!MEDIUM:+RC4:@STRENGTH
# smtpd_tls_exclude_ciphers = NE PAS modifier cette directive pour des raisons de compatibilité
# avec les autres serveurs de mail afin d'éviter une erreur du type
# "no shared cipher" ou "no cipher overlap" puis un fallback en
# plain/text...
# smtpd_tls_cipherlist = Ne pas modifier non plus !
smtpd_tls_CAfile = $smtp_tls_CAfile
smtpd_tls_cert_file = /etc/ssl/certs/mailserver.crt
smtpd_tls_key_file = /etc/ssl/private/mailserver.key
smtpd_tls_dh1024_param_file = $config_directory/dh2048.pem
smtpd_tls_dh512_param_file = $config_directory/dh512.pem
tls_preempt_cipherlist = yes
tls_random_source = dev:/dev/urandom
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
lmtp_tls_session_cache_database = btree:${data_directory}/lmtp_scache
Si vous n'avez pas de certificat SSL, exécutez les commandes suivantes pour en générer un (attention il s'agira d'un certificat auto-signé par votre propre autorité de certification) :
cd /etc/ssl/
openssl genrsa -out ca.key.pem 4096
openssl req -x509 -new -nodes -days 1460 -sha256 -key ca.key.pem -out ca.cert.pem
Country Name (2 letter code) [AU]: FR
State or Province Name (full name) [Some-State]: France
Locality Name (eg, city) []: Paris
Organization Name (eg, company) [Internet Widgits Pty Ltd]: Corp Ltd
Organizational Unit Name (eg, section) []: Certificate Authority
Common Name (e.g. server FQDN or YOUR name) []: Root CA
openssl genrsa -out mailserver.key 4096
openssl req -new -sha256 -key mailserver.key -out mailserver.csr
Country Name (2 letter code) [AU]: FR
State or Province Name (full name) [Some-State]: France
Locality Name (eg, city) []: Paris
Organization Name (eg, company) [Internet Widgits Pty Ltd]: Corp Ltd
Organizational Unit Name (eg, section) []:Mail server
Common Name (e.g. server FQDN or YOUR name) []: mail.domain.tld
openssl x509 -req -days 1460 -sha256 -in mailserver.csr -CA ca.cert.pem -CAkey ca.key.pem -CAcreateserial -out mailserver.crt
chmod 444 ca.cert.pem
chmod 444 mailserver.crt
chmod 400 ca.key.pem
chmod 400 mailserver.key
mv ca.key.pem private/
mv ca.cert.pem certs/
mv mailserver.key private/
mv mailserver.crt certs/
Création des paramètres Diffie-Hellman :
openssl dhparam -out /etc/postfix/dh2048.pem 2048
openssl dhparam -out /etc/postfix/dh512.pem 512
Ensuite nous allons définir les paramètres de connexion via SASL :
# Paramètres de connexion SASL
# C'est ici que l'on déclare Dovecot comme une passerelle pour authentifier les utilisateurs.
# Postfix peut s'appuyer sur Dovecot pour identifier les connexions SMTP.
smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_security_options = noanonymous
smtpd_sasl_tls_security_options = $smtpd_sasl_security_options
smtpd_sasl_local_domain = $mydomain
smtpd_sasl_authenticated_header = yes
broken_sasl_auth_clients = yes
Maintenant on va s'occuper de la gestion et du stockage des emails. Dans la suite de ce tutoriel nous allons créer un utilisateur nommé vmail avec UID/GID de 5000, avec un HOME par défaut pointant sur /var/mail. Postfix doit le savoir donc on lui indique avec les 4 paramètres suivants :
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
virtual_minimum_uid = 5000
virtual_mailbox_base = /var/mail
Les 4 règles suivantes permettent à Postfix de savoir comment se connecter et lire la base de donnée afin de récupérer des informations sur les différents domaines, adresses virtuelles et alias. Nous allons détailler le contenu de ces 4 fichiers juste après.
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
smtpd_sender_login_maps = mysql:/etc/postfix/mysql-sender-login-maps.cf
Le paramètre virtual_transport est très très important, il permet à Postfix de savoir où envoyer les emails reçus. Dans notre cas, on utilise le protocole LMTP pour les acheminer jusqu'à Dovecot :
virtual_transport = lmtp:unix:private/dovecot-lmtp
Il ne reste plus qu'à definir les paramètres généraux. N'oubliez pas de modifier la valeur de myhostname et myorigin en indiquant votre FQDN.
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no
append_dot_mydomain = no
readme_directory = no
delay_warning_time = 4h
mailbox_command = procmail -a "$EXTENSION"
recipient_delimiter = +
disable_vrfy_command = yes
message_size_limit = 502400000
mailbox_size_limit = 1024000000
inet_interfaces = all
inet_protocols = ipv4
myhostname = hostname.domain.tld
myorigin = hostname.domain.tld
mydestination = localhost localhost.$mydomain
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
relayhost =
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
C'est terminé pour le fichier de configuration principale, je vous l'accorde il y a pas mal de paramètres à prendre en compte mais dans le cas d'un serveur SMTP c'est pas étonnant. Vous pouvez aller voir la documentation de Postfix si vous voulez avoir plus d'informations sur sa configuration. http://www.postfix.org/postconf.5.html
Fichier de configuration complet : https://gist.github.com/hardware/b26918353c6325c09310
Configuration de Postfix pour MySQL
On peut maintenant créer les 4 fichiers de configuration qui vont permettre à Postfix d’interagir avec MySQL :
# vim /etc/postfix/mysql-virtual-mailbox-domains.cf
hosts = 127.0.0.1
user = postfix
password = MOT DE PASSE
dbname = postfix
query = SELECT domain FROM domain WHERE domain='%s' and backupmx = 0 and active = 1
# vim /etc/postfix/mysql-virtual-mailbox-maps.cf
hosts = 127.0.0.1
user = postfix
password = MOT DE PASSE
dbname = postfix
query = SELECT maildir FROM mailbox WHERE username='%s' AND active = 1
# vim /etc/postfix/mysql-virtual-alias-maps.cf
hosts = 127.0.0.1
user = postfix
password = MOT DE PASSE
dbname = postfix
query = SELECT goto FROM alias WHERE address='%s' AND active = 1
# vim /etc/postfix/mysql-sender-login-maps.cf
hosts = 127.0.0.1
user = postfix
password = MOT DE PASSE
dbname = postfix
query = SELECT username FROM mailbox WHERE username='%s' AND active = 1
Si vous voulez activer le port 587 pour vous connecter de manière sécurisé par SMTPS avec n'importe quel client mail, il faut décommenter/modifier les lignes suivantes dans le fichier /etc/postfix/master.cf :
submission inet n - - - - smtpd
-o syslog_name=postfix/submission
-o smtpd_tls_dh1024_param_file=${config_directory}/dh2048.pem
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
Et n'oubliez pas de décommentez cette ligne aussi si ce n'est pas déjà fait :
smtp inet n - - - - smtpd
Fichier de configuration complet : https://gist.github.com/hardware/dcc120df9329da7f40ec
5 - Installation de Dovecot
Liens utiles :
http://fr.wikipedia.org/wiki/Dovecot
http://wiki2.dovecot.org/
apt-get install dovecot-core dovecot-imapd dovecot-lmtpd dovecot-mysql
6 - Configuration de dovecot
Ajoutez la liste des protocoles activés après l'instruction "!include_try" dans le fichier /etc/dovecot/dovecot.conf. Dans notre cas, nous allons activer IMAP pour la récupération des emails via le port 993 et LMTP pour l'acheminement des emails entre Postfix et Dovecot :
# vim /etc/dovecot/dovecot.conf
!include_try /usr/share/dovecot/protocols.d/*.protocol
protocols = imap lmtp
listen = *
# Assurez-vous que cette ligne est bien décommentée :
!include conf.d/*.conf
Fichier de configuration complet : https://gist.github.com/hardware/ce55b0d241e229d5176a
On indique le chemin du conteneur local qui contiendra tous nos emails. Editez le fichier 10-mail.conf :
# vim /etc/dovecot/conf.d/10-mail.conf
# Le contenur local est organisé de cette manière :
# /var/mail/vhosts/domain.tld/utilisateur
mail_location = maildir:/var/mail/vhosts/%d/%n/mail
maildir_stat_dirs=yes
namespace inbox {
inbox = yes
}
mail_uid = 5000
mail_gid = 5000
first_valid_uid = 5000
last_valid_uid = 5000
mail_privileged_group = vmail
Fichier de configuration complet : https://gist.github.com/hardware/0fd157d8e83e09b50cb9
Les emails seront stockés dans le répertoire /var/mail. On doit donc créer un répertoire correspondant à notre domaine (celui qui est présent dans la table domain).
mkdir -p /var/mail/vhosts/domain.tld
Maintenant on ajoute un nouvel utilisateur et un nouveau groupe nommé vmail avec un UID/GID de 5000 :
groupadd -g 5000 vmail
useradd -g vmail -u 5000 vmail -d /var/mail
chown -R vmail:vmail /var/mail
Editer le fichier 10-auth.conf et modifier les lignes suivantes :
# vim /etc/dovecot/conf.d/10-auth.conf
disable_plaintext_auth = yes
auth_mechanisms = plain login
#!include auth-system.conf.ext # Commenter cette ligne
!include auth-sql.conf.ext # décommenter cette ligne
Fichier de configuration complet : https://gist.github.com/hardware/3a70923d37e6ad7c1859
Maintenant on va définir deux méthodes qui vont permettrent à Dovecot de savoir comment obtenir les utilisateurs et les mots de passe correspondants lors de la connexion. Editez le fichier auth-sql.conf.ext :
# vim /etc/dovecot/conf.d/auth-sql.conf.ext
# Le mot de passe est obtenu à partir de la base de donnée
passdb {
driver = sql
args = /etc/dovecot/dovecot-sql.conf.ext
}
# Par contre le nom d'utilisateur est obtenu de manière statique à partir du conteneur local
# %d = domaine.tld
# %n = utilisateur
userdb {
driver = static
args = uid=vmail gid=vmail home=/var/mail/vhosts/%d/%n
}
Ensuite editez le fichier dovecot-sql.conf.ext et modifiez les paramètres suivants :
# vim /etc/dovecot/dovecot-sql.conf.ext
# Paramètres de connexion
driver = mysql
connect = host=127.0.0.1 dbname=postfix user=postfix password=MOT DE PASSE
# Permet de définir l'algorithme de hachage.
# Pour plus d'information: http://wiki2.dovecot.org/Authentication/PasswordSchemes
# /!\ ATTENTION : ne pas oublier de modifier le paramètre $CONF['encrypt'] de PostfixAdmin
default_pass_scheme = MD5-CRYPT
# Requête de récupération du mot de passe du compte utilisateur
password_query = SELECT password FROM mailbox WHERE username = '%u'
Modifiez les permissions sur le répertoire /etc/dovecot :
chown -R vmail:dovecot /etc/dovecot
chmod -R o-rwx /etc/dovecot
Editer le fichier 10-master.conf avec le contenu suivant :
# vim /etc/dovecot/conf.d/10-master.conf
service imap-login {
inet_listener imap {
port = 143
}
inet_listener imaps {
port = 993
ssl = yes
}
service_count = 0
}
service imap {
}
service lmtp {
# On autorise Postfix à transférer les emails dans le spooler de Dovecot via LMTP
unix_listener /var/spool/postfix/private/dovecot-lmtp {
mode = 0600
user = postfix
group = postfix
}
}
service auth {
# On autorise Postfix à se connecter à Dovecot via LMTP
unix_listener /var/spool/postfix/private/auth {
mode = 0666
user = postfix
group = postfix
}
# On indique à Dovecot les permissions du conteneur local
unix_listener auth-userdb {
mode = 0600
user = vmail
group = vmail
}
user = dovecot
}
service auth-worker {
user = vmail
}
Fichier de configuration complet : https://gist.github.com/hardware/cdc1bae0a7e306501d15
Enfin, editez le fichier 10-ssl.conf et modifiez les paramètres suivants :
# vim /etc/dovecot/conf.d/10-ssl.conf
ssl = required
ssl_cert = </etc/ssl/certs/mailserver.crt
ssl_key = </etc/ssl/private/mailserver.key
ssl_protocols = !SSLv2 !SSLv3
ssl_cipher_list = ALL:!aNULL:!eNULL:!LOW:!MEDIUM:!EXP:!RC2:!RC4:!DES:!3DES:!MD5:!PSK:!SRP:!DSS:!AECDH:!ADH:@STRENGTH
ssl_prefer_server_ciphers = yes # Dovecot > 2.2.x
ssl_dh_parameters_length = 2048 # Dovecot > 2.2.x
Fichier de configuration complet : https://gist.github.com/hardware/91ed5e01929b8b414ae0
Si un jour vous oubliez le mot de passe du compte administrateur, cette procédure permet de le changer :
# On génère le hash correspondant au mot de passe
doveadm pw -s MD5-CRYPT -p MOT_DE_PASSE | sed 's/{MD5-CRYPT}//'
mysql -u root -p
mysql> connect postfix
mysql> UPDATE admin SET password = 'HASH' WHERE username = 'admin@domain.tld';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> quit
7 - Redémarrage des services et vérification des ports
On redémarre Postfix et Dovecot :
service postfix restart
service dovecot restart
Puis on vérifie que les ports 25 (SMTP), 587 (SMTPS) et 993 (IMAPS) sont bien en écoute sur 0.0.0.0. N'oubliez pas de les ouvrir au niveau de votre Firewall :
netstat -ptna
[...]
tcp 0 0 0.0.0.0:25 0.0.0.0: LISTEN 4995/master
tcp 0 0 0.0.0.0:587 0.0.0.0: LISTEN 4995/master
tcp 0 0 0.0.0.0:993 0.0.0.0:* LISTEN 5030/dovecot
[...]
On peut faire un petit essai via telnet avec la commande suivante depuis le serveur :
telnet localhost 25
# Puis faites lui un petit coucou <3
ehlo localhost
Normalement si tout se passe bien, vous allez obtenir la réponse suivante :
250-hostname.domain.tld
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
Si vous voyez 250-STARTTLS, c'est que le serveur supporte bien l'authentification par STARTTLS.
8 - Exemple de configuration d'un client mail : Thunderbird
La configuration du client mail reste relativement simple, il ne faut juste pas se tromper de port :
Les adresses imap.domain.tld et smtp.domain.tld sont arbitraires, vous pouvez très bien mettre à la place le FQDN de votre serveur (exemple: hostname.domain.tld), ça marchera très bien aussi. Le plus important ce sont les ports et les algorithmes de chiffrement/d'authentification (SSL/TLS - STARTTLS).
9 - Tests de fonctionnement
On va regarder les logs pour pour voir si il n'y a pas de soucis au niveau de la configuration du serveur mail.
Premier test : connexion via IMAP
Pour réaliser ce test, vous avez juste à ouvrir votre client mail pour que la connexion se fasse. En même temps, exécutez la commande suivante sur votre serveur :
tail -f /var/log/mail.log
Si vous avez les deux lignes suivantes c'est que la connexion IMAP/TLS est OK (ouf )
tail -f /var/log/mail.log
Aug 16 19:37:11 hostname dovecot: auth-worker(xxx): mysql(127.0.0.1): Connected to database postfix
Aug 16 19:37:11 hostname dovecot: imap-login: Login: user=<contact@domain.tld>, method=PLAIN, rip=ADRESSE IP CLIENT, lip=ADRESSE IP SERVEUR, mpid=xxx, TLS, session=<xxxxxxxx>
Deuxième test : envoie par SMTP ( Sarah envoie un email à Bob )
Si vous avez les lignes suivantes dans le fichiers mail.log, c'est que la connexion SASL et l'envoie par SMTPS sont OK (ça c'est cool :lol
tail -f /var/log/mail.log
Aug 16 19:54:13 hostname postfix/submission/smtpd[xxx]: connect from [VOTRE ADRESSE IP]
Aug 16 19:54:14 hostname dovecot: auth-worker(xxx): mysql(127.0.0.1): Connected to database postfix
Aug 16 19:54:14 hostname postfix/submission/smtpd[xxx]: client=[VOTRE ADRESSE IP], sasl_method=PLAIN, sasl_username=sarah.connor@terminator.net
Aug 16 19:54:15 hostname postfix/smtp[xxx]: to=<bob@nsa.gov>, relay=[ADRESSE IP RELAI]:25, status=sent (250 OK)
Troisième test : réception par IMAP ( Bob envoie un email à Sarah )
Si vous avez les lignes suivantes dans le fichiers mail.log, c'est que la réception par IMAP et le transfert de l'email par LMTP sont bons aussi.
Aug 16 20:04:58 hostname postfix/smtpd[xxx]: Anonymous TLS connection established from mail.nsa.gov: TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)
Aug 16 20:05:00 hostname postfix/qmgr[xxx]: from=<bob@nsa.gov>, size=1748, nrcpt=1 (queue active)
Aug 16 20:05:01 hostname dovecot: lmtp(xxx, sarah.connor@terminator.net): saved mail to INBOX
Aug 16 20:05:01 hostname postfix/lmtp[xxx]: to=<sarah.connor@terminator.net>, relay=mail.domain.tld[private/dovecot-lmtp], status=sent (250 2.0.0 <sarah.connor@terminator.net> Saved)
10 - Test d'indésirabilité (spam) de vos emails :
Allez sur ce site : http://www.mail-tester.com/ et envoyez un email à l'adresse indiquée en page d'accueil et vérifiez votre score. Normalement il ne devrait pas être suffisant pour que vous puissiez envoyer sereinement vos emails partout dans le monde. La première fois, je me suis pris 2.6/10
Vous obtiendrez la note maximum, si et seulement si :
- Votre message est sain et bien formaté
- Votre serveur n'est pas blacklisté
- Votre reverse / FQDN est correctement configuré
- DKIM (DomainKeys Identified Mail) est installé et configuré sur votre serveur
- Le champ Sender Policy Framework (SPF) est mis en place dans le fichier de zone de votre domaine
- Le champ MX est mis en place dans le fichier de zone de votre domaine
Il existe d'autres outils du même genre :
- auth-test@agari.com
- checkmyauth@auth.returnpath.net
- check-auth@verifier.port25.com
- https://www.valimail.com/
11 - Installation et configuration d'OpenDKIM
DKIM est un standard permettant d'associer de manière forte une entité ou une organisation avec un domaine au sein d'un email. On se déclare donc complètement responsable de la transmission du message sur le réseau. DKIM fonctionne par cryptographie asymétrique, le MTA (Mail Transfer Agent, dans notre cas il s'agit de Postfix) se charge de signer numériquement tous les emails envoyés avec une clé privée contenue sur le serveur. Le destinataire peut alors vérifier l'intégrité du corps ainsi que les en-têtes du message grâce à la clé publique fournie par le domainkey, qui est un champ TXT contenu dans les fichiers de zone de vos DNS.
On commence par installer OpenDKIM :
apt-get install opendkim opendkim-tools
Editez le fichier de configuration opendkim.conf avec le contenu suivant :
# vim /etc/opendkim.conf
AutoRestart Yes
AutoRestartRate 10/1h
UMask 002
Syslog Yes
SyslogSuccess Yes
LogWhy Yes
OversignHeaders From
AlwaysAddARHeader Yes
Canonicalization relaxed/simple
ExternalIgnoreList refile:/etc/opendkim/TrustedHosts
InternalHosts refile:/etc/opendkim/TrustedHosts
KeyTable refile:/etc/opendkim/KeyTable
SigningTable refile:/etc/opendkim/SigningTable
Mode sv
PidFile /var/run/opendkim/opendkim.pid
SignatureAlgorithm rsa-sha256
UserID opendkim:opendkim
Socket local:/var/spool/postfix/opendkim/opendkim.sock
Pour que Postfix puisse communiquer avec OpenDKIM, on va utiliser un socket, il faut créer le répertoire /var/spool/postfix/opendkim
mkdir /var/spool/postfix/opendkim
chown opendkim: /var/spool/postfix/opendkim
usermod -aG opendkim postfix
Ensuite on doit indiquer à Postfix comment s'interfacer avec OpenDKIM. Pour cela, editer le fichier main.cf et ajouter les lignes suivantes à fin du fichier de configuration :
# vim /etc/postfix/main.cf
milter_protocol = 6
milter_default_action = accept
smtpd_milters = unix:/opendkim/opendkim.sock
non_smtpd_milters = unix:/opendkim/opendkim.sock
Créér le répertoire suivant :
mkdir -p /etc/opendkim/keys
Ajoutez le fichier TrustedHosts avec le contenu suivant :
# vim /etc/opendkim/TrustedHosts
127.0.0.1
localhost
::1
*.domain.tld
N'oubliez pas de modifier domain.tld par votre nom de domaine.
Ajoutez le fichier KeyTable avec le contenu suivant. Dans cet exemple, nous utiliserons un sélecteur nommé mail. Vous pouvez le nommer comme vous le souhaitez.
# vim /etc/opendkim/KeyTable
mail._domainkey.domain.tld domain.tld:mail:/etc/opendkim/keys/domain.tld/mail.private
Ajoutez le fichier SigningTable avec le contenu suivant :
# vim /etc/opendkim/SigningTable
*@domain.tld mail._domainkey.domain.tld
Création de la clé publique et privée
Création du répertoire qui contiendra les clés :
cd /etc/opendkim/keys
mkdir domain.tld && cd domain.tld
Génération des clés de chiffrement :
# Paramètres : -s [sélecteur] -d [nom de domaine] -b [taille de la clé]
opendkim-genkey -s mail -d domaine.tld -b 2048
Certains registrars n'acceptent pas les clés > 1024 bits donc pensez à changer le paramètre au-dessus si besoin.
Modification des permissions de la clé privée :
chown opendkim:opendkim mail.private
Les permissions doivent être les suivantes (chmod 400) :
ls -lX /etc/opendkim/keys/domain.tld/
-rw------- 1 opendkim opendkim 887 août 16 11:28 mail.private
-rw------- 1 root root 305 août 16 11:28 mail.txt
Modification des DNS : Ajout de la clé publique
Copiez le contenu du fichier mail.txt (la clé publique) :
cat mail.txt
Le format de l'enregistrement DKIM est comme ceci :
mail._domainkey IN TXT "v=DKIM1; k=rsa; p=VOTRE CLE PUBLIQUE"
On va prendre exemple avec une clé de 4096 bits :
# cat mail.txt
mail._domainkey IN TXT ( "v=DKIM1; k=rsa; "
"p=MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA5tSGc+j5pLEuWeR4NIhDRPhwHUZll1/N3ajHF1wSttUVp/igdcpZTKTD7ccFmsY0l+72Q+rlnoCGGdhdw0ImRoPVZwBfSxvC3alw/YLLCEwpy+J/tXx2WOPdHM95TVbt0S/wVWpPxmr3mAIPO24R4NEf0yQdvktnB26UTcLBEMtqAEtEDLqrea/XM5HQMngWXAARy379H6mo1Y"
"ee3wUqYZPX+g8ljZZMpIlvaE0pjtVIZ0kV8/kXz0fa1XHanc6rTsF7/XxCLYJRAK6fcfO8u/Ro65uWNM3x8+WN1nkf/ojh8VN/0A5oUrlQVWba4OEXxCkbZTU7V+4okyyhAHV2+/c0qRsKRNj2YuPl3DmJ8/me/UBHbIEeji7kcBuVkgv0cakHolMbKWESBuuw1F5MPThQ3qbUcCI9mY4OtTnElk40DVXMenKwQ1EnqJZlHtj6XOo0/na4"
"epqH+rtUOXhan6ewd8XQvJk630Qi1FHzWmO7i4pb8Uo0EDrAQmPvCNsR+AttrIdK7Ry3xgKAUdSyfT2GXmtP3hpr4l2w0Qv0sXAkVzz9xF0OsUjb3pztdAKz9t9pHiIj3C5p0HQZTAr7oVAzjiDu6gntfoMzTB6mY6PKF2TYOBagu0AZAwgwuWb24zrGPXRPS8U01TlY6UVzFJbB+97i0Nim5jQmyf/r38cCAwEAAQ==" ) ; ----- DKIM key mail for domaine.tld
Si vous avez votre propre serveur DNS avec Bind9 par exemple, ce format là est valide, ça passe, pas besoin de modifier.
Si vous êtes chez un registrar comme Gandi, OVH ou autre, vous pouvez essayer :
1 - Soit de rassembler tous les morceaux de la clé en une seule chaîne de caractères, donc la clé au dessus deviendrait :
mail._domainkey IN TXT ( "v=DKIM1; k=rsa; p=MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA5tSGc+j5pLEuWeR4NIhDRPhwHUZll1/N3ajHF1wSttUVp/igdcpZTKTD7ccFmsY0l+72Q+rlnoCGGdhdw0ImRoPVZwBfSxvC3alw/YLLCEwpy+J/tXx2WOPdHM95TVbt0S/wVWpPxmr3mAIPO24R4NEf0yQdvktnB26UTcLBEMtqAEtEDLqrea/XM5HQMngWXAARy379H6mo1Yee3wUqYZPX+g8ljZZMpIlvaE0pjtVIZ0kV8/kXz0fa1XHanc6rTsF7/XxCLYJRAK6fcfO8u/Ro65uWNM3x8+WN1nkf/ojh8VN/0A5oUrlQVWba4OEXxCkbZTU7V+4okyyhAHV2+/c0qRsKRNj2YuPl3DmJ8/me/UBHbIEeji7kcBuVkgv0cakHolMbKWESBuuw1F5MPThQ3qbUcCI9mY4OtTnElk40DVXMenKwQ1EnqJZlHtj6XOo0/na4epqH+rtUOXhan6ewd8XQvJk630Qi1FHzWmO7i4pb8Uo0EDrAQmPvCNsR+AttrIdK7Ry3xgKAUdSyfT2GXmtP3hpr4l2w0Qv0sXAkVzz9xF0OsUjb3pztdAKz9t9pHiIj3C5p0HQZTAr7oVAzjiDu6gntfoMzTB6mY6PKF2TYOBagu0AZAwgwuWb24zrGPXRPS8U01TlY6UVzFJbB+97i0Nim5jQmyf/r38cCAwEAAQ==" ) ; ----- DKIM key mail for domaine.tld
2 - Soit de supprimer les espaces entre les "" mais tout en gardant les "" (pas comme dans le premier exemple) :
mail._domainkey IN TXT ( "v=DKIM1; k=rsa; "p=MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA5tSGc+j5pLEuWeR4NIhDRPhwHUZll1/N3ajHF1wSttUVp/igdcpZTKTD7ccFmsY0l+72Q+rlnoCGGdhdw0ImRoPVZwBfSxvC3alw/YLLCEwpy+J/tXx2WOPdHM95TVbt0S/wVWpPxmr3mAIPO24R4NEf0yQdvktnB26UTcLBEMtqAEtEDLqrea/XM5HQMngWXAARy379H6mo1Y""ee3wUqYZPX+g8ljZZMpIlvaE0pjtVIZ0kV8/kXz0fa1XHanc6rTsF7/XxCLYJRAK6fcfO8u/Ro65uWNM3x8+WN1nkf/ojh8VN/0A5oUrlQVWba4OEXxCkbZTU7V+4okyyhAHV2+/c0qRsKRNj2YuPl3DmJ8/me/UBHbIEeji7kcBuVkgv0cakHolMbKWESBuuw1F5MPThQ3qbUcCI9mY4OtTnElk40DVXMenKwQ1EnqJZlHtj6XOo0/na4""epqH+rtUOXhan6ewd8XQvJk630Qi1FHzWmO7i4pb8Uo0EDrAQmPvCNsR+AttrIdK7Ry3xgKAUdSyfT2GXmtP3hpr4l2w0Qv0sXAkVzz9xF0OsUjb3pztdAKz9t9pHiIj3C5p0HQZTAr7oVAzjiDu6gntfoMzTB6mY6PKF2TYOBagu0AZAwgwuWb24zrGPXRPS8U01TlY6UVzFJbB+97i0Nim5jQmyf/r38cCAwEAAQ==" ) ; ----- DKIM key mail for domaine.tld
Je sais que cette solution fonctionne chez Gandi en tout cas.
3 - Soit de réduire la taille de la clé à 1024 bits, certains registrars n'acceptent tout simplement pas des clés supérieures à cette taille.
Et pour finir, on redémarre tous les services :
service postfix restart
service dovecot restart
service opendkim restart
Vous pouvez exécuter les commandes suivantes pour que les services démarrent automatiquement lors du boot :
# Debian 7
update-rc.d postfix defaults
update-rc.d dovecot defaults
update-rc.d opendkim defaults
# Debian 8
systemctl enable postfix.service
systemctl enable dovecot.service
systemctl enable opendkim.service
Attendez quelques minutes la propagation des DNS. Vous pouvez vérifier que le champ domainkey est bien visible en exécutant la commande suivante à partir de votre pc :
host -t TXT mail._domainkey.domain.tld
Si elle retourne ce message :
Host mail._domainkey.domain.tld not found: (NXDOMAIN)
C'est que vos DNS ne se sont pas encore propagés sur les serveurs de votre FAI, patientez encore un peu.
Pour tester le bon fonctionnement d'OpenDKIM, utilisez le site que l'on a vu tout à l'heure : http://www.mail-tester.com/