Identification

Postfix installation et configuration

Catégorie : Auto-hébergement
Mots-clés : debian mta postfix spam

Introduction

Postfix est une application de type MTA (Mail Transfert Agent), ce que l'on désigne également par "serveur de courrier sortant". Son rôle est de transférer les courriers électroniques de ses utilisateurs au serveur sensé les recevoir. Pour assurer sa mission, il travaille avec le protocole de transfert de courrier SMTP (Simple Mail Transfert Protocol).

Postfix a été développé avec comme objectif de palier aux problèmes de rapidité, de sécurité et d'administration du serveur Sendmail, le premier et le plus répandu des MTA.

Ce billet décrit l'installation et la configuration de base de Postfix sur un serveur Debian. Le MTA sera configuré de manière à prendre en charge l'envoi et la réception des courriers d'un nom de domaine.

Prérequis

  • Un serveur Debian correctement installé, configuré et mis à jour,
  • Un nom de domaine, géré par vous ou un fournisseur spécialisé (OVH, Gandi...),
  • Un accès à la configuration du serveur qui gère le domaine (zones DNS).

Préparation

Pare-feu

Si votre serveur est équipé d'un pare-feu (ce qui est recommandé), il faut vérifier que le port numéro 25 est ouvert en entrée et en sortie afin que le protocole SMTP puisse communiquer correctement.

Assurez vous également que le pare-feu autorise les requetes ICMP (Internet Control Message Protocol) de types 8 (echo) et 0 (réponse echo), communément appelées "pings".

DNS

Nous allons installer un serveur de courrier qui doit gérer l'ensemble des courrier d'un domaine ; il nous faut donc commencer par déclarer ce serveur dans les règles, c'est à dire auprès du serveur DNS (Domain Name System) qui se charge du domaine.

Rappel : les modifications effectuées au niveau des DNS peuvent mettre jusqu'à 24h pour se propager complètement sur le réseau.

Enregistrement A

La première modification consiste à créer un enregistrement DNS de type A (Adress record). Il s'agit d'un enregistrement qui permet de faire la correspondance entre le nom d'hôte de notre serveur et son adresse IP. Un enregistrement de type A est formaté comme suit :

serveur.mondomaine.com  IN  A  111.222.333.444

Une fois l'enregistrement ajouté vous pourrez vérifier que tout est bon avec la commande suivante :

$ dig -t A +noall +answer serveur.mondomaine.com

Enregistrement MX

La seconde modification concerne l'ajout d'un enregistrement de type MX (Mail eXchanger) faisant référence à l'enregistrement A précédemment crée. Sans cet enregistrement vos utilisateurs ne recevraient jamais le courrier qui leur est destiné. Il a le format suivant :

mondomaine.com.  IN  MX  1  serveur.mondomaine.com.

La vérification s'effectue à l'aide de la commande :

$ dig -t MX +noall +answer mondomaine.com

Reverse DNS

Il faut maintenant ajouter un enregistrement DNS inversé ; c'est à dire un enregistrement qui permetra de faire la correspondance entre l'adresse IP de notre serveur et son nom d'hôte (c'est l'inverse d'un type A).

Si vous gérez vous même votre serveur DNS, référez vous à sa documentation pour réaliser cette opération dans les règles ; sinon, notez que la gestion de vos reverse DNS ne se fait pas dans l'interface de gestion des zones DNS de votre fournisseur, mais dans l'interface de gestion de votre serveur dédié, ou celle votre FAI si vous hébergez votre serveur à domicile et que votre FAI vous permet de modifier ce paramètre.

Pour vérifier que le reverse DNS pointe bien sur le bon nom d'hôte,  vous pouvez utiliser la commande nslookup de la manière suivante :

$ nslookup {adresse IP de votre serveur}

Installation

L'installation de Postfix et SASL se réalise sous Debian à l'aide de la commande suivante :

# apt-get install postfix libsasl2-modules sasl2-bin

Note : La version de Postfix utilisée dans ce document est la 2.9.6

Durant l'installation, l'outil de configuration des paquets va vous demander le type de configuration que vous souhaitez mettre en place. Pour le moment, choisissez simplement "Site Internet". Nous affinerons la configuration plus tard.

À la question suivante l'outil vous demande de lui fournir votre nom de domaine pleinement qualifié (FQDN : Fully Qualified Domain Name). Saisissez le nom de domaine pour lequel votre serveur gérera les e-mails (ex. : mondomaine.com).

Voilà, Postfix est installé ; avant de passer à sa configuration assurez vous simplement qu'il est bien démarré :

# postfix status
postfix/postfix-script: the Postfix mail system is running: PID: 31300

Configuration

Paramètres de base

Dans notre cas la configuration n'est pas très complexe. Nous commençons par paramétrer la directive mydomain qui indique le domaine dans lequel le serveur est situé :

# postconf -e "mydomain = mondomaine.com"

La directive myorigin qui indique le domaine qui apparaîtra dans les courriers envoyés par le serveur :

# postconf -e "myorigin = \$mydomain"

La directive myhosname indique le nom de machine pleinement qualifié. Normalement, lors de l'installation, l'outil de configuration des paquets renseigne ce paramètre, mais comme on n'est jamais mieux servi que par soi même :

# postconf -e "myhostname = serveur.mondomaine.com"

La directive mydestination permet de spécifier les domaines pour lesquels notre serveur va recevoir du courrier :

# postconf -e "mydestination = mondomaine.com, serveur.mondomaine.com, localhost.mondomaine.com, localhost"

La directive smtpd_banner définit le message de bienvenu qui sera envoyé aux clients qui se connectent. Vous pouvez y mettre ce que vous voulez sachant que la norme spécifie que le message doit impérativement commencer par le nom pleinement qualifié de la machine. Personnellement, je vous conseille de ne pas être trop bavard et de vous en tenir au minimum requit :

# postconf -e "smtpd_banner = \$myhostname"

Authentification SASL

On commence par ajouter l'utilisateur postfix au groupe sasl :

# adduser postfix sasl

Il nous faut ensuite créer l'arborescence nécessaire dans l'environnement chroot de Postfix :

# dpkg-statoverride --add root sasl 710 /var/spool/postfix/var/run/saslauthd

Puis on crée le fichier /etc/postfix/sasl/smtpd.conf :

pwcheck_method: saslauthd
mech_list: PLAIN LOGIN

Le fichier de configuration /etc/default/saslauthd doit être modifié de la manière suivante :

...
START=yes
...
OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd"
...

La directive smtpd_sasl_auth_enable permet d'activer l'authentification SASL :

# postconf -e "smtpd_sasl_auth_enable = yes"

La directive smtpd_sasl_local_domain permet d'ajouter automatiquement le nom de domaine à un nom d'utilisateur qui tenterai de se connecter sans (utilisateur deviendrait utilisateur@mondomaine.com) :

# postconf -e "smtpd_sasl_local_domain = \$myhostname"

La directive smtpd_sasl_authenticated_header contrôle l'ajout, en clair, des logins SASL l'entête des courrier ; cette option doit être désactivée :

# postconf -e "smtpd_sasl_authenticated_header = no"

La directive smtpd_recipient_restrictions nous permet d'autoriser le relais de courrier pour les utilisateurs authentifiés ainsi que les réseaux de confiance :

# postconf -e "smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination"

Il ne nous reste plus qu'à lancer saslauthd et à relancer Postfix :

# service saslauthd start
# service postfix restart

Ajout d'un second port d'écoute

Afin de lutter contre le spam, de nombreux fournisseurs d'accès bloquent les transissions sortantes vers d'autres serveur SMTP que les leurs ; il est donc fort probable que votre votre MUA ne puisse se connecter au port 25 de votre serveur ; ce qui n'empêche pas les serveurs SMTP de communiquer entre eux sur ce port. Pour résoudre ce problème et permettre aux MUA d'accéder à votre serveur il faut que Postfix soit à l'écoute sur un deuxième port.

Pour réaliser cette modification il suffit d'ajouter les lignes suivantes à la fin du fichier de configuration  /etc/postfix/master.cf (le second port sera le 11025) :

# =====================================================================
# Ajout d'un deuxième port d'écoute pour les connexion entrantes
# =====================================================================
# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (yes)   (never) (100)
# =====================================================================
11025     inet    n       -       -       -       -       smtpd

Il faut ensuite recharger la configuration de Postfix :

# service postfix reload

Rappel : Pensez à ouvrir le port correspondant dans votre pare-feu.

Mise à jour de la liste des services

Nous venons d'ajouter un second port d'écoute smtp ; il faut donc mettre à jour la liste des services réseau internet en ajoutant la ligne suivante au fichier /etc/services :

...
smtp            11025/tcp                       # SMTP - port secondaire
...

Vérifications

Une fois la configuration de base de Postfix en place, nous pouvons procéder à quelques tests.

Tout d'abord il faut vérifier que notre serveur est bien à l'écoute sur les deux ports que nous avons spécifié. La session telnet suivante nous indique que tout est bon sur le port 25 (répétez l'opération pour le second port). Les saisies utilisateur sont en gras :

$ telnet localhost 25
Trying ::1...
Connected to localhost.
Escape character is '^]'.
220 serveur.mondomaine.com
EHLO serveur.mondomaine.com
250-dserveur.mondomaine.com
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
quit
221 2.0.0 Bye
Connection closed by foreign host.

Le service étant opérationnel, nous pouvons tenter l'envoi d'un email à un utilisateur local :

$ echo "Ceci est un test" | mail -s "test" utilisateur@mondomaine.com

Important : A ce stade de la mise en oeuvre le serveur peut être blacklisté dès le premier e-mail qu'il envoi vers l'extérieur. Réalisez vos tests d'envoi uniquement à partir du serveur et sur des utilisateurs locaux.

Il ne reste plus qu'à vérifier que l'e-mail a été correctement distribué. La commande mail exécutée sous le compte de l'utilisateur en question nous permet de nous en assurer. Dans la session suivante les saisies utilisateur sont en gras :

$ mail
Mail version 8.1.2 01/15/2001.  Type ? for help.
"/var/mail/utilisateur": 1 message 1 new
>N  1 utilisateur@mond  Sun Aug 17 12:13   14/507  test
& 1
Message 1:
From utilisateur@mondomaine.com  Sun Aug 17 12:13:51 2014
X-Original-To: utilisateur@mondomaine.com
To: utilisateur@mondomaine.com
Subject: test
Date: Sun, 17 Aug 2014 12:13:51 +0200 (CEST)
From: utilisateur@mondomaine.com (Utilisateur)

Ceci est un test

& q
Saved 1 message in /home/utilisateur/mbox

Bonnes pratiques d'expédition

Notre serveur de courrier sortant est déjà opérationnel, mais les dispositifs anti-spam veillent et il risque de se retrouver rapidement catalogué comme spammeur.

En effet, pour que les e-mails qu'il distribut ne se retrouvent pas systématiquement dans la boite de réception "spam" ou "bulk" de vos correspondants, il faut qu'il remplisse certains critères qui forment un ensemble de bonnes pratiques. Pour vous familiariser avec le concept, voici un peu de lecture chez Google, Yahoo!, Hotmail et AOL.

Créer un enregistrement SPF

Un enregistrement SPF (Sender Policy Framework) est un enregistrement DNS de type TXT. Il permet de désigner les serveurs autorisés à envoyer des messages au nom de votre domaine.

Si vous avez suivi les recommandations de configuration de ce billet depuis le début, votre enregistrement SPF devrait simplement ressembler celui-ci :

mondomaine.com.  IN  TXT  "v=spf1 mx -all"

Cet enregistrement spécifie que tous les serveurs du domaine mondomaine.com qui disposent d'un enregistrement DNS de type MX, c'est à dire qui sont déclarés comme serveurs de courrier, sont autorisés à envoyer du courrier.

Il existe diverses options de configuration SPF, si vous voulez avoir un aperçu des possibilités offertes vous pouvez consulter la documentation en ligne sur le site officiel, ou faire un tour sur un outils comme SPF Wizard, qui vous permet de générer votre SPF en ligne (il en existe d'autres).

Une fois que vous avez l'enregistrement SPF de vos rêves, il ne reste plus qu'à l'ajouter à votre DNS afin que vos destinataires puissent vérifier la provenance de vos courriers. Si tout est bon la ligne suivante apparaîtra dans l'entête des courriers reçus :

Received-SPF: pass (domain of mondomaine.com designates XXX.XXX.XXX.XXX as permitted sender)

Erreurs SPF fréquentes

Lorsque l'enregistrement SPF n'existe pas pour votre domaine ou qu'il n'est pas cohérent, des marquages spécifiques peuvent apparaître dans l'entête des courriers reçus par vos destinataires (code source).

L'erreur suivante indique qu'aucun SPF n'a été trouvé pour votre domaine :

Received-SPF: none (domain of mondomaine.com does not designate permitted sender hosts)

Celle-ci indique que votre serveur n'est pas autorisé à envoyer des courriers :

Received-SPF: fail (domain of mondomaine.com does not designate XXX.XXX.XXX.XXX as permitted sender)

Vérification

Vous pouvez vérifier que l'enregistrement SPF existe pour votre domaine à l'aide de la commande :

# dig -t TXT +noall +answer mondomaine.com

Créer un enregistrement DKIM

DKIM (DomainKeys Identified Mail) est une norme qui permet d'authentifier un e-mail à l'aide d'une signature basée sur le nom de domaine de l'expéditeur et sur une paire de clés de cryptage publique / privée. Yahoo!, Google et d'autres gros acteurs utilisent ce système.

Installer les outils

L'installation se fait de manière classique :

# apt-get install opendkim opendkim-tools

Créer un couple clé publique / clé privée

Les deux commandes ci-dessous permettent de créer un répertoire de destination et de générer une clé publique ainsi qu'une clé privée qui seront respectivement nommées mondomaine.com.txt et mondomaine.com.private.

# mkdir /etc/postfix/dkim-keys
# opendkim-genkey -s mondomaine.com -D /etc/postfix/dkim-keys -d mondomaine.com 

Configurer opendkim

Une fois vos clés générées il faut éditer le fichier de configuration /etc/opendkim.conf et le modifier de la manière suivante :

...
# Sign for example.com with key in /etc/mail/dkim.key using
# selector '2007' (e.g. 2007._domainkey.example.com)
Domain         mondomaine.com
KeyFile        /etc/postfix/dkim-keys/mondomaine.com.private
Selector       mondomaine.com
Socket         inet:8891@localhost
...

Nous pouvons maintenant démarrer le service :

# service opendkim start

Configurer Postfix

La directive smtpd_milters (milter signifiant "mail filter") nous permet d'informer Postfix que nous souhaitons utiliser le service opendkim en tant que filtre sur tous les e-mails reçus via le protocole SMTP. Postfix transmettra alors les e-mails entrants à opendkim qui les signera et les retournera à Postfix.

# postconf -e "smtpd_milters = inet:localhost:8891"

Même chose avec les emails reçus via un autre protocole :

# postconf -e "non_smtpd_milters = inet:localhost:8891"

Pour finir il faut recharger la configuration de Postfix :

# service postfix reload

Créer l'entrée DKIM dans le DNS

La dernière étape consiste à renseigner le DNS gérant le domaine. Il faut créer un enregistrement de type TXT qui contient les informations permettant d'authentifier les courriers envoyés. Les données nécessaires sont contenues dans le fichier /etc/postfix/dkim-keys/mondomaine.com.txt et se présentent selon le format suivant :

mondomaine.com._domainkey  IN  TXT  "v=DKIM1; k=rsa; p={clé publique}"

Si vous gérez vous même votre serveur DNS, reportez vous à sa documentation pour créer cet enregistrement ; sinon passez par l'interface de gestion mise à disposition par votre fournisseur de nom de domaine.

La vérification de la présence de l'enregistrement dans le DNS se fait via la commande :

# dig -t TXT +noall +answer mondomaine.com._domainkey.mondomaine.com

Créer un enregistrement DMARC

DMARC (Domain-based Message Authentication, Reporting & Conformance) est un protocole d'authentification qui s'appuit sur SPF et DKIM. Il permet d'augmenter le niveau de sécurité et de qualité global des services de courrier électronique. Si vous souhaitez approfondir ce sujet, qui n'est pas l'objet de ce billet, Wikipédia est un bon point d'entrée.

Créer l'entrée DMARC dans le DNS

L'enregistrement à ajouter dans votre DNS est un enregistrement de type TXT dont le format est le suivant :

_dmarc IN TXT "v=DMARC1; p=none"

Notez qu'il s'agit ici d'une déclaration DMARC de base qu'il vous faudra peut être adapter à votre cas d'utilisation.

Limiter le débit

Imposer des limites au débit de son serveur d'expédition de courrier est un acte de courtoisie à l'égard des hôtes de destination. En effet, votre serveur n'est probablement pas le seul à les solliciter ; encombrer délibérément leur file de traitement donc très mal vu et risque de faire chuter la réputation de votre serveur ; ce qui serait dommage, d'autant que ce genre de limites est trés simple à implémenter.

Configurer Postfix globalement

Pour limiter de débit de votre serveur de manière globale, il suffit d'ajouter les directives suivantes au fichier /etc/postfix/main.cf :

# Limitation globale du débit
smtp_destination_rate_delay = 2s
smtp_destination_concurrency_limit = 2
smtp_extra_recipient_limit = 25
smtp_destination_rate_delay
Délais minimum en secondes entre l'envoi de deux messages.
Valeur par défaut : 0 (désactivé)
smtp_destination_concurrency_limit
Nombre maximum de connexions autorisées pour un même destinataire.
Valeur par défaut : 20
smtp_destination_concurrency_limit
Nombre maximum de destinataires autorisés par courrier ; au delà Postfix envoi plusieurs courriers.
Valeur par défaut : 1000

Configurer Postfix par domaine

En complément de la configuration globale recommandée ci-dessus, il est possible de demander à Postfix d'appliquer différents paramètres en fonction du domaine de destination.

La première chose à faire est d'ajouter trois transports à la fin du fichier /etc/postfix/master.cf :

# =====================================================================
# Limitation du débit par domaine de destination
# Voir /etc/postfix/transport.cf et /etc/postfix/main.cf
# =====================================================================
# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (yes)   (never) (100)
# =====================================================================
lent      unix    -       -       n       -       -       smtp
normal    unix    -       -       n       -       -       smtp
rapide    unix    -       -       n       -       -       smtp

Ensuite il faut préciser les paramètres que nous souhaitons personnaliser en fonction du domaine cible. Cela se traduit par l'ajout des règles suivantes à la fin du fichier /etc/postfix/main.cf :

# Limitation du débit par domaine de destination
# Voir /etc/postfix/master.cf et /etc/postfix/transport.cf
transport_maps = hash:/etc/postfix/transport.cf
lent_destination_rate_delay = 3s
lent_destination_concurrency_limit = 1
lent_destination_recipient_limit = 10
normal_destination_rate_delay = 2s
normal_destination_concurrency_limit = 2
normal_destination_recipient_limit = 25
rapide_destination_rate_delay = 1s
rapide_destination_concurrency_limit = 3
rapide_destination_recipient_limit = 100

Puis il faut créer les correspondances entre les domaines de destination que nous souhaitons personnaliser et les transports que Postfix doit utiliser. Le fichier /etc/postfix/transport.cf est fait pour ; il faut l'éditer (ou le créer) et y ajouter nos correspondances :

# Limitation du débit par domaine de destination
# Voir /etc/postfix/main.cf et /etc/postfix/master.cf
free.fr rapide:
gmail.com rapide:
laposte.net normal:
orange.fr normal:
sfr.fr normal:
yahoo.com lent:
hotmail.com lent:

Il ne reste plus qu'à demander à Postfix de prendre en compte les changements :

# postmap /etc/postfix/transport.cf
# service postfix reload

Tester son serveur

Il existe des outils qui vous aiderons dans votre quête du serveur de mail parfait, en voici quelque uns :

  • MXToolbox : Propose toute une batterie de tests qui vous permettrons de valider le fonctionnement et la configuration de votre serveur (ping, PTR, MX, SPF, relais ouvert, blacklist...),
  • Mail Tester : Vous permet de tester l'indésirabilité (spam) des courriers transmis par votre serveur,
  • Spamhaus : Propose des outils pour vérifier si votre serveur est blacklisté.

Et ensuite ?

Vous disposez maintenant d'un serveur d'envoi de courriels opérationnel, capable de transmettre et de réceptionner les courriers de votre domaine. Si vous désirez installer un service de messagerie plus complet, voici quelques pistes :

Configurer fail2ban

Si vous utilisez fail2ban, pensez à ajouter une ou deux règles de filtrage afin de vous protéger contre les tentatives de connexion par force brute.

Récupérer vos courriers à distance

Si vous souhaitez récupérer votre courrier à distance via un MUA (Mail User Agent) comme thunderbird ou outlook, la prochaine étape sera d'installer et de configurer un serveur de courrier entrant. Dans un prochain billet je détaillerai l'installation d'un serveur IMAP.

Filtrer vos e-mails à l'aide d'un antispam

Selon l'utilisation que vous désirez faire de votre serveur de courrier sortant, il se pourrait que vous vous retrouviez petit à petit inondé de spams. Dans ce cas il peut être judicieux d'installer un filtre anti-spam sur votre serveur ; SpamAssassin parait tout indiqué.

Protéger vos utilisateurs à l'aide d'un antivirus

Si vous souhaitez protéger vos utilisateurs des programmes malicieux, vous pouvez installer l'antivirus / antitrojan / antimalware open sources ClamAV® ; ce qui ne dispense évidement pas vos utilisateurs d'installer un antivirus sur leur poste de travail.