Le serveur mail de A à Z

Ce serveur mail a été réalisé sur une Ubuntu 10.04.3 LTS mais le développement reste le même sur une Debian. Nous supposerons que le DNS est bien configuré (présence d’un enregistrement MX valable) et prêt à remplir correctement son rôle.

Pour ceux qui débuteraient dans le domaine, quelques explications s’imposent:

Un utilisateur est abonné chez domaine1.com et a comme adresse e-mail expediteur@domaine1.com. Un autre est abonné chez domaine2.org avec comme adresse e-mail destinataire@domaine2.orgexpediteur souhaite envoyer un e-mail à destinataire.

Voici ce qu’il va se passer :

    1. expediteur rédige le message avec son client de messagerie (appelé aussi Mail User Agent). Lorsque le message a été rédigé, expediteur l’envoie par le biais de son MUA;
    2. Le serveur smtp.domaine1.com (correspondant au MTA, Mail Transfert Agent) reçoit alors le message, il constate que le destinataire n’est pas dans son domaine. Il va donc chercher l’enregistrement MX dans le DNS de domain2.org.
      Il envoie le message à smtp.domaine2.org ;
    3. Le serveur smtp.domaine2.org reçoit à son tour le message et constate que le destinataire est bien dans son domaine. Il range le message dans la boîte aux lettres de destinataire par l’intermédiaire du MDA (Mail Delivery Agent).
    4. Lorsque destinataire décidera de regarder s’il a des nouveaux messages, il enverra une requête à son serveur imap.domain2.org au moyen de son client de messagerie;
    5. Le client de messagerie va chercher sur le serveur IMAP et consulte la boîte aux lettres de destinataire et constate qu’il y a un message dedans;
      Le message est visible dans le MUA.

Voici les différents outils qui seront utilisés:

  • Postfix (le serveur SMTP)
  • Courier-IMAP (le serveur IMAP)
  • Procmail (le MDA)
  • Amavis avec SpamAssassin et ClamAV (Antispam et Antivirus)

Postfix:

Installons tout d’abord le paquet nécessaire à l’utilisation de Postfix:

# apt-get install postfix

Normalement, quelques questions nous sont demandées:

General Type of configuration? --> Internet
Site Where should mail for root go--> On laisse blanc
Mail name? --> mail.server.be
Other destinations to accept mail for? (blank for none) --> mail.server.be, localhost
Force synchronous updates on mail queue ? --> No
Local networks ? --> 127.0.0.0/8
Use procmail for local delivery--> Yes
Mailbox size limit --> 0
Local address extension character? --> +
Internet protocols to use --> all

Il se peut parfois, lors de l’installation qu’aucune information ne soit demandée, il est possible de répondre à ces questions ultérieurement, en utilisant la commande suivante :

# dpkg-reconfigure postfix

Ensuite, nous devons modifié l’un des 2 fichiers essentiels au bon fonctionnement de Postfix, à savoir main.cf (le 2ème fichier est master.cf, ce fichier contient des informations diverses sur le comportement de Postfix et sa façon de faire résider les différents daemons ):

# nano /etc/postfix/main.cf
myhostname = mail.server.be
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname

mydestination = mail.server.be, localhost.server.be ,localhost
relayhost =
mynetworks = 127.0.0.0/8, 172.23.0.0/16, 192.168.0.0/16
#mailbox_command = /usr/bin/procmail
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
home_mailbox = Maildir/ # Si pas précisé, les mails iront dans /var/mail

Ce fichier contient la configuration principale de Postfix.

Quelques explications sur les différentes lignes de ce fichier: 

myhostname = mail.server.be

Cette option doit contenir le nom de domaine (FQDN) du serveur.

alias_database = hash :/etc/aliases

Fichier de type hash contenant une table d’alias mail. Celle-ci est éditable dans /etc/aliases, puis régénérée en hash grâce à la commande newaliases qui produit le fichier /etc/aliases.db
Cette étape est indispensable pour prendre en compte les changements.

myorigin = /etc/mailname

Cette option va indiquer le fichier qui contient une seule ligne décrivant le nom de domaine utilisé.
Dans ce cas-ci, /etc/mailname contient mail.server.be.
Il est essentiel de vérifier l’exactitude du contenu de ce fichier. Il faut que le nom de domaine soit bon sinon on aura quelques soucis.

mydestination = mail.server.be, localhost.server.be, localhost

Liste des domaines pour lesquels le serveur doit accepter le courrier.

mynetworks = 127.0.0.0/8, 172.23.0.0/16, 192.168.0.0/16

Contient la liste des réseaux locaux autorisés.

mailbox_command = /usr/bin/procmail

Commande pour utiliser Procmail comme MDA. Pas utilisé pour l’instant, on le commente.

mailbox_size_limit = 0

Limite de taille en octets pour les boîtes aux lettres, un zéro signifie qu’il n’y a pas de réstriction.

recipient_delimiter = +

Séparateur entre le nom d’utilisateur et les extensions d’adresse (par défaut le signe +).

inet_interfaces = all

Interfaces réseaux sur lesquelles le serveur va écouter.
Ici, on écoute sur toutes les interfaces.

Nous allons maintenant créer une adresse e-mail. Rien de plus simple, il suffit de créer un nouvel utilisateur:

# adduser test

On répond aux différents champs et on fixe un mot de passe pour l’utilisateur.

Pour tester si tout fonctionne correctement avant de continuer, essayons d’envoyer un mail à test:

# echo "Ceci est le contenu de mon mail" | mailx -s "ceci est le sujet" test@mail.server.be

Le mail sera automatiquement déposé dans le répertoire Maildir situé dans le répertoire personnel de test. S’il n’existe pas, le dossier Maildir sera automatiquement créé.

On peut s’assurer que le mail est arrivé en se rendant dans le répertoire personnel ou en utilisant les logs :

# cat /var/log/mail.log

Pour augmenter la sécurité du serveur de manière significative, il faut à présent parler des notions de TLS et de SASL (SSL).

Cette partie est assez délicate à réaliser, une minuscule erreur et on peut passer toute sa journée à essayer de trouver où est le problème.

Installons les paquets nécessaires:

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

Générons ensuite les certificats SSL auto signés pour Postfix :

# mkdir /etc/postfix/ssl
# cd /etc/postfix/ssl/
# openssl genrsa –des3 –rand /etc/hosts –out smtpd.key 1024

Nous devons choisir un passphrase (permet de sécuriser la clé privée).

Ensuite, il faut changer les permissions d’accès à l’aide d’un chmod :

# chmod 600 smtpd.key
# openssl req -new -key smtpd.key -out smtpd.csr

Quelques questions nous sont posées et comme d’habitude, on fait bien attention au Common Name. Il doit impérativement correspondre à mail.server.be.

Utilisons, à présent, les commandes suivantes (un passphrase est à nouveau demandé):

# openssl x509 -req -days 3650 -in smtpd.csr -signkey smtpd.key -out
smtpd.crt
# openssl rsa -in smtpd.key -out smtpd.key.unencrypted
# mv -f smtpd.key.unencrypted smtpd.key
# openssl req -new -x509 -extensions v3_ca -keyout cakey.pem -out cacert.pem -days 3650

Maintenant que les certificats ont été générés, modifions la configuration de Postfix en ajoutant quelques lignes dans le fichier main.cf pour activer le TLS (ou s’assurer que les lignes suivantes y sont déjà):

smtpd_use_tls= yes
smtpd_tls_auth_only = no
smtpd_tls_key_file = /etc/postfix/ssl/smtpd.key
smtpd_tls_cert_file = /etc/postfix/ssl/smtpd.crt
smtpd_tls_CAfile = /etc/postfix/cacert.pem
smtpd_tls_loglevel = 3
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
tls_random_source = dev:/dev/urandom

Ajoutons quelques lignes (toujours dans main.cf) concernant la partie SASL (permettant une authentification):

smtpd_sasl_local_domain = $myhostname
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous 
broken_sasl_auth_clients = yes

Le daemon d’authentification utilisé sera saslauthd:

# mkdir -p /var/spool/postfix/var/run/saslauthd
# rm –rf /var/run/saslauthd

Cette commande est très importante pour éviter d’avoir des erreurs lors du test avec testsaslauthd.

# ln -s /var/spool/postfix/var/run/saslauthd /var/run/saslauthd
# chgrp sasl /var/spool/postfix/var/run/saslauthd
# adduser postfix sasl
# nano /etc/default/saslauthd

Dans ce fichier précédemment créé, on ajoute/vérifie les lignes suivantes :

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

Ensuite, allons dans le fichier smtpd.conf:

# nano /etc/postfix/sasl/smtpd.conf
pwcheck_method: saslauthd
mech_list: login plain

Dans ce fichier, j’ai dû préciser quelle méthode et quel format allaient être utilisés.
Concernant le deuxième fichier de Postfix, le master.cf, il suffit juste de décommenter les lignes suivantes (et de commenter celle concernant le port 25 afin d’autoriser uniquement l’envoi d’emails de manière sécurisée):

smtps inet n - - - - smtpd
 -o smtpd_tls_wrappermode=yes
 -o smtpd_sasl_auth_enable=yes
 -o smtpd_client_restrictions=permit_sasl_authenticated,
reject

Il ne reste plus qu’à démarrer salsauthd et redémarrer Postfix pour prendre en compte la nouvelle configuration :

# /etc/init.d/saslauthd start
# /etc/init.d/postfix restart

On peut ensuite tester le bon fonctionnement grâce à la commande :

# testsaslauthd -u test -p Password

Courier-IMAP:

On procède à l’installation des paquets nécessaires:

# apt-get install courier-imap courier-authdaemon

Nous devons modifier une ligne dans le fichier de configuration de Courier-IMAP. Ce fichier se situe dans /etc/courier et se nomme imapd.
Il s’agit de celle concernant le MAILDIRPATH, c’est-à-dire le chemin pour accéder aux boîtes aux lettres.

On retourne alors dans le dossier de notre utilisateur et on fait :

# maildirmake Maildir

Cette commande va créer une boîte aux lettres complète chez un utilisateur. On aura un utilisateur par boîte mail.
A partir d’ici, tout est normalement fonctionnel et on peut tester avec notre logiciel de messagerie (comme Thunderbird par exemple).

Pour ce qui est de la sécurité, installons les paquets suivants :

# apt-get install courier-imap-ssl

Il faut alors modifier le fichier imapd-ssl par défaut qui se trouve dans /etc/courier/ :

TLS_CERTFILE=/etc/postfix/ssl/mail.combined.npw.pem
IMAP_TLS_REQUIRED=1
MAILDIRPATH=Maildir

Utilisons la commande suivante pour supprimer le passphrase sur le certificat cakey.pem (si ce n’est pas fait, une erreur sera visible dans les logs):

# openssl rsa –in cakey.pem -out cakey.nopw.pem

Ici, il y a une subtilité à prendre en compte. Contrairement à Postfix, le daemon IMAP exige que le certificat et la clé privée soient combinés en un même fichier.

On concatène:

# cat cacert.pem cakey.nopw.pem >> mail.combined.npw.pem
# openssl dhparam 1024 >> mail.combined.npw.pem

Il faut ensuite exécuter 2 commandes afin d’éviter une erreur « error:0906D06C:PEM routines:PEM_read_bio:no start line » dans les logs :

# chmod 400 mail.combined.npw.pem (ou 777 si cela est vraiment nécessaire)
# chattr +i mail.combined.npw.pem

Un petit redémarrage s’impose :

# /etc/init.d/courier-authdaemon restart
# /etc/init.d/courier-imap restart
# /etc/init.d/courier-imap-ssl restart

Procmail, Amavis et SpamAssassin :

Nous installons, comme toujours, les paquets nécessaires:

# apt-get install procmail amavisd-new clamav clamav-daemon spamassassin
spamc

Pour pouvoir utiliser Procmail, il faut créer un fichier dans le dossier de notre utilisateur test :

# touch .procmailrc

C’est donc dans ce fichier que seront placées les règles de filtrages. Il faut être très vigilent pour le faire fonctionner et faire très attention au droit mis sur ce fichier.
Il faut s’assurer que l’utilisateur en question soit propriétaire de ce fichier, si ce n’est pas le cas :

# chown test:test .procmailrc

Pour ce qui est des droits d’accès sur le fichier :

# chmod 600 .procmailrc

Ce qui va fixer les permissions à rw——-.
C’est-à-dire que le propriétaire aura accès en lecture et écriture (rw-) et les membres du groupe et les autres n’auront pas d’autorisation ().

En ce qui concerne ClamAV et Amavis , après l’installation chacun crée de son côté un utilisateur et un groupe. Afin que ClamAV puisse accéder aux pièces jointes décompressées par Amavis, il faut le rajouter au groupe amavis :

# addgroup clamav amavis

Pour autoriser le filtrage de ClamAV et SpamAssassin, éditons le fichier 15-content_filter_mode qui se trouve dans /etc/amavis/conf.d/:

@bypass_virus_checks_maps = ( \%bypass_virus_checks, \@bypass_virus_checks_acl, \$bypass_virus_checks_re);
@bypass_spam_checks_maps = ( \%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re);

Pour que des e-mails lui soient confiés, ajoutons ceci dans le fichier main.cf :

content_filter = scan:127.0.0.1:10024

On se rend alors dans l’autre fichier master.cf pour rajouter :

smtp-amavis unix - - y - 2 smtp
 -o smtp_data_done_timeout=1200
 -o disable_dns_lookups=yes

scan unix - - n - 16 smtp
-o smtp_send_xforward_command=yes

127.0.0.1:10025 inet n - y - - smtpd
-o content_filter=
-o local_recipient_maps=
-o relay_recipient_maps=
-o smtpd_restriction_classes=
-o smtpd_client_restrictions=
-o smtpd_helo_restrictions=
-o smtpd_sender_restrictions=
-o smtpd_recipient_restrictions=permit_mynetworks,reject
-o mynetworks=127.0.0.0/8
-o strict_rfc821_envelopes=yes

A présent, il faut s’assurer que SpamAssassin se lance au démarrage du système, ouvrons le fichier /etc/default/spamassassin et modifions la valeur de ENABLED :

ENABLED=1

Ensuite, on modifie la ligne concernant le nombre maximum de processus à exécuter :

OPTIONS= “--max-children 5 –helper-home-dir”

–max-children correspond au nombre d’enfants à lancer par spamd (le daemon de SpamAssassin). Aucun autre enfant ne sera lancé tant qu’un des 5 actuels ne sera pas mort. Cette option sert à éviter que trop de processus soient lancés en même temps afin de préserver la mémoire.

La configuration de SpamAssasin se fait dans le fichier local.cf présent dans /etc/spamassassin.
Dans ce fichier, il est possible de déterminer le message devant apparaitre en avant de l’en-tête :

rewrite_header Subject *****SPAM*****

Ainsi que le score au-delà duquel le message sera considéré comme spam :

required_score 10.0

Redémarrage pour prendre en compte la configuration:

# /etc/init.d/amavis restart
# /etc/init.d/clamav-daemon restart
# /etc/init.d/spamassassin restart
# /etc/init.d/postfix restart

Maintenant que les étapes nécessaires au bon fonctionnement de ces outils sont accomplies, passons au comportement souhaité de ceux-ci.

C’est dans le fichier de Procmail que tout va se passer.
Pour les spams, le comportement sera différent suivant le score, si c’est un virus, on aura aussi un comportement différent.

Il est nécessaire de créer le fichier .procmailrc dans le Home Directory de chaque utilisateur.

Au début du fichier, il faut impérativement ceci :

SHELL=/bin/sh
#PATH=${HOME}/bin:/usr/bin:/bin
DEFAULT=$HOME/Maildir/
MAILDIR=$HOME/Maildir
#LOGFILE=$HOME/.procmail.log
VERBOSE=yes
DROPPRIVS=yes
#LOGABSTRACT=all
#LOCKFILE=${HOME}/.procmail/lock

A la suite de ceci, on peut commencer à écrire nos règles :

# Permet de suivre l’email au travers du daemon spamc
# (l’interface de SpamAssassin)
:0fw
| /usr/bin/spamc
# Si l’email obtient un score de 20  supprimé
:0
* ^X-Spam-Level: *\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
/dev/null
# Si l’email obtient un score de 10
#  placé dans spam
:0
* ^X-Spam-Level: *\*\*\*\*\*\*\*\*\*
$MAILDIR/.spam/
# Si l’email est détecté comme virus
#  placé dans virus
:0:
* ^X-Amavis-Alert: INFECTED
$MAILDIR/.virus/
# Si l’email est à la fois un virus et un spam
:0:
* ^X-Amavis-Alert: INFECTED
* ^X-Spam-Status: Yes
/dev/null
# on le supprime