2 Spécifications techniques
2.1 Architecture générale
Le système de messagerie va être simplifié par rapport à un système de messagerie classique.
Un système de messagerie classique est composé de trois composants : les agents utilisateurs (MUA),
les agents de transfert (MTA) et les agents de distribution (MDA). Un MUA va contacter son MTA
qui lui-même va contacter le MTA du destinataire et enfin ce dernier contacte le MDA local
pour stocker le message.
Vous allez développer deux serveurs SMTP :
-
un premier pour les messages sortants, ce serveur a vocation à être contacté par un MUA,
une fois le message reçu du MUA, le serveur doit contacter le MTA du destinataire pour transférer le
message ;
- le second reçoit des messages d’Internet et, s’ils sont bien à destination d’une boite à lettre
locale, agit comme un MDA en les stockant dans les dossiers des utilisateurs dans le format maildir.
Pour tester votre système vous pourrez utiliser un MUA compatible avec le format de stockage maildir,
par exemple mutt.
2.2 Précisions
Quelques précisions concernant les serveurs SMTP :
-
pour prévenir les failles, les deux serveurs SMTP seront écrits à partir de zéro
en respectant la RFC 5321 mais avec des simplifications ;
- les serveurs doivent être codés en langage C en utilisant la bibliothèque des sockets
pour les communications Internet ;
- les commandes VRFY et EXPN qui permettent au client de vérifier si une
messagerie est disponible pour la transmission, ne seront pas implémentées ;
- le routage des messages ne doit pas être implémenté, les messages sont envoyés directement
à destination ;
- un système doit être réalisé permettant au serveur SMTP sortant de mettre en file
d’attente les messages non remis à destination pour cause d’erreur transitoire du serveur SMTP
cible ;
- les communications peuvent ne pas être chiffrées, les communications non chiffrés
sont reçues sur le port 25 ;
- les communications peuvent être chiffrées par TLS, les communication chiffrées peuvent
être négociées directement sur le port 465 ;
- il doit être possible de basculer sur une communication chiffrée à partir du port 25
en utilisant les commandes EHLO et STARTTLS ;
- chaque connexion doit être gérée via un processus léger (Thread) et chaque
commande par une fonction à laquelle est passée une structure représentant l’état du dialogue
entre le client et le serveur ;
- les serveurs SMTP doivent gérer les enregistrements MX permettant d’associer un nom de
domaine à un serveur de messagerie, le recours aux enregistrements AAAA et A est à utiliser en
cas d’absence de MX ;
- les serveurs SMTP doivent être contactables en IPv4 et en IPv6, ils doivent aussi prendre
en charge IPv4 et IPv6 pour la transmission vers les serveurs SMTP cibles ;
- pour la transmission vers les serveurs SMTP cibles, une communication chiffrée doit être
préférée ;
- les deux serveurs ne diffèrent que par la méthode de distribution finale
(stockage dans un système de fichiers ou envoi à un serveur SMTP cible) ;
- le serveur SMTP sortant ne doit être lié qu’à l’interface réseau loopback ;
- le serveur SMTP entrant ne doit être lié qu’à l’interface réseau menant à Internet.
Quelques précisions concernant le stockage des courriels :
-
ne doivent être stockés que les courriels à destination d’un utilisateur local ;
- le format de stockage doit être le format maildir qui est une structure de
répertoires particulière utilisée pour sauvegarder des courriers électroniques
(le format maildir est très bien décrit sur Wikipédia);
- chaque message entrant doit être ajouté au dossier de réception Maildir
propre à l’utilisateur de destination ;
- le processus de remise stocke le message dans le sous-répertoire Maildir/tmp
puis le déplace dans le sous-répertoire Maildir/new, déplacement doit être fait par
la primitive rename ;
- pour assurer un nom unique aux fichiers de stockage, utilisez la date en seconde (fonction
time), le PID et un compteur commun à tous les flux d’exécution (utilisation de sémaphores
indispensable).
2.3 Procédures de test
Un test de vos serveurs en grandeur nature est demandé :
-
il vous faut une adresse IP routée pour pouvoir contacter les MTA d’Internet ;
- il faut un accès non filtré en provenance d’Internet pour pouvoir être contacté par les MTA distants ;
- il vous faut un nom de domaine Internet pour avoir un adresse de courriel valide.
Pour avoir accès à ces ressources vous utiliserez les machines virtuelles de vos ainés.
Pour les test :
-
vous installerez vos deux serveurs sur votre machine virtuelle ;
- vous installerez un MUA compatible maildir sur votre machine virtuelle ;
- vous vérifirez que votre nom de domaine est bien associé à un enregistrement DNS MX dans votre serveur DNS,
vérifiez aussi que cet enregistrement pointe bien vers l’adresse IPv4 de votre machine virtuelle, le cas échéant
demandez de l’aide à l’encadrant :
- vous aurez aussi probablement besoin de créer des certificats X509 via letsencrypt, là aussi demandez de l’aide
à votre encadrant ;
- vous devriez ainsi pouvoir tester l’envoi de courriels à des serveurs SMTP externes et recevoir des courriels
de serveurs SMTP externes ;
- utilisez les sites de vérification en ligne pour tester votre serveur SMTP entrant (IPv4, IPv6, chiffrement, ...) ;
- écrivez des scripts pour envoyer des courriels en masse via votre serveur SMTP sortant (attention à ne pas vous
faire mettre en liste noire) ;
- écrivez des scripts pour stresser votre serveur SMTP entrant en le bombardant de courriels.