~~SLIDESHOW~~ ====== SI5 - Messagerie SMTP / POP ====== Cours - mardi 15 mai 2012 === Objectifs === * Découvrir un serveur SMTP === Éléments de configuration prérequis === * ====== Simple Mail Transfert Protocol (SMTP) ====== Le **//Simple Mail Transfer Protocol//** (littéralement « Protocole simple de transfert de courrier »), généralement abrégé **SMTP**, est un protocole de communication utilisé pour transférer le courrier électronique (courriel) vers les serveurs de messagerie électronique. SMTP est un protocole assez simple (comme son nom l'indique). On commence par spécifier l'expéditeur du message puis, le ou les destinataires d'un message, puis, en général après avoir vérifié leur existence, le corps du message est transféré. Il est assez facile de tester un serveur SMTP en utilisant la commande **telnet sur le port 25** d'un serveur distant. Le SMTP commence à être largement utilisé au début des années 1980. Il est alors un complément à l'UUCP (1), celui-ci étant plus adapté pour le transfert de courriers électroniques entre des machines dont l'interconnexion est intermittente. Le SMTP, de son côté, fonctionne mieux lorsque les machines qui envoient et reçoivent les messages sont interconnectées en permanence. Le logiciel Sendmail est l'un des premiers, sinon le premier serveur de messagerie électronique à utiliser SMTP. Depuis, la plupart des clients de messagerie peuvent utiliser SMTP pour envoyer les messages. Certains nouveaux serveurs sont apparus, comme Postfix, Qmail de Daniel J. Bernstein, Exim et Exchange de Microsoft (qui accomplit également d'autres fonctions). Comme le protocole utilisait du texte en ASCII (7 bits), il ne fonctionnait pas pour l'envoi de n'importe quels octets dans des fichiers binaires. Pour pallier ce problème, des standards comme MIME ont été développés pour permettre le codage des fichiers binaires au travers de SMTP. Aujourd'hui, la plupart des serveurs SMTP acceptent le MIME sur 8 bits, ce qui permet de transférer des fichiers binaires presque aussi facilement que du texte simple. **SMTP utilise TCP** pour le transfert des données. Le transfert de messages entre serveurs de messagerie électronique se fait généralement sur le port 25 qui est le port standard enregistré auprès de l'IANA (2). Les serveurs utilisent les enregistrements MX(3)des serveurs DNS pour acheminer le courrier. Les clients de messagerie utilisaient aussi le port 25 (smtp) pour soumettre des messages en utilisant le protocole SMTP. Mais la nécessité de mieux contrôler les envois des clients, en particulier par l'authentification, a conduit à l'attribution du port 587 (submission) SMTP **ne permet pas de récupérer à distance des courriels arrivés dans une boîte aux lettres sur un serveur**. Les standards //Post Office Protocol// (POP) et //Internet Message Access Protocol// (IMAP) ont été créés dans ce but. L'ensemble des spécifications du protocole SMTP sont définies dans le [[http://www.ietf.org/rfc/rfc821.txt|RFC 821]] (depuis avril 2001, les spécifications du protocole SMTP sont définies dans le [[http://www.ietf.org/rfc/rfc2821.txt|RFC 2821]]). ---- notes: (1) **Unix to Unix Copy Protocol (UUCP)** est un ensemble de programmes qui permettent à deux machines d'échanger des fichiers et d'exécuter des commandes sur la machine distante en passant par une ligne téléphonique (modem), mais aussi sur une couche TCP/IP (souvent à travers Ssh), voire via un câble série direct (null modem). Le mode modem reste cependant le cas de figure le plus utilisé (2)L'**Internet Assigned Numbers Authority (IANA)** est une organisation dont le rôle est la gestion de l'espace d'adressage IP d'Internet, et des autres ressources partagées de numérotation requises soit par les protocoles de communication sur Internet, soit pour l'interconnexion de réseaux à Internet. (3)Un enregistrement **Mail eXchanger (MX)** est un type d'enregistrements du DNS qui associe un nom de domaine à un serveur de messagerie électronique associé à son numéro de préférence. Ces enregistrements permettent de déterminer vers quel serveur un courrier électronique doit être acheminé lorsque le protocole SMTP est utilisé. Autrement dit, les enregistrements MX permettent d'associer la partie à droite de l'arobase des adresses électroniques au serveur qui sert de boîte aux lettres. ====== Itinéraire d'un message électronique ====== Supposons un cas simple (et cependant courant). * Soit un utilisateur abonné chez « truc » et ayant pour adresse électronique : fred@truc.fr. * Soit un autre utilisateur abonné chez « machin » et ayant pour adresse électronique marc@machin.com. truc dispose des serveurs : * smtp.truc.fr * pop.truc.fr machin dispose des serveurs : * smtp.machin.com * pop.machin.com Fred doit envoyer un message à Marc. {{:si5_-_w2003:si5..c12g1.png|}} - Fred compose le message avec son outil de messagerie préféré, disons outlook express. Il a des avantages: Il est gratuit et il est fait par Microsoft. Une fois le message composé, Fred clique sur le bouton « envoyer » de son MUA (comme Mail User Agent). Comme il a correctement configuré son outil, le message est envoyé sur le serveur smtp.truc.fr (MTA, comme Mail Transfert Agent). - Le serveur smtp.truc.fr reçoit le message, constate que le destinataire n'est pas dans son domaine (sa destination). Il cherche alors un MTA dans le domaine machin.com et le trouve (DNS est là pour ça, entre autres choses). Il envoie le message à smtp.machin.com. - Le serveur smtp.machin.com reçoit le message, constate que le destinataire est bien dans son domaine (ses destinations). Il range alors le message dans la boite aux lettres de Marc, par l'intermédiaire d'un composant appelé MDA, comme Mail Delivery Agent. Il y restera aussi longtemps qu'il le faudra, sans rien dire à personne. - Un jour, Marc décide de regarder s'il n'a pas de messages. Il envoie donc une requête à son serveur pop.machin.com, au moyen de son outil de messagerie préféré, par exemple « Thunderbird » (un autre MUA). Il a des avantages: il est libre, gratuit et n'est pas fait par Microsoft. - Le serveur pop consulte la boite aux lettres de Marc, constate qu'il y a un message dedans. - Il l'envoie alors à l'outil de messagerie de Marc qui, par défaut, demandera à pop.machin.com de le supprimer de la boite aux lettres. Nous supposons ici que Marc, ou plutôt son MDA, utilise le protocole POP3. Mais c'est un comportement par défaut, il est possible de demander à ne pas effacer les messages (même avec POP3). Cette fonction est utile lorsque l'on désire consulter sa messagerie de divers endroits sans avoir à se renvoyer un message si on veut le relire ailleurs. POP3 est un protocole de relève de courrier. Sans entrer ici dans les détails, il en existe un autre appelé IMAP. ===== Mécanismes mis en jeu ===== ==== SMTP (Simple Message Transfert Protocol) ==== C'est le protocole applicatif qui permet de transporter les messages sur l'Internet. Il sait acheminer un message jusqu'à une boîte aux lettres, mais ne va pas plus loin. Pour y arriver, il analyse dans un premier temps la partie de l'adresse située à droite du @ (à prononcer dans ce cas « at »), pour trouver le domaine du destinataire. Si ce domaine le concerne, il cherche alors la boîte aux lettres du destinataire en regardant la partie de l'adresse située à gauche du @. Si le domaine du destinataire ne le concerne pas, il va chercher le serveur SMTP qui gère ce domaine, au moyen des champs MX du DNS du domaine destinataire et transmet le message à ce serveur. ==== POP3 (Post Office Protocol 3) ==== Ce protocole est exclusivement utilisé pour le dialogue entre le client de messagerie et la boîte aux lettres. Il ne fait pas de transport sur l'Internet, il permet juste à l'utilisateur de gérer son courrier. IMAP4 (Internet (ou Interactive ?) Mail (ou Message ?) Access Protocol version 4) en est une alternative. ==== MUA, MTA, MDA et cetera ==== Un peu de jargon : * Le **MUA** (//Mail User Agent//), c'est le client de messagerie (Thunderbird, Outlook Express, Eudora, Pegasus etc.). * Le **MTA** (//Mail Transfert Agent//) est à prendre au sens large. Le courrier peut être acheminé d'un point à un autre par l'intermédiaire d'agents de transfert qui ne gèrent pas de boites aux lettres, mais savent relayer le courrier d'un point à un autre pour atteindre le serveur supportant les boites aux lettres. En effet, l'exemple vu plus haut est le plus simple que l'on puisse imaginer. Dans la pratique, le courrier peut transiter par plusieurs MTA. * Le **MDA** (//Mail Delivery Agent//) aussi appelé LDA (//Local Delivery Agent//) est le service de remise du courrier dans les boites aux lettres des destinataires, une fois que le courrier est arrivé sur le MTA de destination. Le MTA transmet alors au MDA les messages destinés aux clients du domaine. * le **MX** (//Mail eXchanger//), n'est rien de plus qu'un MTA référencé sur les DNS. Récapitulons : Lorsque l'on rédige un courrier et qu'on le poste, on le fait avec le MUA qui le transmet au MTA qu'on lui a signalé dans la configuration (pour un abonné Free, c'est normalement smtp.free.fr). C'est l'étape 1 du petit schéma vu plus haut. De MTA en MTA, le message voyage jusque sur le MTA qui a en charge la messagerie du domaine du destinataire (étape 2). Il le passe alors (avec tous les autres messages entrant pour ce domaine) au MDA qui distribue ce courrier entrant dans les boites aux lettres concernées (étape 3). Les étapes 4, 5 et 6 concernent exclusivement le serveur POP (ou IMAP). ===== Syntaxe type d'une session ESMTP ===== Le test par telnet mentionné ci-dessus donnerait un dialogue du genre (les messages du serveur sont en rouge) : telnet smtp.wanadoo.fr 25 Connected to smtp.xxxx.xxxx. 220 smtp.xxxx.xxxx SMTP Ready HELO client 250-smtp.xxxx.xxxx 250-PIPELINING 250 8BITMIME MAIL FROM: 250 Sender ok RCPT TO: 250 Recipient ok. DATA 354 Enter mail, end with "." on a line by itself Subject: Test Corps du texte . 250 Ok QUIT 221 Closing connection Connection closed by foreign host. ====== Fiabilité, sécurité ====== SMTP est un très vieux protocole. C'est le RFC 821 qui en définit les bases, en 1982. A cette date, les connexions étaient rares, peu fiables et le souci premier était d'assurer un transport sans pertes. Depuis, les conditions ont bien changé et la sécurité, qui n'avait pas été prise en compte, devient un souci majeur. **ESMTP (//Extended SMTP//)** a ajouté quelques fonctionnalités importantes, comme le support du codage sur 8 bits, les types MIME et aussi la possibilité de chiffrer la connexion. Extended SMTP Aujourd'hui, tous les serveurs SMTP sont en réalité des serveurs ESMTP. Pour le vérifier, utilisons la commande EHLO plutôt que HELO : $ telnet multimedia.local 25 Trying 192.168.10.7... Connected to multimedia.local. Escape character is '^]'. 220 cyrus.nain-t.net ESMTP Experimental HELO machin.nain-t.net 250 cyrus.nain-t.net quit 221 2.0.0 Bye Pas grand chose comme informations, si ce n'est que nous disposons d'un serveur ESMTP (et encore, cette information étant dans la bannière, elle n'est pas d'une grande fiabilité). ~$ telnet cyrus.bts.eme 25 Trying 192.168.10.7... Connected to cyrus.bts.eme. Escape character is '^]'. 220 cyrus.nain-t.net ESMTP Experimental EHLO machin.nain-t.net 250-cyrus.nain-t.net 250-PIPELINING 250-SIZE 10240000 250-ETRN 250-STARTTLS 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN quit 221 2.0.0 Bye La commande EHLO nous permet d'obtenir quelques informations sur la capacité du serveur. Parmi les plus intéressantes, nous constatons que Postfix sait gérer le « 8 bits MIME » (le contraire serait fâcheux, mais ici, nous en avons la confirmation) et accepte la commande starttls. ===== Chiffrement ===== les évolutions du protocole SMTP permettent de chiffrer la connexion de deux manières légèrement différentes. **SMTPS** se contente de passer le dialogue SMTP dans une **connexion SSL**. L'autre méthode, plus actuelle, consiste à invoquer la commande **STARTTLS**. Si la mise en œuvre d'une commande STARTTLS entre un MUA et un serveur SMTP est assez simple, elle devient plus compliquée entre deux serveurs SMTP, du fait que les certificats des serveurs doivent être signés par une racine de confiance acceptée par le partenaire. Aussi, il est rare qu'un chiffrement ait lieu entre deux MTA. Ce qui veut dire que votre message circule en clair sur l'internet. STARTTLS comme SSL offrent tout de même l'avantage pour le client de masquer son login, lorsqu'il a besoin de le transmettre (accès IMAP, POP3 ou même SMTP si le MTA requiert une authentification du client). ====== POP3 ====== Le protocole POP3 (//Post Office Protocol//) a un objectif très spécifique: Permettre à l'utilisateur de relever son courrier depuis un hôte qui ne contient pas sa boite aux lettres. Entendez par là : Depuis un hôte qui n'est pas celui où le SMTP stocke les messages entrants pour son compte, ce qui est le cas de la très large majorité des internautes. Autant dire que la plus grosse partie du travail est réalisée par SMTP. POP3 et IMAP4 sont donc des protocoles dont l'unique fonction est de gérer à distance cette file d'attente, présente sur le serveur SMTP qui réceptionne vos messages. IMAP est plus performant, mais aussi plus complexe. ===== Les commandes de POP3 ===== ^**Commande** ^**Fonction** | | **USER **| Il s'agit de l'identifiant du titulaire du compte. En règle générale la partie à gauche du @ dans l'adresse électronique. | | **PASS **| Le mot de passe fourni par le FAI | | **STAT **| Donne le nombre de messages présents dans la file d'attente, ainsi que le volume total des messages en octets. | | **LIST **| Donne la liste des messages en attente, avec pour chaque message: * Son numéro d'ordre dans la file * Sa taille en octets | | **UIDL **| Analogue à LIST, mis à part qu'elle retourne non pas la taille du message mais un identificateur unique | | **RETR n** | Permet de récupérer la totalité du message “n” dans la file d'attente. | | **DELE n** | Détruit le message “n” dans la file d'attente. le numéro d'ordre des messages suivants demeure inchangé jusqu'à la fin de la session. | | **TOP n x** | Permet de récupérer les x premières lignes du message “n”. Les ligne d'en-tête ne sont pas comptabilisées. Cette commande est le plus souvent utilisée pour récupérer l'en-tête complet et la première ligne du message, x ne pouvant être égal à 0. | | **LAST **| Permet de connaitre le numéro d'ordre du dernier message auquel on a accédé. (Utile avec une session TELNET). | | **RSET **| Cette commande permet d'annuler toutes les commandes de destruction de messages envoyées pendant la session. En fait, les commandes DELE ne sont rendues effectives que si la session a proprement été fermée (commande QUIT acceptée). Cette méthode permet donc d'annuler les opérations d'effacement dans la session en cours. | | **NOOP **| Cette commande sert à ne rien faire. | | **QUIT **| Clôture la session en cours. Le serveur ferme alors la session TCP et “fait le ménage” dans la file d'attente, en fonction des ordres DELE qui ont été donnés. | Pour plus de détails sur les commandes POP3, consultez la rfc1939 Il y a très peu de commandes, mais elles sont suffisantes pour relever sa boite aux lettres. La plupart des MUA (clients de messagerie) ne les utilisent même pas toutes. ====== Expérience avec TELNET ====== Il est donc tout à fait possible, si l'on connaît le jeu de commandes ci-dessus, d'ausculter sa boite aux lettres avec un terminal TELNET. Voici des extraits d'une trace enregistrée avec un terminal TELNET, connecté sur le port 110 du serveur pop installé sur notre passerelle : ~# telnet localhost 110 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. +OK Dovecot ready. user chris +OK pass epikoi +OK Logged in.'' Nous avons utilisé les commandes user et pass pour nous identifier, le serveur nous a reconnu et accepte la connexion. ''stat +OK 3 6694 list +OK 3 messages: 1 4997 2 1217 3 480 .'' Nous avons utilisé la commande stat, ce qui nous apprend qu'il y a 3 messages (rappelez-vous, le premier n'est pas un vrai message), puis la commande list qui ne fait que nous donner les numéros d'ordre et la taille en octets de chaque message.