Le système d'exploitation GNU-Linux/Le serveur de mails Postfix



Le serveur de mail Postfix

modifier

Postfix est un serveur de mail écrit dans l'idée de remplacer Sendmail, serveur de mail historique de moins en moins utilisé car sa configuration est très complexe et qu'il contient des failles de sécurité.

Postfix effectue 99 % des fonctions de Sendmail, les 1% restant ne sont que purement applicable dans une minorité de cas. De plus, il allie performance et facilité d'installation et de paramétrage.

Il existe de nombreux autres serveurs de mails, parmi les plus connus : Qmail, Exim, Qpsmtpd, Courier...

Quelques définitions

modifier

Comment ça marche ?

modifier
Schéma du cheminement des mails entre les correspondants (trois cas illustrés en fonction des moyens mis en œuvre).
 

Le schéma précédent nous propose trois cas de figure :

Cas numéro 1

modifier
  • Nous avons deux sociétés : societe.com et client.com
  • Paul (paul@societe.com) veut envoyer un mail à Pierre (pierre@client.com)
  • Le mail part en direction du serveur SMTP de sa société (smtp.societe.com)
  • Celui-ci est accepté par le serveur de mail smtp.societe.com car il vient de son propre réseau
  • smtp.societe.com fait une demande au serveur DNS pour connaitre le serveur de mail qui gère les courriers de @client.com : client.com MX ? (Mail eXchanger)
  • Le serveur DNS répond : smtp.client.com
  • Le serveur de mail smtp.societe.com contacte donc le serveur SMTP smtp.client.com
  • Lorsque le client de messagerie de Pierre veut consulter ces mails, il va demander à POP si il y a quelque chose pour lui et télécharge le mail de Paul
  • Pierre a donc bien reçu le mail de Paul
  • Pierre répond à Paul de la même manière
  • Le mail suit le cheminement inverse : smtp.client.com demande au serveur DNS le serveur de messagerie de societe.com. Celui-ci lui répond : smtp.societe.com
  • Le mail est acheminé vers le serveur SMTP smtp.societe.com
  • Il est stocké jusqu'à la demande de Paul de lire ces mails. Contrairement à Pierre, le client de messagerie de Paul interroge le serveur IMAP imap.societe.com. La différence est que le mail de Pierre est lu directement depuis le serveur IMAP et reste stocké sur ce dernier

Cas numéro 2

modifier
  • Notre ami Paul fait partie d'une association (asso.org) et dispose d'un email sur ce domaine : paul@asso.org
  • L'association dispose d'un hébergement chez hebergeur.net qui lui fournit différents services serveur SMTP, POP, IMAP et accès webmail
  • Paul utilise son email sur asso.org (paul@asso.org) pour envoyer un email à son ami Jack qui dispose aussi d'un email sur asso.org : jack@asso.org
  • Ce mail est acheminé via son réseau vers son serveur SMTP. Dans son client Outlook, Paul a paramétré plusieurs comptes
  • Le serveur de sa société (smtp.societe.com) accepte d'envoyer le mail sur Internet, même si l'email émetteur et le destinataire utilisent des noms de domaine différents, car il vient de son propre réseau
  • Ce mail est donc envoyé au serveur SMTP asso.org : smtp.hebergeur.net
  • Paul peut donc s'il le souhaite aller consulter ses mails sur asso.org via le serveur POP ou IMAP qui va rapatrier directement les mails paul@asso.org

Cas numéro 3

modifier
  • Jack utilise une connexion à Internet fournie par un fournisseur d'accès à Internet : fai.fr. Pour lire son email sur asso.org (jack@asso.org), Jack utilise son navigateur Web et l'accès Webmail fournit par fai.fr
  • Il se connecte donc sur l'adresse webmail.asso.org et peut ainsi visualiser ses mails. Aucun email ne sera rapatrié sur son PC.
  • Il peut également répondre à tous ses mails via un Webmail.

Installation de Postfix

modifier

Installer en premier Postfix, si un autre serveur de mail est déjà présent, il le supprimera :

 # apt-get install postfix

Pour l'instant, nous laissons toutes les options par défaut, nous allons le configurer par la suite.

Une fois l'installation terminée, nous allons configurer Postfix.

sudo adduser postfix sasl[1]
sudo dpkg-reconfigure postfix

Configuration de Postfix

modifier

 

Pour que cela fonctionne sur Internet, il faut que le nom local du serveur (hostname) soit le même que celui du réseau (défini dans les DNS). Dans cet exemple, il s'appellera mail.mondomaine.fr. De plus, il faut commenter la ligne ci-dessous mydestination qui bride les envois vers l'extérieur.

Le fichier de configuration principal de Postfix est /etc/postfix/main.cf. Copier le suivant en remplaçant mondomaine.fr par le vrai domaine du serveur :

 mv /etc/postfix/main.cf /etc/postfix/main.oldcf  # Archivage
 > /etc/postfix/main.cf                           # Blanchiment
 vim /etc/postfix/main.cf                         # Accès pour coller la configuration ci-dessous
# Message affiché à la connexion
smtpd_banner = $myhostname ESMTP
  
# Ne pas utiliser le service biff qui sert à la notification
# des nouveaux mails
biff = no
  
# On ne rajoute pas le domaine car c'est le boulot du client mail
append_dot_mydomain = no
  
# Permet d'envoyer un email à l'émetteur si son mail n'est pas
# parti au bout d'un certain temps
#delay_warning_time = 4h
  
# Emplacement des alias Unix
# Attention, à chaque modification de /etc/aliases, il faut taper
# la commande newaliases pour qu'il régénère le fichier /etc/aliases.db
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases

# Le domaine d'origine
myorigin = /etc/mailname

# Le nom de machine FQDN (doit être en accord avec le DNS)
mydomain = mondomaine.fr
myhostname = mail.$mydomain

# Liste des domaines principaux dont on accepte le courrier
mydestination = $mydomain, $myhostname, localhost, localhost.$mydomain
  
# Permet d'indiquer un autre serveur SMTP pour l'envoi des emails
# Utilisé si on ne peut pas envoyer directement les emails
relayhost =
  
# Indique les réseaux dont on accepte d'acheminer les emails
#mynetworks = 127.0.0.0/8, 192.168.30.0/24
  
# Le dépôt des emails dans les boites aux lettres est confié
# à procmail (cas du format mbox)
mailbox_command = procmail -a "$EXTENSION"
  
# Taille des boites aux lettres. 0 : pas de limite
mailbox_size_limit = 0
  
# Séparateur utilisé pour les usernames + adresses
recipient_delimiter = +
  
# Écoute sur toutes les interfaces réseaux
inet_interfaces = all
  
# On force postfix à utiliser le protocole IPv4
inet_protocols = ipv4

On peut visualiser la totalité des options possibles de Postfix et leurs valeurs par défaut via la commande postconf :

  # postconf | more
  2bounce_notice_recipient = postmaster
  access_map_reject_code = 554
  address_verify_default_transport = $default_transport
  address_verify_local_transport = $local_transport
  address_verify_map =
  address_verify_negative_cache = yes
  address_verify_negative_expire_time = 3d
  ...

En français ça donne : délivre en local les emails vers mydestination avec mailbox_command, sinon délivre-les sur Internet mais en refusant ceux qui ne viennent pas de mynetworks ou relayhost (s'ils sont vides on accepte rien, s'ils sont commentés on accepte tout, même de relayer des spams).


Une fois main.cf sauvegardé pour la première fois, on vérifie que le fichier /etc/mailname contient le nom de domaine de notre réseau :

 # cat /etc/mailname
 mondomaine.fr

Chaque fois que l'on modifie le fichier /etc/postfix/main.cf, il faut relancer Postfix :

 # /etc/init.d/postfix restart

Pour chaque mail envoyé ou reçu, Postfix enregistre les informations d'acheminement dans le fichier /var/log/mail.log. Il est donc très utile de surveiller ce fichier durant les tests de fonctionnement.

Pour vérifier que le serveur de mail fonctionne, on envoi un mail à un utilisateur et on regarde le fichier /var/log/mail.log.

 # mail alex
 Subject: essai
 essai
 .
 Cc:
CTRL+D

Dans un autre terminal :

 # tail -f /var/log/mail.log
 ...
 Feb 13 13:10:40 mail postfix/pickup[13353]: B782A1FD6F: uid=0 from=<root>
 Feb 13 13:10:40 mail postfix/cleanup[13675]: B782A1FD6F: message-id=<20080213121040.B782A1FD6F@mail.mondomaine.fr>
 Feb 13 13:10:40 mail postfix/qmgr[13354]: B782A1FD6F: from=<root@mail.mondomaine.fr>, size=355, nrcpt=1 (queue active)
 Feb 13 13:10:40 mail postfix/local[13677]: B782A1FD6F: to=<alex@mail.mondomaine.fr>, orig_to=<alex>, relay=local, delay=0.08, delays=0.04/0.02/0/0.02, dsn=2.0.0, status=sent(delivered to command: procmail -a "$EXTENSION")
 Feb 13 13:10:40 mail postfix/qmgr[13354]: B782A1FD6F: removed
 ...

Ajouter une boite aux lettres

modifier

Pour ajouter une boite aux lettres, il existe trois solutions :

  1. Créer un compte Unix.
  2. Créer une adresse virtuelle.
  3. Créer un alias.

Les voici en lignes de commandes, mais elles sont aussi réalisables au moyen d'un webmail.

Nouveau compte système

modifier

Pour des raisons de sécurité, on positionne le shell de l'utilisateur à /bin/false (ainsi il ne pourra pas se logger sur le serveur). Le mot de passe saisi sera celui de sa boite aux lettres. On rajoute l'utilisateur dans le groupe mail afin qu'il puisse écrire le fichier <login>.lock dans le répertoire /var/mail.

 # adduser --shell /bin/false --ingroup mail pierre

Adresse virtuelle

modifier

Activer la fonction dans :

vim /etc/postfix/main.cf

avec :

virtual_alias_maps = hash:/etc/postfix/virtual

Ensuite il faut définir les adresses emails dans /etc/postfix/virtual, sous forme de paires clé-valeur[2] :

postmaster@mail.mondomaine.fr        root

Puis créer la base de données à partir du fichier :

postmap /etc/postfix/virtual
postfix reload

Pour éditer la liste des adresses emails alias de celles d'une boite :

vim /etc/aliases

Par exemple en y ajoutant les plus fréquents :

MAILER-DAEMON:  root
postmaster:     root
abuse:          root

Ainsi, quelqu'un qui voudra reporter un problème à abuse@mondomaine.fr écrira dans la boite de root, ce qui sera visible par une notification à chaque fois que ce dernier se connectera en SSH.

Puis la commande newaliases crée alors /etc/aliases.db à partir de cette liste.

MDA : filtres de courrier électronique

modifier

Par défaut les emails des boites créées ci-dessus s'empilent tous dans un fichier de /var/mail/. Afin de les router vers des boites mails séparées, on utilise un ou plusieurs[3] logiciels Mail Delivery Agent.

  • Pour les transferts locaux (vers une boite mail personnelle du serveur), ils utilisent le protocole LMTP.
  • Pour les transferts distants (vers un client de messagerie), il faut choisir entre le protocole POP3 (qui déplace les emails vers le client) et IMAP (qui laisse une copie des emails sur le serveur).

Voici plusieurs exemples de MDA :

procmail

modifier

Pour installer procmail[4][5] :

 $ sudo apt-get install procmail
 $ vim ~/.forward
"|IFS=' '&&exec /usr/bin/procmail -f-||exit 75 #user"

 $ vim ~/.procmailrc
PATH=/usr/bin:/usr/local/bin
MAILDIR=$HOME/Maildir

 $ maildirmake ~/Maildir
  • En remplaçant user par l'utilisateur du processus.
  • Sur Ubuntu il s'installe dans /usr/bin/procmail, mais d'autres distributions nécessitent d'adapter ce chemin ci-dessus.

Explications :

  1. Le fichier utilisateur .forward permet d'insérer le filtrage procmail dans le parcours des emails à destination de cet utilisateur.
  2. Le fichier .procmailrc configure le filtrage pour l'utilisateur concerné.
  3. maildirmake crée l'arborescence nécessaire à l'accueil des emails :
    • new (nouveau) : boite de réception.
    • cur (courante) : boite courante.
    • tmp (temporaire) : mails en transit.

Pour voir s'il fonctionne, envoyer un email à l'utilisateur configuré ci-dessus, puis regarder s'il est arrivé :

ls -alh /home/user/Maildir/new/

En cas de problème :

tail /var/log/mail.log

fetchmail

modifier

Pour installer fetchmail :

apt-get install fetchmail

Il se configure avec :

vim ~/.fetchmailrc

On peut par exemple lui dire de tout transférer vers procmail en y ajoutant :

mda "/usr/bin/procmail -Y -d %T"

Ou bien lui faire récupérer directement des boites utilisateurs distantes avec :

poll example.com protocol pop3 username "user1" password "password1"

 

La ligne mailbox_command du fichier /etc/postfix/main.cf doit pointer vers procmail, qui reroute ensuite vers fetchmail.

fetchmail peut récupérer les emails de fournisseurs externes, tels que Gmail, Yahoo ou Outlook.com, par cron. C'est un mail retrieval agent (MRA).

Dovecot

modifier

En plus d'un MDA intégré, Dovecot intègre un serveur POP ou IMAP.

Tout comme pour fetchmail, il peut fonctionner en aval de procmail. Toutefois, il est possible de remplacer procmail par Dovecot dans /etc/postfix/main.cf[6] :

mailbox_command = /usr/local/libexec/dovecot/dovecot-lda -f "$SENDER" -a "$RECIPIENT"

pour Ubuntu :

mailbox_command = /usr/lib/dovecot/dovecot-lda -f "$SENDER" -a "$RECIPIENT"

Ensuite, l'installation de Dovecot dépend du protocole souhaité dans le MUA qui viendra relever le courrier :

Serveur POP

modifier
apt-get install dovecot-pop3d
 Il existe de nombreux autres serveurs POP : courier-pop, teapop, ipopd, qpopper, solid-pop3d...

Serveur IMAP

modifier
apt-get install dovecot-imapd
 Il existe aussi plusieurs autres serveurs IMAP, par exemple courier-imap.

IMAP nécessite le format de stockage Maildir. Nous allons donc tout d'abord configurer Postfix pour lui indiquer d'utiliser le format Maildir au lieu du traditionnel mbox.

On modifie le fichier /etc/postfix/main.cf. On commente l'option mailbox_command (qui appelle procmail) et on rajoute l'option home_mailbox :

  vim /etc/postfix/main.cf
  # Commenter la ligne :
  #mailbox_command = procmail -a "$EXTENSION"
  # Puis pour utiliser le format Maildir, ajouter :
  home_mailbox = Maildir/

On relance postfix :

 # /etc/init.d/postfix restart

Pour chaque utilisateur existant, il faut ensuite créer le répertoire Maildir. On fait ceci à l'aide de la commande maildirmake fournie par dovecot-imapd ou courrier-imap :

  $ cd      # pour retourner dans mon home directory
  $ maildirmake Maildir
  $ ls -l Maildir
  drwx------ 2 alex grpalex 4096 2008-02-13 13:58 cur
  drwx------ 2 alex grpalex 4096 2008-02-13 13:58 new
  drwx------ 2 alex grpalex 4096 2008-02-13 14:11 tmp

Pour automatiser la création du répertoire Maildir pour les nouveaux utilisateurs, on exécute la commande maildirmake dans le répertoire /etc/postmaster. Ainsi tous les nouveaux utilisateurs auront automatiquement le répertoire Maildir dans leur home directory :

  # cd /etc/postmaster
  # maildirmake Maildir

Webmails

modifier

 

Par défaut les webmails cherchent les courriels dans le dossier définit dans le serveur POP ou IMAP, et qui peut être différent de là où ils sont distribués.

Par exemple pour la configuration ci-dessus avec Dovecot, /etc/dovecot/conf.d/10-mail.conf doit contenir mail_location = maildir:/home/%u/Maildir.

SquirrelMail

modifier
 

SquirrelMail est un webmail très simple à installer, qui fonctionne sans SGBD. Outre les envois et réceptions d'emails, il permet d'archiver en créant ou supprimant des dossiers.

Si n'est déjà le cas, on installe le serveur Web Apache :

 # apt-get install apache2

Pour installer SquirrelMail sous Debian, on tape la commande suivante :

 # apt-get install squirrelmail

On peut configurer Squirrelmail en utilisant le programme squirrelmail-configure. Ce fichier permet configurer le fichier /etc/squirrelmail/config.php. À noter que l'on peut modifier directement ce fichier sans passer par squirrelmail-configure.

SquirrelMail est fourni avec la section à rajouter à Apache pour l'activer. On va donc dans le répertoire de configuration de Apache pour lui indiquer d'utiliser ce fichier :

 # ln -s /etc/squirrelmail/apache.conf /etc/apache2/conf.d/squirrelmail.conf

On relance Apache :

 # /etc/init.d/apache2 restart

On peut tester si SquirrelMail fonctionne avec son navigateur en se connectant à l'URL suivante :

 http://localhost/squirrelmail/

Postfixadmin

modifier
 

Postfixadmin est un webmail qui fonctionne avec MySQL.

apt-get install postfixadmin

Roundcube

modifier
 
Entrer un compte mail déjà configuré pour recevoir des emails
 
Nouveau mail

Roundcube est un webmail qui fonctionne avec MySQL, PostgreSQL, SQLite ou MSSQL. Il est très ergonomique (glisser-déposer, effacement en masse avec Maj + clic puis Suppr), plus graphique mais plus lent et moins stable que SquirrelMail.

 apt-get install roundcube roundcube-mysql
 php5enmod mcrypt
 /etc/init.d/apache2 restart

Et voilà : http://localhost/roundcube

Configuration pour des envois distants

modifier

Pour que les emails ne soient pas directement écartés ou classés dans les spams par les serveurs de messagerie des destinataires, il faut impérativement montrer patte-blanche de plusieurs façons :

  1. Règle de reverse DNS.
  2. Règle DNS SPF (1 ou 2[7]).
  3. Règle DNS DMARC.
  4. Signature DKIM dans chaque email[8] correspondant à l'enregistrement DNS TXT dédié.
  5. Absence de blacklistage sur l'adresse IP publique du SMTP[9].
  6. Optimisation du ratio texte / image à 60 / 40 %[10].

 

Un serveur de messagerie qui accepte d'envoyer des emails pour le compte de n'importe qui se retrouvera rapidement blacklisté par des organismes antispams, dont les listes sont utilisées par de nombreux serveurs MX. Et cela peut coûter de l'argent pour se déblacklister. Pour s'en prémunir, il est donc très fortement recommandé de laisser le paramètre relayhost = non commenté.

Sécurisation TLS

modifier

Tout d'abord, il faut générer une clé de cryptage asymétrique, puis indiquer son chemin dans main.cf :

# Paramètres liés au chiffrement TLS
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${queue_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${queue_directory}/smtp_scache
# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for
# information on enabling SSL in the smtp client.

En cas d'erreur, on peut vérifier sa mise en place avec

openssl s_client -debug -starttls smtp -crlf -connect localhost:25

Pour plus d'information sur les certificats .pem, voir Apache/HTTPS.

Références

modifier
  1. http://doc.ubuntu-fr.org/postfix
  2. https://www.digitalocean.com/community/tutorials/how-to-install-and-setup-postfix-on-ubuntu-14-04
  3. http://www.troubleshooters.com/lpm/201202/images/dovecot_setup.png
  4. « Utilisation simple de procmail »
  5. (en) « A Quick, Practical Procmail Guide »
  6. http://wiki.dovecot.org/LDA/Postfix
  7. http://www.clickz.com/clickz/column/1695095/hotmail-delivery-tips-sender-id-spf
  8. https://www.isalo.org/wiki.debian-fr/Amavisd-new_et_DKIM
  9. http://whatismyipaddress.com/blacklist-check
  10. http://themediaonline.co.za/2011/07/the-five-rules-of-designing-email/


Voir aussi

modifier