Serveur de courriels
Postfix est un serveur de messagerie électronique. Il se charge de la livraison de courriers électroniques (courriels) et a été conçu comme une alternative plus rapide, plus facile à administrer et plus sécurisée que l'historique Sendmail.
Dans ce tuto, nous mettrons en place :
- Postfix : serveur SMTP
- Dovecot : serveur IMAP
- À COMPLÉTER (sieve, spam...)
Pré-requis :
- Debian 8
- Un nom de domaine avec un enregistrement MX
- Une IP publique fixe
Article en cours de rédaction.
Test du DNS
Installation des outils
# apt update && apt install openssl dnsutils telnet
Test du fonctionnement du champ MX
$ dig exemple.fr MX
La réponse doit contenir une "ANSWER SECTION" avec ceci
exemple.fr 10800 IN MX 10 mail.exemple.fr
Installation de Postfix
Génération du certificat et de la clé pour Postfix et Dovecot
# openssl req -x509 -nodes -days 3650 -newkey rsa:4096 -out /etc/ssl/certs/mailcert.pem -keyout /etc/ssl/private/mail.key
Installation du serveur SMTP
# apt install postfix
Accepter les choix proposés, choisir la configuration "Site internet" et mettre le FQDN au nom du serveur demandé.
Génération de la clé Diffie Hellman (si on ne le fait pas, Postfix utilise la sienne)
# openssl dhparam -out /etc/postfix/dh2048.pem 2048
Configuration de Postfix
Configuration principale
La configuration principale de Postfix se fait via l'intermédiaire du fichier main.cf qui renseigne un petit sous-ensemble des paramètres contrôlant les opérations du système de messagerie. Les paramètres non explicitement renseignés sont initialisés avec leur valeur par défaut.
Main.cf
Édition du fichier de configuration principal
# vim /etc/postfix/main.cf
La configuration suivante sera utilisée :
# smtpd : entrant/inbound # smtp : sortant/outbound #------------------------------------Connexion protocol SMTP------------------------------------# # Bannière affiché lorsqu'on se connecte en SMTP sur le port 25 smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU) # Desactive la commande SMTP VRFY. Arrête certaine technique pour avoir des adresses email disable_vrfy_command = yes # Impose au client SMTP de démarrer la session SMTP par une commande Helo (ou ehlo) smtpd_helo_required = yes #------------------------------------Gestion des messages locaux (innutile)------------------------------------# # Service qui envoie des notifications "nouveau message" biff = no # Avec le courrier local ça ajoute .NDD aux adresses incomplètes (seulement le nom d'hote) append_dot_mydomain = no #------------------------------------Nom de machine et réseaux autorisés------------------------------------# # Le nom de la machine du système de messagerie # Par défaut c'est host.domain.tld mais on peut mettre un reverse dns myhostname = mail.exemple.fr # Le domaine utilisé par defaut pour poster les messages locaux myorigin = mail.exemple.fr # Liste des domaines pour lequel le serveur doit accepter le courrier mydestination = mail.exemple.fr, exemple.fr, localhost.exemple.fr, localhost # Pour effectuer des livraisons de courrier avec un relay (ici non) relayhost = # Liste des réseaux locaux autorisés (leur permet d'outrepasser le SASL) mynetworks = 192.168.1.0/24, 192.168.160.0/24, 127.0.0.0/8 # Activation d'IPv6 (seul v4 est activé par défaut) inet_protocols = all # Séparateur entre le nom d'utilisateur et les extensions d'adresses recipient_delimiter = + # Les utilisateurs locaux ne pourront pas envoyer de messages à "utilisateur@nom-de-domaine-partiel" mais devront spécifier le nom de domaine complet append_dot_mydomain = no # Interfaces réseaux à écouter (ici toutes) inet_interfaces = all #------------------------------------Règles SMTP------------------------------------# #Restrictions d'accès appliqués dans le contexte d'une commande RCPT TO # permit_mynetworks : Autorise les requêtes si l'IP du client correspond à l'un des réseaux spécifiés dans $mynetworks # permit_sasl_authenticated : Accepter la connexion lorsque le client est authentifié # reject_non_fqdn_recipient : Rejette la requête lorsque l'adresse RCPT TO n'est pas de forme pleinement qualifiée (FQDN) # reject_unauth_destination : Rejette la requête sauf si l'une des propositions listés dans la doc est vrai # reject_unknown_recipient_domain : Rejette la requête lorsque le RCPT TO ne correspond à aucun A ou MX smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_non_fqdn_recipient, reject_unauth_destination, reject_unknown_recipient_domain, # Règles sur l'échange HELO qui survient avant la connexion # permit_mynetworks : Autorise les requêtes si l'IP du client correspond à l'un des réseaux spécifiés dans $mynetworks # 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, # Règles de connexion des clients # permit_mynetworks : Autorise les requêtes si l'IP du client correspond à l'un des réseaux spécifiés dans $mynetworks # permit_inet_interfaces : Accepte les resuêtes des client entrant par les interfaces listés dans $inet_interfaces # permit_sasl_authenticated : Accepter la connexion lorsque le client est authentifié # reject_rbl_client : Refuse les connexion des clients (IP) listés dans une liste RBL suite à des envois massifs de spam # reject_plaintext_session : Refuser les connexions non sécurisées # reject_unauth_pipelining : Refuser les défauts lors de la connexion (difficile de synthétiser. Ce référer à la doc) smtpd_client_restrictions = permit_mynetworks, permit_inet_interfaces, permit_sasl_authenticated, reject_rbl_client zen.spamhaus.org # reject_plaintext_session, # reject_unauth_pipelining # L'utilisation de reject_unauth_pipelining dans les autres contextes que smtpd_data_restrictions n'est pas recommandé # 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 # check_sender_access : Vérifie si l'adresse email (reçue ou envoyée) est dans notre fichier liste noire et applique la directive de celle-ci smtpd_sender_restrictions = reject_non_fqdn_sender, reject_unknown_sender_domain, check_sender_access hash:/etc/postfix/adresses-rejet #Restrictions d'accès optionelles appliqués dans le contexte d'une commande SMTP DATA # reject_unauth_pipelining : Refuser les défauts lors de la connexion (difficile de synthétiser. Ce référer à la doc) # permit : Tout est autorisé par défaut smtpd_data_restrictions = reject_unauth_pipelining, permit #------------------------------------Gestion des boites et des messages------------------------------------# # Taille des boîtes auix lettres (0 = illimité) mailbox_size_limit = 0 #Fixer la taille limite des messages (ici 30Mo) message_size_limit = 31457280 # Répertoire de destination des courriers home_mailbox = Maildir/ mailbox_command = /usr/lib/dovecot/deliver #---------------------------------------------- # Gestion des alias de comptes et de domaines | #---------------------------------------------- #Emplacement du fichier des alias #Alias de comptes principal alias_maps = hash:/etc/aliases alias_database = hash:/etc/aliases #Alias de domaines secondaires virtual_alias_maps = hash:/etc/postfix/aliases_domaines virtual_alias_domains = toto.fr, titi.org #-------------------- # SASL serveur SMTP | #-------------------- # Authentification SMTP (utilise les identifiants IMAP via SASL en passant par Dovecot) smtpd_sasl_auth_enable = yes smtpd_sasl_type = dovecot smtpd_sasl_path = private/auth # Interdit les méthodes qui autorisent l'authentification anonyme smtpd_sasl_security_options = noanonymous smtpd_sasl_tls_security_options = $smtpd_sasl_security_options smtpd_sasl_local_domain = $mydomain # Reporte le nom d'utilisateur SASL authentifié dans l'en-tête de message Received du serveur smtpd_sasl_authenticated_header = yes # N'accepte pas le support de l'ancienne commande AUTH (Outlook 4 par exemple) broken_sasl_auth_clients = no #------------------------------------Chiffrement------------------------------------# # SSL/TLS clés et certificats smtpd_tls_cert_file = /etc/ssl/certs/mailcert.pem smtpd_tls_key_file = /etc/ssl/private/mail.key smtpd_tls_dh1024_param_file = $config_directory/dh2048.pem #------------------ # TLS client SMTP | #------------------ # Verbositer des logs smtp_tls_loglevel = 1 # Accepte de ce connecter à des serveurs SMTP en clair mais préfaire le TLS smtp_tls_security_level = may # Interdire le SSLv2 et v3 smtp_tls_protocols = !SSLv2, !SSLv3 #Interdire le SSLv2 et v3 obligatoirement (ça n'a aucun sens mais que voulez-vous ? Documentation de Postfix quand tu nous tiens...) smtp_tls_mandatory_protocols = !SSLv2, !SSLv3 #Postfix retient apparemment qui propose du STARTTLS (je vois pas à quoi ça peut bien servir...) smtp_tls_note_starttls_offer = yes #N'autoriser que les chiffrements costauds smtp_tls_mandatory_ciphers = high #Exclure les algorithmes obsolètes ou insufisants listés ci-dessous smtp_tls_exclude_ciphers = aNULL, eNULL, EXPORT, DES, 3DES, RC2, RC4, MD5, PSK, SRP, DSS, AECDH, ADH #Pas d'explications claires sur la fonction de ce paramètre tls_preempt_cipherlist = yes #Cache TLS. Permet de mémoriser les anciennes sessions TLS afin d'effectuer une poignée de mains raccourcie. Ce qui améliore concidérablement les performances smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache #------------------- # TLS serveur SMTP | #------------------- #Verbositer des logs smtpd_tls_loglevel = 1 #Accepte les connexions des clents SMTP en claire mais préfaire le TLS smtpd_tls_security_level = may #Refuse les authentifications SASL en clair si le serveur gère le TLS smtpd_tls_auth_only = yes #Indique le chiffrement utilisé dans l'en-tête du message (ça ne sert pas à grand chose si on passe par plusieurs serveurs car les intermédiaires peuvent y mettre leurs sauce donc ce n'est qu'indicatif) smtpd_tls_received_header = yes # Source du générateur de nombre aléatoire pour les algorithmes de chiffrement tls_random_source = dev:/dev/urandom # Versions de TLS autorisés (SSL refusé) smtpd_tls_protocols = TLSv1.2, TLSv1.1, TLSv1, !SSLv3, !SSLv2 # Toujours aucune idée de l'utilité mais c'est activé par défaut de toute façon d'après la documentation smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3 #Cache TLS. Permet de mémoriser les ancienne sessions TLS afin d'effectuer une poignée de mains raccourcie. Ce qui améliore concidérablement les performances smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache #------------------------------------Entêtes des courriers------------------------------------# # Emplacement des fichiers de suppression de certaines en-têtes à caractère privé contenues dans les messages envoyés # Concrètement, cela supprime toute la section "Received: from" propre au client (contenant son IP par exemple) -> son SMTP. Seul le "Received: from" son SMTP -> SMTP distant reste mime_header_checks = regexp:/etc/postfix/header_checks header_checks = regexp:/etc/postfix/header_checks #------------------------------------Source documentation------------------------------------# # http://postfix.traduc.org/index.php/postconf.5.html # http://www.postfix.org/postconf.5.html
Liste noire
Création de la liste noire d'adresse (envoi et réception)
# vim /etc/postfix/adresses-rejet
Avec ce contenu :
email@bloquer 554 Parle à ma main, ma tête est malade.
Le message provenant de cette adresse sera rejeté avec un message SMTP (qui apparaîtra dans les log du serveur distant) précisé après le code 554. Si aucun message n'est spécifié, REJECT utilise les paramètres par défauts, à savoir "rejected: Access denied" comme raison du rejet.
Postfix utilisant des binaires pour les configurations externes, il faut compiler la liste noire (la directive "check_sender_access hash" du main.cf de façon transparente un ".db" au chemin spécifié) avec la commande suivante :
# postmap /etc/postfix/adresses-rejet
Cette commande est à exécuter à chaque modifications de la liste (le redémarrage de Postfix n'est pas nécessaire).
Entêtes_vie_privée
On va créer une liste de critaires regex servant à supprimer automatiquement certaines entêtes contenant des informations personnelles sur le client éméteur lors de l'envoi du courrier (améliore la vie privée).
# vim /etc/postfix/header_checks
Ce fichier doit contenir ceci :
/^Received:.*with ESMTPSA/ IGNORE /^X-Originating-IP:/ IGNORE /^X-Mailer:/ IGNORE /^User-Agent:/ IGNORE
Explications : Les directives suivantes contenues dans la section "Entêtes des courriers" du fichier main.cf édité ci-dessus indiquent à Postfix l'emplacement de ces règles.
mime_header_checks = regexp:/etc/postfix/header_checks header_checks = regexp:/etc/postfix/header_checks
Pour que Postfix les utilises, il faut reconstruire la hash table.
# postmap /etc/postfix/header_checks
Et rafraichire sa configuration.
# postfix reload
Configuration secondaire
La configuration secondaire se fait via le fichier master.cf et permet de gérer la façon dont se connecte les clients au service de messagerie et comment ce dernier réagit lorsqu'une requête lui est destinée.
Master.cf
Il faut dé-commenter certains choses et en commenter d'autre sur 2 paragraphes du début du fichier.
# vim /etc/postfix/master.cf
Attention à la première ligne qui commence par SMTP ! Si elle est oublié ça génère des problèmes de ouf in-débogable car Postfix n'écrit de fait rien dans les log... Il ne faut donc pas l'oublier...
smtp inet n - - - - smtpd submission inet n - - - - smtpd -o syslog_name=postfix/submission -o smtpd_tls_security_level=encrypt -o smtpd_sasl_auth_enable=yes # -o smtpd_reject_unlisted_recipient=no # -o smtpd_client_restrictions=$mua_client_restrictions -o smtpd_client_restrictions=permit_sasl_authenticated,reject # -o smtpd_helo_restrictions=$mua_helo_restrictions # -o smtpd_sender_restrictions=$mua_sender_restrictions # -o smtpd_recipient_restrictions= # -o smtpd_relay_restrictions=permit_sasl_authenticated,reject -o milter_macro_daemon_name=ORIGINATING smtps inet n - - - - smtpd -o syslog_name=postfix/smtps -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes # -o smtpd_reject_unlisted_recipient=no # -o smtpd_client_restrictions=$mua_client_restrictions -o smtpd_client_restrictions=permit_sasl_authenticated,reject # -o smtpd_helo_restrictions=$mua_helo_restrictions # -o smtpd_sender_restrictions=$mua_sender_restrictions # -o smtpd_recipient_restrictions= # -o smtpd_relay_restrictions=permit_sasl_authenticated,reject -o milter_macro_daemon_name=ORIGINATING
Intégration de Dovecot
Ajouter à la fin du fichier l'intégration avec Dovecot.
dovecot unix - n n - - pipe flags=DRhu user=email:email argv=/usr/lib/dovecot/deliver -f ${sender} -d ${recipient}
Installation et configuration de Dovecot
Installation de Dovecot
Le serveur IMAP Dovecot s'installe dovecot-common est un paquet virtuel renvoyant vers dovecot-core, l'un peut être remplacé par l'autre dans la ligne de commande suivante de manière indéiférrente
# apt install dovecot-common dovecot-imapd
Configuration de Dovecot
Gestion d'IPv6
Activation du support d'IPv6 (optionnel suivant votre configuration)
# vim /etc/dovecot/dovecot.conf
Ajouter cette ligne
listen = *, [::]
Emplacement des dossiers utilisateurs
Configuration de l'emplacement du répertoire des email des utilisateurs
# vim /etc/dovecot/conf.d/10-mail.conf
Remplacer mail_location = mbox:~/mail:INBOX=/var/mail/%u par mail_location = maildir:~/Maildir
Couche de chiffrement TLS
Configuration de la couche de chiffrement (on va le rendre obligatoire)
# vim /etc/dovecot/conf.d/10-ssl.conf
Ajouter ceci (attention la ligne "ssl = no" est présente par défaut, il faut la supprimer) :
# SSL/TLS support: yes, no, required. <doc/wiki/SSL.txt> ssl = required ssl_cert = </etc/ssl/certs/mailcert.pem ssl_key = </etc/ssl/private/mail.key ssl_protocols = !SSLv2 !SSLv3 # Désactivation du SSLv2 et v3 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
les valeurs sont précédés d'un chevron ouvert qui ne se ferme jamais "<". C'est louche mais normal (documentation officielle de Dovecot). Il n'y a donc pas d'erreur dans les lignes mentionnées ci-dessus.
Configuration de l'authentification
Désactiver l'authentification en claire
# vim /etc/dovecot/conf.d/10-auth.conf
Décommenter la ligne suivante dans le fichier suivant :
disable_plaintext_auth = yes
Configuration de l'authentification
# vim /etc/dovecot/conf.d/10-master.conf
service auth { unix_listener /var/spool/postfix/private/auth { mode = 0660 user = postfix group = postfix } # auth_socket_path points to this userdb socket by default. It's typically # used by dovecot-lda, doveadm, possibly imap process, etc. Users that have # full permissions to this socket are able to get a list of all usernames and # get the results of everyone's userdb lookups. # # The default 0666 mode allows anyone to connect to the socket, but the # userdb lookups will succeed only if the userdb returns an "uid" field that # matches the caller process's UID. Also if caller's uid or gid matches the # socket's uid or gid the lookup succeeds. Anything else causes a failure. # # To give the caller full permissions to lookup all users, set the mode to # something else than 0666 and Dovecot lets the kernel enforce the # permissions (e.g. 0777 allows everyone full permissions). unix_listener auth-userdb { #mode = 0666 #user = #group = } }
Auto création des répertoires utilisateurs
Auto création des répertoires "envoyé", "brouillons", "Indésirables" et "corbeille" ("réception" est créé par Postfix)
# vim /etc/dovecot/conf.d/15-mailboxes.conf
Il faut que les sections correspondantes aux répertoires soient présentes et que l'argement "auto = create" (création du dossier dans l'arboréscence) ou "auto = suscribe" (création du dossier et inscription automatique dans le client). Attention, les espaces avant les acolades sont ultra important (le service ne se lance pas si il n'y en a pas...) ça peut générer une séance de debuggage bien chiante juste pour cette merde.