Découverte de Postfix
1. Présentation
Postfix est un serveur mail SMTP (Simple Mail Transfer Protocol) appelé aussi MTA pour Mail Transport Agent. Son rôle est d’assurer l’acheminement des courriels. Il peut être utiliser pour héberger la messagerie électronique d’une entreprise ou servir simplement de relai de messagerie.
2. Architecture
Notre serveur Postfix est installé sur la même machines que les services Courier qui vont permettre de relever les mails. Notre machine a pour adresse IP 10.0.0.44, comme nom d’hôte alice.lan et comme nom de domaine pour la messagerie @mail.glx.
Voici un schéma plus précis de Postfix et plus particulièrement les différents sous-programmes qui le compose. Des analyses de logs reprenant ce schéma de principe sont disponibles ici.
3. Installation de Postfix
Le serveur de messagerie basé sur Postfix se compose des éléments suivants :
- Postfix, qui est le MTA (Mail Transport Agent) permettant d’assurer le transport des mails aux destinataires internes et externes.
- Procmail, qui est le MDA (Mail Delivery Agent) permettant de délivrer les mails aux utilisateurs UNIX locaux.
- Courier-Pop, qui est le serveur POP pour la récupération des messages par l’utilisateur via un client de messagerie.
- Courier-Imap, qui est le serveur IMAP pour la récupération des messages par l’utilisateur via un client de messagerie ou un webmail.
root@alice.lan: # apt-get install postfix courier-pop courier-imap procmail
- Un assistant d’installation se lancera et posera des questions. Peu importe les réponses, la configuration sera réinitialisée et étudiée pas à pas.
Prise en charge des quotas
Par défaut, Postfix ne supporte pas les quotas. Pour greffer cette fonctionnalités à Postfix, il est nécessaire de lui appliquer le patch adéquate.
- Tous d’abord, il faut récupérer les sources de Postfix puis les sauvegarder dans le dossier /usr/src/ :
root@alice.lan: # apt-get build-dep postfix
root@alice.lan: # cd /usr/src
root@alice.lan:/usr/src # apt-get source postfix
- Avant de télécharger le patch, il est nécessaire de vérifier la version de Postfix :
root@alice.lan:/usr/src # postconf mail_version
mail_version = 2.9.6
- Une fois la version connu, on se rend sur le site du développeur du patch (http://vda.sourceforge.net/) puis on choisi le patch approprié à notre version de Postfix :
root@alice.lan:/usr/src # wget http://vda.sourceforge.net/VDA/postfix-vda-v11-2.9.6.patch
- Maintenant, on applique le patch. Pour cela, on se place dans le dossier des sources de Postfix, puis avec la commande patch, on y intègre les éléments du patch :
root@alice.lan:/usr/src # cd /usr/src/postfix-2.9.6/
root@alice.lan:/usr/src/postfix-2.9.6 # patch -p1 < ../postfix-vda-v11-2.9.6.patch
- Ouvrir le fichier /usr/src/postfix-2.9.6/debian/rules, puis remplacer :
export DEB_BUILD_HARDENING=1
- Par :
export DEB_BUILD_HARDENING=0
- On va pouvoir construire le nouveau package Postfix :
root@alice.lan:/usr/src/postfix-2.9.6 # dpkg-buildpackage
- Si l’on se place dans le dossier /usr/src/ on peut remarquer plusieurs packages .deb. Les deux packages qui nous intéresse sont postfix_2.9.6-1~12.04.1_i386.deb et postfix-mysql_2.9.6-1~12.04.1_i386.deb :
root@alice.lan:/usr/src/postfix-2.9.6 # ls -l postfix_2.9.6-1~12.04.1_i386.deb
root@alice.lan:/usr/src/postfix-2.9.6 # postfix-cdb_2.9.6-1~12.04.1_i386.deb
root@alice.lan:/usr/src/postfix-2.9.6 # postfix-dev_2.9.6-1~12.04.1_all.deb
root@alice.lan:/usr/src/postfix-2.9.6 # postfix-doc_2.9.6-1~12.04.1_all.deb
root@alice.lan:/usr/src/postfix-2.9.6 # postfix-ldap_2.9.6-1~12.04.1_i386.deb
root@alice.lan:/usr/src/postfix-2.9.6 # postfix-mysql_2.9.6-1~12.04.1_i386.deb
root@alice.lan:/usr/src/postfix-2.9.6 # postfix-pcre_2.9.6-1~12.04.1_i386.deb
root@alice.lan:/usr/src/postfix-2.9.6 # postfix-pgsql_2.9.6-1~12.04.1_i386.deb
- On procède à l’installation de ces deux packages sur le système :
root@alice.lan: # dpkg -i postfix_2.9.6-1~12.04.1_i386.deb postfix-mysql_2.9.6-1~12.04.1_i386.deb
4. Configuration de base
Cette configuration illustre le déploiement de Postfix pour un usage local uniquement.
Tout au long de cette documentation nous utiliseront le nom de domaine fictif mail.glx. Les adresses mails seront de la forme @mail.glx.
4.1. Fichier /etc/postfix/main.cf
- Avant toute modification, faisons une sauvegarde du fichier de configuration d’origine :
root@alice.lan: # cp /etc/postfix/main.cf /etc/postfix/main.cf.bak
root@alice.lan: # rm /etc/postfix/main.cf
- Puis, créer le fichier vide main.cf et y insérer les éléments suivants :
smtpd_banner = $myhostname ESMTP $mail_name
biff = no
append_dot_mydomain = no
readme_directory = no
myhostname = alice.lan
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
mydomain = mail.glx
myorigin = $mydomain
mydestination = localhost $mydomain
relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/124 [::1]/128
home_mailbox = Maildir/
mailbox_command = procmail -a « $EXTENSION »
recipient_delimiter = +
inet_interfaces = all
message_size_limit = 5120000
mailbox_size_limit = 10240000
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
smtpd_recipient_restrictions =
permit_mynetworks
reject_unauth_destination
permit
On indique à Postfix les destinations locales dans le paramètre mydestination (les noms de domaines pour lesquels Postfix doit gérer les courriers entrants) :
- Le paramètre mynetworks contient la liste des réseaux. Par la suite ce paramètre pourra être utilisé dans des règles de filtrage. Le relayage SMTP est uniquement autorisé depuis un hôte contenu dans mynetwork.
- Lorsque vous vous connecter au serveur Postfix en ssh, le terminal vous notifie lorsqu’il y a des nouveaux mails. Il est possible de désactiver cette notification via le paramètre biff.
- La variable home_mailbox indique où trouver le répertoire mail des utilisateurs. Dans ce cas de configuration, se sera /home/<user>/Maildir/.
- La variable inet indique sur quel(s) interface(s) réseau le serveur doit écouter. Ici il écoute sur toutes les interfaces.
- La variable message_size_limit indique la taille maximale d’un message – pièce jointe incluse (en Ko, ici 5120000/1000/1024 = 5 Mo).
- La variable mailbox_size_limit indique la taille maximale d’une boîte mail (en Ko, ici 10240000/1000/1024 = 10 Mo).
Par défaut, la variable home_mailbox a pour valeur /var/mail. Les messages sont enregistrés dans un fichier texte portant le nom de l’utilisateur UNIX. Ce mode de fonctionnement n’est pas compatible avec les daemons courier-pop et courier-imap
4.2. Fichier /etc/procmailrc
Le daemon procmail interroge le fichier procmailrc pour chaque nouveau courriel reçu. Ce fichier permet d’identifier la localisation des répertoires de stockage des boîtes de messagerie des utilisateurs hébergés par le serveur.
- Par défaut, ce fichier n’existe pas. Créer le fichier et y insérer les ligne suivantes :
MAILDIR=$HOME/Maildir
DEFAULT=$MAILDIR/
4.3. Création du répertoire mail
Pour l’exemple, nous disposons de l’utilisateur UNIX alice sur notre serveur de messagerie avec pour répertoire personnel /home/alice.
- Création des répertoires pour la boîte de courrier électronique nommée alice :
root@alice.lan: # cd /home/alice
root@alice.lan:/home/alice # maildirmake Maildir
root@alice.lan:/home/alice # maildirmake -f Sent Maildir
root@alice.lan:/home/alice # maildirmake -f Queue Maildir
root@alice.lan:/home/alice # maildirmake -f junkmail Maildir
root@alice.lan:/home/alice # maildirmake -f virus Maildir
root@alice.lan:/home/alice # maildirmake -f Drafts Maildir
root@alice.lan:/home/alice # maildirmake -f Trash Maildir
root@alice.lan:/home/alice # chown alice:alice Maildir -R
root@alice.lan:/home/alice # chmod 700 Maildir -R
- Pour que cette opération soit automatisé pour chaque nouvel utilisateur UNIX :
root@alice.lan: # sudo maildirmake /etc/skel/Maildir
root@alice.lan: # sudo maildirmake /etc/skel/Maildir/.Drafts
root@alice.lan: # sudo maildirmake /etc/skel/Maildir/.Sent
root@alice.lan: # sudo maildirmake /etc/skel/Maildir/.Trash
root@alice.lan: # sudo maildirmake /etc/skel/Maildir/.Templates
4.4. Application des paramètres de base
- À ce stade, nous disposons d’un serveur de messagerie hébergeant l’adresse de messagerie alice@mail.glx. Avant de pouvoir tester la configuration, il est nécessaire de redémarrer le service Postfix :
alice@alice.lan: # sudo service postfix restart
5. Validation de l’installation
5.1. Test du service SMTP
L’objectif de ce test est de rédiger puis d’envoyer un courriel à alice@mail.glx.
- Nous pouvons vérifier le bon fonctionnement du serveur SMTP en s’y connectant avec la commande telnet :
alice@alice.lan: > telnet 127.0.0.1 25
- Le serveur répondra par un code 220 contenant la bannière qui a été définit au paramètre smtpd_banner dans le fichier main.cf.
alice@alice.lan: > telnet 127.0.0.1 25
Trying 127.0.0.1…
Connected to 127.0.0.1.
Escape character is ‘^]’.
220 alice.lan ESMTP Postfix
- Pour valider son fonctionnement, nous allons envoyer un mail. Commençons d’abord par indiquer notre adresse mail émetteur :
mail from:root@mail.glx
250 2.1.0 OK
- Le serveur acquittant avec le code 250, nous pouvons maintenant indiquer l’adresse de l’expéditeur :
rcpt to:alice@mail.glx
250 2.1.5 OK
- Le serveur doit acquitter également avec le code 250. Maintenant nous allons rédiger le contenu du mail. Pour cela, il faut saisir la commande data :
data
- Le serveur répondra par :
354 End data with <CR><LF>.<CR><LF>
- Dès lors, nous pouvons maintenant rédiger notre mail. La touche Entrée est interprétée comme un retour à la ligne dans le mail.
test d’envoi / réception
Merci 😉
- Le mail rédigé, on revient à la ligne avec la touche Entrée, puis on saisit un point (.) et on appui de nouveau sur la touche Entrée :
.
- Le serveur valide la mise en attente de distribution du mail et retourne son numéro d’identifiant dans la file d’attente :
250 2.0.0 Ok: queued as C01187F9FA
- On ferme la connexion avec la commande quit :
quit
221 2.0.0 Bye
Connection closed by foreign host.
5.2. Test du service POP3
- On va vérifier la bonne réception du mail envoyé à l’étape précédente. Pour cela on se connecte au serveur sur le port tcp/110 :
alice@alice.lan: > telnet 10.0.0.44 110
Trying 10.0.0.44… Connected to 10.0.0.44. Escape character is ‘^]’. +OK Hello there.
- On indique le nom d’utilisateur UNIX du compte avec la commande user :
user alice
+OK Password required
- Le serveur demande le mot de passe du compte, on lui indique via la commande pass :
pass alice
+OK logged in.
- Le serveur accepte la connexion. On consulte la liste des messages avec la commande list :
list
+OK POP3
1 280
.
- On affiche les 20 premières lignes du message 1 avec la commande top :
top 1 20
+OK headers follow.
Return-Path: root@mail.glx
X-Original-To: alice@mail.glx
Delivered-To: alice@mail.glx
Received: from pfalk.net.ncad.fr (pfalk.net.ncad.fr [10.0.0.48])
__by alice.lan (Postfix) with SMTP id A3242628A2
__for alice@mail.glx; Thu, 30 Jan 2014 01:20:57 +0100 (CET)
test
.
5.3. Test du service IMAP
- On se connecte au serveur sur le port imap tcp/143 :
telnet 10.0.0.44 143
Trying 10.0.0.44…
Connected to 10.0.0.44.
Escape character is ‘^]’.
¤ OK [CAPABILITY IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA IDLE ACL
ACL2=UNION] Courier-IMAP ready. Copyright 1998-2011 Double Precision, Inc. See COPYING for distribution information.
- Le serveur attend un login est un mot de passe. Pour cela, on utilise la commande LOGIN <user> <password> :
01 LOGIN alice alice
1 OK LOGIN Ok.
- On demande la liste des répertoires grâce à la commande LIST « » « * » :
2 LIST « » « * »
¤ LIST (\HasNoChildren) « . » « INBOX.Queue »
¤ LIST (\HasNoChildren) « . » « INBOX.Drafts »
¤ LIST (\HasNoChildren) « . » « INBOX.Trash »
¤ LIST (\HasNoChildren) « . » « INBOX.junkmail »
¤ LIST (\HasNoChildren) « . » « INBOX.Sent »
¤ LIST (\Marked \HasChildren) « . » « INBOX »
¤ LIST (\HasNoChildren) « . » « INBOX.virus »
2 OK LIST completed
- On accède au dossier des messages reçus dans INBOX avec la commande SELECT <nom_dossier> :
3 SELECT INBOX
¤ FLAGS (\Draft \Answered \Flagged \Deleted \Seen \Recent)
¤ OK [PERMANENTFLAGS (* \Draft \Answered \Flagged \Deleted \Seen)] Limited
¤ 4 EXISTS
¤ 4 RECENT
¤ OK [UIDVALIDITY 1391044096] Ok
¤ OK [MYRIGHTS « acdilrsw »] ACL
3 OK [READ-WRITE] Ok
- On liste les messages reçus dans le dossier INBOX avec la commande SELECT <nom_dossier> :
4 UID FETCH 1:* RFC822.SIZE
¤ 1 FETCH (UID 1 RFC822.SIZE 280)
4 OK FETCH completed.
- On consulte le message avec l’UID 1 en saisissant la commande UID FETCH BODY[] :
5 UID FETCH 4 BODY[]
¤ 4 FETCH (UID 1 BODY[] {310}
Return-Path: root@mail.glx
X-Original-To: alice@mail.glx
Delivered-To: alice@mail.glx
Received: from pfalk.net.ncad.fr (pfalk.net.ncad.fr [10.0.0.48])
___by alice.lan (Postfix) with SMTP id 511AB628A2
___for alice@mail.glx; Thu, 30 Jan 2014 01:56:23 +0100 (CET)
test d’envoi / réception
Merci 😉
)
¤ 4 FETCH (FLAGS (\Seen \Recent))
5 OK FETCH completed.
- On ferme la connexion avec la commande LOGOUT :
6 logout
¤ BYE Courier-IMAP server shutting down
6 OK LOGOUT completed
Connection closed by foreign host.
5.4. Autres éléments de diagnostique
- Les journaux d’activités de Postfix sont consignés dans le fichier /var/log/mail.log. On peut aussi retrouver les métadonnées des courriels qui ont été traités par Postfix :
Jan 30 02:29:40 alice.lan postfix/local[13772]: C01187F9FA: to=alice@mail.glx, relay=local, delay=50, delays=49/0.17/0/0.14, dsn=2.0.0, status=sent (delivered to command: procmail -a « $EXTENSION »)
Jan 30 02:29:40 alice.lan postfix/qmgr[13254]: C01187F9FA: removed
- Il est également possible d’interroger la file d’attente Postfix pour déterminer si des courriels sont en attente d’acheminement et identifier les éventuels problèmes :
root@alice.lan: # mailq