PSR SE2a4 2022/2023 G5 : Différence entre versions

De Wiki d'activités IMA
(Journal de bord)
(À faire la prochaine fois)
Ligne 131 : Ligne 131 :
 
<li> modifier fgets dans libs/SMTP.c, gérer la gestion d'une commande à deux lignes : si présence d'un tiret dans la quatrième colonne, il faut prendre en compte la commande complète. </li>
 
<li> modifier fgets dans libs/SMTP.c, gérer la gestion d'une commande à deux lignes : si présence d'un tiret dans la quatrième colonne, il faut prendre en compte la commande complète. </li>
 
</ul>
 
</ul>
</ul
 

Version du 2 avril 2023 à 16:01

TP SMTP 2022 - Spécifications techniques

Farid LAZOUACHE / William BECUE

GITHUB

 https://github.com/FaridLazouache/SMTP 

Paramètres du TP

Groupe Domaine Nom VM IPv4 virtuelle IPv4 routée VLAN privé Réseau local IPv4 Cisco 6509-E Cisco 9200 ISR4331 IPv6
Groupe 5 miserable.site VMalex2 10.24.0.250 193.48.57.167/28 24 10.24.0.0/16 10.24.0.251 10.24.0.252 10.24.0.253 2001:660:4401:60A0:216:3eff:fe92:8ec5

Machine virtuelle

  • Connexion au serveur Capbreton :
ssh root@capbreton.plil.info

    → Dossier de stockage des données de la VM : /usr/local/xen/domains/VMalex2
    → Fichier de configuration de la VM : /etc/xen/VMalex2.cfg

  • Connexion à la VM :
ssh root@193.48.57.167

Journal de bord

Séance 1

Découverte du projet, de la strucuture des serveurs, des sockets, etc.
Nous avons édité le Wiki afin de choisir notre machine virtuelle.
Nous avons testé la machine virtuelle avec la commande suivante : ssh root@193.48.57.167

Séance 2

Nous avons découvert le projet, le contenu et la structure des programmes. Nous avons, notamment, examiné la gestion des SMTPs rentrants et sortants, nous avons commencé notre analyse du fichier in.c. La fonction qui gère la gestion des clients SMTP (les clients qui souhaitent se connecter de l'extérieur) puis la gestion des courriels (des demandes venants de l'extèrieur) qui permet de récupérer les noms de domaines et les MX. Ensuite, la fonction gestionCourriel() permet à partir d'une boucle de gérer la connexion au serveur stocké dans ss (socket). Le contenu des messages va être stocké dans un fichier, celui-ci va être envoyé vers le serveur SMTP qui, lui, va envoyer le message sur internet ou bien sur le disque si c'est un utilisateur local. Nous, nous sommes rendu compte, que le message de base envoyait une réponse à tous les MX. Cependant, il suffit d'un MX qui réponde à notre demande. De fait nous avons ajouté un else break ligne 66 dans le cas où nous avions déjà eu un retour, pour stopper la boucle. Nous avons compris que gestion SMTP rempli struct courriel qui appel gestion courriel une fois remplie.

Ce qui a été fait

  • 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

  • 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

  • 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 communications peuvent ne pas être chiffrées, les communications non chiffrés sont reçues sur le port 25

  • 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 être contactables en IPv4 et en IPv6, ils doivent aussi prendre en charge IPv4 et IPv6 pour la transmission vers les serveurs SMTP cibles ; => connexion et inittialisation serveur

  • 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

  • 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

  • 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). => time

  • Free mutexes

Reste à faire

  • 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 ; => data gestion_dialog erreur temporaire mais pas definitive => courriel file d'attente et le renvoyer comme un script

  • les communications peuvent être chiffrées par TLS, les communication chiffrées peuvent être négociées directement sur le port 465 ; => serveur deux ports différents, un en claire et un directement chiffré

  • il doit être possible de basculer sur une communication chiffrée à partir du port 25 en utilisant les commandes EHLO et STARTTLS ; => 4 caractères

  • Faire une communication chiffré

  • pour la transmission vers les serveurs SMTP cibles, une communication chiffrée doit être préférée ; => envoyer un helo à la place => lancer la commande starTTLS => ehlo a partir de cette commande reponse plusieur lignes, si connait starttls reponse 250

  • 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

Séance 3

Dans le cadre de la troisième séance nous avons essayé d'établir une communication avec le serveur. Pour ce faire nous avons envoyé à la machine virtuel (notre serveur) le fichier de gestion de serveur </li> Nous nous sommes rendus compte que SMTPin et SMTPout écouter sur les mêmes interfaces.
Alors nous avons modifier SMTPout de sorte à ce qu'il n'écrive que sur eth0

Fait cette séance

  • Dans la fonction analyseArguments, de SMTPout/args.c : Structure long_options modifiée pour prendre en compte le paramètre d'interface i
  • Dans la fonction analyseArguments, de SMTPout/args.c : Paramètres de la fonction getotp_long modifiés pour inclure i et un argument supplémentaire

À faire la prochaine fois

  • Ajouter une option -i sur le SMTPout pour n'écouter qu'eth0
  • Dans SMTPout/args.c gérer strncopy pour l'argument avec le paramètre -i
  • Dans SMTPout/out.c ajouter gestion config.interface (à ajouter dans la structure config)

Séance 4

Fait cette séance

  • Ajout d'interfaces au niveau du SMTPout, nous avons complété le fichier SMTPout/args.c pour gérer l'argument i.
  • Gestion erreur : notification de la part du serveur d'erreur 502, en cas de EHLO mal orthographié.
  • Nous avons réalisé 2 ports différents lo et eth0 pour les 2 interfaces.
  • Dans la fonction analyseArguments, de SMTPout/args.c : Paramètres de la fonction getotp_long modifiés pour inclure i et un argument supplémentaire
  • Test serveur mail avec le site mxtoolbox.com.
  • Test serveur mail avec telnet.

À faire la prochaine fois

  • DEBUGGER LE SMTPin

Séance 5

Fait cette séance

  • Analyse de boucleServeur dans reseau.c, appelé par SMTPin et SMTPout. Puis nous avons ajouté des #ifdef DEVERMINE dans les fonctions appelées.
  • SMTP Dialogue ne fonctionnait pas, dans smtp.c => modification de ACCUEIL CODE à 220 au lieu de 250. pour le ./SMTPin, commande strace -f ./SMTPin -l

À faire la prochaine fois

  • modifier fgets dans libs/SMTP.c, gérer la gestion d'une commande à deux lignes : si présence d'un tiret dans la quatrième colonne, il faut prendre en compte la commande complète.