Outils pour utilisateurs

Outils du site


installation_d_un_serveur_de_mail_complet

Installation d'un serveur de mail complet

Pré-requis :

  • Un nom de domaine (avec un accès aux DNS et fichiers de zone)
  • Nginx
  • PHP
  • OpenSSL
  • MySQL

Schéma :

Configuration du nom d'hôte, du FQDN et du champ MX :

Dans la suite de ce tutoriel, nous allons utiliser les caractéristiques suivantes (à adapter selon votre configuration) :

  • Nom de domaine principal : dams.ovh
  • Nom d'hôte : mail
  • FQDN : smtp.dams.ovh
  • MX : smtp.dams.ovh

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 **mail** > /etc/hostname

Pour modifier le FQDN, il faut editer le fichier /etc/hosts :

# vi /etc/hosts
127.0.0.1 localhost.localdomain localhost
IP DU SERVEUR smtp.dams.ovh mail

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 (OVH).

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 interroger cette entrée pour savoir où transmettre le message. Donc si cette entrée n'est pas ou mal définie, vous ne recevrez jamais d'emails.

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

mysql -u root -p
CREATE DATABASE postfix;
CREATE USER 'postfix'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON `postfix`.* TO 'postfix'@'localhost';
FLUSH PRIVILEGES;
EXIT;

3 - Installation et configuration de PostfixAdmin

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-3.2/postfixadmin-3.2.tar.gz
tar -xzf postfixadmin-3.2.tar.gz
mv postfixadmin-3.2 postfixadmin
rm -rf postfixadmin-3.2.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@dams.ovh';
$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.dams.ovh;
   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 :

http://postfixadmin.dams.ovh/setup.php

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@dams.ovh). C'est à partir de ce compte que vous allez gérer toutes vos adresses emails. Attention: admin@dams.ovh 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 :

http://postfixadmin.dams.ovh/login.php

On va commencer par ajouter un nouveau domaine, dans notre exemple il s'agit de dams.ovh :

Et une adresse email, exemple damien@dams.ovh :

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 Ovh
Organizational Unit Name (eg, section) []:Mail server
Common Name (e.g. server FQDN or YOUR name) []: Dams
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 (fichier main.cf de postfix) :

# 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    = smtp.dams.ovh
myorigin      = smtp.dams.ovh
mydestination = localhost localhost.$mydomain
mynetworks    = 127.0.0.0/8
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

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

5 - Installation de Dovecot

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

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/dams.ovh/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

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/dams.ovh

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

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 = dams.ovh
# %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

}

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 = !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

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 :

serveur de reception IMAP : smtp.dams.ovh | le port est 993 chiffrement SSL/TLS
serveur d'envoi SMTP : smtp.dams.ovh | le port est 587 chiffrement 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 😛)

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=<damien@dams.ovh>, method=PLAIN, rip=ADRESSE IP 
CLIENT, lip=ADRESSE IP SERVEUR, mpid=xxx, TLS, session=<xxxxxxxx>

Deuxième test : envoie par SMTP

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)🙂

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=damien.cel@gmail.com
Aug 16 19:54:15 hostname postfix/smtp[xxx]: to=<damien@dams.ovh>, relay=[ADRESSE IP RELAI]:25, status=sent (250 OK)

Troisième test : réception par IMAP

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 smtp.dams.ovh: TLSv1 with 
cipher ECDHE-RSA-RC4-SHA (128/128 bits)
Aug 16 20:05:00 hostname postfix/qmgr[xxx]: from=<damien@dams.ovh>, size=1748, nrcpt=1 (queue active)
Aug 16 20:05:01 hostname dovecot: lmtp(xxx, damien.cel@gmail.com): saved mail to INBOX
Aug 16 20:05:01 hostname postfix/lmtp[xxx]: to=<damien.cel@gmail.com>, 
relay=smtp.dams.ovh[private/dovecot-lmtp], status=sent (250 2.0.0 <damien.cel@gmail.com> 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

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
*.dams.ovh

N'oubliez pas de modifier dams.ovh 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.dams.ovh dams.ovh:mail:/etc/opendkim/keys/dams.ovh/mail.private

Ajoutez le fichier SigningTable avec le contenu suivant :

# vim /etc/opendkim/SigningTable

*@dams.ovh mail._domainkey.dams.ovh

Création de la clé publique et privée

Création du répertoire qui contiendra les clés :

cd /etc/opendkim/keys
mkdir dams.ovh && cd dams.ovh

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 dams.ovh -b 1024

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/dams.ovh/

-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"

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 :

update-rc.d postfix  defaults
update-rc.d dovecot  defaults
update-rc.d opendkim defaults

ou (suivant votre version de Debian)

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.dams.ovh

Si elle retourne ce message :

Host mail._domainkey.dams.ovh 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/

12 - Ajouter un enregistrement SPF (Sender Policy Framework)

Wikipédia :
Sender Policy Framework (SPF) est une norme de vérification du nom de domaine de l'expéditeur d'un courrier 
électronique, normalisé dans la RFC 7208. L'adoption de cette norme est de nature à réduire le spam.

Ajoutez cette ligne dans le fichier de zone de votre nom de domaine :

@        IN      TXT     "v=spf1 a mx ip4:ADRESSE IP DE VOTRE SERVEUR ~all"

Vous pouvez maintenant refaire un test sur ce site : http://www.mail-tester.com/

Si tout est bon, vous devriez avoir 10/10 :

13 - DMARC (Domain-based Message Authentication, Reporting & Conformance)

DMARC est une spécification technique assez récente (2011), qui est toujours en draft par l'IETF https://datatracker.ietf.org/doc/rfc7489/, les contributeurs initiaux sont un consortium de plusieurs géants d'internet comme AOL, Yahoo, Google, Microsoft, Paypal, Facebook…etc. Cette spécification permet de réduire l'usage abusif des e-mails, tels que le spam, le phishing en ajoutant une couche supplémentaire dans le processus d'authentification des mails.

En fait ce mécanisme utilise DKIM et SPF et permet d'informer les autres fournisseurs de mail des actions à entreprendre lorsqu'ils reçoivent un mail provenant de notre domaine. C'est peut-être pas très clair dit comme ça, mais c'est pas compliqué, prenons un exemple :

Vous envoyez un mail à partir de votre adresse @dams.ovh à un amis qui est chez Gmail. Google vas donc utiliser DMARC et demander à votre serveur ce qu'il doit faire lorsqu'il reçoit un mail appartenant à votre domaine. Votre serveur répond qu'il doit vérifier la validité de DKIM et SPF, si tout est valide le mail est envoyé au destinataire sinon il est soit mis en quarantaine (dossier spam), soit il n'est pas du tout envoyé (blocké au niveau de la couche smtp).

Voici un ptit schéma :

Les règles de DMARC sont stockés dans un enregistrement de type TXT dans le fichier de zone de votre nom de domaine, exemple :

NE PAS METTRE L'ENREGISTREMENT DMARC SI VOUS N'ÊTES PAS CERTAIN DU FONCTIONNEMENT DE SPF ET DKIM. SINON LES FOURNISSEURS DE MAILS QUI RESPECTENT LES IDENTIFICATEURS D'ALIGNEMENT DMARC (GMAIL, MICROSOFT ENTRE AUTRE) VONT BLOQUER VOTRE DOMAINE PAR PRÉCAUTION. SI VOUS NE COMPRENEZ PAS À QUOI ÇA SERT, NE LE METTEZ PAS !

_dmarc  IN  TXT "
  v=DMARC1; 
  p=reject; 
  rua=mailto:postmaster@dams.ovh; 
  ruf=mailto:admin@dams.ovh; 
  adkim=s;
  aspf=s; 
  pct=100; 
  rf=afrf; 
  sp=reject
"

Pour plus de clarté, j'ai sauté une ligne après chaque paramètre, mettez tout sur une ligne dans votre fichier de zone. Bon quelques explications s'imposent par rapport aux paramètres non ?

  • dmarc : L'enregistrement contenant votre politique vis à vis de DMARC se nomme dmarc, donc il correspond au sous domaine : _dmarc.dams.ovh.tld
  • v=DMARC1 : Version du protocole
  • p=reject : Bloquer les mails qui ne respectent pas les identificateurs d'alignement
  • rua=mailto : Aggregate reports - Adresse mail qui recevra les rapports des autres providers (gmail, outlook…etc) concernant DMARC comme les résultats d'authentification, les actions nécessaires à entreprendre pour corriger les soucis avec votre domaine…etc
  • ruf=mailto : Failure report ou Forensic reports - Adresse mail qui recevra les alertes concernant DMARC (échec d'authentification….etc)
  • adkim=s : Identificateur d'alignement DKIM, s = strict ( Organizational Domain configuré au sein de DKIM doit être strictement égal au “From Domain” )
  • aspf=s : Identificateur d'alignement SFP, s = strict ( Organizational Domain configuré au sein de SPF doit être strictement égal au “From Domain” )
  • pct=100 : Pourcentage des messages sujet au filtrage DMARC
  • rf=afrf : Authentication Failure Reporting Format - Format du rapport d'erreur
  • sp=reject : Politique concernant les sous-domaines (voir p=reject plus haut)

L'implémentation côté serveur est sensiblement similaire à OpenDKIM.

apt-get install opendmarc

Editer le fichier de configuration opendmarc.conf avec le contenu suivant :

# vim /etc/opendmarc.conf

AutoRestart             Yes
AutoRestartRate         10/1h
UMask                   0002
Syslog                  true

AuthservID              "smtp.dams.ovh"
TrustedAuthservIDs      "smtp.dams.ovh"
IgnoreHosts             /etc/opendkim/TrustedHosts
IgnoreMailFrom          "dams.ovh"
RejectFailures          false

UserID                  opendmarc:opendmarc
PidFile                 /var/run/opendmarc/opendmarc.pid
Socket                  local:/var/spool/postfix/opendmarc/opendmarc.sock

Pour que Postfix puisse communiquer avec Opendmarc, on va utiliser un socket, il faut créer le répertoire /var/spool/postfix/opendmarc

mkdir /var/spool/postfix/opendmarc
chown opendmarc: /var/spool/postfix/opendmarc
usermod -aG opendmarc postfix

Ensuite dans le fichier /etc/postfix/main.cf, editer cette ligne :

smtpd_milters = unix:/opendkim/opendkim.sock, unix:/opendmarc/opendmarc.sock

Démarrage auto au boot de la VM

systemctl enable opendmarc.service

Puis on redémarre les services :

systemctl restart opendmarc
systemctl restart postfix
installation_d_un_serveur_de_mail_complet.txt · Dernière modification : de 127.0.0.1