Installation et configuration d'un serveur d'email

Cet article est le premier d'une série consacrée à la gestion des emails. Une étape de plus vers l'autonomie numérique : la gestion de mon propre serveur d'emails. L'email est l'un des composants les plus importants de la présence numérique (avec le DNS). Cet article détaille la mise en place d'un serveur d'email pour recevoir les emails de mes domaines.

Remarque : comme d'habitude, les commandes sont données pour une Debian mais j'utilise des logiciels très courants donc vous les retrouverez facilement sur n'importe quelle autre distribution.

Quelques prérequis :

  • Un serveur (il faut absolument disposer d'une IP fixe et d'une machine disponible presque en permanence). Presque parce que contrairement à une idée reçue, si votre serveur de mail est éteint, les messages qui vous sont envoyés ne sont pas perdus mais gardés en attente par l'expéditeur pour être envoyées de nouveau un peu plus tard.
  • Un nom de domaine et la possibilité d'en paramétrer le DNS (en particulier l'enregistrement MX).

Installation de postfix

Je commence par l'installation du serveur de mail. J'ai choisi d'utiliser postfix car c'est un serveur simple à administrer, puissant et peu gourmand en ressources. Là, c'est du très classique, un tout simple : apt-get install postfix. apt s'occupera de la désinstallation d'un éventuel autre serveur de messagerie (exim le plus souvent).

Remarque : assurez-vous que l'ancien serveur de mail n'était pas utilisé avant de commencer !

La configuration de postfix réside dans le répertoire /etc/postfix.

A l'issue de l'installation, la commande newaliases provoquera la création du fichier alias.db à partir des données contenues dans /etc/aliases.

Par défaut, /etc/aliases ne définit qu'un seul alias du compte postmaster vers root. Pour l'instant, je m'en contenterai.

Contrôle du daemon postfix

Le daemon postfix se contrôle à partir de l'exécutable du même nom. Voici les principales commandes qu'il accepte en paramètre :

  • postfix start : Démarrage de postfix. Allons-y, c'est le moment !
  • postfix stop : Sans commentaire.
  • postfix check : Vérifie que les répertoires de postfix ont des permissions convenables et crée les éventuels répertoires manquants. Une bonne idée si vous avez trop joué avec la configuration !
  • postfix abort : Arrête le serveur immédiatement
  • postfix flush : Demande à postfix de rententer les envois en attente.
  • postfix reload : Recharge la configuration sans arrêter le serveur.
  • postfix status : Indique si postfix est en cours d'exécution.

Bien sûr, le détail de ces commandes est repris dans la man page de postfix.

Vérification de l'installation

Un ps -ef doit révéler la présence de trois processus : master tournant en tant que root, il s'agit du daemon principal de postfix ainsi que qmgr et pickup tournant eux sous l'identité de postfix.

Chez moi j'obtiens :

root@nuage:~# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root     10380     1  0 avril11 ?      00:00:34 /usr/lib/postfix/master
postfix  10394 10380  0 avril11 ?      00:00:05 qmgr -l -t fifo -u
postfix  21313 10380  0 21:21 ?        00:00:00 pickup -l -t fifo -u -c

Les trois processus sont bien en cours d'exécution, je peux maintenant vérifier que le serveur accepte les connexions sur le port 25 avec la commande : telnet localhost 25.

root@nuage:~# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.localdomain.
Escape character is '^]'.
220 nuage ESMTP Postfix (Debian/GNU)
QUIT
221 2.0.0 Bye
Connection closed by foreign host.

Mon serveur est maintenant installé et prêt à être configuré.

Configuration du DNS

Pour que mon serveur reçoive du mail, encore faut-il le déclarer dans un DNS ! A chaque domaine est associé un (ou plusieurs) enregistrements de type MX (pour Mail eXchange). Ces enregistrement indiquent l'adresse du serveur qui reçoit les emails du domaine. Je vais donc dans la configuration du domaine et je déclare mon dédié comme MX du domaine.

Remarque : cet article ne traitera pas de la configuration de plusieurs serveurs de mail (principal et backup) pour ne pas compliquer les choses.

La vérification de l'enregistrement DNS peut se faire avec la commande dig :

root@nuage:~# dig mon-domaine.fr MX

; <<>> DiG 9.8.4-rpz2+rl005.12-P1 <<>> mon-domaine.fr MX
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 58269
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 5

;; QUESTION SECTION:
;mon-domaine.fr.            IN  MX

;; ANSWER SECTION:
mon-domaine.fr.     86400   IN  MX  1 nuage.mon-domaine.fr.

;; AUTHORITY SECTION:
mon-domaine.fr.     172800  IN  NS  dns104.ovh.net.
mon-domaine.fr.     172800  IN  NS  ns104.ovh.net.

;; Query time: 16 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Wed Jul  2 23:05:21 2014
;; MSG SIZE  rcvd: 220

Jusqu'ici, tout va bien. Si j'envoi un email à une adresse @mon-domaine.fr, il sera donc distribué à mon postfix flambant neuf. Reste à configurer la bête pour qu'il accepte le message.

Configuration générale de postfix

Je passe maintenant à la configuration de postfix lui-même. La configuration réside dans le fichier /etc/postfix/main.cf. Les directives de configuration présentes dans ce fichier surchargent les valeurs par défaut (définies à la compilation du serveur).

Remarque : si vous voulez connaitre la valeur de chaque directive : postconf est votre ami. Attention toutefois, sur mon serveur, il sort un peu plus de 900 lignes de texte ! Néanmoins vous aurez ainsi la valeur de chaque directive.

Pour commencer, voici les directives principales que je vais fixer:

  • myhostname : indique le nom DNS complet du serveur (FQDN), ce paramètre doit refléter le résultat d'une requête DNS inverse sur l'IP du serveur. C'est important car de nombreux antispam se base sur le fait que nom et IP se résolvent l'un vers l'autre.
  • mydestination : liste des domaines reçus par ce serveur. Dans le cas d'un domaine unique, on peut le mettre ici. Dans le cas de mon serveur, je vais le configurer pour gérer plusieurs domaines en utilisant des domaines virtuels. Dans ce cas, cette directive est vide.
  • relayhost : adresse d'un autre serveur SMTP à qui confier le courrier qui n'est pas destiné aux domaines gérés par ce serveur. Cette directive sert surtout dans le cas d'un serveur interne d'entreprise pour lui permettre de confier le courrier à un relai situé à l'extérieur du firewall.
  • mynetworks : liste des réseaux (au format adresse_ip/taille_du_masque, séparés par des espaces) autorisés à poster sur ce serveur pour d'autres destinataires que $mydestination. En principe, cette directive se réduit à 127.0.0.0/8 ou quelque chose d'équivalent sinon vous venez de monter un relai !
  • mailbox_size_limit : taille maximale d'une mailbox. Ce choix est assez important car vous risquez soit de rejeter des mails parce que la boite est pleine, soit de remplir votre disque parce que la limite est trop basse.

Configuration des boites emails

Pour pouvoir gérer facilement plusieurs domaines et autant de boites que je veux, j'utilise une configuration dites “de domaines virtuels”. Dans ce modèle de configuration, il n'est pas nécessaire de créer un compte unix pour chaque mailbox mais simplement un répertoire. Je fournis ensuite à postfix un fichier de mappage entre l'adresse email et le répertoire et le tour est joué.

Voici donc les directives pour gérer les domaines virtuels :

  • virtual_mailbox_base : chemin de base des boites virtuelles. Une bonne valeur est du style /var/mail. Eviter de mettre juste / pour ne pas risquer de se retrouver avec des mailboxes un peu partout dans le serveur.
  • virtual_mailbox_domains : cette directive a le même format que mydestination et spécifie les domaines virtuels reçus par ce serveur.

Pour chaque domaine indiqué dans virtual_mailbox_domains, il faut créer un répertoire. Si j'ai indiqué /var/mail comme répertoire de base, je devrait donc créer /var/mail/mon-domaine.fr.

Ensuite dans le répertoire du domaine, il faut créer un sous répertoire pour chaque boite virtuelle. Par exemple : /var/mail/mon-domaine.fr/moi pour l'adresse moi@mon-domaine.fr.

Le mappage entre les noms d'utilisateurs et les répertoires doit être déclaré dans un fichier, par exemple /etc/postfix/virtual_mailbox.map sous la forme suivante : une ligne par compte contenant le nom et le chemin du répertoire de la boite séparés par une tabulation. Ce fichier de mappage sera ensuite déclaré dans main.cf dans la directive virtual_mailbox_maps.

Attention : le chemin du répertoire de la boite dans le fichier de mappage doit se terminer par un /.

Pour des questions de performances, j'indexe ce fichier en utilisant postmap /etc/postfix/virtual_mailbox.map. Dans ce cas, la directive à déclarer doit être : virtual_mailbox_maps = hash:/etc/postfix/virtual_mailbox.map.

Sécurisation des mailboxes virtuelles

Pour sécuriser ma configuration, je crée un utilisateur du nom de facteur avec la commande : adduser –shell=/bin/false facteur

Lors de la création du compte, relevez les UID et GID du groupe créé et ajoutez les directives suivantes : virtual_uid_maps = static:30253025 est l'UID du compte créé virtual_gid_maps = static:30253025 est le GID du groupe créé. Ces directives peuvent servir à créer un facteur différent pour chaque domaine virtuel géré afin d'augmenter la sécurité.

Enfin, donnez le répertoire des mailbox virtuelles au facteur avec des permissions adéquates avec les commandes : chown -R facteur:facteur /var/mail/mon-domaine.fr et chmod -R 700 /var/mail/mon-domaine.fr.

Conclusion

Je relance le serveur postfix, il n'y a plus qu'à tester ! Je m'envoie un mail depuis GMail… Suspense… Il arrive dans le répertoire /var/mail/mon-domaine.fr/moi/new/, c'est une victoire !

Rendez-vous maintenant à l'épisode 2 pour mettre en place un serveur POP/IMAP, parce que recevoir des mails, c'est bien mais pouvoir les lire ce serait mieux !