système d'hébergement domestique...place sur les domaines .pw par gandi.net, notre...

45
Système d'hébergement domestique Projet de fin d'études Rapport Final P9 Romain LIBAERT IMA5 Timothée TENEUR 23 Février 2016

Upload: others

Post on 21-Jun-2020

4 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Système d'hébergement domestique...place sur les domaines .pw par Gandi.net, notre fournisseur. Nous n’avons donc pas pu l’implémenter. Nous avons configuré Postfix pour qu’il

Systegraveme dheacutebergement domestique Projet de fin deacutetudes shy Rapport Final

P9

Romain LIBAERT IMA5

Timotheacutee TENEUR 23 Feacutevrier 2016

Sommaire

Sommaire

Contexte amp Objectifs

Contexte

Objectifs

Cahier des Charges

Mateacuteriel et logiciels utiliseacutes

Dans le deacutetail

Au coeur du projet

Gestion des utilisateurs - Le serveur LDAP

Serveurs SMTP et DNS

Serveur Web et Webmail

Un serveur web leacuteger

Une architecture optimiseacutee

Envoyer des courriels

Mais aussi en recevoir

Interface drsquoadministration

Architecture du systegraveme de fichiers

Firewall

Gestion de lrsquoeacutenergie

Eacutevolutions possibles

Webmail

Systegraveme

Partie eacutenergeacutetique

Conclusion

Sources

Contexte amp Objectifs

Contexte

Aujourdrsquohui avec lrsquoarriveacutee de lrsquoInternet dans notre quotidien quasiment tout le

monde possegravede une adresse mail Ce systegraveme fut une veacuteritable reacutevolution dans la

maniegravere dont les Hommes communiquent entre eux augmentant de faccedilon

drastique la vitesse des eacutechanges et la productiviteacute des Entreprises

Apregraves 20 ans drsquoexistence les services de mail ont fleuri sur la toile

Doreacutenavant il est possible de creacuteer une boicircte demessagerie en quelques instants et

drsquoenvoyer des messages agrave lrsquoinfini

Quelques statistiques sur le mail en 2015 drsquoapregraves The Radicati Group

4 353 millions de comptes

2 586 millions drsquoutilisateurs

205 milliards de mails envoyeacutes par jour

Le problegraveme crsquoest qursquoaujourdrsquohui toutes les grosses entreprise du domaine

des technologies de linformation rognent de plus en plus sur la vie priveacutee de leurs

utilisateurs Le contenu de nos conversations nrsquoest parfois plus notre proprieacuteteacute

Lrsquoobjectif de notre projet est de donner la possibiliteacute agrave nrsquoimporte qui de

deacuteployer son propre service de mail seacutecuriseacute heacutebergeacute sur sa propre machine

Objectifs

Ce projet doit permettre agrave tout utilisateur de creacuteer quelques comptes de

messagerie sur un systegraveme embarqueacute de type Raspberry et permettre de conserver

les donneacutees agrave la maison

Le systegraveme doit ecirctre constitueacute agrave base de standards (Base LDAP serveur de

messagerie connu et maintenu pareillement pour le client de messagerie)

Linterface dadministration doit ecirctre elle aussi tregraves simple dutilisation

En outre le systegraveme devra ecirctre capable de distinguer des niveaux de

privilegraveges entre les utilisateurs geacuterer des groupes drsquoutilisateurs les quotas et devra

rester le moins eacutenergivore et le plus leacuteger possible Nous devons de plus rendre le

code le plus geacuteneacuterique possible afin de lrsquoempaqueter et le deacuteployer sur un systegraveme

quelconque sans soucis

Enfin un effort particulier doit ecirctre porteacute sur lalimentation du systegraveme

embarqueacute Il est notamment demandeacute de mettre au point une alimentation agrave base

deacutenergie renouvelable (comme un panneau solaire) permettant dalimenter

totalement ou partiellement le systegraveme

Fig 1 Une Raspberry Pi

Cahier des Charges

Mateacuteriel et logiciels utiliseacutes

Pour ce projet nous avons utiliseacute jusqursquoici le mateacuteriel suivant

1 Raspberry Pi 2

1 Carte micro SD 8 Go

1 Cacircble USBmicro USB

1 Cacircble RJ45

En outre nous avons installeacute les logiciels suivants

Une distribution Debian Jessie pour Raspberry

Un serveur web Lighttpd

Un serveur mail Postfix

Un serveur DNS Bind

Un serveur drsquoannuaire OpenLDAP

Le module PHP5 pour Lighttpd

Nous avons deacuteveloppeacute nos diffeacuterents codes en Shell ou Perl directement sous

Debian et le code pour la partie web est eacutecrit en PHP sous lrsquoIDE NetBeans

Dans le deacutetail

Dans le deacutetail lideacutee est de deacutevelopper un systegraveme autonome et fonctionnel

Autrement dit les diffeacuterents packages et fonctionnaliteacutes installeacutees sur la Raspberry

ainsi que linterface utilisateur sur le site web et lrsquoaspect eacutenergeacutetique

Voici les diffeacuterentes fonctionnaliteacutes que nous avons impleacutementeacutees

Serveur Mail

Postfix pour le protocole SMTP

Systegraveme leacuteger pas de protocoles IMAPPOP en plus tout en web

Gestion particuliegravere des gros mails et notamment de leurs piegraveces jointes

Deacutecodage et encodage base 64 des piegraveces jointes

Support de la reacuteception de piegraveces jointes multiples

Gestion des utilisateurs

Plusieurs comptes en utilisant LDAP

La possibiliteacute de sidentifier en tant quadministrateur

Listes de diffusion et groupes

Antivirus amp gestion des spams

iptables scripts shellperl de deacutetection par les logs drsquoattaques puis

mise en place de regravegles iptables via ces mecircmes scripts

Antispam maison synchronisation sur les blacklists existantes et

fiables rejet drsquoun spam

Nom de domaine et enregistrements associeacutes

Enregistrement A deacutefinit lrsquoadresse de nom drsquoun serveur web

Enregistrement MX deacutefinit lrsquoadresse de nom drsquoun serveur mail

Sauvegarde automatique peacuteriodique de la Raspberry Pi

Interface web

Gestion des comptes (creacuteation modification suppression)

Gestion des listes de diffusions

Gestion des quotas

Affichage du courrier

Paquets deb installable sur tout systegraveme Debian

Incluant un document explicatif pour lrsquoinstallation et la configuration

particuliegravere agrave apporter

Systegraveme pouvant ecirctre autonome en eacutenergie

Au coeur du projet

Gestion des utilisateurs - Le serveur LDAP

Comme il lrsquoeacutetait suggeacutereacute dans lrsquoeacutenonceacute du sujet nous nous sommes

inteacuteresseacutes agrave la solution LDAP Il srsquoagit drsquoun protocole de gestion drsquoannuaire baseacute sur

TCPIP Dans un premier temps nous avons penseacute agrave creacuteer un systegraveme de base de

donneacutees utilisant un simple systegraveme de fichiers car nous avions trouveacute ce systegraveme

trop compliqueacute agrave configurer agrave utiliser et trop lourd bien que plus leacuteger qursquoune Base

de Donneacutees classique

Cependant LDAP srsquoavegravere ecirctre un systegraveme parfaitement adapteacute pour la

gestion drsquoinformations utilisateurs En effet cette tacircche requiert beaucoup plus de

lectures que drsquoeacutecritures ce pourquoi LDAP est optimiseacute Ce programme preacutesente

lrsquoavantage de privileacutegier la lecture et disposes de nombreuses API dans les

langages de programmation divers dont PHP que nous utilisons crsquoest pourquoi

nous avons deacutecideacute de lrsquoutiliser

Le modegravele drsquoinformation de LDAP est baseacute sur des entreacutees Chacune drsquoentre

elles est un ensemble drsquoattributs Les informations sont organiseacutees sous la forme

drsquoun arbre Pour notre projet nous avons retenu la structure suivante

Fig 2 Structure de lrsquoannuaire LDAP

Nous avons ici deacutetermineacute des champs agrave renseigner pour constituer un

utilisateur En particulier un utilisateur dispose des attributs suivants

Son identiteacute (nom preacutenom(s))

Son identifiant utilisateur (UID) sous la forme comme agrave Polytech

initiale+nom(+chiffre) Son adresse mail compegravete sous la forme UIDdomainetld

Le chemin de sa boicircte mail sur le systegraveme domaineUID

Son quota (en octets)

Son mot de passe encrypteacute en SSHA

Fig 3 Une personne dans lrsquoannuaire LDAP

Les utilisateurs sont enregistreacutes dans la branche ldquopeoplerdquo de notre annuaire

Nous avons de plus une seconde branche ldquogroupsrdquo Celle-ci contient les listes de

diffusion Elle contient aussi le groupe particulier admins utilisateurs qui ont droit agrave

des options drsquoadministration sur le webmail

Fig 4 Un groupe dans lrsquoannuaire LDAP

On peut remarquer que pour la gestion des listes de diffusion nous avons

choisi de relier une personne agrave un groupe par son UID Ainsi lrsquoappartenance drsquoun

utilisateur agrave un groupe se traduit par la preacutesence de son adressemail dans lrsquoattribut

maildrop du groupe

Cela nous permet de geacuterer de maniegravere pratique les groupes auquels

appartient un utilisateur et inversement de sortir la liste des utilisateurs drsquoun groupe

avec une simple commande de typeldapsearch sur le serveur LDAP Pour ajouter ou

supprimer un utilisateur agrave un groupe il suffira de modifier lrsquoattribut maildrop du

groupe

Serveurs SMTP et DNS

Pour cette partie nous avons utiliseacute lrsquoexcellent Postfix Crsquoest une solution de

messagerie eacutelectronique libre rapide leacutegegravere seacutecuriseacutee et facile agrave administrer Crsquoest

aussi le serveur mail par deacutefaut dans plusieurs systegravemes de type UNIX Il permet

notamment drsquoeacuteviter une bonne partie du spam avec une configuration simple et

accessible

Il est important aussi de respecter les speacutecifications de la RFC Nous avons eu

la surprise de voir qursquoil est ldquoimpeacuteratifrdquo drsquoavoir deux adresses particuliegraveres sur le

serveur postmaster et abuse Ce sont les premiegraveres victimes des attaques par force

brute

La configuration de Postfix se fait de maniegravere eacutetroite avec Bind le serveur de

nom de domaine que nous avons installeacute En effet pour que Postfix fonctionne il est

essentiel que lrsquoenregistrement MX du serveur DNS fonctionne Crsquoest un type

drsquoenregistrement particulier qui permet la mise en place drsquoun serveur mail

De plus il est neacutecessaire de faire un enregistrement PTR qui correspond agrave au

DNS inverse Il nrsquoest pas indispensable au fonctionnement du serveur mail en soit

mais la plupart des fournisseurs de ce type de service se servent de cet

enregistrement pour contrer une partie du spam Il est donc possible que les mails

drsquoun serveur soient bloqueacutes si lrsquoenregistrement PTR est mal configureacute

Parallegravelement nous avons aussi proceacutedeacute agrave lrsquoenregistrement A qui permet la

mise en place drsquoun serveurWeb neacutecessaire agrave notreWebmail Nous avons utiliseacute des

outils en ligne tel que DNSStuff pour tester notre configuration dont un exemple se

trouve en annexe Notons par contre que la technologie DNSSEC nrsquoest pas mise en

place sur les domaines pw par Gandinet notre fournisseur Nous nrsquoavons donc pas

pu lrsquoimpleacutementer

Nous avons configureacute Postfix pour qursquoil utilise notre annuaire LDAP Il est

possible agrave ce stade de tester la configuration avec telnet et drsquoenvoyer unmail Apregraves

cela nous avons testeacute le bon fonctionnement du serveur en envoyant avec succegraves

un mail vers une boicircte mail exteacuterieure de type gmail

Nous nous sommes alors heurteacutes aux protections du Service Informatique de

lrsquoUniversiteacute (CRI) qui bloque le port 25 en sortie et en entreacutee en dehors de lrsquouniversiteacute

Pour nous astreindre de ces restrictions nous avons migreacute notre serveur vers une

nouvelle connexion SDSL exteacuterieure au reacuteseau de Lille 1 Cela a eacuteteacute pour nous un

moyen de veacuterifier en partie la portabiliteacute de notre systegraveme puisque nous utilisons une

toute nouvelle connexion avec une nouvelle adresse IP Nous avons donc ducircmettre

agrave jour notre serveur de nom pour refleacuteter ces changements La migration srsquoest

passeacutee sans soucis avec un deacutelai de propagation des changements drsquoenviron 1

heure Le systegraveme est resteacute fonctionnel agrave 100 notamment parce que dans notre

code nous faisons appel au serveur par localhost ou une variable et jamais

directement lrsquoadresse IP ou le domaine Cependant nous nrsquoavons pas pu veacuterifier la

migration vers un domaine diffeacuterent bien que cela ne reste normalement qursquoune

variable dans les fichiers de configuration de lrsquointerface

Gestion du Spam

Comme preacutevu nous avons apporteacute une solution agrave la gestion du spam sur

notre serveur Postfix propose dans ses paramegravetres lrsquoutilisation de services de

DNSBL (DNS Black List) Cette technologie reprend le mecircme principe que les

serveurs de noms classiques Postfix soumet une requecircte de type DNS aux serveurs

de liste noire deacutefinis dans sa configuration et le serveur indique si ce nom de

domaine est preacutesent dans sa liste ou non On peut de cette maniegravere rejeter une

bonne partie du trafic mail correspondant au Spam et ce tregraves facilement

Malgreacute cela nous pensons qursquoune partie du Spam passera agrave travers les

mailles du filet Il aurait eacuteteacute inteacuteressant de traiter ceux-ci pour les classer comme

indeacutesirables et pouvoir ainsi les afficher dans lrsquointerface web

Serveur Web et Webmail

Un serveur web leacuteger

Initialement nous sommes partis sur une solution classique agrave base drsquoun

serveur web Apache qui nous a permis de deacutebuter le deacuteveloppement de lrsquointerface

Cependant comme nous cherchons agrave alleacuteger un maximum le systegraveme nous nous

sommes pencheacutes sur une autre solution Lighttpd Ce serveur web vise comme son

nom lrsquoindique la performance et la leacutegegravereteacute Sur le mecircme contenu avec une

connexion Tregraves Haut Deacutebit (100Mbps) nous chargeons deacutesormais la page de vue

geacuteneacuterale en 042s (Lighttpd) contre 170s avant (Apache 2) avec le navigateur

Chrome sans cache

Une architecture optimiseacutee

Lrsquoutiliteacute de reacutealiser notre propre webmail est dans un premier temps de

srsquoabstenir de lrsquoinstallation drsquoun serveur IMAPPOP puisque nous retrouvons

nous-mecircmes le contenu Dans un second temps il nous permet de ne garder que les

fonctionnaliteacutes neacutecessaires agrave notre webmail sans superflu

Fig 5 La vue geacuteneacuterale de notre webmail

Gracircce agrave PHP et agrave son module drsquointerface avec LDAP nous pouvons identifier

un utilisateur avec son nom drsquoutilisateur et son mot de passe sur le serveur local

LDAP et ainsi retrouver nombreuses informations utiles comme le quota actuel

autoriseacute son nom entier le chemin drsquoaccegraves agrave son reacutepertoire dans lesquels sont ses

mails sur le systegraveme de fichiershellip

Fig 6 Lrsquoarchitecture du dossier drsquoun utilisateur des dossier sent et inbox contenant les

mails bruts un dossier json dans lequel sont placeacutes les entecirctes des mails ainsi que le quota

Chaque en-tecircte de mail est eacutecrite dans un fichier json distinct par boicircte (un

fichier pour la boicircte de reacuteception un fichier pour les mails envoyeacuteshellip) ce qui nous

permet de montrer agrave lutilisateur la liste des mails dune boicircte sans traitement lourds

en arriegravere plan pour le serveur Ces fichiers sont renseigneacutes par un script lanceacute agrave la

reacuteception drsquoun mail par postfix du cocircteacute reacuteception et par lrsquointerface web elle mecircme

pour lrsquoeacutemission Lrsquoen-tecircte drsquoun mail est eacutecrite dans un conteneur JSONde lamaniegravere

suivante

Fig 7 Exemple drsquoentreacutee dans un fichier json

Gracircce tout cela nous pouvons afficher simplement le contenu des diffeacuterentes

boicirctes mail dans des tableaux sur lrsquointerface gracircce aux en-tecirctes et par la suite

retrouver et afficher le contenu drsquoun mail agrave partir de son fichier brut sur lequel

lrsquoutilisateur aura cliqueacute comme on le verra un peu plus loin

Toujours dans un souci drsquoameacutelioration des performances le strict neacutecessaire

est geacuteneacuteralement chargeacute sur les pages web par exemple en venant de la vue

geacuteneacuterale lorsqursquoon clique surInboxseule la partie inteacuterieure de la page est chargeacutee

on ne recharge pas le bandeau du haut de page ou lemenu de gauche agrave lamaniegravere

drsquoun MVC classique

Envoyer des courriels

Toute cette architecture ne doit pas nous faire oublier le but premier envoyer

et recevoir des mails Pour envoyer des mails crsquoest tregraves simple on peut soit cliquer

dans le bandeau du haut sur ldquoQuick Emailrdquo qui permet sur lamecircme page drsquoenvoyer

un email rapide et sans piegravece-jointe soit cliquer dans la barre de navigation sur le

cocircteacute sur ldquoWrite a new emailrdquo ce qui nous megravene vers une page deacutedieacutee permettant

drsquoeacutecrire un email incluant une piegravece jointe

Fig 8 Envoyer un mail crsquoest simple comme bonjour

On peut remarquer sur cette capture drsquoeacutecran que lrsquoon ne peut envoyer que

certains types de piegraveces jointes Nous supportons JPG PNG GIF PDF et ZIP Si la

piegravece jointe est drsquoun autre format elle est rejeteacutee La veacuterification du type srsquoeffectue

sur lrsquoextension du fichier et sur son type MIME ce qui eacutevite par exemple que

quelqursquoun modifie lrsquoextension drsquoun fichierexe en fichierjpg pour lrsquoenvoyer La piegravece

jointe doit de plus avoir une taille infeacuterieure agrave la taille maximale drsquoune piegravece jointe

parameacutetreacutee par lrsquoadministrateur comme nous le verrons dans lrsquointerface

drsquoadministration

Si tous ces critegraveres sont bons on eacutecrit lemail au format brut deacutecrit par la RFC

puis on lrsquoexpeacutedie agrave lrsquoaide de la fonction mail de PHP Si cette fonction nrsquoeacutechoue pas

crsquoest que le mail est expeacutedieacute avec succegraves on peut alors mettre agrave jour le quota

drsquoespace disque maximum autoriseacute agrave lrsquoutilisateur en increacutementant celui-ci avec la

taille du mail qui vient drsquoecirctre envoyeacute ainsi que creacuteer un fichiermail brut sur le disque

pour pouvoir afficher le mail dans la boicircte drsquoenvoi et en garder une trace

Notons que comme crsquoest lrsquoutilisateur web du systegraveme (www-data) qui exeacutecute

la fonction nous modifions les en-tecirctes du mail afin que le destinataire reccediloive un

mail de la part de ldquoPreacutenom Nomrdquo depuis lrsquoadresse ldquopnomdomainetldrdquo plutocirct que

ldquowww-datadomaintldrdquo par deacutefaut

La migration vers une IP externe agrave Lille 1 eacutetant reacuteussie nous pouvons bien

envoyer des mails depuis notre interface qui sont reccedilus agrave lrsquoexteacuterieur sans soucis

Mais aussi en recevoir

Recevoir des mails est tout aussi important Nous avons vu lrsquoarchitecture en

arriegravere-plan mais au final agrave quoi cela ressemble-t-il pour lrsquoutilisateur Il dispose en

fait en cliquant sur Inbox (ou Sent Spam ou Trash eacutegalement) drsquoun accegraves agrave sa boicircte

de reacuteception Drsquoun clic srsquoaffichent alors agrave lui tous les mails qursquoil a reccedilu

Fig 9 La boicircte de reacuteception

On remarque notamment les fonctions de recherche drsquoactualisation du

tableau de choix des colonnes agrave afficher on peut classiquement choisir combien de

lignes on affiche par page changer de pages etchellip

Lorsque lrsquoon clique sur un des lignes les donneacutees de lrsquoen-tecircte du mails sont

passeacutes en paramegravetres agrave une autre page qui drsquoapregraves ces informations retrouve le

fichier mail brut le traite et lrsquoaffiche

Fig 10 Un mail contenant 3 piegraveces jointes et un message

Comme on peut le voir nous pouvons recevoir desmails avec plusieurs piegraveces

jointes Nous avons ici preacutesenteacute la boicircte de reacuteception mais les autres boicirctes

fonctionnent de maniegravere similaire

Interface drsquoadministration

Le systegraveme de webmail possegravede plusieurs variables des listes de diffusion

des compteshellipMais on veut pouvoir donner les droits agrave un utilisateur demodifier tout

cela En effet si nous trouvons cela abordable drsquoajouter un utilisateur avec une

commande dans le shell il faut aussi penser agrave lrsquoutilisateur final qui preacutefegravere peut-ecirctre

le confort drsquoune interface deacutedieacutee pour geacuterer son serveur mail plutocirct que le terminal

De maniegravere tregraves simple un utilisateur appartenant au groupes drsquoutilisateurs

ldquoAdministrateursrdquo est reconnu en tant qursquoadministrateur par lrsquointerface et peut

cliquer sur un bouton ldquoManagerdquo dans le panneau lateacuteral qui nrsquoest visible qursquoaux

administrateurs De lagrave il arrive sur la page suivante

Fig 11 lrsquointerface drsquoadministration

Sur cette interface il peut choisir la taille maximale des piegraveces jointes

changer le nom de domaine sur lequel est installeacute lrsquointerface et dont deacutependent

toutes les adresses (domaine) Il est aussi possible de modifier directement ces

variables en modifiant le fichier includeconfigincphp Pratique notamment si lrsquoon

a renseigneacute un mauvais nom de domaine agrave la configuration et que lrsquoon arrive plus agrave

acceacuteder agrave lrsquointerface

Il peut aussi creacuteer un nouveau compte en renseignant les champs preacutenom

nom mot de passe et quota Lrsquoutilisateur peut ensuite une fois son compte creacutee

directement se connecter avec son identifiant (initiale preacutenom + nom) et mot de

passe Lors de la creacuteation du compte un mail de bienvenue est envoyeacute au nouvel

utilisateur ce qui permet en arriegravere-plan de creacuteer tous les dossiers utilisateurs et

fichiers en-tecirctes utiles agrave lrsquointerface une fois pour toutes

Lrsquoadministrateur peut aussi ajouter une liste de diffusion (assimileacutee agrave un

groupe) ou en supprimer une parmi les listes existantes

En outre lrsquoadministrateur peut aussi modifier les donneacutees drsquoun utilisateur

Pour cela sur la preacutesente page il peut seacutelectionner un utilisateur parmi la liste des

utilisateurs existants ce qui le redirige vers la page de gestion des comptes

Fig 12 La gestion drsquoun compte seacutelectionneacute ici celui de James Bond

A ce stade il peut changer lrsquoUID de lrsquoutilisateur (utile en cas de conflit) le nom

le mot de passe le quota de cet utilisateur et lrsquoajouter ou le retirer drsquoune liste de

diffusion Accessoirement il peut aussi supprimer le compte en cliquant sur lrsquoeacutenorme

bouton rouge qui lui demandera deux fois de suite de confirmer son action afin

drsquoeacuteviter les erreurs de clic Cette action entraicircne la suppression de lrsquoutilisateur de

toutes les listes de diffusion auxquelles il appartient la suppression de son compte

dans la branche people de lrsquoarbre LDAP et la suppression deacutefinitive de son dossier

utilisateur sur le disquesystegraveme de fichiers impliquant donc la perte de ses mails

Architecture du systegraveme de fichiers

Comme nous lrsquoavons dit plus haut lrsquoideacutee est de se passer des meacutecanismes

classiques avec les clients mails habituels Ces serveurs srsquoalourdissent

geacuteneacuteralement en utilisant des serveurs IMAPPOP3 et un meacutecanisme

drsquoauthentification SMTP

Pour adapter ces fonctionnaliteacutes agrave notre systegraveme nous avons donc constitueacute

une architecture pour organiser les fichiers qui transitent Vous pourrez voir un

scheacutema reacutecapitulatif en annexe 1

Dans la premiegravere moitieacute du projet les mails eacutetaient deacutelivreacutes par Postfix Nous

utilisions un script exeacutecuteacute lors de la reacuteception drsquounmail pour les traiter de lamaniegravere

que nous voulions Cette meacutethode avait les inconveacutenients drsquoecirctre lourde et pas

efficace agrave 100 En effet seuls les mails reccedilus depuis lrsquoexteacuterieur eacutetaient

correctement traiteacutes

Deacutesormais les mails sont traiteacutes totalement par notre script Cela nous

permet de geacuterer les mails dans des dossiers organiseacutes agrave notre maniegravere et de

recevoir les mails locaux crsquoest-agrave-dire entre utilisateurs du mecircme domaine Cette

nouvelle meacutethode regravegle aussi drsquoautres problegravemes notamment au niveau des

permissions sur les fichiers

Pour reacuteduire le nombre drsquoopeacuterations et pour profiter des fonctionnaliteacutes

offertes par le framework utiliseacute pour lrsquointerface web nous regroupons des

informations sur chacun des mails reccedilus sous la forme de fichiers JSON Pour ce

faire lrsquoideacutee est drsquoexeacutecuter un script lorsque leacutevegravenement ldquoreacuteception drsquoun mailrdquo

survient Postfix offre cette possibiliteacute dans sa configuration Or il se trouve qursquoil nrsquoest

pas si simple de reacutecupeacuterer le chemin du fichier contenant le mail car le nom du

fichier creacutee est sous la forme Timestamp UNIX10 Caractegraveres aleacuteatoires (ex

14562336185A8D43E97F)

La seconde probleacutematique est que le webmail doit avoir la possibiliteacute de

pouvoir lire les fichiers pour afficher les mails sur son interface Or il semble que

Postfix les eacutecrit en autorisant uniquement son utilisateur en lecture Il nous a fallu

trouver une solution pour remeacutedier agrave cela Nous avons choisi drsquoajouter www-data

(utilisateur du serveur web) au groupe vmail et de modifier les droits sur les fichiers

de sorte que les utilisateurs de ce groupe puissent lire les fichiers

Nous avons revu une partie de lrsquoorganisation des fichiers pour reacutecupeacuterer les

piegraveces jointes si elles sont preacutesentes Le script que nous avons eacutecrit reacutecupegravere le

fichier original du mail et le deacutecoupe en eacuteleacutements simples dans des fichier distincts

corps du mail et diffeacuterentes piegraveces jointes De cette maniegravere pour afficher un mail

nous nrsquoavons pas besoin de charger la totaliteacute du fichier Dans le cas ougrave il y a des

piegraveces jointes cela aurait ralenti lrsquoaffichage des informations

Nous avons eacutegalement impleacutementeacute la gestion des quotas Dans lrsquoeacutetat actuel

des choses srsquoil nrsquoy a plus de place disponible pour lrsquoutilisateur le mail nrsquoest tout

bonnement pas deacutelivreacute agrave ce destinataire Lrsquoideacuteal aurait eacuteteacute de notifier leacutemetteur avec

un mail ce qui nrsquoest pour lrsquoinstant pas le cas mais qui pourrait ecirctre reacutesolu en

renvoyant agrave postfix un code drsquoerreur deacutefini

Pour terminer nous avons revu la totaliteacute du code deacuteveloppeacute Nous sommes

passeacute du Bash au Perl Ce dernier est plus performant et plus simple agrave utiliser et agrave

lire

Firewall

Un autre gros morceau du projet mais qui nrsquoest pas speacutecifiquement lieacute agrave la

probleacutematique du mail crsquoest la seacutecurisation du serveur En effet apregraves avoir mis en

ligne notre serveur des pirates ont tregraves vite tenteacute de peacuteneacutetrer le systegraveme

Globalement les attaques eacutetaient de type force brute sur les services heacutebergeacutes sur

notre Raspberry neacutecessitant une identification tels que SSH SMTP hellip

On retrouve ici un petit point faible du protocole SMTP Eacutetant donneacute que

chaque serveur mail doit avoir une adresse postmaster et abuse lrsquoattaquant a agrave sa

disposition deux adresses agrave attaquer Ceci dit ce type drsquoattaque est simple agrave

contrecarrer car il suffit de limiter dans le temps le nombre de tentatives de

connexions

La contre-mesure que nous avons mis en place est simple une seacuterie de

regravegles Iptables En reacutesumeacute nous avons opteacute pour un systegraveme de liste blanche et

noire Les adresses IPs de la liste blanche sont autoriseacutees agrave utiliser la totaliteacute des

services (notamment SSH) tandis que celles de la liste noire sont totalement

ignoreacutees Les autres IPs nrsquoont accegraves qursquoau webmail

Eacutetant donneacute que le nombre drsquoIPs attaquant notre serveur nrsquoa cesseacute

drsquoaugmenter nous avons automatiseacute la mise agrave jour de la liste de noire en

deacuteveloppant un script pour Cron Ce script est exeacutecuteacute une fois par heure A ce jour

notre liste noire contient 47 adresses Bien sucircr ce systegraveme est susceptible drsquoecirctre

modifieacute agrave convenance pour passer sur une solution deacutedieacutee telle que Fail2ban qui fait

en fait ce qursquoon fait deacutejagrave (eacutetudier les logs et bannir des IP avec iptables) avec des

regravegles preacutedeacutefinies par la communauteacute et personnalisables En effet nous nous

attendons agrave voir la varieacuteteacute et le nombre drsquoattaques augmenter apregraves avoir migreacute sur

une IP non proteacutegeacutee par le firewall de lrsquoUniversiteacute puisque nous nrsquoavons plus la

premiegravere ligne de deacutefense du CRI en particulier pour le port 389 (LDAP) qui eacutetait

bloqueacute par lrsquouniversiteacute et srsquoest retrouveacute en premiegravere ligne apregraves la migration Nous

avons donc ajouteacute une regravegle bloquant tout le trafic entrant vers le port 389 hormis

localhost

Package drsquoinstallation

Nous avons creacutee un package deb contenant les sources du webmail ainsi

que des scripts utiles agrave lrsquoinstallation et au fonctionnement du serveur Nous avons

deacuteveloppeacute des scripts de configuration automatique pour LDAP et Postfix Comme

dpkg ne supporte pas directement lrsquoinstallation automatique des deacutependances

nous recommandons drsquoinstaller avant tout le paquet gdebi-core qui est en fait un

dpkg ameacutelioreacute Gracircce agrave la commande gdebi paquetdeb toutes les deacutependances

seront installeacutees en particulier postfix le serveur ldap le serveur web lighttpd entre

autres sans soucis Il est agrave noter que comme les scripts de configuration des

diffeacuterents services ne sont que partiellement impleacutementeacutes dans le paquet deb nous

fournissons en annexe un README complet et illustreacute qui explique pas agrave pas

comment faire fonctionner notre systegraveme sur nrsquoimporte quel Linux en particulier les

lignes de configuration des diffeacuterents services agrave changer et un exemplaire des

fichiers de configuration fonctionnels de ces services

Gestion de lrsquoeacutenergie

Une consideacuteration importante pour un systegraveme autonome Drsquoapregraves les fiches

techniques notre modegravele de Raspberry Pi (B 2) est officiellement eacutevalueacute avec un

fonctionnement agrave ~650mA pour 5V De nombreux proprieacutetaires de ce systegraveme

eacutequipeacutes se sont amuser agrave veacuterifier la consommation eacutelectrique reacuteelle de leur Pi 2 B

sous diffeacuterentes charges On pourra retenir cette eacutetude (lien en sitegraphie) qui

relegraveve la consommation en courant en fonction de lrsquoactiviteacute lanceacutee sur la Pi mais

aussi en charge sur 1 agrave 4 CPU

Ces chiffres sont releveacutes sur un systegraveme avec cameacutera connecteacutee HDMI connecteacute et

cacircble ethernet brancheacute et actif

On peut constater que globalement notre systegraveme Pi 2 B tournant sans

interface graphique sans composant suppleacutementaire sans sortie videacuteo ni cameacutera

avec plusieurs serveurs tournant tout en restant le plus leacuteger possible et demeurant

~99 idle la plupart du temps ne devrait pas deacutepasser une consommation de

300mA grand maximum

Fig 13 Un processeur tregraves tregraves peu chargeacute et une meacutemoire relativement libre

Nous avions lrsquoanneacutee derniegravere deacutejagrave reacutealiseacute un circuit permettant drsquoadapter un

panneau solaire sur une batterie USB classique de 9000mAh Nous avions alors pu

mesurer lrsquointensiteacute deacutelivreacutee par le panneau solaire En cas drsquoensoleillement moyen

habituel dans nos contreacutees le panneau solaire deacutebitait 400mA et pouvait atteindre

le double quand le soleil eacutetait directement preacutesent pour environ 800mA deacutebiteacute

Ce panneau solaire accompagneacute de son circuit drsquoadaptation devrait donc

suffire pour alimenter notre systegraveme la journeacutee le brancher ensuite sur une batterie

portable permet de stocker le surplus pour la nuit

Fig 14 le circuit drsquoadaptation

Fig 15 et son PCB

Eacutevolutions possibles

Webmail

Concernant les eacutevolutions possibles que nous aurions aimeacute apporter agrave notre

projet avec plus de temps commenccedilons par le web Nous aurions souhaiteacute apporter

la gestion de lrsquoenvoi de plusieurs piegraveces jointes comme nous lrsquoavons fait pour la

reacuteception

De plus nous aurions voulu inteacutegrer une corbeille ougrave lesmessages pourraient

aller avant drsquoecirctre deacutefinitivement supprimeacutes du systegraveme drsquoautant que nous avons

deacutejagrave eacutecrites les fonctions PHP permettant de retirer une en-tecircte drsquoun fichier JSON et

le fichier mail associeacute

Enfin nous aurions aimeacute en plus du blocage deacutejagrave preacutesent impleacutementer une

gestion plus profonde des piegravece jointes permettant notamment le remplissage de la

boicircte de spams

Systegraveme

Il aurait eacuteteacute inteacuteressant de notifier lrsquoexpeacutediteur lorsque le mail nrsquoa pas pu ecirctre

deacutelivreacute agrave un utilisateur lorsque son quota est plein En toute logique cela devrait ecirctre

fait simplement avec la commande Sendmail

Une meilleur gestion du trafic mail indeacutesirable aurait eacuteteacute la bienvenue En

effet malgreacute la limitation du spam il restera toujours une partie du volume de mail

qui sera indeacutesirable (pub pishing scam hellip)

Eacutetant donneacute la taille du systegraveme nous avions penseacute agrave une approche

ldquomachine learningrdquo Lrsquoutilisateur indiquerait pourquoi il considegravere le mail comme

indeacutesirable constituant des regravegles refusant certains mails Les mails provenant de

cet expeacutediteur pourraient ecirctre deacutetecteacute par le script agrave la reacuteception et

automatiquement envoyeacutes dans la boicircte de spams

Partie eacutenergeacutetique

Mecircme si la solution au panneau solaire ne pose aucun problegraveme en theacuteorie

nous aurions deacutejagrave dans un premier temps aimeacute lrsquoimpleacutementer en pratique Nous

nrsquoavons finalement pas reacutealiseacute notre objectif de deacutetecter deux cas drsquoalimentation

diffeacuterents soit lrsquoalimentation via panneau solaire est suffisante dans ce cas il

alimente la batterie et donc la Raspberry soit quand ce courant nrsquoest pas suffisant

on alimente la batterie par le secteur

Conclusion

En conclusion nous pensons avoir reacutepondu au cahier des charges initial dans

sa majeure partie Nous sommes aujourdrsquohui en mesure de proposer une solution

mail domestique priveacutee et personnalisable par un particulier

Notre installation de Debian a eacuteteacute au maximum alleacutegeacutee pour notre utilisation

sans interface graphique et nous avons mis en place une reacuteponse aux diverses

attaques que nous avons pu subir lors de lamise en place de notre solution logicielle

En outre le pare-feu avec notre systegraveme de liste noire bloque une partie des

attaques qui peuvent nous parvenir

Nos diffeacuterents scripts de pare-feu de gestion drsquoun mail entrant associeacute au

webmail permettent agrave un utilisateur drsquoacceacuteder aux fonctions usuelles associeacutees agrave

lrsquoenvoi et la reacuteception de mails

Gracircce agrave sa configuration personnalisable notre projet devrait pouvoir ecirctre

porteacute sur un domaine et une adresse IP diffeacuterente sans soucis et ecirctre deacuteployeacute

partout ougrave des gens souhaitent conserver leur vie priveacutee

Nous regretterons cependant de ne pas avoir exploiteacute la partie eacutenergeacutetique

de ce projet qui portait une probleacutematique inteacuteressante et qui nous parait importante

dans le monde actuel

Ce projet nous aura occupeacute pendant tregraves longtemps et nous sommes fiers du

travail que nous avons accompli Il est agrave nos yeux la preuve de ce que nous savons et

pouvons faire et nous donnera confiance pour notre deacutebut de carriegravere drsquoingeacutenieur

Sources

httpwwwradicaticomwpwp-contentuploads201401Email-Statistics-R

eport-2014-2018-Executive-Summarypdf

httpwwwcommentcamarchenetcontents525-le-protocole-ldap

httpsfrwikipediaorgwikiSimple_Mail_Transfer_Protocol

httpwwwcommentcamarchenetcontents536-pop3-smtp-imap-protocol

es-de-messagerie

httpstoolsietforghtmlrfc2821

httpsfrwikipediaorgwikiInternet_Message_Access_Protocol

httpstoolsietforghtmlrfc3501

httparstechnicacominformation-technology201402how-to-run-your-ow

n-e-mail-server-with-your-own-domain-part-1

httpswwwraspberrypiorgforumsviewtopicphpp=136912

httpstackoverflowcomquestions17394356how-can-i-make-a-bash-com

mand-run-periodically

httpuntroubledorgnullmailer

httpelinuxorgRPi_Hardware

httpraspitv2015raspberry-pi2-power-and-performance-measurement

Annexe 1 Architecture du systegraveme de fichiers

Annexe 2 Scan DNSSTUFF

Depuis httpwwwdnsstuffcomtoolsdnsReport|type=domainampampvalue=intimailpw

Annexe 3 Vue geacuteneacuterale httpswwwintimailpw

Annexe 4 Envoyer un mail

Annexe 5 Boite de reacuteception

Annexe 6 Interface drsquoadministration

Annexe 7 Gestion drsquoun utilisateur

Tutorial installation intimailtrade

Table des matiegraveres Apregraves une nouvelle installation de lrsquoOS 2

Seacutecurisation du serveur 2

Changement de lrsquoutilisateur par deacutefaut 2

Changement du port SSH 2

Interdire lrsquoauthentification SSH pour root 2

Installation de LDAP 3

Configuration de base 3

Configuration des Scheacutemas 4

Constitution de la base de donneacutees LDAP 5

Installation de Postfix 7

Installation de Bind9 8

Installation du paquet Debian et configuration de lighttpd 9

Deacutependances 11

Sources 12

2

Apregraves une nouvelle installation de lrsquoOS Exeacutecutez ces commandes pour mettre agrave jour agrave la derniegravere version Ces opeacuterations peuvent prendre un certain

temps Nous avons utiliseacute pour cet exemple Raspbian Jessie Lite sur une Raspberry Pi 2

apt-get update

apt-get upgrade ampamp apt-get dist-upgrade

apt-get install linux-headers-$(uname -r)

reboot

Puis lancer

raspi-config

Etendre au maximum lrsquoespace de stockage en navigant dans les menus

Expand Filesystem

Reacutegler une ip statique avec la box fichier etcnetworkinterfaces

iface eth0 inet static

address 192168131

netmask 2552552550

gateway 19216811

Nous avons aussi supprimeacute wpasupplicant

Seacutecurisation du serveur

Changement de lrsquoutilisateur par deacutefaut Changez le nom drsquoutilisateur par deacutefaut ainsi que son mot de passe

sudo passwd root

Sortie et login en tant que root puis

usermod -l myuname pi

usermod -m -d homemyuname myuname

groupmod ndashn myuname pi

passwd myuname

Voir cette adresse pour lrsquoutilisation de cleacutes priveacuteespubliques

Changement du port SSH sed ndashi sPort 22Port 2222g etcsshsshd_config

Interdire lrsquoauthentification SSH pour root sed -i sPermitRootLogin yesPermitRootLogin nog etcsshsshd_config

3

Installation de LDAP

Configuration de base Installation du package

apt-get install slapd

Choisir un mot de passe administrateur puis lancer la commande

dpkg-reconfigure slapd

Reacutepondre non agrave la question 1

Entrez le nom de domaine utiliseacute agrave la question 2 sous la forme domainetld

Entrez ce que vous voulez au 3egraveme eacutecran le nom de lrsquoorganisation ne sera pas utiliseacute

Entrez un mot de passe

Choisissez HDB

Choisissez si la base de donneacutees est supprimeacutee agrave la deacutesinstallation de slapd

Deacuteplacez lrsquoancienne base de donneacutees

Nrsquoutilisez pas LDAPv2

Installer les outils de conversion pour ldap (slaptest ldapmodify notamment)

apt-get install ldap-utils

On peut maintenant veacuterifier que la configuration est valable

ldapsearch -x -h localhost -b dc=domainedc=tld -LLL dc=domaine dn

Cette commande doit retourner quelque chose comme

dn dc=domainedc=tld

Il faut maintenant seacutecuriser le serveur LDAP en effet on peut y acceacuteder en anonyme avec la commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=config

(amp(objectClass=olcDatabaseConfig)(olcSuffix=dc=domainedc=tld))

Cette commande retourne un certain nombre drsquoinformations notamment agrave propos des champs suivants

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by none

olcAccess 1to dnbase= by read

olcAccess 2to by read

On va modifier ces champs avec la commande ldapmodify Pour cela on va creacuteer un fichier ldif

cat gt changeAccessldif ltlt EOF

dn olcDatabase=1hdbcn=config

changetype modify

delete olcAccess

-

add olcAccess

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by dn=cn=admindc=domainedc=tld write by none

-

add olcAccess

olcAccess 1to dnbase= by read

-

4

add olcAccess

olcAccess 2to by self write by dn=cn=admindc=domainedc=tld write by

none

-

EOF

On peut maintenant appliquer les changements avec ldapmodify

ldapmodify ndashc ndashY EXTERNAL ndashH ldapi -f changeAccessldif

La commande devrait vous confirmer que la modification srsquoest bien effectueacutee

SASLEXTERNAL authentication started

SASL username gidNumber=0+uidNumber=0cn=peercredcn=externalcn=auth

SASL SSF 0

modifying entry olcDatabase=1hdbcn=config

On peut veacuterifier qursquoon ne peut plus acceacuteder aux informations avec la commande

ldapsearch -x -c -h localhost -b dc=domainedc=tld

On peut veacuterifier la configuration en se connectant en tant qursquoadministrateur

ldapsearch -c -h localhost -b dc=domainedc=tld -D

cn=admindc=domainedc=tld ndashW

Configuration des Scheacutemas Nous allons utiliser les scheacutemas de courier-ldap Pour eacuteviter une manipulation compliqueacutee vous trouverez

directement le scheacutema avec le fichier authldapschema On place ce fichier dans le dossier

mv authldapschema etcldapschema

Nous creacuteons un fichier qui incluera tous les scheacutemas de base en plus du nouveau On peut les afficher avec la

commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

Creacuteation du fichier de configuration pour notre exemple cela donne

mkdir tmpldapconf

cat gt tmpldapconfldapconf ltlt EOF

include etcldapschemacoreschema

include etcldapschemacosineschema

include etcldapschemanisschema

include etcldapschemainetorgpersonschema

include etcldapschemaauthldapschema

EOF

On lance ensuite la commande

slaptest -f tmpldapconfldapconf -F tmpldapconf

Elle revoie un message de succegraves Cette commande a creacuteeacute dans le reacutepertoire tmpldapconf une arborescence

correspondant agrave la configuration de notre LDAP

On modifie le chemin de configuration

5

sed ndashi 0dnauthldap sauthldapauthldapcn=schemacn=config

cn=authldapldif

On supprime ensuite les 7 derniegraveres lignes du fichier

head -n -7 cn=authldapldif gt tmpldif

mv tmpldif cn=authldapldif

On peut maintenant importer notre fichier de configuration Pour ce faire

ldapadd -Y EXTERNAL -H ldapi -f

tmpldapconfcn=configcn=schemacn=authldapldif

Si tout va bien lrsquoentreacutee devrait avoir eacuteteacute ajouteacutee On peut veacuterifier avec la commande vue tout agrave lrsquoheure

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

On devrait voir en plus le nouveau scheacutema authldap

Constitution de la base de donneacutees LDAP Le remplissage de la base se fait agrave lrsquoaide de fichiers ldif Nous donnons ici un exemple de structure

Fichier pour la structure de base

dn dc=maildc=domainedc=tld

o intimailpw

description Global mail tree

dc mail

objectClass top

objectClass dcObject

objectClass organization

dn dc=peopledc=maildc=domainedc=tld

description Informations of all users

o people

dc people

objectClass top

objectClass dcObject

objectClass organization

dn dc=groupsdc=maildc=domainedc=tld

description All groups of users

o groups

dc groups

objectClass top

objectClass dcObject

objectClass organization

6

Fichier pour ajouter un utilisateur

dn cn=jbonddc=peopledc=maildc=domainedc=tld

uid jbond

mail jbonddomainetld

sn Moulin

givenName James

displayName James Bond

mailbox domainetldjbond

quota 50M

homeDirectory homevmail

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAccount

userPassword SSHA367PSXiUAegy8dpJbPU8OepEf8L5ye

Pour obtenir un hash du mot de passe

slappasswd -s password -h SSHA

On peut par la suite ajouter la configuration agrave la base de donneacutees avec la commande

ldapadd -D cn=admindc=domainedc=tld -W -h localhost -f pathtofile

Si les champs proposeacutes ne sont pas suffisants il faudra alors effectuer les modifications dans le fichier autldapschema

proposeacute plus haut et refaire la manipulation de configuration

De plus les standards du Mail deacutecrit par lrsquoIETF (RFC822 63 RFC1123 527 and RFC2821 451) impliquent drsquoavoir une

adresse Postmaster et une Abuse Pour cela nous pourrions creacuteer ces adresses avec la meacutethode vue au-dessus mais

ce nrsquoest pas la meilleure Il est preacutefeacuterable drsquoutiliser un alias comme nous le ferons avec les listes de diffusion Ici nous

proposons de rediriger ces deux adresses vers une adresse administrateur Pour cela la meacutethode est la mecircme sauf

que le fichier ldif nrsquoest pas tout agrave fait identique En voici un exemple

dn cn=postmasterdc=groupsdc=maildc=domainedc=tld

uid postmaster

mail postmasterdomainetld

sn Postmaster

displayName Postmaster

maildrop admindomainetld

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAlias

Pour faire une liste de diffusion la meacutethode est la mecircme Il suffit drsquoajouter toutes les adresses destinataires dans le

champ maildrop seacutepareacutees par des virgules ()

7

Installation de Postfix Installation des packages

apt-get install postfix postfix-ldap

Lors de lrsquoinstallation deux eacutecrans deacutefilent

- Configuration Internet Site

- Valeur par deacutefaut pour le mail name

On creacutee lrsquoutilisateur qui servira agrave exeacutecuter Postfix

groupadd vmail

useradd -g vmail -d homevmail -s binfalse -m vmail

Nous aurons besoin dans la suite des GID et UID creacuteeacutes agrave cet instant Ils peuvent ecirctre afficheacutes avec les commandes

cat etcgroup | grep vmail | cut -d -f3

cat etcpasswd | grep vmail | cut -d -f3

On ajoute les paramegravetres au fichier etcpostfixmaincf (remplacer les valeurs de GID et drsquoUID avec vos valeurs)

smtpd_banner = maildomainetld

virtual_mailbox_base = homevmail

virtual_mailbox_domains = dmainetld

virtual_mailbox_maps = ldapetcpostfixldap_accountscf

virtual_alias_maps = ldapetcpostfixldap_aliasescf

virtual_minimum_uid = 100

virtual_gid_maps = static1001 Remplacez ici par votre valeur de GID

virtual_uid_maps = static1001 Remplacez ici par votre valeur drsquoUID

Il nous faut maintenant constituer nos fichiers de configuration ldap_accountscf

cat gt etcpostfixldap_accountscf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=peopledc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAccount)(mail=s))

result_attribute = mailbox

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

Et pour ldap_aliasescf

cat gt ldap_aliasescf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=groupsdc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAlias)(mail=s))

result_attribute = maildrop

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

8

On peut maintenant veacuterifier la configuration de Postfix avec (cette commande ne doit rien retourner si crsquoest bon)

postfix check

Si crsquoest bon alors on recharge le serveur

postfix reload

On peut alors faire un envoi de mail test via telnet

telnet localhost 25

Si vous souhaitez deacutelivrer les mails agrave votre maniegravere il faut dans le fichier etcpostfixmaincf la ligne

virtual_transport = nomdevotreregle

Et de mecircme dans le fichier etcpostfixmastercf

nomdevotreregle unix - n n - 5 pipe

flags=Rq user=vmail null_sender=

argv=chemindevotreprogramme

Il nous reste maintenant agrave configurer les diffeacuterents enregistrements DNS neacutecessaire au fonctionnement drsquoun serveur

mail Vous pouvez utiliser la solution de votre choix Dans la suite vous trouverez une meacutethode utilisant Bind9

Installation de Bind9 Dans toute cette partie on se situera dans le dossier etcbind Dans la suite notre IP sera abcd

Dans le fichier namedconfoptions on ajoutera dans le champ options

version Not supported

Dans un dossier zones on eacutecrit le fichier dbdomainetld

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122111 Serial

43200 Refresh

3600 Retry

2419200 Expire

86400 ) Negative Cache TTL

IN NS nsdomainetld

IN NS ns11ovhnet

ns IN A abcd

www IN A abcd

IN A abcd

IN MX 10 maildomainetld

mail IN A abcd

Dans le mecircme dossier zones on a cbain-addrarpa

9

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122101 serial

14400 refresh

3600 retry

604800 expire

10800 minimum

)

cbain-addrarpa IN NS nsdomainetld

cbain-addrarpa IN NS ns11ovhnet

d IN PTR maildomainetld

Il faut faire attention agrave bien increacutementer le serial pour chaque modification des fichiers

Dans le fichier namedconflocal

zone domainetld

type master

file etcbindzonesdbdomainetld

allow-transfer 213251128130

notify yes

zone cbain-addrarpa IN

type master

file etcbindzonescbain-addrarpa

allow-transfer 213251128130

Ici 213251128130 est lrsquoadresse IP du serveur ns11ovhnet

Il faut bien sucircr configurer le DNS avec votre fournisseur (Gandi OVH hellip) Pour ccedila amusez-vous bien Vous pouvez

aussi tester votre configuration avec des outils en ligne tels que DNSstuff

En test final si votre configuration est bonne vous devriez pouvoir envoyer un mail depuis un service neutre (Gmail

yahoo hellip) et le voir dans votre arborescence (ici homevmaildomainetld)

Installation du paquet Debian et configuration de lighttpd

Commencez par reacutecupeacuterer le paquet deb agrave lrsquoadresse suivante httpswwwintimailpwintimaildeb

Installez ensuite GDebi Il srsquoagit drsquoun dpkg ameacutelioreacute pour teacuteleacutecharger les deacutependances automatiquement ce que

dpkg ne gegravere pas

apt-get update

apt-get install gdebi-core

10

Vous pouvez alors installer le paquet

gdebi intimaildeb

Vous aurez alors le site web drsquointiMail deacuteployeacute au chemin varwwwwebmail

Il ne vous reste plus qursquoagrave changer la configuration de lighttpd votre serveur web pour mettre en ligne le site

Vous pouvez pour cela copier-coller la configuration suivante mais veillez agrave bien changer lrsquoadresse IP preacutesente au

deacutebut de la partie SSL CONFIG avec votre adresse IP

serv ermodules = ( mod_access

mod_accesslog

mod_alias

mod_compress

mod_redirect

mod_rewrite

)

Hide server version

servertag = Such Headers Very try Now close telnet

serverdocument-root = varwwwwebmail

serverupload-dirs = ( varwwwwebmailuploads )

servererrorlog = varloglighttpderrorlog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

serverport = 80

accesslogformat = V h l u t r gts b Refereri

User-Agenti

accesslogfilename = varloglighttpdaccesslog

index-filenames = ( indexphp indexhtml

indexlighttpdhtml )

urlaccess-deny = ( ~ inc )

static-fileexclude-extensions = ( php pl fcgi )

compresscache-dir = varcachelighttpdcompress

compressfiletype = ( applicationjavascript textcss

texthtml textplain )

default listening port for IPv6 falls back to the IPv4 port

include_shell usrsharelighttpduse-ipv6pl + serverport

include_shell usrsharelighttpdcreate-mimeassignpl

include_shell usrsharelighttpdinclude-conf-enabledpl

SSL CONFIG

$SERVER[socket] == 5234485443

sslengine = enable

11

sslpemfile = etclighttpdsslintimailpwpem

sslca-file = etclighttpdsslintimailpwcrt

servername = intimailpw

votre configuration habituelle pour ce domaine

serverdocument-root = varwwwwebmail

servererrorlog = varloglighttpderror_ssllog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

Rewrite des URL pour masquer php

urlrewrite-once = ( ^()$ =gt $1 )

urlrewrite-if-not-file = ( ^([^])()$ =gt $1php$2 )

servernetwork-backend = writev

Deacutependances Slapd

Ldap-utils

Postfix

Postfix-ldap

Bind9

Lighttpd

12

Sources httpswikigandinetfrhostingusing-linuxtutorialsdebianmail-server-ldap

httpwwwpostfixorgpipe8html

httpwwwpostfixorgFILTER_READMEhtml

httpwwwpostfixorg

httpwwwpostfixorgtransport5html

Page 2: Système d'hébergement domestique...place sur les domaines .pw par Gandi.net, notre fournisseur. Nous n’avons donc pas pu l’implémenter. Nous avons configuré Postfix pour qu’il

Sommaire

Sommaire

Contexte amp Objectifs

Contexte

Objectifs

Cahier des Charges

Mateacuteriel et logiciels utiliseacutes

Dans le deacutetail

Au coeur du projet

Gestion des utilisateurs - Le serveur LDAP

Serveurs SMTP et DNS

Serveur Web et Webmail

Un serveur web leacuteger

Une architecture optimiseacutee

Envoyer des courriels

Mais aussi en recevoir

Interface drsquoadministration

Architecture du systegraveme de fichiers

Firewall

Gestion de lrsquoeacutenergie

Eacutevolutions possibles

Webmail

Systegraveme

Partie eacutenergeacutetique

Conclusion

Sources

Contexte amp Objectifs

Contexte

Aujourdrsquohui avec lrsquoarriveacutee de lrsquoInternet dans notre quotidien quasiment tout le

monde possegravede une adresse mail Ce systegraveme fut une veacuteritable reacutevolution dans la

maniegravere dont les Hommes communiquent entre eux augmentant de faccedilon

drastique la vitesse des eacutechanges et la productiviteacute des Entreprises

Apregraves 20 ans drsquoexistence les services de mail ont fleuri sur la toile

Doreacutenavant il est possible de creacuteer une boicircte demessagerie en quelques instants et

drsquoenvoyer des messages agrave lrsquoinfini

Quelques statistiques sur le mail en 2015 drsquoapregraves The Radicati Group

4 353 millions de comptes

2 586 millions drsquoutilisateurs

205 milliards de mails envoyeacutes par jour

Le problegraveme crsquoest qursquoaujourdrsquohui toutes les grosses entreprise du domaine

des technologies de linformation rognent de plus en plus sur la vie priveacutee de leurs

utilisateurs Le contenu de nos conversations nrsquoest parfois plus notre proprieacuteteacute

Lrsquoobjectif de notre projet est de donner la possibiliteacute agrave nrsquoimporte qui de

deacuteployer son propre service de mail seacutecuriseacute heacutebergeacute sur sa propre machine

Objectifs

Ce projet doit permettre agrave tout utilisateur de creacuteer quelques comptes de

messagerie sur un systegraveme embarqueacute de type Raspberry et permettre de conserver

les donneacutees agrave la maison

Le systegraveme doit ecirctre constitueacute agrave base de standards (Base LDAP serveur de

messagerie connu et maintenu pareillement pour le client de messagerie)

Linterface dadministration doit ecirctre elle aussi tregraves simple dutilisation

En outre le systegraveme devra ecirctre capable de distinguer des niveaux de

privilegraveges entre les utilisateurs geacuterer des groupes drsquoutilisateurs les quotas et devra

rester le moins eacutenergivore et le plus leacuteger possible Nous devons de plus rendre le

code le plus geacuteneacuterique possible afin de lrsquoempaqueter et le deacuteployer sur un systegraveme

quelconque sans soucis

Enfin un effort particulier doit ecirctre porteacute sur lalimentation du systegraveme

embarqueacute Il est notamment demandeacute de mettre au point une alimentation agrave base

deacutenergie renouvelable (comme un panneau solaire) permettant dalimenter

totalement ou partiellement le systegraveme

Fig 1 Une Raspberry Pi

Cahier des Charges

Mateacuteriel et logiciels utiliseacutes

Pour ce projet nous avons utiliseacute jusqursquoici le mateacuteriel suivant

1 Raspberry Pi 2

1 Carte micro SD 8 Go

1 Cacircble USBmicro USB

1 Cacircble RJ45

En outre nous avons installeacute les logiciels suivants

Une distribution Debian Jessie pour Raspberry

Un serveur web Lighttpd

Un serveur mail Postfix

Un serveur DNS Bind

Un serveur drsquoannuaire OpenLDAP

Le module PHP5 pour Lighttpd

Nous avons deacuteveloppeacute nos diffeacuterents codes en Shell ou Perl directement sous

Debian et le code pour la partie web est eacutecrit en PHP sous lrsquoIDE NetBeans

Dans le deacutetail

Dans le deacutetail lideacutee est de deacutevelopper un systegraveme autonome et fonctionnel

Autrement dit les diffeacuterents packages et fonctionnaliteacutes installeacutees sur la Raspberry

ainsi que linterface utilisateur sur le site web et lrsquoaspect eacutenergeacutetique

Voici les diffeacuterentes fonctionnaliteacutes que nous avons impleacutementeacutees

Serveur Mail

Postfix pour le protocole SMTP

Systegraveme leacuteger pas de protocoles IMAPPOP en plus tout en web

Gestion particuliegravere des gros mails et notamment de leurs piegraveces jointes

Deacutecodage et encodage base 64 des piegraveces jointes

Support de la reacuteception de piegraveces jointes multiples

Gestion des utilisateurs

Plusieurs comptes en utilisant LDAP

La possibiliteacute de sidentifier en tant quadministrateur

Listes de diffusion et groupes

Antivirus amp gestion des spams

iptables scripts shellperl de deacutetection par les logs drsquoattaques puis

mise en place de regravegles iptables via ces mecircmes scripts

Antispam maison synchronisation sur les blacklists existantes et

fiables rejet drsquoun spam

Nom de domaine et enregistrements associeacutes

Enregistrement A deacutefinit lrsquoadresse de nom drsquoun serveur web

Enregistrement MX deacutefinit lrsquoadresse de nom drsquoun serveur mail

Sauvegarde automatique peacuteriodique de la Raspberry Pi

Interface web

Gestion des comptes (creacuteation modification suppression)

Gestion des listes de diffusions

Gestion des quotas

Affichage du courrier

Paquets deb installable sur tout systegraveme Debian

Incluant un document explicatif pour lrsquoinstallation et la configuration

particuliegravere agrave apporter

Systegraveme pouvant ecirctre autonome en eacutenergie

Au coeur du projet

Gestion des utilisateurs - Le serveur LDAP

Comme il lrsquoeacutetait suggeacutereacute dans lrsquoeacutenonceacute du sujet nous nous sommes

inteacuteresseacutes agrave la solution LDAP Il srsquoagit drsquoun protocole de gestion drsquoannuaire baseacute sur

TCPIP Dans un premier temps nous avons penseacute agrave creacuteer un systegraveme de base de

donneacutees utilisant un simple systegraveme de fichiers car nous avions trouveacute ce systegraveme

trop compliqueacute agrave configurer agrave utiliser et trop lourd bien que plus leacuteger qursquoune Base

de Donneacutees classique

Cependant LDAP srsquoavegravere ecirctre un systegraveme parfaitement adapteacute pour la

gestion drsquoinformations utilisateurs En effet cette tacircche requiert beaucoup plus de

lectures que drsquoeacutecritures ce pourquoi LDAP est optimiseacute Ce programme preacutesente

lrsquoavantage de privileacutegier la lecture et disposes de nombreuses API dans les

langages de programmation divers dont PHP que nous utilisons crsquoest pourquoi

nous avons deacutecideacute de lrsquoutiliser

Le modegravele drsquoinformation de LDAP est baseacute sur des entreacutees Chacune drsquoentre

elles est un ensemble drsquoattributs Les informations sont organiseacutees sous la forme

drsquoun arbre Pour notre projet nous avons retenu la structure suivante

Fig 2 Structure de lrsquoannuaire LDAP

Nous avons ici deacutetermineacute des champs agrave renseigner pour constituer un

utilisateur En particulier un utilisateur dispose des attributs suivants

Son identiteacute (nom preacutenom(s))

Son identifiant utilisateur (UID) sous la forme comme agrave Polytech

initiale+nom(+chiffre) Son adresse mail compegravete sous la forme UIDdomainetld

Le chemin de sa boicircte mail sur le systegraveme domaineUID

Son quota (en octets)

Son mot de passe encrypteacute en SSHA

Fig 3 Une personne dans lrsquoannuaire LDAP

Les utilisateurs sont enregistreacutes dans la branche ldquopeoplerdquo de notre annuaire

Nous avons de plus une seconde branche ldquogroupsrdquo Celle-ci contient les listes de

diffusion Elle contient aussi le groupe particulier admins utilisateurs qui ont droit agrave

des options drsquoadministration sur le webmail

Fig 4 Un groupe dans lrsquoannuaire LDAP

On peut remarquer que pour la gestion des listes de diffusion nous avons

choisi de relier une personne agrave un groupe par son UID Ainsi lrsquoappartenance drsquoun

utilisateur agrave un groupe se traduit par la preacutesence de son adressemail dans lrsquoattribut

maildrop du groupe

Cela nous permet de geacuterer de maniegravere pratique les groupes auquels

appartient un utilisateur et inversement de sortir la liste des utilisateurs drsquoun groupe

avec une simple commande de typeldapsearch sur le serveur LDAP Pour ajouter ou

supprimer un utilisateur agrave un groupe il suffira de modifier lrsquoattribut maildrop du

groupe

Serveurs SMTP et DNS

Pour cette partie nous avons utiliseacute lrsquoexcellent Postfix Crsquoest une solution de

messagerie eacutelectronique libre rapide leacutegegravere seacutecuriseacutee et facile agrave administrer Crsquoest

aussi le serveur mail par deacutefaut dans plusieurs systegravemes de type UNIX Il permet

notamment drsquoeacuteviter une bonne partie du spam avec une configuration simple et

accessible

Il est important aussi de respecter les speacutecifications de la RFC Nous avons eu

la surprise de voir qursquoil est ldquoimpeacuteratifrdquo drsquoavoir deux adresses particuliegraveres sur le

serveur postmaster et abuse Ce sont les premiegraveres victimes des attaques par force

brute

La configuration de Postfix se fait de maniegravere eacutetroite avec Bind le serveur de

nom de domaine que nous avons installeacute En effet pour que Postfix fonctionne il est

essentiel que lrsquoenregistrement MX du serveur DNS fonctionne Crsquoest un type

drsquoenregistrement particulier qui permet la mise en place drsquoun serveur mail

De plus il est neacutecessaire de faire un enregistrement PTR qui correspond agrave au

DNS inverse Il nrsquoest pas indispensable au fonctionnement du serveur mail en soit

mais la plupart des fournisseurs de ce type de service se servent de cet

enregistrement pour contrer une partie du spam Il est donc possible que les mails

drsquoun serveur soient bloqueacutes si lrsquoenregistrement PTR est mal configureacute

Parallegravelement nous avons aussi proceacutedeacute agrave lrsquoenregistrement A qui permet la

mise en place drsquoun serveurWeb neacutecessaire agrave notreWebmail Nous avons utiliseacute des

outils en ligne tel que DNSStuff pour tester notre configuration dont un exemple se

trouve en annexe Notons par contre que la technologie DNSSEC nrsquoest pas mise en

place sur les domaines pw par Gandinet notre fournisseur Nous nrsquoavons donc pas

pu lrsquoimpleacutementer

Nous avons configureacute Postfix pour qursquoil utilise notre annuaire LDAP Il est

possible agrave ce stade de tester la configuration avec telnet et drsquoenvoyer unmail Apregraves

cela nous avons testeacute le bon fonctionnement du serveur en envoyant avec succegraves

un mail vers une boicircte mail exteacuterieure de type gmail

Nous nous sommes alors heurteacutes aux protections du Service Informatique de

lrsquoUniversiteacute (CRI) qui bloque le port 25 en sortie et en entreacutee en dehors de lrsquouniversiteacute

Pour nous astreindre de ces restrictions nous avons migreacute notre serveur vers une

nouvelle connexion SDSL exteacuterieure au reacuteseau de Lille 1 Cela a eacuteteacute pour nous un

moyen de veacuterifier en partie la portabiliteacute de notre systegraveme puisque nous utilisons une

toute nouvelle connexion avec une nouvelle adresse IP Nous avons donc ducircmettre

agrave jour notre serveur de nom pour refleacuteter ces changements La migration srsquoest

passeacutee sans soucis avec un deacutelai de propagation des changements drsquoenviron 1

heure Le systegraveme est resteacute fonctionnel agrave 100 notamment parce que dans notre

code nous faisons appel au serveur par localhost ou une variable et jamais

directement lrsquoadresse IP ou le domaine Cependant nous nrsquoavons pas pu veacuterifier la

migration vers un domaine diffeacuterent bien que cela ne reste normalement qursquoune

variable dans les fichiers de configuration de lrsquointerface

Gestion du Spam

Comme preacutevu nous avons apporteacute une solution agrave la gestion du spam sur

notre serveur Postfix propose dans ses paramegravetres lrsquoutilisation de services de

DNSBL (DNS Black List) Cette technologie reprend le mecircme principe que les

serveurs de noms classiques Postfix soumet une requecircte de type DNS aux serveurs

de liste noire deacutefinis dans sa configuration et le serveur indique si ce nom de

domaine est preacutesent dans sa liste ou non On peut de cette maniegravere rejeter une

bonne partie du trafic mail correspondant au Spam et ce tregraves facilement

Malgreacute cela nous pensons qursquoune partie du Spam passera agrave travers les

mailles du filet Il aurait eacuteteacute inteacuteressant de traiter ceux-ci pour les classer comme

indeacutesirables et pouvoir ainsi les afficher dans lrsquointerface web

Serveur Web et Webmail

Un serveur web leacuteger

Initialement nous sommes partis sur une solution classique agrave base drsquoun

serveur web Apache qui nous a permis de deacutebuter le deacuteveloppement de lrsquointerface

Cependant comme nous cherchons agrave alleacuteger un maximum le systegraveme nous nous

sommes pencheacutes sur une autre solution Lighttpd Ce serveur web vise comme son

nom lrsquoindique la performance et la leacutegegravereteacute Sur le mecircme contenu avec une

connexion Tregraves Haut Deacutebit (100Mbps) nous chargeons deacutesormais la page de vue

geacuteneacuterale en 042s (Lighttpd) contre 170s avant (Apache 2) avec le navigateur

Chrome sans cache

Une architecture optimiseacutee

Lrsquoutiliteacute de reacutealiser notre propre webmail est dans un premier temps de

srsquoabstenir de lrsquoinstallation drsquoun serveur IMAPPOP puisque nous retrouvons

nous-mecircmes le contenu Dans un second temps il nous permet de ne garder que les

fonctionnaliteacutes neacutecessaires agrave notre webmail sans superflu

Fig 5 La vue geacuteneacuterale de notre webmail

Gracircce agrave PHP et agrave son module drsquointerface avec LDAP nous pouvons identifier

un utilisateur avec son nom drsquoutilisateur et son mot de passe sur le serveur local

LDAP et ainsi retrouver nombreuses informations utiles comme le quota actuel

autoriseacute son nom entier le chemin drsquoaccegraves agrave son reacutepertoire dans lesquels sont ses

mails sur le systegraveme de fichiershellip

Fig 6 Lrsquoarchitecture du dossier drsquoun utilisateur des dossier sent et inbox contenant les

mails bruts un dossier json dans lequel sont placeacutes les entecirctes des mails ainsi que le quota

Chaque en-tecircte de mail est eacutecrite dans un fichier json distinct par boicircte (un

fichier pour la boicircte de reacuteception un fichier pour les mails envoyeacuteshellip) ce qui nous

permet de montrer agrave lutilisateur la liste des mails dune boicircte sans traitement lourds

en arriegravere plan pour le serveur Ces fichiers sont renseigneacutes par un script lanceacute agrave la

reacuteception drsquoun mail par postfix du cocircteacute reacuteception et par lrsquointerface web elle mecircme

pour lrsquoeacutemission Lrsquoen-tecircte drsquoun mail est eacutecrite dans un conteneur JSONde lamaniegravere

suivante

Fig 7 Exemple drsquoentreacutee dans un fichier json

Gracircce tout cela nous pouvons afficher simplement le contenu des diffeacuterentes

boicirctes mail dans des tableaux sur lrsquointerface gracircce aux en-tecirctes et par la suite

retrouver et afficher le contenu drsquoun mail agrave partir de son fichier brut sur lequel

lrsquoutilisateur aura cliqueacute comme on le verra un peu plus loin

Toujours dans un souci drsquoameacutelioration des performances le strict neacutecessaire

est geacuteneacuteralement chargeacute sur les pages web par exemple en venant de la vue

geacuteneacuterale lorsqursquoon clique surInboxseule la partie inteacuterieure de la page est chargeacutee

on ne recharge pas le bandeau du haut de page ou lemenu de gauche agrave lamaniegravere

drsquoun MVC classique

Envoyer des courriels

Toute cette architecture ne doit pas nous faire oublier le but premier envoyer

et recevoir des mails Pour envoyer des mails crsquoest tregraves simple on peut soit cliquer

dans le bandeau du haut sur ldquoQuick Emailrdquo qui permet sur lamecircme page drsquoenvoyer

un email rapide et sans piegravece-jointe soit cliquer dans la barre de navigation sur le

cocircteacute sur ldquoWrite a new emailrdquo ce qui nous megravene vers une page deacutedieacutee permettant

drsquoeacutecrire un email incluant une piegravece jointe

Fig 8 Envoyer un mail crsquoest simple comme bonjour

On peut remarquer sur cette capture drsquoeacutecran que lrsquoon ne peut envoyer que

certains types de piegraveces jointes Nous supportons JPG PNG GIF PDF et ZIP Si la

piegravece jointe est drsquoun autre format elle est rejeteacutee La veacuterification du type srsquoeffectue

sur lrsquoextension du fichier et sur son type MIME ce qui eacutevite par exemple que

quelqursquoun modifie lrsquoextension drsquoun fichierexe en fichierjpg pour lrsquoenvoyer La piegravece

jointe doit de plus avoir une taille infeacuterieure agrave la taille maximale drsquoune piegravece jointe

parameacutetreacutee par lrsquoadministrateur comme nous le verrons dans lrsquointerface

drsquoadministration

Si tous ces critegraveres sont bons on eacutecrit lemail au format brut deacutecrit par la RFC

puis on lrsquoexpeacutedie agrave lrsquoaide de la fonction mail de PHP Si cette fonction nrsquoeacutechoue pas

crsquoest que le mail est expeacutedieacute avec succegraves on peut alors mettre agrave jour le quota

drsquoespace disque maximum autoriseacute agrave lrsquoutilisateur en increacutementant celui-ci avec la

taille du mail qui vient drsquoecirctre envoyeacute ainsi que creacuteer un fichiermail brut sur le disque

pour pouvoir afficher le mail dans la boicircte drsquoenvoi et en garder une trace

Notons que comme crsquoest lrsquoutilisateur web du systegraveme (www-data) qui exeacutecute

la fonction nous modifions les en-tecirctes du mail afin que le destinataire reccediloive un

mail de la part de ldquoPreacutenom Nomrdquo depuis lrsquoadresse ldquopnomdomainetldrdquo plutocirct que

ldquowww-datadomaintldrdquo par deacutefaut

La migration vers une IP externe agrave Lille 1 eacutetant reacuteussie nous pouvons bien

envoyer des mails depuis notre interface qui sont reccedilus agrave lrsquoexteacuterieur sans soucis

Mais aussi en recevoir

Recevoir des mails est tout aussi important Nous avons vu lrsquoarchitecture en

arriegravere-plan mais au final agrave quoi cela ressemble-t-il pour lrsquoutilisateur Il dispose en

fait en cliquant sur Inbox (ou Sent Spam ou Trash eacutegalement) drsquoun accegraves agrave sa boicircte

de reacuteception Drsquoun clic srsquoaffichent alors agrave lui tous les mails qursquoil a reccedilu

Fig 9 La boicircte de reacuteception

On remarque notamment les fonctions de recherche drsquoactualisation du

tableau de choix des colonnes agrave afficher on peut classiquement choisir combien de

lignes on affiche par page changer de pages etchellip

Lorsque lrsquoon clique sur un des lignes les donneacutees de lrsquoen-tecircte du mails sont

passeacutes en paramegravetres agrave une autre page qui drsquoapregraves ces informations retrouve le

fichier mail brut le traite et lrsquoaffiche

Fig 10 Un mail contenant 3 piegraveces jointes et un message

Comme on peut le voir nous pouvons recevoir desmails avec plusieurs piegraveces

jointes Nous avons ici preacutesenteacute la boicircte de reacuteception mais les autres boicirctes

fonctionnent de maniegravere similaire

Interface drsquoadministration

Le systegraveme de webmail possegravede plusieurs variables des listes de diffusion

des compteshellipMais on veut pouvoir donner les droits agrave un utilisateur demodifier tout

cela En effet si nous trouvons cela abordable drsquoajouter un utilisateur avec une

commande dans le shell il faut aussi penser agrave lrsquoutilisateur final qui preacutefegravere peut-ecirctre

le confort drsquoune interface deacutedieacutee pour geacuterer son serveur mail plutocirct que le terminal

De maniegravere tregraves simple un utilisateur appartenant au groupes drsquoutilisateurs

ldquoAdministrateursrdquo est reconnu en tant qursquoadministrateur par lrsquointerface et peut

cliquer sur un bouton ldquoManagerdquo dans le panneau lateacuteral qui nrsquoest visible qursquoaux

administrateurs De lagrave il arrive sur la page suivante

Fig 11 lrsquointerface drsquoadministration

Sur cette interface il peut choisir la taille maximale des piegraveces jointes

changer le nom de domaine sur lequel est installeacute lrsquointerface et dont deacutependent

toutes les adresses (domaine) Il est aussi possible de modifier directement ces

variables en modifiant le fichier includeconfigincphp Pratique notamment si lrsquoon

a renseigneacute un mauvais nom de domaine agrave la configuration et que lrsquoon arrive plus agrave

acceacuteder agrave lrsquointerface

Il peut aussi creacuteer un nouveau compte en renseignant les champs preacutenom

nom mot de passe et quota Lrsquoutilisateur peut ensuite une fois son compte creacutee

directement se connecter avec son identifiant (initiale preacutenom + nom) et mot de

passe Lors de la creacuteation du compte un mail de bienvenue est envoyeacute au nouvel

utilisateur ce qui permet en arriegravere-plan de creacuteer tous les dossiers utilisateurs et

fichiers en-tecirctes utiles agrave lrsquointerface une fois pour toutes

Lrsquoadministrateur peut aussi ajouter une liste de diffusion (assimileacutee agrave un

groupe) ou en supprimer une parmi les listes existantes

En outre lrsquoadministrateur peut aussi modifier les donneacutees drsquoun utilisateur

Pour cela sur la preacutesente page il peut seacutelectionner un utilisateur parmi la liste des

utilisateurs existants ce qui le redirige vers la page de gestion des comptes

Fig 12 La gestion drsquoun compte seacutelectionneacute ici celui de James Bond

A ce stade il peut changer lrsquoUID de lrsquoutilisateur (utile en cas de conflit) le nom

le mot de passe le quota de cet utilisateur et lrsquoajouter ou le retirer drsquoune liste de

diffusion Accessoirement il peut aussi supprimer le compte en cliquant sur lrsquoeacutenorme

bouton rouge qui lui demandera deux fois de suite de confirmer son action afin

drsquoeacuteviter les erreurs de clic Cette action entraicircne la suppression de lrsquoutilisateur de

toutes les listes de diffusion auxquelles il appartient la suppression de son compte

dans la branche people de lrsquoarbre LDAP et la suppression deacutefinitive de son dossier

utilisateur sur le disquesystegraveme de fichiers impliquant donc la perte de ses mails

Architecture du systegraveme de fichiers

Comme nous lrsquoavons dit plus haut lrsquoideacutee est de se passer des meacutecanismes

classiques avec les clients mails habituels Ces serveurs srsquoalourdissent

geacuteneacuteralement en utilisant des serveurs IMAPPOP3 et un meacutecanisme

drsquoauthentification SMTP

Pour adapter ces fonctionnaliteacutes agrave notre systegraveme nous avons donc constitueacute

une architecture pour organiser les fichiers qui transitent Vous pourrez voir un

scheacutema reacutecapitulatif en annexe 1

Dans la premiegravere moitieacute du projet les mails eacutetaient deacutelivreacutes par Postfix Nous

utilisions un script exeacutecuteacute lors de la reacuteception drsquounmail pour les traiter de lamaniegravere

que nous voulions Cette meacutethode avait les inconveacutenients drsquoecirctre lourde et pas

efficace agrave 100 En effet seuls les mails reccedilus depuis lrsquoexteacuterieur eacutetaient

correctement traiteacutes

Deacutesormais les mails sont traiteacutes totalement par notre script Cela nous

permet de geacuterer les mails dans des dossiers organiseacutes agrave notre maniegravere et de

recevoir les mails locaux crsquoest-agrave-dire entre utilisateurs du mecircme domaine Cette

nouvelle meacutethode regravegle aussi drsquoautres problegravemes notamment au niveau des

permissions sur les fichiers

Pour reacuteduire le nombre drsquoopeacuterations et pour profiter des fonctionnaliteacutes

offertes par le framework utiliseacute pour lrsquointerface web nous regroupons des

informations sur chacun des mails reccedilus sous la forme de fichiers JSON Pour ce

faire lrsquoideacutee est drsquoexeacutecuter un script lorsque leacutevegravenement ldquoreacuteception drsquoun mailrdquo

survient Postfix offre cette possibiliteacute dans sa configuration Or il se trouve qursquoil nrsquoest

pas si simple de reacutecupeacuterer le chemin du fichier contenant le mail car le nom du

fichier creacutee est sous la forme Timestamp UNIX10 Caractegraveres aleacuteatoires (ex

14562336185A8D43E97F)

La seconde probleacutematique est que le webmail doit avoir la possibiliteacute de

pouvoir lire les fichiers pour afficher les mails sur son interface Or il semble que

Postfix les eacutecrit en autorisant uniquement son utilisateur en lecture Il nous a fallu

trouver une solution pour remeacutedier agrave cela Nous avons choisi drsquoajouter www-data

(utilisateur du serveur web) au groupe vmail et de modifier les droits sur les fichiers

de sorte que les utilisateurs de ce groupe puissent lire les fichiers

Nous avons revu une partie de lrsquoorganisation des fichiers pour reacutecupeacuterer les

piegraveces jointes si elles sont preacutesentes Le script que nous avons eacutecrit reacutecupegravere le

fichier original du mail et le deacutecoupe en eacuteleacutements simples dans des fichier distincts

corps du mail et diffeacuterentes piegraveces jointes De cette maniegravere pour afficher un mail

nous nrsquoavons pas besoin de charger la totaliteacute du fichier Dans le cas ougrave il y a des

piegraveces jointes cela aurait ralenti lrsquoaffichage des informations

Nous avons eacutegalement impleacutementeacute la gestion des quotas Dans lrsquoeacutetat actuel

des choses srsquoil nrsquoy a plus de place disponible pour lrsquoutilisateur le mail nrsquoest tout

bonnement pas deacutelivreacute agrave ce destinataire Lrsquoideacuteal aurait eacuteteacute de notifier leacutemetteur avec

un mail ce qui nrsquoest pour lrsquoinstant pas le cas mais qui pourrait ecirctre reacutesolu en

renvoyant agrave postfix un code drsquoerreur deacutefini

Pour terminer nous avons revu la totaliteacute du code deacuteveloppeacute Nous sommes

passeacute du Bash au Perl Ce dernier est plus performant et plus simple agrave utiliser et agrave

lire

Firewall

Un autre gros morceau du projet mais qui nrsquoest pas speacutecifiquement lieacute agrave la

probleacutematique du mail crsquoest la seacutecurisation du serveur En effet apregraves avoir mis en

ligne notre serveur des pirates ont tregraves vite tenteacute de peacuteneacutetrer le systegraveme

Globalement les attaques eacutetaient de type force brute sur les services heacutebergeacutes sur

notre Raspberry neacutecessitant une identification tels que SSH SMTP hellip

On retrouve ici un petit point faible du protocole SMTP Eacutetant donneacute que

chaque serveur mail doit avoir une adresse postmaster et abuse lrsquoattaquant a agrave sa

disposition deux adresses agrave attaquer Ceci dit ce type drsquoattaque est simple agrave

contrecarrer car il suffit de limiter dans le temps le nombre de tentatives de

connexions

La contre-mesure que nous avons mis en place est simple une seacuterie de

regravegles Iptables En reacutesumeacute nous avons opteacute pour un systegraveme de liste blanche et

noire Les adresses IPs de la liste blanche sont autoriseacutees agrave utiliser la totaliteacute des

services (notamment SSH) tandis que celles de la liste noire sont totalement

ignoreacutees Les autres IPs nrsquoont accegraves qursquoau webmail

Eacutetant donneacute que le nombre drsquoIPs attaquant notre serveur nrsquoa cesseacute

drsquoaugmenter nous avons automatiseacute la mise agrave jour de la liste de noire en

deacuteveloppant un script pour Cron Ce script est exeacutecuteacute une fois par heure A ce jour

notre liste noire contient 47 adresses Bien sucircr ce systegraveme est susceptible drsquoecirctre

modifieacute agrave convenance pour passer sur une solution deacutedieacutee telle que Fail2ban qui fait

en fait ce qursquoon fait deacutejagrave (eacutetudier les logs et bannir des IP avec iptables) avec des

regravegles preacutedeacutefinies par la communauteacute et personnalisables En effet nous nous

attendons agrave voir la varieacuteteacute et le nombre drsquoattaques augmenter apregraves avoir migreacute sur

une IP non proteacutegeacutee par le firewall de lrsquoUniversiteacute puisque nous nrsquoavons plus la

premiegravere ligne de deacutefense du CRI en particulier pour le port 389 (LDAP) qui eacutetait

bloqueacute par lrsquouniversiteacute et srsquoest retrouveacute en premiegravere ligne apregraves la migration Nous

avons donc ajouteacute une regravegle bloquant tout le trafic entrant vers le port 389 hormis

localhost

Package drsquoinstallation

Nous avons creacutee un package deb contenant les sources du webmail ainsi

que des scripts utiles agrave lrsquoinstallation et au fonctionnement du serveur Nous avons

deacuteveloppeacute des scripts de configuration automatique pour LDAP et Postfix Comme

dpkg ne supporte pas directement lrsquoinstallation automatique des deacutependances

nous recommandons drsquoinstaller avant tout le paquet gdebi-core qui est en fait un

dpkg ameacutelioreacute Gracircce agrave la commande gdebi paquetdeb toutes les deacutependances

seront installeacutees en particulier postfix le serveur ldap le serveur web lighttpd entre

autres sans soucis Il est agrave noter que comme les scripts de configuration des

diffeacuterents services ne sont que partiellement impleacutementeacutes dans le paquet deb nous

fournissons en annexe un README complet et illustreacute qui explique pas agrave pas

comment faire fonctionner notre systegraveme sur nrsquoimporte quel Linux en particulier les

lignes de configuration des diffeacuterents services agrave changer et un exemplaire des

fichiers de configuration fonctionnels de ces services

Gestion de lrsquoeacutenergie

Une consideacuteration importante pour un systegraveme autonome Drsquoapregraves les fiches

techniques notre modegravele de Raspberry Pi (B 2) est officiellement eacutevalueacute avec un

fonctionnement agrave ~650mA pour 5V De nombreux proprieacutetaires de ce systegraveme

eacutequipeacutes se sont amuser agrave veacuterifier la consommation eacutelectrique reacuteelle de leur Pi 2 B

sous diffeacuterentes charges On pourra retenir cette eacutetude (lien en sitegraphie) qui

relegraveve la consommation en courant en fonction de lrsquoactiviteacute lanceacutee sur la Pi mais

aussi en charge sur 1 agrave 4 CPU

Ces chiffres sont releveacutes sur un systegraveme avec cameacutera connecteacutee HDMI connecteacute et

cacircble ethernet brancheacute et actif

On peut constater que globalement notre systegraveme Pi 2 B tournant sans

interface graphique sans composant suppleacutementaire sans sortie videacuteo ni cameacutera

avec plusieurs serveurs tournant tout en restant le plus leacuteger possible et demeurant

~99 idle la plupart du temps ne devrait pas deacutepasser une consommation de

300mA grand maximum

Fig 13 Un processeur tregraves tregraves peu chargeacute et une meacutemoire relativement libre

Nous avions lrsquoanneacutee derniegravere deacutejagrave reacutealiseacute un circuit permettant drsquoadapter un

panneau solaire sur une batterie USB classique de 9000mAh Nous avions alors pu

mesurer lrsquointensiteacute deacutelivreacutee par le panneau solaire En cas drsquoensoleillement moyen

habituel dans nos contreacutees le panneau solaire deacutebitait 400mA et pouvait atteindre

le double quand le soleil eacutetait directement preacutesent pour environ 800mA deacutebiteacute

Ce panneau solaire accompagneacute de son circuit drsquoadaptation devrait donc

suffire pour alimenter notre systegraveme la journeacutee le brancher ensuite sur une batterie

portable permet de stocker le surplus pour la nuit

Fig 14 le circuit drsquoadaptation

Fig 15 et son PCB

Eacutevolutions possibles

Webmail

Concernant les eacutevolutions possibles que nous aurions aimeacute apporter agrave notre

projet avec plus de temps commenccedilons par le web Nous aurions souhaiteacute apporter

la gestion de lrsquoenvoi de plusieurs piegraveces jointes comme nous lrsquoavons fait pour la

reacuteception

De plus nous aurions voulu inteacutegrer une corbeille ougrave lesmessages pourraient

aller avant drsquoecirctre deacutefinitivement supprimeacutes du systegraveme drsquoautant que nous avons

deacutejagrave eacutecrites les fonctions PHP permettant de retirer une en-tecircte drsquoun fichier JSON et

le fichier mail associeacute

Enfin nous aurions aimeacute en plus du blocage deacutejagrave preacutesent impleacutementer une

gestion plus profonde des piegravece jointes permettant notamment le remplissage de la

boicircte de spams

Systegraveme

Il aurait eacuteteacute inteacuteressant de notifier lrsquoexpeacutediteur lorsque le mail nrsquoa pas pu ecirctre

deacutelivreacute agrave un utilisateur lorsque son quota est plein En toute logique cela devrait ecirctre

fait simplement avec la commande Sendmail

Une meilleur gestion du trafic mail indeacutesirable aurait eacuteteacute la bienvenue En

effet malgreacute la limitation du spam il restera toujours une partie du volume de mail

qui sera indeacutesirable (pub pishing scam hellip)

Eacutetant donneacute la taille du systegraveme nous avions penseacute agrave une approche

ldquomachine learningrdquo Lrsquoutilisateur indiquerait pourquoi il considegravere le mail comme

indeacutesirable constituant des regravegles refusant certains mails Les mails provenant de

cet expeacutediteur pourraient ecirctre deacutetecteacute par le script agrave la reacuteception et

automatiquement envoyeacutes dans la boicircte de spams

Partie eacutenergeacutetique

Mecircme si la solution au panneau solaire ne pose aucun problegraveme en theacuteorie

nous aurions deacutejagrave dans un premier temps aimeacute lrsquoimpleacutementer en pratique Nous

nrsquoavons finalement pas reacutealiseacute notre objectif de deacutetecter deux cas drsquoalimentation

diffeacuterents soit lrsquoalimentation via panneau solaire est suffisante dans ce cas il

alimente la batterie et donc la Raspberry soit quand ce courant nrsquoest pas suffisant

on alimente la batterie par le secteur

Conclusion

En conclusion nous pensons avoir reacutepondu au cahier des charges initial dans

sa majeure partie Nous sommes aujourdrsquohui en mesure de proposer une solution

mail domestique priveacutee et personnalisable par un particulier

Notre installation de Debian a eacuteteacute au maximum alleacutegeacutee pour notre utilisation

sans interface graphique et nous avons mis en place une reacuteponse aux diverses

attaques que nous avons pu subir lors de lamise en place de notre solution logicielle

En outre le pare-feu avec notre systegraveme de liste noire bloque une partie des

attaques qui peuvent nous parvenir

Nos diffeacuterents scripts de pare-feu de gestion drsquoun mail entrant associeacute au

webmail permettent agrave un utilisateur drsquoacceacuteder aux fonctions usuelles associeacutees agrave

lrsquoenvoi et la reacuteception de mails

Gracircce agrave sa configuration personnalisable notre projet devrait pouvoir ecirctre

porteacute sur un domaine et une adresse IP diffeacuterente sans soucis et ecirctre deacuteployeacute

partout ougrave des gens souhaitent conserver leur vie priveacutee

Nous regretterons cependant de ne pas avoir exploiteacute la partie eacutenergeacutetique

de ce projet qui portait une probleacutematique inteacuteressante et qui nous parait importante

dans le monde actuel

Ce projet nous aura occupeacute pendant tregraves longtemps et nous sommes fiers du

travail que nous avons accompli Il est agrave nos yeux la preuve de ce que nous savons et

pouvons faire et nous donnera confiance pour notre deacutebut de carriegravere drsquoingeacutenieur

Sources

httpwwwradicaticomwpwp-contentuploads201401Email-Statistics-R

eport-2014-2018-Executive-Summarypdf

httpwwwcommentcamarchenetcontents525-le-protocole-ldap

httpsfrwikipediaorgwikiSimple_Mail_Transfer_Protocol

httpwwwcommentcamarchenetcontents536-pop3-smtp-imap-protocol

es-de-messagerie

httpstoolsietforghtmlrfc2821

httpsfrwikipediaorgwikiInternet_Message_Access_Protocol

httpstoolsietforghtmlrfc3501

httparstechnicacominformation-technology201402how-to-run-your-ow

n-e-mail-server-with-your-own-domain-part-1

httpswwwraspberrypiorgforumsviewtopicphpp=136912

httpstackoverflowcomquestions17394356how-can-i-make-a-bash-com

mand-run-periodically

httpuntroubledorgnullmailer

httpelinuxorgRPi_Hardware

httpraspitv2015raspberry-pi2-power-and-performance-measurement

Annexe 1 Architecture du systegraveme de fichiers

Annexe 2 Scan DNSSTUFF

Depuis httpwwwdnsstuffcomtoolsdnsReport|type=domainampampvalue=intimailpw

Annexe 3 Vue geacuteneacuterale httpswwwintimailpw

Annexe 4 Envoyer un mail

Annexe 5 Boite de reacuteception

Annexe 6 Interface drsquoadministration

Annexe 7 Gestion drsquoun utilisateur

Tutorial installation intimailtrade

Table des matiegraveres Apregraves une nouvelle installation de lrsquoOS 2

Seacutecurisation du serveur 2

Changement de lrsquoutilisateur par deacutefaut 2

Changement du port SSH 2

Interdire lrsquoauthentification SSH pour root 2

Installation de LDAP 3

Configuration de base 3

Configuration des Scheacutemas 4

Constitution de la base de donneacutees LDAP 5

Installation de Postfix 7

Installation de Bind9 8

Installation du paquet Debian et configuration de lighttpd 9

Deacutependances 11

Sources 12

2

Apregraves une nouvelle installation de lrsquoOS Exeacutecutez ces commandes pour mettre agrave jour agrave la derniegravere version Ces opeacuterations peuvent prendre un certain

temps Nous avons utiliseacute pour cet exemple Raspbian Jessie Lite sur une Raspberry Pi 2

apt-get update

apt-get upgrade ampamp apt-get dist-upgrade

apt-get install linux-headers-$(uname -r)

reboot

Puis lancer

raspi-config

Etendre au maximum lrsquoespace de stockage en navigant dans les menus

Expand Filesystem

Reacutegler une ip statique avec la box fichier etcnetworkinterfaces

iface eth0 inet static

address 192168131

netmask 2552552550

gateway 19216811

Nous avons aussi supprimeacute wpasupplicant

Seacutecurisation du serveur

Changement de lrsquoutilisateur par deacutefaut Changez le nom drsquoutilisateur par deacutefaut ainsi que son mot de passe

sudo passwd root

Sortie et login en tant que root puis

usermod -l myuname pi

usermod -m -d homemyuname myuname

groupmod ndashn myuname pi

passwd myuname

Voir cette adresse pour lrsquoutilisation de cleacutes priveacuteespubliques

Changement du port SSH sed ndashi sPort 22Port 2222g etcsshsshd_config

Interdire lrsquoauthentification SSH pour root sed -i sPermitRootLogin yesPermitRootLogin nog etcsshsshd_config

3

Installation de LDAP

Configuration de base Installation du package

apt-get install slapd

Choisir un mot de passe administrateur puis lancer la commande

dpkg-reconfigure slapd

Reacutepondre non agrave la question 1

Entrez le nom de domaine utiliseacute agrave la question 2 sous la forme domainetld

Entrez ce que vous voulez au 3egraveme eacutecran le nom de lrsquoorganisation ne sera pas utiliseacute

Entrez un mot de passe

Choisissez HDB

Choisissez si la base de donneacutees est supprimeacutee agrave la deacutesinstallation de slapd

Deacuteplacez lrsquoancienne base de donneacutees

Nrsquoutilisez pas LDAPv2

Installer les outils de conversion pour ldap (slaptest ldapmodify notamment)

apt-get install ldap-utils

On peut maintenant veacuterifier que la configuration est valable

ldapsearch -x -h localhost -b dc=domainedc=tld -LLL dc=domaine dn

Cette commande doit retourner quelque chose comme

dn dc=domainedc=tld

Il faut maintenant seacutecuriser le serveur LDAP en effet on peut y acceacuteder en anonyme avec la commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=config

(amp(objectClass=olcDatabaseConfig)(olcSuffix=dc=domainedc=tld))

Cette commande retourne un certain nombre drsquoinformations notamment agrave propos des champs suivants

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by none

olcAccess 1to dnbase= by read

olcAccess 2to by read

On va modifier ces champs avec la commande ldapmodify Pour cela on va creacuteer un fichier ldif

cat gt changeAccessldif ltlt EOF

dn olcDatabase=1hdbcn=config

changetype modify

delete olcAccess

-

add olcAccess

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by dn=cn=admindc=domainedc=tld write by none

-

add olcAccess

olcAccess 1to dnbase= by read

-

4

add olcAccess

olcAccess 2to by self write by dn=cn=admindc=domainedc=tld write by

none

-

EOF

On peut maintenant appliquer les changements avec ldapmodify

ldapmodify ndashc ndashY EXTERNAL ndashH ldapi -f changeAccessldif

La commande devrait vous confirmer que la modification srsquoest bien effectueacutee

SASLEXTERNAL authentication started

SASL username gidNumber=0+uidNumber=0cn=peercredcn=externalcn=auth

SASL SSF 0

modifying entry olcDatabase=1hdbcn=config

On peut veacuterifier qursquoon ne peut plus acceacuteder aux informations avec la commande

ldapsearch -x -c -h localhost -b dc=domainedc=tld

On peut veacuterifier la configuration en se connectant en tant qursquoadministrateur

ldapsearch -c -h localhost -b dc=domainedc=tld -D

cn=admindc=domainedc=tld ndashW

Configuration des Scheacutemas Nous allons utiliser les scheacutemas de courier-ldap Pour eacuteviter une manipulation compliqueacutee vous trouverez

directement le scheacutema avec le fichier authldapschema On place ce fichier dans le dossier

mv authldapschema etcldapschema

Nous creacuteons un fichier qui incluera tous les scheacutemas de base en plus du nouveau On peut les afficher avec la

commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

Creacuteation du fichier de configuration pour notre exemple cela donne

mkdir tmpldapconf

cat gt tmpldapconfldapconf ltlt EOF

include etcldapschemacoreschema

include etcldapschemacosineschema

include etcldapschemanisschema

include etcldapschemainetorgpersonschema

include etcldapschemaauthldapschema

EOF

On lance ensuite la commande

slaptest -f tmpldapconfldapconf -F tmpldapconf

Elle revoie un message de succegraves Cette commande a creacuteeacute dans le reacutepertoire tmpldapconf une arborescence

correspondant agrave la configuration de notre LDAP

On modifie le chemin de configuration

5

sed ndashi 0dnauthldap sauthldapauthldapcn=schemacn=config

cn=authldapldif

On supprime ensuite les 7 derniegraveres lignes du fichier

head -n -7 cn=authldapldif gt tmpldif

mv tmpldif cn=authldapldif

On peut maintenant importer notre fichier de configuration Pour ce faire

ldapadd -Y EXTERNAL -H ldapi -f

tmpldapconfcn=configcn=schemacn=authldapldif

Si tout va bien lrsquoentreacutee devrait avoir eacuteteacute ajouteacutee On peut veacuterifier avec la commande vue tout agrave lrsquoheure

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

On devrait voir en plus le nouveau scheacutema authldap

Constitution de la base de donneacutees LDAP Le remplissage de la base se fait agrave lrsquoaide de fichiers ldif Nous donnons ici un exemple de structure

Fichier pour la structure de base

dn dc=maildc=domainedc=tld

o intimailpw

description Global mail tree

dc mail

objectClass top

objectClass dcObject

objectClass organization

dn dc=peopledc=maildc=domainedc=tld

description Informations of all users

o people

dc people

objectClass top

objectClass dcObject

objectClass organization

dn dc=groupsdc=maildc=domainedc=tld

description All groups of users

o groups

dc groups

objectClass top

objectClass dcObject

objectClass organization

6

Fichier pour ajouter un utilisateur

dn cn=jbonddc=peopledc=maildc=domainedc=tld

uid jbond

mail jbonddomainetld

sn Moulin

givenName James

displayName James Bond

mailbox domainetldjbond

quota 50M

homeDirectory homevmail

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAccount

userPassword SSHA367PSXiUAegy8dpJbPU8OepEf8L5ye

Pour obtenir un hash du mot de passe

slappasswd -s password -h SSHA

On peut par la suite ajouter la configuration agrave la base de donneacutees avec la commande

ldapadd -D cn=admindc=domainedc=tld -W -h localhost -f pathtofile

Si les champs proposeacutes ne sont pas suffisants il faudra alors effectuer les modifications dans le fichier autldapschema

proposeacute plus haut et refaire la manipulation de configuration

De plus les standards du Mail deacutecrit par lrsquoIETF (RFC822 63 RFC1123 527 and RFC2821 451) impliquent drsquoavoir une

adresse Postmaster et une Abuse Pour cela nous pourrions creacuteer ces adresses avec la meacutethode vue au-dessus mais

ce nrsquoest pas la meilleure Il est preacutefeacuterable drsquoutiliser un alias comme nous le ferons avec les listes de diffusion Ici nous

proposons de rediriger ces deux adresses vers une adresse administrateur Pour cela la meacutethode est la mecircme sauf

que le fichier ldif nrsquoest pas tout agrave fait identique En voici un exemple

dn cn=postmasterdc=groupsdc=maildc=domainedc=tld

uid postmaster

mail postmasterdomainetld

sn Postmaster

displayName Postmaster

maildrop admindomainetld

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAlias

Pour faire une liste de diffusion la meacutethode est la mecircme Il suffit drsquoajouter toutes les adresses destinataires dans le

champ maildrop seacutepareacutees par des virgules ()

7

Installation de Postfix Installation des packages

apt-get install postfix postfix-ldap

Lors de lrsquoinstallation deux eacutecrans deacutefilent

- Configuration Internet Site

- Valeur par deacutefaut pour le mail name

On creacutee lrsquoutilisateur qui servira agrave exeacutecuter Postfix

groupadd vmail

useradd -g vmail -d homevmail -s binfalse -m vmail

Nous aurons besoin dans la suite des GID et UID creacuteeacutes agrave cet instant Ils peuvent ecirctre afficheacutes avec les commandes

cat etcgroup | grep vmail | cut -d -f3

cat etcpasswd | grep vmail | cut -d -f3

On ajoute les paramegravetres au fichier etcpostfixmaincf (remplacer les valeurs de GID et drsquoUID avec vos valeurs)

smtpd_banner = maildomainetld

virtual_mailbox_base = homevmail

virtual_mailbox_domains = dmainetld

virtual_mailbox_maps = ldapetcpostfixldap_accountscf

virtual_alias_maps = ldapetcpostfixldap_aliasescf

virtual_minimum_uid = 100

virtual_gid_maps = static1001 Remplacez ici par votre valeur de GID

virtual_uid_maps = static1001 Remplacez ici par votre valeur drsquoUID

Il nous faut maintenant constituer nos fichiers de configuration ldap_accountscf

cat gt etcpostfixldap_accountscf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=peopledc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAccount)(mail=s))

result_attribute = mailbox

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

Et pour ldap_aliasescf

cat gt ldap_aliasescf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=groupsdc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAlias)(mail=s))

result_attribute = maildrop

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

8

On peut maintenant veacuterifier la configuration de Postfix avec (cette commande ne doit rien retourner si crsquoest bon)

postfix check

Si crsquoest bon alors on recharge le serveur

postfix reload

On peut alors faire un envoi de mail test via telnet

telnet localhost 25

Si vous souhaitez deacutelivrer les mails agrave votre maniegravere il faut dans le fichier etcpostfixmaincf la ligne

virtual_transport = nomdevotreregle

Et de mecircme dans le fichier etcpostfixmastercf

nomdevotreregle unix - n n - 5 pipe

flags=Rq user=vmail null_sender=

argv=chemindevotreprogramme

Il nous reste maintenant agrave configurer les diffeacuterents enregistrements DNS neacutecessaire au fonctionnement drsquoun serveur

mail Vous pouvez utiliser la solution de votre choix Dans la suite vous trouverez une meacutethode utilisant Bind9

Installation de Bind9 Dans toute cette partie on se situera dans le dossier etcbind Dans la suite notre IP sera abcd

Dans le fichier namedconfoptions on ajoutera dans le champ options

version Not supported

Dans un dossier zones on eacutecrit le fichier dbdomainetld

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122111 Serial

43200 Refresh

3600 Retry

2419200 Expire

86400 ) Negative Cache TTL

IN NS nsdomainetld

IN NS ns11ovhnet

ns IN A abcd

www IN A abcd

IN A abcd

IN MX 10 maildomainetld

mail IN A abcd

Dans le mecircme dossier zones on a cbain-addrarpa

9

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122101 serial

14400 refresh

3600 retry

604800 expire

10800 minimum

)

cbain-addrarpa IN NS nsdomainetld

cbain-addrarpa IN NS ns11ovhnet

d IN PTR maildomainetld

Il faut faire attention agrave bien increacutementer le serial pour chaque modification des fichiers

Dans le fichier namedconflocal

zone domainetld

type master

file etcbindzonesdbdomainetld

allow-transfer 213251128130

notify yes

zone cbain-addrarpa IN

type master

file etcbindzonescbain-addrarpa

allow-transfer 213251128130

Ici 213251128130 est lrsquoadresse IP du serveur ns11ovhnet

Il faut bien sucircr configurer le DNS avec votre fournisseur (Gandi OVH hellip) Pour ccedila amusez-vous bien Vous pouvez

aussi tester votre configuration avec des outils en ligne tels que DNSstuff

En test final si votre configuration est bonne vous devriez pouvoir envoyer un mail depuis un service neutre (Gmail

yahoo hellip) et le voir dans votre arborescence (ici homevmaildomainetld)

Installation du paquet Debian et configuration de lighttpd

Commencez par reacutecupeacuterer le paquet deb agrave lrsquoadresse suivante httpswwwintimailpwintimaildeb

Installez ensuite GDebi Il srsquoagit drsquoun dpkg ameacutelioreacute pour teacuteleacutecharger les deacutependances automatiquement ce que

dpkg ne gegravere pas

apt-get update

apt-get install gdebi-core

10

Vous pouvez alors installer le paquet

gdebi intimaildeb

Vous aurez alors le site web drsquointiMail deacuteployeacute au chemin varwwwwebmail

Il ne vous reste plus qursquoagrave changer la configuration de lighttpd votre serveur web pour mettre en ligne le site

Vous pouvez pour cela copier-coller la configuration suivante mais veillez agrave bien changer lrsquoadresse IP preacutesente au

deacutebut de la partie SSL CONFIG avec votre adresse IP

serv ermodules = ( mod_access

mod_accesslog

mod_alias

mod_compress

mod_redirect

mod_rewrite

)

Hide server version

servertag = Such Headers Very try Now close telnet

serverdocument-root = varwwwwebmail

serverupload-dirs = ( varwwwwebmailuploads )

servererrorlog = varloglighttpderrorlog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

serverport = 80

accesslogformat = V h l u t r gts b Refereri

User-Agenti

accesslogfilename = varloglighttpdaccesslog

index-filenames = ( indexphp indexhtml

indexlighttpdhtml )

urlaccess-deny = ( ~ inc )

static-fileexclude-extensions = ( php pl fcgi )

compresscache-dir = varcachelighttpdcompress

compressfiletype = ( applicationjavascript textcss

texthtml textplain )

default listening port for IPv6 falls back to the IPv4 port

include_shell usrsharelighttpduse-ipv6pl + serverport

include_shell usrsharelighttpdcreate-mimeassignpl

include_shell usrsharelighttpdinclude-conf-enabledpl

SSL CONFIG

$SERVER[socket] == 5234485443

sslengine = enable

11

sslpemfile = etclighttpdsslintimailpwpem

sslca-file = etclighttpdsslintimailpwcrt

servername = intimailpw

votre configuration habituelle pour ce domaine

serverdocument-root = varwwwwebmail

servererrorlog = varloglighttpderror_ssllog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

Rewrite des URL pour masquer php

urlrewrite-once = ( ^()$ =gt $1 )

urlrewrite-if-not-file = ( ^([^])()$ =gt $1php$2 )

servernetwork-backend = writev

Deacutependances Slapd

Ldap-utils

Postfix

Postfix-ldap

Bind9

Lighttpd

12

Sources httpswikigandinetfrhostingusing-linuxtutorialsdebianmail-server-ldap

httpwwwpostfixorgpipe8html

httpwwwpostfixorgFILTER_READMEhtml

httpwwwpostfixorg

httpwwwpostfixorgtransport5html

Page 3: Système d'hébergement domestique...place sur les domaines .pw par Gandi.net, notre fournisseur. Nous n’avons donc pas pu l’implémenter. Nous avons configuré Postfix pour qu’il

Contexte amp Objectifs

Contexte

Aujourdrsquohui avec lrsquoarriveacutee de lrsquoInternet dans notre quotidien quasiment tout le

monde possegravede une adresse mail Ce systegraveme fut une veacuteritable reacutevolution dans la

maniegravere dont les Hommes communiquent entre eux augmentant de faccedilon

drastique la vitesse des eacutechanges et la productiviteacute des Entreprises

Apregraves 20 ans drsquoexistence les services de mail ont fleuri sur la toile

Doreacutenavant il est possible de creacuteer une boicircte demessagerie en quelques instants et

drsquoenvoyer des messages agrave lrsquoinfini

Quelques statistiques sur le mail en 2015 drsquoapregraves The Radicati Group

4 353 millions de comptes

2 586 millions drsquoutilisateurs

205 milliards de mails envoyeacutes par jour

Le problegraveme crsquoest qursquoaujourdrsquohui toutes les grosses entreprise du domaine

des technologies de linformation rognent de plus en plus sur la vie priveacutee de leurs

utilisateurs Le contenu de nos conversations nrsquoest parfois plus notre proprieacuteteacute

Lrsquoobjectif de notre projet est de donner la possibiliteacute agrave nrsquoimporte qui de

deacuteployer son propre service de mail seacutecuriseacute heacutebergeacute sur sa propre machine

Objectifs

Ce projet doit permettre agrave tout utilisateur de creacuteer quelques comptes de

messagerie sur un systegraveme embarqueacute de type Raspberry et permettre de conserver

les donneacutees agrave la maison

Le systegraveme doit ecirctre constitueacute agrave base de standards (Base LDAP serveur de

messagerie connu et maintenu pareillement pour le client de messagerie)

Linterface dadministration doit ecirctre elle aussi tregraves simple dutilisation

En outre le systegraveme devra ecirctre capable de distinguer des niveaux de

privilegraveges entre les utilisateurs geacuterer des groupes drsquoutilisateurs les quotas et devra

rester le moins eacutenergivore et le plus leacuteger possible Nous devons de plus rendre le

code le plus geacuteneacuterique possible afin de lrsquoempaqueter et le deacuteployer sur un systegraveme

quelconque sans soucis

Enfin un effort particulier doit ecirctre porteacute sur lalimentation du systegraveme

embarqueacute Il est notamment demandeacute de mettre au point une alimentation agrave base

deacutenergie renouvelable (comme un panneau solaire) permettant dalimenter

totalement ou partiellement le systegraveme

Fig 1 Une Raspberry Pi

Cahier des Charges

Mateacuteriel et logiciels utiliseacutes

Pour ce projet nous avons utiliseacute jusqursquoici le mateacuteriel suivant

1 Raspberry Pi 2

1 Carte micro SD 8 Go

1 Cacircble USBmicro USB

1 Cacircble RJ45

En outre nous avons installeacute les logiciels suivants

Une distribution Debian Jessie pour Raspberry

Un serveur web Lighttpd

Un serveur mail Postfix

Un serveur DNS Bind

Un serveur drsquoannuaire OpenLDAP

Le module PHP5 pour Lighttpd

Nous avons deacuteveloppeacute nos diffeacuterents codes en Shell ou Perl directement sous

Debian et le code pour la partie web est eacutecrit en PHP sous lrsquoIDE NetBeans

Dans le deacutetail

Dans le deacutetail lideacutee est de deacutevelopper un systegraveme autonome et fonctionnel

Autrement dit les diffeacuterents packages et fonctionnaliteacutes installeacutees sur la Raspberry

ainsi que linterface utilisateur sur le site web et lrsquoaspect eacutenergeacutetique

Voici les diffeacuterentes fonctionnaliteacutes que nous avons impleacutementeacutees

Serveur Mail

Postfix pour le protocole SMTP

Systegraveme leacuteger pas de protocoles IMAPPOP en plus tout en web

Gestion particuliegravere des gros mails et notamment de leurs piegraveces jointes

Deacutecodage et encodage base 64 des piegraveces jointes

Support de la reacuteception de piegraveces jointes multiples

Gestion des utilisateurs

Plusieurs comptes en utilisant LDAP

La possibiliteacute de sidentifier en tant quadministrateur

Listes de diffusion et groupes

Antivirus amp gestion des spams

iptables scripts shellperl de deacutetection par les logs drsquoattaques puis

mise en place de regravegles iptables via ces mecircmes scripts

Antispam maison synchronisation sur les blacklists existantes et

fiables rejet drsquoun spam

Nom de domaine et enregistrements associeacutes

Enregistrement A deacutefinit lrsquoadresse de nom drsquoun serveur web

Enregistrement MX deacutefinit lrsquoadresse de nom drsquoun serveur mail

Sauvegarde automatique peacuteriodique de la Raspberry Pi

Interface web

Gestion des comptes (creacuteation modification suppression)

Gestion des listes de diffusions

Gestion des quotas

Affichage du courrier

Paquets deb installable sur tout systegraveme Debian

Incluant un document explicatif pour lrsquoinstallation et la configuration

particuliegravere agrave apporter

Systegraveme pouvant ecirctre autonome en eacutenergie

Au coeur du projet

Gestion des utilisateurs - Le serveur LDAP

Comme il lrsquoeacutetait suggeacutereacute dans lrsquoeacutenonceacute du sujet nous nous sommes

inteacuteresseacutes agrave la solution LDAP Il srsquoagit drsquoun protocole de gestion drsquoannuaire baseacute sur

TCPIP Dans un premier temps nous avons penseacute agrave creacuteer un systegraveme de base de

donneacutees utilisant un simple systegraveme de fichiers car nous avions trouveacute ce systegraveme

trop compliqueacute agrave configurer agrave utiliser et trop lourd bien que plus leacuteger qursquoune Base

de Donneacutees classique

Cependant LDAP srsquoavegravere ecirctre un systegraveme parfaitement adapteacute pour la

gestion drsquoinformations utilisateurs En effet cette tacircche requiert beaucoup plus de

lectures que drsquoeacutecritures ce pourquoi LDAP est optimiseacute Ce programme preacutesente

lrsquoavantage de privileacutegier la lecture et disposes de nombreuses API dans les

langages de programmation divers dont PHP que nous utilisons crsquoest pourquoi

nous avons deacutecideacute de lrsquoutiliser

Le modegravele drsquoinformation de LDAP est baseacute sur des entreacutees Chacune drsquoentre

elles est un ensemble drsquoattributs Les informations sont organiseacutees sous la forme

drsquoun arbre Pour notre projet nous avons retenu la structure suivante

Fig 2 Structure de lrsquoannuaire LDAP

Nous avons ici deacutetermineacute des champs agrave renseigner pour constituer un

utilisateur En particulier un utilisateur dispose des attributs suivants

Son identiteacute (nom preacutenom(s))

Son identifiant utilisateur (UID) sous la forme comme agrave Polytech

initiale+nom(+chiffre) Son adresse mail compegravete sous la forme UIDdomainetld

Le chemin de sa boicircte mail sur le systegraveme domaineUID

Son quota (en octets)

Son mot de passe encrypteacute en SSHA

Fig 3 Une personne dans lrsquoannuaire LDAP

Les utilisateurs sont enregistreacutes dans la branche ldquopeoplerdquo de notre annuaire

Nous avons de plus une seconde branche ldquogroupsrdquo Celle-ci contient les listes de

diffusion Elle contient aussi le groupe particulier admins utilisateurs qui ont droit agrave

des options drsquoadministration sur le webmail

Fig 4 Un groupe dans lrsquoannuaire LDAP

On peut remarquer que pour la gestion des listes de diffusion nous avons

choisi de relier une personne agrave un groupe par son UID Ainsi lrsquoappartenance drsquoun

utilisateur agrave un groupe se traduit par la preacutesence de son adressemail dans lrsquoattribut

maildrop du groupe

Cela nous permet de geacuterer de maniegravere pratique les groupes auquels

appartient un utilisateur et inversement de sortir la liste des utilisateurs drsquoun groupe

avec une simple commande de typeldapsearch sur le serveur LDAP Pour ajouter ou

supprimer un utilisateur agrave un groupe il suffira de modifier lrsquoattribut maildrop du

groupe

Serveurs SMTP et DNS

Pour cette partie nous avons utiliseacute lrsquoexcellent Postfix Crsquoest une solution de

messagerie eacutelectronique libre rapide leacutegegravere seacutecuriseacutee et facile agrave administrer Crsquoest

aussi le serveur mail par deacutefaut dans plusieurs systegravemes de type UNIX Il permet

notamment drsquoeacuteviter une bonne partie du spam avec une configuration simple et

accessible

Il est important aussi de respecter les speacutecifications de la RFC Nous avons eu

la surprise de voir qursquoil est ldquoimpeacuteratifrdquo drsquoavoir deux adresses particuliegraveres sur le

serveur postmaster et abuse Ce sont les premiegraveres victimes des attaques par force

brute

La configuration de Postfix se fait de maniegravere eacutetroite avec Bind le serveur de

nom de domaine que nous avons installeacute En effet pour que Postfix fonctionne il est

essentiel que lrsquoenregistrement MX du serveur DNS fonctionne Crsquoest un type

drsquoenregistrement particulier qui permet la mise en place drsquoun serveur mail

De plus il est neacutecessaire de faire un enregistrement PTR qui correspond agrave au

DNS inverse Il nrsquoest pas indispensable au fonctionnement du serveur mail en soit

mais la plupart des fournisseurs de ce type de service se servent de cet

enregistrement pour contrer une partie du spam Il est donc possible que les mails

drsquoun serveur soient bloqueacutes si lrsquoenregistrement PTR est mal configureacute

Parallegravelement nous avons aussi proceacutedeacute agrave lrsquoenregistrement A qui permet la

mise en place drsquoun serveurWeb neacutecessaire agrave notreWebmail Nous avons utiliseacute des

outils en ligne tel que DNSStuff pour tester notre configuration dont un exemple se

trouve en annexe Notons par contre que la technologie DNSSEC nrsquoest pas mise en

place sur les domaines pw par Gandinet notre fournisseur Nous nrsquoavons donc pas

pu lrsquoimpleacutementer

Nous avons configureacute Postfix pour qursquoil utilise notre annuaire LDAP Il est

possible agrave ce stade de tester la configuration avec telnet et drsquoenvoyer unmail Apregraves

cela nous avons testeacute le bon fonctionnement du serveur en envoyant avec succegraves

un mail vers une boicircte mail exteacuterieure de type gmail

Nous nous sommes alors heurteacutes aux protections du Service Informatique de

lrsquoUniversiteacute (CRI) qui bloque le port 25 en sortie et en entreacutee en dehors de lrsquouniversiteacute

Pour nous astreindre de ces restrictions nous avons migreacute notre serveur vers une

nouvelle connexion SDSL exteacuterieure au reacuteseau de Lille 1 Cela a eacuteteacute pour nous un

moyen de veacuterifier en partie la portabiliteacute de notre systegraveme puisque nous utilisons une

toute nouvelle connexion avec une nouvelle adresse IP Nous avons donc ducircmettre

agrave jour notre serveur de nom pour refleacuteter ces changements La migration srsquoest

passeacutee sans soucis avec un deacutelai de propagation des changements drsquoenviron 1

heure Le systegraveme est resteacute fonctionnel agrave 100 notamment parce que dans notre

code nous faisons appel au serveur par localhost ou une variable et jamais

directement lrsquoadresse IP ou le domaine Cependant nous nrsquoavons pas pu veacuterifier la

migration vers un domaine diffeacuterent bien que cela ne reste normalement qursquoune

variable dans les fichiers de configuration de lrsquointerface

Gestion du Spam

Comme preacutevu nous avons apporteacute une solution agrave la gestion du spam sur

notre serveur Postfix propose dans ses paramegravetres lrsquoutilisation de services de

DNSBL (DNS Black List) Cette technologie reprend le mecircme principe que les

serveurs de noms classiques Postfix soumet une requecircte de type DNS aux serveurs

de liste noire deacutefinis dans sa configuration et le serveur indique si ce nom de

domaine est preacutesent dans sa liste ou non On peut de cette maniegravere rejeter une

bonne partie du trafic mail correspondant au Spam et ce tregraves facilement

Malgreacute cela nous pensons qursquoune partie du Spam passera agrave travers les

mailles du filet Il aurait eacuteteacute inteacuteressant de traiter ceux-ci pour les classer comme

indeacutesirables et pouvoir ainsi les afficher dans lrsquointerface web

Serveur Web et Webmail

Un serveur web leacuteger

Initialement nous sommes partis sur une solution classique agrave base drsquoun

serveur web Apache qui nous a permis de deacutebuter le deacuteveloppement de lrsquointerface

Cependant comme nous cherchons agrave alleacuteger un maximum le systegraveme nous nous

sommes pencheacutes sur une autre solution Lighttpd Ce serveur web vise comme son

nom lrsquoindique la performance et la leacutegegravereteacute Sur le mecircme contenu avec une

connexion Tregraves Haut Deacutebit (100Mbps) nous chargeons deacutesormais la page de vue

geacuteneacuterale en 042s (Lighttpd) contre 170s avant (Apache 2) avec le navigateur

Chrome sans cache

Une architecture optimiseacutee

Lrsquoutiliteacute de reacutealiser notre propre webmail est dans un premier temps de

srsquoabstenir de lrsquoinstallation drsquoun serveur IMAPPOP puisque nous retrouvons

nous-mecircmes le contenu Dans un second temps il nous permet de ne garder que les

fonctionnaliteacutes neacutecessaires agrave notre webmail sans superflu

Fig 5 La vue geacuteneacuterale de notre webmail

Gracircce agrave PHP et agrave son module drsquointerface avec LDAP nous pouvons identifier

un utilisateur avec son nom drsquoutilisateur et son mot de passe sur le serveur local

LDAP et ainsi retrouver nombreuses informations utiles comme le quota actuel

autoriseacute son nom entier le chemin drsquoaccegraves agrave son reacutepertoire dans lesquels sont ses

mails sur le systegraveme de fichiershellip

Fig 6 Lrsquoarchitecture du dossier drsquoun utilisateur des dossier sent et inbox contenant les

mails bruts un dossier json dans lequel sont placeacutes les entecirctes des mails ainsi que le quota

Chaque en-tecircte de mail est eacutecrite dans un fichier json distinct par boicircte (un

fichier pour la boicircte de reacuteception un fichier pour les mails envoyeacuteshellip) ce qui nous

permet de montrer agrave lutilisateur la liste des mails dune boicircte sans traitement lourds

en arriegravere plan pour le serveur Ces fichiers sont renseigneacutes par un script lanceacute agrave la

reacuteception drsquoun mail par postfix du cocircteacute reacuteception et par lrsquointerface web elle mecircme

pour lrsquoeacutemission Lrsquoen-tecircte drsquoun mail est eacutecrite dans un conteneur JSONde lamaniegravere

suivante

Fig 7 Exemple drsquoentreacutee dans un fichier json

Gracircce tout cela nous pouvons afficher simplement le contenu des diffeacuterentes

boicirctes mail dans des tableaux sur lrsquointerface gracircce aux en-tecirctes et par la suite

retrouver et afficher le contenu drsquoun mail agrave partir de son fichier brut sur lequel

lrsquoutilisateur aura cliqueacute comme on le verra un peu plus loin

Toujours dans un souci drsquoameacutelioration des performances le strict neacutecessaire

est geacuteneacuteralement chargeacute sur les pages web par exemple en venant de la vue

geacuteneacuterale lorsqursquoon clique surInboxseule la partie inteacuterieure de la page est chargeacutee

on ne recharge pas le bandeau du haut de page ou lemenu de gauche agrave lamaniegravere

drsquoun MVC classique

Envoyer des courriels

Toute cette architecture ne doit pas nous faire oublier le but premier envoyer

et recevoir des mails Pour envoyer des mails crsquoest tregraves simple on peut soit cliquer

dans le bandeau du haut sur ldquoQuick Emailrdquo qui permet sur lamecircme page drsquoenvoyer

un email rapide et sans piegravece-jointe soit cliquer dans la barre de navigation sur le

cocircteacute sur ldquoWrite a new emailrdquo ce qui nous megravene vers une page deacutedieacutee permettant

drsquoeacutecrire un email incluant une piegravece jointe

Fig 8 Envoyer un mail crsquoest simple comme bonjour

On peut remarquer sur cette capture drsquoeacutecran que lrsquoon ne peut envoyer que

certains types de piegraveces jointes Nous supportons JPG PNG GIF PDF et ZIP Si la

piegravece jointe est drsquoun autre format elle est rejeteacutee La veacuterification du type srsquoeffectue

sur lrsquoextension du fichier et sur son type MIME ce qui eacutevite par exemple que

quelqursquoun modifie lrsquoextension drsquoun fichierexe en fichierjpg pour lrsquoenvoyer La piegravece

jointe doit de plus avoir une taille infeacuterieure agrave la taille maximale drsquoune piegravece jointe

parameacutetreacutee par lrsquoadministrateur comme nous le verrons dans lrsquointerface

drsquoadministration

Si tous ces critegraveres sont bons on eacutecrit lemail au format brut deacutecrit par la RFC

puis on lrsquoexpeacutedie agrave lrsquoaide de la fonction mail de PHP Si cette fonction nrsquoeacutechoue pas

crsquoest que le mail est expeacutedieacute avec succegraves on peut alors mettre agrave jour le quota

drsquoespace disque maximum autoriseacute agrave lrsquoutilisateur en increacutementant celui-ci avec la

taille du mail qui vient drsquoecirctre envoyeacute ainsi que creacuteer un fichiermail brut sur le disque

pour pouvoir afficher le mail dans la boicircte drsquoenvoi et en garder une trace

Notons que comme crsquoest lrsquoutilisateur web du systegraveme (www-data) qui exeacutecute

la fonction nous modifions les en-tecirctes du mail afin que le destinataire reccediloive un

mail de la part de ldquoPreacutenom Nomrdquo depuis lrsquoadresse ldquopnomdomainetldrdquo plutocirct que

ldquowww-datadomaintldrdquo par deacutefaut

La migration vers une IP externe agrave Lille 1 eacutetant reacuteussie nous pouvons bien

envoyer des mails depuis notre interface qui sont reccedilus agrave lrsquoexteacuterieur sans soucis

Mais aussi en recevoir

Recevoir des mails est tout aussi important Nous avons vu lrsquoarchitecture en

arriegravere-plan mais au final agrave quoi cela ressemble-t-il pour lrsquoutilisateur Il dispose en

fait en cliquant sur Inbox (ou Sent Spam ou Trash eacutegalement) drsquoun accegraves agrave sa boicircte

de reacuteception Drsquoun clic srsquoaffichent alors agrave lui tous les mails qursquoil a reccedilu

Fig 9 La boicircte de reacuteception

On remarque notamment les fonctions de recherche drsquoactualisation du

tableau de choix des colonnes agrave afficher on peut classiquement choisir combien de

lignes on affiche par page changer de pages etchellip

Lorsque lrsquoon clique sur un des lignes les donneacutees de lrsquoen-tecircte du mails sont

passeacutes en paramegravetres agrave une autre page qui drsquoapregraves ces informations retrouve le

fichier mail brut le traite et lrsquoaffiche

Fig 10 Un mail contenant 3 piegraveces jointes et un message

Comme on peut le voir nous pouvons recevoir desmails avec plusieurs piegraveces

jointes Nous avons ici preacutesenteacute la boicircte de reacuteception mais les autres boicirctes

fonctionnent de maniegravere similaire

Interface drsquoadministration

Le systegraveme de webmail possegravede plusieurs variables des listes de diffusion

des compteshellipMais on veut pouvoir donner les droits agrave un utilisateur demodifier tout

cela En effet si nous trouvons cela abordable drsquoajouter un utilisateur avec une

commande dans le shell il faut aussi penser agrave lrsquoutilisateur final qui preacutefegravere peut-ecirctre

le confort drsquoune interface deacutedieacutee pour geacuterer son serveur mail plutocirct que le terminal

De maniegravere tregraves simple un utilisateur appartenant au groupes drsquoutilisateurs

ldquoAdministrateursrdquo est reconnu en tant qursquoadministrateur par lrsquointerface et peut

cliquer sur un bouton ldquoManagerdquo dans le panneau lateacuteral qui nrsquoest visible qursquoaux

administrateurs De lagrave il arrive sur la page suivante

Fig 11 lrsquointerface drsquoadministration

Sur cette interface il peut choisir la taille maximale des piegraveces jointes

changer le nom de domaine sur lequel est installeacute lrsquointerface et dont deacutependent

toutes les adresses (domaine) Il est aussi possible de modifier directement ces

variables en modifiant le fichier includeconfigincphp Pratique notamment si lrsquoon

a renseigneacute un mauvais nom de domaine agrave la configuration et que lrsquoon arrive plus agrave

acceacuteder agrave lrsquointerface

Il peut aussi creacuteer un nouveau compte en renseignant les champs preacutenom

nom mot de passe et quota Lrsquoutilisateur peut ensuite une fois son compte creacutee

directement se connecter avec son identifiant (initiale preacutenom + nom) et mot de

passe Lors de la creacuteation du compte un mail de bienvenue est envoyeacute au nouvel

utilisateur ce qui permet en arriegravere-plan de creacuteer tous les dossiers utilisateurs et

fichiers en-tecirctes utiles agrave lrsquointerface une fois pour toutes

Lrsquoadministrateur peut aussi ajouter une liste de diffusion (assimileacutee agrave un

groupe) ou en supprimer une parmi les listes existantes

En outre lrsquoadministrateur peut aussi modifier les donneacutees drsquoun utilisateur

Pour cela sur la preacutesente page il peut seacutelectionner un utilisateur parmi la liste des

utilisateurs existants ce qui le redirige vers la page de gestion des comptes

Fig 12 La gestion drsquoun compte seacutelectionneacute ici celui de James Bond

A ce stade il peut changer lrsquoUID de lrsquoutilisateur (utile en cas de conflit) le nom

le mot de passe le quota de cet utilisateur et lrsquoajouter ou le retirer drsquoune liste de

diffusion Accessoirement il peut aussi supprimer le compte en cliquant sur lrsquoeacutenorme

bouton rouge qui lui demandera deux fois de suite de confirmer son action afin

drsquoeacuteviter les erreurs de clic Cette action entraicircne la suppression de lrsquoutilisateur de

toutes les listes de diffusion auxquelles il appartient la suppression de son compte

dans la branche people de lrsquoarbre LDAP et la suppression deacutefinitive de son dossier

utilisateur sur le disquesystegraveme de fichiers impliquant donc la perte de ses mails

Architecture du systegraveme de fichiers

Comme nous lrsquoavons dit plus haut lrsquoideacutee est de se passer des meacutecanismes

classiques avec les clients mails habituels Ces serveurs srsquoalourdissent

geacuteneacuteralement en utilisant des serveurs IMAPPOP3 et un meacutecanisme

drsquoauthentification SMTP

Pour adapter ces fonctionnaliteacutes agrave notre systegraveme nous avons donc constitueacute

une architecture pour organiser les fichiers qui transitent Vous pourrez voir un

scheacutema reacutecapitulatif en annexe 1

Dans la premiegravere moitieacute du projet les mails eacutetaient deacutelivreacutes par Postfix Nous

utilisions un script exeacutecuteacute lors de la reacuteception drsquounmail pour les traiter de lamaniegravere

que nous voulions Cette meacutethode avait les inconveacutenients drsquoecirctre lourde et pas

efficace agrave 100 En effet seuls les mails reccedilus depuis lrsquoexteacuterieur eacutetaient

correctement traiteacutes

Deacutesormais les mails sont traiteacutes totalement par notre script Cela nous

permet de geacuterer les mails dans des dossiers organiseacutes agrave notre maniegravere et de

recevoir les mails locaux crsquoest-agrave-dire entre utilisateurs du mecircme domaine Cette

nouvelle meacutethode regravegle aussi drsquoautres problegravemes notamment au niveau des

permissions sur les fichiers

Pour reacuteduire le nombre drsquoopeacuterations et pour profiter des fonctionnaliteacutes

offertes par le framework utiliseacute pour lrsquointerface web nous regroupons des

informations sur chacun des mails reccedilus sous la forme de fichiers JSON Pour ce

faire lrsquoideacutee est drsquoexeacutecuter un script lorsque leacutevegravenement ldquoreacuteception drsquoun mailrdquo

survient Postfix offre cette possibiliteacute dans sa configuration Or il se trouve qursquoil nrsquoest

pas si simple de reacutecupeacuterer le chemin du fichier contenant le mail car le nom du

fichier creacutee est sous la forme Timestamp UNIX10 Caractegraveres aleacuteatoires (ex

14562336185A8D43E97F)

La seconde probleacutematique est que le webmail doit avoir la possibiliteacute de

pouvoir lire les fichiers pour afficher les mails sur son interface Or il semble que

Postfix les eacutecrit en autorisant uniquement son utilisateur en lecture Il nous a fallu

trouver une solution pour remeacutedier agrave cela Nous avons choisi drsquoajouter www-data

(utilisateur du serveur web) au groupe vmail et de modifier les droits sur les fichiers

de sorte que les utilisateurs de ce groupe puissent lire les fichiers

Nous avons revu une partie de lrsquoorganisation des fichiers pour reacutecupeacuterer les

piegraveces jointes si elles sont preacutesentes Le script que nous avons eacutecrit reacutecupegravere le

fichier original du mail et le deacutecoupe en eacuteleacutements simples dans des fichier distincts

corps du mail et diffeacuterentes piegraveces jointes De cette maniegravere pour afficher un mail

nous nrsquoavons pas besoin de charger la totaliteacute du fichier Dans le cas ougrave il y a des

piegraveces jointes cela aurait ralenti lrsquoaffichage des informations

Nous avons eacutegalement impleacutementeacute la gestion des quotas Dans lrsquoeacutetat actuel

des choses srsquoil nrsquoy a plus de place disponible pour lrsquoutilisateur le mail nrsquoest tout

bonnement pas deacutelivreacute agrave ce destinataire Lrsquoideacuteal aurait eacuteteacute de notifier leacutemetteur avec

un mail ce qui nrsquoest pour lrsquoinstant pas le cas mais qui pourrait ecirctre reacutesolu en

renvoyant agrave postfix un code drsquoerreur deacutefini

Pour terminer nous avons revu la totaliteacute du code deacuteveloppeacute Nous sommes

passeacute du Bash au Perl Ce dernier est plus performant et plus simple agrave utiliser et agrave

lire

Firewall

Un autre gros morceau du projet mais qui nrsquoest pas speacutecifiquement lieacute agrave la

probleacutematique du mail crsquoest la seacutecurisation du serveur En effet apregraves avoir mis en

ligne notre serveur des pirates ont tregraves vite tenteacute de peacuteneacutetrer le systegraveme

Globalement les attaques eacutetaient de type force brute sur les services heacutebergeacutes sur

notre Raspberry neacutecessitant une identification tels que SSH SMTP hellip

On retrouve ici un petit point faible du protocole SMTP Eacutetant donneacute que

chaque serveur mail doit avoir une adresse postmaster et abuse lrsquoattaquant a agrave sa

disposition deux adresses agrave attaquer Ceci dit ce type drsquoattaque est simple agrave

contrecarrer car il suffit de limiter dans le temps le nombre de tentatives de

connexions

La contre-mesure que nous avons mis en place est simple une seacuterie de

regravegles Iptables En reacutesumeacute nous avons opteacute pour un systegraveme de liste blanche et

noire Les adresses IPs de la liste blanche sont autoriseacutees agrave utiliser la totaliteacute des

services (notamment SSH) tandis que celles de la liste noire sont totalement

ignoreacutees Les autres IPs nrsquoont accegraves qursquoau webmail

Eacutetant donneacute que le nombre drsquoIPs attaquant notre serveur nrsquoa cesseacute

drsquoaugmenter nous avons automatiseacute la mise agrave jour de la liste de noire en

deacuteveloppant un script pour Cron Ce script est exeacutecuteacute une fois par heure A ce jour

notre liste noire contient 47 adresses Bien sucircr ce systegraveme est susceptible drsquoecirctre

modifieacute agrave convenance pour passer sur une solution deacutedieacutee telle que Fail2ban qui fait

en fait ce qursquoon fait deacutejagrave (eacutetudier les logs et bannir des IP avec iptables) avec des

regravegles preacutedeacutefinies par la communauteacute et personnalisables En effet nous nous

attendons agrave voir la varieacuteteacute et le nombre drsquoattaques augmenter apregraves avoir migreacute sur

une IP non proteacutegeacutee par le firewall de lrsquoUniversiteacute puisque nous nrsquoavons plus la

premiegravere ligne de deacutefense du CRI en particulier pour le port 389 (LDAP) qui eacutetait

bloqueacute par lrsquouniversiteacute et srsquoest retrouveacute en premiegravere ligne apregraves la migration Nous

avons donc ajouteacute une regravegle bloquant tout le trafic entrant vers le port 389 hormis

localhost

Package drsquoinstallation

Nous avons creacutee un package deb contenant les sources du webmail ainsi

que des scripts utiles agrave lrsquoinstallation et au fonctionnement du serveur Nous avons

deacuteveloppeacute des scripts de configuration automatique pour LDAP et Postfix Comme

dpkg ne supporte pas directement lrsquoinstallation automatique des deacutependances

nous recommandons drsquoinstaller avant tout le paquet gdebi-core qui est en fait un

dpkg ameacutelioreacute Gracircce agrave la commande gdebi paquetdeb toutes les deacutependances

seront installeacutees en particulier postfix le serveur ldap le serveur web lighttpd entre

autres sans soucis Il est agrave noter que comme les scripts de configuration des

diffeacuterents services ne sont que partiellement impleacutementeacutes dans le paquet deb nous

fournissons en annexe un README complet et illustreacute qui explique pas agrave pas

comment faire fonctionner notre systegraveme sur nrsquoimporte quel Linux en particulier les

lignes de configuration des diffeacuterents services agrave changer et un exemplaire des

fichiers de configuration fonctionnels de ces services

Gestion de lrsquoeacutenergie

Une consideacuteration importante pour un systegraveme autonome Drsquoapregraves les fiches

techniques notre modegravele de Raspberry Pi (B 2) est officiellement eacutevalueacute avec un

fonctionnement agrave ~650mA pour 5V De nombreux proprieacutetaires de ce systegraveme

eacutequipeacutes se sont amuser agrave veacuterifier la consommation eacutelectrique reacuteelle de leur Pi 2 B

sous diffeacuterentes charges On pourra retenir cette eacutetude (lien en sitegraphie) qui

relegraveve la consommation en courant en fonction de lrsquoactiviteacute lanceacutee sur la Pi mais

aussi en charge sur 1 agrave 4 CPU

Ces chiffres sont releveacutes sur un systegraveme avec cameacutera connecteacutee HDMI connecteacute et

cacircble ethernet brancheacute et actif

On peut constater que globalement notre systegraveme Pi 2 B tournant sans

interface graphique sans composant suppleacutementaire sans sortie videacuteo ni cameacutera

avec plusieurs serveurs tournant tout en restant le plus leacuteger possible et demeurant

~99 idle la plupart du temps ne devrait pas deacutepasser une consommation de

300mA grand maximum

Fig 13 Un processeur tregraves tregraves peu chargeacute et une meacutemoire relativement libre

Nous avions lrsquoanneacutee derniegravere deacutejagrave reacutealiseacute un circuit permettant drsquoadapter un

panneau solaire sur une batterie USB classique de 9000mAh Nous avions alors pu

mesurer lrsquointensiteacute deacutelivreacutee par le panneau solaire En cas drsquoensoleillement moyen

habituel dans nos contreacutees le panneau solaire deacutebitait 400mA et pouvait atteindre

le double quand le soleil eacutetait directement preacutesent pour environ 800mA deacutebiteacute

Ce panneau solaire accompagneacute de son circuit drsquoadaptation devrait donc

suffire pour alimenter notre systegraveme la journeacutee le brancher ensuite sur une batterie

portable permet de stocker le surplus pour la nuit

Fig 14 le circuit drsquoadaptation

Fig 15 et son PCB

Eacutevolutions possibles

Webmail

Concernant les eacutevolutions possibles que nous aurions aimeacute apporter agrave notre

projet avec plus de temps commenccedilons par le web Nous aurions souhaiteacute apporter

la gestion de lrsquoenvoi de plusieurs piegraveces jointes comme nous lrsquoavons fait pour la

reacuteception

De plus nous aurions voulu inteacutegrer une corbeille ougrave lesmessages pourraient

aller avant drsquoecirctre deacutefinitivement supprimeacutes du systegraveme drsquoautant que nous avons

deacutejagrave eacutecrites les fonctions PHP permettant de retirer une en-tecircte drsquoun fichier JSON et

le fichier mail associeacute

Enfin nous aurions aimeacute en plus du blocage deacutejagrave preacutesent impleacutementer une

gestion plus profonde des piegravece jointes permettant notamment le remplissage de la

boicircte de spams

Systegraveme

Il aurait eacuteteacute inteacuteressant de notifier lrsquoexpeacutediteur lorsque le mail nrsquoa pas pu ecirctre

deacutelivreacute agrave un utilisateur lorsque son quota est plein En toute logique cela devrait ecirctre

fait simplement avec la commande Sendmail

Une meilleur gestion du trafic mail indeacutesirable aurait eacuteteacute la bienvenue En

effet malgreacute la limitation du spam il restera toujours une partie du volume de mail

qui sera indeacutesirable (pub pishing scam hellip)

Eacutetant donneacute la taille du systegraveme nous avions penseacute agrave une approche

ldquomachine learningrdquo Lrsquoutilisateur indiquerait pourquoi il considegravere le mail comme

indeacutesirable constituant des regravegles refusant certains mails Les mails provenant de

cet expeacutediteur pourraient ecirctre deacutetecteacute par le script agrave la reacuteception et

automatiquement envoyeacutes dans la boicircte de spams

Partie eacutenergeacutetique

Mecircme si la solution au panneau solaire ne pose aucun problegraveme en theacuteorie

nous aurions deacutejagrave dans un premier temps aimeacute lrsquoimpleacutementer en pratique Nous

nrsquoavons finalement pas reacutealiseacute notre objectif de deacutetecter deux cas drsquoalimentation

diffeacuterents soit lrsquoalimentation via panneau solaire est suffisante dans ce cas il

alimente la batterie et donc la Raspberry soit quand ce courant nrsquoest pas suffisant

on alimente la batterie par le secteur

Conclusion

En conclusion nous pensons avoir reacutepondu au cahier des charges initial dans

sa majeure partie Nous sommes aujourdrsquohui en mesure de proposer une solution

mail domestique priveacutee et personnalisable par un particulier

Notre installation de Debian a eacuteteacute au maximum alleacutegeacutee pour notre utilisation

sans interface graphique et nous avons mis en place une reacuteponse aux diverses

attaques que nous avons pu subir lors de lamise en place de notre solution logicielle

En outre le pare-feu avec notre systegraveme de liste noire bloque une partie des

attaques qui peuvent nous parvenir

Nos diffeacuterents scripts de pare-feu de gestion drsquoun mail entrant associeacute au

webmail permettent agrave un utilisateur drsquoacceacuteder aux fonctions usuelles associeacutees agrave

lrsquoenvoi et la reacuteception de mails

Gracircce agrave sa configuration personnalisable notre projet devrait pouvoir ecirctre

porteacute sur un domaine et une adresse IP diffeacuterente sans soucis et ecirctre deacuteployeacute

partout ougrave des gens souhaitent conserver leur vie priveacutee

Nous regretterons cependant de ne pas avoir exploiteacute la partie eacutenergeacutetique

de ce projet qui portait une probleacutematique inteacuteressante et qui nous parait importante

dans le monde actuel

Ce projet nous aura occupeacute pendant tregraves longtemps et nous sommes fiers du

travail que nous avons accompli Il est agrave nos yeux la preuve de ce que nous savons et

pouvons faire et nous donnera confiance pour notre deacutebut de carriegravere drsquoingeacutenieur

Sources

httpwwwradicaticomwpwp-contentuploads201401Email-Statistics-R

eport-2014-2018-Executive-Summarypdf

httpwwwcommentcamarchenetcontents525-le-protocole-ldap

httpsfrwikipediaorgwikiSimple_Mail_Transfer_Protocol

httpwwwcommentcamarchenetcontents536-pop3-smtp-imap-protocol

es-de-messagerie

httpstoolsietforghtmlrfc2821

httpsfrwikipediaorgwikiInternet_Message_Access_Protocol

httpstoolsietforghtmlrfc3501

httparstechnicacominformation-technology201402how-to-run-your-ow

n-e-mail-server-with-your-own-domain-part-1

httpswwwraspberrypiorgforumsviewtopicphpp=136912

httpstackoverflowcomquestions17394356how-can-i-make-a-bash-com

mand-run-periodically

httpuntroubledorgnullmailer

httpelinuxorgRPi_Hardware

httpraspitv2015raspberry-pi2-power-and-performance-measurement

Annexe 1 Architecture du systegraveme de fichiers

Annexe 2 Scan DNSSTUFF

Depuis httpwwwdnsstuffcomtoolsdnsReport|type=domainampampvalue=intimailpw

Annexe 3 Vue geacuteneacuterale httpswwwintimailpw

Annexe 4 Envoyer un mail

Annexe 5 Boite de reacuteception

Annexe 6 Interface drsquoadministration

Annexe 7 Gestion drsquoun utilisateur

Tutorial installation intimailtrade

Table des matiegraveres Apregraves une nouvelle installation de lrsquoOS 2

Seacutecurisation du serveur 2

Changement de lrsquoutilisateur par deacutefaut 2

Changement du port SSH 2

Interdire lrsquoauthentification SSH pour root 2

Installation de LDAP 3

Configuration de base 3

Configuration des Scheacutemas 4

Constitution de la base de donneacutees LDAP 5

Installation de Postfix 7

Installation de Bind9 8

Installation du paquet Debian et configuration de lighttpd 9

Deacutependances 11

Sources 12

2

Apregraves une nouvelle installation de lrsquoOS Exeacutecutez ces commandes pour mettre agrave jour agrave la derniegravere version Ces opeacuterations peuvent prendre un certain

temps Nous avons utiliseacute pour cet exemple Raspbian Jessie Lite sur une Raspberry Pi 2

apt-get update

apt-get upgrade ampamp apt-get dist-upgrade

apt-get install linux-headers-$(uname -r)

reboot

Puis lancer

raspi-config

Etendre au maximum lrsquoespace de stockage en navigant dans les menus

Expand Filesystem

Reacutegler une ip statique avec la box fichier etcnetworkinterfaces

iface eth0 inet static

address 192168131

netmask 2552552550

gateway 19216811

Nous avons aussi supprimeacute wpasupplicant

Seacutecurisation du serveur

Changement de lrsquoutilisateur par deacutefaut Changez le nom drsquoutilisateur par deacutefaut ainsi que son mot de passe

sudo passwd root

Sortie et login en tant que root puis

usermod -l myuname pi

usermod -m -d homemyuname myuname

groupmod ndashn myuname pi

passwd myuname

Voir cette adresse pour lrsquoutilisation de cleacutes priveacuteespubliques

Changement du port SSH sed ndashi sPort 22Port 2222g etcsshsshd_config

Interdire lrsquoauthentification SSH pour root sed -i sPermitRootLogin yesPermitRootLogin nog etcsshsshd_config

3

Installation de LDAP

Configuration de base Installation du package

apt-get install slapd

Choisir un mot de passe administrateur puis lancer la commande

dpkg-reconfigure slapd

Reacutepondre non agrave la question 1

Entrez le nom de domaine utiliseacute agrave la question 2 sous la forme domainetld

Entrez ce que vous voulez au 3egraveme eacutecran le nom de lrsquoorganisation ne sera pas utiliseacute

Entrez un mot de passe

Choisissez HDB

Choisissez si la base de donneacutees est supprimeacutee agrave la deacutesinstallation de slapd

Deacuteplacez lrsquoancienne base de donneacutees

Nrsquoutilisez pas LDAPv2

Installer les outils de conversion pour ldap (slaptest ldapmodify notamment)

apt-get install ldap-utils

On peut maintenant veacuterifier que la configuration est valable

ldapsearch -x -h localhost -b dc=domainedc=tld -LLL dc=domaine dn

Cette commande doit retourner quelque chose comme

dn dc=domainedc=tld

Il faut maintenant seacutecuriser le serveur LDAP en effet on peut y acceacuteder en anonyme avec la commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=config

(amp(objectClass=olcDatabaseConfig)(olcSuffix=dc=domainedc=tld))

Cette commande retourne un certain nombre drsquoinformations notamment agrave propos des champs suivants

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by none

olcAccess 1to dnbase= by read

olcAccess 2to by read

On va modifier ces champs avec la commande ldapmodify Pour cela on va creacuteer un fichier ldif

cat gt changeAccessldif ltlt EOF

dn olcDatabase=1hdbcn=config

changetype modify

delete olcAccess

-

add olcAccess

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by dn=cn=admindc=domainedc=tld write by none

-

add olcAccess

olcAccess 1to dnbase= by read

-

4

add olcAccess

olcAccess 2to by self write by dn=cn=admindc=domainedc=tld write by

none

-

EOF

On peut maintenant appliquer les changements avec ldapmodify

ldapmodify ndashc ndashY EXTERNAL ndashH ldapi -f changeAccessldif

La commande devrait vous confirmer que la modification srsquoest bien effectueacutee

SASLEXTERNAL authentication started

SASL username gidNumber=0+uidNumber=0cn=peercredcn=externalcn=auth

SASL SSF 0

modifying entry olcDatabase=1hdbcn=config

On peut veacuterifier qursquoon ne peut plus acceacuteder aux informations avec la commande

ldapsearch -x -c -h localhost -b dc=domainedc=tld

On peut veacuterifier la configuration en se connectant en tant qursquoadministrateur

ldapsearch -c -h localhost -b dc=domainedc=tld -D

cn=admindc=domainedc=tld ndashW

Configuration des Scheacutemas Nous allons utiliser les scheacutemas de courier-ldap Pour eacuteviter une manipulation compliqueacutee vous trouverez

directement le scheacutema avec le fichier authldapschema On place ce fichier dans le dossier

mv authldapschema etcldapschema

Nous creacuteons un fichier qui incluera tous les scheacutemas de base en plus du nouveau On peut les afficher avec la

commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

Creacuteation du fichier de configuration pour notre exemple cela donne

mkdir tmpldapconf

cat gt tmpldapconfldapconf ltlt EOF

include etcldapschemacoreschema

include etcldapschemacosineschema

include etcldapschemanisschema

include etcldapschemainetorgpersonschema

include etcldapschemaauthldapschema

EOF

On lance ensuite la commande

slaptest -f tmpldapconfldapconf -F tmpldapconf

Elle revoie un message de succegraves Cette commande a creacuteeacute dans le reacutepertoire tmpldapconf une arborescence

correspondant agrave la configuration de notre LDAP

On modifie le chemin de configuration

5

sed ndashi 0dnauthldap sauthldapauthldapcn=schemacn=config

cn=authldapldif

On supprime ensuite les 7 derniegraveres lignes du fichier

head -n -7 cn=authldapldif gt tmpldif

mv tmpldif cn=authldapldif

On peut maintenant importer notre fichier de configuration Pour ce faire

ldapadd -Y EXTERNAL -H ldapi -f

tmpldapconfcn=configcn=schemacn=authldapldif

Si tout va bien lrsquoentreacutee devrait avoir eacuteteacute ajouteacutee On peut veacuterifier avec la commande vue tout agrave lrsquoheure

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

On devrait voir en plus le nouveau scheacutema authldap

Constitution de la base de donneacutees LDAP Le remplissage de la base se fait agrave lrsquoaide de fichiers ldif Nous donnons ici un exemple de structure

Fichier pour la structure de base

dn dc=maildc=domainedc=tld

o intimailpw

description Global mail tree

dc mail

objectClass top

objectClass dcObject

objectClass organization

dn dc=peopledc=maildc=domainedc=tld

description Informations of all users

o people

dc people

objectClass top

objectClass dcObject

objectClass organization

dn dc=groupsdc=maildc=domainedc=tld

description All groups of users

o groups

dc groups

objectClass top

objectClass dcObject

objectClass organization

6

Fichier pour ajouter un utilisateur

dn cn=jbonddc=peopledc=maildc=domainedc=tld

uid jbond

mail jbonddomainetld

sn Moulin

givenName James

displayName James Bond

mailbox domainetldjbond

quota 50M

homeDirectory homevmail

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAccount

userPassword SSHA367PSXiUAegy8dpJbPU8OepEf8L5ye

Pour obtenir un hash du mot de passe

slappasswd -s password -h SSHA

On peut par la suite ajouter la configuration agrave la base de donneacutees avec la commande

ldapadd -D cn=admindc=domainedc=tld -W -h localhost -f pathtofile

Si les champs proposeacutes ne sont pas suffisants il faudra alors effectuer les modifications dans le fichier autldapschema

proposeacute plus haut et refaire la manipulation de configuration

De plus les standards du Mail deacutecrit par lrsquoIETF (RFC822 63 RFC1123 527 and RFC2821 451) impliquent drsquoavoir une

adresse Postmaster et une Abuse Pour cela nous pourrions creacuteer ces adresses avec la meacutethode vue au-dessus mais

ce nrsquoest pas la meilleure Il est preacutefeacuterable drsquoutiliser un alias comme nous le ferons avec les listes de diffusion Ici nous

proposons de rediriger ces deux adresses vers une adresse administrateur Pour cela la meacutethode est la mecircme sauf

que le fichier ldif nrsquoest pas tout agrave fait identique En voici un exemple

dn cn=postmasterdc=groupsdc=maildc=domainedc=tld

uid postmaster

mail postmasterdomainetld

sn Postmaster

displayName Postmaster

maildrop admindomainetld

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAlias

Pour faire une liste de diffusion la meacutethode est la mecircme Il suffit drsquoajouter toutes les adresses destinataires dans le

champ maildrop seacutepareacutees par des virgules ()

7

Installation de Postfix Installation des packages

apt-get install postfix postfix-ldap

Lors de lrsquoinstallation deux eacutecrans deacutefilent

- Configuration Internet Site

- Valeur par deacutefaut pour le mail name

On creacutee lrsquoutilisateur qui servira agrave exeacutecuter Postfix

groupadd vmail

useradd -g vmail -d homevmail -s binfalse -m vmail

Nous aurons besoin dans la suite des GID et UID creacuteeacutes agrave cet instant Ils peuvent ecirctre afficheacutes avec les commandes

cat etcgroup | grep vmail | cut -d -f3

cat etcpasswd | grep vmail | cut -d -f3

On ajoute les paramegravetres au fichier etcpostfixmaincf (remplacer les valeurs de GID et drsquoUID avec vos valeurs)

smtpd_banner = maildomainetld

virtual_mailbox_base = homevmail

virtual_mailbox_domains = dmainetld

virtual_mailbox_maps = ldapetcpostfixldap_accountscf

virtual_alias_maps = ldapetcpostfixldap_aliasescf

virtual_minimum_uid = 100

virtual_gid_maps = static1001 Remplacez ici par votre valeur de GID

virtual_uid_maps = static1001 Remplacez ici par votre valeur drsquoUID

Il nous faut maintenant constituer nos fichiers de configuration ldap_accountscf

cat gt etcpostfixldap_accountscf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=peopledc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAccount)(mail=s))

result_attribute = mailbox

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

Et pour ldap_aliasescf

cat gt ldap_aliasescf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=groupsdc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAlias)(mail=s))

result_attribute = maildrop

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

8

On peut maintenant veacuterifier la configuration de Postfix avec (cette commande ne doit rien retourner si crsquoest bon)

postfix check

Si crsquoest bon alors on recharge le serveur

postfix reload

On peut alors faire un envoi de mail test via telnet

telnet localhost 25

Si vous souhaitez deacutelivrer les mails agrave votre maniegravere il faut dans le fichier etcpostfixmaincf la ligne

virtual_transport = nomdevotreregle

Et de mecircme dans le fichier etcpostfixmastercf

nomdevotreregle unix - n n - 5 pipe

flags=Rq user=vmail null_sender=

argv=chemindevotreprogramme

Il nous reste maintenant agrave configurer les diffeacuterents enregistrements DNS neacutecessaire au fonctionnement drsquoun serveur

mail Vous pouvez utiliser la solution de votre choix Dans la suite vous trouverez une meacutethode utilisant Bind9

Installation de Bind9 Dans toute cette partie on se situera dans le dossier etcbind Dans la suite notre IP sera abcd

Dans le fichier namedconfoptions on ajoutera dans le champ options

version Not supported

Dans un dossier zones on eacutecrit le fichier dbdomainetld

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122111 Serial

43200 Refresh

3600 Retry

2419200 Expire

86400 ) Negative Cache TTL

IN NS nsdomainetld

IN NS ns11ovhnet

ns IN A abcd

www IN A abcd

IN A abcd

IN MX 10 maildomainetld

mail IN A abcd

Dans le mecircme dossier zones on a cbain-addrarpa

9

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122101 serial

14400 refresh

3600 retry

604800 expire

10800 minimum

)

cbain-addrarpa IN NS nsdomainetld

cbain-addrarpa IN NS ns11ovhnet

d IN PTR maildomainetld

Il faut faire attention agrave bien increacutementer le serial pour chaque modification des fichiers

Dans le fichier namedconflocal

zone domainetld

type master

file etcbindzonesdbdomainetld

allow-transfer 213251128130

notify yes

zone cbain-addrarpa IN

type master

file etcbindzonescbain-addrarpa

allow-transfer 213251128130

Ici 213251128130 est lrsquoadresse IP du serveur ns11ovhnet

Il faut bien sucircr configurer le DNS avec votre fournisseur (Gandi OVH hellip) Pour ccedila amusez-vous bien Vous pouvez

aussi tester votre configuration avec des outils en ligne tels que DNSstuff

En test final si votre configuration est bonne vous devriez pouvoir envoyer un mail depuis un service neutre (Gmail

yahoo hellip) et le voir dans votre arborescence (ici homevmaildomainetld)

Installation du paquet Debian et configuration de lighttpd

Commencez par reacutecupeacuterer le paquet deb agrave lrsquoadresse suivante httpswwwintimailpwintimaildeb

Installez ensuite GDebi Il srsquoagit drsquoun dpkg ameacutelioreacute pour teacuteleacutecharger les deacutependances automatiquement ce que

dpkg ne gegravere pas

apt-get update

apt-get install gdebi-core

10

Vous pouvez alors installer le paquet

gdebi intimaildeb

Vous aurez alors le site web drsquointiMail deacuteployeacute au chemin varwwwwebmail

Il ne vous reste plus qursquoagrave changer la configuration de lighttpd votre serveur web pour mettre en ligne le site

Vous pouvez pour cela copier-coller la configuration suivante mais veillez agrave bien changer lrsquoadresse IP preacutesente au

deacutebut de la partie SSL CONFIG avec votre adresse IP

serv ermodules = ( mod_access

mod_accesslog

mod_alias

mod_compress

mod_redirect

mod_rewrite

)

Hide server version

servertag = Such Headers Very try Now close telnet

serverdocument-root = varwwwwebmail

serverupload-dirs = ( varwwwwebmailuploads )

servererrorlog = varloglighttpderrorlog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

serverport = 80

accesslogformat = V h l u t r gts b Refereri

User-Agenti

accesslogfilename = varloglighttpdaccesslog

index-filenames = ( indexphp indexhtml

indexlighttpdhtml )

urlaccess-deny = ( ~ inc )

static-fileexclude-extensions = ( php pl fcgi )

compresscache-dir = varcachelighttpdcompress

compressfiletype = ( applicationjavascript textcss

texthtml textplain )

default listening port for IPv6 falls back to the IPv4 port

include_shell usrsharelighttpduse-ipv6pl + serverport

include_shell usrsharelighttpdcreate-mimeassignpl

include_shell usrsharelighttpdinclude-conf-enabledpl

SSL CONFIG

$SERVER[socket] == 5234485443

sslengine = enable

11

sslpemfile = etclighttpdsslintimailpwpem

sslca-file = etclighttpdsslintimailpwcrt

servername = intimailpw

votre configuration habituelle pour ce domaine

serverdocument-root = varwwwwebmail

servererrorlog = varloglighttpderror_ssllog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

Rewrite des URL pour masquer php

urlrewrite-once = ( ^()$ =gt $1 )

urlrewrite-if-not-file = ( ^([^])()$ =gt $1php$2 )

servernetwork-backend = writev

Deacutependances Slapd

Ldap-utils

Postfix

Postfix-ldap

Bind9

Lighttpd

12

Sources httpswikigandinetfrhostingusing-linuxtutorialsdebianmail-server-ldap

httpwwwpostfixorgpipe8html

httpwwwpostfixorgFILTER_READMEhtml

httpwwwpostfixorg

httpwwwpostfixorgtransport5html

Page 4: Système d'hébergement domestique...place sur les domaines .pw par Gandi.net, notre fournisseur. Nous n’avons donc pas pu l’implémenter. Nous avons configuré Postfix pour qu’il

Objectifs

Ce projet doit permettre agrave tout utilisateur de creacuteer quelques comptes de

messagerie sur un systegraveme embarqueacute de type Raspberry et permettre de conserver

les donneacutees agrave la maison

Le systegraveme doit ecirctre constitueacute agrave base de standards (Base LDAP serveur de

messagerie connu et maintenu pareillement pour le client de messagerie)

Linterface dadministration doit ecirctre elle aussi tregraves simple dutilisation

En outre le systegraveme devra ecirctre capable de distinguer des niveaux de

privilegraveges entre les utilisateurs geacuterer des groupes drsquoutilisateurs les quotas et devra

rester le moins eacutenergivore et le plus leacuteger possible Nous devons de plus rendre le

code le plus geacuteneacuterique possible afin de lrsquoempaqueter et le deacuteployer sur un systegraveme

quelconque sans soucis

Enfin un effort particulier doit ecirctre porteacute sur lalimentation du systegraveme

embarqueacute Il est notamment demandeacute de mettre au point une alimentation agrave base

deacutenergie renouvelable (comme un panneau solaire) permettant dalimenter

totalement ou partiellement le systegraveme

Fig 1 Une Raspberry Pi

Cahier des Charges

Mateacuteriel et logiciels utiliseacutes

Pour ce projet nous avons utiliseacute jusqursquoici le mateacuteriel suivant

1 Raspberry Pi 2

1 Carte micro SD 8 Go

1 Cacircble USBmicro USB

1 Cacircble RJ45

En outre nous avons installeacute les logiciels suivants

Une distribution Debian Jessie pour Raspberry

Un serveur web Lighttpd

Un serveur mail Postfix

Un serveur DNS Bind

Un serveur drsquoannuaire OpenLDAP

Le module PHP5 pour Lighttpd

Nous avons deacuteveloppeacute nos diffeacuterents codes en Shell ou Perl directement sous

Debian et le code pour la partie web est eacutecrit en PHP sous lrsquoIDE NetBeans

Dans le deacutetail

Dans le deacutetail lideacutee est de deacutevelopper un systegraveme autonome et fonctionnel

Autrement dit les diffeacuterents packages et fonctionnaliteacutes installeacutees sur la Raspberry

ainsi que linterface utilisateur sur le site web et lrsquoaspect eacutenergeacutetique

Voici les diffeacuterentes fonctionnaliteacutes que nous avons impleacutementeacutees

Serveur Mail

Postfix pour le protocole SMTP

Systegraveme leacuteger pas de protocoles IMAPPOP en plus tout en web

Gestion particuliegravere des gros mails et notamment de leurs piegraveces jointes

Deacutecodage et encodage base 64 des piegraveces jointes

Support de la reacuteception de piegraveces jointes multiples

Gestion des utilisateurs

Plusieurs comptes en utilisant LDAP

La possibiliteacute de sidentifier en tant quadministrateur

Listes de diffusion et groupes

Antivirus amp gestion des spams

iptables scripts shellperl de deacutetection par les logs drsquoattaques puis

mise en place de regravegles iptables via ces mecircmes scripts

Antispam maison synchronisation sur les blacklists existantes et

fiables rejet drsquoun spam

Nom de domaine et enregistrements associeacutes

Enregistrement A deacutefinit lrsquoadresse de nom drsquoun serveur web

Enregistrement MX deacutefinit lrsquoadresse de nom drsquoun serveur mail

Sauvegarde automatique peacuteriodique de la Raspberry Pi

Interface web

Gestion des comptes (creacuteation modification suppression)

Gestion des listes de diffusions

Gestion des quotas

Affichage du courrier

Paquets deb installable sur tout systegraveme Debian

Incluant un document explicatif pour lrsquoinstallation et la configuration

particuliegravere agrave apporter

Systegraveme pouvant ecirctre autonome en eacutenergie

Au coeur du projet

Gestion des utilisateurs - Le serveur LDAP

Comme il lrsquoeacutetait suggeacutereacute dans lrsquoeacutenonceacute du sujet nous nous sommes

inteacuteresseacutes agrave la solution LDAP Il srsquoagit drsquoun protocole de gestion drsquoannuaire baseacute sur

TCPIP Dans un premier temps nous avons penseacute agrave creacuteer un systegraveme de base de

donneacutees utilisant un simple systegraveme de fichiers car nous avions trouveacute ce systegraveme

trop compliqueacute agrave configurer agrave utiliser et trop lourd bien que plus leacuteger qursquoune Base

de Donneacutees classique

Cependant LDAP srsquoavegravere ecirctre un systegraveme parfaitement adapteacute pour la

gestion drsquoinformations utilisateurs En effet cette tacircche requiert beaucoup plus de

lectures que drsquoeacutecritures ce pourquoi LDAP est optimiseacute Ce programme preacutesente

lrsquoavantage de privileacutegier la lecture et disposes de nombreuses API dans les

langages de programmation divers dont PHP que nous utilisons crsquoest pourquoi

nous avons deacutecideacute de lrsquoutiliser

Le modegravele drsquoinformation de LDAP est baseacute sur des entreacutees Chacune drsquoentre

elles est un ensemble drsquoattributs Les informations sont organiseacutees sous la forme

drsquoun arbre Pour notre projet nous avons retenu la structure suivante

Fig 2 Structure de lrsquoannuaire LDAP

Nous avons ici deacutetermineacute des champs agrave renseigner pour constituer un

utilisateur En particulier un utilisateur dispose des attributs suivants

Son identiteacute (nom preacutenom(s))

Son identifiant utilisateur (UID) sous la forme comme agrave Polytech

initiale+nom(+chiffre) Son adresse mail compegravete sous la forme UIDdomainetld

Le chemin de sa boicircte mail sur le systegraveme domaineUID

Son quota (en octets)

Son mot de passe encrypteacute en SSHA

Fig 3 Une personne dans lrsquoannuaire LDAP

Les utilisateurs sont enregistreacutes dans la branche ldquopeoplerdquo de notre annuaire

Nous avons de plus une seconde branche ldquogroupsrdquo Celle-ci contient les listes de

diffusion Elle contient aussi le groupe particulier admins utilisateurs qui ont droit agrave

des options drsquoadministration sur le webmail

Fig 4 Un groupe dans lrsquoannuaire LDAP

On peut remarquer que pour la gestion des listes de diffusion nous avons

choisi de relier une personne agrave un groupe par son UID Ainsi lrsquoappartenance drsquoun

utilisateur agrave un groupe se traduit par la preacutesence de son adressemail dans lrsquoattribut

maildrop du groupe

Cela nous permet de geacuterer de maniegravere pratique les groupes auquels

appartient un utilisateur et inversement de sortir la liste des utilisateurs drsquoun groupe

avec une simple commande de typeldapsearch sur le serveur LDAP Pour ajouter ou

supprimer un utilisateur agrave un groupe il suffira de modifier lrsquoattribut maildrop du

groupe

Serveurs SMTP et DNS

Pour cette partie nous avons utiliseacute lrsquoexcellent Postfix Crsquoest une solution de

messagerie eacutelectronique libre rapide leacutegegravere seacutecuriseacutee et facile agrave administrer Crsquoest

aussi le serveur mail par deacutefaut dans plusieurs systegravemes de type UNIX Il permet

notamment drsquoeacuteviter une bonne partie du spam avec une configuration simple et

accessible

Il est important aussi de respecter les speacutecifications de la RFC Nous avons eu

la surprise de voir qursquoil est ldquoimpeacuteratifrdquo drsquoavoir deux adresses particuliegraveres sur le

serveur postmaster et abuse Ce sont les premiegraveres victimes des attaques par force

brute

La configuration de Postfix se fait de maniegravere eacutetroite avec Bind le serveur de

nom de domaine que nous avons installeacute En effet pour que Postfix fonctionne il est

essentiel que lrsquoenregistrement MX du serveur DNS fonctionne Crsquoest un type

drsquoenregistrement particulier qui permet la mise en place drsquoun serveur mail

De plus il est neacutecessaire de faire un enregistrement PTR qui correspond agrave au

DNS inverse Il nrsquoest pas indispensable au fonctionnement du serveur mail en soit

mais la plupart des fournisseurs de ce type de service se servent de cet

enregistrement pour contrer une partie du spam Il est donc possible que les mails

drsquoun serveur soient bloqueacutes si lrsquoenregistrement PTR est mal configureacute

Parallegravelement nous avons aussi proceacutedeacute agrave lrsquoenregistrement A qui permet la

mise en place drsquoun serveurWeb neacutecessaire agrave notreWebmail Nous avons utiliseacute des

outils en ligne tel que DNSStuff pour tester notre configuration dont un exemple se

trouve en annexe Notons par contre que la technologie DNSSEC nrsquoest pas mise en

place sur les domaines pw par Gandinet notre fournisseur Nous nrsquoavons donc pas

pu lrsquoimpleacutementer

Nous avons configureacute Postfix pour qursquoil utilise notre annuaire LDAP Il est

possible agrave ce stade de tester la configuration avec telnet et drsquoenvoyer unmail Apregraves

cela nous avons testeacute le bon fonctionnement du serveur en envoyant avec succegraves

un mail vers une boicircte mail exteacuterieure de type gmail

Nous nous sommes alors heurteacutes aux protections du Service Informatique de

lrsquoUniversiteacute (CRI) qui bloque le port 25 en sortie et en entreacutee en dehors de lrsquouniversiteacute

Pour nous astreindre de ces restrictions nous avons migreacute notre serveur vers une

nouvelle connexion SDSL exteacuterieure au reacuteseau de Lille 1 Cela a eacuteteacute pour nous un

moyen de veacuterifier en partie la portabiliteacute de notre systegraveme puisque nous utilisons une

toute nouvelle connexion avec une nouvelle adresse IP Nous avons donc ducircmettre

agrave jour notre serveur de nom pour refleacuteter ces changements La migration srsquoest

passeacutee sans soucis avec un deacutelai de propagation des changements drsquoenviron 1

heure Le systegraveme est resteacute fonctionnel agrave 100 notamment parce que dans notre

code nous faisons appel au serveur par localhost ou une variable et jamais

directement lrsquoadresse IP ou le domaine Cependant nous nrsquoavons pas pu veacuterifier la

migration vers un domaine diffeacuterent bien que cela ne reste normalement qursquoune

variable dans les fichiers de configuration de lrsquointerface

Gestion du Spam

Comme preacutevu nous avons apporteacute une solution agrave la gestion du spam sur

notre serveur Postfix propose dans ses paramegravetres lrsquoutilisation de services de

DNSBL (DNS Black List) Cette technologie reprend le mecircme principe que les

serveurs de noms classiques Postfix soumet une requecircte de type DNS aux serveurs

de liste noire deacutefinis dans sa configuration et le serveur indique si ce nom de

domaine est preacutesent dans sa liste ou non On peut de cette maniegravere rejeter une

bonne partie du trafic mail correspondant au Spam et ce tregraves facilement

Malgreacute cela nous pensons qursquoune partie du Spam passera agrave travers les

mailles du filet Il aurait eacuteteacute inteacuteressant de traiter ceux-ci pour les classer comme

indeacutesirables et pouvoir ainsi les afficher dans lrsquointerface web

Serveur Web et Webmail

Un serveur web leacuteger

Initialement nous sommes partis sur une solution classique agrave base drsquoun

serveur web Apache qui nous a permis de deacutebuter le deacuteveloppement de lrsquointerface

Cependant comme nous cherchons agrave alleacuteger un maximum le systegraveme nous nous

sommes pencheacutes sur une autre solution Lighttpd Ce serveur web vise comme son

nom lrsquoindique la performance et la leacutegegravereteacute Sur le mecircme contenu avec une

connexion Tregraves Haut Deacutebit (100Mbps) nous chargeons deacutesormais la page de vue

geacuteneacuterale en 042s (Lighttpd) contre 170s avant (Apache 2) avec le navigateur

Chrome sans cache

Une architecture optimiseacutee

Lrsquoutiliteacute de reacutealiser notre propre webmail est dans un premier temps de

srsquoabstenir de lrsquoinstallation drsquoun serveur IMAPPOP puisque nous retrouvons

nous-mecircmes le contenu Dans un second temps il nous permet de ne garder que les

fonctionnaliteacutes neacutecessaires agrave notre webmail sans superflu

Fig 5 La vue geacuteneacuterale de notre webmail

Gracircce agrave PHP et agrave son module drsquointerface avec LDAP nous pouvons identifier

un utilisateur avec son nom drsquoutilisateur et son mot de passe sur le serveur local

LDAP et ainsi retrouver nombreuses informations utiles comme le quota actuel

autoriseacute son nom entier le chemin drsquoaccegraves agrave son reacutepertoire dans lesquels sont ses

mails sur le systegraveme de fichiershellip

Fig 6 Lrsquoarchitecture du dossier drsquoun utilisateur des dossier sent et inbox contenant les

mails bruts un dossier json dans lequel sont placeacutes les entecirctes des mails ainsi que le quota

Chaque en-tecircte de mail est eacutecrite dans un fichier json distinct par boicircte (un

fichier pour la boicircte de reacuteception un fichier pour les mails envoyeacuteshellip) ce qui nous

permet de montrer agrave lutilisateur la liste des mails dune boicircte sans traitement lourds

en arriegravere plan pour le serveur Ces fichiers sont renseigneacutes par un script lanceacute agrave la

reacuteception drsquoun mail par postfix du cocircteacute reacuteception et par lrsquointerface web elle mecircme

pour lrsquoeacutemission Lrsquoen-tecircte drsquoun mail est eacutecrite dans un conteneur JSONde lamaniegravere

suivante

Fig 7 Exemple drsquoentreacutee dans un fichier json

Gracircce tout cela nous pouvons afficher simplement le contenu des diffeacuterentes

boicirctes mail dans des tableaux sur lrsquointerface gracircce aux en-tecirctes et par la suite

retrouver et afficher le contenu drsquoun mail agrave partir de son fichier brut sur lequel

lrsquoutilisateur aura cliqueacute comme on le verra un peu plus loin

Toujours dans un souci drsquoameacutelioration des performances le strict neacutecessaire

est geacuteneacuteralement chargeacute sur les pages web par exemple en venant de la vue

geacuteneacuterale lorsqursquoon clique surInboxseule la partie inteacuterieure de la page est chargeacutee

on ne recharge pas le bandeau du haut de page ou lemenu de gauche agrave lamaniegravere

drsquoun MVC classique

Envoyer des courriels

Toute cette architecture ne doit pas nous faire oublier le but premier envoyer

et recevoir des mails Pour envoyer des mails crsquoest tregraves simple on peut soit cliquer

dans le bandeau du haut sur ldquoQuick Emailrdquo qui permet sur lamecircme page drsquoenvoyer

un email rapide et sans piegravece-jointe soit cliquer dans la barre de navigation sur le

cocircteacute sur ldquoWrite a new emailrdquo ce qui nous megravene vers une page deacutedieacutee permettant

drsquoeacutecrire un email incluant une piegravece jointe

Fig 8 Envoyer un mail crsquoest simple comme bonjour

On peut remarquer sur cette capture drsquoeacutecran que lrsquoon ne peut envoyer que

certains types de piegraveces jointes Nous supportons JPG PNG GIF PDF et ZIP Si la

piegravece jointe est drsquoun autre format elle est rejeteacutee La veacuterification du type srsquoeffectue

sur lrsquoextension du fichier et sur son type MIME ce qui eacutevite par exemple que

quelqursquoun modifie lrsquoextension drsquoun fichierexe en fichierjpg pour lrsquoenvoyer La piegravece

jointe doit de plus avoir une taille infeacuterieure agrave la taille maximale drsquoune piegravece jointe

parameacutetreacutee par lrsquoadministrateur comme nous le verrons dans lrsquointerface

drsquoadministration

Si tous ces critegraveres sont bons on eacutecrit lemail au format brut deacutecrit par la RFC

puis on lrsquoexpeacutedie agrave lrsquoaide de la fonction mail de PHP Si cette fonction nrsquoeacutechoue pas

crsquoest que le mail est expeacutedieacute avec succegraves on peut alors mettre agrave jour le quota

drsquoespace disque maximum autoriseacute agrave lrsquoutilisateur en increacutementant celui-ci avec la

taille du mail qui vient drsquoecirctre envoyeacute ainsi que creacuteer un fichiermail brut sur le disque

pour pouvoir afficher le mail dans la boicircte drsquoenvoi et en garder une trace

Notons que comme crsquoest lrsquoutilisateur web du systegraveme (www-data) qui exeacutecute

la fonction nous modifions les en-tecirctes du mail afin que le destinataire reccediloive un

mail de la part de ldquoPreacutenom Nomrdquo depuis lrsquoadresse ldquopnomdomainetldrdquo plutocirct que

ldquowww-datadomaintldrdquo par deacutefaut

La migration vers une IP externe agrave Lille 1 eacutetant reacuteussie nous pouvons bien

envoyer des mails depuis notre interface qui sont reccedilus agrave lrsquoexteacuterieur sans soucis

Mais aussi en recevoir

Recevoir des mails est tout aussi important Nous avons vu lrsquoarchitecture en

arriegravere-plan mais au final agrave quoi cela ressemble-t-il pour lrsquoutilisateur Il dispose en

fait en cliquant sur Inbox (ou Sent Spam ou Trash eacutegalement) drsquoun accegraves agrave sa boicircte

de reacuteception Drsquoun clic srsquoaffichent alors agrave lui tous les mails qursquoil a reccedilu

Fig 9 La boicircte de reacuteception

On remarque notamment les fonctions de recherche drsquoactualisation du

tableau de choix des colonnes agrave afficher on peut classiquement choisir combien de

lignes on affiche par page changer de pages etchellip

Lorsque lrsquoon clique sur un des lignes les donneacutees de lrsquoen-tecircte du mails sont

passeacutes en paramegravetres agrave une autre page qui drsquoapregraves ces informations retrouve le

fichier mail brut le traite et lrsquoaffiche

Fig 10 Un mail contenant 3 piegraveces jointes et un message

Comme on peut le voir nous pouvons recevoir desmails avec plusieurs piegraveces

jointes Nous avons ici preacutesenteacute la boicircte de reacuteception mais les autres boicirctes

fonctionnent de maniegravere similaire

Interface drsquoadministration

Le systegraveme de webmail possegravede plusieurs variables des listes de diffusion

des compteshellipMais on veut pouvoir donner les droits agrave un utilisateur demodifier tout

cela En effet si nous trouvons cela abordable drsquoajouter un utilisateur avec une

commande dans le shell il faut aussi penser agrave lrsquoutilisateur final qui preacutefegravere peut-ecirctre

le confort drsquoune interface deacutedieacutee pour geacuterer son serveur mail plutocirct que le terminal

De maniegravere tregraves simple un utilisateur appartenant au groupes drsquoutilisateurs

ldquoAdministrateursrdquo est reconnu en tant qursquoadministrateur par lrsquointerface et peut

cliquer sur un bouton ldquoManagerdquo dans le panneau lateacuteral qui nrsquoest visible qursquoaux

administrateurs De lagrave il arrive sur la page suivante

Fig 11 lrsquointerface drsquoadministration

Sur cette interface il peut choisir la taille maximale des piegraveces jointes

changer le nom de domaine sur lequel est installeacute lrsquointerface et dont deacutependent

toutes les adresses (domaine) Il est aussi possible de modifier directement ces

variables en modifiant le fichier includeconfigincphp Pratique notamment si lrsquoon

a renseigneacute un mauvais nom de domaine agrave la configuration et que lrsquoon arrive plus agrave

acceacuteder agrave lrsquointerface

Il peut aussi creacuteer un nouveau compte en renseignant les champs preacutenom

nom mot de passe et quota Lrsquoutilisateur peut ensuite une fois son compte creacutee

directement se connecter avec son identifiant (initiale preacutenom + nom) et mot de

passe Lors de la creacuteation du compte un mail de bienvenue est envoyeacute au nouvel

utilisateur ce qui permet en arriegravere-plan de creacuteer tous les dossiers utilisateurs et

fichiers en-tecirctes utiles agrave lrsquointerface une fois pour toutes

Lrsquoadministrateur peut aussi ajouter une liste de diffusion (assimileacutee agrave un

groupe) ou en supprimer une parmi les listes existantes

En outre lrsquoadministrateur peut aussi modifier les donneacutees drsquoun utilisateur

Pour cela sur la preacutesente page il peut seacutelectionner un utilisateur parmi la liste des

utilisateurs existants ce qui le redirige vers la page de gestion des comptes

Fig 12 La gestion drsquoun compte seacutelectionneacute ici celui de James Bond

A ce stade il peut changer lrsquoUID de lrsquoutilisateur (utile en cas de conflit) le nom

le mot de passe le quota de cet utilisateur et lrsquoajouter ou le retirer drsquoune liste de

diffusion Accessoirement il peut aussi supprimer le compte en cliquant sur lrsquoeacutenorme

bouton rouge qui lui demandera deux fois de suite de confirmer son action afin

drsquoeacuteviter les erreurs de clic Cette action entraicircne la suppression de lrsquoutilisateur de

toutes les listes de diffusion auxquelles il appartient la suppression de son compte

dans la branche people de lrsquoarbre LDAP et la suppression deacutefinitive de son dossier

utilisateur sur le disquesystegraveme de fichiers impliquant donc la perte de ses mails

Architecture du systegraveme de fichiers

Comme nous lrsquoavons dit plus haut lrsquoideacutee est de se passer des meacutecanismes

classiques avec les clients mails habituels Ces serveurs srsquoalourdissent

geacuteneacuteralement en utilisant des serveurs IMAPPOP3 et un meacutecanisme

drsquoauthentification SMTP

Pour adapter ces fonctionnaliteacutes agrave notre systegraveme nous avons donc constitueacute

une architecture pour organiser les fichiers qui transitent Vous pourrez voir un

scheacutema reacutecapitulatif en annexe 1

Dans la premiegravere moitieacute du projet les mails eacutetaient deacutelivreacutes par Postfix Nous

utilisions un script exeacutecuteacute lors de la reacuteception drsquounmail pour les traiter de lamaniegravere

que nous voulions Cette meacutethode avait les inconveacutenients drsquoecirctre lourde et pas

efficace agrave 100 En effet seuls les mails reccedilus depuis lrsquoexteacuterieur eacutetaient

correctement traiteacutes

Deacutesormais les mails sont traiteacutes totalement par notre script Cela nous

permet de geacuterer les mails dans des dossiers organiseacutes agrave notre maniegravere et de

recevoir les mails locaux crsquoest-agrave-dire entre utilisateurs du mecircme domaine Cette

nouvelle meacutethode regravegle aussi drsquoautres problegravemes notamment au niveau des

permissions sur les fichiers

Pour reacuteduire le nombre drsquoopeacuterations et pour profiter des fonctionnaliteacutes

offertes par le framework utiliseacute pour lrsquointerface web nous regroupons des

informations sur chacun des mails reccedilus sous la forme de fichiers JSON Pour ce

faire lrsquoideacutee est drsquoexeacutecuter un script lorsque leacutevegravenement ldquoreacuteception drsquoun mailrdquo

survient Postfix offre cette possibiliteacute dans sa configuration Or il se trouve qursquoil nrsquoest

pas si simple de reacutecupeacuterer le chemin du fichier contenant le mail car le nom du

fichier creacutee est sous la forme Timestamp UNIX10 Caractegraveres aleacuteatoires (ex

14562336185A8D43E97F)

La seconde probleacutematique est que le webmail doit avoir la possibiliteacute de

pouvoir lire les fichiers pour afficher les mails sur son interface Or il semble que

Postfix les eacutecrit en autorisant uniquement son utilisateur en lecture Il nous a fallu

trouver une solution pour remeacutedier agrave cela Nous avons choisi drsquoajouter www-data

(utilisateur du serveur web) au groupe vmail et de modifier les droits sur les fichiers

de sorte que les utilisateurs de ce groupe puissent lire les fichiers

Nous avons revu une partie de lrsquoorganisation des fichiers pour reacutecupeacuterer les

piegraveces jointes si elles sont preacutesentes Le script que nous avons eacutecrit reacutecupegravere le

fichier original du mail et le deacutecoupe en eacuteleacutements simples dans des fichier distincts

corps du mail et diffeacuterentes piegraveces jointes De cette maniegravere pour afficher un mail

nous nrsquoavons pas besoin de charger la totaliteacute du fichier Dans le cas ougrave il y a des

piegraveces jointes cela aurait ralenti lrsquoaffichage des informations

Nous avons eacutegalement impleacutementeacute la gestion des quotas Dans lrsquoeacutetat actuel

des choses srsquoil nrsquoy a plus de place disponible pour lrsquoutilisateur le mail nrsquoest tout

bonnement pas deacutelivreacute agrave ce destinataire Lrsquoideacuteal aurait eacuteteacute de notifier leacutemetteur avec

un mail ce qui nrsquoest pour lrsquoinstant pas le cas mais qui pourrait ecirctre reacutesolu en

renvoyant agrave postfix un code drsquoerreur deacutefini

Pour terminer nous avons revu la totaliteacute du code deacuteveloppeacute Nous sommes

passeacute du Bash au Perl Ce dernier est plus performant et plus simple agrave utiliser et agrave

lire

Firewall

Un autre gros morceau du projet mais qui nrsquoest pas speacutecifiquement lieacute agrave la

probleacutematique du mail crsquoest la seacutecurisation du serveur En effet apregraves avoir mis en

ligne notre serveur des pirates ont tregraves vite tenteacute de peacuteneacutetrer le systegraveme

Globalement les attaques eacutetaient de type force brute sur les services heacutebergeacutes sur

notre Raspberry neacutecessitant une identification tels que SSH SMTP hellip

On retrouve ici un petit point faible du protocole SMTP Eacutetant donneacute que

chaque serveur mail doit avoir une adresse postmaster et abuse lrsquoattaquant a agrave sa

disposition deux adresses agrave attaquer Ceci dit ce type drsquoattaque est simple agrave

contrecarrer car il suffit de limiter dans le temps le nombre de tentatives de

connexions

La contre-mesure que nous avons mis en place est simple une seacuterie de

regravegles Iptables En reacutesumeacute nous avons opteacute pour un systegraveme de liste blanche et

noire Les adresses IPs de la liste blanche sont autoriseacutees agrave utiliser la totaliteacute des

services (notamment SSH) tandis que celles de la liste noire sont totalement

ignoreacutees Les autres IPs nrsquoont accegraves qursquoau webmail

Eacutetant donneacute que le nombre drsquoIPs attaquant notre serveur nrsquoa cesseacute

drsquoaugmenter nous avons automatiseacute la mise agrave jour de la liste de noire en

deacuteveloppant un script pour Cron Ce script est exeacutecuteacute une fois par heure A ce jour

notre liste noire contient 47 adresses Bien sucircr ce systegraveme est susceptible drsquoecirctre

modifieacute agrave convenance pour passer sur une solution deacutedieacutee telle que Fail2ban qui fait

en fait ce qursquoon fait deacutejagrave (eacutetudier les logs et bannir des IP avec iptables) avec des

regravegles preacutedeacutefinies par la communauteacute et personnalisables En effet nous nous

attendons agrave voir la varieacuteteacute et le nombre drsquoattaques augmenter apregraves avoir migreacute sur

une IP non proteacutegeacutee par le firewall de lrsquoUniversiteacute puisque nous nrsquoavons plus la

premiegravere ligne de deacutefense du CRI en particulier pour le port 389 (LDAP) qui eacutetait

bloqueacute par lrsquouniversiteacute et srsquoest retrouveacute en premiegravere ligne apregraves la migration Nous

avons donc ajouteacute une regravegle bloquant tout le trafic entrant vers le port 389 hormis

localhost

Package drsquoinstallation

Nous avons creacutee un package deb contenant les sources du webmail ainsi

que des scripts utiles agrave lrsquoinstallation et au fonctionnement du serveur Nous avons

deacuteveloppeacute des scripts de configuration automatique pour LDAP et Postfix Comme

dpkg ne supporte pas directement lrsquoinstallation automatique des deacutependances

nous recommandons drsquoinstaller avant tout le paquet gdebi-core qui est en fait un

dpkg ameacutelioreacute Gracircce agrave la commande gdebi paquetdeb toutes les deacutependances

seront installeacutees en particulier postfix le serveur ldap le serveur web lighttpd entre

autres sans soucis Il est agrave noter que comme les scripts de configuration des

diffeacuterents services ne sont que partiellement impleacutementeacutes dans le paquet deb nous

fournissons en annexe un README complet et illustreacute qui explique pas agrave pas

comment faire fonctionner notre systegraveme sur nrsquoimporte quel Linux en particulier les

lignes de configuration des diffeacuterents services agrave changer et un exemplaire des

fichiers de configuration fonctionnels de ces services

Gestion de lrsquoeacutenergie

Une consideacuteration importante pour un systegraveme autonome Drsquoapregraves les fiches

techniques notre modegravele de Raspberry Pi (B 2) est officiellement eacutevalueacute avec un

fonctionnement agrave ~650mA pour 5V De nombreux proprieacutetaires de ce systegraveme

eacutequipeacutes se sont amuser agrave veacuterifier la consommation eacutelectrique reacuteelle de leur Pi 2 B

sous diffeacuterentes charges On pourra retenir cette eacutetude (lien en sitegraphie) qui

relegraveve la consommation en courant en fonction de lrsquoactiviteacute lanceacutee sur la Pi mais

aussi en charge sur 1 agrave 4 CPU

Ces chiffres sont releveacutes sur un systegraveme avec cameacutera connecteacutee HDMI connecteacute et

cacircble ethernet brancheacute et actif

On peut constater que globalement notre systegraveme Pi 2 B tournant sans

interface graphique sans composant suppleacutementaire sans sortie videacuteo ni cameacutera

avec plusieurs serveurs tournant tout en restant le plus leacuteger possible et demeurant

~99 idle la plupart du temps ne devrait pas deacutepasser une consommation de

300mA grand maximum

Fig 13 Un processeur tregraves tregraves peu chargeacute et une meacutemoire relativement libre

Nous avions lrsquoanneacutee derniegravere deacutejagrave reacutealiseacute un circuit permettant drsquoadapter un

panneau solaire sur une batterie USB classique de 9000mAh Nous avions alors pu

mesurer lrsquointensiteacute deacutelivreacutee par le panneau solaire En cas drsquoensoleillement moyen

habituel dans nos contreacutees le panneau solaire deacutebitait 400mA et pouvait atteindre

le double quand le soleil eacutetait directement preacutesent pour environ 800mA deacutebiteacute

Ce panneau solaire accompagneacute de son circuit drsquoadaptation devrait donc

suffire pour alimenter notre systegraveme la journeacutee le brancher ensuite sur une batterie

portable permet de stocker le surplus pour la nuit

Fig 14 le circuit drsquoadaptation

Fig 15 et son PCB

Eacutevolutions possibles

Webmail

Concernant les eacutevolutions possibles que nous aurions aimeacute apporter agrave notre

projet avec plus de temps commenccedilons par le web Nous aurions souhaiteacute apporter

la gestion de lrsquoenvoi de plusieurs piegraveces jointes comme nous lrsquoavons fait pour la

reacuteception

De plus nous aurions voulu inteacutegrer une corbeille ougrave lesmessages pourraient

aller avant drsquoecirctre deacutefinitivement supprimeacutes du systegraveme drsquoautant que nous avons

deacutejagrave eacutecrites les fonctions PHP permettant de retirer une en-tecircte drsquoun fichier JSON et

le fichier mail associeacute

Enfin nous aurions aimeacute en plus du blocage deacutejagrave preacutesent impleacutementer une

gestion plus profonde des piegravece jointes permettant notamment le remplissage de la

boicircte de spams

Systegraveme

Il aurait eacuteteacute inteacuteressant de notifier lrsquoexpeacutediteur lorsque le mail nrsquoa pas pu ecirctre

deacutelivreacute agrave un utilisateur lorsque son quota est plein En toute logique cela devrait ecirctre

fait simplement avec la commande Sendmail

Une meilleur gestion du trafic mail indeacutesirable aurait eacuteteacute la bienvenue En

effet malgreacute la limitation du spam il restera toujours une partie du volume de mail

qui sera indeacutesirable (pub pishing scam hellip)

Eacutetant donneacute la taille du systegraveme nous avions penseacute agrave une approche

ldquomachine learningrdquo Lrsquoutilisateur indiquerait pourquoi il considegravere le mail comme

indeacutesirable constituant des regravegles refusant certains mails Les mails provenant de

cet expeacutediteur pourraient ecirctre deacutetecteacute par le script agrave la reacuteception et

automatiquement envoyeacutes dans la boicircte de spams

Partie eacutenergeacutetique

Mecircme si la solution au panneau solaire ne pose aucun problegraveme en theacuteorie

nous aurions deacutejagrave dans un premier temps aimeacute lrsquoimpleacutementer en pratique Nous

nrsquoavons finalement pas reacutealiseacute notre objectif de deacutetecter deux cas drsquoalimentation

diffeacuterents soit lrsquoalimentation via panneau solaire est suffisante dans ce cas il

alimente la batterie et donc la Raspberry soit quand ce courant nrsquoest pas suffisant

on alimente la batterie par le secteur

Conclusion

En conclusion nous pensons avoir reacutepondu au cahier des charges initial dans

sa majeure partie Nous sommes aujourdrsquohui en mesure de proposer une solution

mail domestique priveacutee et personnalisable par un particulier

Notre installation de Debian a eacuteteacute au maximum alleacutegeacutee pour notre utilisation

sans interface graphique et nous avons mis en place une reacuteponse aux diverses

attaques que nous avons pu subir lors de lamise en place de notre solution logicielle

En outre le pare-feu avec notre systegraveme de liste noire bloque une partie des

attaques qui peuvent nous parvenir

Nos diffeacuterents scripts de pare-feu de gestion drsquoun mail entrant associeacute au

webmail permettent agrave un utilisateur drsquoacceacuteder aux fonctions usuelles associeacutees agrave

lrsquoenvoi et la reacuteception de mails

Gracircce agrave sa configuration personnalisable notre projet devrait pouvoir ecirctre

porteacute sur un domaine et une adresse IP diffeacuterente sans soucis et ecirctre deacuteployeacute

partout ougrave des gens souhaitent conserver leur vie priveacutee

Nous regretterons cependant de ne pas avoir exploiteacute la partie eacutenergeacutetique

de ce projet qui portait une probleacutematique inteacuteressante et qui nous parait importante

dans le monde actuel

Ce projet nous aura occupeacute pendant tregraves longtemps et nous sommes fiers du

travail que nous avons accompli Il est agrave nos yeux la preuve de ce que nous savons et

pouvons faire et nous donnera confiance pour notre deacutebut de carriegravere drsquoingeacutenieur

Sources

httpwwwradicaticomwpwp-contentuploads201401Email-Statistics-R

eport-2014-2018-Executive-Summarypdf

httpwwwcommentcamarchenetcontents525-le-protocole-ldap

httpsfrwikipediaorgwikiSimple_Mail_Transfer_Protocol

httpwwwcommentcamarchenetcontents536-pop3-smtp-imap-protocol

es-de-messagerie

httpstoolsietforghtmlrfc2821

httpsfrwikipediaorgwikiInternet_Message_Access_Protocol

httpstoolsietforghtmlrfc3501

httparstechnicacominformation-technology201402how-to-run-your-ow

n-e-mail-server-with-your-own-domain-part-1

httpswwwraspberrypiorgforumsviewtopicphpp=136912

httpstackoverflowcomquestions17394356how-can-i-make-a-bash-com

mand-run-periodically

httpuntroubledorgnullmailer

httpelinuxorgRPi_Hardware

httpraspitv2015raspberry-pi2-power-and-performance-measurement

Annexe 1 Architecture du systegraveme de fichiers

Annexe 2 Scan DNSSTUFF

Depuis httpwwwdnsstuffcomtoolsdnsReport|type=domainampampvalue=intimailpw

Annexe 3 Vue geacuteneacuterale httpswwwintimailpw

Annexe 4 Envoyer un mail

Annexe 5 Boite de reacuteception

Annexe 6 Interface drsquoadministration

Annexe 7 Gestion drsquoun utilisateur

Tutorial installation intimailtrade

Table des matiegraveres Apregraves une nouvelle installation de lrsquoOS 2

Seacutecurisation du serveur 2

Changement de lrsquoutilisateur par deacutefaut 2

Changement du port SSH 2

Interdire lrsquoauthentification SSH pour root 2

Installation de LDAP 3

Configuration de base 3

Configuration des Scheacutemas 4

Constitution de la base de donneacutees LDAP 5

Installation de Postfix 7

Installation de Bind9 8

Installation du paquet Debian et configuration de lighttpd 9

Deacutependances 11

Sources 12

2

Apregraves une nouvelle installation de lrsquoOS Exeacutecutez ces commandes pour mettre agrave jour agrave la derniegravere version Ces opeacuterations peuvent prendre un certain

temps Nous avons utiliseacute pour cet exemple Raspbian Jessie Lite sur une Raspberry Pi 2

apt-get update

apt-get upgrade ampamp apt-get dist-upgrade

apt-get install linux-headers-$(uname -r)

reboot

Puis lancer

raspi-config

Etendre au maximum lrsquoespace de stockage en navigant dans les menus

Expand Filesystem

Reacutegler une ip statique avec la box fichier etcnetworkinterfaces

iface eth0 inet static

address 192168131

netmask 2552552550

gateway 19216811

Nous avons aussi supprimeacute wpasupplicant

Seacutecurisation du serveur

Changement de lrsquoutilisateur par deacutefaut Changez le nom drsquoutilisateur par deacutefaut ainsi que son mot de passe

sudo passwd root

Sortie et login en tant que root puis

usermod -l myuname pi

usermod -m -d homemyuname myuname

groupmod ndashn myuname pi

passwd myuname

Voir cette adresse pour lrsquoutilisation de cleacutes priveacuteespubliques

Changement du port SSH sed ndashi sPort 22Port 2222g etcsshsshd_config

Interdire lrsquoauthentification SSH pour root sed -i sPermitRootLogin yesPermitRootLogin nog etcsshsshd_config

3

Installation de LDAP

Configuration de base Installation du package

apt-get install slapd

Choisir un mot de passe administrateur puis lancer la commande

dpkg-reconfigure slapd

Reacutepondre non agrave la question 1

Entrez le nom de domaine utiliseacute agrave la question 2 sous la forme domainetld

Entrez ce que vous voulez au 3egraveme eacutecran le nom de lrsquoorganisation ne sera pas utiliseacute

Entrez un mot de passe

Choisissez HDB

Choisissez si la base de donneacutees est supprimeacutee agrave la deacutesinstallation de slapd

Deacuteplacez lrsquoancienne base de donneacutees

Nrsquoutilisez pas LDAPv2

Installer les outils de conversion pour ldap (slaptest ldapmodify notamment)

apt-get install ldap-utils

On peut maintenant veacuterifier que la configuration est valable

ldapsearch -x -h localhost -b dc=domainedc=tld -LLL dc=domaine dn

Cette commande doit retourner quelque chose comme

dn dc=domainedc=tld

Il faut maintenant seacutecuriser le serveur LDAP en effet on peut y acceacuteder en anonyme avec la commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=config

(amp(objectClass=olcDatabaseConfig)(olcSuffix=dc=domainedc=tld))

Cette commande retourne un certain nombre drsquoinformations notamment agrave propos des champs suivants

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by none

olcAccess 1to dnbase= by read

olcAccess 2to by read

On va modifier ces champs avec la commande ldapmodify Pour cela on va creacuteer un fichier ldif

cat gt changeAccessldif ltlt EOF

dn olcDatabase=1hdbcn=config

changetype modify

delete olcAccess

-

add olcAccess

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by dn=cn=admindc=domainedc=tld write by none

-

add olcAccess

olcAccess 1to dnbase= by read

-

4

add olcAccess

olcAccess 2to by self write by dn=cn=admindc=domainedc=tld write by

none

-

EOF

On peut maintenant appliquer les changements avec ldapmodify

ldapmodify ndashc ndashY EXTERNAL ndashH ldapi -f changeAccessldif

La commande devrait vous confirmer que la modification srsquoest bien effectueacutee

SASLEXTERNAL authentication started

SASL username gidNumber=0+uidNumber=0cn=peercredcn=externalcn=auth

SASL SSF 0

modifying entry olcDatabase=1hdbcn=config

On peut veacuterifier qursquoon ne peut plus acceacuteder aux informations avec la commande

ldapsearch -x -c -h localhost -b dc=domainedc=tld

On peut veacuterifier la configuration en se connectant en tant qursquoadministrateur

ldapsearch -c -h localhost -b dc=domainedc=tld -D

cn=admindc=domainedc=tld ndashW

Configuration des Scheacutemas Nous allons utiliser les scheacutemas de courier-ldap Pour eacuteviter une manipulation compliqueacutee vous trouverez

directement le scheacutema avec le fichier authldapschema On place ce fichier dans le dossier

mv authldapschema etcldapschema

Nous creacuteons un fichier qui incluera tous les scheacutemas de base en plus du nouveau On peut les afficher avec la

commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

Creacuteation du fichier de configuration pour notre exemple cela donne

mkdir tmpldapconf

cat gt tmpldapconfldapconf ltlt EOF

include etcldapschemacoreschema

include etcldapschemacosineschema

include etcldapschemanisschema

include etcldapschemainetorgpersonschema

include etcldapschemaauthldapschema

EOF

On lance ensuite la commande

slaptest -f tmpldapconfldapconf -F tmpldapconf

Elle revoie un message de succegraves Cette commande a creacuteeacute dans le reacutepertoire tmpldapconf une arborescence

correspondant agrave la configuration de notre LDAP

On modifie le chemin de configuration

5

sed ndashi 0dnauthldap sauthldapauthldapcn=schemacn=config

cn=authldapldif

On supprime ensuite les 7 derniegraveres lignes du fichier

head -n -7 cn=authldapldif gt tmpldif

mv tmpldif cn=authldapldif

On peut maintenant importer notre fichier de configuration Pour ce faire

ldapadd -Y EXTERNAL -H ldapi -f

tmpldapconfcn=configcn=schemacn=authldapldif

Si tout va bien lrsquoentreacutee devrait avoir eacuteteacute ajouteacutee On peut veacuterifier avec la commande vue tout agrave lrsquoheure

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

On devrait voir en plus le nouveau scheacutema authldap

Constitution de la base de donneacutees LDAP Le remplissage de la base se fait agrave lrsquoaide de fichiers ldif Nous donnons ici un exemple de structure

Fichier pour la structure de base

dn dc=maildc=domainedc=tld

o intimailpw

description Global mail tree

dc mail

objectClass top

objectClass dcObject

objectClass organization

dn dc=peopledc=maildc=domainedc=tld

description Informations of all users

o people

dc people

objectClass top

objectClass dcObject

objectClass organization

dn dc=groupsdc=maildc=domainedc=tld

description All groups of users

o groups

dc groups

objectClass top

objectClass dcObject

objectClass organization

6

Fichier pour ajouter un utilisateur

dn cn=jbonddc=peopledc=maildc=domainedc=tld

uid jbond

mail jbonddomainetld

sn Moulin

givenName James

displayName James Bond

mailbox domainetldjbond

quota 50M

homeDirectory homevmail

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAccount

userPassword SSHA367PSXiUAegy8dpJbPU8OepEf8L5ye

Pour obtenir un hash du mot de passe

slappasswd -s password -h SSHA

On peut par la suite ajouter la configuration agrave la base de donneacutees avec la commande

ldapadd -D cn=admindc=domainedc=tld -W -h localhost -f pathtofile

Si les champs proposeacutes ne sont pas suffisants il faudra alors effectuer les modifications dans le fichier autldapschema

proposeacute plus haut et refaire la manipulation de configuration

De plus les standards du Mail deacutecrit par lrsquoIETF (RFC822 63 RFC1123 527 and RFC2821 451) impliquent drsquoavoir une

adresse Postmaster et une Abuse Pour cela nous pourrions creacuteer ces adresses avec la meacutethode vue au-dessus mais

ce nrsquoest pas la meilleure Il est preacutefeacuterable drsquoutiliser un alias comme nous le ferons avec les listes de diffusion Ici nous

proposons de rediriger ces deux adresses vers une adresse administrateur Pour cela la meacutethode est la mecircme sauf

que le fichier ldif nrsquoest pas tout agrave fait identique En voici un exemple

dn cn=postmasterdc=groupsdc=maildc=domainedc=tld

uid postmaster

mail postmasterdomainetld

sn Postmaster

displayName Postmaster

maildrop admindomainetld

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAlias

Pour faire une liste de diffusion la meacutethode est la mecircme Il suffit drsquoajouter toutes les adresses destinataires dans le

champ maildrop seacutepareacutees par des virgules ()

7

Installation de Postfix Installation des packages

apt-get install postfix postfix-ldap

Lors de lrsquoinstallation deux eacutecrans deacutefilent

- Configuration Internet Site

- Valeur par deacutefaut pour le mail name

On creacutee lrsquoutilisateur qui servira agrave exeacutecuter Postfix

groupadd vmail

useradd -g vmail -d homevmail -s binfalse -m vmail

Nous aurons besoin dans la suite des GID et UID creacuteeacutes agrave cet instant Ils peuvent ecirctre afficheacutes avec les commandes

cat etcgroup | grep vmail | cut -d -f3

cat etcpasswd | grep vmail | cut -d -f3

On ajoute les paramegravetres au fichier etcpostfixmaincf (remplacer les valeurs de GID et drsquoUID avec vos valeurs)

smtpd_banner = maildomainetld

virtual_mailbox_base = homevmail

virtual_mailbox_domains = dmainetld

virtual_mailbox_maps = ldapetcpostfixldap_accountscf

virtual_alias_maps = ldapetcpostfixldap_aliasescf

virtual_minimum_uid = 100

virtual_gid_maps = static1001 Remplacez ici par votre valeur de GID

virtual_uid_maps = static1001 Remplacez ici par votre valeur drsquoUID

Il nous faut maintenant constituer nos fichiers de configuration ldap_accountscf

cat gt etcpostfixldap_accountscf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=peopledc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAccount)(mail=s))

result_attribute = mailbox

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

Et pour ldap_aliasescf

cat gt ldap_aliasescf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=groupsdc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAlias)(mail=s))

result_attribute = maildrop

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

8

On peut maintenant veacuterifier la configuration de Postfix avec (cette commande ne doit rien retourner si crsquoest bon)

postfix check

Si crsquoest bon alors on recharge le serveur

postfix reload

On peut alors faire un envoi de mail test via telnet

telnet localhost 25

Si vous souhaitez deacutelivrer les mails agrave votre maniegravere il faut dans le fichier etcpostfixmaincf la ligne

virtual_transport = nomdevotreregle

Et de mecircme dans le fichier etcpostfixmastercf

nomdevotreregle unix - n n - 5 pipe

flags=Rq user=vmail null_sender=

argv=chemindevotreprogramme

Il nous reste maintenant agrave configurer les diffeacuterents enregistrements DNS neacutecessaire au fonctionnement drsquoun serveur

mail Vous pouvez utiliser la solution de votre choix Dans la suite vous trouverez une meacutethode utilisant Bind9

Installation de Bind9 Dans toute cette partie on se situera dans le dossier etcbind Dans la suite notre IP sera abcd

Dans le fichier namedconfoptions on ajoutera dans le champ options

version Not supported

Dans un dossier zones on eacutecrit le fichier dbdomainetld

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122111 Serial

43200 Refresh

3600 Retry

2419200 Expire

86400 ) Negative Cache TTL

IN NS nsdomainetld

IN NS ns11ovhnet

ns IN A abcd

www IN A abcd

IN A abcd

IN MX 10 maildomainetld

mail IN A abcd

Dans le mecircme dossier zones on a cbain-addrarpa

9

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122101 serial

14400 refresh

3600 retry

604800 expire

10800 minimum

)

cbain-addrarpa IN NS nsdomainetld

cbain-addrarpa IN NS ns11ovhnet

d IN PTR maildomainetld

Il faut faire attention agrave bien increacutementer le serial pour chaque modification des fichiers

Dans le fichier namedconflocal

zone domainetld

type master

file etcbindzonesdbdomainetld

allow-transfer 213251128130

notify yes

zone cbain-addrarpa IN

type master

file etcbindzonescbain-addrarpa

allow-transfer 213251128130

Ici 213251128130 est lrsquoadresse IP du serveur ns11ovhnet

Il faut bien sucircr configurer le DNS avec votre fournisseur (Gandi OVH hellip) Pour ccedila amusez-vous bien Vous pouvez

aussi tester votre configuration avec des outils en ligne tels que DNSstuff

En test final si votre configuration est bonne vous devriez pouvoir envoyer un mail depuis un service neutre (Gmail

yahoo hellip) et le voir dans votre arborescence (ici homevmaildomainetld)

Installation du paquet Debian et configuration de lighttpd

Commencez par reacutecupeacuterer le paquet deb agrave lrsquoadresse suivante httpswwwintimailpwintimaildeb

Installez ensuite GDebi Il srsquoagit drsquoun dpkg ameacutelioreacute pour teacuteleacutecharger les deacutependances automatiquement ce que

dpkg ne gegravere pas

apt-get update

apt-get install gdebi-core

10

Vous pouvez alors installer le paquet

gdebi intimaildeb

Vous aurez alors le site web drsquointiMail deacuteployeacute au chemin varwwwwebmail

Il ne vous reste plus qursquoagrave changer la configuration de lighttpd votre serveur web pour mettre en ligne le site

Vous pouvez pour cela copier-coller la configuration suivante mais veillez agrave bien changer lrsquoadresse IP preacutesente au

deacutebut de la partie SSL CONFIG avec votre adresse IP

serv ermodules = ( mod_access

mod_accesslog

mod_alias

mod_compress

mod_redirect

mod_rewrite

)

Hide server version

servertag = Such Headers Very try Now close telnet

serverdocument-root = varwwwwebmail

serverupload-dirs = ( varwwwwebmailuploads )

servererrorlog = varloglighttpderrorlog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

serverport = 80

accesslogformat = V h l u t r gts b Refereri

User-Agenti

accesslogfilename = varloglighttpdaccesslog

index-filenames = ( indexphp indexhtml

indexlighttpdhtml )

urlaccess-deny = ( ~ inc )

static-fileexclude-extensions = ( php pl fcgi )

compresscache-dir = varcachelighttpdcompress

compressfiletype = ( applicationjavascript textcss

texthtml textplain )

default listening port for IPv6 falls back to the IPv4 port

include_shell usrsharelighttpduse-ipv6pl + serverport

include_shell usrsharelighttpdcreate-mimeassignpl

include_shell usrsharelighttpdinclude-conf-enabledpl

SSL CONFIG

$SERVER[socket] == 5234485443

sslengine = enable

11

sslpemfile = etclighttpdsslintimailpwpem

sslca-file = etclighttpdsslintimailpwcrt

servername = intimailpw

votre configuration habituelle pour ce domaine

serverdocument-root = varwwwwebmail

servererrorlog = varloglighttpderror_ssllog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

Rewrite des URL pour masquer php

urlrewrite-once = ( ^()$ =gt $1 )

urlrewrite-if-not-file = ( ^([^])()$ =gt $1php$2 )

servernetwork-backend = writev

Deacutependances Slapd

Ldap-utils

Postfix

Postfix-ldap

Bind9

Lighttpd

12

Sources httpswikigandinetfrhostingusing-linuxtutorialsdebianmail-server-ldap

httpwwwpostfixorgpipe8html

httpwwwpostfixorgFILTER_READMEhtml

httpwwwpostfixorg

httpwwwpostfixorgtransport5html

Page 5: Système d'hébergement domestique...place sur les domaines .pw par Gandi.net, notre fournisseur. Nous n’avons donc pas pu l’implémenter. Nous avons configuré Postfix pour qu’il

Cahier des Charges

Mateacuteriel et logiciels utiliseacutes

Pour ce projet nous avons utiliseacute jusqursquoici le mateacuteriel suivant

1 Raspberry Pi 2

1 Carte micro SD 8 Go

1 Cacircble USBmicro USB

1 Cacircble RJ45

En outre nous avons installeacute les logiciels suivants

Une distribution Debian Jessie pour Raspberry

Un serveur web Lighttpd

Un serveur mail Postfix

Un serveur DNS Bind

Un serveur drsquoannuaire OpenLDAP

Le module PHP5 pour Lighttpd

Nous avons deacuteveloppeacute nos diffeacuterents codes en Shell ou Perl directement sous

Debian et le code pour la partie web est eacutecrit en PHP sous lrsquoIDE NetBeans

Dans le deacutetail

Dans le deacutetail lideacutee est de deacutevelopper un systegraveme autonome et fonctionnel

Autrement dit les diffeacuterents packages et fonctionnaliteacutes installeacutees sur la Raspberry

ainsi que linterface utilisateur sur le site web et lrsquoaspect eacutenergeacutetique

Voici les diffeacuterentes fonctionnaliteacutes que nous avons impleacutementeacutees

Serveur Mail

Postfix pour le protocole SMTP

Systegraveme leacuteger pas de protocoles IMAPPOP en plus tout en web

Gestion particuliegravere des gros mails et notamment de leurs piegraveces jointes

Deacutecodage et encodage base 64 des piegraveces jointes

Support de la reacuteception de piegraveces jointes multiples

Gestion des utilisateurs

Plusieurs comptes en utilisant LDAP

La possibiliteacute de sidentifier en tant quadministrateur

Listes de diffusion et groupes

Antivirus amp gestion des spams

iptables scripts shellperl de deacutetection par les logs drsquoattaques puis

mise en place de regravegles iptables via ces mecircmes scripts

Antispam maison synchronisation sur les blacklists existantes et

fiables rejet drsquoun spam

Nom de domaine et enregistrements associeacutes

Enregistrement A deacutefinit lrsquoadresse de nom drsquoun serveur web

Enregistrement MX deacutefinit lrsquoadresse de nom drsquoun serveur mail

Sauvegarde automatique peacuteriodique de la Raspberry Pi

Interface web

Gestion des comptes (creacuteation modification suppression)

Gestion des listes de diffusions

Gestion des quotas

Affichage du courrier

Paquets deb installable sur tout systegraveme Debian

Incluant un document explicatif pour lrsquoinstallation et la configuration

particuliegravere agrave apporter

Systegraveme pouvant ecirctre autonome en eacutenergie

Au coeur du projet

Gestion des utilisateurs - Le serveur LDAP

Comme il lrsquoeacutetait suggeacutereacute dans lrsquoeacutenonceacute du sujet nous nous sommes

inteacuteresseacutes agrave la solution LDAP Il srsquoagit drsquoun protocole de gestion drsquoannuaire baseacute sur

TCPIP Dans un premier temps nous avons penseacute agrave creacuteer un systegraveme de base de

donneacutees utilisant un simple systegraveme de fichiers car nous avions trouveacute ce systegraveme

trop compliqueacute agrave configurer agrave utiliser et trop lourd bien que plus leacuteger qursquoune Base

de Donneacutees classique

Cependant LDAP srsquoavegravere ecirctre un systegraveme parfaitement adapteacute pour la

gestion drsquoinformations utilisateurs En effet cette tacircche requiert beaucoup plus de

lectures que drsquoeacutecritures ce pourquoi LDAP est optimiseacute Ce programme preacutesente

lrsquoavantage de privileacutegier la lecture et disposes de nombreuses API dans les

langages de programmation divers dont PHP que nous utilisons crsquoest pourquoi

nous avons deacutecideacute de lrsquoutiliser

Le modegravele drsquoinformation de LDAP est baseacute sur des entreacutees Chacune drsquoentre

elles est un ensemble drsquoattributs Les informations sont organiseacutees sous la forme

drsquoun arbre Pour notre projet nous avons retenu la structure suivante

Fig 2 Structure de lrsquoannuaire LDAP

Nous avons ici deacutetermineacute des champs agrave renseigner pour constituer un

utilisateur En particulier un utilisateur dispose des attributs suivants

Son identiteacute (nom preacutenom(s))

Son identifiant utilisateur (UID) sous la forme comme agrave Polytech

initiale+nom(+chiffre) Son adresse mail compegravete sous la forme UIDdomainetld

Le chemin de sa boicircte mail sur le systegraveme domaineUID

Son quota (en octets)

Son mot de passe encrypteacute en SSHA

Fig 3 Une personne dans lrsquoannuaire LDAP

Les utilisateurs sont enregistreacutes dans la branche ldquopeoplerdquo de notre annuaire

Nous avons de plus une seconde branche ldquogroupsrdquo Celle-ci contient les listes de

diffusion Elle contient aussi le groupe particulier admins utilisateurs qui ont droit agrave

des options drsquoadministration sur le webmail

Fig 4 Un groupe dans lrsquoannuaire LDAP

On peut remarquer que pour la gestion des listes de diffusion nous avons

choisi de relier une personne agrave un groupe par son UID Ainsi lrsquoappartenance drsquoun

utilisateur agrave un groupe se traduit par la preacutesence de son adressemail dans lrsquoattribut

maildrop du groupe

Cela nous permet de geacuterer de maniegravere pratique les groupes auquels

appartient un utilisateur et inversement de sortir la liste des utilisateurs drsquoun groupe

avec une simple commande de typeldapsearch sur le serveur LDAP Pour ajouter ou

supprimer un utilisateur agrave un groupe il suffira de modifier lrsquoattribut maildrop du

groupe

Serveurs SMTP et DNS

Pour cette partie nous avons utiliseacute lrsquoexcellent Postfix Crsquoest une solution de

messagerie eacutelectronique libre rapide leacutegegravere seacutecuriseacutee et facile agrave administrer Crsquoest

aussi le serveur mail par deacutefaut dans plusieurs systegravemes de type UNIX Il permet

notamment drsquoeacuteviter une bonne partie du spam avec une configuration simple et

accessible

Il est important aussi de respecter les speacutecifications de la RFC Nous avons eu

la surprise de voir qursquoil est ldquoimpeacuteratifrdquo drsquoavoir deux adresses particuliegraveres sur le

serveur postmaster et abuse Ce sont les premiegraveres victimes des attaques par force

brute

La configuration de Postfix se fait de maniegravere eacutetroite avec Bind le serveur de

nom de domaine que nous avons installeacute En effet pour que Postfix fonctionne il est

essentiel que lrsquoenregistrement MX du serveur DNS fonctionne Crsquoest un type

drsquoenregistrement particulier qui permet la mise en place drsquoun serveur mail

De plus il est neacutecessaire de faire un enregistrement PTR qui correspond agrave au

DNS inverse Il nrsquoest pas indispensable au fonctionnement du serveur mail en soit

mais la plupart des fournisseurs de ce type de service se servent de cet

enregistrement pour contrer une partie du spam Il est donc possible que les mails

drsquoun serveur soient bloqueacutes si lrsquoenregistrement PTR est mal configureacute

Parallegravelement nous avons aussi proceacutedeacute agrave lrsquoenregistrement A qui permet la

mise en place drsquoun serveurWeb neacutecessaire agrave notreWebmail Nous avons utiliseacute des

outils en ligne tel que DNSStuff pour tester notre configuration dont un exemple se

trouve en annexe Notons par contre que la technologie DNSSEC nrsquoest pas mise en

place sur les domaines pw par Gandinet notre fournisseur Nous nrsquoavons donc pas

pu lrsquoimpleacutementer

Nous avons configureacute Postfix pour qursquoil utilise notre annuaire LDAP Il est

possible agrave ce stade de tester la configuration avec telnet et drsquoenvoyer unmail Apregraves

cela nous avons testeacute le bon fonctionnement du serveur en envoyant avec succegraves

un mail vers une boicircte mail exteacuterieure de type gmail

Nous nous sommes alors heurteacutes aux protections du Service Informatique de

lrsquoUniversiteacute (CRI) qui bloque le port 25 en sortie et en entreacutee en dehors de lrsquouniversiteacute

Pour nous astreindre de ces restrictions nous avons migreacute notre serveur vers une

nouvelle connexion SDSL exteacuterieure au reacuteseau de Lille 1 Cela a eacuteteacute pour nous un

moyen de veacuterifier en partie la portabiliteacute de notre systegraveme puisque nous utilisons une

toute nouvelle connexion avec une nouvelle adresse IP Nous avons donc ducircmettre

agrave jour notre serveur de nom pour refleacuteter ces changements La migration srsquoest

passeacutee sans soucis avec un deacutelai de propagation des changements drsquoenviron 1

heure Le systegraveme est resteacute fonctionnel agrave 100 notamment parce que dans notre

code nous faisons appel au serveur par localhost ou une variable et jamais

directement lrsquoadresse IP ou le domaine Cependant nous nrsquoavons pas pu veacuterifier la

migration vers un domaine diffeacuterent bien que cela ne reste normalement qursquoune

variable dans les fichiers de configuration de lrsquointerface

Gestion du Spam

Comme preacutevu nous avons apporteacute une solution agrave la gestion du spam sur

notre serveur Postfix propose dans ses paramegravetres lrsquoutilisation de services de

DNSBL (DNS Black List) Cette technologie reprend le mecircme principe que les

serveurs de noms classiques Postfix soumet une requecircte de type DNS aux serveurs

de liste noire deacutefinis dans sa configuration et le serveur indique si ce nom de

domaine est preacutesent dans sa liste ou non On peut de cette maniegravere rejeter une

bonne partie du trafic mail correspondant au Spam et ce tregraves facilement

Malgreacute cela nous pensons qursquoune partie du Spam passera agrave travers les

mailles du filet Il aurait eacuteteacute inteacuteressant de traiter ceux-ci pour les classer comme

indeacutesirables et pouvoir ainsi les afficher dans lrsquointerface web

Serveur Web et Webmail

Un serveur web leacuteger

Initialement nous sommes partis sur une solution classique agrave base drsquoun

serveur web Apache qui nous a permis de deacutebuter le deacuteveloppement de lrsquointerface

Cependant comme nous cherchons agrave alleacuteger un maximum le systegraveme nous nous

sommes pencheacutes sur une autre solution Lighttpd Ce serveur web vise comme son

nom lrsquoindique la performance et la leacutegegravereteacute Sur le mecircme contenu avec une

connexion Tregraves Haut Deacutebit (100Mbps) nous chargeons deacutesormais la page de vue

geacuteneacuterale en 042s (Lighttpd) contre 170s avant (Apache 2) avec le navigateur

Chrome sans cache

Une architecture optimiseacutee

Lrsquoutiliteacute de reacutealiser notre propre webmail est dans un premier temps de

srsquoabstenir de lrsquoinstallation drsquoun serveur IMAPPOP puisque nous retrouvons

nous-mecircmes le contenu Dans un second temps il nous permet de ne garder que les

fonctionnaliteacutes neacutecessaires agrave notre webmail sans superflu

Fig 5 La vue geacuteneacuterale de notre webmail

Gracircce agrave PHP et agrave son module drsquointerface avec LDAP nous pouvons identifier

un utilisateur avec son nom drsquoutilisateur et son mot de passe sur le serveur local

LDAP et ainsi retrouver nombreuses informations utiles comme le quota actuel

autoriseacute son nom entier le chemin drsquoaccegraves agrave son reacutepertoire dans lesquels sont ses

mails sur le systegraveme de fichiershellip

Fig 6 Lrsquoarchitecture du dossier drsquoun utilisateur des dossier sent et inbox contenant les

mails bruts un dossier json dans lequel sont placeacutes les entecirctes des mails ainsi que le quota

Chaque en-tecircte de mail est eacutecrite dans un fichier json distinct par boicircte (un

fichier pour la boicircte de reacuteception un fichier pour les mails envoyeacuteshellip) ce qui nous

permet de montrer agrave lutilisateur la liste des mails dune boicircte sans traitement lourds

en arriegravere plan pour le serveur Ces fichiers sont renseigneacutes par un script lanceacute agrave la

reacuteception drsquoun mail par postfix du cocircteacute reacuteception et par lrsquointerface web elle mecircme

pour lrsquoeacutemission Lrsquoen-tecircte drsquoun mail est eacutecrite dans un conteneur JSONde lamaniegravere

suivante

Fig 7 Exemple drsquoentreacutee dans un fichier json

Gracircce tout cela nous pouvons afficher simplement le contenu des diffeacuterentes

boicirctes mail dans des tableaux sur lrsquointerface gracircce aux en-tecirctes et par la suite

retrouver et afficher le contenu drsquoun mail agrave partir de son fichier brut sur lequel

lrsquoutilisateur aura cliqueacute comme on le verra un peu plus loin

Toujours dans un souci drsquoameacutelioration des performances le strict neacutecessaire

est geacuteneacuteralement chargeacute sur les pages web par exemple en venant de la vue

geacuteneacuterale lorsqursquoon clique surInboxseule la partie inteacuterieure de la page est chargeacutee

on ne recharge pas le bandeau du haut de page ou lemenu de gauche agrave lamaniegravere

drsquoun MVC classique

Envoyer des courriels

Toute cette architecture ne doit pas nous faire oublier le but premier envoyer

et recevoir des mails Pour envoyer des mails crsquoest tregraves simple on peut soit cliquer

dans le bandeau du haut sur ldquoQuick Emailrdquo qui permet sur lamecircme page drsquoenvoyer

un email rapide et sans piegravece-jointe soit cliquer dans la barre de navigation sur le

cocircteacute sur ldquoWrite a new emailrdquo ce qui nous megravene vers une page deacutedieacutee permettant

drsquoeacutecrire un email incluant une piegravece jointe

Fig 8 Envoyer un mail crsquoest simple comme bonjour

On peut remarquer sur cette capture drsquoeacutecran que lrsquoon ne peut envoyer que

certains types de piegraveces jointes Nous supportons JPG PNG GIF PDF et ZIP Si la

piegravece jointe est drsquoun autre format elle est rejeteacutee La veacuterification du type srsquoeffectue

sur lrsquoextension du fichier et sur son type MIME ce qui eacutevite par exemple que

quelqursquoun modifie lrsquoextension drsquoun fichierexe en fichierjpg pour lrsquoenvoyer La piegravece

jointe doit de plus avoir une taille infeacuterieure agrave la taille maximale drsquoune piegravece jointe

parameacutetreacutee par lrsquoadministrateur comme nous le verrons dans lrsquointerface

drsquoadministration

Si tous ces critegraveres sont bons on eacutecrit lemail au format brut deacutecrit par la RFC

puis on lrsquoexpeacutedie agrave lrsquoaide de la fonction mail de PHP Si cette fonction nrsquoeacutechoue pas

crsquoest que le mail est expeacutedieacute avec succegraves on peut alors mettre agrave jour le quota

drsquoespace disque maximum autoriseacute agrave lrsquoutilisateur en increacutementant celui-ci avec la

taille du mail qui vient drsquoecirctre envoyeacute ainsi que creacuteer un fichiermail brut sur le disque

pour pouvoir afficher le mail dans la boicircte drsquoenvoi et en garder une trace

Notons que comme crsquoest lrsquoutilisateur web du systegraveme (www-data) qui exeacutecute

la fonction nous modifions les en-tecirctes du mail afin que le destinataire reccediloive un

mail de la part de ldquoPreacutenom Nomrdquo depuis lrsquoadresse ldquopnomdomainetldrdquo plutocirct que

ldquowww-datadomaintldrdquo par deacutefaut

La migration vers une IP externe agrave Lille 1 eacutetant reacuteussie nous pouvons bien

envoyer des mails depuis notre interface qui sont reccedilus agrave lrsquoexteacuterieur sans soucis

Mais aussi en recevoir

Recevoir des mails est tout aussi important Nous avons vu lrsquoarchitecture en

arriegravere-plan mais au final agrave quoi cela ressemble-t-il pour lrsquoutilisateur Il dispose en

fait en cliquant sur Inbox (ou Sent Spam ou Trash eacutegalement) drsquoun accegraves agrave sa boicircte

de reacuteception Drsquoun clic srsquoaffichent alors agrave lui tous les mails qursquoil a reccedilu

Fig 9 La boicircte de reacuteception

On remarque notamment les fonctions de recherche drsquoactualisation du

tableau de choix des colonnes agrave afficher on peut classiquement choisir combien de

lignes on affiche par page changer de pages etchellip

Lorsque lrsquoon clique sur un des lignes les donneacutees de lrsquoen-tecircte du mails sont

passeacutes en paramegravetres agrave une autre page qui drsquoapregraves ces informations retrouve le

fichier mail brut le traite et lrsquoaffiche

Fig 10 Un mail contenant 3 piegraveces jointes et un message

Comme on peut le voir nous pouvons recevoir desmails avec plusieurs piegraveces

jointes Nous avons ici preacutesenteacute la boicircte de reacuteception mais les autres boicirctes

fonctionnent de maniegravere similaire

Interface drsquoadministration

Le systegraveme de webmail possegravede plusieurs variables des listes de diffusion

des compteshellipMais on veut pouvoir donner les droits agrave un utilisateur demodifier tout

cela En effet si nous trouvons cela abordable drsquoajouter un utilisateur avec une

commande dans le shell il faut aussi penser agrave lrsquoutilisateur final qui preacutefegravere peut-ecirctre

le confort drsquoune interface deacutedieacutee pour geacuterer son serveur mail plutocirct que le terminal

De maniegravere tregraves simple un utilisateur appartenant au groupes drsquoutilisateurs

ldquoAdministrateursrdquo est reconnu en tant qursquoadministrateur par lrsquointerface et peut

cliquer sur un bouton ldquoManagerdquo dans le panneau lateacuteral qui nrsquoest visible qursquoaux

administrateurs De lagrave il arrive sur la page suivante

Fig 11 lrsquointerface drsquoadministration

Sur cette interface il peut choisir la taille maximale des piegraveces jointes

changer le nom de domaine sur lequel est installeacute lrsquointerface et dont deacutependent

toutes les adresses (domaine) Il est aussi possible de modifier directement ces

variables en modifiant le fichier includeconfigincphp Pratique notamment si lrsquoon

a renseigneacute un mauvais nom de domaine agrave la configuration et que lrsquoon arrive plus agrave

acceacuteder agrave lrsquointerface

Il peut aussi creacuteer un nouveau compte en renseignant les champs preacutenom

nom mot de passe et quota Lrsquoutilisateur peut ensuite une fois son compte creacutee

directement se connecter avec son identifiant (initiale preacutenom + nom) et mot de

passe Lors de la creacuteation du compte un mail de bienvenue est envoyeacute au nouvel

utilisateur ce qui permet en arriegravere-plan de creacuteer tous les dossiers utilisateurs et

fichiers en-tecirctes utiles agrave lrsquointerface une fois pour toutes

Lrsquoadministrateur peut aussi ajouter une liste de diffusion (assimileacutee agrave un

groupe) ou en supprimer une parmi les listes existantes

En outre lrsquoadministrateur peut aussi modifier les donneacutees drsquoun utilisateur

Pour cela sur la preacutesente page il peut seacutelectionner un utilisateur parmi la liste des

utilisateurs existants ce qui le redirige vers la page de gestion des comptes

Fig 12 La gestion drsquoun compte seacutelectionneacute ici celui de James Bond

A ce stade il peut changer lrsquoUID de lrsquoutilisateur (utile en cas de conflit) le nom

le mot de passe le quota de cet utilisateur et lrsquoajouter ou le retirer drsquoune liste de

diffusion Accessoirement il peut aussi supprimer le compte en cliquant sur lrsquoeacutenorme

bouton rouge qui lui demandera deux fois de suite de confirmer son action afin

drsquoeacuteviter les erreurs de clic Cette action entraicircne la suppression de lrsquoutilisateur de

toutes les listes de diffusion auxquelles il appartient la suppression de son compte

dans la branche people de lrsquoarbre LDAP et la suppression deacutefinitive de son dossier

utilisateur sur le disquesystegraveme de fichiers impliquant donc la perte de ses mails

Architecture du systegraveme de fichiers

Comme nous lrsquoavons dit plus haut lrsquoideacutee est de se passer des meacutecanismes

classiques avec les clients mails habituels Ces serveurs srsquoalourdissent

geacuteneacuteralement en utilisant des serveurs IMAPPOP3 et un meacutecanisme

drsquoauthentification SMTP

Pour adapter ces fonctionnaliteacutes agrave notre systegraveme nous avons donc constitueacute

une architecture pour organiser les fichiers qui transitent Vous pourrez voir un

scheacutema reacutecapitulatif en annexe 1

Dans la premiegravere moitieacute du projet les mails eacutetaient deacutelivreacutes par Postfix Nous

utilisions un script exeacutecuteacute lors de la reacuteception drsquounmail pour les traiter de lamaniegravere

que nous voulions Cette meacutethode avait les inconveacutenients drsquoecirctre lourde et pas

efficace agrave 100 En effet seuls les mails reccedilus depuis lrsquoexteacuterieur eacutetaient

correctement traiteacutes

Deacutesormais les mails sont traiteacutes totalement par notre script Cela nous

permet de geacuterer les mails dans des dossiers organiseacutes agrave notre maniegravere et de

recevoir les mails locaux crsquoest-agrave-dire entre utilisateurs du mecircme domaine Cette

nouvelle meacutethode regravegle aussi drsquoautres problegravemes notamment au niveau des

permissions sur les fichiers

Pour reacuteduire le nombre drsquoopeacuterations et pour profiter des fonctionnaliteacutes

offertes par le framework utiliseacute pour lrsquointerface web nous regroupons des

informations sur chacun des mails reccedilus sous la forme de fichiers JSON Pour ce

faire lrsquoideacutee est drsquoexeacutecuter un script lorsque leacutevegravenement ldquoreacuteception drsquoun mailrdquo

survient Postfix offre cette possibiliteacute dans sa configuration Or il se trouve qursquoil nrsquoest

pas si simple de reacutecupeacuterer le chemin du fichier contenant le mail car le nom du

fichier creacutee est sous la forme Timestamp UNIX10 Caractegraveres aleacuteatoires (ex

14562336185A8D43E97F)

La seconde probleacutematique est que le webmail doit avoir la possibiliteacute de

pouvoir lire les fichiers pour afficher les mails sur son interface Or il semble que

Postfix les eacutecrit en autorisant uniquement son utilisateur en lecture Il nous a fallu

trouver une solution pour remeacutedier agrave cela Nous avons choisi drsquoajouter www-data

(utilisateur du serveur web) au groupe vmail et de modifier les droits sur les fichiers

de sorte que les utilisateurs de ce groupe puissent lire les fichiers

Nous avons revu une partie de lrsquoorganisation des fichiers pour reacutecupeacuterer les

piegraveces jointes si elles sont preacutesentes Le script que nous avons eacutecrit reacutecupegravere le

fichier original du mail et le deacutecoupe en eacuteleacutements simples dans des fichier distincts

corps du mail et diffeacuterentes piegraveces jointes De cette maniegravere pour afficher un mail

nous nrsquoavons pas besoin de charger la totaliteacute du fichier Dans le cas ougrave il y a des

piegraveces jointes cela aurait ralenti lrsquoaffichage des informations

Nous avons eacutegalement impleacutementeacute la gestion des quotas Dans lrsquoeacutetat actuel

des choses srsquoil nrsquoy a plus de place disponible pour lrsquoutilisateur le mail nrsquoest tout

bonnement pas deacutelivreacute agrave ce destinataire Lrsquoideacuteal aurait eacuteteacute de notifier leacutemetteur avec

un mail ce qui nrsquoest pour lrsquoinstant pas le cas mais qui pourrait ecirctre reacutesolu en

renvoyant agrave postfix un code drsquoerreur deacutefini

Pour terminer nous avons revu la totaliteacute du code deacuteveloppeacute Nous sommes

passeacute du Bash au Perl Ce dernier est plus performant et plus simple agrave utiliser et agrave

lire

Firewall

Un autre gros morceau du projet mais qui nrsquoest pas speacutecifiquement lieacute agrave la

probleacutematique du mail crsquoest la seacutecurisation du serveur En effet apregraves avoir mis en

ligne notre serveur des pirates ont tregraves vite tenteacute de peacuteneacutetrer le systegraveme

Globalement les attaques eacutetaient de type force brute sur les services heacutebergeacutes sur

notre Raspberry neacutecessitant une identification tels que SSH SMTP hellip

On retrouve ici un petit point faible du protocole SMTP Eacutetant donneacute que

chaque serveur mail doit avoir une adresse postmaster et abuse lrsquoattaquant a agrave sa

disposition deux adresses agrave attaquer Ceci dit ce type drsquoattaque est simple agrave

contrecarrer car il suffit de limiter dans le temps le nombre de tentatives de

connexions

La contre-mesure que nous avons mis en place est simple une seacuterie de

regravegles Iptables En reacutesumeacute nous avons opteacute pour un systegraveme de liste blanche et

noire Les adresses IPs de la liste blanche sont autoriseacutees agrave utiliser la totaliteacute des

services (notamment SSH) tandis que celles de la liste noire sont totalement

ignoreacutees Les autres IPs nrsquoont accegraves qursquoau webmail

Eacutetant donneacute que le nombre drsquoIPs attaquant notre serveur nrsquoa cesseacute

drsquoaugmenter nous avons automatiseacute la mise agrave jour de la liste de noire en

deacuteveloppant un script pour Cron Ce script est exeacutecuteacute une fois par heure A ce jour

notre liste noire contient 47 adresses Bien sucircr ce systegraveme est susceptible drsquoecirctre

modifieacute agrave convenance pour passer sur une solution deacutedieacutee telle que Fail2ban qui fait

en fait ce qursquoon fait deacutejagrave (eacutetudier les logs et bannir des IP avec iptables) avec des

regravegles preacutedeacutefinies par la communauteacute et personnalisables En effet nous nous

attendons agrave voir la varieacuteteacute et le nombre drsquoattaques augmenter apregraves avoir migreacute sur

une IP non proteacutegeacutee par le firewall de lrsquoUniversiteacute puisque nous nrsquoavons plus la

premiegravere ligne de deacutefense du CRI en particulier pour le port 389 (LDAP) qui eacutetait

bloqueacute par lrsquouniversiteacute et srsquoest retrouveacute en premiegravere ligne apregraves la migration Nous

avons donc ajouteacute une regravegle bloquant tout le trafic entrant vers le port 389 hormis

localhost

Package drsquoinstallation

Nous avons creacutee un package deb contenant les sources du webmail ainsi

que des scripts utiles agrave lrsquoinstallation et au fonctionnement du serveur Nous avons

deacuteveloppeacute des scripts de configuration automatique pour LDAP et Postfix Comme

dpkg ne supporte pas directement lrsquoinstallation automatique des deacutependances

nous recommandons drsquoinstaller avant tout le paquet gdebi-core qui est en fait un

dpkg ameacutelioreacute Gracircce agrave la commande gdebi paquetdeb toutes les deacutependances

seront installeacutees en particulier postfix le serveur ldap le serveur web lighttpd entre

autres sans soucis Il est agrave noter que comme les scripts de configuration des

diffeacuterents services ne sont que partiellement impleacutementeacutes dans le paquet deb nous

fournissons en annexe un README complet et illustreacute qui explique pas agrave pas

comment faire fonctionner notre systegraveme sur nrsquoimporte quel Linux en particulier les

lignes de configuration des diffeacuterents services agrave changer et un exemplaire des

fichiers de configuration fonctionnels de ces services

Gestion de lrsquoeacutenergie

Une consideacuteration importante pour un systegraveme autonome Drsquoapregraves les fiches

techniques notre modegravele de Raspberry Pi (B 2) est officiellement eacutevalueacute avec un

fonctionnement agrave ~650mA pour 5V De nombreux proprieacutetaires de ce systegraveme

eacutequipeacutes se sont amuser agrave veacuterifier la consommation eacutelectrique reacuteelle de leur Pi 2 B

sous diffeacuterentes charges On pourra retenir cette eacutetude (lien en sitegraphie) qui

relegraveve la consommation en courant en fonction de lrsquoactiviteacute lanceacutee sur la Pi mais

aussi en charge sur 1 agrave 4 CPU

Ces chiffres sont releveacutes sur un systegraveme avec cameacutera connecteacutee HDMI connecteacute et

cacircble ethernet brancheacute et actif

On peut constater que globalement notre systegraveme Pi 2 B tournant sans

interface graphique sans composant suppleacutementaire sans sortie videacuteo ni cameacutera

avec plusieurs serveurs tournant tout en restant le plus leacuteger possible et demeurant

~99 idle la plupart du temps ne devrait pas deacutepasser une consommation de

300mA grand maximum

Fig 13 Un processeur tregraves tregraves peu chargeacute et une meacutemoire relativement libre

Nous avions lrsquoanneacutee derniegravere deacutejagrave reacutealiseacute un circuit permettant drsquoadapter un

panneau solaire sur une batterie USB classique de 9000mAh Nous avions alors pu

mesurer lrsquointensiteacute deacutelivreacutee par le panneau solaire En cas drsquoensoleillement moyen

habituel dans nos contreacutees le panneau solaire deacutebitait 400mA et pouvait atteindre

le double quand le soleil eacutetait directement preacutesent pour environ 800mA deacutebiteacute

Ce panneau solaire accompagneacute de son circuit drsquoadaptation devrait donc

suffire pour alimenter notre systegraveme la journeacutee le brancher ensuite sur une batterie

portable permet de stocker le surplus pour la nuit

Fig 14 le circuit drsquoadaptation

Fig 15 et son PCB

Eacutevolutions possibles

Webmail

Concernant les eacutevolutions possibles que nous aurions aimeacute apporter agrave notre

projet avec plus de temps commenccedilons par le web Nous aurions souhaiteacute apporter

la gestion de lrsquoenvoi de plusieurs piegraveces jointes comme nous lrsquoavons fait pour la

reacuteception

De plus nous aurions voulu inteacutegrer une corbeille ougrave lesmessages pourraient

aller avant drsquoecirctre deacutefinitivement supprimeacutes du systegraveme drsquoautant que nous avons

deacutejagrave eacutecrites les fonctions PHP permettant de retirer une en-tecircte drsquoun fichier JSON et

le fichier mail associeacute

Enfin nous aurions aimeacute en plus du blocage deacutejagrave preacutesent impleacutementer une

gestion plus profonde des piegravece jointes permettant notamment le remplissage de la

boicircte de spams

Systegraveme

Il aurait eacuteteacute inteacuteressant de notifier lrsquoexpeacutediteur lorsque le mail nrsquoa pas pu ecirctre

deacutelivreacute agrave un utilisateur lorsque son quota est plein En toute logique cela devrait ecirctre

fait simplement avec la commande Sendmail

Une meilleur gestion du trafic mail indeacutesirable aurait eacuteteacute la bienvenue En

effet malgreacute la limitation du spam il restera toujours une partie du volume de mail

qui sera indeacutesirable (pub pishing scam hellip)

Eacutetant donneacute la taille du systegraveme nous avions penseacute agrave une approche

ldquomachine learningrdquo Lrsquoutilisateur indiquerait pourquoi il considegravere le mail comme

indeacutesirable constituant des regravegles refusant certains mails Les mails provenant de

cet expeacutediteur pourraient ecirctre deacutetecteacute par le script agrave la reacuteception et

automatiquement envoyeacutes dans la boicircte de spams

Partie eacutenergeacutetique

Mecircme si la solution au panneau solaire ne pose aucun problegraveme en theacuteorie

nous aurions deacutejagrave dans un premier temps aimeacute lrsquoimpleacutementer en pratique Nous

nrsquoavons finalement pas reacutealiseacute notre objectif de deacutetecter deux cas drsquoalimentation

diffeacuterents soit lrsquoalimentation via panneau solaire est suffisante dans ce cas il

alimente la batterie et donc la Raspberry soit quand ce courant nrsquoest pas suffisant

on alimente la batterie par le secteur

Conclusion

En conclusion nous pensons avoir reacutepondu au cahier des charges initial dans

sa majeure partie Nous sommes aujourdrsquohui en mesure de proposer une solution

mail domestique priveacutee et personnalisable par un particulier

Notre installation de Debian a eacuteteacute au maximum alleacutegeacutee pour notre utilisation

sans interface graphique et nous avons mis en place une reacuteponse aux diverses

attaques que nous avons pu subir lors de lamise en place de notre solution logicielle

En outre le pare-feu avec notre systegraveme de liste noire bloque une partie des

attaques qui peuvent nous parvenir

Nos diffeacuterents scripts de pare-feu de gestion drsquoun mail entrant associeacute au

webmail permettent agrave un utilisateur drsquoacceacuteder aux fonctions usuelles associeacutees agrave

lrsquoenvoi et la reacuteception de mails

Gracircce agrave sa configuration personnalisable notre projet devrait pouvoir ecirctre

porteacute sur un domaine et une adresse IP diffeacuterente sans soucis et ecirctre deacuteployeacute

partout ougrave des gens souhaitent conserver leur vie priveacutee

Nous regretterons cependant de ne pas avoir exploiteacute la partie eacutenergeacutetique

de ce projet qui portait une probleacutematique inteacuteressante et qui nous parait importante

dans le monde actuel

Ce projet nous aura occupeacute pendant tregraves longtemps et nous sommes fiers du

travail que nous avons accompli Il est agrave nos yeux la preuve de ce que nous savons et

pouvons faire et nous donnera confiance pour notre deacutebut de carriegravere drsquoingeacutenieur

Sources

httpwwwradicaticomwpwp-contentuploads201401Email-Statistics-R

eport-2014-2018-Executive-Summarypdf

httpwwwcommentcamarchenetcontents525-le-protocole-ldap

httpsfrwikipediaorgwikiSimple_Mail_Transfer_Protocol

httpwwwcommentcamarchenetcontents536-pop3-smtp-imap-protocol

es-de-messagerie

httpstoolsietforghtmlrfc2821

httpsfrwikipediaorgwikiInternet_Message_Access_Protocol

httpstoolsietforghtmlrfc3501

httparstechnicacominformation-technology201402how-to-run-your-ow

n-e-mail-server-with-your-own-domain-part-1

httpswwwraspberrypiorgforumsviewtopicphpp=136912

httpstackoverflowcomquestions17394356how-can-i-make-a-bash-com

mand-run-periodically

httpuntroubledorgnullmailer

httpelinuxorgRPi_Hardware

httpraspitv2015raspberry-pi2-power-and-performance-measurement

Annexe 1 Architecture du systegraveme de fichiers

Annexe 2 Scan DNSSTUFF

Depuis httpwwwdnsstuffcomtoolsdnsReport|type=domainampampvalue=intimailpw

Annexe 3 Vue geacuteneacuterale httpswwwintimailpw

Annexe 4 Envoyer un mail

Annexe 5 Boite de reacuteception

Annexe 6 Interface drsquoadministration

Annexe 7 Gestion drsquoun utilisateur

Tutorial installation intimailtrade

Table des matiegraveres Apregraves une nouvelle installation de lrsquoOS 2

Seacutecurisation du serveur 2

Changement de lrsquoutilisateur par deacutefaut 2

Changement du port SSH 2

Interdire lrsquoauthentification SSH pour root 2

Installation de LDAP 3

Configuration de base 3

Configuration des Scheacutemas 4

Constitution de la base de donneacutees LDAP 5

Installation de Postfix 7

Installation de Bind9 8

Installation du paquet Debian et configuration de lighttpd 9

Deacutependances 11

Sources 12

2

Apregraves une nouvelle installation de lrsquoOS Exeacutecutez ces commandes pour mettre agrave jour agrave la derniegravere version Ces opeacuterations peuvent prendre un certain

temps Nous avons utiliseacute pour cet exemple Raspbian Jessie Lite sur une Raspberry Pi 2

apt-get update

apt-get upgrade ampamp apt-get dist-upgrade

apt-get install linux-headers-$(uname -r)

reboot

Puis lancer

raspi-config

Etendre au maximum lrsquoespace de stockage en navigant dans les menus

Expand Filesystem

Reacutegler une ip statique avec la box fichier etcnetworkinterfaces

iface eth0 inet static

address 192168131

netmask 2552552550

gateway 19216811

Nous avons aussi supprimeacute wpasupplicant

Seacutecurisation du serveur

Changement de lrsquoutilisateur par deacutefaut Changez le nom drsquoutilisateur par deacutefaut ainsi que son mot de passe

sudo passwd root

Sortie et login en tant que root puis

usermod -l myuname pi

usermod -m -d homemyuname myuname

groupmod ndashn myuname pi

passwd myuname

Voir cette adresse pour lrsquoutilisation de cleacutes priveacuteespubliques

Changement du port SSH sed ndashi sPort 22Port 2222g etcsshsshd_config

Interdire lrsquoauthentification SSH pour root sed -i sPermitRootLogin yesPermitRootLogin nog etcsshsshd_config

3

Installation de LDAP

Configuration de base Installation du package

apt-get install slapd

Choisir un mot de passe administrateur puis lancer la commande

dpkg-reconfigure slapd

Reacutepondre non agrave la question 1

Entrez le nom de domaine utiliseacute agrave la question 2 sous la forme domainetld

Entrez ce que vous voulez au 3egraveme eacutecran le nom de lrsquoorganisation ne sera pas utiliseacute

Entrez un mot de passe

Choisissez HDB

Choisissez si la base de donneacutees est supprimeacutee agrave la deacutesinstallation de slapd

Deacuteplacez lrsquoancienne base de donneacutees

Nrsquoutilisez pas LDAPv2

Installer les outils de conversion pour ldap (slaptest ldapmodify notamment)

apt-get install ldap-utils

On peut maintenant veacuterifier que la configuration est valable

ldapsearch -x -h localhost -b dc=domainedc=tld -LLL dc=domaine dn

Cette commande doit retourner quelque chose comme

dn dc=domainedc=tld

Il faut maintenant seacutecuriser le serveur LDAP en effet on peut y acceacuteder en anonyme avec la commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=config

(amp(objectClass=olcDatabaseConfig)(olcSuffix=dc=domainedc=tld))

Cette commande retourne un certain nombre drsquoinformations notamment agrave propos des champs suivants

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by none

olcAccess 1to dnbase= by read

olcAccess 2to by read

On va modifier ces champs avec la commande ldapmodify Pour cela on va creacuteer un fichier ldif

cat gt changeAccessldif ltlt EOF

dn olcDatabase=1hdbcn=config

changetype modify

delete olcAccess

-

add olcAccess

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by dn=cn=admindc=domainedc=tld write by none

-

add olcAccess

olcAccess 1to dnbase= by read

-

4

add olcAccess

olcAccess 2to by self write by dn=cn=admindc=domainedc=tld write by

none

-

EOF

On peut maintenant appliquer les changements avec ldapmodify

ldapmodify ndashc ndashY EXTERNAL ndashH ldapi -f changeAccessldif

La commande devrait vous confirmer que la modification srsquoest bien effectueacutee

SASLEXTERNAL authentication started

SASL username gidNumber=0+uidNumber=0cn=peercredcn=externalcn=auth

SASL SSF 0

modifying entry olcDatabase=1hdbcn=config

On peut veacuterifier qursquoon ne peut plus acceacuteder aux informations avec la commande

ldapsearch -x -c -h localhost -b dc=domainedc=tld

On peut veacuterifier la configuration en se connectant en tant qursquoadministrateur

ldapsearch -c -h localhost -b dc=domainedc=tld -D

cn=admindc=domainedc=tld ndashW

Configuration des Scheacutemas Nous allons utiliser les scheacutemas de courier-ldap Pour eacuteviter une manipulation compliqueacutee vous trouverez

directement le scheacutema avec le fichier authldapschema On place ce fichier dans le dossier

mv authldapschema etcldapschema

Nous creacuteons un fichier qui incluera tous les scheacutemas de base en plus du nouveau On peut les afficher avec la

commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

Creacuteation du fichier de configuration pour notre exemple cela donne

mkdir tmpldapconf

cat gt tmpldapconfldapconf ltlt EOF

include etcldapschemacoreschema

include etcldapschemacosineschema

include etcldapschemanisschema

include etcldapschemainetorgpersonschema

include etcldapschemaauthldapschema

EOF

On lance ensuite la commande

slaptest -f tmpldapconfldapconf -F tmpldapconf

Elle revoie un message de succegraves Cette commande a creacuteeacute dans le reacutepertoire tmpldapconf une arborescence

correspondant agrave la configuration de notre LDAP

On modifie le chemin de configuration

5

sed ndashi 0dnauthldap sauthldapauthldapcn=schemacn=config

cn=authldapldif

On supprime ensuite les 7 derniegraveres lignes du fichier

head -n -7 cn=authldapldif gt tmpldif

mv tmpldif cn=authldapldif

On peut maintenant importer notre fichier de configuration Pour ce faire

ldapadd -Y EXTERNAL -H ldapi -f

tmpldapconfcn=configcn=schemacn=authldapldif

Si tout va bien lrsquoentreacutee devrait avoir eacuteteacute ajouteacutee On peut veacuterifier avec la commande vue tout agrave lrsquoheure

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

On devrait voir en plus le nouveau scheacutema authldap

Constitution de la base de donneacutees LDAP Le remplissage de la base se fait agrave lrsquoaide de fichiers ldif Nous donnons ici un exemple de structure

Fichier pour la structure de base

dn dc=maildc=domainedc=tld

o intimailpw

description Global mail tree

dc mail

objectClass top

objectClass dcObject

objectClass organization

dn dc=peopledc=maildc=domainedc=tld

description Informations of all users

o people

dc people

objectClass top

objectClass dcObject

objectClass organization

dn dc=groupsdc=maildc=domainedc=tld

description All groups of users

o groups

dc groups

objectClass top

objectClass dcObject

objectClass organization

6

Fichier pour ajouter un utilisateur

dn cn=jbonddc=peopledc=maildc=domainedc=tld

uid jbond

mail jbonddomainetld

sn Moulin

givenName James

displayName James Bond

mailbox domainetldjbond

quota 50M

homeDirectory homevmail

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAccount

userPassword SSHA367PSXiUAegy8dpJbPU8OepEf8L5ye

Pour obtenir un hash du mot de passe

slappasswd -s password -h SSHA

On peut par la suite ajouter la configuration agrave la base de donneacutees avec la commande

ldapadd -D cn=admindc=domainedc=tld -W -h localhost -f pathtofile

Si les champs proposeacutes ne sont pas suffisants il faudra alors effectuer les modifications dans le fichier autldapschema

proposeacute plus haut et refaire la manipulation de configuration

De plus les standards du Mail deacutecrit par lrsquoIETF (RFC822 63 RFC1123 527 and RFC2821 451) impliquent drsquoavoir une

adresse Postmaster et une Abuse Pour cela nous pourrions creacuteer ces adresses avec la meacutethode vue au-dessus mais

ce nrsquoest pas la meilleure Il est preacutefeacuterable drsquoutiliser un alias comme nous le ferons avec les listes de diffusion Ici nous

proposons de rediriger ces deux adresses vers une adresse administrateur Pour cela la meacutethode est la mecircme sauf

que le fichier ldif nrsquoest pas tout agrave fait identique En voici un exemple

dn cn=postmasterdc=groupsdc=maildc=domainedc=tld

uid postmaster

mail postmasterdomainetld

sn Postmaster

displayName Postmaster

maildrop admindomainetld

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAlias

Pour faire une liste de diffusion la meacutethode est la mecircme Il suffit drsquoajouter toutes les adresses destinataires dans le

champ maildrop seacutepareacutees par des virgules ()

7

Installation de Postfix Installation des packages

apt-get install postfix postfix-ldap

Lors de lrsquoinstallation deux eacutecrans deacutefilent

- Configuration Internet Site

- Valeur par deacutefaut pour le mail name

On creacutee lrsquoutilisateur qui servira agrave exeacutecuter Postfix

groupadd vmail

useradd -g vmail -d homevmail -s binfalse -m vmail

Nous aurons besoin dans la suite des GID et UID creacuteeacutes agrave cet instant Ils peuvent ecirctre afficheacutes avec les commandes

cat etcgroup | grep vmail | cut -d -f3

cat etcpasswd | grep vmail | cut -d -f3

On ajoute les paramegravetres au fichier etcpostfixmaincf (remplacer les valeurs de GID et drsquoUID avec vos valeurs)

smtpd_banner = maildomainetld

virtual_mailbox_base = homevmail

virtual_mailbox_domains = dmainetld

virtual_mailbox_maps = ldapetcpostfixldap_accountscf

virtual_alias_maps = ldapetcpostfixldap_aliasescf

virtual_minimum_uid = 100

virtual_gid_maps = static1001 Remplacez ici par votre valeur de GID

virtual_uid_maps = static1001 Remplacez ici par votre valeur drsquoUID

Il nous faut maintenant constituer nos fichiers de configuration ldap_accountscf

cat gt etcpostfixldap_accountscf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=peopledc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAccount)(mail=s))

result_attribute = mailbox

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

Et pour ldap_aliasescf

cat gt ldap_aliasescf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=groupsdc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAlias)(mail=s))

result_attribute = maildrop

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

8

On peut maintenant veacuterifier la configuration de Postfix avec (cette commande ne doit rien retourner si crsquoest bon)

postfix check

Si crsquoest bon alors on recharge le serveur

postfix reload

On peut alors faire un envoi de mail test via telnet

telnet localhost 25

Si vous souhaitez deacutelivrer les mails agrave votre maniegravere il faut dans le fichier etcpostfixmaincf la ligne

virtual_transport = nomdevotreregle

Et de mecircme dans le fichier etcpostfixmastercf

nomdevotreregle unix - n n - 5 pipe

flags=Rq user=vmail null_sender=

argv=chemindevotreprogramme

Il nous reste maintenant agrave configurer les diffeacuterents enregistrements DNS neacutecessaire au fonctionnement drsquoun serveur

mail Vous pouvez utiliser la solution de votre choix Dans la suite vous trouverez une meacutethode utilisant Bind9

Installation de Bind9 Dans toute cette partie on se situera dans le dossier etcbind Dans la suite notre IP sera abcd

Dans le fichier namedconfoptions on ajoutera dans le champ options

version Not supported

Dans un dossier zones on eacutecrit le fichier dbdomainetld

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122111 Serial

43200 Refresh

3600 Retry

2419200 Expire

86400 ) Negative Cache TTL

IN NS nsdomainetld

IN NS ns11ovhnet

ns IN A abcd

www IN A abcd

IN A abcd

IN MX 10 maildomainetld

mail IN A abcd

Dans le mecircme dossier zones on a cbain-addrarpa

9

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122101 serial

14400 refresh

3600 retry

604800 expire

10800 minimum

)

cbain-addrarpa IN NS nsdomainetld

cbain-addrarpa IN NS ns11ovhnet

d IN PTR maildomainetld

Il faut faire attention agrave bien increacutementer le serial pour chaque modification des fichiers

Dans le fichier namedconflocal

zone domainetld

type master

file etcbindzonesdbdomainetld

allow-transfer 213251128130

notify yes

zone cbain-addrarpa IN

type master

file etcbindzonescbain-addrarpa

allow-transfer 213251128130

Ici 213251128130 est lrsquoadresse IP du serveur ns11ovhnet

Il faut bien sucircr configurer le DNS avec votre fournisseur (Gandi OVH hellip) Pour ccedila amusez-vous bien Vous pouvez

aussi tester votre configuration avec des outils en ligne tels que DNSstuff

En test final si votre configuration est bonne vous devriez pouvoir envoyer un mail depuis un service neutre (Gmail

yahoo hellip) et le voir dans votre arborescence (ici homevmaildomainetld)

Installation du paquet Debian et configuration de lighttpd

Commencez par reacutecupeacuterer le paquet deb agrave lrsquoadresse suivante httpswwwintimailpwintimaildeb

Installez ensuite GDebi Il srsquoagit drsquoun dpkg ameacutelioreacute pour teacuteleacutecharger les deacutependances automatiquement ce que

dpkg ne gegravere pas

apt-get update

apt-get install gdebi-core

10

Vous pouvez alors installer le paquet

gdebi intimaildeb

Vous aurez alors le site web drsquointiMail deacuteployeacute au chemin varwwwwebmail

Il ne vous reste plus qursquoagrave changer la configuration de lighttpd votre serveur web pour mettre en ligne le site

Vous pouvez pour cela copier-coller la configuration suivante mais veillez agrave bien changer lrsquoadresse IP preacutesente au

deacutebut de la partie SSL CONFIG avec votre adresse IP

serv ermodules = ( mod_access

mod_accesslog

mod_alias

mod_compress

mod_redirect

mod_rewrite

)

Hide server version

servertag = Such Headers Very try Now close telnet

serverdocument-root = varwwwwebmail

serverupload-dirs = ( varwwwwebmailuploads )

servererrorlog = varloglighttpderrorlog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

serverport = 80

accesslogformat = V h l u t r gts b Refereri

User-Agenti

accesslogfilename = varloglighttpdaccesslog

index-filenames = ( indexphp indexhtml

indexlighttpdhtml )

urlaccess-deny = ( ~ inc )

static-fileexclude-extensions = ( php pl fcgi )

compresscache-dir = varcachelighttpdcompress

compressfiletype = ( applicationjavascript textcss

texthtml textplain )

default listening port for IPv6 falls back to the IPv4 port

include_shell usrsharelighttpduse-ipv6pl + serverport

include_shell usrsharelighttpdcreate-mimeassignpl

include_shell usrsharelighttpdinclude-conf-enabledpl

SSL CONFIG

$SERVER[socket] == 5234485443

sslengine = enable

11

sslpemfile = etclighttpdsslintimailpwpem

sslca-file = etclighttpdsslintimailpwcrt

servername = intimailpw

votre configuration habituelle pour ce domaine

serverdocument-root = varwwwwebmail

servererrorlog = varloglighttpderror_ssllog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

Rewrite des URL pour masquer php

urlrewrite-once = ( ^()$ =gt $1 )

urlrewrite-if-not-file = ( ^([^])()$ =gt $1php$2 )

servernetwork-backend = writev

Deacutependances Slapd

Ldap-utils

Postfix

Postfix-ldap

Bind9

Lighttpd

12

Sources httpswikigandinetfrhostingusing-linuxtutorialsdebianmail-server-ldap

httpwwwpostfixorgpipe8html

httpwwwpostfixorgFILTER_READMEhtml

httpwwwpostfixorg

httpwwwpostfixorgtransport5html

Page 6: Système d'hébergement domestique...place sur les domaines .pw par Gandi.net, notre fournisseur. Nous n’avons donc pas pu l’implémenter. Nous avons configuré Postfix pour qu’il

Gestion des utilisateurs

Plusieurs comptes en utilisant LDAP

La possibiliteacute de sidentifier en tant quadministrateur

Listes de diffusion et groupes

Antivirus amp gestion des spams

iptables scripts shellperl de deacutetection par les logs drsquoattaques puis

mise en place de regravegles iptables via ces mecircmes scripts

Antispam maison synchronisation sur les blacklists existantes et

fiables rejet drsquoun spam

Nom de domaine et enregistrements associeacutes

Enregistrement A deacutefinit lrsquoadresse de nom drsquoun serveur web

Enregistrement MX deacutefinit lrsquoadresse de nom drsquoun serveur mail

Sauvegarde automatique peacuteriodique de la Raspberry Pi

Interface web

Gestion des comptes (creacuteation modification suppression)

Gestion des listes de diffusions

Gestion des quotas

Affichage du courrier

Paquets deb installable sur tout systegraveme Debian

Incluant un document explicatif pour lrsquoinstallation et la configuration

particuliegravere agrave apporter

Systegraveme pouvant ecirctre autonome en eacutenergie

Au coeur du projet

Gestion des utilisateurs - Le serveur LDAP

Comme il lrsquoeacutetait suggeacutereacute dans lrsquoeacutenonceacute du sujet nous nous sommes

inteacuteresseacutes agrave la solution LDAP Il srsquoagit drsquoun protocole de gestion drsquoannuaire baseacute sur

TCPIP Dans un premier temps nous avons penseacute agrave creacuteer un systegraveme de base de

donneacutees utilisant un simple systegraveme de fichiers car nous avions trouveacute ce systegraveme

trop compliqueacute agrave configurer agrave utiliser et trop lourd bien que plus leacuteger qursquoune Base

de Donneacutees classique

Cependant LDAP srsquoavegravere ecirctre un systegraveme parfaitement adapteacute pour la

gestion drsquoinformations utilisateurs En effet cette tacircche requiert beaucoup plus de

lectures que drsquoeacutecritures ce pourquoi LDAP est optimiseacute Ce programme preacutesente

lrsquoavantage de privileacutegier la lecture et disposes de nombreuses API dans les

langages de programmation divers dont PHP que nous utilisons crsquoest pourquoi

nous avons deacutecideacute de lrsquoutiliser

Le modegravele drsquoinformation de LDAP est baseacute sur des entreacutees Chacune drsquoentre

elles est un ensemble drsquoattributs Les informations sont organiseacutees sous la forme

drsquoun arbre Pour notre projet nous avons retenu la structure suivante

Fig 2 Structure de lrsquoannuaire LDAP

Nous avons ici deacutetermineacute des champs agrave renseigner pour constituer un

utilisateur En particulier un utilisateur dispose des attributs suivants

Son identiteacute (nom preacutenom(s))

Son identifiant utilisateur (UID) sous la forme comme agrave Polytech

initiale+nom(+chiffre) Son adresse mail compegravete sous la forme UIDdomainetld

Le chemin de sa boicircte mail sur le systegraveme domaineUID

Son quota (en octets)

Son mot de passe encrypteacute en SSHA

Fig 3 Une personne dans lrsquoannuaire LDAP

Les utilisateurs sont enregistreacutes dans la branche ldquopeoplerdquo de notre annuaire

Nous avons de plus une seconde branche ldquogroupsrdquo Celle-ci contient les listes de

diffusion Elle contient aussi le groupe particulier admins utilisateurs qui ont droit agrave

des options drsquoadministration sur le webmail

Fig 4 Un groupe dans lrsquoannuaire LDAP

On peut remarquer que pour la gestion des listes de diffusion nous avons

choisi de relier une personne agrave un groupe par son UID Ainsi lrsquoappartenance drsquoun

utilisateur agrave un groupe se traduit par la preacutesence de son adressemail dans lrsquoattribut

maildrop du groupe

Cela nous permet de geacuterer de maniegravere pratique les groupes auquels

appartient un utilisateur et inversement de sortir la liste des utilisateurs drsquoun groupe

avec une simple commande de typeldapsearch sur le serveur LDAP Pour ajouter ou

supprimer un utilisateur agrave un groupe il suffira de modifier lrsquoattribut maildrop du

groupe

Serveurs SMTP et DNS

Pour cette partie nous avons utiliseacute lrsquoexcellent Postfix Crsquoest une solution de

messagerie eacutelectronique libre rapide leacutegegravere seacutecuriseacutee et facile agrave administrer Crsquoest

aussi le serveur mail par deacutefaut dans plusieurs systegravemes de type UNIX Il permet

notamment drsquoeacuteviter une bonne partie du spam avec une configuration simple et

accessible

Il est important aussi de respecter les speacutecifications de la RFC Nous avons eu

la surprise de voir qursquoil est ldquoimpeacuteratifrdquo drsquoavoir deux adresses particuliegraveres sur le

serveur postmaster et abuse Ce sont les premiegraveres victimes des attaques par force

brute

La configuration de Postfix se fait de maniegravere eacutetroite avec Bind le serveur de

nom de domaine que nous avons installeacute En effet pour que Postfix fonctionne il est

essentiel que lrsquoenregistrement MX du serveur DNS fonctionne Crsquoest un type

drsquoenregistrement particulier qui permet la mise en place drsquoun serveur mail

De plus il est neacutecessaire de faire un enregistrement PTR qui correspond agrave au

DNS inverse Il nrsquoest pas indispensable au fonctionnement du serveur mail en soit

mais la plupart des fournisseurs de ce type de service se servent de cet

enregistrement pour contrer une partie du spam Il est donc possible que les mails

drsquoun serveur soient bloqueacutes si lrsquoenregistrement PTR est mal configureacute

Parallegravelement nous avons aussi proceacutedeacute agrave lrsquoenregistrement A qui permet la

mise en place drsquoun serveurWeb neacutecessaire agrave notreWebmail Nous avons utiliseacute des

outils en ligne tel que DNSStuff pour tester notre configuration dont un exemple se

trouve en annexe Notons par contre que la technologie DNSSEC nrsquoest pas mise en

place sur les domaines pw par Gandinet notre fournisseur Nous nrsquoavons donc pas

pu lrsquoimpleacutementer

Nous avons configureacute Postfix pour qursquoil utilise notre annuaire LDAP Il est

possible agrave ce stade de tester la configuration avec telnet et drsquoenvoyer unmail Apregraves

cela nous avons testeacute le bon fonctionnement du serveur en envoyant avec succegraves

un mail vers une boicircte mail exteacuterieure de type gmail

Nous nous sommes alors heurteacutes aux protections du Service Informatique de

lrsquoUniversiteacute (CRI) qui bloque le port 25 en sortie et en entreacutee en dehors de lrsquouniversiteacute

Pour nous astreindre de ces restrictions nous avons migreacute notre serveur vers une

nouvelle connexion SDSL exteacuterieure au reacuteseau de Lille 1 Cela a eacuteteacute pour nous un

moyen de veacuterifier en partie la portabiliteacute de notre systegraveme puisque nous utilisons une

toute nouvelle connexion avec une nouvelle adresse IP Nous avons donc ducircmettre

agrave jour notre serveur de nom pour refleacuteter ces changements La migration srsquoest

passeacutee sans soucis avec un deacutelai de propagation des changements drsquoenviron 1

heure Le systegraveme est resteacute fonctionnel agrave 100 notamment parce que dans notre

code nous faisons appel au serveur par localhost ou une variable et jamais

directement lrsquoadresse IP ou le domaine Cependant nous nrsquoavons pas pu veacuterifier la

migration vers un domaine diffeacuterent bien que cela ne reste normalement qursquoune

variable dans les fichiers de configuration de lrsquointerface

Gestion du Spam

Comme preacutevu nous avons apporteacute une solution agrave la gestion du spam sur

notre serveur Postfix propose dans ses paramegravetres lrsquoutilisation de services de

DNSBL (DNS Black List) Cette technologie reprend le mecircme principe que les

serveurs de noms classiques Postfix soumet une requecircte de type DNS aux serveurs

de liste noire deacutefinis dans sa configuration et le serveur indique si ce nom de

domaine est preacutesent dans sa liste ou non On peut de cette maniegravere rejeter une

bonne partie du trafic mail correspondant au Spam et ce tregraves facilement

Malgreacute cela nous pensons qursquoune partie du Spam passera agrave travers les

mailles du filet Il aurait eacuteteacute inteacuteressant de traiter ceux-ci pour les classer comme

indeacutesirables et pouvoir ainsi les afficher dans lrsquointerface web

Serveur Web et Webmail

Un serveur web leacuteger

Initialement nous sommes partis sur une solution classique agrave base drsquoun

serveur web Apache qui nous a permis de deacutebuter le deacuteveloppement de lrsquointerface

Cependant comme nous cherchons agrave alleacuteger un maximum le systegraveme nous nous

sommes pencheacutes sur une autre solution Lighttpd Ce serveur web vise comme son

nom lrsquoindique la performance et la leacutegegravereteacute Sur le mecircme contenu avec une

connexion Tregraves Haut Deacutebit (100Mbps) nous chargeons deacutesormais la page de vue

geacuteneacuterale en 042s (Lighttpd) contre 170s avant (Apache 2) avec le navigateur

Chrome sans cache

Une architecture optimiseacutee

Lrsquoutiliteacute de reacutealiser notre propre webmail est dans un premier temps de

srsquoabstenir de lrsquoinstallation drsquoun serveur IMAPPOP puisque nous retrouvons

nous-mecircmes le contenu Dans un second temps il nous permet de ne garder que les

fonctionnaliteacutes neacutecessaires agrave notre webmail sans superflu

Fig 5 La vue geacuteneacuterale de notre webmail

Gracircce agrave PHP et agrave son module drsquointerface avec LDAP nous pouvons identifier

un utilisateur avec son nom drsquoutilisateur et son mot de passe sur le serveur local

LDAP et ainsi retrouver nombreuses informations utiles comme le quota actuel

autoriseacute son nom entier le chemin drsquoaccegraves agrave son reacutepertoire dans lesquels sont ses

mails sur le systegraveme de fichiershellip

Fig 6 Lrsquoarchitecture du dossier drsquoun utilisateur des dossier sent et inbox contenant les

mails bruts un dossier json dans lequel sont placeacutes les entecirctes des mails ainsi que le quota

Chaque en-tecircte de mail est eacutecrite dans un fichier json distinct par boicircte (un

fichier pour la boicircte de reacuteception un fichier pour les mails envoyeacuteshellip) ce qui nous

permet de montrer agrave lutilisateur la liste des mails dune boicircte sans traitement lourds

en arriegravere plan pour le serveur Ces fichiers sont renseigneacutes par un script lanceacute agrave la

reacuteception drsquoun mail par postfix du cocircteacute reacuteception et par lrsquointerface web elle mecircme

pour lrsquoeacutemission Lrsquoen-tecircte drsquoun mail est eacutecrite dans un conteneur JSONde lamaniegravere

suivante

Fig 7 Exemple drsquoentreacutee dans un fichier json

Gracircce tout cela nous pouvons afficher simplement le contenu des diffeacuterentes

boicirctes mail dans des tableaux sur lrsquointerface gracircce aux en-tecirctes et par la suite

retrouver et afficher le contenu drsquoun mail agrave partir de son fichier brut sur lequel

lrsquoutilisateur aura cliqueacute comme on le verra un peu plus loin

Toujours dans un souci drsquoameacutelioration des performances le strict neacutecessaire

est geacuteneacuteralement chargeacute sur les pages web par exemple en venant de la vue

geacuteneacuterale lorsqursquoon clique surInboxseule la partie inteacuterieure de la page est chargeacutee

on ne recharge pas le bandeau du haut de page ou lemenu de gauche agrave lamaniegravere

drsquoun MVC classique

Envoyer des courriels

Toute cette architecture ne doit pas nous faire oublier le but premier envoyer

et recevoir des mails Pour envoyer des mails crsquoest tregraves simple on peut soit cliquer

dans le bandeau du haut sur ldquoQuick Emailrdquo qui permet sur lamecircme page drsquoenvoyer

un email rapide et sans piegravece-jointe soit cliquer dans la barre de navigation sur le

cocircteacute sur ldquoWrite a new emailrdquo ce qui nous megravene vers une page deacutedieacutee permettant

drsquoeacutecrire un email incluant une piegravece jointe

Fig 8 Envoyer un mail crsquoest simple comme bonjour

On peut remarquer sur cette capture drsquoeacutecran que lrsquoon ne peut envoyer que

certains types de piegraveces jointes Nous supportons JPG PNG GIF PDF et ZIP Si la

piegravece jointe est drsquoun autre format elle est rejeteacutee La veacuterification du type srsquoeffectue

sur lrsquoextension du fichier et sur son type MIME ce qui eacutevite par exemple que

quelqursquoun modifie lrsquoextension drsquoun fichierexe en fichierjpg pour lrsquoenvoyer La piegravece

jointe doit de plus avoir une taille infeacuterieure agrave la taille maximale drsquoune piegravece jointe

parameacutetreacutee par lrsquoadministrateur comme nous le verrons dans lrsquointerface

drsquoadministration

Si tous ces critegraveres sont bons on eacutecrit lemail au format brut deacutecrit par la RFC

puis on lrsquoexpeacutedie agrave lrsquoaide de la fonction mail de PHP Si cette fonction nrsquoeacutechoue pas

crsquoest que le mail est expeacutedieacute avec succegraves on peut alors mettre agrave jour le quota

drsquoespace disque maximum autoriseacute agrave lrsquoutilisateur en increacutementant celui-ci avec la

taille du mail qui vient drsquoecirctre envoyeacute ainsi que creacuteer un fichiermail brut sur le disque

pour pouvoir afficher le mail dans la boicircte drsquoenvoi et en garder une trace

Notons que comme crsquoest lrsquoutilisateur web du systegraveme (www-data) qui exeacutecute

la fonction nous modifions les en-tecirctes du mail afin que le destinataire reccediloive un

mail de la part de ldquoPreacutenom Nomrdquo depuis lrsquoadresse ldquopnomdomainetldrdquo plutocirct que

ldquowww-datadomaintldrdquo par deacutefaut

La migration vers une IP externe agrave Lille 1 eacutetant reacuteussie nous pouvons bien

envoyer des mails depuis notre interface qui sont reccedilus agrave lrsquoexteacuterieur sans soucis

Mais aussi en recevoir

Recevoir des mails est tout aussi important Nous avons vu lrsquoarchitecture en

arriegravere-plan mais au final agrave quoi cela ressemble-t-il pour lrsquoutilisateur Il dispose en

fait en cliquant sur Inbox (ou Sent Spam ou Trash eacutegalement) drsquoun accegraves agrave sa boicircte

de reacuteception Drsquoun clic srsquoaffichent alors agrave lui tous les mails qursquoil a reccedilu

Fig 9 La boicircte de reacuteception

On remarque notamment les fonctions de recherche drsquoactualisation du

tableau de choix des colonnes agrave afficher on peut classiquement choisir combien de

lignes on affiche par page changer de pages etchellip

Lorsque lrsquoon clique sur un des lignes les donneacutees de lrsquoen-tecircte du mails sont

passeacutes en paramegravetres agrave une autre page qui drsquoapregraves ces informations retrouve le

fichier mail brut le traite et lrsquoaffiche

Fig 10 Un mail contenant 3 piegraveces jointes et un message

Comme on peut le voir nous pouvons recevoir desmails avec plusieurs piegraveces

jointes Nous avons ici preacutesenteacute la boicircte de reacuteception mais les autres boicirctes

fonctionnent de maniegravere similaire

Interface drsquoadministration

Le systegraveme de webmail possegravede plusieurs variables des listes de diffusion

des compteshellipMais on veut pouvoir donner les droits agrave un utilisateur demodifier tout

cela En effet si nous trouvons cela abordable drsquoajouter un utilisateur avec une

commande dans le shell il faut aussi penser agrave lrsquoutilisateur final qui preacutefegravere peut-ecirctre

le confort drsquoune interface deacutedieacutee pour geacuterer son serveur mail plutocirct que le terminal

De maniegravere tregraves simple un utilisateur appartenant au groupes drsquoutilisateurs

ldquoAdministrateursrdquo est reconnu en tant qursquoadministrateur par lrsquointerface et peut

cliquer sur un bouton ldquoManagerdquo dans le panneau lateacuteral qui nrsquoest visible qursquoaux

administrateurs De lagrave il arrive sur la page suivante

Fig 11 lrsquointerface drsquoadministration

Sur cette interface il peut choisir la taille maximale des piegraveces jointes

changer le nom de domaine sur lequel est installeacute lrsquointerface et dont deacutependent

toutes les adresses (domaine) Il est aussi possible de modifier directement ces

variables en modifiant le fichier includeconfigincphp Pratique notamment si lrsquoon

a renseigneacute un mauvais nom de domaine agrave la configuration et que lrsquoon arrive plus agrave

acceacuteder agrave lrsquointerface

Il peut aussi creacuteer un nouveau compte en renseignant les champs preacutenom

nom mot de passe et quota Lrsquoutilisateur peut ensuite une fois son compte creacutee

directement se connecter avec son identifiant (initiale preacutenom + nom) et mot de

passe Lors de la creacuteation du compte un mail de bienvenue est envoyeacute au nouvel

utilisateur ce qui permet en arriegravere-plan de creacuteer tous les dossiers utilisateurs et

fichiers en-tecirctes utiles agrave lrsquointerface une fois pour toutes

Lrsquoadministrateur peut aussi ajouter une liste de diffusion (assimileacutee agrave un

groupe) ou en supprimer une parmi les listes existantes

En outre lrsquoadministrateur peut aussi modifier les donneacutees drsquoun utilisateur

Pour cela sur la preacutesente page il peut seacutelectionner un utilisateur parmi la liste des

utilisateurs existants ce qui le redirige vers la page de gestion des comptes

Fig 12 La gestion drsquoun compte seacutelectionneacute ici celui de James Bond

A ce stade il peut changer lrsquoUID de lrsquoutilisateur (utile en cas de conflit) le nom

le mot de passe le quota de cet utilisateur et lrsquoajouter ou le retirer drsquoune liste de

diffusion Accessoirement il peut aussi supprimer le compte en cliquant sur lrsquoeacutenorme

bouton rouge qui lui demandera deux fois de suite de confirmer son action afin

drsquoeacuteviter les erreurs de clic Cette action entraicircne la suppression de lrsquoutilisateur de

toutes les listes de diffusion auxquelles il appartient la suppression de son compte

dans la branche people de lrsquoarbre LDAP et la suppression deacutefinitive de son dossier

utilisateur sur le disquesystegraveme de fichiers impliquant donc la perte de ses mails

Architecture du systegraveme de fichiers

Comme nous lrsquoavons dit plus haut lrsquoideacutee est de se passer des meacutecanismes

classiques avec les clients mails habituels Ces serveurs srsquoalourdissent

geacuteneacuteralement en utilisant des serveurs IMAPPOP3 et un meacutecanisme

drsquoauthentification SMTP

Pour adapter ces fonctionnaliteacutes agrave notre systegraveme nous avons donc constitueacute

une architecture pour organiser les fichiers qui transitent Vous pourrez voir un

scheacutema reacutecapitulatif en annexe 1

Dans la premiegravere moitieacute du projet les mails eacutetaient deacutelivreacutes par Postfix Nous

utilisions un script exeacutecuteacute lors de la reacuteception drsquounmail pour les traiter de lamaniegravere

que nous voulions Cette meacutethode avait les inconveacutenients drsquoecirctre lourde et pas

efficace agrave 100 En effet seuls les mails reccedilus depuis lrsquoexteacuterieur eacutetaient

correctement traiteacutes

Deacutesormais les mails sont traiteacutes totalement par notre script Cela nous

permet de geacuterer les mails dans des dossiers organiseacutes agrave notre maniegravere et de

recevoir les mails locaux crsquoest-agrave-dire entre utilisateurs du mecircme domaine Cette

nouvelle meacutethode regravegle aussi drsquoautres problegravemes notamment au niveau des

permissions sur les fichiers

Pour reacuteduire le nombre drsquoopeacuterations et pour profiter des fonctionnaliteacutes

offertes par le framework utiliseacute pour lrsquointerface web nous regroupons des

informations sur chacun des mails reccedilus sous la forme de fichiers JSON Pour ce

faire lrsquoideacutee est drsquoexeacutecuter un script lorsque leacutevegravenement ldquoreacuteception drsquoun mailrdquo

survient Postfix offre cette possibiliteacute dans sa configuration Or il se trouve qursquoil nrsquoest

pas si simple de reacutecupeacuterer le chemin du fichier contenant le mail car le nom du

fichier creacutee est sous la forme Timestamp UNIX10 Caractegraveres aleacuteatoires (ex

14562336185A8D43E97F)

La seconde probleacutematique est que le webmail doit avoir la possibiliteacute de

pouvoir lire les fichiers pour afficher les mails sur son interface Or il semble que

Postfix les eacutecrit en autorisant uniquement son utilisateur en lecture Il nous a fallu

trouver une solution pour remeacutedier agrave cela Nous avons choisi drsquoajouter www-data

(utilisateur du serveur web) au groupe vmail et de modifier les droits sur les fichiers

de sorte que les utilisateurs de ce groupe puissent lire les fichiers

Nous avons revu une partie de lrsquoorganisation des fichiers pour reacutecupeacuterer les

piegraveces jointes si elles sont preacutesentes Le script que nous avons eacutecrit reacutecupegravere le

fichier original du mail et le deacutecoupe en eacuteleacutements simples dans des fichier distincts

corps du mail et diffeacuterentes piegraveces jointes De cette maniegravere pour afficher un mail

nous nrsquoavons pas besoin de charger la totaliteacute du fichier Dans le cas ougrave il y a des

piegraveces jointes cela aurait ralenti lrsquoaffichage des informations

Nous avons eacutegalement impleacutementeacute la gestion des quotas Dans lrsquoeacutetat actuel

des choses srsquoil nrsquoy a plus de place disponible pour lrsquoutilisateur le mail nrsquoest tout

bonnement pas deacutelivreacute agrave ce destinataire Lrsquoideacuteal aurait eacuteteacute de notifier leacutemetteur avec

un mail ce qui nrsquoest pour lrsquoinstant pas le cas mais qui pourrait ecirctre reacutesolu en

renvoyant agrave postfix un code drsquoerreur deacutefini

Pour terminer nous avons revu la totaliteacute du code deacuteveloppeacute Nous sommes

passeacute du Bash au Perl Ce dernier est plus performant et plus simple agrave utiliser et agrave

lire

Firewall

Un autre gros morceau du projet mais qui nrsquoest pas speacutecifiquement lieacute agrave la

probleacutematique du mail crsquoest la seacutecurisation du serveur En effet apregraves avoir mis en

ligne notre serveur des pirates ont tregraves vite tenteacute de peacuteneacutetrer le systegraveme

Globalement les attaques eacutetaient de type force brute sur les services heacutebergeacutes sur

notre Raspberry neacutecessitant une identification tels que SSH SMTP hellip

On retrouve ici un petit point faible du protocole SMTP Eacutetant donneacute que

chaque serveur mail doit avoir une adresse postmaster et abuse lrsquoattaquant a agrave sa

disposition deux adresses agrave attaquer Ceci dit ce type drsquoattaque est simple agrave

contrecarrer car il suffit de limiter dans le temps le nombre de tentatives de

connexions

La contre-mesure que nous avons mis en place est simple une seacuterie de

regravegles Iptables En reacutesumeacute nous avons opteacute pour un systegraveme de liste blanche et

noire Les adresses IPs de la liste blanche sont autoriseacutees agrave utiliser la totaliteacute des

services (notamment SSH) tandis que celles de la liste noire sont totalement

ignoreacutees Les autres IPs nrsquoont accegraves qursquoau webmail

Eacutetant donneacute que le nombre drsquoIPs attaquant notre serveur nrsquoa cesseacute

drsquoaugmenter nous avons automatiseacute la mise agrave jour de la liste de noire en

deacuteveloppant un script pour Cron Ce script est exeacutecuteacute une fois par heure A ce jour

notre liste noire contient 47 adresses Bien sucircr ce systegraveme est susceptible drsquoecirctre

modifieacute agrave convenance pour passer sur une solution deacutedieacutee telle que Fail2ban qui fait

en fait ce qursquoon fait deacutejagrave (eacutetudier les logs et bannir des IP avec iptables) avec des

regravegles preacutedeacutefinies par la communauteacute et personnalisables En effet nous nous

attendons agrave voir la varieacuteteacute et le nombre drsquoattaques augmenter apregraves avoir migreacute sur

une IP non proteacutegeacutee par le firewall de lrsquoUniversiteacute puisque nous nrsquoavons plus la

premiegravere ligne de deacutefense du CRI en particulier pour le port 389 (LDAP) qui eacutetait

bloqueacute par lrsquouniversiteacute et srsquoest retrouveacute en premiegravere ligne apregraves la migration Nous

avons donc ajouteacute une regravegle bloquant tout le trafic entrant vers le port 389 hormis

localhost

Package drsquoinstallation

Nous avons creacutee un package deb contenant les sources du webmail ainsi

que des scripts utiles agrave lrsquoinstallation et au fonctionnement du serveur Nous avons

deacuteveloppeacute des scripts de configuration automatique pour LDAP et Postfix Comme

dpkg ne supporte pas directement lrsquoinstallation automatique des deacutependances

nous recommandons drsquoinstaller avant tout le paquet gdebi-core qui est en fait un

dpkg ameacutelioreacute Gracircce agrave la commande gdebi paquetdeb toutes les deacutependances

seront installeacutees en particulier postfix le serveur ldap le serveur web lighttpd entre

autres sans soucis Il est agrave noter que comme les scripts de configuration des

diffeacuterents services ne sont que partiellement impleacutementeacutes dans le paquet deb nous

fournissons en annexe un README complet et illustreacute qui explique pas agrave pas

comment faire fonctionner notre systegraveme sur nrsquoimporte quel Linux en particulier les

lignes de configuration des diffeacuterents services agrave changer et un exemplaire des

fichiers de configuration fonctionnels de ces services

Gestion de lrsquoeacutenergie

Une consideacuteration importante pour un systegraveme autonome Drsquoapregraves les fiches

techniques notre modegravele de Raspberry Pi (B 2) est officiellement eacutevalueacute avec un

fonctionnement agrave ~650mA pour 5V De nombreux proprieacutetaires de ce systegraveme

eacutequipeacutes se sont amuser agrave veacuterifier la consommation eacutelectrique reacuteelle de leur Pi 2 B

sous diffeacuterentes charges On pourra retenir cette eacutetude (lien en sitegraphie) qui

relegraveve la consommation en courant en fonction de lrsquoactiviteacute lanceacutee sur la Pi mais

aussi en charge sur 1 agrave 4 CPU

Ces chiffres sont releveacutes sur un systegraveme avec cameacutera connecteacutee HDMI connecteacute et

cacircble ethernet brancheacute et actif

On peut constater que globalement notre systegraveme Pi 2 B tournant sans

interface graphique sans composant suppleacutementaire sans sortie videacuteo ni cameacutera

avec plusieurs serveurs tournant tout en restant le plus leacuteger possible et demeurant

~99 idle la plupart du temps ne devrait pas deacutepasser une consommation de

300mA grand maximum

Fig 13 Un processeur tregraves tregraves peu chargeacute et une meacutemoire relativement libre

Nous avions lrsquoanneacutee derniegravere deacutejagrave reacutealiseacute un circuit permettant drsquoadapter un

panneau solaire sur une batterie USB classique de 9000mAh Nous avions alors pu

mesurer lrsquointensiteacute deacutelivreacutee par le panneau solaire En cas drsquoensoleillement moyen

habituel dans nos contreacutees le panneau solaire deacutebitait 400mA et pouvait atteindre

le double quand le soleil eacutetait directement preacutesent pour environ 800mA deacutebiteacute

Ce panneau solaire accompagneacute de son circuit drsquoadaptation devrait donc

suffire pour alimenter notre systegraveme la journeacutee le brancher ensuite sur une batterie

portable permet de stocker le surplus pour la nuit

Fig 14 le circuit drsquoadaptation

Fig 15 et son PCB

Eacutevolutions possibles

Webmail

Concernant les eacutevolutions possibles que nous aurions aimeacute apporter agrave notre

projet avec plus de temps commenccedilons par le web Nous aurions souhaiteacute apporter

la gestion de lrsquoenvoi de plusieurs piegraveces jointes comme nous lrsquoavons fait pour la

reacuteception

De plus nous aurions voulu inteacutegrer une corbeille ougrave lesmessages pourraient

aller avant drsquoecirctre deacutefinitivement supprimeacutes du systegraveme drsquoautant que nous avons

deacutejagrave eacutecrites les fonctions PHP permettant de retirer une en-tecircte drsquoun fichier JSON et

le fichier mail associeacute

Enfin nous aurions aimeacute en plus du blocage deacutejagrave preacutesent impleacutementer une

gestion plus profonde des piegravece jointes permettant notamment le remplissage de la

boicircte de spams

Systegraveme

Il aurait eacuteteacute inteacuteressant de notifier lrsquoexpeacutediteur lorsque le mail nrsquoa pas pu ecirctre

deacutelivreacute agrave un utilisateur lorsque son quota est plein En toute logique cela devrait ecirctre

fait simplement avec la commande Sendmail

Une meilleur gestion du trafic mail indeacutesirable aurait eacuteteacute la bienvenue En

effet malgreacute la limitation du spam il restera toujours une partie du volume de mail

qui sera indeacutesirable (pub pishing scam hellip)

Eacutetant donneacute la taille du systegraveme nous avions penseacute agrave une approche

ldquomachine learningrdquo Lrsquoutilisateur indiquerait pourquoi il considegravere le mail comme

indeacutesirable constituant des regravegles refusant certains mails Les mails provenant de

cet expeacutediteur pourraient ecirctre deacutetecteacute par le script agrave la reacuteception et

automatiquement envoyeacutes dans la boicircte de spams

Partie eacutenergeacutetique

Mecircme si la solution au panneau solaire ne pose aucun problegraveme en theacuteorie

nous aurions deacutejagrave dans un premier temps aimeacute lrsquoimpleacutementer en pratique Nous

nrsquoavons finalement pas reacutealiseacute notre objectif de deacutetecter deux cas drsquoalimentation

diffeacuterents soit lrsquoalimentation via panneau solaire est suffisante dans ce cas il

alimente la batterie et donc la Raspberry soit quand ce courant nrsquoest pas suffisant

on alimente la batterie par le secteur

Conclusion

En conclusion nous pensons avoir reacutepondu au cahier des charges initial dans

sa majeure partie Nous sommes aujourdrsquohui en mesure de proposer une solution

mail domestique priveacutee et personnalisable par un particulier

Notre installation de Debian a eacuteteacute au maximum alleacutegeacutee pour notre utilisation

sans interface graphique et nous avons mis en place une reacuteponse aux diverses

attaques que nous avons pu subir lors de lamise en place de notre solution logicielle

En outre le pare-feu avec notre systegraveme de liste noire bloque une partie des

attaques qui peuvent nous parvenir

Nos diffeacuterents scripts de pare-feu de gestion drsquoun mail entrant associeacute au

webmail permettent agrave un utilisateur drsquoacceacuteder aux fonctions usuelles associeacutees agrave

lrsquoenvoi et la reacuteception de mails

Gracircce agrave sa configuration personnalisable notre projet devrait pouvoir ecirctre

porteacute sur un domaine et une adresse IP diffeacuterente sans soucis et ecirctre deacuteployeacute

partout ougrave des gens souhaitent conserver leur vie priveacutee

Nous regretterons cependant de ne pas avoir exploiteacute la partie eacutenergeacutetique

de ce projet qui portait une probleacutematique inteacuteressante et qui nous parait importante

dans le monde actuel

Ce projet nous aura occupeacute pendant tregraves longtemps et nous sommes fiers du

travail que nous avons accompli Il est agrave nos yeux la preuve de ce que nous savons et

pouvons faire et nous donnera confiance pour notre deacutebut de carriegravere drsquoingeacutenieur

Sources

httpwwwradicaticomwpwp-contentuploads201401Email-Statistics-R

eport-2014-2018-Executive-Summarypdf

httpwwwcommentcamarchenetcontents525-le-protocole-ldap

httpsfrwikipediaorgwikiSimple_Mail_Transfer_Protocol

httpwwwcommentcamarchenetcontents536-pop3-smtp-imap-protocol

es-de-messagerie

httpstoolsietforghtmlrfc2821

httpsfrwikipediaorgwikiInternet_Message_Access_Protocol

httpstoolsietforghtmlrfc3501

httparstechnicacominformation-technology201402how-to-run-your-ow

n-e-mail-server-with-your-own-domain-part-1

httpswwwraspberrypiorgforumsviewtopicphpp=136912

httpstackoverflowcomquestions17394356how-can-i-make-a-bash-com

mand-run-periodically

httpuntroubledorgnullmailer

httpelinuxorgRPi_Hardware

httpraspitv2015raspberry-pi2-power-and-performance-measurement

Annexe 1 Architecture du systegraveme de fichiers

Annexe 2 Scan DNSSTUFF

Depuis httpwwwdnsstuffcomtoolsdnsReport|type=domainampampvalue=intimailpw

Annexe 3 Vue geacuteneacuterale httpswwwintimailpw

Annexe 4 Envoyer un mail

Annexe 5 Boite de reacuteception

Annexe 6 Interface drsquoadministration

Annexe 7 Gestion drsquoun utilisateur

Tutorial installation intimailtrade

Table des matiegraveres Apregraves une nouvelle installation de lrsquoOS 2

Seacutecurisation du serveur 2

Changement de lrsquoutilisateur par deacutefaut 2

Changement du port SSH 2

Interdire lrsquoauthentification SSH pour root 2

Installation de LDAP 3

Configuration de base 3

Configuration des Scheacutemas 4

Constitution de la base de donneacutees LDAP 5

Installation de Postfix 7

Installation de Bind9 8

Installation du paquet Debian et configuration de lighttpd 9

Deacutependances 11

Sources 12

2

Apregraves une nouvelle installation de lrsquoOS Exeacutecutez ces commandes pour mettre agrave jour agrave la derniegravere version Ces opeacuterations peuvent prendre un certain

temps Nous avons utiliseacute pour cet exemple Raspbian Jessie Lite sur une Raspberry Pi 2

apt-get update

apt-get upgrade ampamp apt-get dist-upgrade

apt-get install linux-headers-$(uname -r)

reboot

Puis lancer

raspi-config

Etendre au maximum lrsquoespace de stockage en navigant dans les menus

Expand Filesystem

Reacutegler une ip statique avec la box fichier etcnetworkinterfaces

iface eth0 inet static

address 192168131

netmask 2552552550

gateway 19216811

Nous avons aussi supprimeacute wpasupplicant

Seacutecurisation du serveur

Changement de lrsquoutilisateur par deacutefaut Changez le nom drsquoutilisateur par deacutefaut ainsi que son mot de passe

sudo passwd root

Sortie et login en tant que root puis

usermod -l myuname pi

usermod -m -d homemyuname myuname

groupmod ndashn myuname pi

passwd myuname

Voir cette adresse pour lrsquoutilisation de cleacutes priveacuteespubliques

Changement du port SSH sed ndashi sPort 22Port 2222g etcsshsshd_config

Interdire lrsquoauthentification SSH pour root sed -i sPermitRootLogin yesPermitRootLogin nog etcsshsshd_config

3

Installation de LDAP

Configuration de base Installation du package

apt-get install slapd

Choisir un mot de passe administrateur puis lancer la commande

dpkg-reconfigure slapd

Reacutepondre non agrave la question 1

Entrez le nom de domaine utiliseacute agrave la question 2 sous la forme domainetld

Entrez ce que vous voulez au 3egraveme eacutecran le nom de lrsquoorganisation ne sera pas utiliseacute

Entrez un mot de passe

Choisissez HDB

Choisissez si la base de donneacutees est supprimeacutee agrave la deacutesinstallation de slapd

Deacuteplacez lrsquoancienne base de donneacutees

Nrsquoutilisez pas LDAPv2

Installer les outils de conversion pour ldap (slaptest ldapmodify notamment)

apt-get install ldap-utils

On peut maintenant veacuterifier que la configuration est valable

ldapsearch -x -h localhost -b dc=domainedc=tld -LLL dc=domaine dn

Cette commande doit retourner quelque chose comme

dn dc=domainedc=tld

Il faut maintenant seacutecuriser le serveur LDAP en effet on peut y acceacuteder en anonyme avec la commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=config

(amp(objectClass=olcDatabaseConfig)(olcSuffix=dc=domainedc=tld))

Cette commande retourne un certain nombre drsquoinformations notamment agrave propos des champs suivants

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by none

olcAccess 1to dnbase= by read

olcAccess 2to by read

On va modifier ces champs avec la commande ldapmodify Pour cela on va creacuteer un fichier ldif

cat gt changeAccessldif ltlt EOF

dn olcDatabase=1hdbcn=config

changetype modify

delete olcAccess

-

add olcAccess

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by dn=cn=admindc=domainedc=tld write by none

-

add olcAccess

olcAccess 1to dnbase= by read

-

4

add olcAccess

olcAccess 2to by self write by dn=cn=admindc=domainedc=tld write by

none

-

EOF

On peut maintenant appliquer les changements avec ldapmodify

ldapmodify ndashc ndashY EXTERNAL ndashH ldapi -f changeAccessldif

La commande devrait vous confirmer que la modification srsquoest bien effectueacutee

SASLEXTERNAL authentication started

SASL username gidNumber=0+uidNumber=0cn=peercredcn=externalcn=auth

SASL SSF 0

modifying entry olcDatabase=1hdbcn=config

On peut veacuterifier qursquoon ne peut plus acceacuteder aux informations avec la commande

ldapsearch -x -c -h localhost -b dc=domainedc=tld

On peut veacuterifier la configuration en se connectant en tant qursquoadministrateur

ldapsearch -c -h localhost -b dc=domainedc=tld -D

cn=admindc=domainedc=tld ndashW

Configuration des Scheacutemas Nous allons utiliser les scheacutemas de courier-ldap Pour eacuteviter une manipulation compliqueacutee vous trouverez

directement le scheacutema avec le fichier authldapschema On place ce fichier dans le dossier

mv authldapschema etcldapschema

Nous creacuteons un fichier qui incluera tous les scheacutemas de base en plus du nouveau On peut les afficher avec la

commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

Creacuteation du fichier de configuration pour notre exemple cela donne

mkdir tmpldapconf

cat gt tmpldapconfldapconf ltlt EOF

include etcldapschemacoreschema

include etcldapschemacosineschema

include etcldapschemanisschema

include etcldapschemainetorgpersonschema

include etcldapschemaauthldapschema

EOF

On lance ensuite la commande

slaptest -f tmpldapconfldapconf -F tmpldapconf

Elle revoie un message de succegraves Cette commande a creacuteeacute dans le reacutepertoire tmpldapconf une arborescence

correspondant agrave la configuration de notre LDAP

On modifie le chemin de configuration

5

sed ndashi 0dnauthldap sauthldapauthldapcn=schemacn=config

cn=authldapldif

On supprime ensuite les 7 derniegraveres lignes du fichier

head -n -7 cn=authldapldif gt tmpldif

mv tmpldif cn=authldapldif

On peut maintenant importer notre fichier de configuration Pour ce faire

ldapadd -Y EXTERNAL -H ldapi -f

tmpldapconfcn=configcn=schemacn=authldapldif

Si tout va bien lrsquoentreacutee devrait avoir eacuteteacute ajouteacutee On peut veacuterifier avec la commande vue tout agrave lrsquoheure

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

On devrait voir en plus le nouveau scheacutema authldap

Constitution de la base de donneacutees LDAP Le remplissage de la base se fait agrave lrsquoaide de fichiers ldif Nous donnons ici un exemple de structure

Fichier pour la structure de base

dn dc=maildc=domainedc=tld

o intimailpw

description Global mail tree

dc mail

objectClass top

objectClass dcObject

objectClass organization

dn dc=peopledc=maildc=domainedc=tld

description Informations of all users

o people

dc people

objectClass top

objectClass dcObject

objectClass organization

dn dc=groupsdc=maildc=domainedc=tld

description All groups of users

o groups

dc groups

objectClass top

objectClass dcObject

objectClass organization

6

Fichier pour ajouter un utilisateur

dn cn=jbonddc=peopledc=maildc=domainedc=tld

uid jbond

mail jbonddomainetld

sn Moulin

givenName James

displayName James Bond

mailbox domainetldjbond

quota 50M

homeDirectory homevmail

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAccount

userPassword SSHA367PSXiUAegy8dpJbPU8OepEf8L5ye

Pour obtenir un hash du mot de passe

slappasswd -s password -h SSHA

On peut par la suite ajouter la configuration agrave la base de donneacutees avec la commande

ldapadd -D cn=admindc=domainedc=tld -W -h localhost -f pathtofile

Si les champs proposeacutes ne sont pas suffisants il faudra alors effectuer les modifications dans le fichier autldapschema

proposeacute plus haut et refaire la manipulation de configuration

De plus les standards du Mail deacutecrit par lrsquoIETF (RFC822 63 RFC1123 527 and RFC2821 451) impliquent drsquoavoir une

adresse Postmaster et une Abuse Pour cela nous pourrions creacuteer ces adresses avec la meacutethode vue au-dessus mais

ce nrsquoest pas la meilleure Il est preacutefeacuterable drsquoutiliser un alias comme nous le ferons avec les listes de diffusion Ici nous

proposons de rediriger ces deux adresses vers une adresse administrateur Pour cela la meacutethode est la mecircme sauf

que le fichier ldif nrsquoest pas tout agrave fait identique En voici un exemple

dn cn=postmasterdc=groupsdc=maildc=domainedc=tld

uid postmaster

mail postmasterdomainetld

sn Postmaster

displayName Postmaster

maildrop admindomainetld

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAlias

Pour faire une liste de diffusion la meacutethode est la mecircme Il suffit drsquoajouter toutes les adresses destinataires dans le

champ maildrop seacutepareacutees par des virgules ()

7

Installation de Postfix Installation des packages

apt-get install postfix postfix-ldap

Lors de lrsquoinstallation deux eacutecrans deacutefilent

- Configuration Internet Site

- Valeur par deacutefaut pour le mail name

On creacutee lrsquoutilisateur qui servira agrave exeacutecuter Postfix

groupadd vmail

useradd -g vmail -d homevmail -s binfalse -m vmail

Nous aurons besoin dans la suite des GID et UID creacuteeacutes agrave cet instant Ils peuvent ecirctre afficheacutes avec les commandes

cat etcgroup | grep vmail | cut -d -f3

cat etcpasswd | grep vmail | cut -d -f3

On ajoute les paramegravetres au fichier etcpostfixmaincf (remplacer les valeurs de GID et drsquoUID avec vos valeurs)

smtpd_banner = maildomainetld

virtual_mailbox_base = homevmail

virtual_mailbox_domains = dmainetld

virtual_mailbox_maps = ldapetcpostfixldap_accountscf

virtual_alias_maps = ldapetcpostfixldap_aliasescf

virtual_minimum_uid = 100

virtual_gid_maps = static1001 Remplacez ici par votre valeur de GID

virtual_uid_maps = static1001 Remplacez ici par votre valeur drsquoUID

Il nous faut maintenant constituer nos fichiers de configuration ldap_accountscf

cat gt etcpostfixldap_accountscf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=peopledc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAccount)(mail=s))

result_attribute = mailbox

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

Et pour ldap_aliasescf

cat gt ldap_aliasescf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=groupsdc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAlias)(mail=s))

result_attribute = maildrop

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

8

On peut maintenant veacuterifier la configuration de Postfix avec (cette commande ne doit rien retourner si crsquoest bon)

postfix check

Si crsquoest bon alors on recharge le serveur

postfix reload

On peut alors faire un envoi de mail test via telnet

telnet localhost 25

Si vous souhaitez deacutelivrer les mails agrave votre maniegravere il faut dans le fichier etcpostfixmaincf la ligne

virtual_transport = nomdevotreregle

Et de mecircme dans le fichier etcpostfixmastercf

nomdevotreregle unix - n n - 5 pipe

flags=Rq user=vmail null_sender=

argv=chemindevotreprogramme

Il nous reste maintenant agrave configurer les diffeacuterents enregistrements DNS neacutecessaire au fonctionnement drsquoun serveur

mail Vous pouvez utiliser la solution de votre choix Dans la suite vous trouverez une meacutethode utilisant Bind9

Installation de Bind9 Dans toute cette partie on se situera dans le dossier etcbind Dans la suite notre IP sera abcd

Dans le fichier namedconfoptions on ajoutera dans le champ options

version Not supported

Dans un dossier zones on eacutecrit le fichier dbdomainetld

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122111 Serial

43200 Refresh

3600 Retry

2419200 Expire

86400 ) Negative Cache TTL

IN NS nsdomainetld

IN NS ns11ovhnet

ns IN A abcd

www IN A abcd

IN A abcd

IN MX 10 maildomainetld

mail IN A abcd

Dans le mecircme dossier zones on a cbain-addrarpa

9

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122101 serial

14400 refresh

3600 retry

604800 expire

10800 minimum

)

cbain-addrarpa IN NS nsdomainetld

cbain-addrarpa IN NS ns11ovhnet

d IN PTR maildomainetld

Il faut faire attention agrave bien increacutementer le serial pour chaque modification des fichiers

Dans le fichier namedconflocal

zone domainetld

type master

file etcbindzonesdbdomainetld

allow-transfer 213251128130

notify yes

zone cbain-addrarpa IN

type master

file etcbindzonescbain-addrarpa

allow-transfer 213251128130

Ici 213251128130 est lrsquoadresse IP du serveur ns11ovhnet

Il faut bien sucircr configurer le DNS avec votre fournisseur (Gandi OVH hellip) Pour ccedila amusez-vous bien Vous pouvez

aussi tester votre configuration avec des outils en ligne tels que DNSstuff

En test final si votre configuration est bonne vous devriez pouvoir envoyer un mail depuis un service neutre (Gmail

yahoo hellip) et le voir dans votre arborescence (ici homevmaildomainetld)

Installation du paquet Debian et configuration de lighttpd

Commencez par reacutecupeacuterer le paquet deb agrave lrsquoadresse suivante httpswwwintimailpwintimaildeb

Installez ensuite GDebi Il srsquoagit drsquoun dpkg ameacutelioreacute pour teacuteleacutecharger les deacutependances automatiquement ce que

dpkg ne gegravere pas

apt-get update

apt-get install gdebi-core

10

Vous pouvez alors installer le paquet

gdebi intimaildeb

Vous aurez alors le site web drsquointiMail deacuteployeacute au chemin varwwwwebmail

Il ne vous reste plus qursquoagrave changer la configuration de lighttpd votre serveur web pour mettre en ligne le site

Vous pouvez pour cela copier-coller la configuration suivante mais veillez agrave bien changer lrsquoadresse IP preacutesente au

deacutebut de la partie SSL CONFIG avec votre adresse IP

serv ermodules = ( mod_access

mod_accesslog

mod_alias

mod_compress

mod_redirect

mod_rewrite

)

Hide server version

servertag = Such Headers Very try Now close telnet

serverdocument-root = varwwwwebmail

serverupload-dirs = ( varwwwwebmailuploads )

servererrorlog = varloglighttpderrorlog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

serverport = 80

accesslogformat = V h l u t r gts b Refereri

User-Agenti

accesslogfilename = varloglighttpdaccesslog

index-filenames = ( indexphp indexhtml

indexlighttpdhtml )

urlaccess-deny = ( ~ inc )

static-fileexclude-extensions = ( php pl fcgi )

compresscache-dir = varcachelighttpdcompress

compressfiletype = ( applicationjavascript textcss

texthtml textplain )

default listening port for IPv6 falls back to the IPv4 port

include_shell usrsharelighttpduse-ipv6pl + serverport

include_shell usrsharelighttpdcreate-mimeassignpl

include_shell usrsharelighttpdinclude-conf-enabledpl

SSL CONFIG

$SERVER[socket] == 5234485443

sslengine = enable

11

sslpemfile = etclighttpdsslintimailpwpem

sslca-file = etclighttpdsslintimailpwcrt

servername = intimailpw

votre configuration habituelle pour ce domaine

serverdocument-root = varwwwwebmail

servererrorlog = varloglighttpderror_ssllog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

Rewrite des URL pour masquer php

urlrewrite-once = ( ^()$ =gt $1 )

urlrewrite-if-not-file = ( ^([^])()$ =gt $1php$2 )

servernetwork-backend = writev

Deacutependances Slapd

Ldap-utils

Postfix

Postfix-ldap

Bind9

Lighttpd

12

Sources httpswikigandinetfrhostingusing-linuxtutorialsdebianmail-server-ldap

httpwwwpostfixorgpipe8html

httpwwwpostfixorgFILTER_READMEhtml

httpwwwpostfixorg

httpwwwpostfixorgtransport5html

Page 7: Système d'hébergement domestique...place sur les domaines .pw par Gandi.net, notre fournisseur. Nous n’avons donc pas pu l’implémenter. Nous avons configuré Postfix pour qu’il

Au coeur du projet

Gestion des utilisateurs - Le serveur LDAP

Comme il lrsquoeacutetait suggeacutereacute dans lrsquoeacutenonceacute du sujet nous nous sommes

inteacuteresseacutes agrave la solution LDAP Il srsquoagit drsquoun protocole de gestion drsquoannuaire baseacute sur

TCPIP Dans un premier temps nous avons penseacute agrave creacuteer un systegraveme de base de

donneacutees utilisant un simple systegraveme de fichiers car nous avions trouveacute ce systegraveme

trop compliqueacute agrave configurer agrave utiliser et trop lourd bien que plus leacuteger qursquoune Base

de Donneacutees classique

Cependant LDAP srsquoavegravere ecirctre un systegraveme parfaitement adapteacute pour la

gestion drsquoinformations utilisateurs En effet cette tacircche requiert beaucoup plus de

lectures que drsquoeacutecritures ce pourquoi LDAP est optimiseacute Ce programme preacutesente

lrsquoavantage de privileacutegier la lecture et disposes de nombreuses API dans les

langages de programmation divers dont PHP que nous utilisons crsquoest pourquoi

nous avons deacutecideacute de lrsquoutiliser

Le modegravele drsquoinformation de LDAP est baseacute sur des entreacutees Chacune drsquoentre

elles est un ensemble drsquoattributs Les informations sont organiseacutees sous la forme

drsquoun arbre Pour notre projet nous avons retenu la structure suivante

Fig 2 Structure de lrsquoannuaire LDAP

Nous avons ici deacutetermineacute des champs agrave renseigner pour constituer un

utilisateur En particulier un utilisateur dispose des attributs suivants

Son identiteacute (nom preacutenom(s))

Son identifiant utilisateur (UID) sous la forme comme agrave Polytech

initiale+nom(+chiffre) Son adresse mail compegravete sous la forme UIDdomainetld

Le chemin de sa boicircte mail sur le systegraveme domaineUID

Son quota (en octets)

Son mot de passe encrypteacute en SSHA

Fig 3 Une personne dans lrsquoannuaire LDAP

Les utilisateurs sont enregistreacutes dans la branche ldquopeoplerdquo de notre annuaire

Nous avons de plus une seconde branche ldquogroupsrdquo Celle-ci contient les listes de

diffusion Elle contient aussi le groupe particulier admins utilisateurs qui ont droit agrave

des options drsquoadministration sur le webmail

Fig 4 Un groupe dans lrsquoannuaire LDAP

On peut remarquer que pour la gestion des listes de diffusion nous avons

choisi de relier une personne agrave un groupe par son UID Ainsi lrsquoappartenance drsquoun

utilisateur agrave un groupe se traduit par la preacutesence de son adressemail dans lrsquoattribut

maildrop du groupe

Cela nous permet de geacuterer de maniegravere pratique les groupes auquels

appartient un utilisateur et inversement de sortir la liste des utilisateurs drsquoun groupe

avec une simple commande de typeldapsearch sur le serveur LDAP Pour ajouter ou

supprimer un utilisateur agrave un groupe il suffira de modifier lrsquoattribut maildrop du

groupe

Serveurs SMTP et DNS

Pour cette partie nous avons utiliseacute lrsquoexcellent Postfix Crsquoest une solution de

messagerie eacutelectronique libre rapide leacutegegravere seacutecuriseacutee et facile agrave administrer Crsquoest

aussi le serveur mail par deacutefaut dans plusieurs systegravemes de type UNIX Il permet

notamment drsquoeacuteviter une bonne partie du spam avec une configuration simple et

accessible

Il est important aussi de respecter les speacutecifications de la RFC Nous avons eu

la surprise de voir qursquoil est ldquoimpeacuteratifrdquo drsquoavoir deux adresses particuliegraveres sur le

serveur postmaster et abuse Ce sont les premiegraveres victimes des attaques par force

brute

La configuration de Postfix se fait de maniegravere eacutetroite avec Bind le serveur de

nom de domaine que nous avons installeacute En effet pour que Postfix fonctionne il est

essentiel que lrsquoenregistrement MX du serveur DNS fonctionne Crsquoest un type

drsquoenregistrement particulier qui permet la mise en place drsquoun serveur mail

De plus il est neacutecessaire de faire un enregistrement PTR qui correspond agrave au

DNS inverse Il nrsquoest pas indispensable au fonctionnement du serveur mail en soit

mais la plupart des fournisseurs de ce type de service se servent de cet

enregistrement pour contrer une partie du spam Il est donc possible que les mails

drsquoun serveur soient bloqueacutes si lrsquoenregistrement PTR est mal configureacute

Parallegravelement nous avons aussi proceacutedeacute agrave lrsquoenregistrement A qui permet la

mise en place drsquoun serveurWeb neacutecessaire agrave notreWebmail Nous avons utiliseacute des

outils en ligne tel que DNSStuff pour tester notre configuration dont un exemple se

trouve en annexe Notons par contre que la technologie DNSSEC nrsquoest pas mise en

place sur les domaines pw par Gandinet notre fournisseur Nous nrsquoavons donc pas

pu lrsquoimpleacutementer

Nous avons configureacute Postfix pour qursquoil utilise notre annuaire LDAP Il est

possible agrave ce stade de tester la configuration avec telnet et drsquoenvoyer unmail Apregraves

cela nous avons testeacute le bon fonctionnement du serveur en envoyant avec succegraves

un mail vers une boicircte mail exteacuterieure de type gmail

Nous nous sommes alors heurteacutes aux protections du Service Informatique de

lrsquoUniversiteacute (CRI) qui bloque le port 25 en sortie et en entreacutee en dehors de lrsquouniversiteacute

Pour nous astreindre de ces restrictions nous avons migreacute notre serveur vers une

nouvelle connexion SDSL exteacuterieure au reacuteseau de Lille 1 Cela a eacuteteacute pour nous un

moyen de veacuterifier en partie la portabiliteacute de notre systegraveme puisque nous utilisons une

toute nouvelle connexion avec une nouvelle adresse IP Nous avons donc ducircmettre

agrave jour notre serveur de nom pour refleacuteter ces changements La migration srsquoest

passeacutee sans soucis avec un deacutelai de propagation des changements drsquoenviron 1

heure Le systegraveme est resteacute fonctionnel agrave 100 notamment parce que dans notre

code nous faisons appel au serveur par localhost ou une variable et jamais

directement lrsquoadresse IP ou le domaine Cependant nous nrsquoavons pas pu veacuterifier la

migration vers un domaine diffeacuterent bien que cela ne reste normalement qursquoune

variable dans les fichiers de configuration de lrsquointerface

Gestion du Spam

Comme preacutevu nous avons apporteacute une solution agrave la gestion du spam sur

notre serveur Postfix propose dans ses paramegravetres lrsquoutilisation de services de

DNSBL (DNS Black List) Cette technologie reprend le mecircme principe que les

serveurs de noms classiques Postfix soumet une requecircte de type DNS aux serveurs

de liste noire deacutefinis dans sa configuration et le serveur indique si ce nom de

domaine est preacutesent dans sa liste ou non On peut de cette maniegravere rejeter une

bonne partie du trafic mail correspondant au Spam et ce tregraves facilement

Malgreacute cela nous pensons qursquoune partie du Spam passera agrave travers les

mailles du filet Il aurait eacuteteacute inteacuteressant de traiter ceux-ci pour les classer comme

indeacutesirables et pouvoir ainsi les afficher dans lrsquointerface web

Serveur Web et Webmail

Un serveur web leacuteger

Initialement nous sommes partis sur une solution classique agrave base drsquoun

serveur web Apache qui nous a permis de deacutebuter le deacuteveloppement de lrsquointerface

Cependant comme nous cherchons agrave alleacuteger un maximum le systegraveme nous nous

sommes pencheacutes sur une autre solution Lighttpd Ce serveur web vise comme son

nom lrsquoindique la performance et la leacutegegravereteacute Sur le mecircme contenu avec une

connexion Tregraves Haut Deacutebit (100Mbps) nous chargeons deacutesormais la page de vue

geacuteneacuterale en 042s (Lighttpd) contre 170s avant (Apache 2) avec le navigateur

Chrome sans cache

Une architecture optimiseacutee

Lrsquoutiliteacute de reacutealiser notre propre webmail est dans un premier temps de

srsquoabstenir de lrsquoinstallation drsquoun serveur IMAPPOP puisque nous retrouvons

nous-mecircmes le contenu Dans un second temps il nous permet de ne garder que les

fonctionnaliteacutes neacutecessaires agrave notre webmail sans superflu

Fig 5 La vue geacuteneacuterale de notre webmail

Gracircce agrave PHP et agrave son module drsquointerface avec LDAP nous pouvons identifier

un utilisateur avec son nom drsquoutilisateur et son mot de passe sur le serveur local

LDAP et ainsi retrouver nombreuses informations utiles comme le quota actuel

autoriseacute son nom entier le chemin drsquoaccegraves agrave son reacutepertoire dans lesquels sont ses

mails sur le systegraveme de fichiershellip

Fig 6 Lrsquoarchitecture du dossier drsquoun utilisateur des dossier sent et inbox contenant les

mails bruts un dossier json dans lequel sont placeacutes les entecirctes des mails ainsi que le quota

Chaque en-tecircte de mail est eacutecrite dans un fichier json distinct par boicircte (un

fichier pour la boicircte de reacuteception un fichier pour les mails envoyeacuteshellip) ce qui nous

permet de montrer agrave lutilisateur la liste des mails dune boicircte sans traitement lourds

en arriegravere plan pour le serveur Ces fichiers sont renseigneacutes par un script lanceacute agrave la

reacuteception drsquoun mail par postfix du cocircteacute reacuteception et par lrsquointerface web elle mecircme

pour lrsquoeacutemission Lrsquoen-tecircte drsquoun mail est eacutecrite dans un conteneur JSONde lamaniegravere

suivante

Fig 7 Exemple drsquoentreacutee dans un fichier json

Gracircce tout cela nous pouvons afficher simplement le contenu des diffeacuterentes

boicirctes mail dans des tableaux sur lrsquointerface gracircce aux en-tecirctes et par la suite

retrouver et afficher le contenu drsquoun mail agrave partir de son fichier brut sur lequel

lrsquoutilisateur aura cliqueacute comme on le verra un peu plus loin

Toujours dans un souci drsquoameacutelioration des performances le strict neacutecessaire

est geacuteneacuteralement chargeacute sur les pages web par exemple en venant de la vue

geacuteneacuterale lorsqursquoon clique surInboxseule la partie inteacuterieure de la page est chargeacutee

on ne recharge pas le bandeau du haut de page ou lemenu de gauche agrave lamaniegravere

drsquoun MVC classique

Envoyer des courriels

Toute cette architecture ne doit pas nous faire oublier le but premier envoyer

et recevoir des mails Pour envoyer des mails crsquoest tregraves simple on peut soit cliquer

dans le bandeau du haut sur ldquoQuick Emailrdquo qui permet sur lamecircme page drsquoenvoyer

un email rapide et sans piegravece-jointe soit cliquer dans la barre de navigation sur le

cocircteacute sur ldquoWrite a new emailrdquo ce qui nous megravene vers une page deacutedieacutee permettant

drsquoeacutecrire un email incluant une piegravece jointe

Fig 8 Envoyer un mail crsquoest simple comme bonjour

On peut remarquer sur cette capture drsquoeacutecran que lrsquoon ne peut envoyer que

certains types de piegraveces jointes Nous supportons JPG PNG GIF PDF et ZIP Si la

piegravece jointe est drsquoun autre format elle est rejeteacutee La veacuterification du type srsquoeffectue

sur lrsquoextension du fichier et sur son type MIME ce qui eacutevite par exemple que

quelqursquoun modifie lrsquoextension drsquoun fichierexe en fichierjpg pour lrsquoenvoyer La piegravece

jointe doit de plus avoir une taille infeacuterieure agrave la taille maximale drsquoune piegravece jointe

parameacutetreacutee par lrsquoadministrateur comme nous le verrons dans lrsquointerface

drsquoadministration

Si tous ces critegraveres sont bons on eacutecrit lemail au format brut deacutecrit par la RFC

puis on lrsquoexpeacutedie agrave lrsquoaide de la fonction mail de PHP Si cette fonction nrsquoeacutechoue pas

crsquoest que le mail est expeacutedieacute avec succegraves on peut alors mettre agrave jour le quota

drsquoespace disque maximum autoriseacute agrave lrsquoutilisateur en increacutementant celui-ci avec la

taille du mail qui vient drsquoecirctre envoyeacute ainsi que creacuteer un fichiermail brut sur le disque

pour pouvoir afficher le mail dans la boicircte drsquoenvoi et en garder une trace

Notons que comme crsquoest lrsquoutilisateur web du systegraveme (www-data) qui exeacutecute

la fonction nous modifions les en-tecirctes du mail afin que le destinataire reccediloive un

mail de la part de ldquoPreacutenom Nomrdquo depuis lrsquoadresse ldquopnomdomainetldrdquo plutocirct que

ldquowww-datadomaintldrdquo par deacutefaut

La migration vers une IP externe agrave Lille 1 eacutetant reacuteussie nous pouvons bien

envoyer des mails depuis notre interface qui sont reccedilus agrave lrsquoexteacuterieur sans soucis

Mais aussi en recevoir

Recevoir des mails est tout aussi important Nous avons vu lrsquoarchitecture en

arriegravere-plan mais au final agrave quoi cela ressemble-t-il pour lrsquoutilisateur Il dispose en

fait en cliquant sur Inbox (ou Sent Spam ou Trash eacutegalement) drsquoun accegraves agrave sa boicircte

de reacuteception Drsquoun clic srsquoaffichent alors agrave lui tous les mails qursquoil a reccedilu

Fig 9 La boicircte de reacuteception

On remarque notamment les fonctions de recherche drsquoactualisation du

tableau de choix des colonnes agrave afficher on peut classiquement choisir combien de

lignes on affiche par page changer de pages etchellip

Lorsque lrsquoon clique sur un des lignes les donneacutees de lrsquoen-tecircte du mails sont

passeacutes en paramegravetres agrave une autre page qui drsquoapregraves ces informations retrouve le

fichier mail brut le traite et lrsquoaffiche

Fig 10 Un mail contenant 3 piegraveces jointes et un message

Comme on peut le voir nous pouvons recevoir desmails avec plusieurs piegraveces

jointes Nous avons ici preacutesenteacute la boicircte de reacuteception mais les autres boicirctes

fonctionnent de maniegravere similaire

Interface drsquoadministration

Le systegraveme de webmail possegravede plusieurs variables des listes de diffusion

des compteshellipMais on veut pouvoir donner les droits agrave un utilisateur demodifier tout

cela En effet si nous trouvons cela abordable drsquoajouter un utilisateur avec une

commande dans le shell il faut aussi penser agrave lrsquoutilisateur final qui preacutefegravere peut-ecirctre

le confort drsquoune interface deacutedieacutee pour geacuterer son serveur mail plutocirct que le terminal

De maniegravere tregraves simple un utilisateur appartenant au groupes drsquoutilisateurs

ldquoAdministrateursrdquo est reconnu en tant qursquoadministrateur par lrsquointerface et peut

cliquer sur un bouton ldquoManagerdquo dans le panneau lateacuteral qui nrsquoest visible qursquoaux

administrateurs De lagrave il arrive sur la page suivante

Fig 11 lrsquointerface drsquoadministration

Sur cette interface il peut choisir la taille maximale des piegraveces jointes

changer le nom de domaine sur lequel est installeacute lrsquointerface et dont deacutependent

toutes les adresses (domaine) Il est aussi possible de modifier directement ces

variables en modifiant le fichier includeconfigincphp Pratique notamment si lrsquoon

a renseigneacute un mauvais nom de domaine agrave la configuration et que lrsquoon arrive plus agrave

acceacuteder agrave lrsquointerface

Il peut aussi creacuteer un nouveau compte en renseignant les champs preacutenom

nom mot de passe et quota Lrsquoutilisateur peut ensuite une fois son compte creacutee

directement se connecter avec son identifiant (initiale preacutenom + nom) et mot de

passe Lors de la creacuteation du compte un mail de bienvenue est envoyeacute au nouvel

utilisateur ce qui permet en arriegravere-plan de creacuteer tous les dossiers utilisateurs et

fichiers en-tecirctes utiles agrave lrsquointerface une fois pour toutes

Lrsquoadministrateur peut aussi ajouter une liste de diffusion (assimileacutee agrave un

groupe) ou en supprimer une parmi les listes existantes

En outre lrsquoadministrateur peut aussi modifier les donneacutees drsquoun utilisateur

Pour cela sur la preacutesente page il peut seacutelectionner un utilisateur parmi la liste des

utilisateurs existants ce qui le redirige vers la page de gestion des comptes

Fig 12 La gestion drsquoun compte seacutelectionneacute ici celui de James Bond

A ce stade il peut changer lrsquoUID de lrsquoutilisateur (utile en cas de conflit) le nom

le mot de passe le quota de cet utilisateur et lrsquoajouter ou le retirer drsquoune liste de

diffusion Accessoirement il peut aussi supprimer le compte en cliquant sur lrsquoeacutenorme

bouton rouge qui lui demandera deux fois de suite de confirmer son action afin

drsquoeacuteviter les erreurs de clic Cette action entraicircne la suppression de lrsquoutilisateur de

toutes les listes de diffusion auxquelles il appartient la suppression de son compte

dans la branche people de lrsquoarbre LDAP et la suppression deacutefinitive de son dossier

utilisateur sur le disquesystegraveme de fichiers impliquant donc la perte de ses mails

Architecture du systegraveme de fichiers

Comme nous lrsquoavons dit plus haut lrsquoideacutee est de se passer des meacutecanismes

classiques avec les clients mails habituels Ces serveurs srsquoalourdissent

geacuteneacuteralement en utilisant des serveurs IMAPPOP3 et un meacutecanisme

drsquoauthentification SMTP

Pour adapter ces fonctionnaliteacutes agrave notre systegraveme nous avons donc constitueacute

une architecture pour organiser les fichiers qui transitent Vous pourrez voir un

scheacutema reacutecapitulatif en annexe 1

Dans la premiegravere moitieacute du projet les mails eacutetaient deacutelivreacutes par Postfix Nous

utilisions un script exeacutecuteacute lors de la reacuteception drsquounmail pour les traiter de lamaniegravere

que nous voulions Cette meacutethode avait les inconveacutenients drsquoecirctre lourde et pas

efficace agrave 100 En effet seuls les mails reccedilus depuis lrsquoexteacuterieur eacutetaient

correctement traiteacutes

Deacutesormais les mails sont traiteacutes totalement par notre script Cela nous

permet de geacuterer les mails dans des dossiers organiseacutes agrave notre maniegravere et de

recevoir les mails locaux crsquoest-agrave-dire entre utilisateurs du mecircme domaine Cette

nouvelle meacutethode regravegle aussi drsquoautres problegravemes notamment au niveau des

permissions sur les fichiers

Pour reacuteduire le nombre drsquoopeacuterations et pour profiter des fonctionnaliteacutes

offertes par le framework utiliseacute pour lrsquointerface web nous regroupons des

informations sur chacun des mails reccedilus sous la forme de fichiers JSON Pour ce

faire lrsquoideacutee est drsquoexeacutecuter un script lorsque leacutevegravenement ldquoreacuteception drsquoun mailrdquo

survient Postfix offre cette possibiliteacute dans sa configuration Or il se trouve qursquoil nrsquoest

pas si simple de reacutecupeacuterer le chemin du fichier contenant le mail car le nom du

fichier creacutee est sous la forme Timestamp UNIX10 Caractegraveres aleacuteatoires (ex

14562336185A8D43E97F)

La seconde probleacutematique est que le webmail doit avoir la possibiliteacute de

pouvoir lire les fichiers pour afficher les mails sur son interface Or il semble que

Postfix les eacutecrit en autorisant uniquement son utilisateur en lecture Il nous a fallu

trouver une solution pour remeacutedier agrave cela Nous avons choisi drsquoajouter www-data

(utilisateur du serveur web) au groupe vmail et de modifier les droits sur les fichiers

de sorte que les utilisateurs de ce groupe puissent lire les fichiers

Nous avons revu une partie de lrsquoorganisation des fichiers pour reacutecupeacuterer les

piegraveces jointes si elles sont preacutesentes Le script que nous avons eacutecrit reacutecupegravere le

fichier original du mail et le deacutecoupe en eacuteleacutements simples dans des fichier distincts

corps du mail et diffeacuterentes piegraveces jointes De cette maniegravere pour afficher un mail

nous nrsquoavons pas besoin de charger la totaliteacute du fichier Dans le cas ougrave il y a des

piegraveces jointes cela aurait ralenti lrsquoaffichage des informations

Nous avons eacutegalement impleacutementeacute la gestion des quotas Dans lrsquoeacutetat actuel

des choses srsquoil nrsquoy a plus de place disponible pour lrsquoutilisateur le mail nrsquoest tout

bonnement pas deacutelivreacute agrave ce destinataire Lrsquoideacuteal aurait eacuteteacute de notifier leacutemetteur avec

un mail ce qui nrsquoest pour lrsquoinstant pas le cas mais qui pourrait ecirctre reacutesolu en

renvoyant agrave postfix un code drsquoerreur deacutefini

Pour terminer nous avons revu la totaliteacute du code deacuteveloppeacute Nous sommes

passeacute du Bash au Perl Ce dernier est plus performant et plus simple agrave utiliser et agrave

lire

Firewall

Un autre gros morceau du projet mais qui nrsquoest pas speacutecifiquement lieacute agrave la

probleacutematique du mail crsquoest la seacutecurisation du serveur En effet apregraves avoir mis en

ligne notre serveur des pirates ont tregraves vite tenteacute de peacuteneacutetrer le systegraveme

Globalement les attaques eacutetaient de type force brute sur les services heacutebergeacutes sur

notre Raspberry neacutecessitant une identification tels que SSH SMTP hellip

On retrouve ici un petit point faible du protocole SMTP Eacutetant donneacute que

chaque serveur mail doit avoir une adresse postmaster et abuse lrsquoattaquant a agrave sa

disposition deux adresses agrave attaquer Ceci dit ce type drsquoattaque est simple agrave

contrecarrer car il suffit de limiter dans le temps le nombre de tentatives de

connexions

La contre-mesure que nous avons mis en place est simple une seacuterie de

regravegles Iptables En reacutesumeacute nous avons opteacute pour un systegraveme de liste blanche et

noire Les adresses IPs de la liste blanche sont autoriseacutees agrave utiliser la totaliteacute des

services (notamment SSH) tandis que celles de la liste noire sont totalement

ignoreacutees Les autres IPs nrsquoont accegraves qursquoau webmail

Eacutetant donneacute que le nombre drsquoIPs attaquant notre serveur nrsquoa cesseacute

drsquoaugmenter nous avons automatiseacute la mise agrave jour de la liste de noire en

deacuteveloppant un script pour Cron Ce script est exeacutecuteacute une fois par heure A ce jour

notre liste noire contient 47 adresses Bien sucircr ce systegraveme est susceptible drsquoecirctre

modifieacute agrave convenance pour passer sur une solution deacutedieacutee telle que Fail2ban qui fait

en fait ce qursquoon fait deacutejagrave (eacutetudier les logs et bannir des IP avec iptables) avec des

regravegles preacutedeacutefinies par la communauteacute et personnalisables En effet nous nous

attendons agrave voir la varieacuteteacute et le nombre drsquoattaques augmenter apregraves avoir migreacute sur

une IP non proteacutegeacutee par le firewall de lrsquoUniversiteacute puisque nous nrsquoavons plus la

premiegravere ligne de deacutefense du CRI en particulier pour le port 389 (LDAP) qui eacutetait

bloqueacute par lrsquouniversiteacute et srsquoest retrouveacute en premiegravere ligne apregraves la migration Nous

avons donc ajouteacute une regravegle bloquant tout le trafic entrant vers le port 389 hormis

localhost

Package drsquoinstallation

Nous avons creacutee un package deb contenant les sources du webmail ainsi

que des scripts utiles agrave lrsquoinstallation et au fonctionnement du serveur Nous avons

deacuteveloppeacute des scripts de configuration automatique pour LDAP et Postfix Comme

dpkg ne supporte pas directement lrsquoinstallation automatique des deacutependances

nous recommandons drsquoinstaller avant tout le paquet gdebi-core qui est en fait un

dpkg ameacutelioreacute Gracircce agrave la commande gdebi paquetdeb toutes les deacutependances

seront installeacutees en particulier postfix le serveur ldap le serveur web lighttpd entre

autres sans soucis Il est agrave noter que comme les scripts de configuration des

diffeacuterents services ne sont que partiellement impleacutementeacutes dans le paquet deb nous

fournissons en annexe un README complet et illustreacute qui explique pas agrave pas

comment faire fonctionner notre systegraveme sur nrsquoimporte quel Linux en particulier les

lignes de configuration des diffeacuterents services agrave changer et un exemplaire des

fichiers de configuration fonctionnels de ces services

Gestion de lrsquoeacutenergie

Une consideacuteration importante pour un systegraveme autonome Drsquoapregraves les fiches

techniques notre modegravele de Raspberry Pi (B 2) est officiellement eacutevalueacute avec un

fonctionnement agrave ~650mA pour 5V De nombreux proprieacutetaires de ce systegraveme

eacutequipeacutes se sont amuser agrave veacuterifier la consommation eacutelectrique reacuteelle de leur Pi 2 B

sous diffeacuterentes charges On pourra retenir cette eacutetude (lien en sitegraphie) qui

relegraveve la consommation en courant en fonction de lrsquoactiviteacute lanceacutee sur la Pi mais

aussi en charge sur 1 agrave 4 CPU

Ces chiffres sont releveacutes sur un systegraveme avec cameacutera connecteacutee HDMI connecteacute et

cacircble ethernet brancheacute et actif

On peut constater que globalement notre systegraveme Pi 2 B tournant sans

interface graphique sans composant suppleacutementaire sans sortie videacuteo ni cameacutera

avec plusieurs serveurs tournant tout en restant le plus leacuteger possible et demeurant

~99 idle la plupart du temps ne devrait pas deacutepasser une consommation de

300mA grand maximum

Fig 13 Un processeur tregraves tregraves peu chargeacute et une meacutemoire relativement libre

Nous avions lrsquoanneacutee derniegravere deacutejagrave reacutealiseacute un circuit permettant drsquoadapter un

panneau solaire sur une batterie USB classique de 9000mAh Nous avions alors pu

mesurer lrsquointensiteacute deacutelivreacutee par le panneau solaire En cas drsquoensoleillement moyen

habituel dans nos contreacutees le panneau solaire deacutebitait 400mA et pouvait atteindre

le double quand le soleil eacutetait directement preacutesent pour environ 800mA deacutebiteacute

Ce panneau solaire accompagneacute de son circuit drsquoadaptation devrait donc

suffire pour alimenter notre systegraveme la journeacutee le brancher ensuite sur une batterie

portable permet de stocker le surplus pour la nuit

Fig 14 le circuit drsquoadaptation

Fig 15 et son PCB

Eacutevolutions possibles

Webmail

Concernant les eacutevolutions possibles que nous aurions aimeacute apporter agrave notre

projet avec plus de temps commenccedilons par le web Nous aurions souhaiteacute apporter

la gestion de lrsquoenvoi de plusieurs piegraveces jointes comme nous lrsquoavons fait pour la

reacuteception

De plus nous aurions voulu inteacutegrer une corbeille ougrave lesmessages pourraient

aller avant drsquoecirctre deacutefinitivement supprimeacutes du systegraveme drsquoautant que nous avons

deacutejagrave eacutecrites les fonctions PHP permettant de retirer une en-tecircte drsquoun fichier JSON et

le fichier mail associeacute

Enfin nous aurions aimeacute en plus du blocage deacutejagrave preacutesent impleacutementer une

gestion plus profonde des piegravece jointes permettant notamment le remplissage de la

boicircte de spams

Systegraveme

Il aurait eacuteteacute inteacuteressant de notifier lrsquoexpeacutediteur lorsque le mail nrsquoa pas pu ecirctre

deacutelivreacute agrave un utilisateur lorsque son quota est plein En toute logique cela devrait ecirctre

fait simplement avec la commande Sendmail

Une meilleur gestion du trafic mail indeacutesirable aurait eacuteteacute la bienvenue En

effet malgreacute la limitation du spam il restera toujours une partie du volume de mail

qui sera indeacutesirable (pub pishing scam hellip)

Eacutetant donneacute la taille du systegraveme nous avions penseacute agrave une approche

ldquomachine learningrdquo Lrsquoutilisateur indiquerait pourquoi il considegravere le mail comme

indeacutesirable constituant des regravegles refusant certains mails Les mails provenant de

cet expeacutediteur pourraient ecirctre deacutetecteacute par le script agrave la reacuteception et

automatiquement envoyeacutes dans la boicircte de spams

Partie eacutenergeacutetique

Mecircme si la solution au panneau solaire ne pose aucun problegraveme en theacuteorie

nous aurions deacutejagrave dans un premier temps aimeacute lrsquoimpleacutementer en pratique Nous

nrsquoavons finalement pas reacutealiseacute notre objectif de deacutetecter deux cas drsquoalimentation

diffeacuterents soit lrsquoalimentation via panneau solaire est suffisante dans ce cas il

alimente la batterie et donc la Raspberry soit quand ce courant nrsquoest pas suffisant

on alimente la batterie par le secteur

Conclusion

En conclusion nous pensons avoir reacutepondu au cahier des charges initial dans

sa majeure partie Nous sommes aujourdrsquohui en mesure de proposer une solution

mail domestique priveacutee et personnalisable par un particulier

Notre installation de Debian a eacuteteacute au maximum alleacutegeacutee pour notre utilisation

sans interface graphique et nous avons mis en place une reacuteponse aux diverses

attaques que nous avons pu subir lors de lamise en place de notre solution logicielle

En outre le pare-feu avec notre systegraveme de liste noire bloque une partie des

attaques qui peuvent nous parvenir

Nos diffeacuterents scripts de pare-feu de gestion drsquoun mail entrant associeacute au

webmail permettent agrave un utilisateur drsquoacceacuteder aux fonctions usuelles associeacutees agrave

lrsquoenvoi et la reacuteception de mails

Gracircce agrave sa configuration personnalisable notre projet devrait pouvoir ecirctre

porteacute sur un domaine et une adresse IP diffeacuterente sans soucis et ecirctre deacuteployeacute

partout ougrave des gens souhaitent conserver leur vie priveacutee

Nous regretterons cependant de ne pas avoir exploiteacute la partie eacutenergeacutetique

de ce projet qui portait une probleacutematique inteacuteressante et qui nous parait importante

dans le monde actuel

Ce projet nous aura occupeacute pendant tregraves longtemps et nous sommes fiers du

travail que nous avons accompli Il est agrave nos yeux la preuve de ce que nous savons et

pouvons faire et nous donnera confiance pour notre deacutebut de carriegravere drsquoingeacutenieur

Sources

httpwwwradicaticomwpwp-contentuploads201401Email-Statistics-R

eport-2014-2018-Executive-Summarypdf

httpwwwcommentcamarchenetcontents525-le-protocole-ldap

httpsfrwikipediaorgwikiSimple_Mail_Transfer_Protocol

httpwwwcommentcamarchenetcontents536-pop3-smtp-imap-protocol

es-de-messagerie

httpstoolsietforghtmlrfc2821

httpsfrwikipediaorgwikiInternet_Message_Access_Protocol

httpstoolsietforghtmlrfc3501

httparstechnicacominformation-technology201402how-to-run-your-ow

n-e-mail-server-with-your-own-domain-part-1

httpswwwraspberrypiorgforumsviewtopicphpp=136912

httpstackoverflowcomquestions17394356how-can-i-make-a-bash-com

mand-run-periodically

httpuntroubledorgnullmailer

httpelinuxorgRPi_Hardware

httpraspitv2015raspberry-pi2-power-and-performance-measurement

Annexe 1 Architecture du systegraveme de fichiers

Annexe 2 Scan DNSSTUFF

Depuis httpwwwdnsstuffcomtoolsdnsReport|type=domainampampvalue=intimailpw

Annexe 3 Vue geacuteneacuterale httpswwwintimailpw

Annexe 4 Envoyer un mail

Annexe 5 Boite de reacuteception

Annexe 6 Interface drsquoadministration

Annexe 7 Gestion drsquoun utilisateur

Tutorial installation intimailtrade

Table des matiegraveres Apregraves une nouvelle installation de lrsquoOS 2

Seacutecurisation du serveur 2

Changement de lrsquoutilisateur par deacutefaut 2

Changement du port SSH 2

Interdire lrsquoauthentification SSH pour root 2

Installation de LDAP 3

Configuration de base 3

Configuration des Scheacutemas 4

Constitution de la base de donneacutees LDAP 5

Installation de Postfix 7

Installation de Bind9 8

Installation du paquet Debian et configuration de lighttpd 9

Deacutependances 11

Sources 12

2

Apregraves une nouvelle installation de lrsquoOS Exeacutecutez ces commandes pour mettre agrave jour agrave la derniegravere version Ces opeacuterations peuvent prendre un certain

temps Nous avons utiliseacute pour cet exemple Raspbian Jessie Lite sur une Raspberry Pi 2

apt-get update

apt-get upgrade ampamp apt-get dist-upgrade

apt-get install linux-headers-$(uname -r)

reboot

Puis lancer

raspi-config

Etendre au maximum lrsquoespace de stockage en navigant dans les menus

Expand Filesystem

Reacutegler une ip statique avec la box fichier etcnetworkinterfaces

iface eth0 inet static

address 192168131

netmask 2552552550

gateway 19216811

Nous avons aussi supprimeacute wpasupplicant

Seacutecurisation du serveur

Changement de lrsquoutilisateur par deacutefaut Changez le nom drsquoutilisateur par deacutefaut ainsi que son mot de passe

sudo passwd root

Sortie et login en tant que root puis

usermod -l myuname pi

usermod -m -d homemyuname myuname

groupmod ndashn myuname pi

passwd myuname

Voir cette adresse pour lrsquoutilisation de cleacutes priveacuteespubliques

Changement du port SSH sed ndashi sPort 22Port 2222g etcsshsshd_config

Interdire lrsquoauthentification SSH pour root sed -i sPermitRootLogin yesPermitRootLogin nog etcsshsshd_config

3

Installation de LDAP

Configuration de base Installation du package

apt-get install slapd

Choisir un mot de passe administrateur puis lancer la commande

dpkg-reconfigure slapd

Reacutepondre non agrave la question 1

Entrez le nom de domaine utiliseacute agrave la question 2 sous la forme domainetld

Entrez ce que vous voulez au 3egraveme eacutecran le nom de lrsquoorganisation ne sera pas utiliseacute

Entrez un mot de passe

Choisissez HDB

Choisissez si la base de donneacutees est supprimeacutee agrave la deacutesinstallation de slapd

Deacuteplacez lrsquoancienne base de donneacutees

Nrsquoutilisez pas LDAPv2

Installer les outils de conversion pour ldap (slaptest ldapmodify notamment)

apt-get install ldap-utils

On peut maintenant veacuterifier que la configuration est valable

ldapsearch -x -h localhost -b dc=domainedc=tld -LLL dc=domaine dn

Cette commande doit retourner quelque chose comme

dn dc=domainedc=tld

Il faut maintenant seacutecuriser le serveur LDAP en effet on peut y acceacuteder en anonyme avec la commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=config

(amp(objectClass=olcDatabaseConfig)(olcSuffix=dc=domainedc=tld))

Cette commande retourne un certain nombre drsquoinformations notamment agrave propos des champs suivants

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by none

olcAccess 1to dnbase= by read

olcAccess 2to by read

On va modifier ces champs avec la commande ldapmodify Pour cela on va creacuteer un fichier ldif

cat gt changeAccessldif ltlt EOF

dn olcDatabase=1hdbcn=config

changetype modify

delete olcAccess

-

add olcAccess

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by dn=cn=admindc=domainedc=tld write by none

-

add olcAccess

olcAccess 1to dnbase= by read

-

4

add olcAccess

olcAccess 2to by self write by dn=cn=admindc=domainedc=tld write by

none

-

EOF

On peut maintenant appliquer les changements avec ldapmodify

ldapmodify ndashc ndashY EXTERNAL ndashH ldapi -f changeAccessldif

La commande devrait vous confirmer que la modification srsquoest bien effectueacutee

SASLEXTERNAL authentication started

SASL username gidNumber=0+uidNumber=0cn=peercredcn=externalcn=auth

SASL SSF 0

modifying entry olcDatabase=1hdbcn=config

On peut veacuterifier qursquoon ne peut plus acceacuteder aux informations avec la commande

ldapsearch -x -c -h localhost -b dc=domainedc=tld

On peut veacuterifier la configuration en se connectant en tant qursquoadministrateur

ldapsearch -c -h localhost -b dc=domainedc=tld -D

cn=admindc=domainedc=tld ndashW

Configuration des Scheacutemas Nous allons utiliser les scheacutemas de courier-ldap Pour eacuteviter une manipulation compliqueacutee vous trouverez

directement le scheacutema avec le fichier authldapschema On place ce fichier dans le dossier

mv authldapschema etcldapschema

Nous creacuteons un fichier qui incluera tous les scheacutemas de base en plus du nouveau On peut les afficher avec la

commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

Creacuteation du fichier de configuration pour notre exemple cela donne

mkdir tmpldapconf

cat gt tmpldapconfldapconf ltlt EOF

include etcldapschemacoreschema

include etcldapschemacosineschema

include etcldapschemanisschema

include etcldapschemainetorgpersonschema

include etcldapschemaauthldapschema

EOF

On lance ensuite la commande

slaptest -f tmpldapconfldapconf -F tmpldapconf

Elle revoie un message de succegraves Cette commande a creacuteeacute dans le reacutepertoire tmpldapconf une arborescence

correspondant agrave la configuration de notre LDAP

On modifie le chemin de configuration

5

sed ndashi 0dnauthldap sauthldapauthldapcn=schemacn=config

cn=authldapldif

On supprime ensuite les 7 derniegraveres lignes du fichier

head -n -7 cn=authldapldif gt tmpldif

mv tmpldif cn=authldapldif

On peut maintenant importer notre fichier de configuration Pour ce faire

ldapadd -Y EXTERNAL -H ldapi -f

tmpldapconfcn=configcn=schemacn=authldapldif

Si tout va bien lrsquoentreacutee devrait avoir eacuteteacute ajouteacutee On peut veacuterifier avec la commande vue tout agrave lrsquoheure

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

On devrait voir en plus le nouveau scheacutema authldap

Constitution de la base de donneacutees LDAP Le remplissage de la base se fait agrave lrsquoaide de fichiers ldif Nous donnons ici un exemple de structure

Fichier pour la structure de base

dn dc=maildc=domainedc=tld

o intimailpw

description Global mail tree

dc mail

objectClass top

objectClass dcObject

objectClass organization

dn dc=peopledc=maildc=domainedc=tld

description Informations of all users

o people

dc people

objectClass top

objectClass dcObject

objectClass organization

dn dc=groupsdc=maildc=domainedc=tld

description All groups of users

o groups

dc groups

objectClass top

objectClass dcObject

objectClass organization

6

Fichier pour ajouter un utilisateur

dn cn=jbonddc=peopledc=maildc=domainedc=tld

uid jbond

mail jbonddomainetld

sn Moulin

givenName James

displayName James Bond

mailbox domainetldjbond

quota 50M

homeDirectory homevmail

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAccount

userPassword SSHA367PSXiUAegy8dpJbPU8OepEf8L5ye

Pour obtenir un hash du mot de passe

slappasswd -s password -h SSHA

On peut par la suite ajouter la configuration agrave la base de donneacutees avec la commande

ldapadd -D cn=admindc=domainedc=tld -W -h localhost -f pathtofile

Si les champs proposeacutes ne sont pas suffisants il faudra alors effectuer les modifications dans le fichier autldapschema

proposeacute plus haut et refaire la manipulation de configuration

De plus les standards du Mail deacutecrit par lrsquoIETF (RFC822 63 RFC1123 527 and RFC2821 451) impliquent drsquoavoir une

adresse Postmaster et une Abuse Pour cela nous pourrions creacuteer ces adresses avec la meacutethode vue au-dessus mais

ce nrsquoest pas la meilleure Il est preacutefeacuterable drsquoutiliser un alias comme nous le ferons avec les listes de diffusion Ici nous

proposons de rediriger ces deux adresses vers une adresse administrateur Pour cela la meacutethode est la mecircme sauf

que le fichier ldif nrsquoest pas tout agrave fait identique En voici un exemple

dn cn=postmasterdc=groupsdc=maildc=domainedc=tld

uid postmaster

mail postmasterdomainetld

sn Postmaster

displayName Postmaster

maildrop admindomainetld

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAlias

Pour faire une liste de diffusion la meacutethode est la mecircme Il suffit drsquoajouter toutes les adresses destinataires dans le

champ maildrop seacutepareacutees par des virgules ()

7

Installation de Postfix Installation des packages

apt-get install postfix postfix-ldap

Lors de lrsquoinstallation deux eacutecrans deacutefilent

- Configuration Internet Site

- Valeur par deacutefaut pour le mail name

On creacutee lrsquoutilisateur qui servira agrave exeacutecuter Postfix

groupadd vmail

useradd -g vmail -d homevmail -s binfalse -m vmail

Nous aurons besoin dans la suite des GID et UID creacuteeacutes agrave cet instant Ils peuvent ecirctre afficheacutes avec les commandes

cat etcgroup | grep vmail | cut -d -f3

cat etcpasswd | grep vmail | cut -d -f3

On ajoute les paramegravetres au fichier etcpostfixmaincf (remplacer les valeurs de GID et drsquoUID avec vos valeurs)

smtpd_banner = maildomainetld

virtual_mailbox_base = homevmail

virtual_mailbox_domains = dmainetld

virtual_mailbox_maps = ldapetcpostfixldap_accountscf

virtual_alias_maps = ldapetcpostfixldap_aliasescf

virtual_minimum_uid = 100

virtual_gid_maps = static1001 Remplacez ici par votre valeur de GID

virtual_uid_maps = static1001 Remplacez ici par votre valeur drsquoUID

Il nous faut maintenant constituer nos fichiers de configuration ldap_accountscf

cat gt etcpostfixldap_accountscf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=peopledc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAccount)(mail=s))

result_attribute = mailbox

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

Et pour ldap_aliasescf

cat gt ldap_aliasescf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=groupsdc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAlias)(mail=s))

result_attribute = maildrop

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

8

On peut maintenant veacuterifier la configuration de Postfix avec (cette commande ne doit rien retourner si crsquoest bon)

postfix check

Si crsquoest bon alors on recharge le serveur

postfix reload

On peut alors faire un envoi de mail test via telnet

telnet localhost 25

Si vous souhaitez deacutelivrer les mails agrave votre maniegravere il faut dans le fichier etcpostfixmaincf la ligne

virtual_transport = nomdevotreregle

Et de mecircme dans le fichier etcpostfixmastercf

nomdevotreregle unix - n n - 5 pipe

flags=Rq user=vmail null_sender=

argv=chemindevotreprogramme

Il nous reste maintenant agrave configurer les diffeacuterents enregistrements DNS neacutecessaire au fonctionnement drsquoun serveur

mail Vous pouvez utiliser la solution de votre choix Dans la suite vous trouverez une meacutethode utilisant Bind9

Installation de Bind9 Dans toute cette partie on se situera dans le dossier etcbind Dans la suite notre IP sera abcd

Dans le fichier namedconfoptions on ajoutera dans le champ options

version Not supported

Dans un dossier zones on eacutecrit le fichier dbdomainetld

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122111 Serial

43200 Refresh

3600 Retry

2419200 Expire

86400 ) Negative Cache TTL

IN NS nsdomainetld

IN NS ns11ovhnet

ns IN A abcd

www IN A abcd

IN A abcd

IN MX 10 maildomainetld

mail IN A abcd

Dans le mecircme dossier zones on a cbain-addrarpa

9

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122101 serial

14400 refresh

3600 retry

604800 expire

10800 minimum

)

cbain-addrarpa IN NS nsdomainetld

cbain-addrarpa IN NS ns11ovhnet

d IN PTR maildomainetld

Il faut faire attention agrave bien increacutementer le serial pour chaque modification des fichiers

Dans le fichier namedconflocal

zone domainetld

type master

file etcbindzonesdbdomainetld

allow-transfer 213251128130

notify yes

zone cbain-addrarpa IN

type master

file etcbindzonescbain-addrarpa

allow-transfer 213251128130

Ici 213251128130 est lrsquoadresse IP du serveur ns11ovhnet

Il faut bien sucircr configurer le DNS avec votre fournisseur (Gandi OVH hellip) Pour ccedila amusez-vous bien Vous pouvez

aussi tester votre configuration avec des outils en ligne tels que DNSstuff

En test final si votre configuration est bonne vous devriez pouvoir envoyer un mail depuis un service neutre (Gmail

yahoo hellip) et le voir dans votre arborescence (ici homevmaildomainetld)

Installation du paquet Debian et configuration de lighttpd

Commencez par reacutecupeacuterer le paquet deb agrave lrsquoadresse suivante httpswwwintimailpwintimaildeb

Installez ensuite GDebi Il srsquoagit drsquoun dpkg ameacutelioreacute pour teacuteleacutecharger les deacutependances automatiquement ce que

dpkg ne gegravere pas

apt-get update

apt-get install gdebi-core

10

Vous pouvez alors installer le paquet

gdebi intimaildeb

Vous aurez alors le site web drsquointiMail deacuteployeacute au chemin varwwwwebmail

Il ne vous reste plus qursquoagrave changer la configuration de lighttpd votre serveur web pour mettre en ligne le site

Vous pouvez pour cela copier-coller la configuration suivante mais veillez agrave bien changer lrsquoadresse IP preacutesente au

deacutebut de la partie SSL CONFIG avec votre adresse IP

serv ermodules = ( mod_access

mod_accesslog

mod_alias

mod_compress

mod_redirect

mod_rewrite

)

Hide server version

servertag = Such Headers Very try Now close telnet

serverdocument-root = varwwwwebmail

serverupload-dirs = ( varwwwwebmailuploads )

servererrorlog = varloglighttpderrorlog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

serverport = 80

accesslogformat = V h l u t r gts b Refereri

User-Agenti

accesslogfilename = varloglighttpdaccesslog

index-filenames = ( indexphp indexhtml

indexlighttpdhtml )

urlaccess-deny = ( ~ inc )

static-fileexclude-extensions = ( php pl fcgi )

compresscache-dir = varcachelighttpdcompress

compressfiletype = ( applicationjavascript textcss

texthtml textplain )

default listening port for IPv6 falls back to the IPv4 port

include_shell usrsharelighttpduse-ipv6pl + serverport

include_shell usrsharelighttpdcreate-mimeassignpl

include_shell usrsharelighttpdinclude-conf-enabledpl

SSL CONFIG

$SERVER[socket] == 5234485443

sslengine = enable

11

sslpemfile = etclighttpdsslintimailpwpem

sslca-file = etclighttpdsslintimailpwcrt

servername = intimailpw

votre configuration habituelle pour ce domaine

serverdocument-root = varwwwwebmail

servererrorlog = varloglighttpderror_ssllog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

Rewrite des URL pour masquer php

urlrewrite-once = ( ^()$ =gt $1 )

urlrewrite-if-not-file = ( ^([^])()$ =gt $1php$2 )

servernetwork-backend = writev

Deacutependances Slapd

Ldap-utils

Postfix

Postfix-ldap

Bind9

Lighttpd

12

Sources httpswikigandinetfrhostingusing-linuxtutorialsdebianmail-server-ldap

httpwwwpostfixorgpipe8html

httpwwwpostfixorgFILTER_READMEhtml

httpwwwpostfixorg

httpwwwpostfixorgtransport5html

Page 8: Système d'hébergement domestique...place sur les domaines .pw par Gandi.net, notre fournisseur. Nous n’avons donc pas pu l’implémenter. Nous avons configuré Postfix pour qu’il

Nous avons ici deacutetermineacute des champs agrave renseigner pour constituer un

utilisateur En particulier un utilisateur dispose des attributs suivants

Son identiteacute (nom preacutenom(s))

Son identifiant utilisateur (UID) sous la forme comme agrave Polytech

initiale+nom(+chiffre) Son adresse mail compegravete sous la forme UIDdomainetld

Le chemin de sa boicircte mail sur le systegraveme domaineUID

Son quota (en octets)

Son mot de passe encrypteacute en SSHA

Fig 3 Une personne dans lrsquoannuaire LDAP

Les utilisateurs sont enregistreacutes dans la branche ldquopeoplerdquo de notre annuaire

Nous avons de plus une seconde branche ldquogroupsrdquo Celle-ci contient les listes de

diffusion Elle contient aussi le groupe particulier admins utilisateurs qui ont droit agrave

des options drsquoadministration sur le webmail

Fig 4 Un groupe dans lrsquoannuaire LDAP

On peut remarquer que pour la gestion des listes de diffusion nous avons

choisi de relier une personne agrave un groupe par son UID Ainsi lrsquoappartenance drsquoun

utilisateur agrave un groupe se traduit par la preacutesence de son adressemail dans lrsquoattribut

maildrop du groupe

Cela nous permet de geacuterer de maniegravere pratique les groupes auquels

appartient un utilisateur et inversement de sortir la liste des utilisateurs drsquoun groupe

avec une simple commande de typeldapsearch sur le serveur LDAP Pour ajouter ou

supprimer un utilisateur agrave un groupe il suffira de modifier lrsquoattribut maildrop du

groupe

Serveurs SMTP et DNS

Pour cette partie nous avons utiliseacute lrsquoexcellent Postfix Crsquoest une solution de

messagerie eacutelectronique libre rapide leacutegegravere seacutecuriseacutee et facile agrave administrer Crsquoest

aussi le serveur mail par deacutefaut dans plusieurs systegravemes de type UNIX Il permet

notamment drsquoeacuteviter une bonne partie du spam avec une configuration simple et

accessible

Il est important aussi de respecter les speacutecifications de la RFC Nous avons eu

la surprise de voir qursquoil est ldquoimpeacuteratifrdquo drsquoavoir deux adresses particuliegraveres sur le

serveur postmaster et abuse Ce sont les premiegraveres victimes des attaques par force

brute

La configuration de Postfix se fait de maniegravere eacutetroite avec Bind le serveur de

nom de domaine que nous avons installeacute En effet pour que Postfix fonctionne il est

essentiel que lrsquoenregistrement MX du serveur DNS fonctionne Crsquoest un type

drsquoenregistrement particulier qui permet la mise en place drsquoun serveur mail

De plus il est neacutecessaire de faire un enregistrement PTR qui correspond agrave au

DNS inverse Il nrsquoest pas indispensable au fonctionnement du serveur mail en soit

mais la plupart des fournisseurs de ce type de service se servent de cet

enregistrement pour contrer une partie du spam Il est donc possible que les mails

drsquoun serveur soient bloqueacutes si lrsquoenregistrement PTR est mal configureacute

Parallegravelement nous avons aussi proceacutedeacute agrave lrsquoenregistrement A qui permet la

mise en place drsquoun serveurWeb neacutecessaire agrave notreWebmail Nous avons utiliseacute des

outils en ligne tel que DNSStuff pour tester notre configuration dont un exemple se

trouve en annexe Notons par contre que la technologie DNSSEC nrsquoest pas mise en

place sur les domaines pw par Gandinet notre fournisseur Nous nrsquoavons donc pas

pu lrsquoimpleacutementer

Nous avons configureacute Postfix pour qursquoil utilise notre annuaire LDAP Il est

possible agrave ce stade de tester la configuration avec telnet et drsquoenvoyer unmail Apregraves

cela nous avons testeacute le bon fonctionnement du serveur en envoyant avec succegraves

un mail vers une boicircte mail exteacuterieure de type gmail

Nous nous sommes alors heurteacutes aux protections du Service Informatique de

lrsquoUniversiteacute (CRI) qui bloque le port 25 en sortie et en entreacutee en dehors de lrsquouniversiteacute

Pour nous astreindre de ces restrictions nous avons migreacute notre serveur vers une

nouvelle connexion SDSL exteacuterieure au reacuteseau de Lille 1 Cela a eacuteteacute pour nous un

moyen de veacuterifier en partie la portabiliteacute de notre systegraveme puisque nous utilisons une

toute nouvelle connexion avec une nouvelle adresse IP Nous avons donc ducircmettre

agrave jour notre serveur de nom pour refleacuteter ces changements La migration srsquoest

passeacutee sans soucis avec un deacutelai de propagation des changements drsquoenviron 1

heure Le systegraveme est resteacute fonctionnel agrave 100 notamment parce que dans notre

code nous faisons appel au serveur par localhost ou une variable et jamais

directement lrsquoadresse IP ou le domaine Cependant nous nrsquoavons pas pu veacuterifier la

migration vers un domaine diffeacuterent bien que cela ne reste normalement qursquoune

variable dans les fichiers de configuration de lrsquointerface

Gestion du Spam

Comme preacutevu nous avons apporteacute une solution agrave la gestion du spam sur

notre serveur Postfix propose dans ses paramegravetres lrsquoutilisation de services de

DNSBL (DNS Black List) Cette technologie reprend le mecircme principe que les

serveurs de noms classiques Postfix soumet une requecircte de type DNS aux serveurs

de liste noire deacutefinis dans sa configuration et le serveur indique si ce nom de

domaine est preacutesent dans sa liste ou non On peut de cette maniegravere rejeter une

bonne partie du trafic mail correspondant au Spam et ce tregraves facilement

Malgreacute cela nous pensons qursquoune partie du Spam passera agrave travers les

mailles du filet Il aurait eacuteteacute inteacuteressant de traiter ceux-ci pour les classer comme

indeacutesirables et pouvoir ainsi les afficher dans lrsquointerface web

Serveur Web et Webmail

Un serveur web leacuteger

Initialement nous sommes partis sur une solution classique agrave base drsquoun

serveur web Apache qui nous a permis de deacutebuter le deacuteveloppement de lrsquointerface

Cependant comme nous cherchons agrave alleacuteger un maximum le systegraveme nous nous

sommes pencheacutes sur une autre solution Lighttpd Ce serveur web vise comme son

nom lrsquoindique la performance et la leacutegegravereteacute Sur le mecircme contenu avec une

connexion Tregraves Haut Deacutebit (100Mbps) nous chargeons deacutesormais la page de vue

geacuteneacuterale en 042s (Lighttpd) contre 170s avant (Apache 2) avec le navigateur

Chrome sans cache

Une architecture optimiseacutee

Lrsquoutiliteacute de reacutealiser notre propre webmail est dans un premier temps de

srsquoabstenir de lrsquoinstallation drsquoun serveur IMAPPOP puisque nous retrouvons

nous-mecircmes le contenu Dans un second temps il nous permet de ne garder que les

fonctionnaliteacutes neacutecessaires agrave notre webmail sans superflu

Fig 5 La vue geacuteneacuterale de notre webmail

Gracircce agrave PHP et agrave son module drsquointerface avec LDAP nous pouvons identifier

un utilisateur avec son nom drsquoutilisateur et son mot de passe sur le serveur local

LDAP et ainsi retrouver nombreuses informations utiles comme le quota actuel

autoriseacute son nom entier le chemin drsquoaccegraves agrave son reacutepertoire dans lesquels sont ses

mails sur le systegraveme de fichiershellip

Fig 6 Lrsquoarchitecture du dossier drsquoun utilisateur des dossier sent et inbox contenant les

mails bruts un dossier json dans lequel sont placeacutes les entecirctes des mails ainsi que le quota

Chaque en-tecircte de mail est eacutecrite dans un fichier json distinct par boicircte (un

fichier pour la boicircte de reacuteception un fichier pour les mails envoyeacuteshellip) ce qui nous

permet de montrer agrave lutilisateur la liste des mails dune boicircte sans traitement lourds

en arriegravere plan pour le serveur Ces fichiers sont renseigneacutes par un script lanceacute agrave la

reacuteception drsquoun mail par postfix du cocircteacute reacuteception et par lrsquointerface web elle mecircme

pour lrsquoeacutemission Lrsquoen-tecircte drsquoun mail est eacutecrite dans un conteneur JSONde lamaniegravere

suivante

Fig 7 Exemple drsquoentreacutee dans un fichier json

Gracircce tout cela nous pouvons afficher simplement le contenu des diffeacuterentes

boicirctes mail dans des tableaux sur lrsquointerface gracircce aux en-tecirctes et par la suite

retrouver et afficher le contenu drsquoun mail agrave partir de son fichier brut sur lequel

lrsquoutilisateur aura cliqueacute comme on le verra un peu plus loin

Toujours dans un souci drsquoameacutelioration des performances le strict neacutecessaire

est geacuteneacuteralement chargeacute sur les pages web par exemple en venant de la vue

geacuteneacuterale lorsqursquoon clique surInboxseule la partie inteacuterieure de la page est chargeacutee

on ne recharge pas le bandeau du haut de page ou lemenu de gauche agrave lamaniegravere

drsquoun MVC classique

Envoyer des courriels

Toute cette architecture ne doit pas nous faire oublier le but premier envoyer

et recevoir des mails Pour envoyer des mails crsquoest tregraves simple on peut soit cliquer

dans le bandeau du haut sur ldquoQuick Emailrdquo qui permet sur lamecircme page drsquoenvoyer

un email rapide et sans piegravece-jointe soit cliquer dans la barre de navigation sur le

cocircteacute sur ldquoWrite a new emailrdquo ce qui nous megravene vers une page deacutedieacutee permettant

drsquoeacutecrire un email incluant une piegravece jointe

Fig 8 Envoyer un mail crsquoest simple comme bonjour

On peut remarquer sur cette capture drsquoeacutecran que lrsquoon ne peut envoyer que

certains types de piegraveces jointes Nous supportons JPG PNG GIF PDF et ZIP Si la

piegravece jointe est drsquoun autre format elle est rejeteacutee La veacuterification du type srsquoeffectue

sur lrsquoextension du fichier et sur son type MIME ce qui eacutevite par exemple que

quelqursquoun modifie lrsquoextension drsquoun fichierexe en fichierjpg pour lrsquoenvoyer La piegravece

jointe doit de plus avoir une taille infeacuterieure agrave la taille maximale drsquoune piegravece jointe

parameacutetreacutee par lrsquoadministrateur comme nous le verrons dans lrsquointerface

drsquoadministration

Si tous ces critegraveres sont bons on eacutecrit lemail au format brut deacutecrit par la RFC

puis on lrsquoexpeacutedie agrave lrsquoaide de la fonction mail de PHP Si cette fonction nrsquoeacutechoue pas

crsquoest que le mail est expeacutedieacute avec succegraves on peut alors mettre agrave jour le quota

drsquoespace disque maximum autoriseacute agrave lrsquoutilisateur en increacutementant celui-ci avec la

taille du mail qui vient drsquoecirctre envoyeacute ainsi que creacuteer un fichiermail brut sur le disque

pour pouvoir afficher le mail dans la boicircte drsquoenvoi et en garder une trace

Notons que comme crsquoest lrsquoutilisateur web du systegraveme (www-data) qui exeacutecute

la fonction nous modifions les en-tecirctes du mail afin que le destinataire reccediloive un

mail de la part de ldquoPreacutenom Nomrdquo depuis lrsquoadresse ldquopnomdomainetldrdquo plutocirct que

ldquowww-datadomaintldrdquo par deacutefaut

La migration vers une IP externe agrave Lille 1 eacutetant reacuteussie nous pouvons bien

envoyer des mails depuis notre interface qui sont reccedilus agrave lrsquoexteacuterieur sans soucis

Mais aussi en recevoir

Recevoir des mails est tout aussi important Nous avons vu lrsquoarchitecture en

arriegravere-plan mais au final agrave quoi cela ressemble-t-il pour lrsquoutilisateur Il dispose en

fait en cliquant sur Inbox (ou Sent Spam ou Trash eacutegalement) drsquoun accegraves agrave sa boicircte

de reacuteception Drsquoun clic srsquoaffichent alors agrave lui tous les mails qursquoil a reccedilu

Fig 9 La boicircte de reacuteception

On remarque notamment les fonctions de recherche drsquoactualisation du

tableau de choix des colonnes agrave afficher on peut classiquement choisir combien de

lignes on affiche par page changer de pages etchellip

Lorsque lrsquoon clique sur un des lignes les donneacutees de lrsquoen-tecircte du mails sont

passeacutes en paramegravetres agrave une autre page qui drsquoapregraves ces informations retrouve le

fichier mail brut le traite et lrsquoaffiche

Fig 10 Un mail contenant 3 piegraveces jointes et un message

Comme on peut le voir nous pouvons recevoir desmails avec plusieurs piegraveces

jointes Nous avons ici preacutesenteacute la boicircte de reacuteception mais les autres boicirctes

fonctionnent de maniegravere similaire

Interface drsquoadministration

Le systegraveme de webmail possegravede plusieurs variables des listes de diffusion

des compteshellipMais on veut pouvoir donner les droits agrave un utilisateur demodifier tout

cela En effet si nous trouvons cela abordable drsquoajouter un utilisateur avec une

commande dans le shell il faut aussi penser agrave lrsquoutilisateur final qui preacutefegravere peut-ecirctre

le confort drsquoune interface deacutedieacutee pour geacuterer son serveur mail plutocirct que le terminal

De maniegravere tregraves simple un utilisateur appartenant au groupes drsquoutilisateurs

ldquoAdministrateursrdquo est reconnu en tant qursquoadministrateur par lrsquointerface et peut

cliquer sur un bouton ldquoManagerdquo dans le panneau lateacuteral qui nrsquoest visible qursquoaux

administrateurs De lagrave il arrive sur la page suivante

Fig 11 lrsquointerface drsquoadministration

Sur cette interface il peut choisir la taille maximale des piegraveces jointes

changer le nom de domaine sur lequel est installeacute lrsquointerface et dont deacutependent

toutes les adresses (domaine) Il est aussi possible de modifier directement ces

variables en modifiant le fichier includeconfigincphp Pratique notamment si lrsquoon

a renseigneacute un mauvais nom de domaine agrave la configuration et que lrsquoon arrive plus agrave

acceacuteder agrave lrsquointerface

Il peut aussi creacuteer un nouveau compte en renseignant les champs preacutenom

nom mot de passe et quota Lrsquoutilisateur peut ensuite une fois son compte creacutee

directement se connecter avec son identifiant (initiale preacutenom + nom) et mot de

passe Lors de la creacuteation du compte un mail de bienvenue est envoyeacute au nouvel

utilisateur ce qui permet en arriegravere-plan de creacuteer tous les dossiers utilisateurs et

fichiers en-tecirctes utiles agrave lrsquointerface une fois pour toutes

Lrsquoadministrateur peut aussi ajouter une liste de diffusion (assimileacutee agrave un

groupe) ou en supprimer une parmi les listes existantes

En outre lrsquoadministrateur peut aussi modifier les donneacutees drsquoun utilisateur

Pour cela sur la preacutesente page il peut seacutelectionner un utilisateur parmi la liste des

utilisateurs existants ce qui le redirige vers la page de gestion des comptes

Fig 12 La gestion drsquoun compte seacutelectionneacute ici celui de James Bond

A ce stade il peut changer lrsquoUID de lrsquoutilisateur (utile en cas de conflit) le nom

le mot de passe le quota de cet utilisateur et lrsquoajouter ou le retirer drsquoune liste de

diffusion Accessoirement il peut aussi supprimer le compte en cliquant sur lrsquoeacutenorme

bouton rouge qui lui demandera deux fois de suite de confirmer son action afin

drsquoeacuteviter les erreurs de clic Cette action entraicircne la suppression de lrsquoutilisateur de

toutes les listes de diffusion auxquelles il appartient la suppression de son compte

dans la branche people de lrsquoarbre LDAP et la suppression deacutefinitive de son dossier

utilisateur sur le disquesystegraveme de fichiers impliquant donc la perte de ses mails

Architecture du systegraveme de fichiers

Comme nous lrsquoavons dit plus haut lrsquoideacutee est de se passer des meacutecanismes

classiques avec les clients mails habituels Ces serveurs srsquoalourdissent

geacuteneacuteralement en utilisant des serveurs IMAPPOP3 et un meacutecanisme

drsquoauthentification SMTP

Pour adapter ces fonctionnaliteacutes agrave notre systegraveme nous avons donc constitueacute

une architecture pour organiser les fichiers qui transitent Vous pourrez voir un

scheacutema reacutecapitulatif en annexe 1

Dans la premiegravere moitieacute du projet les mails eacutetaient deacutelivreacutes par Postfix Nous

utilisions un script exeacutecuteacute lors de la reacuteception drsquounmail pour les traiter de lamaniegravere

que nous voulions Cette meacutethode avait les inconveacutenients drsquoecirctre lourde et pas

efficace agrave 100 En effet seuls les mails reccedilus depuis lrsquoexteacuterieur eacutetaient

correctement traiteacutes

Deacutesormais les mails sont traiteacutes totalement par notre script Cela nous

permet de geacuterer les mails dans des dossiers organiseacutes agrave notre maniegravere et de

recevoir les mails locaux crsquoest-agrave-dire entre utilisateurs du mecircme domaine Cette

nouvelle meacutethode regravegle aussi drsquoautres problegravemes notamment au niveau des

permissions sur les fichiers

Pour reacuteduire le nombre drsquoopeacuterations et pour profiter des fonctionnaliteacutes

offertes par le framework utiliseacute pour lrsquointerface web nous regroupons des

informations sur chacun des mails reccedilus sous la forme de fichiers JSON Pour ce

faire lrsquoideacutee est drsquoexeacutecuter un script lorsque leacutevegravenement ldquoreacuteception drsquoun mailrdquo

survient Postfix offre cette possibiliteacute dans sa configuration Or il se trouve qursquoil nrsquoest

pas si simple de reacutecupeacuterer le chemin du fichier contenant le mail car le nom du

fichier creacutee est sous la forme Timestamp UNIX10 Caractegraveres aleacuteatoires (ex

14562336185A8D43E97F)

La seconde probleacutematique est que le webmail doit avoir la possibiliteacute de

pouvoir lire les fichiers pour afficher les mails sur son interface Or il semble que

Postfix les eacutecrit en autorisant uniquement son utilisateur en lecture Il nous a fallu

trouver une solution pour remeacutedier agrave cela Nous avons choisi drsquoajouter www-data

(utilisateur du serveur web) au groupe vmail et de modifier les droits sur les fichiers

de sorte que les utilisateurs de ce groupe puissent lire les fichiers

Nous avons revu une partie de lrsquoorganisation des fichiers pour reacutecupeacuterer les

piegraveces jointes si elles sont preacutesentes Le script que nous avons eacutecrit reacutecupegravere le

fichier original du mail et le deacutecoupe en eacuteleacutements simples dans des fichier distincts

corps du mail et diffeacuterentes piegraveces jointes De cette maniegravere pour afficher un mail

nous nrsquoavons pas besoin de charger la totaliteacute du fichier Dans le cas ougrave il y a des

piegraveces jointes cela aurait ralenti lrsquoaffichage des informations

Nous avons eacutegalement impleacutementeacute la gestion des quotas Dans lrsquoeacutetat actuel

des choses srsquoil nrsquoy a plus de place disponible pour lrsquoutilisateur le mail nrsquoest tout

bonnement pas deacutelivreacute agrave ce destinataire Lrsquoideacuteal aurait eacuteteacute de notifier leacutemetteur avec

un mail ce qui nrsquoest pour lrsquoinstant pas le cas mais qui pourrait ecirctre reacutesolu en

renvoyant agrave postfix un code drsquoerreur deacutefini

Pour terminer nous avons revu la totaliteacute du code deacuteveloppeacute Nous sommes

passeacute du Bash au Perl Ce dernier est plus performant et plus simple agrave utiliser et agrave

lire

Firewall

Un autre gros morceau du projet mais qui nrsquoest pas speacutecifiquement lieacute agrave la

probleacutematique du mail crsquoest la seacutecurisation du serveur En effet apregraves avoir mis en

ligne notre serveur des pirates ont tregraves vite tenteacute de peacuteneacutetrer le systegraveme

Globalement les attaques eacutetaient de type force brute sur les services heacutebergeacutes sur

notre Raspberry neacutecessitant une identification tels que SSH SMTP hellip

On retrouve ici un petit point faible du protocole SMTP Eacutetant donneacute que

chaque serveur mail doit avoir une adresse postmaster et abuse lrsquoattaquant a agrave sa

disposition deux adresses agrave attaquer Ceci dit ce type drsquoattaque est simple agrave

contrecarrer car il suffit de limiter dans le temps le nombre de tentatives de

connexions

La contre-mesure que nous avons mis en place est simple une seacuterie de

regravegles Iptables En reacutesumeacute nous avons opteacute pour un systegraveme de liste blanche et

noire Les adresses IPs de la liste blanche sont autoriseacutees agrave utiliser la totaliteacute des

services (notamment SSH) tandis que celles de la liste noire sont totalement

ignoreacutees Les autres IPs nrsquoont accegraves qursquoau webmail

Eacutetant donneacute que le nombre drsquoIPs attaquant notre serveur nrsquoa cesseacute

drsquoaugmenter nous avons automatiseacute la mise agrave jour de la liste de noire en

deacuteveloppant un script pour Cron Ce script est exeacutecuteacute une fois par heure A ce jour

notre liste noire contient 47 adresses Bien sucircr ce systegraveme est susceptible drsquoecirctre

modifieacute agrave convenance pour passer sur une solution deacutedieacutee telle que Fail2ban qui fait

en fait ce qursquoon fait deacutejagrave (eacutetudier les logs et bannir des IP avec iptables) avec des

regravegles preacutedeacutefinies par la communauteacute et personnalisables En effet nous nous

attendons agrave voir la varieacuteteacute et le nombre drsquoattaques augmenter apregraves avoir migreacute sur

une IP non proteacutegeacutee par le firewall de lrsquoUniversiteacute puisque nous nrsquoavons plus la

premiegravere ligne de deacutefense du CRI en particulier pour le port 389 (LDAP) qui eacutetait

bloqueacute par lrsquouniversiteacute et srsquoest retrouveacute en premiegravere ligne apregraves la migration Nous

avons donc ajouteacute une regravegle bloquant tout le trafic entrant vers le port 389 hormis

localhost

Package drsquoinstallation

Nous avons creacutee un package deb contenant les sources du webmail ainsi

que des scripts utiles agrave lrsquoinstallation et au fonctionnement du serveur Nous avons

deacuteveloppeacute des scripts de configuration automatique pour LDAP et Postfix Comme

dpkg ne supporte pas directement lrsquoinstallation automatique des deacutependances

nous recommandons drsquoinstaller avant tout le paquet gdebi-core qui est en fait un

dpkg ameacutelioreacute Gracircce agrave la commande gdebi paquetdeb toutes les deacutependances

seront installeacutees en particulier postfix le serveur ldap le serveur web lighttpd entre

autres sans soucis Il est agrave noter que comme les scripts de configuration des

diffeacuterents services ne sont que partiellement impleacutementeacutes dans le paquet deb nous

fournissons en annexe un README complet et illustreacute qui explique pas agrave pas

comment faire fonctionner notre systegraveme sur nrsquoimporte quel Linux en particulier les

lignes de configuration des diffeacuterents services agrave changer et un exemplaire des

fichiers de configuration fonctionnels de ces services

Gestion de lrsquoeacutenergie

Une consideacuteration importante pour un systegraveme autonome Drsquoapregraves les fiches

techniques notre modegravele de Raspberry Pi (B 2) est officiellement eacutevalueacute avec un

fonctionnement agrave ~650mA pour 5V De nombreux proprieacutetaires de ce systegraveme

eacutequipeacutes se sont amuser agrave veacuterifier la consommation eacutelectrique reacuteelle de leur Pi 2 B

sous diffeacuterentes charges On pourra retenir cette eacutetude (lien en sitegraphie) qui

relegraveve la consommation en courant en fonction de lrsquoactiviteacute lanceacutee sur la Pi mais

aussi en charge sur 1 agrave 4 CPU

Ces chiffres sont releveacutes sur un systegraveme avec cameacutera connecteacutee HDMI connecteacute et

cacircble ethernet brancheacute et actif

On peut constater que globalement notre systegraveme Pi 2 B tournant sans

interface graphique sans composant suppleacutementaire sans sortie videacuteo ni cameacutera

avec plusieurs serveurs tournant tout en restant le plus leacuteger possible et demeurant

~99 idle la plupart du temps ne devrait pas deacutepasser une consommation de

300mA grand maximum

Fig 13 Un processeur tregraves tregraves peu chargeacute et une meacutemoire relativement libre

Nous avions lrsquoanneacutee derniegravere deacutejagrave reacutealiseacute un circuit permettant drsquoadapter un

panneau solaire sur une batterie USB classique de 9000mAh Nous avions alors pu

mesurer lrsquointensiteacute deacutelivreacutee par le panneau solaire En cas drsquoensoleillement moyen

habituel dans nos contreacutees le panneau solaire deacutebitait 400mA et pouvait atteindre

le double quand le soleil eacutetait directement preacutesent pour environ 800mA deacutebiteacute

Ce panneau solaire accompagneacute de son circuit drsquoadaptation devrait donc

suffire pour alimenter notre systegraveme la journeacutee le brancher ensuite sur une batterie

portable permet de stocker le surplus pour la nuit

Fig 14 le circuit drsquoadaptation

Fig 15 et son PCB

Eacutevolutions possibles

Webmail

Concernant les eacutevolutions possibles que nous aurions aimeacute apporter agrave notre

projet avec plus de temps commenccedilons par le web Nous aurions souhaiteacute apporter

la gestion de lrsquoenvoi de plusieurs piegraveces jointes comme nous lrsquoavons fait pour la

reacuteception

De plus nous aurions voulu inteacutegrer une corbeille ougrave lesmessages pourraient

aller avant drsquoecirctre deacutefinitivement supprimeacutes du systegraveme drsquoautant que nous avons

deacutejagrave eacutecrites les fonctions PHP permettant de retirer une en-tecircte drsquoun fichier JSON et

le fichier mail associeacute

Enfin nous aurions aimeacute en plus du blocage deacutejagrave preacutesent impleacutementer une

gestion plus profonde des piegravece jointes permettant notamment le remplissage de la

boicircte de spams

Systegraveme

Il aurait eacuteteacute inteacuteressant de notifier lrsquoexpeacutediteur lorsque le mail nrsquoa pas pu ecirctre

deacutelivreacute agrave un utilisateur lorsque son quota est plein En toute logique cela devrait ecirctre

fait simplement avec la commande Sendmail

Une meilleur gestion du trafic mail indeacutesirable aurait eacuteteacute la bienvenue En

effet malgreacute la limitation du spam il restera toujours une partie du volume de mail

qui sera indeacutesirable (pub pishing scam hellip)

Eacutetant donneacute la taille du systegraveme nous avions penseacute agrave une approche

ldquomachine learningrdquo Lrsquoutilisateur indiquerait pourquoi il considegravere le mail comme

indeacutesirable constituant des regravegles refusant certains mails Les mails provenant de

cet expeacutediteur pourraient ecirctre deacutetecteacute par le script agrave la reacuteception et

automatiquement envoyeacutes dans la boicircte de spams

Partie eacutenergeacutetique

Mecircme si la solution au panneau solaire ne pose aucun problegraveme en theacuteorie

nous aurions deacutejagrave dans un premier temps aimeacute lrsquoimpleacutementer en pratique Nous

nrsquoavons finalement pas reacutealiseacute notre objectif de deacutetecter deux cas drsquoalimentation

diffeacuterents soit lrsquoalimentation via panneau solaire est suffisante dans ce cas il

alimente la batterie et donc la Raspberry soit quand ce courant nrsquoest pas suffisant

on alimente la batterie par le secteur

Conclusion

En conclusion nous pensons avoir reacutepondu au cahier des charges initial dans

sa majeure partie Nous sommes aujourdrsquohui en mesure de proposer une solution

mail domestique priveacutee et personnalisable par un particulier

Notre installation de Debian a eacuteteacute au maximum alleacutegeacutee pour notre utilisation

sans interface graphique et nous avons mis en place une reacuteponse aux diverses

attaques que nous avons pu subir lors de lamise en place de notre solution logicielle

En outre le pare-feu avec notre systegraveme de liste noire bloque une partie des

attaques qui peuvent nous parvenir

Nos diffeacuterents scripts de pare-feu de gestion drsquoun mail entrant associeacute au

webmail permettent agrave un utilisateur drsquoacceacuteder aux fonctions usuelles associeacutees agrave

lrsquoenvoi et la reacuteception de mails

Gracircce agrave sa configuration personnalisable notre projet devrait pouvoir ecirctre

porteacute sur un domaine et une adresse IP diffeacuterente sans soucis et ecirctre deacuteployeacute

partout ougrave des gens souhaitent conserver leur vie priveacutee

Nous regretterons cependant de ne pas avoir exploiteacute la partie eacutenergeacutetique

de ce projet qui portait une probleacutematique inteacuteressante et qui nous parait importante

dans le monde actuel

Ce projet nous aura occupeacute pendant tregraves longtemps et nous sommes fiers du

travail que nous avons accompli Il est agrave nos yeux la preuve de ce que nous savons et

pouvons faire et nous donnera confiance pour notre deacutebut de carriegravere drsquoingeacutenieur

Sources

httpwwwradicaticomwpwp-contentuploads201401Email-Statistics-R

eport-2014-2018-Executive-Summarypdf

httpwwwcommentcamarchenetcontents525-le-protocole-ldap

httpsfrwikipediaorgwikiSimple_Mail_Transfer_Protocol

httpwwwcommentcamarchenetcontents536-pop3-smtp-imap-protocol

es-de-messagerie

httpstoolsietforghtmlrfc2821

httpsfrwikipediaorgwikiInternet_Message_Access_Protocol

httpstoolsietforghtmlrfc3501

httparstechnicacominformation-technology201402how-to-run-your-ow

n-e-mail-server-with-your-own-domain-part-1

httpswwwraspberrypiorgforumsviewtopicphpp=136912

httpstackoverflowcomquestions17394356how-can-i-make-a-bash-com

mand-run-periodically

httpuntroubledorgnullmailer

httpelinuxorgRPi_Hardware

httpraspitv2015raspberry-pi2-power-and-performance-measurement

Annexe 1 Architecture du systegraveme de fichiers

Annexe 2 Scan DNSSTUFF

Depuis httpwwwdnsstuffcomtoolsdnsReport|type=domainampampvalue=intimailpw

Annexe 3 Vue geacuteneacuterale httpswwwintimailpw

Annexe 4 Envoyer un mail

Annexe 5 Boite de reacuteception

Annexe 6 Interface drsquoadministration

Annexe 7 Gestion drsquoun utilisateur

Tutorial installation intimailtrade

Table des matiegraveres Apregraves une nouvelle installation de lrsquoOS 2

Seacutecurisation du serveur 2

Changement de lrsquoutilisateur par deacutefaut 2

Changement du port SSH 2

Interdire lrsquoauthentification SSH pour root 2

Installation de LDAP 3

Configuration de base 3

Configuration des Scheacutemas 4

Constitution de la base de donneacutees LDAP 5

Installation de Postfix 7

Installation de Bind9 8

Installation du paquet Debian et configuration de lighttpd 9

Deacutependances 11

Sources 12

2

Apregraves une nouvelle installation de lrsquoOS Exeacutecutez ces commandes pour mettre agrave jour agrave la derniegravere version Ces opeacuterations peuvent prendre un certain

temps Nous avons utiliseacute pour cet exemple Raspbian Jessie Lite sur une Raspberry Pi 2

apt-get update

apt-get upgrade ampamp apt-get dist-upgrade

apt-get install linux-headers-$(uname -r)

reboot

Puis lancer

raspi-config

Etendre au maximum lrsquoespace de stockage en navigant dans les menus

Expand Filesystem

Reacutegler une ip statique avec la box fichier etcnetworkinterfaces

iface eth0 inet static

address 192168131

netmask 2552552550

gateway 19216811

Nous avons aussi supprimeacute wpasupplicant

Seacutecurisation du serveur

Changement de lrsquoutilisateur par deacutefaut Changez le nom drsquoutilisateur par deacutefaut ainsi que son mot de passe

sudo passwd root

Sortie et login en tant que root puis

usermod -l myuname pi

usermod -m -d homemyuname myuname

groupmod ndashn myuname pi

passwd myuname

Voir cette adresse pour lrsquoutilisation de cleacutes priveacuteespubliques

Changement du port SSH sed ndashi sPort 22Port 2222g etcsshsshd_config

Interdire lrsquoauthentification SSH pour root sed -i sPermitRootLogin yesPermitRootLogin nog etcsshsshd_config

3

Installation de LDAP

Configuration de base Installation du package

apt-get install slapd

Choisir un mot de passe administrateur puis lancer la commande

dpkg-reconfigure slapd

Reacutepondre non agrave la question 1

Entrez le nom de domaine utiliseacute agrave la question 2 sous la forme domainetld

Entrez ce que vous voulez au 3egraveme eacutecran le nom de lrsquoorganisation ne sera pas utiliseacute

Entrez un mot de passe

Choisissez HDB

Choisissez si la base de donneacutees est supprimeacutee agrave la deacutesinstallation de slapd

Deacuteplacez lrsquoancienne base de donneacutees

Nrsquoutilisez pas LDAPv2

Installer les outils de conversion pour ldap (slaptest ldapmodify notamment)

apt-get install ldap-utils

On peut maintenant veacuterifier que la configuration est valable

ldapsearch -x -h localhost -b dc=domainedc=tld -LLL dc=domaine dn

Cette commande doit retourner quelque chose comme

dn dc=domainedc=tld

Il faut maintenant seacutecuriser le serveur LDAP en effet on peut y acceacuteder en anonyme avec la commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=config

(amp(objectClass=olcDatabaseConfig)(olcSuffix=dc=domainedc=tld))

Cette commande retourne un certain nombre drsquoinformations notamment agrave propos des champs suivants

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by none

olcAccess 1to dnbase= by read

olcAccess 2to by read

On va modifier ces champs avec la commande ldapmodify Pour cela on va creacuteer un fichier ldif

cat gt changeAccessldif ltlt EOF

dn olcDatabase=1hdbcn=config

changetype modify

delete olcAccess

-

add olcAccess

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by dn=cn=admindc=domainedc=tld write by none

-

add olcAccess

olcAccess 1to dnbase= by read

-

4

add olcAccess

olcAccess 2to by self write by dn=cn=admindc=domainedc=tld write by

none

-

EOF

On peut maintenant appliquer les changements avec ldapmodify

ldapmodify ndashc ndashY EXTERNAL ndashH ldapi -f changeAccessldif

La commande devrait vous confirmer que la modification srsquoest bien effectueacutee

SASLEXTERNAL authentication started

SASL username gidNumber=0+uidNumber=0cn=peercredcn=externalcn=auth

SASL SSF 0

modifying entry olcDatabase=1hdbcn=config

On peut veacuterifier qursquoon ne peut plus acceacuteder aux informations avec la commande

ldapsearch -x -c -h localhost -b dc=domainedc=tld

On peut veacuterifier la configuration en se connectant en tant qursquoadministrateur

ldapsearch -c -h localhost -b dc=domainedc=tld -D

cn=admindc=domainedc=tld ndashW

Configuration des Scheacutemas Nous allons utiliser les scheacutemas de courier-ldap Pour eacuteviter une manipulation compliqueacutee vous trouverez

directement le scheacutema avec le fichier authldapschema On place ce fichier dans le dossier

mv authldapschema etcldapschema

Nous creacuteons un fichier qui incluera tous les scheacutemas de base en plus du nouveau On peut les afficher avec la

commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

Creacuteation du fichier de configuration pour notre exemple cela donne

mkdir tmpldapconf

cat gt tmpldapconfldapconf ltlt EOF

include etcldapschemacoreschema

include etcldapschemacosineschema

include etcldapschemanisschema

include etcldapschemainetorgpersonschema

include etcldapschemaauthldapschema

EOF

On lance ensuite la commande

slaptest -f tmpldapconfldapconf -F tmpldapconf

Elle revoie un message de succegraves Cette commande a creacuteeacute dans le reacutepertoire tmpldapconf une arborescence

correspondant agrave la configuration de notre LDAP

On modifie le chemin de configuration

5

sed ndashi 0dnauthldap sauthldapauthldapcn=schemacn=config

cn=authldapldif

On supprime ensuite les 7 derniegraveres lignes du fichier

head -n -7 cn=authldapldif gt tmpldif

mv tmpldif cn=authldapldif

On peut maintenant importer notre fichier de configuration Pour ce faire

ldapadd -Y EXTERNAL -H ldapi -f

tmpldapconfcn=configcn=schemacn=authldapldif

Si tout va bien lrsquoentreacutee devrait avoir eacuteteacute ajouteacutee On peut veacuterifier avec la commande vue tout agrave lrsquoheure

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

On devrait voir en plus le nouveau scheacutema authldap

Constitution de la base de donneacutees LDAP Le remplissage de la base se fait agrave lrsquoaide de fichiers ldif Nous donnons ici un exemple de structure

Fichier pour la structure de base

dn dc=maildc=domainedc=tld

o intimailpw

description Global mail tree

dc mail

objectClass top

objectClass dcObject

objectClass organization

dn dc=peopledc=maildc=domainedc=tld

description Informations of all users

o people

dc people

objectClass top

objectClass dcObject

objectClass organization

dn dc=groupsdc=maildc=domainedc=tld

description All groups of users

o groups

dc groups

objectClass top

objectClass dcObject

objectClass organization

6

Fichier pour ajouter un utilisateur

dn cn=jbonddc=peopledc=maildc=domainedc=tld

uid jbond

mail jbonddomainetld

sn Moulin

givenName James

displayName James Bond

mailbox domainetldjbond

quota 50M

homeDirectory homevmail

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAccount

userPassword SSHA367PSXiUAegy8dpJbPU8OepEf8L5ye

Pour obtenir un hash du mot de passe

slappasswd -s password -h SSHA

On peut par la suite ajouter la configuration agrave la base de donneacutees avec la commande

ldapadd -D cn=admindc=domainedc=tld -W -h localhost -f pathtofile

Si les champs proposeacutes ne sont pas suffisants il faudra alors effectuer les modifications dans le fichier autldapschema

proposeacute plus haut et refaire la manipulation de configuration

De plus les standards du Mail deacutecrit par lrsquoIETF (RFC822 63 RFC1123 527 and RFC2821 451) impliquent drsquoavoir une

adresse Postmaster et une Abuse Pour cela nous pourrions creacuteer ces adresses avec la meacutethode vue au-dessus mais

ce nrsquoest pas la meilleure Il est preacutefeacuterable drsquoutiliser un alias comme nous le ferons avec les listes de diffusion Ici nous

proposons de rediriger ces deux adresses vers une adresse administrateur Pour cela la meacutethode est la mecircme sauf

que le fichier ldif nrsquoest pas tout agrave fait identique En voici un exemple

dn cn=postmasterdc=groupsdc=maildc=domainedc=tld

uid postmaster

mail postmasterdomainetld

sn Postmaster

displayName Postmaster

maildrop admindomainetld

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAlias

Pour faire une liste de diffusion la meacutethode est la mecircme Il suffit drsquoajouter toutes les adresses destinataires dans le

champ maildrop seacutepareacutees par des virgules ()

7

Installation de Postfix Installation des packages

apt-get install postfix postfix-ldap

Lors de lrsquoinstallation deux eacutecrans deacutefilent

- Configuration Internet Site

- Valeur par deacutefaut pour le mail name

On creacutee lrsquoutilisateur qui servira agrave exeacutecuter Postfix

groupadd vmail

useradd -g vmail -d homevmail -s binfalse -m vmail

Nous aurons besoin dans la suite des GID et UID creacuteeacutes agrave cet instant Ils peuvent ecirctre afficheacutes avec les commandes

cat etcgroup | grep vmail | cut -d -f3

cat etcpasswd | grep vmail | cut -d -f3

On ajoute les paramegravetres au fichier etcpostfixmaincf (remplacer les valeurs de GID et drsquoUID avec vos valeurs)

smtpd_banner = maildomainetld

virtual_mailbox_base = homevmail

virtual_mailbox_domains = dmainetld

virtual_mailbox_maps = ldapetcpostfixldap_accountscf

virtual_alias_maps = ldapetcpostfixldap_aliasescf

virtual_minimum_uid = 100

virtual_gid_maps = static1001 Remplacez ici par votre valeur de GID

virtual_uid_maps = static1001 Remplacez ici par votre valeur drsquoUID

Il nous faut maintenant constituer nos fichiers de configuration ldap_accountscf

cat gt etcpostfixldap_accountscf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=peopledc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAccount)(mail=s))

result_attribute = mailbox

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

Et pour ldap_aliasescf

cat gt ldap_aliasescf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=groupsdc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAlias)(mail=s))

result_attribute = maildrop

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

8

On peut maintenant veacuterifier la configuration de Postfix avec (cette commande ne doit rien retourner si crsquoest bon)

postfix check

Si crsquoest bon alors on recharge le serveur

postfix reload

On peut alors faire un envoi de mail test via telnet

telnet localhost 25

Si vous souhaitez deacutelivrer les mails agrave votre maniegravere il faut dans le fichier etcpostfixmaincf la ligne

virtual_transport = nomdevotreregle

Et de mecircme dans le fichier etcpostfixmastercf

nomdevotreregle unix - n n - 5 pipe

flags=Rq user=vmail null_sender=

argv=chemindevotreprogramme

Il nous reste maintenant agrave configurer les diffeacuterents enregistrements DNS neacutecessaire au fonctionnement drsquoun serveur

mail Vous pouvez utiliser la solution de votre choix Dans la suite vous trouverez une meacutethode utilisant Bind9

Installation de Bind9 Dans toute cette partie on se situera dans le dossier etcbind Dans la suite notre IP sera abcd

Dans le fichier namedconfoptions on ajoutera dans le champ options

version Not supported

Dans un dossier zones on eacutecrit le fichier dbdomainetld

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122111 Serial

43200 Refresh

3600 Retry

2419200 Expire

86400 ) Negative Cache TTL

IN NS nsdomainetld

IN NS ns11ovhnet

ns IN A abcd

www IN A abcd

IN A abcd

IN MX 10 maildomainetld

mail IN A abcd

Dans le mecircme dossier zones on a cbain-addrarpa

9

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122101 serial

14400 refresh

3600 retry

604800 expire

10800 minimum

)

cbain-addrarpa IN NS nsdomainetld

cbain-addrarpa IN NS ns11ovhnet

d IN PTR maildomainetld

Il faut faire attention agrave bien increacutementer le serial pour chaque modification des fichiers

Dans le fichier namedconflocal

zone domainetld

type master

file etcbindzonesdbdomainetld

allow-transfer 213251128130

notify yes

zone cbain-addrarpa IN

type master

file etcbindzonescbain-addrarpa

allow-transfer 213251128130

Ici 213251128130 est lrsquoadresse IP du serveur ns11ovhnet

Il faut bien sucircr configurer le DNS avec votre fournisseur (Gandi OVH hellip) Pour ccedila amusez-vous bien Vous pouvez

aussi tester votre configuration avec des outils en ligne tels que DNSstuff

En test final si votre configuration est bonne vous devriez pouvoir envoyer un mail depuis un service neutre (Gmail

yahoo hellip) et le voir dans votre arborescence (ici homevmaildomainetld)

Installation du paquet Debian et configuration de lighttpd

Commencez par reacutecupeacuterer le paquet deb agrave lrsquoadresse suivante httpswwwintimailpwintimaildeb

Installez ensuite GDebi Il srsquoagit drsquoun dpkg ameacutelioreacute pour teacuteleacutecharger les deacutependances automatiquement ce que

dpkg ne gegravere pas

apt-get update

apt-get install gdebi-core

10

Vous pouvez alors installer le paquet

gdebi intimaildeb

Vous aurez alors le site web drsquointiMail deacuteployeacute au chemin varwwwwebmail

Il ne vous reste plus qursquoagrave changer la configuration de lighttpd votre serveur web pour mettre en ligne le site

Vous pouvez pour cela copier-coller la configuration suivante mais veillez agrave bien changer lrsquoadresse IP preacutesente au

deacutebut de la partie SSL CONFIG avec votre adresse IP

serv ermodules = ( mod_access

mod_accesslog

mod_alias

mod_compress

mod_redirect

mod_rewrite

)

Hide server version

servertag = Such Headers Very try Now close telnet

serverdocument-root = varwwwwebmail

serverupload-dirs = ( varwwwwebmailuploads )

servererrorlog = varloglighttpderrorlog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

serverport = 80

accesslogformat = V h l u t r gts b Refereri

User-Agenti

accesslogfilename = varloglighttpdaccesslog

index-filenames = ( indexphp indexhtml

indexlighttpdhtml )

urlaccess-deny = ( ~ inc )

static-fileexclude-extensions = ( php pl fcgi )

compresscache-dir = varcachelighttpdcompress

compressfiletype = ( applicationjavascript textcss

texthtml textplain )

default listening port for IPv6 falls back to the IPv4 port

include_shell usrsharelighttpduse-ipv6pl + serverport

include_shell usrsharelighttpdcreate-mimeassignpl

include_shell usrsharelighttpdinclude-conf-enabledpl

SSL CONFIG

$SERVER[socket] == 5234485443

sslengine = enable

11

sslpemfile = etclighttpdsslintimailpwpem

sslca-file = etclighttpdsslintimailpwcrt

servername = intimailpw

votre configuration habituelle pour ce domaine

serverdocument-root = varwwwwebmail

servererrorlog = varloglighttpderror_ssllog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

Rewrite des URL pour masquer php

urlrewrite-once = ( ^()$ =gt $1 )

urlrewrite-if-not-file = ( ^([^])()$ =gt $1php$2 )

servernetwork-backend = writev

Deacutependances Slapd

Ldap-utils

Postfix

Postfix-ldap

Bind9

Lighttpd

12

Sources httpswikigandinetfrhostingusing-linuxtutorialsdebianmail-server-ldap

httpwwwpostfixorgpipe8html

httpwwwpostfixorgFILTER_READMEhtml

httpwwwpostfixorg

httpwwwpostfixorgtransport5html

Page 9: Système d'hébergement domestique...place sur les domaines .pw par Gandi.net, notre fournisseur. Nous n’avons donc pas pu l’implémenter. Nous avons configuré Postfix pour qu’il

Cela nous permet de geacuterer de maniegravere pratique les groupes auquels

appartient un utilisateur et inversement de sortir la liste des utilisateurs drsquoun groupe

avec une simple commande de typeldapsearch sur le serveur LDAP Pour ajouter ou

supprimer un utilisateur agrave un groupe il suffira de modifier lrsquoattribut maildrop du

groupe

Serveurs SMTP et DNS

Pour cette partie nous avons utiliseacute lrsquoexcellent Postfix Crsquoest une solution de

messagerie eacutelectronique libre rapide leacutegegravere seacutecuriseacutee et facile agrave administrer Crsquoest

aussi le serveur mail par deacutefaut dans plusieurs systegravemes de type UNIX Il permet

notamment drsquoeacuteviter une bonne partie du spam avec une configuration simple et

accessible

Il est important aussi de respecter les speacutecifications de la RFC Nous avons eu

la surprise de voir qursquoil est ldquoimpeacuteratifrdquo drsquoavoir deux adresses particuliegraveres sur le

serveur postmaster et abuse Ce sont les premiegraveres victimes des attaques par force

brute

La configuration de Postfix se fait de maniegravere eacutetroite avec Bind le serveur de

nom de domaine que nous avons installeacute En effet pour que Postfix fonctionne il est

essentiel que lrsquoenregistrement MX du serveur DNS fonctionne Crsquoest un type

drsquoenregistrement particulier qui permet la mise en place drsquoun serveur mail

De plus il est neacutecessaire de faire un enregistrement PTR qui correspond agrave au

DNS inverse Il nrsquoest pas indispensable au fonctionnement du serveur mail en soit

mais la plupart des fournisseurs de ce type de service se servent de cet

enregistrement pour contrer une partie du spam Il est donc possible que les mails

drsquoun serveur soient bloqueacutes si lrsquoenregistrement PTR est mal configureacute

Parallegravelement nous avons aussi proceacutedeacute agrave lrsquoenregistrement A qui permet la

mise en place drsquoun serveurWeb neacutecessaire agrave notreWebmail Nous avons utiliseacute des

outils en ligne tel que DNSStuff pour tester notre configuration dont un exemple se

trouve en annexe Notons par contre que la technologie DNSSEC nrsquoest pas mise en

place sur les domaines pw par Gandinet notre fournisseur Nous nrsquoavons donc pas

pu lrsquoimpleacutementer

Nous avons configureacute Postfix pour qursquoil utilise notre annuaire LDAP Il est

possible agrave ce stade de tester la configuration avec telnet et drsquoenvoyer unmail Apregraves

cela nous avons testeacute le bon fonctionnement du serveur en envoyant avec succegraves

un mail vers une boicircte mail exteacuterieure de type gmail

Nous nous sommes alors heurteacutes aux protections du Service Informatique de

lrsquoUniversiteacute (CRI) qui bloque le port 25 en sortie et en entreacutee en dehors de lrsquouniversiteacute

Pour nous astreindre de ces restrictions nous avons migreacute notre serveur vers une

nouvelle connexion SDSL exteacuterieure au reacuteseau de Lille 1 Cela a eacuteteacute pour nous un

moyen de veacuterifier en partie la portabiliteacute de notre systegraveme puisque nous utilisons une

toute nouvelle connexion avec une nouvelle adresse IP Nous avons donc ducircmettre

agrave jour notre serveur de nom pour refleacuteter ces changements La migration srsquoest

passeacutee sans soucis avec un deacutelai de propagation des changements drsquoenviron 1

heure Le systegraveme est resteacute fonctionnel agrave 100 notamment parce que dans notre

code nous faisons appel au serveur par localhost ou une variable et jamais

directement lrsquoadresse IP ou le domaine Cependant nous nrsquoavons pas pu veacuterifier la

migration vers un domaine diffeacuterent bien que cela ne reste normalement qursquoune

variable dans les fichiers de configuration de lrsquointerface

Gestion du Spam

Comme preacutevu nous avons apporteacute une solution agrave la gestion du spam sur

notre serveur Postfix propose dans ses paramegravetres lrsquoutilisation de services de

DNSBL (DNS Black List) Cette technologie reprend le mecircme principe que les

serveurs de noms classiques Postfix soumet une requecircte de type DNS aux serveurs

de liste noire deacutefinis dans sa configuration et le serveur indique si ce nom de

domaine est preacutesent dans sa liste ou non On peut de cette maniegravere rejeter une

bonne partie du trafic mail correspondant au Spam et ce tregraves facilement

Malgreacute cela nous pensons qursquoune partie du Spam passera agrave travers les

mailles du filet Il aurait eacuteteacute inteacuteressant de traiter ceux-ci pour les classer comme

indeacutesirables et pouvoir ainsi les afficher dans lrsquointerface web

Serveur Web et Webmail

Un serveur web leacuteger

Initialement nous sommes partis sur une solution classique agrave base drsquoun

serveur web Apache qui nous a permis de deacutebuter le deacuteveloppement de lrsquointerface

Cependant comme nous cherchons agrave alleacuteger un maximum le systegraveme nous nous

sommes pencheacutes sur une autre solution Lighttpd Ce serveur web vise comme son

nom lrsquoindique la performance et la leacutegegravereteacute Sur le mecircme contenu avec une

connexion Tregraves Haut Deacutebit (100Mbps) nous chargeons deacutesormais la page de vue

geacuteneacuterale en 042s (Lighttpd) contre 170s avant (Apache 2) avec le navigateur

Chrome sans cache

Une architecture optimiseacutee

Lrsquoutiliteacute de reacutealiser notre propre webmail est dans un premier temps de

srsquoabstenir de lrsquoinstallation drsquoun serveur IMAPPOP puisque nous retrouvons

nous-mecircmes le contenu Dans un second temps il nous permet de ne garder que les

fonctionnaliteacutes neacutecessaires agrave notre webmail sans superflu

Fig 5 La vue geacuteneacuterale de notre webmail

Gracircce agrave PHP et agrave son module drsquointerface avec LDAP nous pouvons identifier

un utilisateur avec son nom drsquoutilisateur et son mot de passe sur le serveur local

LDAP et ainsi retrouver nombreuses informations utiles comme le quota actuel

autoriseacute son nom entier le chemin drsquoaccegraves agrave son reacutepertoire dans lesquels sont ses

mails sur le systegraveme de fichiershellip

Fig 6 Lrsquoarchitecture du dossier drsquoun utilisateur des dossier sent et inbox contenant les

mails bruts un dossier json dans lequel sont placeacutes les entecirctes des mails ainsi que le quota

Chaque en-tecircte de mail est eacutecrite dans un fichier json distinct par boicircte (un

fichier pour la boicircte de reacuteception un fichier pour les mails envoyeacuteshellip) ce qui nous

permet de montrer agrave lutilisateur la liste des mails dune boicircte sans traitement lourds

en arriegravere plan pour le serveur Ces fichiers sont renseigneacutes par un script lanceacute agrave la

reacuteception drsquoun mail par postfix du cocircteacute reacuteception et par lrsquointerface web elle mecircme

pour lrsquoeacutemission Lrsquoen-tecircte drsquoun mail est eacutecrite dans un conteneur JSONde lamaniegravere

suivante

Fig 7 Exemple drsquoentreacutee dans un fichier json

Gracircce tout cela nous pouvons afficher simplement le contenu des diffeacuterentes

boicirctes mail dans des tableaux sur lrsquointerface gracircce aux en-tecirctes et par la suite

retrouver et afficher le contenu drsquoun mail agrave partir de son fichier brut sur lequel

lrsquoutilisateur aura cliqueacute comme on le verra un peu plus loin

Toujours dans un souci drsquoameacutelioration des performances le strict neacutecessaire

est geacuteneacuteralement chargeacute sur les pages web par exemple en venant de la vue

geacuteneacuterale lorsqursquoon clique surInboxseule la partie inteacuterieure de la page est chargeacutee

on ne recharge pas le bandeau du haut de page ou lemenu de gauche agrave lamaniegravere

drsquoun MVC classique

Envoyer des courriels

Toute cette architecture ne doit pas nous faire oublier le but premier envoyer

et recevoir des mails Pour envoyer des mails crsquoest tregraves simple on peut soit cliquer

dans le bandeau du haut sur ldquoQuick Emailrdquo qui permet sur lamecircme page drsquoenvoyer

un email rapide et sans piegravece-jointe soit cliquer dans la barre de navigation sur le

cocircteacute sur ldquoWrite a new emailrdquo ce qui nous megravene vers une page deacutedieacutee permettant

drsquoeacutecrire un email incluant une piegravece jointe

Fig 8 Envoyer un mail crsquoest simple comme bonjour

On peut remarquer sur cette capture drsquoeacutecran que lrsquoon ne peut envoyer que

certains types de piegraveces jointes Nous supportons JPG PNG GIF PDF et ZIP Si la

piegravece jointe est drsquoun autre format elle est rejeteacutee La veacuterification du type srsquoeffectue

sur lrsquoextension du fichier et sur son type MIME ce qui eacutevite par exemple que

quelqursquoun modifie lrsquoextension drsquoun fichierexe en fichierjpg pour lrsquoenvoyer La piegravece

jointe doit de plus avoir une taille infeacuterieure agrave la taille maximale drsquoune piegravece jointe

parameacutetreacutee par lrsquoadministrateur comme nous le verrons dans lrsquointerface

drsquoadministration

Si tous ces critegraveres sont bons on eacutecrit lemail au format brut deacutecrit par la RFC

puis on lrsquoexpeacutedie agrave lrsquoaide de la fonction mail de PHP Si cette fonction nrsquoeacutechoue pas

crsquoest que le mail est expeacutedieacute avec succegraves on peut alors mettre agrave jour le quota

drsquoespace disque maximum autoriseacute agrave lrsquoutilisateur en increacutementant celui-ci avec la

taille du mail qui vient drsquoecirctre envoyeacute ainsi que creacuteer un fichiermail brut sur le disque

pour pouvoir afficher le mail dans la boicircte drsquoenvoi et en garder une trace

Notons que comme crsquoest lrsquoutilisateur web du systegraveme (www-data) qui exeacutecute

la fonction nous modifions les en-tecirctes du mail afin que le destinataire reccediloive un

mail de la part de ldquoPreacutenom Nomrdquo depuis lrsquoadresse ldquopnomdomainetldrdquo plutocirct que

ldquowww-datadomaintldrdquo par deacutefaut

La migration vers une IP externe agrave Lille 1 eacutetant reacuteussie nous pouvons bien

envoyer des mails depuis notre interface qui sont reccedilus agrave lrsquoexteacuterieur sans soucis

Mais aussi en recevoir

Recevoir des mails est tout aussi important Nous avons vu lrsquoarchitecture en

arriegravere-plan mais au final agrave quoi cela ressemble-t-il pour lrsquoutilisateur Il dispose en

fait en cliquant sur Inbox (ou Sent Spam ou Trash eacutegalement) drsquoun accegraves agrave sa boicircte

de reacuteception Drsquoun clic srsquoaffichent alors agrave lui tous les mails qursquoil a reccedilu

Fig 9 La boicircte de reacuteception

On remarque notamment les fonctions de recherche drsquoactualisation du

tableau de choix des colonnes agrave afficher on peut classiquement choisir combien de

lignes on affiche par page changer de pages etchellip

Lorsque lrsquoon clique sur un des lignes les donneacutees de lrsquoen-tecircte du mails sont

passeacutes en paramegravetres agrave une autre page qui drsquoapregraves ces informations retrouve le

fichier mail brut le traite et lrsquoaffiche

Fig 10 Un mail contenant 3 piegraveces jointes et un message

Comme on peut le voir nous pouvons recevoir desmails avec plusieurs piegraveces

jointes Nous avons ici preacutesenteacute la boicircte de reacuteception mais les autres boicirctes

fonctionnent de maniegravere similaire

Interface drsquoadministration

Le systegraveme de webmail possegravede plusieurs variables des listes de diffusion

des compteshellipMais on veut pouvoir donner les droits agrave un utilisateur demodifier tout

cela En effet si nous trouvons cela abordable drsquoajouter un utilisateur avec une

commande dans le shell il faut aussi penser agrave lrsquoutilisateur final qui preacutefegravere peut-ecirctre

le confort drsquoune interface deacutedieacutee pour geacuterer son serveur mail plutocirct que le terminal

De maniegravere tregraves simple un utilisateur appartenant au groupes drsquoutilisateurs

ldquoAdministrateursrdquo est reconnu en tant qursquoadministrateur par lrsquointerface et peut

cliquer sur un bouton ldquoManagerdquo dans le panneau lateacuteral qui nrsquoest visible qursquoaux

administrateurs De lagrave il arrive sur la page suivante

Fig 11 lrsquointerface drsquoadministration

Sur cette interface il peut choisir la taille maximale des piegraveces jointes

changer le nom de domaine sur lequel est installeacute lrsquointerface et dont deacutependent

toutes les adresses (domaine) Il est aussi possible de modifier directement ces

variables en modifiant le fichier includeconfigincphp Pratique notamment si lrsquoon

a renseigneacute un mauvais nom de domaine agrave la configuration et que lrsquoon arrive plus agrave

acceacuteder agrave lrsquointerface

Il peut aussi creacuteer un nouveau compte en renseignant les champs preacutenom

nom mot de passe et quota Lrsquoutilisateur peut ensuite une fois son compte creacutee

directement se connecter avec son identifiant (initiale preacutenom + nom) et mot de

passe Lors de la creacuteation du compte un mail de bienvenue est envoyeacute au nouvel

utilisateur ce qui permet en arriegravere-plan de creacuteer tous les dossiers utilisateurs et

fichiers en-tecirctes utiles agrave lrsquointerface une fois pour toutes

Lrsquoadministrateur peut aussi ajouter une liste de diffusion (assimileacutee agrave un

groupe) ou en supprimer une parmi les listes existantes

En outre lrsquoadministrateur peut aussi modifier les donneacutees drsquoun utilisateur

Pour cela sur la preacutesente page il peut seacutelectionner un utilisateur parmi la liste des

utilisateurs existants ce qui le redirige vers la page de gestion des comptes

Fig 12 La gestion drsquoun compte seacutelectionneacute ici celui de James Bond

A ce stade il peut changer lrsquoUID de lrsquoutilisateur (utile en cas de conflit) le nom

le mot de passe le quota de cet utilisateur et lrsquoajouter ou le retirer drsquoune liste de

diffusion Accessoirement il peut aussi supprimer le compte en cliquant sur lrsquoeacutenorme

bouton rouge qui lui demandera deux fois de suite de confirmer son action afin

drsquoeacuteviter les erreurs de clic Cette action entraicircne la suppression de lrsquoutilisateur de

toutes les listes de diffusion auxquelles il appartient la suppression de son compte

dans la branche people de lrsquoarbre LDAP et la suppression deacutefinitive de son dossier

utilisateur sur le disquesystegraveme de fichiers impliquant donc la perte de ses mails

Architecture du systegraveme de fichiers

Comme nous lrsquoavons dit plus haut lrsquoideacutee est de se passer des meacutecanismes

classiques avec les clients mails habituels Ces serveurs srsquoalourdissent

geacuteneacuteralement en utilisant des serveurs IMAPPOP3 et un meacutecanisme

drsquoauthentification SMTP

Pour adapter ces fonctionnaliteacutes agrave notre systegraveme nous avons donc constitueacute

une architecture pour organiser les fichiers qui transitent Vous pourrez voir un

scheacutema reacutecapitulatif en annexe 1

Dans la premiegravere moitieacute du projet les mails eacutetaient deacutelivreacutes par Postfix Nous

utilisions un script exeacutecuteacute lors de la reacuteception drsquounmail pour les traiter de lamaniegravere

que nous voulions Cette meacutethode avait les inconveacutenients drsquoecirctre lourde et pas

efficace agrave 100 En effet seuls les mails reccedilus depuis lrsquoexteacuterieur eacutetaient

correctement traiteacutes

Deacutesormais les mails sont traiteacutes totalement par notre script Cela nous

permet de geacuterer les mails dans des dossiers organiseacutes agrave notre maniegravere et de

recevoir les mails locaux crsquoest-agrave-dire entre utilisateurs du mecircme domaine Cette

nouvelle meacutethode regravegle aussi drsquoautres problegravemes notamment au niveau des

permissions sur les fichiers

Pour reacuteduire le nombre drsquoopeacuterations et pour profiter des fonctionnaliteacutes

offertes par le framework utiliseacute pour lrsquointerface web nous regroupons des

informations sur chacun des mails reccedilus sous la forme de fichiers JSON Pour ce

faire lrsquoideacutee est drsquoexeacutecuter un script lorsque leacutevegravenement ldquoreacuteception drsquoun mailrdquo

survient Postfix offre cette possibiliteacute dans sa configuration Or il se trouve qursquoil nrsquoest

pas si simple de reacutecupeacuterer le chemin du fichier contenant le mail car le nom du

fichier creacutee est sous la forme Timestamp UNIX10 Caractegraveres aleacuteatoires (ex

14562336185A8D43E97F)

La seconde probleacutematique est que le webmail doit avoir la possibiliteacute de

pouvoir lire les fichiers pour afficher les mails sur son interface Or il semble que

Postfix les eacutecrit en autorisant uniquement son utilisateur en lecture Il nous a fallu

trouver une solution pour remeacutedier agrave cela Nous avons choisi drsquoajouter www-data

(utilisateur du serveur web) au groupe vmail et de modifier les droits sur les fichiers

de sorte que les utilisateurs de ce groupe puissent lire les fichiers

Nous avons revu une partie de lrsquoorganisation des fichiers pour reacutecupeacuterer les

piegraveces jointes si elles sont preacutesentes Le script que nous avons eacutecrit reacutecupegravere le

fichier original du mail et le deacutecoupe en eacuteleacutements simples dans des fichier distincts

corps du mail et diffeacuterentes piegraveces jointes De cette maniegravere pour afficher un mail

nous nrsquoavons pas besoin de charger la totaliteacute du fichier Dans le cas ougrave il y a des

piegraveces jointes cela aurait ralenti lrsquoaffichage des informations

Nous avons eacutegalement impleacutementeacute la gestion des quotas Dans lrsquoeacutetat actuel

des choses srsquoil nrsquoy a plus de place disponible pour lrsquoutilisateur le mail nrsquoest tout

bonnement pas deacutelivreacute agrave ce destinataire Lrsquoideacuteal aurait eacuteteacute de notifier leacutemetteur avec

un mail ce qui nrsquoest pour lrsquoinstant pas le cas mais qui pourrait ecirctre reacutesolu en

renvoyant agrave postfix un code drsquoerreur deacutefini

Pour terminer nous avons revu la totaliteacute du code deacuteveloppeacute Nous sommes

passeacute du Bash au Perl Ce dernier est plus performant et plus simple agrave utiliser et agrave

lire

Firewall

Un autre gros morceau du projet mais qui nrsquoest pas speacutecifiquement lieacute agrave la

probleacutematique du mail crsquoest la seacutecurisation du serveur En effet apregraves avoir mis en

ligne notre serveur des pirates ont tregraves vite tenteacute de peacuteneacutetrer le systegraveme

Globalement les attaques eacutetaient de type force brute sur les services heacutebergeacutes sur

notre Raspberry neacutecessitant une identification tels que SSH SMTP hellip

On retrouve ici un petit point faible du protocole SMTP Eacutetant donneacute que

chaque serveur mail doit avoir une adresse postmaster et abuse lrsquoattaquant a agrave sa

disposition deux adresses agrave attaquer Ceci dit ce type drsquoattaque est simple agrave

contrecarrer car il suffit de limiter dans le temps le nombre de tentatives de

connexions

La contre-mesure que nous avons mis en place est simple une seacuterie de

regravegles Iptables En reacutesumeacute nous avons opteacute pour un systegraveme de liste blanche et

noire Les adresses IPs de la liste blanche sont autoriseacutees agrave utiliser la totaliteacute des

services (notamment SSH) tandis que celles de la liste noire sont totalement

ignoreacutees Les autres IPs nrsquoont accegraves qursquoau webmail

Eacutetant donneacute que le nombre drsquoIPs attaquant notre serveur nrsquoa cesseacute

drsquoaugmenter nous avons automatiseacute la mise agrave jour de la liste de noire en

deacuteveloppant un script pour Cron Ce script est exeacutecuteacute une fois par heure A ce jour

notre liste noire contient 47 adresses Bien sucircr ce systegraveme est susceptible drsquoecirctre

modifieacute agrave convenance pour passer sur une solution deacutedieacutee telle que Fail2ban qui fait

en fait ce qursquoon fait deacutejagrave (eacutetudier les logs et bannir des IP avec iptables) avec des

regravegles preacutedeacutefinies par la communauteacute et personnalisables En effet nous nous

attendons agrave voir la varieacuteteacute et le nombre drsquoattaques augmenter apregraves avoir migreacute sur

une IP non proteacutegeacutee par le firewall de lrsquoUniversiteacute puisque nous nrsquoavons plus la

premiegravere ligne de deacutefense du CRI en particulier pour le port 389 (LDAP) qui eacutetait

bloqueacute par lrsquouniversiteacute et srsquoest retrouveacute en premiegravere ligne apregraves la migration Nous

avons donc ajouteacute une regravegle bloquant tout le trafic entrant vers le port 389 hormis

localhost

Package drsquoinstallation

Nous avons creacutee un package deb contenant les sources du webmail ainsi

que des scripts utiles agrave lrsquoinstallation et au fonctionnement du serveur Nous avons

deacuteveloppeacute des scripts de configuration automatique pour LDAP et Postfix Comme

dpkg ne supporte pas directement lrsquoinstallation automatique des deacutependances

nous recommandons drsquoinstaller avant tout le paquet gdebi-core qui est en fait un

dpkg ameacutelioreacute Gracircce agrave la commande gdebi paquetdeb toutes les deacutependances

seront installeacutees en particulier postfix le serveur ldap le serveur web lighttpd entre

autres sans soucis Il est agrave noter que comme les scripts de configuration des

diffeacuterents services ne sont que partiellement impleacutementeacutes dans le paquet deb nous

fournissons en annexe un README complet et illustreacute qui explique pas agrave pas

comment faire fonctionner notre systegraveme sur nrsquoimporte quel Linux en particulier les

lignes de configuration des diffeacuterents services agrave changer et un exemplaire des

fichiers de configuration fonctionnels de ces services

Gestion de lrsquoeacutenergie

Une consideacuteration importante pour un systegraveme autonome Drsquoapregraves les fiches

techniques notre modegravele de Raspberry Pi (B 2) est officiellement eacutevalueacute avec un

fonctionnement agrave ~650mA pour 5V De nombreux proprieacutetaires de ce systegraveme

eacutequipeacutes se sont amuser agrave veacuterifier la consommation eacutelectrique reacuteelle de leur Pi 2 B

sous diffeacuterentes charges On pourra retenir cette eacutetude (lien en sitegraphie) qui

relegraveve la consommation en courant en fonction de lrsquoactiviteacute lanceacutee sur la Pi mais

aussi en charge sur 1 agrave 4 CPU

Ces chiffres sont releveacutes sur un systegraveme avec cameacutera connecteacutee HDMI connecteacute et

cacircble ethernet brancheacute et actif

On peut constater que globalement notre systegraveme Pi 2 B tournant sans

interface graphique sans composant suppleacutementaire sans sortie videacuteo ni cameacutera

avec plusieurs serveurs tournant tout en restant le plus leacuteger possible et demeurant

~99 idle la plupart du temps ne devrait pas deacutepasser une consommation de

300mA grand maximum

Fig 13 Un processeur tregraves tregraves peu chargeacute et une meacutemoire relativement libre

Nous avions lrsquoanneacutee derniegravere deacutejagrave reacutealiseacute un circuit permettant drsquoadapter un

panneau solaire sur une batterie USB classique de 9000mAh Nous avions alors pu

mesurer lrsquointensiteacute deacutelivreacutee par le panneau solaire En cas drsquoensoleillement moyen

habituel dans nos contreacutees le panneau solaire deacutebitait 400mA et pouvait atteindre

le double quand le soleil eacutetait directement preacutesent pour environ 800mA deacutebiteacute

Ce panneau solaire accompagneacute de son circuit drsquoadaptation devrait donc

suffire pour alimenter notre systegraveme la journeacutee le brancher ensuite sur une batterie

portable permet de stocker le surplus pour la nuit

Fig 14 le circuit drsquoadaptation

Fig 15 et son PCB

Eacutevolutions possibles

Webmail

Concernant les eacutevolutions possibles que nous aurions aimeacute apporter agrave notre

projet avec plus de temps commenccedilons par le web Nous aurions souhaiteacute apporter

la gestion de lrsquoenvoi de plusieurs piegraveces jointes comme nous lrsquoavons fait pour la

reacuteception

De plus nous aurions voulu inteacutegrer une corbeille ougrave lesmessages pourraient

aller avant drsquoecirctre deacutefinitivement supprimeacutes du systegraveme drsquoautant que nous avons

deacutejagrave eacutecrites les fonctions PHP permettant de retirer une en-tecircte drsquoun fichier JSON et

le fichier mail associeacute

Enfin nous aurions aimeacute en plus du blocage deacutejagrave preacutesent impleacutementer une

gestion plus profonde des piegravece jointes permettant notamment le remplissage de la

boicircte de spams

Systegraveme

Il aurait eacuteteacute inteacuteressant de notifier lrsquoexpeacutediteur lorsque le mail nrsquoa pas pu ecirctre

deacutelivreacute agrave un utilisateur lorsque son quota est plein En toute logique cela devrait ecirctre

fait simplement avec la commande Sendmail

Une meilleur gestion du trafic mail indeacutesirable aurait eacuteteacute la bienvenue En

effet malgreacute la limitation du spam il restera toujours une partie du volume de mail

qui sera indeacutesirable (pub pishing scam hellip)

Eacutetant donneacute la taille du systegraveme nous avions penseacute agrave une approche

ldquomachine learningrdquo Lrsquoutilisateur indiquerait pourquoi il considegravere le mail comme

indeacutesirable constituant des regravegles refusant certains mails Les mails provenant de

cet expeacutediteur pourraient ecirctre deacutetecteacute par le script agrave la reacuteception et

automatiquement envoyeacutes dans la boicircte de spams

Partie eacutenergeacutetique

Mecircme si la solution au panneau solaire ne pose aucun problegraveme en theacuteorie

nous aurions deacutejagrave dans un premier temps aimeacute lrsquoimpleacutementer en pratique Nous

nrsquoavons finalement pas reacutealiseacute notre objectif de deacutetecter deux cas drsquoalimentation

diffeacuterents soit lrsquoalimentation via panneau solaire est suffisante dans ce cas il

alimente la batterie et donc la Raspberry soit quand ce courant nrsquoest pas suffisant

on alimente la batterie par le secteur

Conclusion

En conclusion nous pensons avoir reacutepondu au cahier des charges initial dans

sa majeure partie Nous sommes aujourdrsquohui en mesure de proposer une solution

mail domestique priveacutee et personnalisable par un particulier

Notre installation de Debian a eacuteteacute au maximum alleacutegeacutee pour notre utilisation

sans interface graphique et nous avons mis en place une reacuteponse aux diverses

attaques que nous avons pu subir lors de lamise en place de notre solution logicielle

En outre le pare-feu avec notre systegraveme de liste noire bloque une partie des

attaques qui peuvent nous parvenir

Nos diffeacuterents scripts de pare-feu de gestion drsquoun mail entrant associeacute au

webmail permettent agrave un utilisateur drsquoacceacuteder aux fonctions usuelles associeacutees agrave

lrsquoenvoi et la reacuteception de mails

Gracircce agrave sa configuration personnalisable notre projet devrait pouvoir ecirctre

porteacute sur un domaine et une adresse IP diffeacuterente sans soucis et ecirctre deacuteployeacute

partout ougrave des gens souhaitent conserver leur vie priveacutee

Nous regretterons cependant de ne pas avoir exploiteacute la partie eacutenergeacutetique

de ce projet qui portait une probleacutematique inteacuteressante et qui nous parait importante

dans le monde actuel

Ce projet nous aura occupeacute pendant tregraves longtemps et nous sommes fiers du

travail que nous avons accompli Il est agrave nos yeux la preuve de ce que nous savons et

pouvons faire et nous donnera confiance pour notre deacutebut de carriegravere drsquoingeacutenieur

Sources

httpwwwradicaticomwpwp-contentuploads201401Email-Statistics-R

eport-2014-2018-Executive-Summarypdf

httpwwwcommentcamarchenetcontents525-le-protocole-ldap

httpsfrwikipediaorgwikiSimple_Mail_Transfer_Protocol

httpwwwcommentcamarchenetcontents536-pop3-smtp-imap-protocol

es-de-messagerie

httpstoolsietforghtmlrfc2821

httpsfrwikipediaorgwikiInternet_Message_Access_Protocol

httpstoolsietforghtmlrfc3501

httparstechnicacominformation-technology201402how-to-run-your-ow

n-e-mail-server-with-your-own-domain-part-1

httpswwwraspberrypiorgforumsviewtopicphpp=136912

httpstackoverflowcomquestions17394356how-can-i-make-a-bash-com

mand-run-periodically

httpuntroubledorgnullmailer

httpelinuxorgRPi_Hardware

httpraspitv2015raspberry-pi2-power-and-performance-measurement

Annexe 1 Architecture du systegraveme de fichiers

Annexe 2 Scan DNSSTUFF

Depuis httpwwwdnsstuffcomtoolsdnsReport|type=domainampampvalue=intimailpw

Annexe 3 Vue geacuteneacuterale httpswwwintimailpw

Annexe 4 Envoyer un mail

Annexe 5 Boite de reacuteception

Annexe 6 Interface drsquoadministration

Annexe 7 Gestion drsquoun utilisateur

Tutorial installation intimailtrade

Table des matiegraveres Apregraves une nouvelle installation de lrsquoOS 2

Seacutecurisation du serveur 2

Changement de lrsquoutilisateur par deacutefaut 2

Changement du port SSH 2

Interdire lrsquoauthentification SSH pour root 2

Installation de LDAP 3

Configuration de base 3

Configuration des Scheacutemas 4

Constitution de la base de donneacutees LDAP 5

Installation de Postfix 7

Installation de Bind9 8

Installation du paquet Debian et configuration de lighttpd 9

Deacutependances 11

Sources 12

2

Apregraves une nouvelle installation de lrsquoOS Exeacutecutez ces commandes pour mettre agrave jour agrave la derniegravere version Ces opeacuterations peuvent prendre un certain

temps Nous avons utiliseacute pour cet exemple Raspbian Jessie Lite sur une Raspberry Pi 2

apt-get update

apt-get upgrade ampamp apt-get dist-upgrade

apt-get install linux-headers-$(uname -r)

reboot

Puis lancer

raspi-config

Etendre au maximum lrsquoespace de stockage en navigant dans les menus

Expand Filesystem

Reacutegler une ip statique avec la box fichier etcnetworkinterfaces

iface eth0 inet static

address 192168131

netmask 2552552550

gateway 19216811

Nous avons aussi supprimeacute wpasupplicant

Seacutecurisation du serveur

Changement de lrsquoutilisateur par deacutefaut Changez le nom drsquoutilisateur par deacutefaut ainsi que son mot de passe

sudo passwd root

Sortie et login en tant que root puis

usermod -l myuname pi

usermod -m -d homemyuname myuname

groupmod ndashn myuname pi

passwd myuname

Voir cette adresse pour lrsquoutilisation de cleacutes priveacuteespubliques

Changement du port SSH sed ndashi sPort 22Port 2222g etcsshsshd_config

Interdire lrsquoauthentification SSH pour root sed -i sPermitRootLogin yesPermitRootLogin nog etcsshsshd_config

3

Installation de LDAP

Configuration de base Installation du package

apt-get install slapd

Choisir un mot de passe administrateur puis lancer la commande

dpkg-reconfigure slapd

Reacutepondre non agrave la question 1

Entrez le nom de domaine utiliseacute agrave la question 2 sous la forme domainetld

Entrez ce que vous voulez au 3egraveme eacutecran le nom de lrsquoorganisation ne sera pas utiliseacute

Entrez un mot de passe

Choisissez HDB

Choisissez si la base de donneacutees est supprimeacutee agrave la deacutesinstallation de slapd

Deacuteplacez lrsquoancienne base de donneacutees

Nrsquoutilisez pas LDAPv2

Installer les outils de conversion pour ldap (slaptest ldapmodify notamment)

apt-get install ldap-utils

On peut maintenant veacuterifier que la configuration est valable

ldapsearch -x -h localhost -b dc=domainedc=tld -LLL dc=domaine dn

Cette commande doit retourner quelque chose comme

dn dc=domainedc=tld

Il faut maintenant seacutecuriser le serveur LDAP en effet on peut y acceacuteder en anonyme avec la commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=config

(amp(objectClass=olcDatabaseConfig)(olcSuffix=dc=domainedc=tld))

Cette commande retourne un certain nombre drsquoinformations notamment agrave propos des champs suivants

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by none

olcAccess 1to dnbase= by read

olcAccess 2to by read

On va modifier ces champs avec la commande ldapmodify Pour cela on va creacuteer un fichier ldif

cat gt changeAccessldif ltlt EOF

dn olcDatabase=1hdbcn=config

changetype modify

delete olcAccess

-

add olcAccess

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by dn=cn=admindc=domainedc=tld write by none

-

add olcAccess

olcAccess 1to dnbase= by read

-

4

add olcAccess

olcAccess 2to by self write by dn=cn=admindc=domainedc=tld write by

none

-

EOF

On peut maintenant appliquer les changements avec ldapmodify

ldapmodify ndashc ndashY EXTERNAL ndashH ldapi -f changeAccessldif

La commande devrait vous confirmer que la modification srsquoest bien effectueacutee

SASLEXTERNAL authentication started

SASL username gidNumber=0+uidNumber=0cn=peercredcn=externalcn=auth

SASL SSF 0

modifying entry olcDatabase=1hdbcn=config

On peut veacuterifier qursquoon ne peut plus acceacuteder aux informations avec la commande

ldapsearch -x -c -h localhost -b dc=domainedc=tld

On peut veacuterifier la configuration en se connectant en tant qursquoadministrateur

ldapsearch -c -h localhost -b dc=domainedc=tld -D

cn=admindc=domainedc=tld ndashW

Configuration des Scheacutemas Nous allons utiliser les scheacutemas de courier-ldap Pour eacuteviter une manipulation compliqueacutee vous trouverez

directement le scheacutema avec le fichier authldapschema On place ce fichier dans le dossier

mv authldapschema etcldapschema

Nous creacuteons un fichier qui incluera tous les scheacutemas de base en plus du nouveau On peut les afficher avec la

commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

Creacuteation du fichier de configuration pour notre exemple cela donne

mkdir tmpldapconf

cat gt tmpldapconfldapconf ltlt EOF

include etcldapschemacoreschema

include etcldapschemacosineschema

include etcldapschemanisschema

include etcldapschemainetorgpersonschema

include etcldapschemaauthldapschema

EOF

On lance ensuite la commande

slaptest -f tmpldapconfldapconf -F tmpldapconf

Elle revoie un message de succegraves Cette commande a creacuteeacute dans le reacutepertoire tmpldapconf une arborescence

correspondant agrave la configuration de notre LDAP

On modifie le chemin de configuration

5

sed ndashi 0dnauthldap sauthldapauthldapcn=schemacn=config

cn=authldapldif

On supprime ensuite les 7 derniegraveres lignes du fichier

head -n -7 cn=authldapldif gt tmpldif

mv tmpldif cn=authldapldif

On peut maintenant importer notre fichier de configuration Pour ce faire

ldapadd -Y EXTERNAL -H ldapi -f

tmpldapconfcn=configcn=schemacn=authldapldif

Si tout va bien lrsquoentreacutee devrait avoir eacuteteacute ajouteacutee On peut veacuterifier avec la commande vue tout agrave lrsquoheure

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

On devrait voir en plus le nouveau scheacutema authldap

Constitution de la base de donneacutees LDAP Le remplissage de la base se fait agrave lrsquoaide de fichiers ldif Nous donnons ici un exemple de structure

Fichier pour la structure de base

dn dc=maildc=domainedc=tld

o intimailpw

description Global mail tree

dc mail

objectClass top

objectClass dcObject

objectClass organization

dn dc=peopledc=maildc=domainedc=tld

description Informations of all users

o people

dc people

objectClass top

objectClass dcObject

objectClass organization

dn dc=groupsdc=maildc=domainedc=tld

description All groups of users

o groups

dc groups

objectClass top

objectClass dcObject

objectClass organization

6

Fichier pour ajouter un utilisateur

dn cn=jbonddc=peopledc=maildc=domainedc=tld

uid jbond

mail jbonddomainetld

sn Moulin

givenName James

displayName James Bond

mailbox domainetldjbond

quota 50M

homeDirectory homevmail

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAccount

userPassword SSHA367PSXiUAegy8dpJbPU8OepEf8L5ye

Pour obtenir un hash du mot de passe

slappasswd -s password -h SSHA

On peut par la suite ajouter la configuration agrave la base de donneacutees avec la commande

ldapadd -D cn=admindc=domainedc=tld -W -h localhost -f pathtofile

Si les champs proposeacutes ne sont pas suffisants il faudra alors effectuer les modifications dans le fichier autldapschema

proposeacute plus haut et refaire la manipulation de configuration

De plus les standards du Mail deacutecrit par lrsquoIETF (RFC822 63 RFC1123 527 and RFC2821 451) impliquent drsquoavoir une

adresse Postmaster et une Abuse Pour cela nous pourrions creacuteer ces adresses avec la meacutethode vue au-dessus mais

ce nrsquoest pas la meilleure Il est preacutefeacuterable drsquoutiliser un alias comme nous le ferons avec les listes de diffusion Ici nous

proposons de rediriger ces deux adresses vers une adresse administrateur Pour cela la meacutethode est la mecircme sauf

que le fichier ldif nrsquoest pas tout agrave fait identique En voici un exemple

dn cn=postmasterdc=groupsdc=maildc=domainedc=tld

uid postmaster

mail postmasterdomainetld

sn Postmaster

displayName Postmaster

maildrop admindomainetld

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAlias

Pour faire une liste de diffusion la meacutethode est la mecircme Il suffit drsquoajouter toutes les adresses destinataires dans le

champ maildrop seacutepareacutees par des virgules ()

7

Installation de Postfix Installation des packages

apt-get install postfix postfix-ldap

Lors de lrsquoinstallation deux eacutecrans deacutefilent

- Configuration Internet Site

- Valeur par deacutefaut pour le mail name

On creacutee lrsquoutilisateur qui servira agrave exeacutecuter Postfix

groupadd vmail

useradd -g vmail -d homevmail -s binfalse -m vmail

Nous aurons besoin dans la suite des GID et UID creacuteeacutes agrave cet instant Ils peuvent ecirctre afficheacutes avec les commandes

cat etcgroup | grep vmail | cut -d -f3

cat etcpasswd | grep vmail | cut -d -f3

On ajoute les paramegravetres au fichier etcpostfixmaincf (remplacer les valeurs de GID et drsquoUID avec vos valeurs)

smtpd_banner = maildomainetld

virtual_mailbox_base = homevmail

virtual_mailbox_domains = dmainetld

virtual_mailbox_maps = ldapetcpostfixldap_accountscf

virtual_alias_maps = ldapetcpostfixldap_aliasescf

virtual_minimum_uid = 100

virtual_gid_maps = static1001 Remplacez ici par votre valeur de GID

virtual_uid_maps = static1001 Remplacez ici par votre valeur drsquoUID

Il nous faut maintenant constituer nos fichiers de configuration ldap_accountscf

cat gt etcpostfixldap_accountscf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=peopledc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAccount)(mail=s))

result_attribute = mailbox

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

Et pour ldap_aliasescf

cat gt ldap_aliasescf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=groupsdc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAlias)(mail=s))

result_attribute = maildrop

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

8

On peut maintenant veacuterifier la configuration de Postfix avec (cette commande ne doit rien retourner si crsquoest bon)

postfix check

Si crsquoest bon alors on recharge le serveur

postfix reload

On peut alors faire un envoi de mail test via telnet

telnet localhost 25

Si vous souhaitez deacutelivrer les mails agrave votre maniegravere il faut dans le fichier etcpostfixmaincf la ligne

virtual_transport = nomdevotreregle

Et de mecircme dans le fichier etcpostfixmastercf

nomdevotreregle unix - n n - 5 pipe

flags=Rq user=vmail null_sender=

argv=chemindevotreprogramme

Il nous reste maintenant agrave configurer les diffeacuterents enregistrements DNS neacutecessaire au fonctionnement drsquoun serveur

mail Vous pouvez utiliser la solution de votre choix Dans la suite vous trouverez une meacutethode utilisant Bind9

Installation de Bind9 Dans toute cette partie on se situera dans le dossier etcbind Dans la suite notre IP sera abcd

Dans le fichier namedconfoptions on ajoutera dans le champ options

version Not supported

Dans un dossier zones on eacutecrit le fichier dbdomainetld

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122111 Serial

43200 Refresh

3600 Retry

2419200 Expire

86400 ) Negative Cache TTL

IN NS nsdomainetld

IN NS ns11ovhnet

ns IN A abcd

www IN A abcd

IN A abcd

IN MX 10 maildomainetld

mail IN A abcd

Dans le mecircme dossier zones on a cbain-addrarpa

9

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122101 serial

14400 refresh

3600 retry

604800 expire

10800 minimum

)

cbain-addrarpa IN NS nsdomainetld

cbain-addrarpa IN NS ns11ovhnet

d IN PTR maildomainetld

Il faut faire attention agrave bien increacutementer le serial pour chaque modification des fichiers

Dans le fichier namedconflocal

zone domainetld

type master

file etcbindzonesdbdomainetld

allow-transfer 213251128130

notify yes

zone cbain-addrarpa IN

type master

file etcbindzonescbain-addrarpa

allow-transfer 213251128130

Ici 213251128130 est lrsquoadresse IP du serveur ns11ovhnet

Il faut bien sucircr configurer le DNS avec votre fournisseur (Gandi OVH hellip) Pour ccedila amusez-vous bien Vous pouvez

aussi tester votre configuration avec des outils en ligne tels que DNSstuff

En test final si votre configuration est bonne vous devriez pouvoir envoyer un mail depuis un service neutre (Gmail

yahoo hellip) et le voir dans votre arborescence (ici homevmaildomainetld)

Installation du paquet Debian et configuration de lighttpd

Commencez par reacutecupeacuterer le paquet deb agrave lrsquoadresse suivante httpswwwintimailpwintimaildeb

Installez ensuite GDebi Il srsquoagit drsquoun dpkg ameacutelioreacute pour teacuteleacutecharger les deacutependances automatiquement ce que

dpkg ne gegravere pas

apt-get update

apt-get install gdebi-core

10

Vous pouvez alors installer le paquet

gdebi intimaildeb

Vous aurez alors le site web drsquointiMail deacuteployeacute au chemin varwwwwebmail

Il ne vous reste plus qursquoagrave changer la configuration de lighttpd votre serveur web pour mettre en ligne le site

Vous pouvez pour cela copier-coller la configuration suivante mais veillez agrave bien changer lrsquoadresse IP preacutesente au

deacutebut de la partie SSL CONFIG avec votre adresse IP

serv ermodules = ( mod_access

mod_accesslog

mod_alias

mod_compress

mod_redirect

mod_rewrite

)

Hide server version

servertag = Such Headers Very try Now close telnet

serverdocument-root = varwwwwebmail

serverupload-dirs = ( varwwwwebmailuploads )

servererrorlog = varloglighttpderrorlog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

serverport = 80

accesslogformat = V h l u t r gts b Refereri

User-Agenti

accesslogfilename = varloglighttpdaccesslog

index-filenames = ( indexphp indexhtml

indexlighttpdhtml )

urlaccess-deny = ( ~ inc )

static-fileexclude-extensions = ( php pl fcgi )

compresscache-dir = varcachelighttpdcompress

compressfiletype = ( applicationjavascript textcss

texthtml textplain )

default listening port for IPv6 falls back to the IPv4 port

include_shell usrsharelighttpduse-ipv6pl + serverport

include_shell usrsharelighttpdcreate-mimeassignpl

include_shell usrsharelighttpdinclude-conf-enabledpl

SSL CONFIG

$SERVER[socket] == 5234485443

sslengine = enable

11

sslpemfile = etclighttpdsslintimailpwpem

sslca-file = etclighttpdsslintimailpwcrt

servername = intimailpw

votre configuration habituelle pour ce domaine

serverdocument-root = varwwwwebmail

servererrorlog = varloglighttpderror_ssllog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

Rewrite des URL pour masquer php

urlrewrite-once = ( ^()$ =gt $1 )

urlrewrite-if-not-file = ( ^([^])()$ =gt $1php$2 )

servernetwork-backend = writev

Deacutependances Slapd

Ldap-utils

Postfix

Postfix-ldap

Bind9

Lighttpd

12

Sources httpswikigandinetfrhostingusing-linuxtutorialsdebianmail-server-ldap

httpwwwpostfixorgpipe8html

httpwwwpostfixorgFILTER_READMEhtml

httpwwwpostfixorg

httpwwwpostfixorgtransport5html

Page 10: Système d'hébergement domestique...place sur les domaines .pw par Gandi.net, notre fournisseur. Nous n’avons donc pas pu l’implémenter. Nous avons configuré Postfix pour qu’il

Nous nous sommes alors heurteacutes aux protections du Service Informatique de

lrsquoUniversiteacute (CRI) qui bloque le port 25 en sortie et en entreacutee en dehors de lrsquouniversiteacute

Pour nous astreindre de ces restrictions nous avons migreacute notre serveur vers une

nouvelle connexion SDSL exteacuterieure au reacuteseau de Lille 1 Cela a eacuteteacute pour nous un

moyen de veacuterifier en partie la portabiliteacute de notre systegraveme puisque nous utilisons une

toute nouvelle connexion avec une nouvelle adresse IP Nous avons donc ducircmettre

agrave jour notre serveur de nom pour refleacuteter ces changements La migration srsquoest

passeacutee sans soucis avec un deacutelai de propagation des changements drsquoenviron 1

heure Le systegraveme est resteacute fonctionnel agrave 100 notamment parce que dans notre

code nous faisons appel au serveur par localhost ou une variable et jamais

directement lrsquoadresse IP ou le domaine Cependant nous nrsquoavons pas pu veacuterifier la

migration vers un domaine diffeacuterent bien que cela ne reste normalement qursquoune

variable dans les fichiers de configuration de lrsquointerface

Gestion du Spam

Comme preacutevu nous avons apporteacute une solution agrave la gestion du spam sur

notre serveur Postfix propose dans ses paramegravetres lrsquoutilisation de services de

DNSBL (DNS Black List) Cette technologie reprend le mecircme principe que les

serveurs de noms classiques Postfix soumet une requecircte de type DNS aux serveurs

de liste noire deacutefinis dans sa configuration et le serveur indique si ce nom de

domaine est preacutesent dans sa liste ou non On peut de cette maniegravere rejeter une

bonne partie du trafic mail correspondant au Spam et ce tregraves facilement

Malgreacute cela nous pensons qursquoune partie du Spam passera agrave travers les

mailles du filet Il aurait eacuteteacute inteacuteressant de traiter ceux-ci pour les classer comme

indeacutesirables et pouvoir ainsi les afficher dans lrsquointerface web

Serveur Web et Webmail

Un serveur web leacuteger

Initialement nous sommes partis sur une solution classique agrave base drsquoun

serveur web Apache qui nous a permis de deacutebuter le deacuteveloppement de lrsquointerface

Cependant comme nous cherchons agrave alleacuteger un maximum le systegraveme nous nous

sommes pencheacutes sur une autre solution Lighttpd Ce serveur web vise comme son

nom lrsquoindique la performance et la leacutegegravereteacute Sur le mecircme contenu avec une

connexion Tregraves Haut Deacutebit (100Mbps) nous chargeons deacutesormais la page de vue

geacuteneacuterale en 042s (Lighttpd) contre 170s avant (Apache 2) avec le navigateur

Chrome sans cache

Une architecture optimiseacutee

Lrsquoutiliteacute de reacutealiser notre propre webmail est dans un premier temps de

srsquoabstenir de lrsquoinstallation drsquoun serveur IMAPPOP puisque nous retrouvons

nous-mecircmes le contenu Dans un second temps il nous permet de ne garder que les

fonctionnaliteacutes neacutecessaires agrave notre webmail sans superflu

Fig 5 La vue geacuteneacuterale de notre webmail

Gracircce agrave PHP et agrave son module drsquointerface avec LDAP nous pouvons identifier

un utilisateur avec son nom drsquoutilisateur et son mot de passe sur le serveur local

LDAP et ainsi retrouver nombreuses informations utiles comme le quota actuel

autoriseacute son nom entier le chemin drsquoaccegraves agrave son reacutepertoire dans lesquels sont ses

mails sur le systegraveme de fichiershellip

Fig 6 Lrsquoarchitecture du dossier drsquoun utilisateur des dossier sent et inbox contenant les

mails bruts un dossier json dans lequel sont placeacutes les entecirctes des mails ainsi que le quota

Chaque en-tecircte de mail est eacutecrite dans un fichier json distinct par boicircte (un

fichier pour la boicircte de reacuteception un fichier pour les mails envoyeacuteshellip) ce qui nous

permet de montrer agrave lutilisateur la liste des mails dune boicircte sans traitement lourds

en arriegravere plan pour le serveur Ces fichiers sont renseigneacutes par un script lanceacute agrave la

reacuteception drsquoun mail par postfix du cocircteacute reacuteception et par lrsquointerface web elle mecircme

pour lrsquoeacutemission Lrsquoen-tecircte drsquoun mail est eacutecrite dans un conteneur JSONde lamaniegravere

suivante

Fig 7 Exemple drsquoentreacutee dans un fichier json

Gracircce tout cela nous pouvons afficher simplement le contenu des diffeacuterentes

boicirctes mail dans des tableaux sur lrsquointerface gracircce aux en-tecirctes et par la suite

retrouver et afficher le contenu drsquoun mail agrave partir de son fichier brut sur lequel

lrsquoutilisateur aura cliqueacute comme on le verra un peu plus loin

Toujours dans un souci drsquoameacutelioration des performances le strict neacutecessaire

est geacuteneacuteralement chargeacute sur les pages web par exemple en venant de la vue

geacuteneacuterale lorsqursquoon clique surInboxseule la partie inteacuterieure de la page est chargeacutee

on ne recharge pas le bandeau du haut de page ou lemenu de gauche agrave lamaniegravere

drsquoun MVC classique

Envoyer des courriels

Toute cette architecture ne doit pas nous faire oublier le but premier envoyer

et recevoir des mails Pour envoyer des mails crsquoest tregraves simple on peut soit cliquer

dans le bandeau du haut sur ldquoQuick Emailrdquo qui permet sur lamecircme page drsquoenvoyer

un email rapide et sans piegravece-jointe soit cliquer dans la barre de navigation sur le

cocircteacute sur ldquoWrite a new emailrdquo ce qui nous megravene vers une page deacutedieacutee permettant

drsquoeacutecrire un email incluant une piegravece jointe

Fig 8 Envoyer un mail crsquoest simple comme bonjour

On peut remarquer sur cette capture drsquoeacutecran que lrsquoon ne peut envoyer que

certains types de piegraveces jointes Nous supportons JPG PNG GIF PDF et ZIP Si la

piegravece jointe est drsquoun autre format elle est rejeteacutee La veacuterification du type srsquoeffectue

sur lrsquoextension du fichier et sur son type MIME ce qui eacutevite par exemple que

quelqursquoun modifie lrsquoextension drsquoun fichierexe en fichierjpg pour lrsquoenvoyer La piegravece

jointe doit de plus avoir une taille infeacuterieure agrave la taille maximale drsquoune piegravece jointe

parameacutetreacutee par lrsquoadministrateur comme nous le verrons dans lrsquointerface

drsquoadministration

Si tous ces critegraveres sont bons on eacutecrit lemail au format brut deacutecrit par la RFC

puis on lrsquoexpeacutedie agrave lrsquoaide de la fonction mail de PHP Si cette fonction nrsquoeacutechoue pas

crsquoest que le mail est expeacutedieacute avec succegraves on peut alors mettre agrave jour le quota

drsquoespace disque maximum autoriseacute agrave lrsquoutilisateur en increacutementant celui-ci avec la

taille du mail qui vient drsquoecirctre envoyeacute ainsi que creacuteer un fichiermail brut sur le disque

pour pouvoir afficher le mail dans la boicircte drsquoenvoi et en garder une trace

Notons que comme crsquoest lrsquoutilisateur web du systegraveme (www-data) qui exeacutecute

la fonction nous modifions les en-tecirctes du mail afin que le destinataire reccediloive un

mail de la part de ldquoPreacutenom Nomrdquo depuis lrsquoadresse ldquopnomdomainetldrdquo plutocirct que

ldquowww-datadomaintldrdquo par deacutefaut

La migration vers une IP externe agrave Lille 1 eacutetant reacuteussie nous pouvons bien

envoyer des mails depuis notre interface qui sont reccedilus agrave lrsquoexteacuterieur sans soucis

Mais aussi en recevoir

Recevoir des mails est tout aussi important Nous avons vu lrsquoarchitecture en

arriegravere-plan mais au final agrave quoi cela ressemble-t-il pour lrsquoutilisateur Il dispose en

fait en cliquant sur Inbox (ou Sent Spam ou Trash eacutegalement) drsquoun accegraves agrave sa boicircte

de reacuteception Drsquoun clic srsquoaffichent alors agrave lui tous les mails qursquoil a reccedilu

Fig 9 La boicircte de reacuteception

On remarque notamment les fonctions de recherche drsquoactualisation du

tableau de choix des colonnes agrave afficher on peut classiquement choisir combien de

lignes on affiche par page changer de pages etchellip

Lorsque lrsquoon clique sur un des lignes les donneacutees de lrsquoen-tecircte du mails sont

passeacutes en paramegravetres agrave une autre page qui drsquoapregraves ces informations retrouve le

fichier mail brut le traite et lrsquoaffiche

Fig 10 Un mail contenant 3 piegraveces jointes et un message

Comme on peut le voir nous pouvons recevoir desmails avec plusieurs piegraveces

jointes Nous avons ici preacutesenteacute la boicircte de reacuteception mais les autres boicirctes

fonctionnent de maniegravere similaire

Interface drsquoadministration

Le systegraveme de webmail possegravede plusieurs variables des listes de diffusion

des compteshellipMais on veut pouvoir donner les droits agrave un utilisateur demodifier tout

cela En effet si nous trouvons cela abordable drsquoajouter un utilisateur avec une

commande dans le shell il faut aussi penser agrave lrsquoutilisateur final qui preacutefegravere peut-ecirctre

le confort drsquoune interface deacutedieacutee pour geacuterer son serveur mail plutocirct que le terminal

De maniegravere tregraves simple un utilisateur appartenant au groupes drsquoutilisateurs

ldquoAdministrateursrdquo est reconnu en tant qursquoadministrateur par lrsquointerface et peut

cliquer sur un bouton ldquoManagerdquo dans le panneau lateacuteral qui nrsquoest visible qursquoaux

administrateurs De lagrave il arrive sur la page suivante

Fig 11 lrsquointerface drsquoadministration

Sur cette interface il peut choisir la taille maximale des piegraveces jointes

changer le nom de domaine sur lequel est installeacute lrsquointerface et dont deacutependent

toutes les adresses (domaine) Il est aussi possible de modifier directement ces

variables en modifiant le fichier includeconfigincphp Pratique notamment si lrsquoon

a renseigneacute un mauvais nom de domaine agrave la configuration et que lrsquoon arrive plus agrave

acceacuteder agrave lrsquointerface

Il peut aussi creacuteer un nouveau compte en renseignant les champs preacutenom

nom mot de passe et quota Lrsquoutilisateur peut ensuite une fois son compte creacutee

directement se connecter avec son identifiant (initiale preacutenom + nom) et mot de

passe Lors de la creacuteation du compte un mail de bienvenue est envoyeacute au nouvel

utilisateur ce qui permet en arriegravere-plan de creacuteer tous les dossiers utilisateurs et

fichiers en-tecirctes utiles agrave lrsquointerface une fois pour toutes

Lrsquoadministrateur peut aussi ajouter une liste de diffusion (assimileacutee agrave un

groupe) ou en supprimer une parmi les listes existantes

En outre lrsquoadministrateur peut aussi modifier les donneacutees drsquoun utilisateur

Pour cela sur la preacutesente page il peut seacutelectionner un utilisateur parmi la liste des

utilisateurs existants ce qui le redirige vers la page de gestion des comptes

Fig 12 La gestion drsquoun compte seacutelectionneacute ici celui de James Bond

A ce stade il peut changer lrsquoUID de lrsquoutilisateur (utile en cas de conflit) le nom

le mot de passe le quota de cet utilisateur et lrsquoajouter ou le retirer drsquoune liste de

diffusion Accessoirement il peut aussi supprimer le compte en cliquant sur lrsquoeacutenorme

bouton rouge qui lui demandera deux fois de suite de confirmer son action afin

drsquoeacuteviter les erreurs de clic Cette action entraicircne la suppression de lrsquoutilisateur de

toutes les listes de diffusion auxquelles il appartient la suppression de son compte

dans la branche people de lrsquoarbre LDAP et la suppression deacutefinitive de son dossier

utilisateur sur le disquesystegraveme de fichiers impliquant donc la perte de ses mails

Architecture du systegraveme de fichiers

Comme nous lrsquoavons dit plus haut lrsquoideacutee est de se passer des meacutecanismes

classiques avec les clients mails habituels Ces serveurs srsquoalourdissent

geacuteneacuteralement en utilisant des serveurs IMAPPOP3 et un meacutecanisme

drsquoauthentification SMTP

Pour adapter ces fonctionnaliteacutes agrave notre systegraveme nous avons donc constitueacute

une architecture pour organiser les fichiers qui transitent Vous pourrez voir un

scheacutema reacutecapitulatif en annexe 1

Dans la premiegravere moitieacute du projet les mails eacutetaient deacutelivreacutes par Postfix Nous

utilisions un script exeacutecuteacute lors de la reacuteception drsquounmail pour les traiter de lamaniegravere

que nous voulions Cette meacutethode avait les inconveacutenients drsquoecirctre lourde et pas

efficace agrave 100 En effet seuls les mails reccedilus depuis lrsquoexteacuterieur eacutetaient

correctement traiteacutes

Deacutesormais les mails sont traiteacutes totalement par notre script Cela nous

permet de geacuterer les mails dans des dossiers organiseacutes agrave notre maniegravere et de

recevoir les mails locaux crsquoest-agrave-dire entre utilisateurs du mecircme domaine Cette

nouvelle meacutethode regravegle aussi drsquoautres problegravemes notamment au niveau des

permissions sur les fichiers

Pour reacuteduire le nombre drsquoopeacuterations et pour profiter des fonctionnaliteacutes

offertes par le framework utiliseacute pour lrsquointerface web nous regroupons des

informations sur chacun des mails reccedilus sous la forme de fichiers JSON Pour ce

faire lrsquoideacutee est drsquoexeacutecuter un script lorsque leacutevegravenement ldquoreacuteception drsquoun mailrdquo

survient Postfix offre cette possibiliteacute dans sa configuration Or il se trouve qursquoil nrsquoest

pas si simple de reacutecupeacuterer le chemin du fichier contenant le mail car le nom du

fichier creacutee est sous la forme Timestamp UNIX10 Caractegraveres aleacuteatoires (ex

14562336185A8D43E97F)

La seconde probleacutematique est que le webmail doit avoir la possibiliteacute de

pouvoir lire les fichiers pour afficher les mails sur son interface Or il semble que

Postfix les eacutecrit en autorisant uniquement son utilisateur en lecture Il nous a fallu

trouver une solution pour remeacutedier agrave cela Nous avons choisi drsquoajouter www-data

(utilisateur du serveur web) au groupe vmail et de modifier les droits sur les fichiers

de sorte que les utilisateurs de ce groupe puissent lire les fichiers

Nous avons revu une partie de lrsquoorganisation des fichiers pour reacutecupeacuterer les

piegraveces jointes si elles sont preacutesentes Le script que nous avons eacutecrit reacutecupegravere le

fichier original du mail et le deacutecoupe en eacuteleacutements simples dans des fichier distincts

corps du mail et diffeacuterentes piegraveces jointes De cette maniegravere pour afficher un mail

nous nrsquoavons pas besoin de charger la totaliteacute du fichier Dans le cas ougrave il y a des

piegraveces jointes cela aurait ralenti lrsquoaffichage des informations

Nous avons eacutegalement impleacutementeacute la gestion des quotas Dans lrsquoeacutetat actuel

des choses srsquoil nrsquoy a plus de place disponible pour lrsquoutilisateur le mail nrsquoest tout

bonnement pas deacutelivreacute agrave ce destinataire Lrsquoideacuteal aurait eacuteteacute de notifier leacutemetteur avec

un mail ce qui nrsquoest pour lrsquoinstant pas le cas mais qui pourrait ecirctre reacutesolu en

renvoyant agrave postfix un code drsquoerreur deacutefini

Pour terminer nous avons revu la totaliteacute du code deacuteveloppeacute Nous sommes

passeacute du Bash au Perl Ce dernier est plus performant et plus simple agrave utiliser et agrave

lire

Firewall

Un autre gros morceau du projet mais qui nrsquoest pas speacutecifiquement lieacute agrave la

probleacutematique du mail crsquoest la seacutecurisation du serveur En effet apregraves avoir mis en

ligne notre serveur des pirates ont tregraves vite tenteacute de peacuteneacutetrer le systegraveme

Globalement les attaques eacutetaient de type force brute sur les services heacutebergeacutes sur

notre Raspberry neacutecessitant une identification tels que SSH SMTP hellip

On retrouve ici un petit point faible du protocole SMTP Eacutetant donneacute que

chaque serveur mail doit avoir une adresse postmaster et abuse lrsquoattaquant a agrave sa

disposition deux adresses agrave attaquer Ceci dit ce type drsquoattaque est simple agrave

contrecarrer car il suffit de limiter dans le temps le nombre de tentatives de

connexions

La contre-mesure que nous avons mis en place est simple une seacuterie de

regravegles Iptables En reacutesumeacute nous avons opteacute pour un systegraveme de liste blanche et

noire Les adresses IPs de la liste blanche sont autoriseacutees agrave utiliser la totaliteacute des

services (notamment SSH) tandis que celles de la liste noire sont totalement

ignoreacutees Les autres IPs nrsquoont accegraves qursquoau webmail

Eacutetant donneacute que le nombre drsquoIPs attaquant notre serveur nrsquoa cesseacute

drsquoaugmenter nous avons automatiseacute la mise agrave jour de la liste de noire en

deacuteveloppant un script pour Cron Ce script est exeacutecuteacute une fois par heure A ce jour

notre liste noire contient 47 adresses Bien sucircr ce systegraveme est susceptible drsquoecirctre

modifieacute agrave convenance pour passer sur une solution deacutedieacutee telle que Fail2ban qui fait

en fait ce qursquoon fait deacutejagrave (eacutetudier les logs et bannir des IP avec iptables) avec des

regravegles preacutedeacutefinies par la communauteacute et personnalisables En effet nous nous

attendons agrave voir la varieacuteteacute et le nombre drsquoattaques augmenter apregraves avoir migreacute sur

une IP non proteacutegeacutee par le firewall de lrsquoUniversiteacute puisque nous nrsquoavons plus la

premiegravere ligne de deacutefense du CRI en particulier pour le port 389 (LDAP) qui eacutetait

bloqueacute par lrsquouniversiteacute et srsquoest retrouveacute en premiegravere ligne apregraves la migration Nous

avons donc ajouteacute une regravegle bloquant tout le trafic entrant vers le port 389 hormis

localhost

Package drsquoinstallation

Nous avons creacutee un package deb contenant les sources du webmail ainsi

que des scripts utiles agrave lrsquoinstallation et au fonctionnement du serveur Nous avons

deacuteveloppeacute des scripts de configuration automatique pour LDAP et Postfix Comme

dpkg ne supporte pas directement lrsquoinstallation automatique des deacutependances

nous recommandons drsquoinstaller avant tout le paquet gdebi-core qui est en fait un

dpkg ameacutelioreacute Gracircce agrave la commande gdebi paquetdeb toutes les deacutependances

seront installeacutees en particulier postfix le serveur ldap le serveur web lighttpd entre

autres sans soucis Il est agrave noter que comme les scripts de configuration des

diffeacuterents services ne sont que partiellement impleacutementeacutes dans le paquet deb nous

fournissons en annexe un README complet et illustreacute qui explique pas agrave pas

comment faire fonctionner notre systegraveme sur nrsquoimporte quel Linux en particulier les

lignes de configuration des diffeacuterents services agrave changer et un exemplaire des

fichiers de configuration fonctionnels de ces services

Gestion de lrsquoeacutenergie

Une consideacuteration importante pour un systegraveme autonome Drsquoapregraves les fiches

techniques notre modegravele de Raspberry Pi (B 2) est officiellement eacutevalueacute avec un

fonctionnement agrave ~650mA pour 5V De nombreux proprieacutetaires de ce systegraveme

eacutequipeacutes se sont amuser agrave veacuterifier la consommation eacutelectrique reacuteelle de leur Pi 2 B

sous diffeacuterentes charges On pourra retenir cette eacutetude (lien en sitegraphie) qui

relegraveve la consommation en courant en fonction de lrsquoactiviteacute lanceacutee sur la Pi mais

aussi en charge sur 1 agrave 4 CPU

Ces chiffres sont releveacutes sur un systegraveme avec cameacutera connecteacutee HDMI connecteacute et

cacircble ethernet brancheacute et actif

On peut constater que globalement notre systegraveme Pi 2 B tournant sans

interface graphique sans composant suppleacutementaire sans sortie videacuteo ni cameacutera

avec plusieurs serveurs tournant tout en restant le plus leacuteger possible et demeurant

~99 idle la plupart du temps ne devrait pas deacutepasser une consommation de

300mA grand maximum

Fig 13 Un processeur tregraves tregraves peu chargeacute et une meacutemoire relativement libre

Nous avions lrsquoanneacutee derniegravere deacutejagrave reacutealiseacute un circuit permettant drsquoadapter un

panneau solaire sur une batterie USB classique de 9000mAh Nous avions alors pu

mesurer lrsquointensiteacute deacutelivreacutee par le panneau solaire En cas drsquoensoleillement moyen

habituel dans nos contreacutees le panneau solaire deacutebitait 400mA et pouvait atteindre

le double quand le soleil eacutetait directement preacutesent pour environ 800mA deacutebiteacute

Ce panneau solaire accompagneacute de son circuit drsquoadaptation devrait donc

suffire pour alimenter notre systegraveme la journeacutee le brancher ensuite sur une batterie

portable permet de stocker le surplus pour la nuit

Fig 14 le circuit drsquoadaptation

Fig 15 et son PCB

Eacutevolutions possibles

Webmail

Concernant les eacutevolutions possibles que nous aurions aimeacute apporter agrave notre

projet avec plus de temps commenccedilons par le web Nous aurions souhaiteacute apporter

la gestion de lrsquoenvoi de plusieurs piegraveces jointes comme nous lrsquoavons fait pour la

reacuteception

De plus nous aurions voulu inteacutegrer une corbeille ougrave lesmessages pourraient

aller avant drsquoecirctre deacutefinitivement supprimeacutes du systegraveme drsquoautant que nous avons

deacutejagrave eacutecrites les fonctions PHP permettant de retirer une en-tecircte drsquoun fichier JSON et

le fichier mail associeacute

Enfin nous aurions aimeacute en plus du blocage deacutejagrave preacutesent impleacutementer une

gestion plus profonde des piegravece jointes permettant notamment le remplissage de la

boicircte de spams

Systegraveme

Il aurait eacuteteacute inteacuteressant de notifier lrsquoexpeacutediteur lorsque le mail nrsquoa pas pu ecirctre

deacutelivreacute agrave un utilisateur lorsque son quota est plein En toute logique cela devrait ecirctre

fait simplement avec la commande Sendmail

Une meilleur gestion du trafic mail indeacutesirable aurait eacuteteacute la bienvenue En

effet malgreacute la limitation du spam il restera toujours une partie du volume de mail

qui sera indeacutesirable (pub pishing scam hellip)

Eacutetant donneacute la taille du systegraveme nous avions penseacute agrave une approche

ldquomachine learningrdquo Lrsquoutilisateur indiquerait pourquoi il considegravere le mail comme

indeacutesirable constituant des regravegles refusant certains mails Les mails provenant de

cet expeacutediteur pourraient ecirctre deacutetecteacute par le script agrave la reacuteception et

automatiquement envoyeacutes dans la boicircte de spams

Partie eacutenergeacutetique

Mecircme si la solution au panneau solaire ne pose aucun problegraveme en theacuteorie

nous aurions deacutejagrave dans un premier temps aimeacute lrsquoimpleacutementer en pratique Nous

nrsquoavons finalement pas reacutealiseacute notre objectif de deacutetecter deux cas drsquoalimentation

diffeacuterents soit lrsquoalimentation via panneau solaire est suffisante dans ce cas il

alimente la batterie et donc la Raspberry soit quand ce courant nrsquoest pas suffisant

on alimente la batterie par le secteur

Conclusion

En conclusion nous pensons avoir reacutepondu au cahier des charges initial dans

sa majeure partie Nous sommes aujourdrsquohui en mesure de proposer une solution

mail domestique priveacutee et personnalisable par un particulier

Notre installation de Debian a eacuteteacute au maximum alleacutegeacutee pour notre utilisation

sans interface graphique et nous avons mis en place une reacuteponse aux diverses

attaques que nous avons pu subir lors de lamise en place de notre solution logicielle

En outre le pare-feu avec notre systegraveme de liste noire bloque une partie des

attaques qui peuvent nous parvenir

Nos diffeacuterents scripts de pare-feu de gestion drsquoun mail entrant associeacute au

webmail permettent agrave un utilisateur drsquoacceacuteder aux fonctions usuelles associeacutees agrave

lrsquoenvoi et la reacuteception de mails

Gracircce agrave sa configuration personnalisable notre projet devrait pouvoir ecirctre

porteacute sur un domaine et une adresse IP diffeacuterente sans soucis et ecirctre deacuteployeacute

partout ougrave des gens souhaitent conserver leur vie priveacutee

Nous regretterons cependant de ne pas avoir exploiteacute la partie eacutenergeacutetique

de ce projet qui portait une probleacutematique inteacuteressante et qui nous parait importante

dans le monde actuel

Ce projet nous aura occupeacute pendant tregraves longtemps et nous sommes fiers du

travail que nous avons accompli Il est agrave nos yeux la preuve de ce que nous savons et

pouvons faire et nous donnera confiance pour notre deacutebut de carriegravere drsquoingeacutenieur

Sources

httpwwwradicaticomwpwp-contentuploads201401Email-Statistics-R

eport-2014-2018-Executive-Summarypdf

httpwwwcommentcamarchenetcontents525-le-protocole-ldap

httpsfrwikipediaorgwikiSimple_Mail_Transfer_Protocol

httpwwwcommentcamarchenetcontents536-pop3-smtp-imap-protocol

es-de-messagerie

httpstoolsietforghtmlrfc2821

httpsfrwikipediaorgwikiInternet_Message_Access_Protocol

httpstoolsietforghtmlrfc3501

httparstechnicacominformation-technology201402how-to-run-your-ow

n-e-mail-server-with-your-own-domain-part-1

httpswwwraspberrypiorgforumsviewtopicphpp=136912

httpstackoverflowcomquestions17394356how-can-i-make-a-bash-com

mand-run-periodically

httpuntroubledorgnullmailer

httpelinuxorgRPi_Hardware

httpraspitv2015raspberry-pi2-power-and-performance-measurement

Annexe 1 Architecture du systegraveme de fichiers

Annexe 2 Scan DNSSTUFF

Depuis httpwwwdnsstuffcomtoolsdnsReport|type=domainampampvalue=intimailpw

Annexe 3 Vue geacuteneacuterale httpswwwintimailpw

Annexe 4 Envoyer un mail

Annexe 5 Boite de reacuteception

Annexe 6 Interface drsquoadministration

Annexe 7 Gestion drsquoun utilisateur

Tutorial installation intimailtrade

Table des matiegraveres Apregraves une nouvelle installation de lrsquoOS 2

Seacutecurisation du serveur 2

Changement de lrsquoutilisateur par deacutefaut 2

Changement du port SSH 2

Interdire lrsquoauthentification SSH pour root 2

Installation de LDAP 3

Configuration de base 3

Configuration des Scheacutemas 4

Constitution de la base de donneacutees LDAP 5

Installation de Postfix 7

Installation de Bind9 8

Installation du paquet Debian et configuration de lighttpd 9

Deacutependances 11

Sources 12

2

Apregraves une nouvelle installation de lrsquoOS Exeacutecutez ces commandes pour mettre agrave jour agrave la derniegravere version Ces opeacuterations peuvent prendre un certain

temps Nous avons utiliseacute pour cet exemple Raspbian Jessie Lite sur une Raspberry Pi 2

apt-get update

apt-get upgrade ampamp apt-get dist-upgrade

apt-get install linux-headers-$(uname -r)

reboot

Puis lancer

raspi-config

Etendre au maximum lrsquoespace de stockage en navigant dans les menus

Expand Filesystem

Reacutegler une ip statique avec la box fichier etcnetworkinterfaces

iface eth0 inet static

address 192168131

netmask 2552552550

gateway 19216811

Nous avons aussi supprimeacute wpasupplicant

Seacutecurisation du serveur

Changement de lrsquoutilisateur par deacutefaut Changez le nom drsquoutilisateur par deacutefaut ainsi que son mot de passe

sudo passwd root

Sortie et login en tant que root puis

usermod -l myuname pi

usermod -m -d homemyuname myuname

groupmod ndashn myuname pi

passwd myuname

Voir cette adresse pour lrsquoutilisation de cleacutes priveacuteespubliques

Changement du port SSH sed ndashi sPort 22Port 2222g etcsshsshd_config

Interdire lrsquoauthentification SSH pour root sed -i sPermitRootLogin yesPermitRootLogin nog etcsshsshd_config

3

Installation de LDAP

Configuration de base Installation du package

apt-get install slapd

Choisir un mot de passe administrateur puis lancer la commande

dpkg-reconfigure slapd

Reacutepondre non agrave la question 1

Entrez le nom de domaine utiliseacute agrave la question 2 sous la forme domainetld

Entrez ce que vous voulez au 3egraveme eacutecran le nom de lrsquoorganisation ne sera pas utiliseacute

Entrez un mot de passe

Choisissez HDB

Choisissez si la base de donneacutees est supprimeacutee agrave la deacutesinstallation de slapd

Deacuteplacez lrsquoancienne base de donneacutees

Nrsquoutilisez pas LDAPv2

Installer les outils de conversion pour ldap (slaptest ldapmodify notamment)

apt-get install ldap-utils

On peut maintenant veacuterifier que la configuration est valable

ldapsearch -x -h localhost -b dc=domainedc=tld -LLL dc=domaine dn

Cette commande doit retourner quelque chose comme

dn dc=domainedc=tld

Il faut maintenant seacutecuriser le serveur LDAP en effet on peut y acceacuteder en anonyme avec la commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=config

(amp(objectClass=olcDatabaseConfig)(olcSuffix=dc=domainedc=tld))

Cette commande retourne un certain nombre drsquoinformations notamment agrave propos des champs suivants

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by none

olcAccess 1to dnbase= by read

olcAccess 2to by read

On va modifier ces champs avec la commande ldapmodify Pour cela on va creacuteer un fichier ldif

cat gt changeAccessldif ltlt EOF

dn olcDatabase=1hdbcn=config

changetype modify

delete olcAccess

-

add olcAccess

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by dn=cn=admindc=domainedc=tld write by none

-

add olcAccess

olcAccess 1to dnbase= by read

-

4

add olcAccess

olcAccess 2to by self write by dn=cn=admindc=domainedc=tld write by

none

-

EOF

On peut maintenant appliquer les changements avec ldapmodify

ldapmodify ndashc ndashY EXTERNAL ndashH ldapi -f changeAccessldif

La commande devrait vous confirmer que la modification srsquoest bien effectueacutee

SASLEXTERNAL authentication started

SASL username gidNumber=0+uidNumber=0cn=peercredcn=externalcn=auth

SASL SSF 0

modifying entry olcDatabase=1hdbcn=config

On peut veacuterifier qursquoon ne peut plus acceacuteder aux informations avec la commande

ldapsearch -x -c -h localhost -b dc=domainedc=tld

On peut veacuterifier la configuration en se connectant en tant qursquoadministrateur

ldapsearch -c -h localhost -b dc=domainedc=tld -D

cn=admindc=domainedc=tld ndashW

Configuration des Scheacutemas Nous allons utiliser les scheacutemas de courier-ldap Pour eacuteviter une manipulation compliqueacutee vous trouverez

directement le scheacutema avec le fichier authldapschema On place ce fichier dans le dossier

mv authldapschema etcldapschema

Nous creacuteons un fichier qui incluera tous les scheacutemas de base en plus du nouveau On peut les afficher avec la

commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

Creacuteation du fichier de configuration pour notre exemple cela donne

mkdir tmpldapconf

cat gt tmpldapconfldapconf ltlt EOF

include etcldapschemacoreschema

include etcldapschemacosineschema

include etcldapschemanisschema

include etcldapschemainetorgpersonschema

include etcldapschemaauthldapschema

EOF

On lance ensuite la commande

slaptest -f tmpldapconfldapconf -F tmpldapconf

Elle revoie un message de succegraves Cette commande a creacuteeacute dans le reacutepertoire tmpldapconf une arborescence

correspondant agrave la configuration de notre LDAP

On modifie le chemin de configuration

5

sed ndashi 0dnauthldap sauthldapauthldapcn=schemacn=config

cn=authldapldif

On supprime ensuite les 7 derniegraveres lignes du fichier

head -n -7 cn=authldapldif gt tmpldif

mv tmpldif cn=authldapldif

On peut maintenant importer notre fichier de configuration Pour ce faire

ldapadd -Y EXTERNAL -H ldapi -f

tmpldapconfcn=configcn=schemacn=authldapldif

Si tout va bien lrsquoentreacutee devrait avoir eacuteteacute ajouteacutee On peut veacuterifier avec la commande vue tout agrave lrsquoheure

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

On devrait voir en plus le nouveau scheacutema authldap

Constitution de la base de donneacutees LDAP Le remplissage de la base se fait agrave lrsquoaide de fichiers ldif Nous donnons ici un exemple de structure

Fichier pour la structure de base

dn dc=maildc=domainedc=tld

o intimailpw

description Global mail tree

dc mail

objectClass top

objectClass dcObject

objectClass organization

dn dc=peopledc=maildc=domainedc=tld

description Informations of all users

o people

dc people

objectClass top

objectClass dcObject

objectClass organization

dn dc=groupsdc=maildc=domainedc=tld

description All groups of users

o groups

dc groups

objectClass top

objectClass dcObject

objectClass organization

6

Fichier pour ajouter un utilisateur

dn cn=jbonddc=peopledc=maildc=domainedc=tld

uid jbond

mail jbonddomainetld

sn Moulin

givenName James

displayName James Bond

mailbox domainetldjbond

quota 50M

homeDirectory homevmail

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAccount

userPassword SSHA367PSXiUAegy8dpJbPU8OepEf8L5ye

Pour obtenir un hash du mot de passe

slappasswd -s password -h SSHA

On peut par la suite ajouter la configuration agrave la base de donneacutees avec la commande

ldapadd -D cn=admindc=domainedc=tld -W -h localhost -f pathtofile

Si les champs proposeacutes ne sont pas suffisants il faudra alors effectuer les modifications dans le fichier autldapschema

proposeacute plus haut et refaire la manipulation de configuration

De plus les standards du Mail deacutecrit par lrsquoIETF (RFC822 63 RFC1123 527 and RFC2821 451) impliquent drsquoavoir une

adresse Postmaster et une Abuse Pour cela nous pourrions creacuteer ces adresses avec la meacutethode vue au-dessus mais

ce nrsquoest pas la meilleure Il est preacutefeacuterable drsquoutiliser un alias comme nous le ferons avec les listes de diffusion Ici nous

proposons de rediriger ces deux adresses vers une adresse administrateur Pour cela la meacutethode est la mecircme sauf

que le fichier ldif nrsquoest pas tout agrave fait identique En voici un exemple

dn cn=postmasterdc=groupsdc=maildc=domainedc=tld

uid postmaster

mail postmasterdomainetld

sn Postmaster

displayName Postmaster

maildrop admindomainetld

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAlias

Pour faire une liste de diffusion la meacutethode est la mecircme Il suffit drsquoajouter toutes les adresses destinataires dans le

champ maildrop seacutepareacutees par des virgules ()

7

Installation de Postfix Installation des packages

apt-get install postfix postfix-ldap

Lors de lrsquoinstallation deux eacutecrans deacutefilent

- Configuration Internet Site

- Valeur par deacutefaut pour le mail name

On creacutee lrsquoutilisateur qui servira agrave exeacutecuter Postfix

groupadd vmail

useradd -g vmail -d homevmail -s binfalse -m vmail

Nous aurons besoin dans la suite des GID et UID creacuteeacutes agrave cet instant Ils peuvent ecirctre afficheacutes avec les commandes

cat etcgroup | grep vmail | cut -d -f3

cat etcpasswd | grep vmail | cut -d -f3

On ajoute les paramegravetres au fichier etcpostfixmaincf (remplacer les valeurs de GID et drsquoUID avec vos valeurs)

smtpd_banner = maildomainetld

virtual_mailbox_base = homevmail

virtual_mailbox_domains = dmainetld

virtual_mailbox_maps = ldapetcpostfixldap_accountscf

virtual_alias_maps = ldapetcpostfixldap_aliasescf

virtual_minimum_uid = 100

virtual_gid_maps = static1001 Remplacez ici par votre valeur de GID

virtual_uid_maps = static1001 Remplacez ici par votre valeur drsquoUID

Il nous faut maintenant constituer nos fichiers de configuration ldap_accountscf

cat gt etcpostfixldap_accountscf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=peopledc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAccount)(mail=s))

result_attribute = mailbox

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

Et pour ldap_aliasescf

cat gt ldap_aliasescf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=groupsdc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAlias)(mail=s))

result_attribute = maildrop

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

8

On peut maintenant veacuterifier la configuration de Postfix avec (cette commande ne doit rien retourner si crsquoest bon)

postfix check

Si crsquoest bon alors on recharge le serveur

postfix reload

On peut alors faire un envoi de mail test via telnet

telnet localhost 25

Si vous souhaitez deacutelivrer les mails agrave votre maniegravere il faut dans le fichier etcpostfixmaincf la ligne

virtual_transport = nomdevotreregle

Et de mecircme dans le fichier etcpostfixmastercf

nomdevotreregle unix - n n - 5 pipe

flags=Rq user=vmail null_sender=

argv=chemindevotreprogramme

Il nous reste maintenant agrave configurer les diffeacuterents enregistrements DNS neacutecessaire au fonctionnement drsquoun serveur

mail Vous pouvez utiliser la solution de votre choix Dans la suite vous trouverez une meacutethode utilisant Bind9

Installation de Bind9 Dans toute cette partie on se situera dans le dossier etcbind Dans la suite notre IP sera abcd

Dans le fichier namedconfoptions on ajoutera dans le champ options

version Not supported

Dans un dossier zones on eacutecrit le fichier dbdomainetld

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122111 Serial

43200 Refresh

3600 Retry

2419200 Expire

86400 ) Negative Cache TTL

IN NS nsdomainetld

IN NS ns11ovhnet

ns IN A abcd

www IN A abcd

IN A abcd

IN MX 10 maildomainetld

mail IN A abcd

Dans le mecircme dossier zones on a cbain-addrarpa

9

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122101 serial

14400 refresh

3600 retry

604800 expire

10800 minimum

)

cbain-addrarpa IN NS nsdomainetld

cbain-addrarpa IN NS ns11ovhnet

d IN PTR maildomainetld

Il faut faire attention agrave bien increacutementer le serial pour chaque modification des fichiers

Dans le fichier namedconflocal

zone domainetld

type master

file etcbindzonesdbdomainetld

allow-transfer 213251128130

notify yes

zone cbain-addrarpa IN

type master

file etcbindzonescbain-addrarpa

allow-transfer 213251128130

Ici 213251128130 est lrsquoadresse IP du serveur ns11ovhnet

Il faut bien sucircr configurer le DNS avec votre fournisseur (Gandi OVH hellip) Pour ccedila amusez-vous bien Vous pouvez

aussi tester votre configuration avec des outils en ligne tels que DNSstuff

En test final si votre configuration est bonne vous devriez pouvoir envoyer un mail depuis un service neutre (Gmail

yahoo hellip) et le voir dans votre arborescence (ici homevmaildomainetld)

Installation du paquet Debian et configuration de lighttpd

Commencez par reacutecupeacuterer le paquet deb agrave lrsquoadresse suivante httpswwwintimailpwintimaildeb

Installez ensuite GDebi Il srsquoagit drsquoun dpkg ameacutelioreacute pour teacuteleacutecharger les deacutependances automatiquement ce que

dpkg ne gegravere pas

apt-get update

apt-get install gdebi-core

10

Vous pouvez alors installer le paquet

gdebi intimaildeb

Vous aurez alors le site web drsquointiMail deacuteployeacute au chemin varwwwwebmail

Il ne vous reste plus qursquoagrave changer la configuration de lighttpd votre serveur web pour mettre en ligne le site

Vous pouvez pour cela copier-coller la configuration suivante mais veillez agrave bien changer lrsquoadresse IP preacutesente au

deacutebut de la partie SSL CONFIG avec votre adresse IP

serv ermodules = ( mod_access

mod_accesslog

mod_alias

mod_compress

mod_redirect

mod_rewrite

)

Hide server version

servertag = Such Headers Very try Now close telnet

serverdocument-root = varwwwwebmail

serverupload-dirs = ( varwwwwebmailuploads )

servererrorlog = varloglighttpderrorlog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

serverport = 80

accesslogformat = V h l u t r gts b Refereri

User-Agenti

accesslogfilename = varloglighttpdaccesslog

index-filenames = ( indexphp indexhtml

indexlighttpdhtml )

urlaccess-deny = ( ~ inc )

static-fileexclude-extensions = ( php pl fcgi )

compresscache-dir = varcachelighttpdcompress

compressfiletype = ( applicationjavascript textcss

texthtml textplain )

default listening port for IPv6 falls back to the IPv4 port

include_shell usrsharelighttpduse-ipv6pl + serverport

include_shell usrsharelighttpdcreate-mimeassignpl

include_shell usrsharelighttpdinclude-conf-enabledpl

SSL CONFIG

$SERVER[socket] == 5234485443

sslengine = enable

11

sslpemfile = etclighttpdsslintimailpwpem

sslca-file = etclighttpdsslintimailpwcrt

servername = intimailpw

votre configuration habituelle pour ce domaine

serverdocument-root = varwwwwebmail

servererrorlog = varloglighttpderror_ssllog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

Rewrite des URL pour masquer php

urlrewrite-once = ( ^()$ =gt $1 )

urlrewrite-if-not-file = ( ^([^])()$ =gt $1php$2 )

servernetwork-backend = writev

Deacutependances Slapd

Ldap-utils

Postfix

Postfix-ldap

Bind9

Lighttpd

12

Sources httpswikigandinetfrhostingusing-linuxtutorialsdebianmail-server-ldap

httpwwwpostfixorgpipe8html

httpwwwpostfixorgFILTER_READMEhtml

httpwwwpostfixorg

httpwwwpostfixorgtransport5html

Page 11: Système d'hébergement domestique...place sur les domaines .pw par Gandi.net, notre fournisseur. Nous n’avons donc pas pu l’implémenter. Nous avons configuré Postfix pour qu’il

geacuteneacuterale en 042s (Lighttpd) contre 170s avant (Apache 2) avec le navigateur

Chrome sans cache

Une architecture optimiseacutee

Lrsquoutiliteacute de reacutealiser notre propre webmail est dans un premier temps de

srsquoabstenir de lrsquoinstallation drsquoun serveur IMAPPOP puisque nous retrouvons

nous-mecircmes le contenu Dans un second temps il nous permet de ne garder que les

fonctionnaliteacutes neacutecessaires agrave notre webmail sans superflu

Fig 5 La vue geacuteneacuterale de notre webmail

Gracircce agrave PHP et agrave son module drsquointerface avec LDAP nous pouvons identifier

un utilisateur avec son nom drsquoutilisateur et son mot de passe sur le serveur local

LDAP et ainsi retrouver nombreuses informations utiles comme le quota actuel

autoriseacute son nom entier le chemin drsquoaccegraves agrave son reacutepertoire dans lesquels sont ses

mails sur le systegraveme de fichiershellip

Fig 6 Lrsquoarchitecture du dossier drsquoun utilisateur des dossier sent et inbox contenant les

mails bruts un dossier json dans lequel sont placeacutes les entecirctes des mails ainsi que le quota

Chaque en-tecircte de mail est eacutecrite dans un fichier json distinct par boicircte (un

fichier pour la boicircte de reacuteception un fichier pour les mails envoyeacuteshellip) ce qui nous

permet de montrer agrave lutilisateur la liste des mails dune boicircte sans traitement lourds

en arriegravere plan pour le serveur Ces fichiers sont renseigneacutes par un script lanceacute agrave la

reacuteception drsquoun mail par postfix du cocircteacute reacuteception et par lrsquointerface web elle mecircme

pour lrsquoeacutemission Lrsquoen-tecircte drsquoun mail est eacutecrite dans un conteneur JSONde lamaniegravere

suivante

Fig 7 Exemple drsquoentreacutee dans un fichier json

Gracircce tout cela nous pouvons afficher simplement le contenu des diffeacuterentes

boicirctes mail dans des tableaux sur lrsquointerface gracircce aux en-tecirctes et par la suite

retrouver et afficher le contenu drsquoun mail agrave partir de son fichier brut sur lequel

lrsquoutilisateur aura cliqueacute comme on le verra un peu plus loin

Toujours dans un souci drsquoameacutelioration des performances le strict neacutecessaire

est geacuteneacuteralement chargeacute sur les pages web par exemple en venant de la vue

geacuteneacuterale lorsqursquoon clique surInboxseule la partie inteacuterieure de la page est chargeacutee

on ne recharge pas le bandeau du haut de page ou lemenu de gauche agrave lamaniegravere

drsquoun MVC classique

Envoyer des courriels

Toute cette architecture ne doit pas nous faire oublier le but premier envoyer

et recevoir des mails Pour envoyer des mails crsquoest tregraves simple on peut soit cliquer

dans le bandeau du haut sur ldquoQuick Emailrdquo qui permet sur lamecircme page drsquoenvoyer

un email rapide et sans piegravece-jointe soit cliquer dans la barre de navigation sur le

cocircteacute sur ldquoWrite a new emailrdquo ce qui nous megravene vers une page deacutedieacutee permettant

drsquoeacutecrire un email incluant une piegravece jointe

Fig 8 Envoyer un mail crsquoest simple comme bonjour

On peut remarquer sur cette capture drsquoeacutecran que lrsquoon ne peut envoyer que

certains types de piegraveces jointes Nous supportons JPG PNG GIF PDF et ZIP Si la

piegravece jointe est drsquoun autre format elle est rejeteacutee La veacuterification du type srsquoeffectue

sur lrsquoextension du fichier et sur son type MIME ce qui eacutevite par exemple que

quelqursquoun modifie lrsquoextension drsquoun fichierexe en fichierjpg pour lrsquoenvoyer La piegravece

jointe doit de plus avoir une taille infeacuterieure agrave la taille maximale drsquoune piegravece jointe

parameacutetreacutee par lrsquoadministrateur comme nous le verrons dans lrsquointerface

drsquoadministration

Si tous ces critegraveres sont bons on eacutecrit lemail au format brut deacutecrit par la RFC

puis on lrsquoexpeacutedie agrave lrsquoaide de la fonction mail de PHP Si cette fonction nrsquoeacutechoue pas

crsquoest que le mail est expeacutedieacute avec succegraves on peut alors mettre agrave jour le quota

drsquoespace disque maximum autoriseacute agrave lrsquoutilisateur en increacutementant celui-ci avec la

taille du mail qui vient drsquoecirctre envoyeacute ainsi que creacuteer un fichiermail brut sur le disque

pour pouvoir afficher le mail dans la boicircte drsquoenvoi et en garder une trace

Notons que comme crsquoest lrsquoutilisateur web du systegraveme (www-data) qui exeacutecute

la fonction nous modifions les en-tecirctes du mail afin que le destinataire reccediloive un

mail de la part de ldquoPreacutenom Nomrdquo depuis lrsquoadresse ldquopnomdomainetldrdquo plutocirct que

ldquowww-datadomaintldrdquo par deacutefaut

La migration vers une IP externe agrave Lille 1 eacutetant reacuteussie nous pouvons bien

envoyer des mails depuis notre interface qui sont reccedilus agrave lrsquoexteacuterieur sans soucis

Mais aussi en recevoir

Recevoir des mails est tout aussi important Nous avons vu lrsquoarchitecture en

arriegravere-plan mais au final agrave quoi cela ressemble-t-il pour lrsquoutilisateur Il dispose en

fait en cliquant sur Inbox (ou Sent Spam ou Trash eacutegalement) drsquoun accegraves agrave sa boicircte

de reacuteception Drsquoun clic srsquoaffichent alors agrave lui tous les mails qursquoil a reccedilu

Fig 9 La boicircte de reacuteception

On remarque notamment les fonctions de recherche drsquoactualisation du

tableau de choix des colonnes agrave afficher on peut classiquement choisir combien de

lignes on affiche par page changer de pages etchellip

Lorsque lrsquoon clique sur un des lignes les donneacutees de lrsquoen-tecircte du mails sont

passeacutes en paramegravetres agrave une autre page qui drsquoapregraves ces informations retrouve le

fichier mail brut le traite et lrsquoaffiche

Fig 10 Un mail contenant 3 piegraveces jointes et un message

Comme on peut le voir nous pouvons recevoir desmails avec plusieurs piegraveces

jointes Nous avons ici preacutesenteacute la boicircte de reacuteception mais les autres boicirctes

fonctionnent de maniegravere similaire

Interface drsquoadministration

Le systegraveme de webmail possegravede plusieurs variables des listes de diffusion

des compteshellipMais on veut pouvoir donner les droits agrave un utilisateur demodifier tout

cela En effet si nous trouvons cela abordable drsquoajouter un utilisateur avec une

commande dans le shell il faut aussi penser agrave lrsquoutilisateur final qui preacutefegravere peut-ecirctre

le confort drsquoune interface deacutedieacutee pour geacuterer son serveur mail plutocirct que le terminal

De maniegravere tregraves simple un utilisateur appartenant au groupes drsquoutilisateurs

ldquoAdministrateursrdquo est reconnu en tant qursquoadministrateur par lrsquointerface et peut

cliquer sur un bouton ldquoManagerdquo dans le panneau lateacuteral qui nrsquoest visible qursquoaux

administrateurs De lagrave il arrive sur la page suivante

Fig 11 lrsquointerface drsquoadministration

Sur cette interface il peut choisir la taille maximale des piegraveces jointes

changer le nom de domaine sur lequel est installeacute lrsquointerface et dont deacutependent

toutes les adresses (domaine) Il est aussi possible de modifier directement ces

variables en modifiant le fichier includeconfigincphp Pratique notamment si lrsquoon

a renseigneacute un mauvais nom de domaine agrave la configuration et que lrsquoon arrive plus agrave

acceacuteder agrave lrsquointerface

Il peut aussi creacuteer un nouveau compte en renseignant les champs preacutenom

nom mot de passe et quota Lrsquoutilisateur peut ensuite une fois son compte creacutee

directement se connecter avec son identifiant (initiale preacutenom + nom) et mot de

passe Lors de la creacuteation du compte un mail de bienvenue est envoyeacute au nouvel

utilisateur ce qui permet en arriegravere-plan de creacuteer tous les dossiers utilisateurs et

fichiers en-tecirctes utiles agrave lrsquointerface une fois pour toutes

Lrsquoadministrateur peut aussi ajouter une liste de diffusion (assimileacutee agrave un

groupe) ou en supprimer une parmi les listes existantes

En outre lrsquoadministrateur peut aussi modifier les donneacutees drsquoun utilisateur

Pour cela sur la preacutesente page il peut seacutelectionner un utilisateur parmi la liste des

utilisateurs existants ce qui le redirige vers la page de gestion des comptes

Fig 12 La gestion drsquoun compte seacutelectionneacute ici celui de James Bond

A ce stade il peut changer lrsquoUID de lrsquoutilisateur (utile en cas de conflit) le nom

le mot de passe le quota de cet utilisateur et lrsquoajouter ou le retirer drsquoune liste de

diffusion Accessoirement il peut aussi supprimer le compte en cliquant sur lrsquoeacutenorme

bouton rouge qui lui demandera deux fois de suite de confirmer son action afin

drsquoeacuteviter les erreurs de clic Cette action entraicircne la suppression de lrsquoutilisateur de

toutes les listes de diffusion auxquelles il appartient la suppression de son compte

dans la branche people de lrsquoarbre LDAP et la suppression deacutefinitive de son dossier

utilisateur sur le disquesystegraveme de fichiers impliquant donc la perte de ses mails

Architecture du systegraveme de fichiers

Comme nous lrsquoavons dit plus haut lrsquoideacutee est de se passer des meacutecanismes

classiques avec les clients mails habituels Ces serveurs srsquoalourdissent

geacuteneacuteralement en utilisant des serveurs IMAPPOP3 et un meacutecanisme

drsquoauthentification SMTP

Pour adapter ces fonctionnaliteacutes agrave notre systegraveme nous avons donc constitueacute

une architecture pour organiser les fichiers qui transitent Vous pourrez voir un

scheacutema reacutecapitulatif en annexe 1

Dans la premiegravere moitieacute du projet les mails eacutetaient deacutelivreacutes par Postfix Nous

utilisions un script exeacutecuteacute lors de la reacuteception drsquounmail pour les traiter de lamaniegravere

que nous voulions Cette meacutethode avait les inconveacutenients drsquoecirctre lourde et pas

efficace agrave 100 En effet seuls les mails reccedilus depuis lrsquoexteacuterieur eacutetaient

correctement traiteacutes

Deacutesormais les mails sont traiteacutes totalement par notre script Cela nous

permet de geacuterer les mails dans des dossiers organiseacutes agrave notre maniegravere et de

recevoir les mails locaux crsquoest-agrave-dire entre utilisateurs du mecircme domaine Cette

nouvelle meacutethode regravegle aussi drsquoautres problegravemes notamment au niveau des

permissions sur les fichiers

Pour reacuteduire le nombre drsquoopeacuterations et pour profiter des fonctionnaliteacutes

offertes par le framework utiliseacute pour lrsquointerface web nous regroupons des

informations sur chacun des mails reccedilus sous la forme de fichiers JSON Pour ce

faire lrsquoideacutee est drsquoexeacutecuter un script lorsque leacutevegravenement ldquoreacuteception drsquoun mailrdquo

survient Postfix offre cette possibiliteacute dans sa configuration Or il se trouve qursquoil nrsquoest

pas si simple de reacutecupeacuterer le chemin du fichier contenant le mail car le nom du

fichier creacutee est sous la forme Timestamp UNIX10 Caractegraveres aleacuteatoires (ex

14562336185A8D43E97F)

La seconde probleacutematique est que le webmail doit avoir la possibiliteacute de

pouvoir lire les fichiers pour afficher les mails sur son interface Or il semble que

Postfix les eacutecrit en autorisant uniquement son utilisateur en lecture Il nous a fallu

trouver une solution pour remeacutedier agrave cela Nous avons choisi drsquoajouter www-data

(utilisateur du serveur web) au groupe vmail et de modifier les droits sur les fichiers

de sorte que les utilisateurs de ce groupe puissent lire les fichiers

Nous avons revu une partie de lrsquoorganisation des fichiers pour reacutecupeacuterer les

piegraveces jointes si elles sont preacutesentes Le script que nous avons eacutecrit reacutecupegravere le

fichier original du mail et le deacutecoupe en eacuteleacutements simples dans des fichier distincts

corps du mail et diffeacuterentes piegraveces jointes De cette maniegravere pour afficher un mail

nous nrsquoavons pas besoin de charger la totaliteacute du fichier Dans le cas ougrave il y a des

piegraveces jointes cela aurait ralenti lrsquoaffichage des informations

Nous avons eacutegalement impleacutementeacute la gestion des quotas Dans lrsquoeacutetat actuel

des choses srsquoil nrsquoy a plus de place disponible pour lrsquoutilisateur le mail nrsquoest tout

bonnement pas deacutelivreacute agrave ce destinataire Lrsquoideacuteal aurait eacuteteacute de notifier leacutemetteur avec

un mail ce qui nrsquoest pour lrsquoinstant pas le cas mais qui pourrait ecirctre reacutesolu en

renvoyant agrave postfix un code drsquoerreur deacutefini

Pour terminer nous avons revu la totaliteacute du code deacuteveloppeacute Nous sommes

passeacute du Bash au Perl Ce dernier est plus performant et plus simple agrave utiliser et agrave

lire

Firewall

Un autre gros morceau du projet mais qui nrsquoest pas speacutecifiquement lieacute agrave la

probleacutematique du mail crsquoest la seacutecurisation du serveur En effet apregraves avoir mis en

ligne notre serveur des pirates ont tregraves vite tenteacute de peacuteneacutetrer le systegraveme

Globalement les attaques eacutetaient de type force brute sur les services heacutebergeacutes sur

notre Raspberry neacutecessitant une identification tels que SSH SMTP hellip

On retrouve ici un petit point faible du protocole SMTP Eacutetant donneacute que

chaque serveur mail doit avoir une adresse postmaster et abuse lrsquoattaquant a agrave sa

disposition deux adresses agrave attaquer Ceci dit ce type drsquoattaque est simple agrave

contrecarrer car il suffit de limiter dans le temps le nombre de tentatives de

connexions

La contre-mesure que nous avons mis en place est simple une seacuterie de

regravegles Iptables En reacutesumeacute nous avons opteacute pour un systegraveme de liste blanche et

noire Les adresses IPs de la liste blanche sont autoriseacutees agrave utiliser la totaliteacute des

services (notamment SSH) tandis que celles de la liste noire sont totalement

ignoreacutees Les autres IPs nrsquoont accegraves qursquoau webmail

Eacutetant donneacute que le nombre drsquoIPs attaquant notre serveur nrsquoa cesseacute

drsquoaugmenter nous avons automatiseacute la mise agrave jour de la liste de noire en

deacuteveloppant un script pour Cron Ce script est exeacutecuteacute une fois par heure A ce jour

notre liste noire contient 47 adresses Bien sucircr ce systegraveme est susceptible drsquoecirctre

modifieacute agrave convenance pour passer sur une solution deacutedieacutee telle que Fail2ban qui fait

en fait ce qursquoon fait deacutejagrave (eacutetudier les logs et bannir des IP avec iptables) avec des

regravegles preacutedeacutefinies par la communauteacute et personnalisables En effet nous nous

attendons agrave voir la varieacuteteacute et le nombre drsquoattaques augmenter apregraves avoir migreacute sur

une IP non proteacutegeacutee par le firewall de lrsquoUniversiteacute puisque nous nrsquoavons plus la

premiegravere ligne de deacutefense du CRI en particulier pour le port 389 (LDAP) qui eacutetait

bloqueacute par lrsquouniversiteacute et srsquoest retrouveacute en premiegravere ligne apregraves la migration Nous

avons donc ajouteacute une regravegle bloquant tout le trafic entrant vers le port 389 hormis

localhost

Package drsquoinstallation

Nous avons creacutee un package deb contenant les sources du webmail ainsi

que des scripts utiles agrave lrsquoinstallation et au fonctionnement du serveur Nous avons

deacuteveloppeacute des scripts de configuration automatique pour LDAP et Postfix Comme

dpkg ne supporte pas directement lrsquoinstallation automatique des deacutependances

nous recommandons drsquoinstaller avant tout le paquet gdebi-core qui est en fait un

dpkg ameacutelioreacute Gracircce agrave la commande gdebi paquetdeb toutes les deacutependances

seront installeacutees en particulier postfix le serveur ldap le serveur web lighttpd entre

autres sans soucis Il est agrave noter que comme les scripts de configuration des

diffeacuterents services ne sont que partiellement impleacutementeacutes dans le paquet deb nous

fournissons en annexe un README complet et illustreacute qui explique pas agrave pas

comment faire fonctionner notre systegraveme sur nrsquoimporte quel Linux en particulier les

lignes de configuration des diffeacuterents services agrave changer et un exemplaire des

fichiers de configuration fonctionnels de ces services

Gestion de lrsquoeacutenergie

Une consideacuteration importante pour un systegraveme autonome Drsquoapregraves les fiches

techniques notre modegravele de Raspberry Pi (B 2) est officiellement eacutevalueacute avec un

fonctionnement agrave ~650mA pour 5V De nombreux proprieacutetaires de ce systegraveme

eacutequipeacutes se sont amuser agrave veacuterifier la consommation eacutelectrique reacuteelle de leur Pi 2 B

sous diffeacuterentes charges On pourra retenir cette eacutetude (lien en sitegraphie) qui

relegraveve la consommation en courant en fonction de lrsquoactiviteacute lanceacutee sur la Pi mais

aussi en charge sur 1 agrave 4 CPU

Ces chiffres sont releveacutes sur un systegraveme avec cameacutera connecteacutee HDMI connecteacute et

cacircble ethernet brancheacute et actif

On peut constater que globalement notre systegraveme Pi 2 B tournant sans

interface graphique sans composant suppleacutementaire sans sortie videacuteo ni cameacutera

avec plusieurs serveurs tournant tout en restant le plus leacuteger possible et demeurant

~99 idle la plupart du temps ne devrait pas deacutepasser une consommation de

300mA grand maximum

Fig 13 Un processeur tregraves tregraves peu chargeacute et une meacutemoire relativement libre

Nous avions lrsquoanneacutee derniegravere deacutejagrave reacutealiseacute un circuit permettant drsquoadapter un

panneau solaire sur une batterie USB classique de 9000mAh Nous avions alors pu

mesurer lrsquointensiteacute deacutelivreacutee par le panneau solaire En cas drsquoensoleillement moyen

habituel dans nos contreacutees le panneau solaire deacutebitait 400mA et pouvait atteindre

le double quand le soleil eacutetait directement preacutesent pour environ 800mA deacutebiteacute

Ce panneau solaire accompagneacute de son circuit drsquoadaptation devrait donc

suffire pour alimenter notre systegraveme la journeacutee le brancher ensuite sur une batterie

portable permet de stocker le surplus pour la nuit

Fig 14 le circuit drsquoadaptation

Fig 15 et son PCB

Eacutevolutions possibles

Webmail

Concernant les eacutevolutions possibles que nous aurions aimeacute apporter agrave notre

projet avec plus de temps commenccedilons par le web Nous aurions souhaiteacute apporter

la gestion de lrsquoenvoi de plusieurs piegraveces jointes comme nous lrsquoavons fait pour la

reacuteception

De plus nous aurions voulu inteacutegrer une corbeille ougrave lesmessages pourraient

aller avant drsquoecirctre deacutefinitivement supprimeacutes du systegraveme drsquoautant que nous avons

deacutejagrave eacutecrites les fonctions PHP permettant de retirer une en-tecircte drsquoun fichier JSON et

le fichier mail associeacute

Enfin nous aurions aimeacute en plus du blocage deacutejagrave preacutesent impleacutementer une

gestion plus profonde des piegravece jointes permettant notamment le remplissage de la

boicircte de spams

Systegraveme

Il aurait eacuteteacute inteacuteressant de notifier lrsquoexpeacutediteur lorsque le mail nrsquoa pas pu ecirctre

deacutelivreacute agrave un utilisateur lorsque son quota est plein En toute logique cela devrait ecirctre

fait simplement avec la commande Sendmail

Une meilleur gestion du trafic mail indeacutesirable aurait eacuteteacute la bienvenue En

effet malgreacute la limitation du spam il restera toujours une partie du volume de mail

qui sera indeacutesirable (pub pishing scam hellip)

Eacutetant donneacute la taille du systegraveme nous avions penseacute agrave une approche

ldquomachine learningrdquo Lrsquoutilisateur indiquerait pourquoi il considegravere le mail comme

indeacutesirable constituant des regravegles refusant certains mails Les mails provenant de

cet expeacutediteur pourraient ecirctre deacutetecteacute par le script agrave la reacuteception et

automatiquement envoyeacutes dans la boicircte de spams

Partie eacutenergeacutetique

Mecircme si la solution au panneau solaire ne pose aucun problegraveme en theacuteorie

nous aurions deacutejagrave dans un premier temps aimeacute lrsquoimpleacutementer en pratique Nous

nrsquoavons finalement pas reacutealiseacute notre objectif de deacutetecter deux cas drsquoalimentation

diffeacuterents soit lrsquoalimentation via panneau solaire est suffisante dans ce cas il

alimente la batterie et donc la Raspberry soit quand ce courant nrsquoest pas suffisant

on alimente la batterie par le secteur

Conclusion

En conclusion nous pensons avoir reacutepondu au cahier des charges initial dans

sa majeure partie Nous sommes aujourdrsquohui en mesure de proposer une solution

mail domestique priveacutee et personnalisable par un particulier

Notre installation de Debian a eacuteteacute au maximum alleacutegeacutee pour notre utilisation

sans interface graphique et nous avons mis en place une reacuteponse aux diverses

attaques que nous avons pu subir lors de lamise en place de notre solution logicielle

En outre le pare-feu avec notre systegraveme de liste noire bloque une partie des

attaques qui peuvent nous parvenir

Nos diffeacuterents scripts de pare-feu de gestion drsquoun mail entrant associeacute au

webmail permettent agrave un utilisateur drsquoacceacuteder aux fonctions usuelles associeacutees agrave

lrsquoenvoi et la reacuteception de mails

Gracircce agrave sa configuration personnalisable notre projet devrait pouvoir ecirctre

porteacute sur un domaine et une adresse IP diffeacuterente sans soucis et ecirctre deacuteployeacute

partout ougrave des gens souhaitent conserver leur vie priveacutee

Nous regretterons cependant de ne pas avoir exploiteacute la partie eacutenergeacutetique

de ce projet qui portait une probleacutematique inteacuteressante et qui nous parait importante

dans le monde actuel

Ce projet nous aura occupeacute pendant tregraves longtemps et nous sommes fiers du

travail que nous avons accompli Il est agrave nos yeux la preuve de ce que nous savons et

pouvons faire et nous donnera confiance pour notre deacutebut de carriegravere drsquoingeacutenieur

Sources

httpwwwradicaticomwpwp-contentuploads201401Email-Statistics-R

eport-2014-2018-Executive-Summarypdf

httpwwwcommentcamarchenetcontents525-le-protocole-ldap

httpsfrwikipediaorgwikiSimple_Mail_Transfer_Protocol

httpwwwcommentcamarchenetcontents536-pop3-smtp-imap-protocol

es-de-messagerie

httpstoolsietforghtmlrfc2821

httpsfrwikipediaorgwikiInternet_Message_Access_Protocol

httpstoolsietforghtmlrfc3501

httparstechnicacominformation-technology201402how-to-run-your-ow

n-e-mail-server-with-your-own-domain-part-1

httpswwwraspberrypiorgforumsviewtopicphpp=136912

httpstackoverflowcomquestions17394356how-can-i-make-a-bash-com

mand-run-periodically

httpuntroubledorgnullmailer

httpelinuxorgRPi_Hardware

httpraspitv2015raspberry-pi2-power-and-performance-measurement

Annexe 1 Architecture du systegraveme de fichiers

Annexe 2 Scan DNSSTUFF

Depuis httpwwwdnsstuffcomtoolsdnsReport|type=domainampampvalue=intimailpw

Annexe 3 Vue geacuteneacuterale httpswwwintimailpw

Annexe 4 Envoyer un mail

Annexe 5 Boite de reacuteception

Annexe 6 Interface drsquoadministration

Annexe 7 Gestion drsquoun utilisateur

Tutorial installation intimailtrade

Table des matiegraveres Apregraves une nouvelle installation de lrsquoOS 2

Seacutecurisation du serveur 2

Changement de lrsquoutilisateur par deacutefaut 2

Changement du port SSH 2

Interdire lrsquoauthentification SSH pour root 2

Installation de LDAP 3

Configuration de base 3

Configuration des Scheacutemas 4

Constitution de la base de donneacutees LDAP 5

Installation de Postfix 7

Installation de Bind9 8

Installation du paquet Debian et configuration de lighttpd 9

Deacutependances 11

Sources 12

2

Apregraves une nouvelle installation de lrsquoOS Exeacutecutez ces commandes pour mettre agrave jour agrave la derniegravere version Ces opeacuterations peuvent prendre un certain

temps Nous avons utiliseacute pour cet exemple Raspbian Jessie Lite sur une Raspberry Pi 2

apt-get update

apt-get upgrade ampamp apt-get dist-upgrade

apt-get install linux-headers-$(uname -r)

reboot

Puis lancer

raspi-config

Etendre au maximum lrsquoespace de stockage en navigant dans les menus

Expand Filesystem

Reacutegler une ip statique avec la box fichier etcnetworkinterfaces

iface eth0 inet static

address 192168131

netmask 2552552550

gateway 19216811

Nous avons aussi supprimeacute wpasupplicant

Seacutecurisation du serveur

Changement de lrsquoutilisateur par deacutefaut Changez le nom drsquoutilisateur par deacutefaut ainsi que son mot de passe

sudo passwd root

Sortie et login en tant que root puis

usermod -l myuname pi

usermod -m -d homemyuname myuname

groupmod ndashn myuname pi

passwd myuname

Voir cette adresse pour lrsquoutilisation de cleacutes priveacuteespubliques

Changement du port SSH sed ndashi sPort 22Port 2222g etcsshsshd_config

Interdire lrsquoauthentification SSH pour root sed -i sPermitRootLogin yesPermitRootLogin nog etcsshsshd_config

3

Installation de LDAP

Configuration de base Installation du package

apt-get install slapd

Choisir un mot de passe administrateur puis lancer la commande

dpkg-reconfigure slapd

Reacutepondre non agrave la question 1

Entrez le nom de domaine utiliseacute agrave la question 2 sous la forme domainetld

Entrez ce que vous voulez au 3egraveme eacutecran le nom de lrsquoorganisation ne sera pas utiliseacute

Entrez un mot de passe

Choisissez HDB

Choisissez si la base de donneacutees est supprimeacutee agrave la deacutesinstallation de slapd

Deacuteplacez lrsquoancienne base de donneacutees

Nrsquoutilisez pas LDAPv2

Installer les outils de conversion pour ldap (slaptest ldapmodify notamment)

apt-get install ldap-utils

On peut maintenant veacuterifier que la configuration est valable

ldapsearch -x -h localhost -b dc=domainedc=tld -LLL dc=domaine dn

Cette commande doit retourner quelque chose comme

dn dc=domainedc=tld

Il faut maintenant seacutecuriser le serveur LDAP en effet on peut y acceacuteder en anonyme avec la commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=config

(amp(objectClass=olcDatabaseConfig)(olcSuffix=dc=domainedc=tld))

Cette commande retourne un certain nombre drsquoinformations notamment agrave propos des champs suivants

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by none

olcAccess 1to dnbase= by read

olcAccess 2to by read

On va modifier ces champs avec la commande ldapmodify Pour cela on va creacuteer un fichier ldif

cat gt changeAccessldif ltlt EOF

dn olcDatabase=1hdbcn=config

changetype modify

delete olcAccess

-

add olcAccess

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by dn=cn=admindc=domainedc=tld write by none

-

add olcAccess

olcAccess 1to dnbase= by read

-

4

add olcAccess

olcAccess 2to by self write by dn=cn=admindc=domainedc=tld write by

none

-

EOF

On peut maintenant appliquer les changements avec ldapmodify

ldapmodify ndashc ndashY EXTERNAL ndashH ldapi -f changeAccessldif

La commande devrait vous confirmer que la modification srsquoest bien effectueacutee

SASLEXTERNAL authentication started

SASL username gidNumber=0+uidNumber=0cn=peercredcn=externalcn=auth

SASL SSF 0

modifying entry olcDatabase=1hdbcn=config

On peut veacuterifier qursquoon ne peut plus acceacuteder aux informations avec la commande

ldapsearch -x -c -h localhost -b dc=domainedc=tld

On peut veacuterifier la configuration en se connectant en tant qursquoadministrateur

ldapsearch -c -h localhost -b dc=domainedc=tld -D

cn=admindc=domainedc=tld ndashW

Configuration des Scheacutemas Nous allons utiliser les scheacutemas de courier-ldap Pour eacuteviter une manipulation compliqueacutee vous trouverez

directement le scheacutema avec le fichier authldapschema On place ce fichier dans le dossier

mv authldapschema etcldapschema

Nous creacuteons un fichier qui incluera tous les scheacutemas de base en plus du nouveau On peut les afficher avec la

commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

Creacuteation du fichier de configuration pour notre exemple cela donne

mkdir tmpldapconf

cat gt tmpldapconfldapconf ltlt EOF

include etcldapschemacoreschema

include etcldapschemacosineschema

include etcldapschemanisschema

include etcldapschemainetorgpersonschema

include etcldapschemaauthldapschema

EOF

On lance ensuite la commande

slaptest -f tmpldapconfldapconf -F tmpldapconf

Elle revoie un message de succegraves Cette commande a creacuteeacute dans le reacutepertoire tmpldapconf une arborescence

correspondant agrave la configuration de notre LDAP

On modifie le chemin de configuration

5

sed ndashi 0dnauthldap sauthldapauthldapcn=schemacn=config

cn=authldapldif

On supprime ensuite les 7 derniegraveres lignes du fichier

head -n -7 cn=authldapldif gt tmpldif

mv tmpldif cn=authldapldif

On peut maintenant importer notre fichier de configuration Pour ce faire

ldapadd -Y EXTERNAL -H ldapi -f

tmpldapconfcn=configcn=schemacn=authldapldif

Si tout va bien lrsquoentreacutee devrait avoir eacuteteacute ajouteacutee On peut veacuterifier avec la commande vue tout agrave lrsquoheure

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

On devrait voir en plus le nouveau scheacutema authldap

Constitution de la base de donneacutees LDAP Le remplissage de la base se fait agrave lrsquoaide de fichiers ldif Nous donnons ici un exemple de structure

Fichier pour la structure de base

dn dc=maildc=domainedc=tld

o intimailpw

description Global mail tree

dc mail

objectClass top

objectClass dcObject

objectClass organization

dn dc=peopledc=maildc=domainedc=tld

description Informations of all users

o people

dc people

objectClass top

objectClass dcObject

objectClass organization

dn dc=groupsdc=maildc=domainedc=tld

description All groups of users

o groups

dc groups

objectClass top

objectClass dcObject

objectClass organization

6

Fichier pour ajouter un utilisateur

dn cn=jbonddc=peopledc=maildc=domainedc=tld

uid jbond

mail jbonddomainetld

sn Moulin

givenName James

displayName James Bond

mailbox domainetldjbond

quota 50M

homeDirectory homevmail

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAccount

userPassword SSHA367PSXiUAegy8dpJbPU8OepEf8L5ye

Pour obtenir un hash du mot de passe

slappasswd -s password -h SSHA

On peut par la suite ajouter la configuration agrave la base de donneacutees avec la commande

ldapadd -D cn=admindc=domainedc=tld -W -h localhost -f pathtofile

Si les champs proposeacutes ne sont pas suffisants il faudra alors effectuer les modifications dans le fichier autldapschema

proposeacute plus haut et refaire la manipulation de configuration

De plus les standards du Mail deacutecrit par lrsquoIETF (RFC822 63 RFC1123 527 and RFC2821 451) impliquent drsquoavoir une

adresse Postmaster et une Abuse Pour cela nous pourrions creacuteer ces adresses avec la meacutethode vue au-dessus mais

ce nrsquoest pas la meilleure Il est preacutefeacuterable drsquoutiliser un alias comme nous le ferons avec les listes de diffusion Ici nous

proposons de rediriger ces deux adresses vers une adresse administrateur Pour cela la meacutethode est la mecircme sauf

que le fichier ldif nrsquoest pas tout agrave fait identique En voici un exemple

dn cn=postmasterdc=groupsdc=maildc=domainedc=tld

uid postmaster

mail postmasterdomainetld

sn Postmaster

displayName Postmaster

maildrop admindomainetld

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAlias

Pour faire une liste de diffusion la meacutethode est la mecircme Il suffit drsquoajouter toutes les adresses destinataires dans le

champ maildrop seacutepareacutees par des virgules ()

7

Installation de Postfix Installation des packages

apt-get install postfix postfix-ldap

Lors de lrsquoinstallation deux eacutecrans deacutefilent

- Configuration Internet Site

- Valeur par deacutefaut pour le mail name

On creacutee lrsquoutilisateur qui servira agrave exeacutecuter Postfix

groupadd vmail

useradd -g vmail -d homevmail -s binfalse -m vmail

Nous aurons besoin dans la suite des GID et UID creacuteeacutes agrave cet instant Ils peuvent ecirctre afficheacutes avec les commandes

cat etcgroup | grep vmail | cut -d -f3

cat etcpasswd | grep vmail | cut -d -f3

On ajoute les paramegravetres au fichier etcpostfixmaincf (remplacer les valeurs de GID et drsquoUID avec vos valeurs)

smtpd_banner = maildomainetld

virtual_mailbox_base = homevmail

virtual_mailbox_domains = dmainetld

virtual_mailbox_maps = ldapetcpostfixldap_accountscf

virtual_alias_maps = ldapetcpostfixldap_aliasescf

virtual_minimum_uid = 100

virtual_gid_maps = static1001 Remplacez ici par votre valeur de GID

virtual_uid_maps = static1001 Remplacez ici par votre valeur drsquoUID

Il nous faut maintenant constituer nos fichiers de configuration ldap_accountscf

cat gt etcpostfixldap_accountscf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=peopledc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAccount)(mail=s))

result_attribute = mailbox

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

Et pour ldap_aliasescf

cat gt ldap_aliasescf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=groupsdc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAlias)(mail=s))

result_attribute = maildrop

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

8

On peut maintenant veacuterifier la configuration de Postfix avec (cette commande ne doit rien retourner si crsquoest bon)

postfix check

Si crsquoest bon alors on recharge le serveur

postfix reload

On peut alors faire un envoi de mail test via telnet

telnet localhost 25

Si vous souhaitez deacutelivrer les mails agrave votre maniegravere il faut dans le fichier etcpostfixmaincf la ligne

virtual_transport = nomdevotreregle

Et de mecircme dans le fichier etcpostfixmastercf

nomdevotreregle unix - n n - 5 pipe

flags=Rq user=vmail null_sender=

argv=chemindevotreprogramme

Il nous reste maintenant agrave configurer les diffeacuterents enregistrements DNS neacutecessaire au fonctionnement drsquoun serveur

mail Vous pouvez utiliser la solution de votre choix Dans la suite vous trouverez une meacutethode utilisant Bind9

Installation de Bind9 Dans toute cette partie on se situera dans le dossier etcbind Dans la suite notre IP sera abcd

Dans le fichier namedconfoptions on ajoutera dans le champ options

version Not supported

Dans un dossier zones on eacutecrit le fichier dbdomainetld

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122111 Serial

43200 Refresh

3600 Retry

2419200 Expire

86400 ) Negative Cache TTL

IN NS nsdomainetld

IN NS ns11ovhnet

ns IN A abcd

www IN A abcd

IN A abcd

IN MX 10 maildomainetld

mail IN A abcd

Dans le mecircme dossier zones on a cbain-addrarpa

9

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122101 serial

14400 refresh

3600 retry

604800 expire

10800 minimum

)

cbain-addrarpa IN NS nsdomainetld

cbain-addrarpa IN NS ns11ovhnet

d IN PTR maildomainetld

Il faut faire attention agrave bien increacutementer le serial pour chaque modification des fichiers

Dans le fichier namedconflocal

zone domainetld

type master

file etcbindzonesdbdomainetld

allow-transfer 213251128130

notify yes

zone cbain-addrarpa IN

type master

file etcbindzonescbain-addrarpa

allow-transfer 213251128130

Ici 213251128130 est lrsquoadresse IP du serveur ns11ovhnet

Il faut bien sucircr configurer le DNS avec votre fournisseur (Gandi OVH hellip) Pour ccedila amusez-vous bien Vous pouvez

aussi tester votre configuration avec des outils en ligne tels que DNSstuff

En test final si votre configuration est bonne vous devriez pouvoir envoyer un mail depuis un service neutre (Gmail

yahoo hellip) et le voir dans votre arborescence (ici homevmaildomainetld)

Installation du paquet Debian et configuration de lighttpd

Commencez par reacutecupeacuterer le paquet deb agrave lrsquoadresse suivante httpswwwintimailpwintimaildeb

Installez ensuite GDebi Il srsquoagit drsquoun dpkg ameacutelioreacute pour teacuteleacutecharger les deacutependances automatiquement ce que

dpkg ne gegravere pas

apt-get update

apt-get install gdebi-core

10

Vous pouvez alors installer le paquet

gdebi intimaildeb

Vous aurez alors le site web drsquointiMail deacuteployeacute au chemin varwwwwebmail

Il ne vous reste plus qursquoagrave changer la configuration de lighttpd votre serveur web pour mettre en ligne le site

Vous pouvez pour cela copier-coller la configuration suivante mais veillez agrave bien changer lrsquoadresse IP preacutesente au

deacutebut de la partie SSL CONFIG avec votre adresse IP

serv ermodules = ( mod_access

mod_accesslog

mod_alias

mod_compress

mod_redirect

mod_rewrite

)

Hide server version

servertag = Such Headers Very try Now close telnet

serverdocument-root = varwwwwebmail

serverupload-dirs = ( varwwwwebmailuploads )

servererrorlog = varloglighttpderrorlog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

serverport = 80

accesslogformat = V h l u t r gts b Refereri

User-Agenti

accesslogfilename = varloglighttpdaccesslog

index-filenames = ( indexphp indexhtml

indexlighttpdhtml )

urlaccess-deny = ( ~ inc )

static-fileexclude-extensions = ( php pl fcgi )

compresscache-dir = varcachelighttpdcompress

compressfiletype = ( applicationjavascript textcss

texthtml textplain )

default listening port for IPv6 falls back to the IPv4 port

include_shell usrsharelighttpduse-ipv6pl + serverport

include_shell usrsharelighttpdcreate-mimeassignpl

include_shell usrsharelighttpdinclude-conf-enabledpl

SSL CONFIG

$SERVER[socket] == 5234485443

sslengine = enable

11

sslpemfile = etclighttpdsslintimailpwpem

sslca-file = etclighttpdsslintimailpwcrt

servername = intimailpw

votre configuration habituelle pour ce domaine

serverdocument-root = varwwwwebmail

servererrorlog = varloglighttpderror_ssllog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

Rewrite des URL pour masquer php

urlrewrite-once = ( ^()$ =gt $1 )

urlrewrite-if-not-file = ( ^([^])()$ =gt $1php$2 )

servernetwork-backend = writev

Deacutependances Slapd

Ldap-utils

Postfix

Postfix-ldap

Bind9

Lighttpd

12

Sources httpswikigandinetfrhostingusing-linuxtutorialsdebianmail-server-ldap

httpwwwpostfixorgpipe8html

httpwwwpostfixorgFILTER_READMEhtml

httpwwwpostfixorg

httpwwwpostfixorgtransport5html

Page 12: Système d'hébergement domestique...place sur les domaines .pw par Gandi.net, notre fournisseur. Nous n’avons donc pas pu l’implémenter. Nous avons configuré Postfix pour qu’il

Chaque en-tecircte de mail est eacutecrite dans un fichier json distinct par boicircte (un

fichier pour la boicircte de reacuteception un fichier pour les mails envoyeacuteshellip) ce qui nous

permet de montrer agrave lutilisateur la liste des mails dune boicircte sans traitement lourds

en arriegravere plan pour le serveur Ces fichiers sont renseigneacutes par un script lanceacute agrave la

reacuteception drsquoun mail par postfix du cocircteacute reacuteception et par lrsquointerface web elle mecircme

pour lrsquoeacutemission Lrsquoen-tecircte drsquoun mail est eacutecrite dans un conteneur JSONde lamaniegravere

suivante

Fig 7 Exemple drsquoentreacutee dans un fichier json

Gracircce tout cela nous pouvons afficher simplement le contenu des diffeacuterentes

boicirctes mail dans des tableaux sur lrsquointerface gracircce aux en-tecirctes et par la suite

retrouver et afficher le contenu drsquoun mail agrave partir de son fichier brut sur lequel

lrsquoutilisateur aura cliqueacute comme on le verra un peu plus loin

Toujours dans un souci drsquoameacutelioration des performances le strict neacutecessaire

est geacuteneacuteralement chargeacute sur les pages web par exemple en venant de la vue

geacuteneacuterale lorsqursquoon clique surInboxseule la partie inteacuterieure de la page est chargeacutee

on ne recharge pas le bandeau du haut de page ou lemenu de gauche agrave lamaniegravere

drsquoun MVC classique

Envoyer des courriels

Toute cette architecture ne doit pas nous faire oublier le but premier envoyer

et recevoir des mails Pour envoyer des mails crsquoest tregraves simple on peut soit cliquer

dans le bandeau du haut sur ldquoQuick Emailrdquo qui permet sur lamecircme page drsquoenvoyer

un email rapide et sans piegravece-jointe soit cliquer dans la barre de navigation sur le

cocircteacute sur ldquoWrite a new emailrdquo ce qui nous megravene vers une page deacutedieacutee permettant

drsquoeacutecrire un email incluant une piegravece jointe

Fig 8 Envoyer un mail crsquoest simple comme bonjour

On peut remarquer sur cette capture drsquoeacutecran que lrsquoon ne peut envoyer que

certains types de piegraveces jointes Nous supportons JPG PNG GIF PDF et ZIP Si la

piegravece jointe est drsquoun autre format elle est rejeteacutee La veacuterification du type srsquoeffectue

sur lrsquoextension du fichier et sur son type MIME ce qui eacutevite par exemple que

quelqursquoun modifie lrsquoextension drsquoun fichierexe en fichierjpg pour lrsquoenvoyer La piegravece

jointe doit de plus avoir une taille infeacuterieure agrave la taille maximale drsquoune piegravece jointe

parameacutetreacutee par lrsquoadministrateur comme nous le verrons dans lrsquointerface

drsquoadministration

Si tous ces critegraveres sont bons on eacutecrit lemail au format brut deacutecrit par la RFC

puis on lrsquoexpeacutedie agrave lrsquoaide de la fonction mail de PHP Si cette fonction nrsquoeacutechoue pas

crsquoest que le mail est expeacutedieacute avec succegraves on peut alors mettre agrave jour le quota

drsquoespace disque maximum autoriseacute agrave lrsquoutilisateur en increacutementant celui-ci avec la

taille du mail qui vient drsquoecirctre envoyeacute ainsi que creacuteer un fichiermail brut sur le disque

pour pouvoir afficher le mail dans la boicircte drsquoenvoi et en garder une trace

Notons que comme crsquoest lrsquoutilisateur web du systegraveme (www-data) qui exeacutecute

la fonction nous modifions les en-tecirctes du mail afin que le destinataire reccediloive un

mail de la part de ldquoPreacutenom Nomrdquo depuis lrsquoadresse ldquopnomdomainetldrdquo plutocirct que

ldquowww-datadomaintldrdquo par deacutefaut

La migration vers une IP externe agrave Lille 1 eacutetant reacuteussie nous pouvons bien

envoyer des mails depuis notre interface qui sont reccedilus agrave lrsquoexteacuterieur sans soucis

Mais aussi en recevoir

Recevoir des mails est tout aussi important Nous avons vu lrsquoarchitecture en

arriegravere-plan mais au final agrave quoi cela ressemble-t-il pour lrsquoutilisateur Il dispose en

fait en cliquant sur Inbox (ou Sent Spam ou Trash eacutegalement) drsquoun accegraves agrave sa boicircte

de reacuteception Drsquoun clic srsquoaffichent alors agrave lui tous les mails qursquoil a reccedilu

Fig 9 La boicircte de reacuteception

On remarque notamment les fonctions de recherche drsquoactualisation du

tableau de choix des colonnes agrave afficher on peut classiquement choisir combien de

lignes on affiche par page changer de pages etchellip

Lorsque lrsquoon clique sur un des lignes les donneacutees de lrsquoen-tecircte du mails sont

passeacutes en paramegravetres agrave une autre page qui drsquoapregraves ces informations retrouve le

fichier mail brut le traite et lrsquoaffiche

Fig 10 Un mail contenant 3 piegraveces jointes et un message

Comme on peut le voir nous pouvons recevoir desmails avec plusieurs piegraveces

jointes Nous avons ici preacutesenteacute la boicircte de reacuteception mais les autres boicirctes

fonctionnent de maniegravere similaire

Interface drsquoadministration

Le systegraveme de webmail possegravede plusieurs variables des listes de diffusion

des compteshellipMais on veut pouvoir donner les droits agrave un utilisateur demodifier tout

cela En effet si nous trouvons cela abordable drsquoajouter un utilisateur avec une

commande dans le shell il faut aussi penser agrave lrsquoutilisateur final qui preacutefegravere peut-ecirctre

le confort drsquoune interface deacutedieacutee pour geacuterer son serveur mail plutocirct que le terminal

De maniegravere tregraves simple un utilisateur appartenant au groupes drsquoutilisateurs

ldquoAdministrateursrdquo est reconnu en tant qursquoadministrateur par lrsquointerface et peut

cliquer sur un bouton ldquoManagerdquo dans le panneau lateacuteral qui nrsquoest visible qursquoaux

administrateurs De lagrave il arrive sur la page suivante

Fig 11 lrsquointerface drsquoadministration

Sur cette interface il peut choisir la taille maximale des piegraveces jointes

changer le nom de domaine sur lequel est installeacute lrsquointerface et dont deacutependent

toutes les adresses (domaine) Il est aussi possible de modifier directement ces

variables en modifiant le fichier includeconfigincphp Pratique notamment si lrsquoon

a renseigneacute un mauvais nom de domaine agrave la configuration et que lrsquoon arrive plus agrave

acceacuteder agrave lrsquointerface

Il peut aussi creacuteer un nouveau compte en renseignant les champs preacutenom

nom mot de passe et quota Lrsquoutilisateur peut ensuite une fois son compte creacutee

directement se connecter avec son identifiant (initiale preacutenom + nom) et mot de

passe Lors de la creacuteation du compte un mail de bienvenue est envoyeacute au nouvel

utilisateur ce qui permet en arriegravere-plan de creacuteer tous les dossiers utilisateurs et

fichiers en-tecirctes utiles agrave lrsquointerface une fois pour toutes

Lrsquoadministrateur peut aussi ajouter une liste de diffusion (assimileacutee agrave un

groupe) ou en supprimer une parmi les listes existantes

En outre lrsquoadministrateur peut aussi modifier les donneacutees drsquoun utilisateur

Pour cela sur la preacutesente page il peut seacutelectionner un utilisateur parmi la liste des

utilisateurs existants ce qui le redirige vers la page de gestion des comptes

Fig 12 La gestion drsquoun compte seacutelectionneacute ici celui de James Bond

A ce stade il peut changer lrsquoUID de lrsquoutilisateur (utile en cas de conflit) le nom

le mot de passe le quota de cet utilisateur et lrsquoajouter ou le retirer drsquoune liste de

diffusion Accessoirement il peut aussi supprimer le compte en cliquant sur lrsquoeacutenorme

bouton rouge qui lui demandera deux fois de suite de confirmer son action afin

drsquoeacuteviter les erreurs de clic Cette action entraicircne la suppression de lrsquoutilisateur de

toutes les listes de diffusion auxquelles il appartient la suppression de son compte

dans la branche people de lrsquoarbre LDAP et la suppression deacutefinitive de son dossier

utilisateur sur le disquesystegraveme de fichiers impliquant donc la perte de ses mails

Architecture du systegraveme de fichiers

Comme nous lrsquoavons dit plus haut lrsquoideacutee est de se passer des meacutecanismes

classiques avec les clients mails habituels Ces serveurs srsquoalourdissent

geacuteneacuteralement en utilisant des serveurs IMAPPOP3 et un meacutecanisme

drsquoauthentification SMTP

Pour adapter ces fonctionnaliteacutes agrave notre systegraveme nous avons donc constitueacute

une architecture pour organiser les fichiers qui transitent Vous pourrez voir un

scheacutema reacutecapitulatif en annexe 1

Dans la premiegravere moitieacute du projet les mails eacutetaient deacutelivreacutes par Postfix Nous

utilisions un script exeacutecuteacute lors de la reacuteception drsquounmail pour les traiter de lamaniegravere

que nous voulions Cette meacutethode avait les inconveacutenients drsquoecirctre lourde et pas

efficace agrave 100 En effet seuls les mails reccedilus depuis lrsquoexteacuterieur eacutetaient

correctement traiteacutes

Deacutesormais les mails sont traiteacutes totalement par notre script Cela nous

permet de geacuterer les mails dans des dossiers organiseacutes agrave notre maniegravere et de

recevoir les mails locaux crsquoest-agrave-dire entre utilisateurs du mecircme domaine Cette

nouvelle meacutethode regravegle aussi drsquoautres problegravemes notamment au niveau des

permissions sur les fichiers

Pour reacuteduire le nombre drsquoopeacuterations et pour profiter des fonctionnaliteacutes

offertes par le framework utiliseacute pour lrsquointerface web nous regroupons des

informations sur chacun des mails reccedilus sous la forme de fichiers JSON Pour ce

faire lrsquoideacutee est drsquoexeacutecuter un script lorsque leacutevegravenement ldquoreacuteception drsquoun mailrdquo

survient Postfix offre cette possibiliteacute dans sa configuration Or il se trouve qursquoil nrsquoest

pas si simple de reacutecupeacuterer le chemin du fichier contenant le mail car le nom du

fichier creacutee est sous la forme Timestamp UNIX10 Caractegraveres aleacuteatoires (ex

14562336185A8D43E97F)

La seconde probleacutematique est que le webmail doit avoir la possibiliteacute de

pouvoir lire les fichiers pour afficher les mails sur son interface Or il semble que

Postfix les eacutecrit en autorisant uniquement son utilisateur en lecture Il nous a fallu

trouver une solution pour remeacutedier agrave cela Nous avons choisi drsquoajouter www-data

(utilisateur du serveur web) au groupe vmail et de modifier les droits sur les fichiers

de sorte que les utilisateurs de ce groupe puissent lire les fichiers

Nous avons revu une partie de lrsquoorganisation des fichiers pour reacutecupeacuterer les

piegraveces jointes si elles sont preacutesentes Le script que nous avons eacutecrit reacutecupegravere le

fichier original du mail et le deacutecoupe en eacuteleacutements simples dans des fichier distincts

corps du mail et diffeacuterentes piegraveces jointes De cette maniegravere pour afficher un mail

nous nrsquoavons pas besoin de charger la totaliteacute du fichier Dans le cas ougrave il y a des

piegraveces jointes cela aurait ralenti lrsquoaffichage des informations

Nous avons eacutegalement impleacutementeacute la gestion des quotas Dans lrsquoeacutetat actuel

des choses srsquoil nrsquoy a plus de place disponible pour lrsquoutilisateur le mail nrsquoest tout

bonnement pas deacutelivreacute agrave ce destinataire Lrsquoideacuteal aurait eacuteteacute de notifier leacutemetteur avec

un mail ce qui nrsquoest pour lrsquoinstant pas le cas mais qui pourrait ecirctre reacutesolu en

renvoyant agrave postfix un code drsquoerreur deacutefini

Pour terminer nous avons revu la totaliteacute du code deacuteveloppeacute Nous sommes

passeacute du Bash au Perl Ce dernier est plus performant et plus simple agrave utiliser et agrave

lire

Firewall

Un autre gros morceau du projet mais qui nrsquoest pas speacutecifiquement lieacute agrave la

probleacutematique du mail crsquoest la seacutecurisation du serveur En effet apregraves avoir mis en

ligne notre serveur des pirates ont tregraves vite tenteacute de peacuteneacutetrer le systegraveme

Globalement les attaques eacutetaient de type force brute sur les services heacutebergeacutes sur

notre Raspberry neacutecessitant une identification tels que SSH SMTP hellip

On retrouve ici un petit point faible du protocole SMTP Eacutetant donneacute que

chaque serveur mail doit avoir une adresse postmaster et abuse lrsquoattaquant a agrave sa

disposition deux adresses agrave attaquer Ceci dit ce type drsquoattaque est simple agrave

contrecarrer car il suffit de limiter dans le temps le nombre de tentatives de

connexions

La contre-mesure que nous avons mis en place est simple une seacuterie de

regravegles Iptables En reacutesumeacute nous avons opteacute pour un systegraveme de liste blanche et

noire Les adresses IPs de la liste blanche sont autoriseacutees agrave utiliser la totaliteacute des

services (notamment SSH) tandis que celles de la liste noire sont totalement

ignoreacutees Les autres IPs nrsquoont accegraves qursquoau webmail

Eacutetant donneacute que le nombre drsquoIPs attaquant notre serveur nrsquoa cesseacute

drsquoaugmenter nous avons automatiseacute la mise agrave jour de la liste de noire en

deacuteveloppant un script pour Cron Ce script est exeacutecuteacute une fois par heure A ce jour

notre liste noire contient 47 adresses Bien sucircr ce systegraveme est susceptible drsquoecirctre

modifieacute agrave convenance pour passer sur une solution deacutedieacutee telle que Fail2ban qui fait

en fait ce qursquoon fait deacutejagrave (eacutetudier les logs et bannir des IP avec iptables) avec des

regravegles preacutedeacutefinies par la communauteacute et personnalisables En effet nous nous

attendons agrave voir la varieacuteteacute et le nombre drsquoattaques augmenter apregraves avoir migreacute sur

une IP non proteacutegeacutee par le firewall de lrsquoUniversiteacute puisque nous nrsquoavons plus la

premiegravere ligne de deacutefense du CRI en particulier pour le port 389 (LDAP) qui eacutetait

bloqueacute par lrsquouniversiteacute et srsquoest retrouveacute en premiegravere ligne apregraves la migration Nous

avons donc ajouteacute une regravegle bloquant tout le trafic entrant vers le port 389 hormis

localhost

Package drsquoinstallation

Nous avons creacutee un package deb contenant les sources du webmail ainsi

que des scripts utiles agrave lrsquoinstallation et au fonctionnement du serveur Nous avons

deacuteveloppeacute des scripts de configuration automatique pour LDAP et Postfix Comme

dpkg ne supporte pas directement lrsquoinstallation automatique des deacutependances

nous recommandons drsquoinstaller avant tout le paquet gdebi-core qui est en fait un

dpkg ameacutelioreacute Gracircce agrave la commande gdebi paquetdeb toutes les deacutependances

seront installeacutees en particulier postfix le serveur ldap le serveur web lighttpd entre

autres sans soucis Il est agrave noter que comme les scripts de configuration des

diffeacuterents services ne sont que partiellement impleacutementeacutes dans le paquet deb nous

fournissons en annexe un README complet et illustreacute qui explique pas agrave pas

comment faire fonctionner notre systegraveme sur nrsquoimporte quel Linux en particulier les

lignes de configuration des diffeacuterents services agrave changer et un exemplaire des

fichiers de configuration fonctionnels de ces services

Gestion de lrsquoeacutenergie

Une consideacuteration importante pour un systegraveme autonome Drsquoapregraves les fiches

techniques notre modegravele de Raspberry Pi (B 2) est officiellement eacutevalueacute avec un

fonctionnement agrave ~650mA pour 5V De nombreux proprieacutetaires de ce systegraveme

eacutequipeacutes se sont amuser agrave veacuterifier la consommation eacutelectrique reacuteelle de leur Pi 2 B

sous diffeacuterentes charges On pourra retenir cette eacutetude (lien en sitegraphie) qui

relegraveve la consommation en courant en fonction de lrsquoactiviteacute lanceacutee sur la Pi mais

aussi en charge sur 1 agrave 4 CPU

Ces chiffres sont releveacutes sur un systegraveme avec cameacutera connecteacutee HDMI connecteacute et

cacircble ethernet brancheacute et actif

On peut constater que globalement notre systegraveme Pi 2 B tournant sans

interface graphique sans composant suppleacutementaire sans sortie videacuteo ni cameacutera

avec plusieurs serveurs tournant tout en restant le plus leacuteger possible et demeurant

~99 idle la plupart du temps ne devrait pas deacutepasser une consommation de

300mA grand maximum

Fig 13 Un processeur tregraves tregraves peu chargeacute et une meacutemoire relativement libre

Nous avions lrsquoanneacutee derniegravere deacutejagrave reacutealiseacute un circuit permettant drsquoadapter un

panneau solaire sur une batterie USB classique de 9000mAh Nous avions alors pu

mesurer lrsquointensiteacute deacutelivreacutee par le panneau solaire En cas drsquoensoleillement moyen

habituel dans nos contreacutees le panneau solaire deacutebitait 400mA et pouvait atteindre

le double quand le soleil eacutetait directement preacutesent pour environ 800mA deacutebiteacute

Ce panneau solaire accompagneacute de son circuit drsquoadaptation devrait donc

suffire pour alimenter notre systegraveme la journeacutee le brancher ensuite sur une batterie

portable permet de stocker le surplus pour la nuit

Fig 14 le circuit drsquoadaptation

Fig 15 et son PCB

Eacutevolutions possibles

Webmail

Concernant les eacutevolutions possibles que nous aurions aimeacute apporter agrave notre

projet avec plus de temps commenccedilons par le web Nous aurions souhaiteacute apporter

la gestion de lrsquoenvoi de plusieurs piegraveces jointes comme nous lrsquoavons fait pour la

reacuteception

De plus nous aurions voulu inteacutegrer une corbeille ougrave lesmessages pourraient

aller avant drsquoecirctre deacutefinitivement supprimeacutes du systegraveme drsquoautant que nous avons

deacutejagrave eacutecrites les fonctions PHP permettant de retirer une en-tecircte drsquoun fichier JSON et

le fichier mail associeacute

Enfin nous aurions aimeacute en plus du blocage deacutejagrave preacutesent impleacutementer une

gestion plus profonde des piegravece jointes permettant notamment le remplissage de la

boicircte de spams

Systegraveme

Il aurait eacuteteacute inteacuteressant de notifier lrsquoexpeacutediteur lorsque le mail nrsquoa pas pu ecirctre

deacutelivreacute agrave un utilisateur lorsque son quota est plein En toute logique cela devrait ecirctre

fait simplement avec la commande Sendmail

Une meilleur gestion du trafic mail indeacutesirable aurait eacuteteacute la bienvenue En

effet malgreacute la limitation du spam il restera toujours une partie du volume de mail

qui sera indeacutesirable (pub pishing scam hellip)

Eacutetant donneacute la taille du systegraveme nous avions penseacute agrave une approche

ldquomachine learningrdquo Lrsquoutilisateur indiquerait pourquoi il considegravere le mail comme

indeacutesirable constituant des regravegles refusant certains mails Les mails provenant de

cet expeacutediteur pourraient ecirctre deacutetecteacute par le script agrave la reacuteception et

automatiquement envoyeacutes dans la boicircte de spams

Partie eacutenergeacutetique

Mecircme si la solution au panneau solaire ne pose aucun problegraveme en theacuteorie

nous aurions deacutejagrave dans un premier temps aimeacute lrsquoimpleacutementer en pratique Nous

nrsquoavons finalement pas reacutealiseacute notre objectif de deacutetecter deux cas drsquoalimentation

diffeacuterents soit lrsquoalimentation via panneau solaire est suffisante dans ce cas il

alimente la batterie et donc la Raspberry soit quand ce courant nrsquoest pas suffisant

on alimente la batterie par le secteur

Conclusion

En conclusion nous pensons avoir reacutepondu au cahier des charges initial dans

sa majeure partie Nous sommes aujourdrsquohui en mesure de proposer une solution

mail domestique priveacutee et personnalisable par un particulier

Notre installation de Debian a eacuteteacute au maximum alleacutegeacutee pour notre utilisation

sans interface graphique et nous avons mis en place une reacuteponse aux diverses

attaques que nous avons pu subir lors de lamise en place de notre solution logicielle

En outre le pare-feu avec notre systegraveme de liste noire bloque une partie des

attaques qui peuvent nous parvenir

Nos diffeacuterents scripts de pare-feu de gestion drsquoun mail entrant associeacute au

webmail permettent agrave un utilisateur drsquoacceacuteder aux fonctions usuelles associeacutees agrave

lrsquoenvoi et la reacuteception de mails

Gracircce agrave sa configuration personnalisable notre projet devrait pouvoir ecirctre

porteacute sur un domaine et une adresse IP diffeacuterente sans soucis et ecirctre deacuteployeacute

partout ougrave des gens souhaitent conserver leur vie priveacutee

Nous regretterons cependant de ne pas avoir exploiteacute la partie eacutenergeacutetique

de ce projet qui portait une probleacutematique inteacuteressante et qui nous parait importante

dans le monde actuel

Ce projet nous aura occupeacute pendant tregraves longtemps et nous sommes fiers du

travail que nous avons accompli Il est agrave nos yeux la preuve de ce que nous savons et

pouvons faire et nous donnera confiance pour notre deacutebut de carriegravere drsquoingeacutenieur

Sources

httpwwwradicaticomwpwp-contentuploads201401Email-Statistics-R

eport-2014-2018-Executive-Summarypdf

httpwwwcommentcamarchenetcontents525-le-protocole-ldap

httpsfrwikipediaorgwikiSimple_Mail_Transfer_Protocol

httpwwwcommentcamarchenetcontents536-pop3-smtp-imap-protocol

es-de-messagerie

httpstoolsietforghtmlrfc2821

httpsfrwikipediaorgwikiInternet_Message_Access_Protocol

httpstoolsietforghtmlrfc3501

httparstechnicacominformation-technology201402how-to-run-your-ow

n-e-mail-server-with-your-own-domain-part-1

httpswwwraspberrypiorgforumsviewtopicphpp=136912

httpstackoverflowcomquestions17394356how-can-i-make-a-bash-com

mand-run-periodically

httpuntroubledorgnullmailer

httpelinuxorgRPi_Hardware

httpraspitv2015raspberry-pi2-power-and-performance-measurement

Annexe 1 Architecture du systegraveme de fichiers

Annexe 2 Scan DNSSTUFF

Depuis httpwwwdnsstuffcomtoolsdnsReport|type=domainampampvalue=intimailpw

Annexe 3 Vue geacuteneacuterale httpswwwintimailpw

Annexe 4 Envoyer un mail

Annexe 5 Boite de reacuteception

Annexe 6 Interface drsquoadministration

Annexe 7 Gestion drsquoun utilisateur

Tutorial installation intimailtrade

Table des matiegraveres Apregraves une nouvelle installation de lrsquoOS 2

Seacutecurisation du serveur 2

Changement de lrsquoutilisateur par deacutefaut 2

Changement du port SSH 2

Interdire lrsquoauthentification SSH pour root 2

Installation de LDAP 3

Configuration de base 3

Configuration des Scheacutemas 4

Constitution de la base de donneacutees LDAP 5

Installation de Postfix 7

Installation de Bind9 8

Installation du paquet Debian et configuration de lighttpd 9

Deacutependances 11

Sources 12

2

Apregraves une nouvelle installation de lrsquoOS Exeacutecutez ces commandes pour mettre agrave jour agrave la derniegravere version Ces opeacuterations peuvent prendre un certain

temps Nous avons utiliseacute pour cet exemple Raspbian Jessie Lite sur une Raspberry Pi 2

apt-get update

apt-get upgrade ampamp apt-get dist-upgrade

apt-get install linux-headers-$(uname -r)

reboot

Puis lancer

raspi-config

Etendre au maximum lrsquoespace de stockage en navigant dans les menus

Expand Filesystem

Reacutegler une ip statique avec la box fichier etcnetworkinterfaces

iface eth0 inet static

address 192168131

netmask 2552552550

gateway 19216811

Nous avons aussi supprimeacute wpasupplicant

Seacutecurisation du serveur

Changement de lrsquoutilisateur par deacutefaut Changez le nom drsquoutilisateur par deacutefaut ainsi que son mot de passe

sudo passwd root

Sortie et login en tant que root puis

usermod -l myuname pi

usermod -m -d homemyuname myuname

groupmod ndashn myuname pi

passwd myuname

Voir cette adresse pour lrsquoutilisation de cleacutes priveacuteespubliques

Changement du port SSH sed ndashi sPort 22Port 2222g etcsshsshd_config

Interdire lrsquoauthentification SSH pour root sed -i sPermitRootLogin yesPermitRootLogin nog etcsshsshd_config

3

Installation de LDAP

Configuration de base Installation du package

apt-get install slapd

Choisir un mot de passe administrateur puis lancer la commande

dpkg-reconfigure slapd

Reacutepondre non agrave la question 1

Entrez le nom de domaine utiliseacute agrave la question 2 sous la forme domainetld

Entrez ce que vous voulez au 3egraveme eacutecran le nom de lrsquoorganisation ne sera pas utiliseacute

Entrez un mot de passe

Choisissez HDB

Choisissez si la base de donneacutees est supprimeacutee agrave la deacutesinstallation de slapd

Deacuteplacez lrsquoancienne base de donneacutees

Nrsquoutilisez pas LDAPv2

Installer les outils de conversion pour ldap (slaptest ldapmodify notamment)

apt-get install ldap-utils

On peut maintenant veacuterifier que la configuration est valable

ldapsearch -x -h localhost -b dc=domainedc=tld -LLL dc=domaine dn

Cette commande doit retourner quelque chose comme

dn dc=domainedc=tld

Il faut maintenant seacutecuriser le serveur LDAP en effet on peut y acceacuteder en anonyme avec la commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=config

(amp(objectClass=olcDatabaseConfig)(olcSuffix=dc=domainedc=tld))

Cette commande retourne un certain nombre drsquoinformations notamment agrave propos des champs suivants

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by none

olcAccess 1to dnbase= by read

olcAccess 2to by read

On va modifier ces champs avec la commande ldapmodify Pour cela on va creacuteer un fichier ldif

cat gt changeAccessldif ltlt EOF

dn olcDatabase=1hdbcn=config

changetype modify

delete olcAccess

-

add olcAccess

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by dn=cn=admindc=domainedc=tld write by none

-

add olcAccess

olcAccess 1to dnbase= by read

-

4

add olcAccess

olcAccess 2to by self write by dn=cn=admindc=domainedc=tld write by

none

-

EOF

On peut maintenant appliquer les changements avec ldapmodify

ldapmodify ndashc ndashY EXTERNAL ndashH ldapi -f changeAccessldif

La commande devrait vous confirmer que la modification srsquoest bien effectueacutee

SASLEXTERNAL authentication started

SASL username gidNumber=0+uidNumber=0cn=peercredcn=externalcn=auth

SASL SSF 0

modifying entry olcDatabase=1hdbcn=config

On peut veacuterifier qursquoon ne peut plus acceacuteder aux informations avec la commande

ldapsearch -x -c -h localhost -b dc=domainedc=tld

On peut veacuterifier la configuration en se connectant en tant qursquoadministrateur

ldapsearch -c -h localhost -b dc=domainedc=tld -D

cn=admindc=domainedc=tld ndashW

Configuration des Scheacutemas Nous allons utiliser les scheacutemas de courier-ldap Pour eacuteviter une manipulation compliqueacutee vous trouverez

directement le scheacutema avec le fichier authldapschema On place ce fichier dans le dossier

mv authldapschema etcldapschema

Nous creacuteons un fichier qui incluera tous les scheacutemas de base en plus du nouveau On peut les afficher avec la

commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

Creacuteation du fichier de configuration pour notre exemple cela donne

mkdir tmpldapconf

cat gt tmpldapconfldapconf ltlt EOF

include etcldapschemacoreschema

include etcldapschemacosineschema

include etcldapschemanisschema

include etcldapschemainetorgpersonschema

include etcldapschemaauthldapschema

EOF

On lance ensuite la commande

slaptest -f tmpldapconfldapconf -F tmpldapconf

Elle revoie un message de succegraves Cette commande a creacuteeacute dans le reacutepertoire tmpldapconf une arborescence

correspondant agrave la configuration de notre LDAP

On modifie le chemin de configuration

5

sed ndashi 0dnauthldap sauthldapauthldapcn=schemacn=config

cn=authldapldif

On supprime ensuite les 7 derniegraveres lignes du fichier

head -n -7 cn=authldapldif gt tmpldif

mv tmpldif cn=authldapldif

On peut maintenant importer notre fichier de configuration Pour ce faire

ldapadd -Y EXTERNAL -H ldapi -f

tmpldapconfcn=configcn=schemacn=authldapldif

Si tout va bien lrsquoentreacutee devrait avoir eacuteteacute ajouteacutee On peut veacuterifier avec la commande vue tout agrave lrsquoheure

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

On devrait voir en plus le nouveau scheacutema authldap

Constitution de la base de donneacutees LDAP Le remplissage de la base se fait agrave lrsquoaide de fichiers ldif Nous donnons ici un exemple de structure

Fichier pour la structure de base

dn dc=maildc=domainedc=tld

o intimailpw

description Global mail tree

dc mail

objectClass top

objectClass dcObject

objectClass organization

dn dc=peopledc=maildc=domainedc=tld

description Informations of all users

o people

dc people

objectClass top

objectClass dcObject

objectClass organization

dn dc=groupsdc=maildc=domainedc=tld

description All groups of users

o groups

dc groups

objectClass top

objectClass dcObject

objectClass organization

6

Fichier pour ajouter un utilisateur

dn cn=jbonddc=peopledc=maildc=domainedc=tld

uid jbond

mail jbonddomainetld

sn Moulin

givenName James

displayName James Bond

mailbox domainetldjbond

quota 50M

homeDirectory homevmail

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAccount

userPassword SSHA367PSXiUAegy8dpJbPU8OepEf8L5ye

Pour obtenir un hash du mot de passe

slappasswd -s password -h SSHA

On peut par la suite ajouter la configuration agrave la base de donneacutees avec la commande

ldapadd -D cn=admindc=domainedc=tld -W -h localhost -f pathtofile

Si les champs proposeacutes ne sont pas suffisants il faudra alors effectuer les modifications dans le fichier autldapschema

proposeacute plus haut et refaire la manipulation de configuration

De plus les standards du Mail deacutecrit par lrsquoIETF (RFC822 63 RFC1123 527 and RFC2821 451) impliquent drsquoavoir une

adresse Postmaster et une Abuse Pour cela nous pourrions creacuteer ces adresses avec la meacutethode vue au-dessus mais

ce nrsquoest pas la meilleure Il est preacutefeacuterable drsquoutiliser un alias comme nous le ferons avec les listes de diffusion Ici nous

proposons de rediriger ces deux adresses vers une adresse administrateur Pour cela la meacutethode est la mecircme sauf

que le fichier ldif nrsquoest pas tout agrave fait identique En voici un exemple

dn cn=postmasterdc=groupsdc=maildc=domainedc=tld

uid postmaster

mail postmasterdomainetld

sn Postmaster

displayName Postmaster

maildrop admindomainetld

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAlias

Pour faire une liste de diffusion la meacutethode est la mecircme Il suffit drsquoajouter toutes les adresses destinataires dans le

champ maildrop seacutepareacutees par des virgules ()

7

Installation de Postfix Installation des packages

apt-get install postfix postfix-ldap

Lors de lrsquoinstallation deux eacutecrans deacutefilent

- Configuration Internet Site

- Valeur par deacutefaut pour le mail name

On creacutee lrsquoutilisateur qui servira agrave exeacutecuter Postfix

groupadd vmail

useradd -g vmail -d homevmail -s binfalse -m vmail

Nous aurons besoin dans la suite des GID et UID creacuteeacutes agrave cet instant Ils peuvent ecirctre afficheacutes avec les commandes

cat etcgroup | grep vmail | cut -d -f3

cat etcpasswd | grep vmail | cut -d -f3

On ajoute les paramegravetres au fichier etcpostfixmaincf (remplacer les valeurs de GID et drsquoUID avec vos valeurs)

smtpd_banner = maildomainetld

virtual_mailbox_base = homevmail

virtual_mailbox_domains = dmainetld

virtual_mailbox_maps = ldapetcpostfixldap_accountscf

virtual_alias_maps = ldapetcpostfixldap_aliasescf

virtual_minimum_uid = 100

virtual_gid_maps = static1001 Remplacez ici par votre valeur de GID

virtual_uid_maps = static1001 Remplacez ici par votre valeur drsquoUID

Il nous faut maintenant constituer nos fichiers de configuration ldap_accountscf

cat gt etcpostfixldap_accountscf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=peopledc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAccount)(mail=s))

result_attribute = mailbox

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

Et pour ldap_aliasescf

cat gt ldap_aliasescf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=groupsdc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAlias)(mail=s))

result_attribute = maildrop

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

8

On peut maintenant veacuterifier la configuration de Postfix avec (cette commande ne doit rien retourner si crsquoest bon)

postfix check

Si crsquoest bon alors on recharge le serveur

postfix reload

On peut alors faire un envoi de mail test via telnet

telnet localhost 25

Si vous souhaitez deacutelivrer les mails agrave votre maniegravere il faut dans le fichier etcpostfixmaincf la ligne

virtual_transport = nomdevotreregle

Et de mecircme dans le fichier etcpostfixmastercf

nomdevotreregle unix - n n - 5 pipe

flags=Rq user=vmail null_sender=

argv=chemindevotreprogramme

Il nous reste maintenant agrave configurer les diffeacuterents enregistrements DNS neacutecessaire au fonctionnement drsquoun serveur

mail Vous pouvez utiliser la solution de votre choix Dans la suite vous trouverez une meacutethode utilisant Bind9

Installation de Bind9 Dans toute cette partie on se situera dans le dossier etcbind Dans la suite notre IP sera abcd

Dans le fichier namedconfoptions on ajoutera dans le champ options

version Not supported

Dans un dossier zones on eacutecrit le fichier dbdomainetld

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122111 Serial

43200 Refresh

3600 Retry

2419200 Expire

86400 ) Negative Cache TTL

IN NS nsdomainetld

IN NS ns11ovhnet

ns IN A abcd

www IN A abcd

IN A abcd

IN MX 10 maildomainetld

mail IN A abcd

Dans le mecircme dossier zones on a cbain-addrarpa

9

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122101 serial

14400 refresh

3600 retry

604800 expire

10800 minimum

)

cbain-addrarpa IN NS nsdomainetld

cbain-addrarpa IN NS ns11ovhnet

d IN PTR maildomainetld

Il faut faire attention agrave bien increacutementer le serial pour chaque modification des fichiers

Dans le fichier namedconflocal

zone domainetld

type master

file etcbindzonesdbdomainetld

allow-transfer 213251128130

notify yes

zone cbain-addrarpa IN

type master

file etcbindzonescbain-addrarpa

allow-transfer 213251128130

Ici 213251128130 est lrsquoadresse IP du serveur ns11ovhnet

Il faut bien sucircr configurer le DNS avec votre fournisseur (Gandi OVH hellip) Pour ccedila amusez-vous bien Vous pouvez

aussi tester votre configuration avec des outils en ligne tels que DNSstuff

En test final si votre configuration est bonne vous devriez pouvoir envoyer un mail depuis un service neutre (Gmail

yahoo hellip) et le voir dans votre arborescence (ici homevmaildomainetld)

Installation du paquet Debian et configuration de lighttpd

Commencez par reacutecupeacuterer le paquet deb agrave lrsquoadresse suivante httpswwwintimailpwintimaildeb

Installez ensuite GDebi Il srsquoagit drsquoun dpkg ameacutelioreacute pour teacuteleacutecharger les deacutependances automatiquement ce que

dpkg ne gegravere pas

apt-get update

apt-get install gdebi-core

10

Vous pouvez alors installer le paquet

gdebi intimaildeb

Vous aurez alors le site web drsquointiMail deacuteployeacute au chemin varwwwwebmail

Il ne vous reste plus qursquoagrave changer la configuration de lighttpd votre serveur web pour mettre en ligne le site

Vous pouvez pour cela copier-coller la configuration suivante mais veillez agrave bien changer lrsquoadresse IP preacutesente au

deacutebut de la partie SSL CONFIG avec votre adresse IP

serv ermodules = ( mod_access

mod_accesslog

mod_alias

mod_compress

mod_redirect

mod_rewrite

)

Hide server version

servertag = Such Headers Very try Now close telnet

serverdocument-root = varwwwwebmail

serverupload-dirs = ( varwwwwebmailuploads )

servererrorlog = varloglighttpderrorlog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

serverport = 80

accesslogformat = V h l u t r gts b Refereri

User-Agenti

accesslogfilename = varloglighttpdaccesslog

index-filenames = ( indexphp indexhtml

indexlighttpdhtml )

urlaccess-deny = ( ~ inc )

static-fileexclude-extensions = ( php pl fcgi )

compresscache-dir = varcachelighttpdcompress

compressfiletype = ( applicationjavascript textcss

texthtml textplain )

default listening port for IPv6 falls back to the IPv4 port

include_shell usrsharelighttpduse-ipv6pl + serverport

include_shell usrsharelighttpdcreate-mimeassignpl

include_shell usrsharelighttpdinclude-conf-enabledpl

SSL CONFIG

$SERVER[socket] == 5234485443

sslengine = enable

11

sslpemfile = etclighttpdsslintimailpwpem

sslca-file = etclighttpdsslintimailpwcrt

servername = intimailpw

votre configuration habituelle pour ce domaine

serverdocument-root = varwwwwebmail

servererrorlog = varloglighttpderror_ssllog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

Rewrite des URL pour masquer php

urlrewrite-once = ( ^()$ =gt $1 )

urlrewrite-if-not-file = ( ^([^])()$ =gt $1php$2 )

servernetwork-backend = writev

Deacutependances Slapd

Ldap-utils

Postfix

Postfix-ldap

Bind9

Lighttpd

12

Sources httpswikigandinetfrhostingusing-linuxtutorialsdebianmail-server-ldap

httpwwwpostfixorgpipe8html

httpwwwpostfixorgFILTER_READMEhtml

httpwwwpostfixorg

httpwwwpostfixorgtransport5html

Page 13: Système d'hébergement domestique...place sur les domaines .pw par Gandi.net, notre fournisseur. Nous n’avons donc pas pu l’implémenter. Nous avons configuré Postfix pour qu’il

Fig 8 Envoyer un mail crsquoest simple comme bonjour

On peut remarquer sur cette capture drsquoeacutecran que lrsquoon ne peut envoyer que

certains types de piegraveces jointes Nous supportons JPG PNG GIF PDF et ZIP Si la

piegravece jointe est drsquoun autre format elle est rejeteacutee La veacuterification du type srsquoeffectue

sur lrsquoextension du fichier et sur son type MIME ce qui eacutevite par exemple que

quelqursquoun modifie lrsquoextension drsquoun fichierexe en fichierjpg pour lrsquoenvoyer La piegravece

jointe doit de plus avoir une taille infeacuterieure agrave la taille maximale drsquoune piegravece jointe

parameacutetreacutee par lrsquoadministrateur comme nous le verrons dans lrsquointerface

drsquoadministration

Si tous ces critegraveres sont bons on eacutecrit lemail au format brut deacutecrit par la RFC

puis on lrsquoexpeacutedie agrave lrsquoaide de la fonction mail de PHP Si cette fonction nrsquoeacutechoue pas

crsquoest que le mail est expeacutedieacute avec succegraves on peut alors mettre agrave jour le quota

drsquoespace disque maximum autoriseacute agrave lrsquoutilisateur en increacutementant celui-ci avec la

taille du mail qui vient drsquoecirctre envoyeacute ainsi que creacuteer un fichiermail brut sur le disque

pour pouvoir afficher le mail dans la boicircte drsquoenvoi et en garder une trace

Notons que comme crsquoest lrsquoutilisateur web du systegraveme (www-data) qui exeacutecute

la fonction nous modifions les en-tecirctes du mail afin que le destinataire reccediloive un

mail de la part de ldquoPreacutenom Nomrdquo depuis lrsquoadresse ldquopnomdomainetldrdquo plutocirct que

ldquowww-datadomaintldrdquo par deacutefaut

La migration vers une IP externe agrave Lille 1 eacutetant reacuteussie nous pouvons bien

envoyer des mails depuis notre interface qui sont reccedilus agrave lrsquoexteacuterieur sans soucis

Mais aussi en recevoir

Recevoir des mails est tout aussi important Nous avons vu lrsquoarchitecture en

arriegravere-plan mais au final agrave quoi cela ressemble-t-il pour lrsquoutilisateur Il dispose en

fait en cliquant sur Inbox (ou Sent Spam ou Trash eacutegalement) drsquoun accegraves agrave sa boicircte

de reacuteception Drsquoun clic srsquoaffichent alors agrave lui tous les mails qursquoil a reccedilu

Fig 9 La boicircte de reacuteception

On remarque notamment les fonctions de recherche drsquoactualisation du

tableau de choix des colonnes agrave afficher on peut classiquement choisir combien de

lignes on affiche par page changer de pages etchellip

Lorsque lrsquoon clique sur un des lignes les donneacutees de lrsquoen-tecircte du mails sont

passeacutes en paramegravetres agrave une autre page qui drsquoapregraves ces informations retrouve le

fichier mail brut le traite et lrsquoaffiche

Fig 10 Un mail contenant 3 piegraveces jointes et un message

Comme on peut le voir nous pouvons recevoir desmails avec plusieurs piegraveces

jointes Nous avons ici preacutesenteacute la boicircte de reacuteception mais les autres boicirctes

fonctionnent de maniegravere similaire

Interface drsquoadministration

Le systegraveme de webmail possegravede plusieurs variables des listes de diffusion

des compteshellipMais on veut pouvoir donner les droits agrave un utilisateur demodifier tout

cela En effet si nous trouvons cela abordable drsquoajouter un utilisateur avec une

commande dans le shell il faut aussi penser agrave lrsquoutilisateur final qui preacutefegravere peut-ecirctre

le confort drsquoune interface deacutedieacutee pour geacuterer son serveur mail plutocirct que le terminal

De maniegravere tregraves simple un utilisateur appartenant au groupes drsquoutilisateurs

ldquoAdministrateursrdquo est reconnu en tant qursquoadministrateur par lrsquointerface et peut

cliquer sur un bouton ldquoManagerdquo dans le panneau lateacuteral qui nrsquoest visible qursquoaux

administrateurs De lagrave il arrive sur la page suivante

Fig 11 lrsquointerface drsquoadministration

Sur cette interface il peut choisir la taille maximale des piegraveces jointes

changer le nom de domaine sur lequel est installeacute lrsquointerface et dont deacutependent

toutes les adresses (domaine) Il est aussi possible de modifier directement ces

variables en modifiant le fichier includeconfigincphp Pratique notamment si lrsquoon

a renseigneacute un mauvais nom de domaine agrave la configuration et que lrsquoon arrive plus agrave

acceacuteder agrave lrsquointerface

Il peut aussi creacuteer un nouveau compte en renseignant les champs preacutenom

nom mot de passe et quota Lrsquoutilisateur peut ensuite une fois son compte creacutee

directement se connecter avec son identifiant (initiale preacutenom + nom) et mot de

passe Lors de la creacuteation du compte un mail de bienvenue est envoyeacute au nouvel

utilisateur ce qui permet en arriegravere-plan de creacuteer tous les dossiers utilisateurs et

fichiers en-tecirctes utiles agrave lrsquointerface une fois pour toutes

Lrsquoadministrateur peut aussi ajouter une liste de diffusion (assimileacutee agrave un

groupe) ou en supprimer une parmi les listes existantes

En outre lrsquoadministrateur peut aussi modifier les donneacutees drsquoun utilisateur

Pour cela sur la preacutesente page il peut seacutelectionner un utilisateur parmi la liste des

utilisateurs existants ce qui le redirige vers la page de gestion des comptes

Fig 12 La gestion drsquoun compte seacutelectionneacute ici celui de James Bond

A ce stade il peut changer lrsquoUID de lrsquoutilisateur (utile en cas de conflit) le nom

le mot de passe le quota de cet utilisateur et lrsquoajouter ou le retirer drsquoune liste de

diffusion Accessoirement il peut aussi supprimer le compte en cliquant sur lrsquoeacutenorme

bouton rouge qui lui demandera deux fois de suite de confirmer son action afin

drsquoeacuteviter les erreurs de clic Cette action entraicircne la suppression de lrsquoutilisateur de

toutes les listes de diffusion auxquelles il appartient la suppression de son compte

dans la branche people de lrsquoarbre LDAP et la suppression deacutefinitive de son dossier

utilisateur sur le disquesystegraveme de fichiers impliquant donc la perte de ses mails

Architecture du systegraveme de fichiers

Comme nous lrsquoavons dit plus haut lrsquoideacutee est de se passer des meacutecanismes

classiques avec les clients mails habituels Ces serveurs srsquoalourdissent

geacuteneacuteralement en utilisant des serveurs IMAPPOP3 et un meacutecanisme

drsquoauthentification SMTP

Pour adapter ces fonctionnaliteacutes agrave notre systegraveme nous avons donc constitueacute

une architecture pour organiser les fichiers qui transitent Vous pourrez voir un

scheacutema reacutecapitulatif en annexe 1

Dans la premiegravere moitieacute du projet les mails eacutetaient deacutelivreacutes par Postfix Nous

utilisions un script exeacutecuteacute lors de la reacuteception drsquounmail pour les traiter de lamaniegravere

que nous voulions Cette meacutethode avait les inconveacutenients drsquoecirctre lourde et pas

efficace agrave 100 En effet seuls les mails reccedilus depuis lrsquoexteacuterieur eacutetaient

correctement traiteacutes

Deacutesormais les mails sont traiteacutes totalement par notre script Cela nous

permet de geacuterer les mails dans des dossiers organiseacutes agrave notre maniegravere et de

recevoir les mails locaux crsquoest-agrave-dire entre utilisateurs du mecircme domaine Cette

nouvelle meacutethode regravegle aussi drsquoautres problegravemes notamment au niveau des

permissions sur les fichiers

Pour reacuteduire le nombre drsquoopeacuterations et pour profiter des fonctionnaliteacutes

offertes par le framework utiliseacute pour lrsquointerface web nous regroupons des

informations sur chacun des mails reccedilus sous la forme de fichiers JSON Pour ce

faire lrsquoideacutee est drsquoexeacutecuter un script lorsque leacutevegravenement ldquoreacuteception drsquoun mailrdquo

survient Postfix offre cette possibiliteacute dans sa configuration Or il se trouve qursquoil nrsquoest

pas si simple de reacutecupeacuterer le chemin du fichier contenant le mail car le nom du

fichier creacutee est sous la forme Timestamp UNIX10 Caractegraveres aleacuteatoires (ex

14562336185A8D43E97F)

La seconde probleacutematique est que le webmail doit avoir la possibiliteacute de

pouvoir lire les fichiers pour afficher les mails sur son interface Or il semble que

Postfix les eacutecrit en autorisant uniquement son utilisateur en lecture Il nous a fallu

trouver une solution pour remeacutedier agrave cela Nous avons choisi drsquoajouter www-data

(utilisateur du serveur web) au groupe vmail et de modifier les droits sur les fichiers

de sorte que les utilisateurs de ce groupe puissent lire les fichiers

Nous avons revu une partie de lrsquoorganisation des fichiers pour reacutecupeacuterer les

piegraveces jointes si elles sont preacutesentes Le script que nous avons eacutecrit reacutecupegravere le

fichier original du mail et le deacutecoupe en eacuteleacutements simples dans des fichier distincts

corps du mail et diffeacuterentes piegraveces jointes De cette maniegravere pour afficher un mail

nous nrsquoavons pas besoin de charger la totaliteacute du fichier Dans le cas ougrave il y a des

piegraveces jointes cela aurait ralenti lrsquoaffichage des informations

Nous avons eacutegalement impleacutementeacute la gestion des quotas Dans lrsquoeacutetat actuel

des choses srsquoil nrsquoy a plus de place disponible pour lrsquoutilisateur le mail nrsquoest tout

bonnement pas deacutelivreacute agrave ce destinataire Lrsquoideacuteal aurait eacuteteacute de notifier leacutemetteur avec

un mail ce qui nrsquoest pour lrsquoinstant pas le cas mais qui pourrait ecirctre reacutesolu en

renvoyant agrave postfix un code drsquoerreur deacutefini

Pour terminer nous avons revu la totaliteacute du code deacuteveloppeacute Nous sommes

passeacute du Bash au Perl Ce dernier est plus performant et plus simple agrave utiliser et agrave

lire

Firewall

Un autre gros morceau du projet mais qui nrsquoest pas speacutecifiquement lieacute agrave la

probleacutematique du mail crsquoest la seacutecurisation du serveur En effet apregraves avoir mis en

ligne notre serveur des pirates ont tregraves vite tenteacute de peacuteneacutetrer le systegraveme

Globalement les attaques eacutetaient de type force brute sur les services heacutebergeacutes sur

notre Raspberry neacutecessitant une identification tels que SSH SMTP hellip

On retrouve ici un petit point faible du protocole SMTP Eacutetant donneacute que

chaque serveur mail doit avoir une adresse postmaster et abuse lrsquoattaquant a agrave sa

disposition deux adresses agrave attaquer Ceci dit ce type drsquoattaque est simple agrave

contrecarrer car il suffit de limiter dans le temps le nombre de tentatives de

connexions

La contre-mesure que nous avons mis en place est simple une seacuterie de

regravegles Iptables En reacutesumeacute nous avons opteacute pour un systegraveme de liste blanche et

noire Les adresses IPs de la liste blanche sont autoriseacutees agrave utiliser la totaliteacute des

services (notamment SSH) tandis que celles de la liste noire sont totalement

ignoreacutees Les autres IPs nrsquoont accegraves qursquoau webmail

Eacutetant donneacute que le nombre drsquoIPs attaquant notre serveur nrsquoa cesseacute

drsquoaugmenter nous avons automatiseacute la mise agrave jour de la liste de noire en

deacuteveloppant un script pour Cron Ce script est exeacutecuteacute une fois par heure A ce jour

notre liste noire contient 47 adresses Bien sucircr ce systegraveme est susceptible drsquoecirctre

modifieacute agrave convenance pour passer sur une solution deacutedieacutee telle que Fail2ban qui fait

en fait ce qursquoon fait deacutejagrave (eacutetudier les logs et bannir des IP avec iptables) avec des

regravegles preacutedeacutefinies par la communauteacute et personnalisables En effet nous nous

attendons agrave voir la varieacuteteacute et le nombre drsquoattaques augmenter apregraves avoir migreacute sur

une IP non proteacutegeacutee par le firewall de lrsquoUniversiteacute puisque nous nrsquoavons plus la

premiegravere ligne de deacutefense du CRI en particulier pour le port 389 (LDAP) qui eacutetait

bloqueacute par lrsquouniversiteacute et srsquoest retrouveacute en premiegravere ligne apregraves la migration Nous

avons donc ajouteacute une regravegle bloquant tout le trafic entrant vers le port 389 hormis

localhost

Package drsquoinstallation

Nous avons creacutee un package deb contenant les sources du webmail ainsi

que des scripts utiles agrave lrsquoinstallation et au fonctionnement du serveur Nous avons

deacuteveloppeacute des scripts de configuration automatique pour LDAP et Postfix Comme

dpkg ne supporte pas directement lrsquoinstallation automatique des deacutependances

nous recommandons drsquoinstaller avant tout le paquet gdebi-core qui est en fait un

dpkg ameacutelioreacute Gracircce agrave la commande gdebi paquetdeb toutes les deacutependances

seront installeacutees en particulier postfix le serveur ldap le serveur web lighttpd entre

autres sans soucis Il est agrave noter que comme les scripts de configuration des

diffeacuterents services ne sont que partiellement impleacutementeacutes dans le paquet deb nous

fournissons en annexe un README complet et illustreacute qui explique pas agrave pas

comment faire fonctionner notre systegraveme sur nrsquoimporte quel Linux en particulier les

lignes de configuration des diffeacuterents services agrave changer et un exemplaire des

fichiers de configuration fonctionnels de ces services

Gestion de lrsquoeacutenergie

Une consideacuteration importante pour un systegraveme autonome Drsquoapregraves les fiches

techniques notre modegravele de Raspberry Pi (B 2) est officiellement eacutevalueacute avec un

fonctionnement agrave ~650mA pour 5V De nombreux proprieacutetaires de ce systegraveme

eacutequipeacutes se sont amuser agrave veacuterifier la consommation eacutelectrique reacuteelle de leur Pi 2 B

sous diffeacuterentes charges On pourra retenir cette eacutetude (lien en sitegraphie) qui

relegraveve la consommation en courant en fonction de lrsquoactiviteacute lanceacutee sur la Pi mais

aussi en charge sur 1 agrave 4 CPU

Ces chiffres sont releveacutes sur un systegraveme avec cameacutera connecteacutee HDMI connecteacute et

cacircble ethernet brancheacute et actif

On peut constater que globalement notre systegraveme Pi 2 B tournant sans

interface graphique sans composant suppleacutementaire sans sortie videacuteo ni cameacutera

avec plusieurs serveurs tournant tout en restant le plus leacuteger possible et demeurant

~99 idle la plupart du temps ne devrait pas deacutepasser une consommation de

300mA grand maximum

Fig 13 Un processeur tregraves tregraves peu chargeacute et une meacutemoire relativement libre

Nous avions lrsquoanneacutee derniegravere deacutejagrave reacutealiseacute un circuit permettant drsquoadapter un

panneau solaire sur une batterie USB classique de 9000mAh Nous avions alors pu

mesurer lrsquointensiteacute deacutelivreacutee par le panneau solaire En cas drsquoensoleillement moyen

habituel dans nos contreacutees le panneau solaire deacutebitait 400mA et pouvait atteindre

le double quand le soleil eacutetait directement preacutesent pour environ 800mA deacutebiteacute

Ce panneau solaire accompagneacute de son circuit drsquoadaptation devrait donc

suffire pour alimenter notre systegraveme la journeacutee le brancher ensuite sur une batterie

portable permet de stocker le surplus pour la nuit

Fig 14 le circuit drsquoadaptation

Fig 15 et son PCB

Eacutevolutions possibles

Webmail

Concernant les eacutevolutions possibles que nous aurions aimeacute apporter agrave notre

projet avec plus de temps commenccedilons par le web Nous aurions souhaiteacute apporter

la gestion de lrsquoenvoi de plusieurs piegraveces jointes comme nous lrsquoavons fait pour la

reacuteception

De plus nous aurions voulu inteacutegrer une corbeille ougrave lesmessages pourraient

aller avant drsquoecirctre deacutefinitivement supprimeacutes du systegraveme drsquoautant que nous avons

deacutejagrave eacutecrites les fonctions PHP permettant de retirer une en-tecircte drsquoun fichier JSON et

le fichier mail associeacute

Enfin nous aurions aimeacute en plus du blocage deacutejagrave preacutesent impleacutementer une

gestion plus profonde des piegravece jointes permettant notamment le remplissage de la

boicircte de spams

Systegraveme

Il aurait eacuteteacute inteacuteressant de notifier lrsquoexpeacutediteur lorsque le mail nrsquoa pas pu ecirctre

deacutelivreacute agrave un utilisateur lorsque son quota est plein En toute logique cela devrait ecirctre

fait simplement avec la commande Sendmail

Une meilleur gestion du trafic mail indeacutesirable aurait eacuteteacute la bienvenue En

effet malgreacute la limitation du spam il restera toujours une partie du volume de mail

qui sera indeacutesirable (pub pishing scam hellip)

Eacutetant donneacute la taille du systegraveme nous avions penseacute agrave une approche

ldquomachine learningrdquo Lrsquoutilisateur indiquerait pourquoi il considegravere le mail comme

indeacutesirable constituant des regravegles refusant certains mails Les mails provenant de

cet expeacutediteur pourraient ecirctre deacutetecteacute par le script agrave la reacuteception et

automatiquement envoyeacutes dans la boicircte de spams

Partie eacutenergeacutetique

Mecircme si la solution au panneau solaire ne pose aucun problegraveme en theacuteorie

nous aurions deacutejagrave dans un premier temps aimeacute lrsquoimpleacutementer en pratique Nous

nrsquoavons finalement pas reacutealiseacute notre objectif de deacutetecter deux cas drsquoalimentation

diffeacuterents soit lrsquoalimentation via panneau solaire est suffisante dans ce cas il

alimente la batterie et donc la Raspberry soit quand ce courant nrsquoest pas suffisant

on alimente la batterie par le secteur

Conclusion

En conclusion nous pensons avoir reacutepondu au cahier des charges initial dans

sa majeure partie Nous sommes aujourdrsquohui en mesure de proposer une solution

mail domestique priveacutee et personnalisable par un particulier

Notre installation de Debian a eacuteteacute au maximum alleacutegeacutee pour notre utilisation

sans interface graphique et nous avons mis en place une reacuteponse aux diverses

attaques que nous avons pu subir lors de lamise en place de notre solution logicielle

En outre le pare-feu avec notre systegraveme de liste noire bloque une partie des

attaques qui peuvent nous parvenir

Nos diffeacuterents scripts de pare-feu de gestion drsquoun mail entrant associeacute au

webmail permettent agrave un utilisateur drsquoacceacuteder aux fonctions usuelles associeacutees agrave

lrsquoenvoi et la reacuteception de mails

Gracircce agrave sa configuration personnalisable notre projet devrait pouvoir ecirctre

porteacute sur un domaine et une adresse IP diffeacuterente sans soucis et ecirctre deacuteployeacute

partout ougrave des gens souhaitent conserver leur vie priveacutee

Nous regretterons cependant de ne pas avoir exploiteacute la partie eacutenergeacutetique

de ce projet qui portait une probleacutematique inteacuteressante et qui nous parait importante

dans le monde actuel

Ce projet nous aura occupeacute pendant tregraves longtemps et nous sommes fiers du

travail que nous avons accompli Il est agrave nos yeux la preuve de ce que nous savons et

pouvons faire et nous donnera confiance pour notre deacutebut de carriegravere drsquoingeacutenieur

Sources

httpwwwradicaticomwpwp-contentuploads201401Email-Statistics-R

eport-2014-2018-Executive-Summarypdf

httpwwwcommentcamarchenetcontents525-le-protocole-ldap

httpsfrwikipediaorgwikiSimple_Mail_Transfer_Protocol

httpwwwcommentcamarchenetcontents536-pop3-smtp-imap-protocol

es-de-messagerie

httpstoolsietforghtmlrfc2821

httpsfrwikipediaorgwikiInternet_Message_Access_Protocol

httpstoolsietforghtmlrfc3501

httparstechnicacominformation-technology201402how-to-run-your-ow

n-e-mail-server-with-your-own-domain-part-1

httpswwwraspberrypiorgforumsviewtopicphpp=136912

httpstackoverflowcomquestions17394356how-can-i-make-a-bash-com

mand-run-periodically

httpuntroubledorgnullmailer

httpelinuxorgRPi_Hardware

httpraspitv2015raspberry-pi2-power-and-performance-measurement

Annexe 1 Architecture du systegraveme de fichiers

Annexe 2 Scan DNSSTUFF

Depuis httpwwwdnsstuffcomtoolsdnsReport|type=domainampampvalue=intimailpw

Annexe 3 Vue geacuteneacuterale httpswwwintimailpw

Annexe 4 Envoyer un mail

Annexe 5 Boite de reacuteception

Annexe 6 Interface drsquoadministration

Annexe 7 Gestion drsquoun utilisateur

Tutorial installation intimailtrade

Table des matiegraveres Apregraves une nouvelle installation de lrsquoOS 2

Seacutecurisation du serveur 2

Changement de lrsquoutilisateur par deacutefaut 2

Changement du port SSH 2

Interdire lrsquoauthentification SSH pour root 2

Installation de LDAP 3

Configuration de base 3

Configuration des Scheacutemas 4

Constitution de la base de donneacutees LDAP 5

Installation de Postfix 7

Installation de Bind9 8

Installation du paquet Debian et configuration de lighttpd 9

Deacutependances 11

Sources 12

2

Apregraves une nouvelle installation de lrsquoOS Exeacutecutez ces commandes pour mettre agrave jour agrave la derniegravere version Ces opeacuterations peuvent prendre un certain

temps Nous avons utiliseacute pour cet exemple Raspbian Jessie Lite sur une Raspberry Pi 2

apt-get update

apt-get upgrade ampamp apt-get dist-upgrade

apt-get install linux-headers-$(uname -r)

reboot

Puis lancer

raspi-config

Etendre au maximum lrsquoespace de stockage en navigant dans les menus

Expand Filesystem

Reacutegler une ip statique avec la box fichier etcnetworkinterfaces

iface eth0 inet static

address 192168131

netmask 2552552550

gateway 19216811

Nous avons aussi supprimeacute wpasupplicant

Seacutecurisation du serveur

Changement de lrsquoutilisateur par deacutefaut Changez le nom drsquoutilisateur par deacutefaut ainsi que son mot de passe

sudo passwd root

Sortie et login en tant que root puis

usermod -l myuname pi

usermod -m -d homemyuname myuname

groupmod ndashn myuname pi

passwd myuname

Voir cette adresse pour lrsquoutilisation de cleacutes priveacuteespubliques

Changement du port SSH sed ndashi sPort 22Port 2222g etcsshsshd_config

Interdire lrsquoauthentification SSH pour root sed -i sPermitRootLogin yesPermitRootLogin nog etcsshsshd_config

3

Installation de LDAP

Configuration de base Installation du package

apt-get install slapd

Choisir un mot de passe administrateur puis lancer la commande

dpkg-reconfigure slapd

Reacutepondre non agrave la question 1

Entrez le nom de domaine utiliseacute agrave la question 2 sous la forme domainetld

Entrez ce que vous voulez au 3egraveme eacutecran le nom de lrsquoorganisation ne sera pas utiliseacute

Entrez un mot de passe

Choisissez HDB

Choisissez si la base de donneacutees est supprimeacutee agrave la deacutesinstallation de slapd

Deacuteplacez lrsquoancienne base de donneacutees

Nrsquoutilisez pas LDAPv2

Installer les outils de conversion pour ldap (slaptest ldapmodify notamment)

apt-get install ldap-utils

On peut maintenant veacuterifier que la configuration est valable

ldapsearch -x -h localhost -b dc=domainedc=tld -LLL dc=domaine dn

Cette commande doit retourner quelque chose comme

dn dc=domainedc=tld

Il faut maintenant seacutecuriser le serveur LDAP en effet on peut y acceacuteder en anonyme avec la commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=config

(amp(objectClass=olcDatabaseConfig)(olcSuffix=dc=domainedc=tld))

Cette commande retourne un certain nombre drsquoinformations notamment agrave propos des champs suivants

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by none

olcAccess 1to dnbase= by read

olcAccess 2to by read

On va modifier ces champs avec la commande ldapmodify Pour cela on va creacuteer un fichier ldif

cat gt changeAccessldif ltlt EOF

dn olcDatabase=1hdbcn=config

changetype modify

delete olcAccess

-

add olcAccess

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by dn=cn=admindc=domainedc=tld write by none

-

add olcAccess

olcAccess 1to dnbase= by read

-

4

add olcAccess

olcAccess 2to by self write by dn=cn=admindc=domainedc=tld write by

none

-

EOF

On peut maintenant appliquer les changements avec ldapmodify

ldapmodify ndashc ndashY EXTERNAL ndashH ldapi -f changeAccessldif

La commande devrait vous confirmer que la modification srsquoest bien effectueacutee

SASLEXTERNAL authentication started

SASL username gidNumber=0+uidNumber=0cn=peercredcn=externalcn=auth

SASL SSF 0

modifying entry olcDatabase=1hdbcn=config

On peut veacuterifier qursquoon ne peut plus acceacuteder aux informations avec la commande

ldapsearch -x -c -h localhost -b dc=domainedc=tld

On peut veacuterifier la configuration en se connectant en tant qursquoadministrateur

ldapsearch -c -h localhost -b dc=domainedc=tld -D

cn=admindc=domainedc=tld ndashW

Configuration des Scheacutemas Nous allons utiliser les scheacutemas de courier-ldap Pour eacuteviter une manipulation compliqueacutee vous trouverez

directement le scheacutema avec le fichier authldapschema On place ce fichier dans le dossier

mv authldapschema etcldapschema

Nous creacuteons un fichier qui incluera tous les scheacutemas de base en plus du nouveau On peut les afficher avec la

commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

Creacuteation du fichier de configuration pour notre exemple cela donne

mkdir tmpldapconf

cat gt tmpldapconfldapconf ltlt EOF

include etcldapschemacoreschema

include etcldapschemacosineschema

include etcldapschemanisschema

include etcldapschemainetorgpersonschema

include etcldapschemaauthldapschema

EOF

On lance ensuite la commande

slaptest -f tmpldapconfldapconf -F tmpldapconf

Elle revoie un message de succegraves Cette commande a creacuteeacute dans le reacutepertoire tmpldapconf une arborescence

correspondant agrave la configuration de notre LDAP

On modifie le chemin de configuration

5

sed ndashi 0dnauthldap sauthldapauthldapcn=schemacn=config

cn=authldapldif

On supprime ensuite les 7 derniegraveres lignes du fichier

head -n -7 cn=authldapldif gt tmpldif

mv tmpldif cn=authldapldif

On peut maintenant importer notre fichier de configuration Pour ce faire

ldapadd -Y EXTERNAL -H ldapi -f

tmpldapconfcn=configcn=schemacn=authldapldif

Si tout va bien lrsquoentreacutee devrait avoir eacuteteacute ajouteacutee On peut veacuterifier avec la commande vue tout agrave lrsquoheure

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

On devrait voir en plus le nouveau scheacutema authldap

Constitution de la base de donneacutees LDAP Le remplissage de la base se fait agrave lrsquoaide de fichiers ldif Nous donnons ici un exemple de structure

Fichier pour la structure de base

dn dc=maildc=domainedc=tld

o intimailpw

description Global mail tree

dc mail

objectClass top

objectClass dcObject

objectClass organization

dn dc=peopledc=maildc=domainedc=tld

description Informations of all users

o people

dc people

objectClass top

objectClass dcObject

objectClass organization

dn dc=groupsdc=maildc=domainedc=tld

description All groups of users

o groups

dc groups

objectClass top

objectClass dcObject

objectClass organization

6

Fichier pour ajouter un utilisateur

dn cn=jbonddc=peopledc=maildc=domainedc=tld

uid jbond

mail jbonddomainetld

sn Moulin

givenName James

displayName James Bond

mailbox domainetldjbond

quota 50M

homeDirectory homevmail

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAccount

userPassword SSHA367PSXiUAegy8dpJbPU8OepEf8L5ye

Pour obtenir un hash du mot de passe

slappasswd -s password -h SSHA

On peut par la suite ajouter la configuration agrave la base de donneacutees avec la commande

ldapadd -D cn=admindc=domainedc=tld -W -h localhost -f pathtofile

Si les champs proposeacutes ne sont pas suffisants il faudra alors effectuer les modifications dans le fichier autldapschema

proposeacute plus haut et refaire la manipulation de configuration

De plus les standards du Mail deacutecrit par lrsquoIETF (RFC822 63 RFC1123 527 and RFC2821 451) impliquent drsquoavoir une

adresse Postmaster et une Abuse Pour cela nous pourrions creacuteer ces adresses avec la meacutethode vue au-dessus mais

ce nrsquoest pas la meilleure Il est preacutefeacuterable drsquoutiliser un alias comme nous le ferons avec les listes de diffusion Ici nous

proposons de rediriger ces deux adresses vers une adresse administrateur Pour cela la meacutethode est la mecircme sauf

que le fichier ldif nrsquoest pas tout agrave fait identique En voici un exemple

dn cn=postmasterdc=groupsdc=maildc=domainedc=tld

uid postmaster

mail postmasterdomainetld

sn Postmaster

displayName Postmaster

maildrop admindomainetld

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAlias

Pour faire une liste de diffusion la meacutethode est la mecircme Il suffit drsquoajouter toutes les adresses destinataires dans le

champ maildrop seacutepareacutees par des virgules ()

7

Installation de Postfix Installation des packages

apt-get install postfix postfix-ldap

Lors de lrsquoinstallation deux eacutecrans deacutefilent

- Configuration Internet Site

- Valeur par deacutefaut pour le mail name

On creacutee lrsquoutilisateur qui servira agrave exeacutecuter Postfix

groupadd vmail

useradd -g vmail -d homevmail -s binfalse -m vmail

Nous aurons besoin dans la suite des GID et UID creacuteeacutes agrave cet instant Ils peuvent ecirctre afficheacutes avec les commandes

cat etcgroup | grep vmail | cut -d -f3

cat etcpasswd | grep vmail | cut -d -f3

On ajoute les paramegravetres au fichier etcpostfixmaincf (remplacer les valeurs de GID et drsquoUID avec vos valeurs)

smtpd_banner = maildomainetld

virtual_mailbox_base = homevmail

virtual_mailbox_domains = dmainetld

virtual_mailbox_maps = ldapetcpostfixldap_accountscf

virtual_alias_maps = ldapetcpostfixldap_aliasescf

virtual_minimum_uid = 100

virtual_gid_maps = static1001 Remplacez ici par votre valeur de GID

virtual_uid_maps = static1001 Remplacez ici par votre valeur drsquoUID

Il nous faut maintenant constituer nos fichiers de configuration ldap_accountscf

cat gt etcpostfixldap_accountscf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=peopledc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAccount)(mail=s))

result_attribute = mailbox

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

Et pour ldap_aliasescf

cat gt ldap_aliasescf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=groupsdc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAlias)(mail=s))

result_attribute = maildrop

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

8

On peut maintenant veacuterifier la configuration de Postfix avec (cette commande ne doit rien retourner si crsquoest bon)

postfix check

Si crsquoest bon alors on recharge le serveur

postfix reload

On peut alors faire un envoi de mail test via telnet

telnet localhost 25

Si vous souhaitez deacutelivrer les mails agrave votre maniegravere il faut dans le fichier etcpostfixmaincf la ligne

virtual_transport = nomdevotreregle

Et de mecircme dans le fichier etcpostfixmastercf

nomdevotreregle unix - n n - 5 pipe

flags=Rq user=vmail null_sender=

argv=chemindevotreprogramme

Il nous reste maintenant agrave configurer les diffeacuterents enregistrements DNS neacutecessaire au fonctionnement drsquoun serveur

mail Vous pouvez utiliser la solution de votre choix Dans la suite vous trouverez une meacutethode utilisant Bind9

Installation de Bind9 Dans toute cette partie on se situera dans le dossier etcbind Dans la suite notre IP sera abcd

Dans le fichier namedconfoptions on ajoutera dans le champ options

version Not supported

Dans un dossier zones on eacutecrit le fichier dbdomainetld

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122111 Serial

43200 Refresh

3600 Retry

2419200 Expire

86400 ) Negative Cache TTL

IN NS nsdomainetld

IN NS ns11ovhnet

ns IN A abcd

www IN A abcd

IN A abcd

IN MX 10 maildomainetld

mail IN A abcd

Dans le mecircme dossier zones on a cbain-addrarpa

9

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122101 serial

14400 refresh

3600 retry

604800 expire

10800 minimum

)

cbain-addrarpa IN NS nsdomainetld

cbain-addrarpa IN NS ns11ovhnet

d IN PTR maildomainetld

Il faut faire attention agrave bien increacutementer le serial pour chaque modification des fichiers

Dans le fichier namedconflocal

zone domainetld

type master

file etcbindzonesdbdomainetld

allow-transfer 213251128130

notify yes

zone cbain-addrarpa IN

type master

file etcbindzonescbain-addrarpa

allow-transfer 213251128130

Ici 213251128130 est lrsquoadresse IP du serveur ns11ovhnet

Il faut bien sucircr configurer le DNS avec votre fournisseur (Gandi OVH hellip) Pour ccedila amusez-vous bien Vous pouvez

aussi tester votre configuration avec des outils en ligne tels que DNSstuff

En test final si votre configuration est bonne vous devriez pouvoir envoyer un mail depuis un service neutre (Gmail

yahoo hellip) et le voir dans votre arborescence (ici homevmaildomainetld)

Installation du paquet Debian et configuration de lighttpd

Commencez par reacutecupeacuterer le paquet deb agrave lrsquoadresse suivante httpswwwintimailpwintimaildeb

Installez ensuite GDebi Il srsquoagit drsquoun dpkg ameacutelioreacute pour teacuteleacutecharger les deacutependances automatiquement ce que

dpkg ne gegravere pas

apt-get update

apt-get install gdebi-core

10

Vous pouvez alors installer le paquet

gdebi intimaildeb

Vous aurez alors le site web drsquointiMail deacuteployeacute au chemin varwwwwebmail

Il ne vous reste plus qursquoagrave changer la configuration de lighttpd votre serveur web pour mettre en ligne le site

Vous pouvez pour cela copier-coller la configuration suivante mais veillez agrave bien changer lrsquoadresse IP preacutesente au

deacutebut de la partie SSL CONFIG avec votre adresse IP

serv ermodules = ( mod_access

mod_accesslog

mod_alias

mod_compress

mod_redirect

mod_rewrite

)

Hide server version

servertag = Such Headers Very try Now close telnet

serverdocument-root = varwwwwebmail

serverupload-dirs = ( varwwwwebmailuploads )

servererrorlog = varloglighttpderrorlog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

serverport = 80

accesslogformat = V h l u t r gts b Refereri

User-Agenti

accesslogfilename = varloglighttpdaccesslog

index-filenames = ( indexphp indexhtml

indexlighttpdhtml )

urlaccess-deny = ( ~ inc )

static-fileexclude-extensions = ( php pl fcgi )

compresscache-dir = varcachelighttpdcompress

compressfiletype = ( applicationjavascript textcss

texthtml textplain )

default listening port for IPv6 falls back to the IPv4 port

include_shell usrsharelighttpduse-ipv6pl + serverport

include_shell usrsharelighttpdcreate-mimeassignpl

include_shell usrsharelighttpdinclude-conf-enabledpl

SSL CONFIG

$SERVER[socket] == 5234485443

sslengine = enable

11

sslpemfile = etclighttpdsslintimailpwpem

sslca-file = etclighttpdsslintimailpwcrt

servername = intimailpw

votre configuration habituelle pour ce domaine

serverdocument-root = varwwwwebmail

servererrorlog = varloglighttpderror_ssllog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

Rewrite des URL pour masquer php

urlrewrite-once = ( ^()$ =gt $1 )

urlrewrite-if-not-file = ( ^([^])()$ =gt $1php$2 )

servernetwork-backend = writev

Deacutependances Slapd

Ldap-utils

Postfix

Postfix-ldap

Bind9

Lighttpd

12

Sources httpswikigandinetfrhostingusing-linuxtutorialsdebianmail-server-ldap

httpwwwpostfixorgpipe8html

httpwwwpostfixorgFILTER_READMEhtml

httpwwwpostfixorg

httpwwwpostfixorgtransport5html

Page 14: Système d'hébergement domestique...place sur les domaines .pw par Gandi.net, notre fournisseur. Nous n’avons donc pas pu l’implémenter. Nous avons configuré Postfix pour qu’il

taille du mail qui vient drsquoecirctre envoyeacute ainsi que creacuteer un fichiermail brut sur le disque

pour pouvoir afficher le mail dans la boicircte drsquoenvoi et en garder une trace

Notons que comme crsquoest lrsquoutilisateur web du systegraveme (www-data) qui exeacutecute

la fonction nous modifions les en-tecirctes du mail afin que le destinataire reccediloive un

mail de la part de ldquoPreacutenom Nomrdquo depuis lrsquoadresse ldquopnomdomainetldrdquo plutocirct que

ldquowww-datadomaintldrdquo par deacutefaut

La migration vers une IP externe agrave Lille 1 eacutetant reacuteussie nous pouvons bien

envoyer des mails depuis notre interface qui sont reccedilus agrave lrsquoexteacuterieur sans soucis

Mais aussi en recevoir

Recevoir des mails est tout aussi important Nous avons vu lrsquoarchitecture en

arriegravere-plan mais au final agrave quoi cela ressemble-t-il pour lrsquoutilisateur Il dispose en

fait en cliquant sur Inbox (ou Sent Spam ou Trash eacutegalement) drsquoun accegraves agrave sa boicircte

de reacuteception Drsquoun clic srsquoaffichent alors agrave lui tous les mails qursquoil a reccedilu

Fig 9 La boicircte de reacuteception

On remarque notamment les fonctions de recherche drsquoactualisation du

tableau de choix des colonnes agrave afficher on peut classiquement choisir combien de

lignes on affiche par page changer de pages etchellip

Lorsque lrsquoon clique sur un des lignes les donneacutees de lrsquoen-tecircte du mails sont

passeacutes en paramegravetres agrave une autre page qui drsquoapregraves ces informations retrouve le

fichier mail brut le traite et lrsquoaffiche

Fig 10 Un mail contenant 3 piegraveces jointes et un message

Comme on peut le voir nous pouvons recevoir desmails avec plusieurs piegraveces

jointes Nous avons ici preacutesenteacute la boicircte de reacuteception mais les autres boicirctes

fonctionnent de maniegravere similaire

Interface drsquoadministration

Le systegraveme de webmail possegravede plusieurs variables des listes de diffusion

des compteshellipMais on veut pouvoir donner les droits agrave un utilisateur demodifier tout

cela En effet si nous trouvons cela abordable drsquoajouter un utilisateur avec une

commande dans le shell il faut aussi penser agrave lrsquoutilisateur final qui preacutefegravere peut-ecirctre

le confort drsquoune interface deacutedieacutee pour geacuterer son serveur mail plutocirct que le terminal

De maniegravere tregraves simple un utilisateur appartenant au groupes drsquoutilisateurs

ldquoAdministrateursrdquo est reconnu en tant qursquoadministrateur par lrsquointerface et peut

cliquer sur un bouton ldquoManagerdquo dans le panneau lateacuteral qui nrsquoest visible qursquoaux

administrateurs De lagrave il arrive sur la page suivante

Fig 11 lrsquointerface drsquoadministration

Sur cette interface il peut choisir la taille maximale des piegraveces jointes

changer le nom de domaine sur lequel est installeacute lrsquointerface et dont deacutependent

toutes les adresses (domaine) Il est aussi possible de modifier directement ces

variables en modifiant le fichier includeconfigincphp Pratique notamment si lrsquoon

a renseigneacute un mauvais nom de domaine agrave la configuration et que lrsquoon arrive plus agrave

acceacuteder agrave lrsquointerface

Il peut aussi creacuteer un nouveau compte en renseignant les champs preacutenom

nom mot de passe et quota Lrsquoutilisateur peut ensuite une fois son compte creacutee

directement se connecter avec son identifiant (initiale preacutenom + nom) et mot de

passe Lors de la creacuteation du compte un mail de bienvenue est envoyeacute au nouvel

utilisateur ce qui permet en arriegravere-plan de creacuteer tous les dossiers utilisateurs et

fichiers en-tecirctes utiles agrave lrsquointerface une fois pour toutes

Lrsquoadministrateur peut aussi ajouter une liste de diffusion (assimileacutee agrave un

groupe) ou en supprimer une parmi les listes existantes

En outre lrsquoadministrateur peut aussi modifier les donneacutees drsquoun utilisateur

Pour cela sur la preacutesente page il peut seacutelectionner un utilisateur parmi la liste des

utilisateurs existants ce qui le redirige vers la page de gestion des comptes

Fig 12 La gestion drsquoun compte seacutelectionneacute ici celui de James Bond

A ce stade il peut changer lrsquoUID de lrsquoutilisateur (utile en cas de conflit) le nom

le mot de passe le quota de cet utilisateur et lrsquoajouter ou le retirer drsquoune liste de

diffusion Accessoirement il peut aussi supprimer le compte en cliquant sur lrsquoeacutenorme

bouton rouge qui lui demandera deux fois de suite de confirmer son action afin

drsquoeacuteviter les erreurs de clic Cette action entraicircne la suppression de lrsquoutilisateur de

toutes les listes de diffusion auxquelles il appartient la suppression de son compte

dans la branche people de lrsquoarbre LDAP et la suppression deacutefinitive de son dossier

utilisateur sur le disquesystegraveme de fichiers impliquant donc la perte de ses mails

Architecture du systegraveme de fichiers

Comme nous lrsquoavons dit plus haut lrsquoideacutee est de se passer des meacutecanismes

classiques avec les clients mails habituels Ces serveurs srsquoalourdissent

geacuteneacuteralement en utilisant des serveurs IMAPPOP3 et un meacutecanisme

drsquoauthentification SMTP

Pour adapter ces fonctionnaliteacutes agrave notre systegraveme nous avons donc constitueacute

une architecture pour organiser les fichiers qui transitent Vous pourrez voir un

scheacutema reacutecapitulatif en annexe 1

Dans la premiegravere moitieacute du projet les mails eacutetaient deacutelivreacutes par Postfix Nous

utilisions un script exeacutecuteacute lors de la reacuteception drsquounmail pour les traiter de lamaniegravere

que nous voulions Cette meacutethode avait les inconveacutenients drsquoecirctre lourde et pas

efficace agrave 100 En effet seuls les mails reccedilus depuis lrsquoexteacuterieur eacutetaient

correctement traiteacutes

Deacutesormais les mails sont traiteacutes totalement par notre script Cela nous

permet de geacuterer les mails dans des dossiers organiseacutes agrave notre maniegravere et de

recevoir les mails locaux crsquoest-agrave-dire entre utilisateurs du mecircme domaine Cette

nouvelle meacutethode regravegle aussi drsquoautres problegravemes notamment au niveau des

permissions sur les fichiers

Pour reacuteduire le nombre drsquoopeacuterations et pour profiter des fonctionnaliteacutes

offertes par le framework utiliseacute pour lrsquointerface web nous regroupons des

informations sur chacun des mails reccedilus sous la forme de fichiers JSON Pour ce

faire lrsquoideacutee est drsquoexeacutecuter un script lorsque leacutevegravenement ldquoreacuteception drsquoun mailrdquo

survient Postfix offre cette possibiliteacute dans sa configuration Or il se trouve qursquoil nrsquoest

pas si simple de reacutecupeacuterer le chemin du fichier contenant le mail car le nom du

fichier creacutee est sous la forme Timestamp UNIX10 Caractegraveres aleacuteatoires (ex

14562336185A8D43E97F)

La seconde probleacutematique est que le webmail doit avoir la possibiliteacute de

pouvoir lire les fichiers pour afficher les mails sur son interface Or il semble que

Postfix les eacutecrit en autorisant uniquement son utilisateur en lecture Il nous a fallu

trouver une solution pour remeacutedier agrave cela Nous avons choisi drsquoajouter www-data

(utilisateur du serveur web) au groupe vmail et de modifier les droits sur les fichiers

de sorte que les utilisateurs de ce groupe puissent lire les fichiers

Nous avons revu une partie de lrsquoorganisation des fichiers pour reacutecupeacuterer les

piegraveces jointes si elles sont preacutesentes Le script que nous avons eacutecrit reacutecupegravere le

fichier original du mail et le deacutecoupe en eacuteleacutements simples dans des fichier distincts

corps du mail et diffeacuterentes piegraveces jointes De cette maniegravere pour afficher un mail

nous nrsquoavons pas besoin de charger la totaliteacute du fichier Dans le cas ougrave il y a des

piegraveces jointes cela aurait ralenti lrsquoaffichage des informations

Nous avons eacutegalement impleacutementeacute la gestion des quotas Dans lrsquoeacutetat actuel

des choses srsquoil nrsquoy a plus de place disponible pour lrsquoutilisateur le mail nrsquoest tout

bonnement pas deacutelivreacute agrave ce destinataire Lrsquoideacuteal aurait eacuteteacute de notifier leacutemetteur avec

un mail ce qui nrsquoest pour lrsquoinstant pas le cas mais qui pourrait ecirctre reacutesolu en

renvoyant agrave postfix un code drsquoerreur deacutefini

Pour terminer nous avons revu la totaliteacute du code deacuteveloppeacute Nous sommes

passeacute du Bash au Perl Ce dernier est plus performant et plus simple agrave utiliser et agrave

lire

Firewall

Un autre gros morceau du projet mais qui nrsquoest pas speacutecifiquement lieacute agrave la

probleacutematique du mail crsquoest la seacutecurisation du serveur En effet apregraves avoir mis en

ligne notre serveur des pirates ont tregraves vite tenteacute de peacuteneacutetrer le systegraveme

Globalement les attaques eacutetaient de type force brute sur les services heacutebergeacutes sur

notre Raspberry neacutecessitant une identification tels que SSH SMTP hellip

On retrouve ici un petit point faible du protocole SMTP Eacutetant donneacute que

chaque serveur mail doit avoir une adresse postmaster et abuse lrsquoattaquant a agrave sa

disposition deux adresses agrave attaquer Ceci dit ce type drsquoattaque est simple agrave

contrecarrer car il suffit de limiter dans le temps le nombre de tentatives de

connexions

La contre-mesure que nous avons mis en place est simple une seacuterie de

regravegles Iptables En reacutesumeacute nous avons opteacute pour un systegraveme de liste blanche et

noire Les adresses IPs de la liste blanche sont autoriseacutees agrave utiliser la totaliteacute des

services (notamment SSH) tandis que celles de la liste noire sont totalement

ignoreacutees Les autres IPs nrsquoont accegraves qursquoau webmail

Eacutetant donneacute que le nombre drsquoIPs attaquant notre serveur nrsquoa cesseacute

drsquoaugmenter nous avons automatiseacute la mise agrave jour de la liste de noire en

deacuteveloppant un script pour Cron Ce script est exeacutecuteacute une fois par heure A ce jour

notre liste noire contient 47 adresses Bien sucircr ce systegraveme est susceptible drsquoecirctre

modifieacute agrave convenance pour passer sur une solution deacutedieacutee telle que Fail2ban qui fait

en fait ce qursquoon fait deacutejagrave (eacutetudier les logs et bannir des IP avec iptables) avec des

regravegles preacutedeacutefinies par la communauteacute et personnalisables En effet nous nous

attendons agrave voir la varieacuteteacute et le nombre drsquoattaques augmenter apregraves avoir migreacute sur

une IP non proteacutegeacutee par le firewall de lrsquoUniversiteacute puisque nous nrsquoavons plus la

premiegravere ligne de deacutefense du CRI en particulier pour le port 389 (LDAP) qui eacutetait

bloqueacute par lrsquouniversiteacute et srsquoest retrouveacute en premiegravere ligne apregraves la migration Nous

avons donc ajouteacute une regravegle bloquant tout le trafic entrant vers le port 389 hormis

localhost

Package drsquoinstallation

Nous avons creacutee un package deb contenant les sources du webmail ainsi

que des scripts utiles agrave lrsquoinstallation et au fonctionnement du serveur Nous avons

deacuteveloppeacute des scripts de configuration automatique pour LDAP et Postfix Comme

dpkg ne supporte pas directement lrsquoinstallation automatique des deacutependances

nous recommandons drsquoinstaller avant tout le paquet gdebi-core qui est en fait un

dpkg ameacutelioreacute Gracircce agrave la commande gdebi paquetdeb toutes les deacutependances

seront installeacutees en particulier postfix le serveur ldap le serveur web lighttpd entre

autres sans soucis Il est agrave noter que comme les scripts de configuration des

diffeacuterents services ne sont que partiellement impleacutementeacutes dans le paquet deb nous

fournissons en annexe un README complet et illustreacute qui explique pas agrave pas

comment faire fonctionner notre systegraveme sur nrsquoimporte quel Linux en particulier les

lignes de configuration des diffeacuterents services agrave changer et un exemplaire des

fichiers de configuration fonctionnels de ces services

Gestion de lrsquoeacutenergie

Une consideacuteration importante pour un systegraveme autonome Drsquoapregraves les fiches

techniques notre modegravele de Raspberry Pi (B 2) est officiellement eacutevalueacute avec un

fonctionnement agrave ~650mA pour 5V De nombreux proprieacutetaires de ce systegraveme

eacutequipeacutes se sont amuser agrave veacuterifier la consommation eacutelectrique reacuteelle de leur Pi 2 B

sous diffeacuterentes charges On pourra retenir cette eacutetude (lien en sitegraphie) qui

relegraveve la consommation en courant en fonction de lrsquoactiviteacute lanceacutee sur la Pi mais

aussi en charge sur 1 agrave 4 CPU

Ces chiffres sont releveacutes sur un systegraveme avec cameacutera connecteacutee HDMI connecteacute et

cacircble ethernet brancheacute et actif

On peut constater que globalement notre systegraveme Pi 2 B tournant sans

interface graphique sans composant suppleacutementaire sans sortie videacuteo ni cameacutera

avec plusieurs serveurs tournant tout en restant le plus leacuteger possible et demeurant

~99 idle la plupart du temps ne devrait pas deacutepasser une consommation de

300mA grand maximum

Fig 13 Un processeur tregraves tregraves peu chargeacute et une meacutemoire relativement libre

Nous avions lrsquoanneacutee derniegravere deacutejagrave reacutealiseacute un circuit permettant drsquoadapter un

panneau solaire sur une batterie USB classique de 9000mAh Nous avions alors pu

mesurer lrsquointensiteacute deacutelivreacutee par le panneau solaire En cas drsquoensoleillement moyen

habituel dans nos contreacutees le panneau solaire deacutebitait 400mA et pouvait atteindre

le double quand le soleil eacutetait directement preacutesent pour environ 800mA deacutebiteacute

Ce panneau solaire accompagneacute de son circuit drsquoadaptation devrait donc

suffire pour alimenter notre systegraveme la journeacutee le brancher ensuite sur une batterie

portable permet de stocker le surplus pour la nuit

Fig 14 le circuit drsquoadaptation

Fig 15 et son PCB

Eacutevolutions possibles

Webmail

Concernant les eacutevolutions possibles que nous aurions aimeacute apporter agrave notre

projet avec plus de temps commenccedilons par le web Nous aurions souhaiteacute apporter

la gestion de lrsquoenvoi de plusieurs piegraveces jointes comme nous lrsquoavons fait pour la

reacuteception

De plus nous aurions voulu inteacutegrer une corbeille ougrave lesmessages pourraient

aller avant drsquoecirctre deacutefinitivement supprimeacutes du systegraveme drsquoautant que nous avons

deacutejagrave eacutecrites les fonctions PHP permettant de retirer une en-tecircte drsquoun fichier JSON et

le fichier mail associeacute

Enfin nous aurions aimeacute en plus du blocage deacutejagrave preacutesent impleacutementer une

gestion plus profonde des piegravece jointes permettant notamment le remplissage de la

boicircte de spams

Systegraveme

Il aurait eacuteteacute inteacuteressant de notifier lrsquoexpeacutediteur lorsque le mail nrsquoa pas pu ecirctre

deacutelivreacute agrave un utilisateur lorsque son quota est plein En toute logique cela devrait ecirctre

fait simplement avec la commande Sendmail

Une meilleur gestion du trafic mail indeacutesirable aurait eacuteteacute la bienvenue En

effet malgreacute la limitation du spam il restera toujours une partie du volume de mail

qui sera indeacutesirable (pub pishing scam hellip)

Eacutetant donneacute la taille du systegraveme nous avions penseacute agrave une approche

ldquomachine learningrdquo Lrsquoutilisateur indiquerait pourquoi il considegravere le mail comme

indeacutesirable constituant des regravegles refusant certains mails Les mails provenant de

cet expeacutediteur pourraient ecirctre deacutetecteacute par le script agrave la reacuteception et

automatiquement envoyeacutes dans la boicircte de spams

Partie eacutenergeacutetique

Mecircme si la solution au panneau solaire ne pose aucun problegraveme en theacuteorie

nous aurions deacutejagrave dans un premier temps aimeacute lrsquoimpleacutementer en pratique Nous

nrsquoavons finalement pas reacutealiseacute notre objectif de deacutetecter deux cas drsquoalimentation

diffeacuterents soit lrsquoalimentation via panneau solaire est suffisante dans ce cas il

alimente la batterie et donc la Raspberry soit quand ce courant nrsquoest pas suffisant

on alimente la batterie par le secteur

Conclusion

En conclusion nous pensons avoir reacutepondu au cahier des charges initial dans

sa majeure partie Nous sommes aujourdrsquohui en mesure de proposer une solution

mail domestique priveacutee et personnalisable par un particulier

Notre installation de Debian a eacuteteacute au maximum alleacutegeacutee pour notre utilisation

sans interface graphique et nous avons mis en place une reacuteponse aux diverses

attaques que nous avons pu subir lors de lamise en place de notre solution logicielle

En outre le pare-feu avec notre systegraveme de liste noire bloque une partie des

attaques qui peuvent nous parvenir

Nos diffeacuterents scripts de pare-feu de gestion drsquoun mail entrant associeacute au

webmail permettent agrave un utilisateur drsquoacceacuteder aux fonctions usuelles associeacutees agrave

lrsquoenvoi et la reacuteception de mails

Gracircce agrave sa configuration personnalisable notre projet devrait pouvoir ecirctre

porteacute sur un domaine et une adresse IP diffeacuterente sans soucis et ecirctre deacuteployeacute

partout ougrave des gens souhaitent conserver leur vie priveacutee

Nous regretterons cependant de ne pas avoir exploiteacute la partie eacutenergeacutetique

de ce projet qui portait une probleacutematique inteacuteressante et qui nous parait importante

dans le monde actuel

Ce projet nous aura occupeacute pendant tregraves longtemps et nous sommes fiers du

travail que nous avons accompli Il est agrave nos yeux la preuve de ce que nous savons et

pouvons faire et nous donnera confiance pour notre deacutebut de carriegravere drsquoingeacutenieur

Sources

httpwwwradicaticomwpwp-contentuploads201401Email-Statistics-R

eport-2014-2018-Executive-Summarypdf

httpwwwcommentcamarchenetcontents525-le-protocole-ldap

httpsfrwikipediaorgwikiSimple_Mail_Transfer_Protocol

httpwwwcommentcamarchenetcontents536-pop3-smtp-imap-protocol

es-de-messagerie

httpstoolsietforghtmlrfc2821

httpsfrwikipediaorgwikiInternet_Message_Access_Protocol

httpstoolsietforghtmlrfc3501

httparstechnicacominformation-technology201402how-to-run-your-ow

n-e-mail-server-with-your-own-domain-part-1

httpswwwraspberrypiorgforumsviewtopicphpp=136912

httpstackoverflowcomquestions17394356how-can-i-make-a-bash-com

mand-run-periodically

httpuntroubledorgnullmailer

httpelinuxorgRPi_Hardware

httpraspitv2015raspberry-pi2-power-and-performance-measurement

Annexe 1 Architecture du systegraveme de fichiers

Annexe 2 Scan DNSSTUFF

Depuis httpwwwdnsstuffcomtoolsdnsReport|type=domainampampvalue=intimailpw

Annexe 3 Vue geacuteneacuterale httpswwwintimailpw

Annexe 4 Envoyer un mail

Annexe 5 Boite de reacuteception

Annexe 6 Interface drsquoadministration

Annexe 7 Gestion drsquoun utilisateur

Tutorial installation intimailtrade

Table des matiegraveres Apregraves une nouvelle installation de lrsquoOS 2

Seacutecurisation du serveur 2

Changement de lrsquoutilisateur par deacutefaut 2

Changement du port SSH 2

Interdire lrsquoauthentification SSH pour root 2

Installation de LDAP 3

Configuration de base 3

Configuration des Scheacutemas 4

Constitution de la base de donneacutees LDAP 5

Installation de Postfix 7

Installation de Bind9 8

Installation du paquet Debian et configuration de lighttpd 9

Deacutependances 11

Sources 12

2

Apregraves une nouvelle installation de lrsquoOS Exeacutecutez ces commandes pour mettre agrave jour agrave la derniegravere version Ces opeacuterations peuvent prendre un certain

temps Nous avons utiliseacute pour cet exemple Raspbian Jessie Lite sur une Raspberry Pi 2

apt-get update

apt-get upgrade ampamp apt-get dist-upgrade

apt-get install linux-headers-$(uname -r)

reboot

Puis lancer

raspi-config

Etendre au maximum lrsquoespace de stockage en navigant dans les menus

Expand Filesystem

Reacutegler une ip statique avec la box fichier etcnetworkinterfaces

iface eth0 inet static

address 192168131

netmask 2552552550

gateway 19216811

Nous avons aussi supprimeacute wpasupplicant

Seacutecurisation du serveur

Changement de lrsquoutilisateur par deacutefaut Changez le nom drsquoutilisateur par deacutefaut ainsi que son mot de passe

sudo passwd root

Sortie et login en tant que root puis

usermod -l myuname pi

usermod -m -d homemyuname myuname

groupmod ndashn myuname pi

passwd myuname

Voir cette adresse pour lrsquoutilisation de cleacutes priveacuteespubliques

Changement du port SSH sed ndashi sPort 22Port 2222g etcsshsshd_config

Interdire lrsquoauthentification SSH pour root sed -i sPermitRootLogin yesPermitRootLogin nog etcsshsshd_config

3

Installation de LDAP

Configuration de base Installation du package

apt-get install slapd

Choisir un mot de passe administrateur puis lancer la commande

dpkg-reconfigure slapd

Reacutepondre non agrave la question 1

Entrez le nom de domaine utiliseacute agrave la question 2 sous la forme domainetld

Entrez ce que vous voulez au 3egraveme eacutecran le nom de lrsquoorganisation ne sera pas utiliseacute

Entrez un mot de passe

Choisissez HDB

Choisissez si la base de donneacutees est supprimeacutee agrave la deacutesinstallation de slapd

Deacuteplacez lrsquoancienne base de donneacutees

Nrsquoutilisez pas LDAPv2

Installer les outils de conversion pour ldap (slaptest ldapmodify notamment)

apt-get install ldap-utils

On peut maintenant veacuterifier que la configuration est valable

ldapsearch -x -h localhost -b dc=domainedc=tld -LLL dc=domaine dn

Cette commande doit retourner quelque chose comme

dn dc=domainedc=tld

Il faut maintenant seacutecuriser le serveur LDAP en effet on peut y acceacuteder en anonyme avec la commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=config

(amp(objectClass=olcDatabaseConfig)(olcSuffix=dc=domainedc=tld))

Cette commande retourne un certain nombre drsquoinformations notamment agrave propos des champs suivants

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by none

olcAccess 1to dnbase= by read

olcAccess 2to by read

On va modifier ces champs avec la commande ldapmodify Pour cela on va creacuteer un fichier ldif

cat gt changeAccessldif ltlt EOF

dn olcDatabase=1hdbcn=config

changetype modify

delete olcAccess

-

add olcAccess

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by dn=cn=admindc=domainedc=tld write by none

-

add olcAccess

olcAccess 1to dnbase= by read

-

4

add olcAccess

olcAccess 2to by self write by dn=cn=admindc=domainedc=tld write by

none

-

EOF

On peut maintenant appliquer les changements avec ldapmodify

ldapmodify ndashc ndashY EXTERNAL ndashH ldapi -f changeAccessldif

La commande devrait vous confirmer que la modification srsquoest bien effectueacutee

SASLEXTERNAL authentication started

SASL username gidNumber=0+uidNumber=0cn=peercredcn=externalcn=auth

SASL SSF 0

modifying entry olcDatabase=1hdbcn=config

On peut veacuterifier qursquoon ne peut plus acceacuteder aux informations avec la commande

ldapsearch -x -c -h localhost -b dc=domainedc=tld

On peut veacuterifier la configuration en se connectant en tant qursquoadministrateur

ldapsearch -c -h localhost -b dc=domainedc=tld -D

cn=admindc=domainedc=tld ndashW

Configuration des Scheacutemas Nous allons utiliser les scheacutemas de courier-ldap Pour eacuteviter une manipulation compliqueacutee vous trouverez

directement le scheacutema avec le fichier authldapschema On place ce fichier dans le dossier

mv authldapschema etcldapschema

Nous creacuteons un fichier qui incluera tous les scheacutemas de base en plus du nouveau On peut les afficher avec la

commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

Creacuteation du fichier de configuration pour notre exemple cela donne

mkdir tmpldapconf

cat gt tmpldapconfldapconf ltlt EOF

include etcldapschemacoreschema

include etcldapschemacosineschema

include etcldapschemanisschema

include etcldapschemainetorgpersonschema

include etcldapschemaauthldapschema

EOF

On lance ensuite la commande

slaptest -f tmpldapconfldapconf -F tmpldapconf

Elle revoie un message de succegraves Cette commande a creacuteeacute dans le reacutepertoire tmpldapconf une arborescence

correspondant agrave la configuration de notre LDAP

On modifie le chemin de configuration

5

sed ndashi 0dnauthldap sauthldapauthldapcn=schemacn=config

cn=authldapldif

On supprime ensuite les 7 derniegraveres lignes du fichier

head -n -7 cn=authldapldif gt tmpldif

mv tmpldif cn=authldapldif

On peut maintenant importer notre fichier de configuration Pour ce faire

ldapadd -Y EXTERNAL -H ldapi -f

tmpldapconfcn=configcn=schemacn=authldapldif

Si tout va bien lrsquoentreacutee devrait avoir eacuteteacute ajouteacutee On peut veacuterifier avec la commande vue tout agrave lrsquoheure

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

On devrait voir en plus le nouveau scheacutema authldap

Constitution de la base de donneacutees LDAP Le remplissage de la base se fait agrave lrsquoaide de fichiers ldif Nous donnons ici un exemple de structure

Fichier pour la structure de base

dn dc=maildc=domainedc=tld

o intimailpw

description Global mail tree

dc mail

objectClass top

objectClass dcObject

objectClass organization

dn dc=peopledc=maildc=domainedc=tld

description Informations of all users

o people

dc people

objectClass top

objectClass dcObject

objectClass organization

dn dc=groupsdc=maildc=domainedc=tld

description All groups of users

o groups

dc groups

objectClass top

objectClass dcObject

objectClass organization

6

Fichier pour ajouter un utilisateur

dn cn=jbonddc=peopledc=maildc=domainedc=tld

uid jbond

mail jbonddomainetld

sn Moulin

givenName James

displayName James Bond

mailbox domainetldjbond

quota 50M

homeDirectory homevmail

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAccount

userPassword SSHA367PSXiUAegy8dpJbPU8OepEf8L5ye

Pour obtenir un hash du mot de passe

slappasswd -s password -h SSHA

On peut par la suite ajouter la configuration agrave la base de donneacutees avec la commande

ldapadd -D cn=admindc=domainedc=tld -W -h localhost -f pathtofile

Si les champs proposeacutes ne sont pas suffisants il faudra alors effectuer les modifications dans le fichier autldapschema

proposeacute plus haut et refaire la manipulation de configuration

De plus les standards du Mail deacutecrit par lrsquoIETF (RFC822 63 RFC1123 527 and RFC2821 451) impliquent drsquoavoir une

adresse Postmaster et une Abuse Pour cela nous pourrions creacuteer ces adresses avec la meacutethode vue au-dessus mais

ce nrsquoest pas la meilleure Il est preacutefeacuterable drsquoutiliser un alias comme nous le ferons avec les listes de diffusion Ici nous

proposons de rediriger ces deux adresses vers une adresse administrateur Pour cela la meacutethode est la mecircme sauf

que le fichier ldif nrsquoest pas tout agrave fait identique En voici un exemple

dn cn=postmasterdc=groupsdc=maildc=domainedc=tld

uid postmaster

mail postmasterdomainetld

sn Postmaster

displayName Postmaster

maildrop admindomainetld

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAlias

Pour faire une liste de diffusion la meacutethode est la mecircme Il suffit drsquoajouter toutes les adresses destinataires dans le

champ maildrop seacutepareacutees par des virgules ()

7

Installation de Postfix Installation des packages

apt-get install postfix postfix-ldap

Lors de lrsquoinstallation deux eacutecrans deacutefilent

- Configuration Internet Site

- Valeur par deacutefaut pour le mail name

On creacutee lrsquoutilisateur qui servira agrave exeacutecuter Postfix

groupadd vmail

useradd -g vmail -d homevmail -s binfalse -m vmail

Nous aurons besoin dans la suite des GID et UID creacuteeacutes agrave cet instant Ils peuvent ecirctre afficheacutes avec les commandes

cat etcgroup | grep vmail | cut -d -f3

cat etcpasswd | grep vmail | cut -d -f3

On ajoute les paramegravetres au fichier etcpostfixmaincf (remplacer les valeurs de GID et drsquoUID avec vos valeurs)

smtpd_banner = maildomainetld

virtual_mailbox_base = homevmail

virtual_mailbox_domains = dmainetld

virtual_mailbox_maps = ldapetcpostfixldap_accountscf

virtual_alias_maps = ldapetcpostfixldap_aliasescf

virtual_minimum_uid = 100

virtual_gid_maps = static1001 Remplacez ici par votre valeur de GID

virtual_uid_maps = static1001 Remplacez ici par votre valeur drsquoUID

Il nous faut maintenant constituer nos fichiers de configuration ldap_accountscf

cat gt etcpostfixldap_accountscf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=peopledc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAccount)(mail=s))

result_attribute = mailbox

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

Et pour ldap_aliasescf

cat gt ldap_aliasescf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=groupsdc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAlias)(mail=s))

result_attribute = maildrop

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

8

On peut maintenant veacuterifier la configuration de Postfix avec (cette commande ne doit rien retourner si crsquoest bon)

postfix check

Si crsquoest bon alors on recharge le serveur

postfix reload

On peut alors faire un envoi de mail test via telnet

telnet localhost 25

Si vous souhaitez deacutelivrer les mails agrave votre maniegravere il faut dans le fichier etcpostfixmaincf la ligne

virtual_transport = nomdevotreregle

Et de mecircme dans le fichier etcpostfixmastercf

nomdevotreregle unix - n n - 5 pipe

flags=Rq user=vmail null_sender=

argv=chemindevotreprogramme

Il nous reste maintenant agrave configurer les diffeacuterents enregistrements DNS neacutecessaire au fonctionnement drsquoun serveur

mail Vous pouvez utiliser la solution de votre choix Dans la suite vous trouverez une meacutethode utilisant Bind9

Installation de Bind9 Dans toute cette partie on se situera dans le dossier etcbind Dans la suite notre IP sera abcd

Dans le fichier namedconfoptions on ajoutera dans le champ options

version Not supported

Dans un dossier zones on eacutecrit le fichier dbdomainetld

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122111 Serial

43200 Refresh

3600 Retry

2419200 Expire

86400 ) Negative Cache TTL

IN NS nsdomainetld

IN NS ns11ovhnet

ns IN A abcd

www IN A abcd

IN A abcd

IN MX 10 maildomainetld

mail IN A abcd

Dans le mecircme dossier zones on a cbain-addrarpa

9

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122101 serial

14400 refresh

3600 retry

604800 expire

10800 minimum

)

cbain-addrarpa IN NS nsdomainetld

cbain-addrarpa IN NS ns11ovhnet

d IN PTR maildomainetld

Il faut faire attention agrave bien increacutementer le serial pour chaque modification des fichiers

Dans le fichier namedconflocal

zone domainetld

type master

file etcbindzonesdbdomainetld

allow-transfer 213251128130

notify yes

zone cbain-addrarpa IN

type master

file etcbindzonescbain-addrarpa

allow-transfer 213251128130

Ici 213251128130 est lrsquoadresse IP du serveur ns11ovhnet

Il faut bien sucircr configurer le DNS avec votre fournisseur (Gandi OVH hellip) Pour ccedila amusez-vous bien Vous pouvez

aussi tester votre configuration avec des outils en ligne tels que DNSstuff

En test final si votre configuration est bonne vous devriez pouvoir envoyer un mail depuis un service neutre (Gmail

yahoo hellip) et le voir dans votre arborescence (ici homevmaildomainetld)

Installation du paquet Debian et configuration de lighttpd

Commencez par reacutecupeacuterer le paquet deb agrave lrsquoadresse suivante httpswwwintimailpwintimaildeb

Installez ensuite GDebi Il srsquoagit drsquoun dpkg ameacutelioreacute pour teacuteleacutecharger les deacutependances automatiquement ce que

dpkg ne gegravere pas

apt-get update

apt-get install gdebi-core

10

Vous pouvez alors installer le paquet

gdebi intimaildeb

Vous aurez alors le site web drsquointiMail deacuteployeacute au chemin varwwwwebmail

Il ne vous reste plus qursquoagrave changer la configuration de lighttpd votre serveur web pour mettre en ligne le site

Vous pouvez pour cela copier-coller la configuration suivante mais veillez agrave bien changer lrsquoadresse IP preacutesente au

deacutebut de la partie SSL CONFIG avec votre adresse IP

serv ermodules = ( mod_access

mod_accesslog

mod_alias

mod_compress

mod_redirect

mod_rewrite

)

Hide server version

servertag = Such Headers Very try Now close telnet

serverdocument-root = varwwwwebmail

serverupload-dirs = ( varwwwwebmailuploads )

servererrorlog = varloglighttpderrorlog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

serverport = 80

accesslogformat = V h l u t r gts b Refereri

User-Agenti

accesslogfilename = varloglighttpdaccesslog

index-filenames = ( indexphp indexhtml

indexlighttpdhtml )

urlaccess-deny = ( ~ inc )

static-fileexclude-extensions = ( php pl fcgi )

compresscache-dir = varcachelighttpdcompress

compressfiletype = ( applicationjavascript textcss

texthtml textplain )

default listening port for IPv6 falls back to the IPv4 port

include_shell usrsharelighttpduse-ipv6pl + serverport

include_shell usrsharelighttpdcreate-mimeassignpl

include_shell usrsharelighttpdinclude-conf-enabledpl

SSL CONFIG

$SERVER[socket] == 5234485443

sslengine = enable

11

sslpemfile = etclighttpdsslintimailpwpem

sslca-file = etclighttpdsslintimailpwcrt

servername = intimailpw

votre configuration habituelle pour ce domaine

serverdocument-root = varwwwwebmail

servererrorlog = varloglighttpderror_ssllog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

Rewrite des URL pour masquer php

urlrewrite-once = ( ^()$ =gt $1 )

urlrewrite-if-not-file = ( ^([^])()$ =gt $1php$2 )

servernetwork-backend = writev

Deacutependances Slapd

Ldap-utils

Postfix

Postfix-ldap

Bind9

Lighttpd

12

Sources httpswikigandinetfrhostingusing-linuxtutorialsdebianmail-server-ldap

httpwwwpostfixorgpipe8html

httpwwwpostfixorgFILTER_READMEhtml

httpwwwpostfixorg

httpwwwpostfixorgtransport5html

Page 15: Système d'hébergement domestique...place sur les domaines .pw par Gandi.net, notre fournisseur. Nous n’avons donc pas pu l’implémenter. Nous avons configuré Postfix pour qu’il

Fig 10 Un mail contenant 3 piegraveces jointes et un message

Comme on peut le voir nous pouvons recevoir desmails avec plusieurs piegraveces

jointes Nous avons ici preacutesenteacute la boicircte de reacuteception mais les autres boicirctes

fonctionnent de maniegravere similaire

Interface drsquoadministration

Le systegraveme de webmail possegravede plusieurs variables des listes de diffusion

des compteshellipMais on veut pouvoir donner les droits agrave un utilisateur demodifier tout

cela En effet si nous trouvons cela abordable drsquoajouter un utilisateur avec une

commande dans le shell il faut aussi penser agrave lrsquoutilisateur final qui preacutefegravere peut-ecirctre

le confort drsquoune interface deacutedieacutee pour geacuterer son serveur mail plutocirct que le terminal

De maniegravere tregraves simple un utilisateur appartenant au groupes drsquoutilisateurs

ldquoAdministrateursrdquo est reconnu en tant qursquoadministrateur par lrsquointerface et peut

cliquer sur un bouton ldquoManagerdquo dans le panneau lateacuteral qui nrsquoest visible qursquoaux

administrateurs De lagrave il arrive sur la page suivante

Fig 11 lrsquointerface drsquoadministration

Sur cette interface il peut choisir la taille maximale des piegraveces jointes

changer le nom de domaine sur lequel est installeacute lrsquointerface et dont deacutependent

toutes les adresses (domaine) Il est aussi possible de modifier directement ces

variables en modifiant le fichier includeconfigincphp Pratique notamment si lrsquoon

a renseigneacute un mauvais nom de domaine agrave la configuration et que lrsquoon arrive plus agrave

acceacuteder agrave lrsquointerface

Il peut aussi creacuteer un nouveau compte en renseignant les champs preacutenom

nom mot de passe et quota Lrsquoutilisateur peut ensuite une fois son compte creacutee

directement se connecter avec son identifiant (initiale preacutenom + nom) et mot de

passe Lors de la creacuteation du compte un mail de bienvenue est envoyeacute au nouvel

utilisateur ce qui permet en arriegravere-plan de creacuteer tous les dossiers utilisateurs et

fichiers en-tecirctes utiles agrave lrsquointerface une fois pour toutes

Lrsquoadministrateur peut aussi ajouter une liste de diffusion (assimileacutee agrave un

groupe) ou en supprimer une parmi les listes existantes

En outre lrsquoadministrateur peut aussi modifier les donneacutees drsquoun utilisateur

Pour cela sur la preacutesente page il peut seacutelectionner un utilisateur parmi la liste des

utilisateurs existants ce qui le redirige vers la page de gestion des comptes

Fig 12 La gestion drsquoun compte seacutelectionneacute ici celui de James Bond

A ce stade il peut changer lrsquoUID de lrsquoutilisateur (utile en cas de conflit) le nom

le mot de passe le quota de cet utilisateur et lrsquoajouter ou le retirer drsquoune liste de

diffusion Accessoirement il peut aussi supprimer le compte en cliquant sur lrsquoeacutenorme

bouton rouge qui lui demandera deux fois de suite de confirmer son action afin

drsquoeacuteviter les erreurs de clic Cette action entraicircne la suppression de lrsquoutilisateur de

toutes les listes de diffusion auxquelles il appartient la suppression de son compte

dans la branche people de lrsquoarbre LDAP et la suppression deacutefinitive de son dossier

utilisateur sur le disquesystegraveme de fichiers impliquant donc la perte de ses mails

Architecture du systegraveme de fichiers

Comme nous lrsquoavons dit plus haut lrsquoideacutee est de se passer des meacutecanismes

classiques avec les clients mails habituels Ces serveurs srsquoalourdissent

geacuteneacuteralement en utilisant des serveurs IMAPPOP3 et un meacutecanisme

drsquoauthentification SMTP

Pour adapter ces fonctionnaliteacutes agrave notre systegraveme nous avons donc constitueacute

une architecture pour organiser les fichiers qui transitent Vous pourrez voir un

scheacutema reacutecapitulatif en annexe 1

Dans la premiegravere moitieacute du projet les mails eacutetaient deacutelivreacutes par Postfix Nous

utilisions un script exeacutecuteacute lors de la reacuteception drsquounmail pour les traiter de lamaniegravere

que nous voulions Cette meacutethode avait les inconveacutenients drsquoecirctre lourde et pas

efficace agrave 100 En effet seuls les mails reccedilus depuis lrsquoexteacuterieur eacutetaient

correctement traiteacutes

Deacutesormais les mails sont traiteacutes totalement par notre script Cela nous

permet de geacuterer les mails dans des dossiers organiseacutes agrave notre maniegravere et de

recevoir les mails locaux crsquoest-agrave-dire entre utilisateurs du mecircme domaine Cette

nouvelle meacutethode regravegle aussi drsquoautres problegravemes notamment au niveau des

permissions sur les fichiers

Pour reacuteduire le nombre drsquoopeacuterations et pour profiter des fonctionnaliteacutes

offertes par le framework utiliseacute pour lrsquointerface web nous regroupons des

informations sur chacun des mails reccedilus sous la forme de fichiers JSON Pour ce

faire lrsquoideacutee est drsquoexeacutecuter un script lorsque leacutevegravenement ldquoreacuteception drsquoun mailrdquo

survient Postfix offre cette possibiliteacute dans sa configuration Or il se trouve qursquoil nrsquoest

pas si simple de reacutecupeacuterer le chemin du fichier contenant le mail car le nom du

fichier creacutee est sous la forme Timestamp UNIX10 Caractegraveres aleacuteatoires (ex

14562336185A8D43E97F)

La seconde probleacutematique est que le webmail doit avoir la possibiliteacute de

pouvoir lire les fichiers pour afficher les mails sur son interface Or il semble que

Postfix les eacutecrit en autorisant uniquement son utilisateur en lecture Il nous a fallu

trouver une solution pour remeacutedier agrave cela Nous avons choisi drsquoajouter www-data

(utilisateur du serveur web) au groupe vmail et de modifier les droits sur les fichiers

de sorte que les utilisateurs de ce groupe puissent lire les fichiers

Nous avons revu une partie de lrsquoorganisation des fichiers pour reacutecupeacuterer les

piegraveces jointes si elles sont preacutesentes Le script que nous avons eacutecrit reacutecupegravere le

fichier original du mail et le deacutecoupe en eacuteleacutements simples dans des fichier distincts

corps du mail et diffeacuterentes piegraveces jointes De cette maniegravere pour afficher un mail

nous nrsquoavons pas besoin de charger la totaliteacute du fichier Dans le cas ougrave il y a des

piegraveces jointes cela aurait ralenti lrsquoaffichage des informations

Nous avons eacutegalement impleacutementeacute la gestion des quotas Dans lrsquoeacutetat actuel

des choses srsquoil nrsquoy a plus de place disponible pour lrsquoutilisateur le mail nrsquoest tout

bonnement pas deacutelivreacute agrave ce destinataire Lrsquoideacuteal aurait eacuteteacute de notifier leacutemetteur avec

un mail ce qui nrsquoest pour lrsquoinstant pas le cas mais qui pourrait ecirctre reacutesolu en

renvoyant agrave postfix un code drsquoerreur deacutefini

Pour terminer nous avons revu la totaliteacute du code deacuteveloppeacute Nous sommes

passeacute du Bash au Perl Ce dernier est plus performant et plus simple agrave utiliser et agrave

lire

Firewall

Un autre gros morceau du projet mais qui nrsquoest pas speacutecifiquement lieacute agrave la

probleacutematique du mail crsquoest la seacutecurisation du serveur En effet apregraves avoir mis en

ligne notre serveur des pirates ont tregraves vite tenteacute de peacuteneacutetrer le systegraveme

Globalement les attaques eacutetaient de type force brute sur les services heacutebergeacutes sur

notre Raspberry neacutecessitant une identification tels que SSH SMTP hellip

On retrouve ici un petit point faible du protocole SMTP Eacutetant donneacute que

chaque serveur mail doit avoir une adresse postmaster et abuse lrsquoattaquant a agrave sa

disposition deux adresses agrave attaquer Ceci dit ce type drsquoattaque est simple agrave

contrecarrer car il suffit de limiter dans le temps le nombre de tentatives de

connexions

La contre-mesure que nous avons mis en place est simple une seacuterie de

regravegles Iptables En reacutesumeacute nous avons opteacute pour un systegraveme de liste blanche et

noire Les adresses IPs de la liste blanche sont autoriseacutees agrave utiliser la totaliteacute des

services (notamment SSH) tandis que celles de la liste noire sont totalement

ignoreacutees Les autres IPs nrsquoont accegraves qursquoau webmail

Eacutetant donneacute que le nombre drsquoIPs attaquant notre serveur nrsquoa cesseacute

drsquoaugmenter nous avons automatiseacute la mise agrave jour de la liste de noire en

deacuteveloppant un script pour Cron Ce script est exeacutecuteacute une fois par heure A ce jour

notre liste noire contient 47 adresses Bien sucircr ce systegraveme est susceptible drsquoecirctre

modifieacute agrave convenance pour passer sur une solution deacutedieacutee telle que Fail2ban qui fait

en fait ce qursquoon fait deacutejagrave (eacutetudier les logs et bannir des IP avec iptables) avec des

regravegles preacutedeacutefinies par la communauteacute et personnalisables En effet nous nous

attendons agrave voir la varieacuteteacute et le nombre drsquoattaques augmenter apregraves avoir migreacute sur

une IP non proteacutegeacutee par le firewall de lrsquoUniversiteacute puisque nous nrsquoavons plus la

premiegravere ligne de deacutefense du CRI en particulier pour le port 389 (LDAP) qui eacutetait

bloqueacute par lrsquouniversiteacute et srsquoest retrouveacute en premiegravere ligne apregraves la migration Nous

avons donc ajouteacute une regravegle bloquant tout le trafic entrant vers le port 389 hormis

localhost

Package drsquoinstallation

Nous avons creacutee un package deb contenant les sources du webmail ainsi

que des scripts utiles agrave lrsquoinstallation et au fonctionnement du serveur Nous avons

deacuteveloppeacute des scripts de configuration automatique pour LDAP et Postfix Comme

dpkg ne supporte pas directement lrsquoinstallation automatique des deacutependances

nous recommandons drsquoinstaller avant tout le paquet gdebi-core qui est en fait un

dpkg ameacutelioreacute Gracircce agrave la commande gdebi paquetdeb toutes les deacutependances

seront installeacutees en particulier postfix le serveur ldap le serveur web lighttpd entre

autres sans soucis Il est agrave noter que comme les scripts de configuration des

diffeacuterents services ne sont que partiellement impleacutementeacutes dans le paquet deb nous

fournissons en annexe un README complet et illustreacute qui explique pas agrave pas

comment faire fonctionner notre systegraveme sur nrsquoimporte quel Linux en particulier les

lignes de configuration des diffeacuterents services agrave changer et un exemplaire des

fichiers de configuration fonctionnels de ces services

Gestion de lrsquoeacutenergie

Une consideacuteration importante pour un systegraveme autonome Drsquoapregraves les fiches

techniques notre modegravele de Raspberry Pi (B 2) est officiellement eacutevalueacute avec un

fonctionnement agrave ~650mA pour 5V De nombreux proprieacutetaires de ce systegraveme

eacutequipeacutes se sont amuser agrave veacuterifier la consommation eacutelectrique reacuteelle de leur Pi 2 B

sous diffeacuterentes charges On pourra retenir cette eacutetude (lien en sitegraphie) qui

relegraveve la consommation en courant en fonction de lrsquoactiviteacute lanceacutee sur la Pi mais

aussi en charge sur 1 agrave 4 CPU

Ces chiffres sont releveacutes sur un systegraveme avec cameacutera connecteacutee HDMI connecteacute et

cacircble ethernet brancheacute et actif

On peut constater que globalement notre systegraveme Pi 2 B tournant sans

interface graphique sans composant suppleacutementaire sans sortie videacuteo ni cameacutera

avec plusieurs serveurs tournant tout en restant le plus leacuteger possible et demeurant

~99 idle la plupart du temps ne devrait pas deacutepasser une consommation de

300mA grand maximum

Fig 13 Un processeur tregraves tregraves peu chargeacute et une meacutemoire relativement libre

Nous avions lrsquoanneacutee derniegravere deacutejagrave reacutealiseacute un circuit permettant drsquoadapter un

panneau solaire sur une batterie USB classique de 9000mAh Nous avions alors pu

mesurer lrsquointensiteacute deacutelivreacutee par le panneau solaire En cas drsquoensoleillement moyen

habituel dans nos contreacutees le panneau solaire deacutebitait 400mA et pouvait atteindre

le double quand le soleil eacutetait directement preacutesent pour environ 800mA deacutebiteacute

Ce panneau solaire accompagneacute de son circuit drsquoadaptation devrait donc

suffire pour alimenter notre systegraveme la journeacutee le brancher ensuite sur une batterie

portable permet de stocker le surplus pour la nuit

Fig 14 le circuit drsquoadaptation

Fig 15 et son PCB

Eacutevolutions possibles

Webmail

Concernant les eacutevolutions possibles que nous aurions aimeacute apporter agrave notre

projet avec plus de temps commenccedilons par le web Nous aurions souhaiteacute apporter

la gestion de lrsquoenvoi de plusieurs piegraveces jointes comme nous lrsquoavons fait pour la

reacuteception

De plus nous aurions voulu inteacutegrer une corbeille ougrave lesmessages pourraient

aller avant drsquoecirctre deacutefinitivement supprimeacutes du systegraveme drsquoautant que nous avons

deacutejagrave eacutecrites les fonctions PHP permettant de retirer une en-tecircte drsquoun fichier JSON et

le fichier mail associeacute

Enfin nous aurions aimeacute en plus du blocage deacutejagrave preacutesent impleacutementer une

gestion plus profonde des piegravece jointes permettant notamment le remplissage de la

boicircte de spams

Systegraveme

Il aurait eacuteteacute inteacuteressant de notifier lrsquoexpeacutediteur lorsque le mail nrsquoa pas pu ecirctre

deacutelivreacute agrave un utilisateur lorsque son quota est plein En toute logique cela devrait ecirctre

fait simplement avec la commande Sendmail

Une meilleur gestion du trafic mail indeacutesirable aurait eacuteteacute la bienvenue En

effet malgreacute la limitation du spam il restera toujours une partie du volume de mail

qui sera indeacutesirable (pub pishing scam hellip)

Eacutetant donneacute la taille du systegraveme nous avions penseacute agrave une approche

ldquomachine learningrdquo Lrsquoutilisateur indiquerait pourquoi il considegravere le mail comme

indeacutesirable constituant des regravegles refusant certains mails Les mails provenant de

cet expeacutediteur pourraient ecirctre deacutetecteacute par le script agrave la reacuteception et

automatiquement envoyeacutes dans la boicircte de spams

Partie eacutenergeacutetique

Mecircme si la solution au panneau solaire ne pose aucun problegraveme en theacuteorie

nous aurions deacutejagrave dans un premier temps aimeacute lrsquoimpleacutementer en pratique Nous

nrsquoavons finalement pas reacutealiseacute notre objectif de deacutetecter deux cas drsquoalimentation

diffeacuterents soit lrsquoalimentation via panneau solaire est suffisante dans ce cas il

alimente la batterie et donc la Raspberry soit quand ce courant nrsquoest pas suffisant

on alimente la batterie par le secteur

Conclusion

En conclusion nous pensons avoir reacutepondu au cahier des charges initial dans

sa majeure partie Nous sommes aujourdrsquohui en mesure de proposer une solution

mail domestique priveacutee et personnalisable par un particulier

Notre installation de Debian a eacuteteacute au maximum alleacutegeacutee pour notre utilisation

sans interface graphique et nous avons mis en place une reacuteponse aux diverses

attaques que nous avons pu subir lors de lamise en place de notre solution logicielle

En outre le pare-feu avec notre systegraveme de liste noire bloque une partie des

attaques qui peuvent nous parvenir

Nos diffeacuterents scripts de pare-feu de gestion drsquoun mail entrant associeacute au

webmail permettent agrave un utilisateur drsquoacceacuteder aux fonctions usuelles associeacutees agrave

lrsquoenvoi et la reacuteception de mails

Gracircce agrave sa configuration personnalisable notre projet devrait pouvoir ecirctre

porteacute sur un domaine et une adresse IP diffeacuterente sans soucis et ecirctre deacuteployeacute

partout ougrave des gens souhaitent conserver leur vie priveacutee

Nous regretterons cependant de ne pas avoir exploiteacute la partie eacutenergeacutetique

de ce projet qui portait une probleacutematique inteacuteressante et qui nous parait importante

dans le monde actuel

Ce projet nous aura occupeacute pendant tregraves longtemps et nous sommes fiers du

travail que nous avons accompli Il est agrave nos yeux la preuve de ce que nous savons et

pouvons faire et nous donnera confiance pour notre deacutebut de carriegravere drsquoingeacutenieur

Sources

httpwwwradicaticomwpwp-contentuploads201401Email-Statistics-R

eport-2014-2018-Executive-Summarypdf

httpwwwcommentcamarchenetcontents525-le-protocole-ldap

httpsfrwikipediaorgwikiSimple_Mail_Transfer_Protocol

httpwwwcommentcamarchenetcontents536-pop3-smtp-imap-protocol

es-de-messagerie

httpstoolsietforghtmlrfc2821

httpsfrwikipediaorgwikiInternet_Message_Access_Protocol

httpstoolsietforghtmlrfc3501

httparstechnicacominformation-technology201402how-to-run-your-ow

n-e-mail-server-with-your-own-domain-part-1

httpswwwraspberrypiorgforumsviewtopicphpp=136912

httpstackoverflowcomquestions17394356how-can-i-make-a-bash-com

mand-run-periodically

httpuntroubledorgnullmailer

httpelinuxorgRPi_Hardware

httpraspitv2015raspberry-pi2-power-and-performance-measurement

Annexe 1 Architecture du systegraveme de fichiers

Annexe 2 Scan DNSSTUFF

Depuis httpwwwdnsstuffcomtoolsdnsReport|type=domainampampvalue=intimailpw

Annexe 3 Vue geacuteneacuterale httpswwwintimailpw

Annexe 4 Envoyer un mail

Annexe 5 Boite de reacuteception

Annexe 6 Interface drsquoadministration

Annexe 7 Gestion drsquoun utilisateur

Tutorial installation intimailtrade

Table des matiegraveres Apregraves une nouvelle installation de lrsquoOS 2

Seacutecurisation du serveur 2

Changement de lrsquoutilisateur par deacutefaut 2

Changement du port SSH 2

Interdire lrsquoauthentification SSH pour root 2

Installation de LDAP 3

Configuration de base 3

Configuration des Scheacutemas 4

Constitution de la base de donneacutees LDAP 5

Installation de Postfix 7

Installation de Bind9 8

Installation du paquet Debian et configuration de lighttpd 9

Deacutependances 11

Sources 12

2

Apregraves une nouvelle installation de lrsquoOS Exeacutecutez ces commandes pour mettre agrave jour agrave la derniegravere version Ces opeacuterations peuvent prendre un certain

temps Nous avons utiliseacute pour cet exemple Raspbian Jessie Lite sur une Raspberry Pi 2

apt-get update

apt-get upgrade ampamp apt-get dist-upgrade

apt-get install linux-headers-$(uname -r)

reboot

Puis lancer

raspi-config

Etendre au maximum lrsquoespace de stockage en navigant dans les menus

Expand Filesystem

Reacutegler une ip statique avec la box fichier etcnetworkinterfaces

iface eth0 inet static

address 192168131

netmask 2552552550

gateway 19216811

Nous avons aussi supprimeacute wpasupplicant

Seacutecurisation du serveur

Changement de lrsquoutilisateur par deacutefaut Changez le nom drsquoutilisateur par deacutefaut ainsi que son mot de passe

sudo passwd root

Sortie et login en tant que root puis

usermod -l myuname pi

usermod -m -d homemyuname myuname

groupmod ndashn myuname pi

passwd myuname

Voir cette adresse pour lrsquoutilisation de cleacutes priveacuteespubliques

Changement du port SSH sed ndashi sPort 22Port 2222g etcsshsshd_config

Interdire lrsquoauthentification SSH pour root sed -i sPermitRootLogin yesPermitRootLogin nog etcsshsshd_config

3

Installation de LDAP

Configuration de base Installation du package

apt-get install slapd

Choisir un mot de passe administrateur puis lancer la commande

dpkg-reconfigure slapd

Reacutepondre non agrave la question 1

Entrez le nom de domaine utiliseacute agrave la question 2 sous la forme domainetld

Entrez ce que vous voulez au 3egraveme eacutecran le nom de lrsquoorganisation ne sera pas utiliseacute

Entrez un mot de passe

Choisissez HDB

Choisissez si la base de donneacutees est supprimeacutee agrave la deacutesinstallation de slapd

Deacuteplacez lrsquoancienne base de donneacutees

Nrsquoutilisez pas LDAPv2

Installer les outils de conversion pour ldap (slaptest ldapmodify notamment)

apt-get install ldap-utils

On peut maintenant veacuterifier que la configuration est valable

ldapsearch -x -h localhost -b dc=domainedc=tld -LLL dc=domaine dn

Cette commande doit retourner quelque chose comme

dn dc=domainedc=tld

Il faut maintenant seacutecuriser le serveur LDAP en effet on peut y acceacuteder en anonyme avec la commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=config

(amp(objectClass=olcDatabaseConfig)(olcSuffix=dc=domainedc=tld))

Cette commande retourne un certain nombre drsquoinformations notamment agrave propos des champs suivants

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by none

olcAccess 1to dnbase= by read

olcAccess 2to by read

On va modifier ces champs avec la commande ldapmodify Pour cela on va creacuteer un fichier ldif

cat gt changeAccessldif ltlt EOF

dn olcDatabase=1hdbcn=config

changetype modify

delete olcAccess

-

add olcAccess

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by dn=cn=admindc=domainedc=tld write by none

-

add olcAccess

olcAccess 1to dnbase= by read

-

4

add olcAccess

olcAccess 2to by self write by dn=cn=admindc=domainedc=tld write by

none

-

EOF

On peut maintenant appliquer les changements avec ldapmodify

ldapmodify ndashc ndashY EXTERNAL ndashH ldapi -f changeAccessldif

La commande devrait vous confirmer que la modification srsquoest bien effectueacutee

SASLEXTERNAL authentication started

SASL username gidNumber=0+uidNumber=0cn=peercredcn=externalcn=auth

SASL SSF 0

modifying entry olcDatabase=1hdbcn=config

On peut veacuterifier qursquoon ne peut plus acceacuteder aux informations avec la commande

ldapsearch -x -c -h localhost -b dc=domainedc=tld

On peut veacuterifier la configuration en se connectant en tant qursquoadministrateur

ldapsearch -c -h localhost -b dc=domainedc=tld -D

cn=admindc=domainedc=tld ndashW

Configuration des Scheacutemas Nous allons utiliser les scheacutemas de courier-ldap Pour eacuteviter une manipulation compliqueacutee vous trouverez

directement le scheacutema avec le fichier authldapschema On place ce fichier dans le dossier

mv authldapschema etcldapschema

Nous creacuteons un fichier qui incluera tous les scheacutemas de base en plus du nouveau On peut les afficher avec la

commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

Creacuteation du fichier de configuration pour notre exemple cela donne

mkdir tmpldapconf

cat gt tmpldapconfldapconf ltlt EOF

include etcldapschemacoreschema

include etcldapschemacosineschema

include etcldapschemanisschema

include etcldapschemainetorgpersonschema

include etcldapschemaauthldapschema

EOF

On lance ensuite la commande

slaptest -f tmpldapconfldapconf -F tmpldapconf

Elle revoie un message de succegraves Cette commande a creacuteeacute dans le reacutepertoire tmpldapconf une arborescence

correspondant agrave la configuration de notre LDAP

On modifie le chemin de configuration

5

sed ndashi 0dnauthldap sauthldapauthldapcn=schemacn=config

cn=authldapldif

On supprime ensuite les 7 derniegraveres lignes du fichier

head -n -7 cn=authldapldif gt tmpldif

mv tmpldif cn=authldapldif

On peut maintenant importer notre fichier de configuration Pour ce faire

ldapadd -Y EXTERNAL -H ldapi -f

tmpldapconfcn=configcn=schemacn=authldapldif

Si tout va bien lrsquoentreacutee devrait avoir eacuteteacute ajouteacutee On peut veacuterifier avec la commande vue tout agrave lrsquoheure

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

On devrait voir en plus le nouveau scheacutema authldap

Constitution de la base de donneacutees LDAP Le remplissage de la base se fait agrave lrsquoaide de fichiers ldif Nous donnons ici un exemple de structure

Fichier pour la structure de base

dn dc=maildc=domainedc=tld

o intimailpw

description Global mail tree

dc mail

objectClass top

objectClass dcObject

objectClass organization

dn dc=peopledc=maildc=domainedc=tld

description Informations of all users

o people

dc people

objectClass top

objectClass dcObject

objectClass organization

dn dc=groupsdc=maildc=domainedc=tld

description All groups of users

o groups

dc groups

objectClass top

objectClass dcObject

objectClass organization

6

Fichier pour ajouter un utilisateur

dn cn=jbonddc=peopledc=maildc=domainedc=tld

uid jbond

mail jbonddomainetld

sn Moulin

givenName James

displayName James Bond

mailbox domainetldjbond

quota 50M

homeDirectory homevmail

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAccount

userPassword SSHA367PSXiUAegy8dpJbPU8OepEf8L5ye

Pour obtenir un hash du mot de passe

slappasswd -s password -h SSHA

On peut par la suite ajouter la configuration agrave la base de donneacutees avec la commande

ldapadd -D cn=admindc=domainedc=tld -W -h localhost -f pathtofile

Si les champs proposeacutes ne sont pas suffisants il faudra alors effectuer les modifications dans le fichier autldapschema

proposeacute plus haut et refaire la manipulation de configuration

De plus les standards du Mail deacutecrit par lrsquoIETF (RFC822 63 RFC1123 527 and RFC2821 451) impliquent drsquoavoir une

adresse Postmaster et une Abuse Pour cela nous pourrions creacuteer ces adresses avec la meacutethode vue au-dessus mais

ce nrsquoest pas la meilleure Il est preacutefeacuterable drsquoutiliser un alias comme nous le ferons avec les listes de diffusion Ici nous

proposons de rediriger ces deux adresses vers une adresse administrateur Pour cela la meacutethode est la mecircme sauf

que le fichier ldif nrsquoest pas tout agrave fait identique En voici un exemple

dn cn=postmasterdc=groupsdc=maildc=domainedc=tld

uid postmaster

mail postmasterdomainetld

sn Postmaster

displayName Postmaster

maildrop admindomainetld

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAlias

Pour faire une liste de diffusion la meacutethode est la mecircme Il suffit drsquoajouter toutes les adresses destinataires dans le

champ maildrop seacutepareacutees par des virgules ()

7

Installation de Postfix Installation des packages

apt-get install postfix postfix-ldap

Lors de lrsquoinstallation deux eacutecrans deacutefilent

- Configuration Internet Site

- Valeur par deacutefaut pour le mail name

On creacutee lrsquoutilisateur qui servira agrave exeacutecuter Postfix

groupadd vmail

useradd -g vmail -d homevmail -s binfalse -m vmail

Nous aurons besoin dans la suite des GID et UID creacuteeacutes agrave cet instant Ils peuvent ecirctre afficheacutes avec les commandes

cat etcgroup | grep vmail | cut -d -f3

cat etcpasswd | grep vmail | cut -d -f3

On ajoute les paramegravetres au fichier etcpostfixmaincf (remplacer les valeurs de GID et drsquoUID avec vos valeurs)

smtpd_banner = maildomainetld

virtual_mailbox_base = homevmail

virtual_mailbox_domains = dmainetld

virtual_mailbox_maps = ldapetcpostfixldap_accountscf

virtual_alias_maps = ldapetcpostfixldap_aliasescf

virtual_minimum_uid = 100

virtual_gid_maps = static1001 Remplacez ici par votre valeur de GID

virtual_uid_maps = static1001 Remplacez ici par votre valeur drsquoUID

Il nous faut maintenant constituer nos fichiers de configuration ldap_accountscf

cat gt etcpostfixldap_accountscf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=peopledc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAccount)(mail=s))

result_attribute = mailbox

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

Et pour ldap_aliasescf

cat gt ldap_aliasescf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=groupsdc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAlias)(mail=s))

result_attribute = maildrop

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

8

On peut maintenant veacuterifier la configuration de Postfix avec (cette commande ne doit rien retourner si crsquoest bon)

postfix check

Si crsquoest bon alors on recharge le serveur

postfix reload

On peut alors faire un envoi de mail test via telnet

telnet localhost 25

Si vous souhaitez deacutelivrer les mails agrave votre maniegravere il faut dans le fichier etcpostfixmaincf la ligne

virtual_transport = nomdevotreregle

Et de mecircme dans le fichier etcpostfixmastercf

nomdevotreregle unix - n n - 5 pipe

flags=Rq user=vmail null_sender=

argv=chemindevotreprogramme

Il nous reste maintenant agrave configurer les diffeacuterents enregistrements DNS neacutecessaire au fonctionnement drsquoun serveur

mail Vous pouvez utiliser la solution de votre choix Dans la suite vous trouverez une meacutethode utilisant Bind9

Installation de Bind9 Dans toute cette partie on se situera dans le dossier etcbind Dans la suite notre IP sera abcd

Dans le fichier namedconfoptions on ajoutera dans le champ options

version Not supported

Dans un dossier zones on eacutecrit le fichier dbdomainetld

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122111 Serial

43200 Refresh

3600 Retry

2419200 Expire

86400 ) Negative Cache TTL

IN NS nsdomainetld

IN NS ns11ovhnet

ns IN A abcd

www IN A abcd

IN A abcd

IN MX 10 maildomainetld

mail IN A abcd

Dans le mecircme dossier zones on a cbain-addrarpa

9

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122101 serial

14400 refresh

3600 retry

604800 expire

10800 minimum

)

cbain-addrarpa IN NS nsdomainetld

cbain-addrarpa IN NS ns11ovhnet

d IN PTR maildomainetld

Il faut faire attention agrave bien increacutementer le serial pour chaque modification des fichiers

Dans le fichier namedconflocal

zone domainetld

type master

file etcbindzonesdbdomainetld

allow-transfer 213251128130

notify yes

zone cbain-addrarpa IN

type master

file etcbindzonescbain-addrarpa

allow-transfer 213251128130

Ici 213251128130 est lrsquoadresse IP du serveur ns11ovhnet

Il faut bien sucircr configurer le DNS avec votre fournisseur (Gandi OVH hellip) Pour ccedila amusez-vous bien Vous pouvez

aussi tester votre configuration avec des outils en ligne tels que DNSstuff

En test final si votre configuration est bonne vous devriez pouvoir envoyer un mail depuis un service neutre (Gmail

yahoo hellip) et le voir dans votre arborescence (ici homevmaildomainetld)

Installation du paquet Debian et configuration de lighttpd

Commencez par reacutecupeacuterer le paquet deb agrave lrsquoadresse suivante httpswwwintimailpwintimaildeb

Installez ensuite GDebi Il srsquoagit drsquoun dpkg ameacutelioreacute pour teacuteleacutecharger les deacutependances automatiquement ce que

dpkg ne gegravere pas

apt-get update

apt-get install gdebi-core

10

Vous pouvez alors installer le paquet

gdebi intimaildeb

Vous aurez alors le site web drsquointiMail deacuteployeacute au chemin varwwwwebmail

Il ne vous reste plus qursquoagrave changer la configuration de lighttpd votre serveur web pour mettre en ligne le site

Vous pouvez pour cela copier-coller la configuration suivante mais veillez agrave bien changer lrsquoadresse IP preacutesente au

deacutebut de la partie SSL CONFIG avec votre adresse IP

serv ermodules = ( mod_access

mod_accesslog

mod_alias

mod_compress

mod_redirect

mod_rewrite

)

Hide server version

servertag = Such Headers Very try Now close telnet

serverdocument-root = varwwwwebmail

serverupload-dirs = ( varwwwwebmailuploads )

servererrorlog = varloglighttpderrorlog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

serverport = 80

accesslogformat = V h l u t r gts b Refereri

User-Agenti

accesslogfilename = varloglighttpdaccesslog

index-filenames = ( indexphp indexhtml

indexlighttpdhtml )

urlaccess-deny = ( ~ inc )

static-fileexclude-extensions = ( php pl fcgi )

compresscache-dir = varcachelighttpdcompress

compressfiletype = ( applicationjavascript textcss

texthtml textplain )

default listening port for IPv6 falls back to the IPv4 port

include_shell usrsharelighttpduse-ipv6pl + serverport

include_shell usrsharelighttpdcreate-mimeassignpl

include_shell usrsharelighttpdinclude-conf-enabledpl

SSL CONFIG

$SERVER[socket] == 5234485443

sslengine = enable

11

sslpemfile = etclighttpdsslintimailpwpem

sslca-file = etclighttpdsslintimailpwcrt

servername = intimailpw

votre configuration habituelle pour ce domaine

serverdocument-root = varwwwwebmail

servererrorlog = varloglighttpderror_ssllog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

Rewrite des URL pour masquer php

urlrewrite-once = ( ^()$ =gt $1 )

urlrewrite-if-not-file = ( ^([^])()$ =gt $1php$2 )

servernetwork-backend = writev

Deacutependances Slapd

Ldap-utils

Postfix

Postfix-ldap

Bind9

Lighttpd

12

Sources httpswikigandinetfrhostingusing-linuxtutorialsdebianmail-server-ldap

httpwwwpostfixorgpipe8html

httpwwwpostfixorgFILTER_READMEhtml

httpwwwpostfixorg

httpwwwpostfixorgtransport5html

Page 16: Système d'hébergement domestique...place sur les domaines .pw par Gandi.net, notre fournisseur. Nous n’avons donc pas pu l’implémenter. Nous avons configuré Postfix pour qu’il

Fig 11 lrsquointerface drsquoadministration

Sur cette interface il peut choisir la taille maximale des piegraveces jointes

changer le nom de domaine sur lequel est installeacute lrsquointerface et dont deacutependent

toutes les adresses (domaine) Il est aussi possible de modifier directement ces

variables en modifiant le fichier includeconfigincphp Pratique notamment si lrsquoon

a renseigneacute un mauvais nom de domaine agrave la configuration et que lrsquoon arrive plus agrave

acceacuteder agrave lrsquointerface

Il peut aussi creacuteer un nouveau compte en renseignant les champs preacutenom

nom mot de passe et quota Lrsquoutilisateur peut ensuite une fois son compte creacutee

directement se connecter avec son identifiant (initiale preacutenom + nom) et mot de

passe Lors de la creacuteation du compte un mail de bienvenue est envoyeacute au nouvel

utilisateur ce qui permet en arriegravere-plan de creacuteer tous les dossiers utilisateurs et

fichiers en-tecirctes utiles agrave lrsquointerface une fois pour toutes

Lrsquoadministrateur peut aussi ajouter une liste de diffusion (assimileacutee agrave un

groupe) ou en supprimer une parmi les listes existantes

En outre lrsquoadministrateur peut aussi modifier les donneacutees drsquoun utilisateur

Pour cela sur la preacutesente page il peut seacutelectionner un utilisateur parmi la liste des

utilisateurs existants ce qui le redirige vers la page de gestion des comptes

Fig 12 La gestion drsquoun compte seacutelectionneacute ici celui de James Bond

A ce stade il peut changer lrsquoUID de lrsquoutilisateur (utile en cas de conflit) le nom

le mot de passe le quota de cet utilisateur et lrsquoajouter ou le retirer drsquoune liste de

diffusion Accessoirement il peut aussi supprimer le compte en cliquant sur lrsquoeacutenorme

bouton rouge qui lui demandera deux fois de suite de confirmer son action afin

drsquoeacuteviter les erreurs de clic Cette action entraicircne la suppression de lrsquoutilisateur de

toutes les listes de diffusion auxquelles il appartient la suppression de son compte

dans la branche people de lrsquoarbre LDAP et la suppression deacutefinitive de son dossier

utilisateur sur le disquesystegraveme de fichiers impliquant donc la perte de ses mails

Architecture du systegraveme de fichiers

Comme nous lrsquoavons dit plus haut lrsquoideacutee est de se passer des meacutecanismes

classiques avec les clients mails habituels Ces serveurs srsquoalourdissent

geacuteneacuteralement en utilisant des serveurs IMAPPOP3 et un meacutecanisme

drsquoauthentification SMTP

Pour adapter ces fonctionnaliteacutes agrave notre systegraveme nous avons donc constitueacute

une architecture pour organiser les fichiers qui transitent Vous pourrez voir un

scheacutema reacutecapitulatif en annexe 1

Dans la premiegravere moitieacute du projet les mails eacutetaient deacutelivreacutes par Postfix Nous

utilisions un script exeacutecuteacute lors de la reacuteception drsquounmail pour les traiter de lamaniegravere

que nous voulions Cette meacutethode avait les inconveacutenients drsquoecirctre lourde et pas

efficace agrave 100 En effet seuls les mails reccedilus depuis lrsquoexteacuterieur eacutetaient

correctement traiteacutes

Deacutesormais les mails sont traiteacutes totalement par notre script Cela nous

permet de geacuterer les mails dans des dossiers organiseacutes agrave notre maniegravere et de

recevoir les mails locaux crsquoest-agrave-dire entre utilisateurs du mecircme domaine Cette

nouvelle meacutethode regravegle aussi drsquoautres problegravemes notamment au niveau des

permissions sur les fichiers

Pour reacuteduire le nombre drsquoopeacuterations et pour profiter des fonctionnaliteacutes

offertes par le framework utiliseacute pour lrsquointerface web nous regroupons des

informations sur chacun des mails reccedilus sous la forme de fichiers JSON Pour ce

faire lrsquoideacutee est drsquoexeacutecuter un script lorsque leacutevegravenement ldquoreacuteception drsquoun mailrdquo

survient Postfix offre cette possibiliteacute dans sa configuration Or il se trouve qursquoil nrsquoest

pas si simple de reacutecupeacuterer le chemin du fichier contenant le mail car le nom du

fichier creacutee est sous la forme Timestamp UNIX10 Caractegraveres aleacuteatoires (ex

14562336185A8D43E97F)

La seconde probleacutematique est que le webmail doit avoir la possibiliteacute de

pouvoir lire les fichiers pour afficher les mails sur son interface Or il semble que

Postfix les eacutecrit en autorisant uniquement son utilisateur en lecture Il nous a fallu

trouver une solution pour remeacutedier agrave cela Nous avons choisi drsquoajouter www-data

(utilisateur du serveur web) au groupe vmail et de modifier les droits sur les fichiers

de sorte que les utilisateurs de ce groupe puissent lire les fichiers

Nous avons revu une partie de lrsquoorganisation des fichiers pour reacutecupeacuterer les

piegraveces jointes si elles sont preacutesentes Le script que nous avons eacutecrit reacutecupegravere le

fichier original du mail et le deacutecoupe en eacuteleacutements simples dans des fichier distincts

corps du mail et diffeacuterentes piegraveces jointes De cette maniegravere pour afficher un mail

nous nrsquoavons pas besoin de charger la totaliteacute du fichier Dans le cas ougrave il y a des

piegraveces jointes cela aurait ralenti lrsquoaffichage des informations

Nous avons eacutegalement impleacutementeacute la gestion des quotas Dans lrsquoeacutetat actuel

des choses srsquoil nrsquoy a plus de place disponible pour lrsquoutilisateur le mail nrsquoest tout

bonnement pas deacutelivreacute agrave ce destinataire Lrsquoideacuteal aurait eacuteteacute de notifier leacutemetteur avec

un mail ce qui nrsquoest pour lrsquoinstant pas le cas mais qui pourrait ecirctre reacutesolu en

renvoyant agrave postfix un code drsquoerreur deacutefini

Pour terminer nous avons revu la totaliteacute du code deacuteveloppeacute Nous sommes

passeacute du Bash au Perl Ce dernier est plus performant et plus simple agrave utiliser et agrave

lire

Firewall

Un autre gros morceau du projet mais qui nrsquoest pas speacutecifiquement lieacute agrave la

probleacutematique du mail crsquoest la seacutecurisation du serveur En effet apregraves avoir mis en

ligne notre serveur des pirates ont tregraves vite tenteacute de peacuteneacutetrer le systegraveme

Globalement les attaques eacutetaient de type force brute sur les services heacutebergeacutes sur

notre Raspberry neacutecessitant une identification tels que SSH SMTP hellip

On retrouve ici un petit point faible du protocole SMTP Eacutetant donneacute que

chaque serveur mail doit avoir une adresse postmaster et abuse lrsquoattaquant a agrave sa

disposition deux adresses agrave attaquer Ceci dit ce type drsquoattaque est simple agrave

contrecarrer car il suffit de limiter dans le temps le nombre de tentatives de

connexions

La contre-mesure que nous avons mis en place est simple une seacuterie de

regravegles Iptables En reacutesumeacute nous avons opteacute pour un systegraveme de liste blanche et

noire Les adresses IPs de la liste blanche sont autoriseacutees agrave utiliser la totaliteacute des

services (notamment SSH) tandis que celles de la liste noire sont totalement

ignoreacutees Les autres IPs nrsquoont accegraves qursquoau webmail

Eacutetant donneacute que le nombre drsquoIPs attaquant notre serveur nrsquoa cesseacute

drsquoaugmenter nous avons automatiseacute la mise agrave jour de la liste de noire en

deacuteveloppant un script pour Cron Ce script est exeacutecuteacute une fois par heure A ce jour

notre liste noire contient 47 adresses Bien sucircr ce systegraveme est susceptible drsquoecirctre

modifieacute agrave convenance pour passer sur une solution deacutedieacutee telle que Fail2ban qui fait

en fait ce qursquoon fait deacutejagrave (eacutetudier les logs et bannir des IP avec iptables) avec des

regravegles preacutedeacutefinies par la communauteacute et personnalisables En effet nous nous

attendons agrave voir la varieacuteteacute et le nombre drsquoattaques augmenter apregraves avoir migreacute sur

une IP non proteacutegeacutee par le firewall de lrsquoUniversiteacute puisque nous nrsquoavons plus la

premiegravere ligne de deacutefense du CRI en particulier pour le port 389 (LDAP) qui eacutetait

bloqueacute par lrsquouniversiteacute et srsquoest retrouveacute en premiegravere ligne apregraves la migration Nous

avons donc ajouteacute une regravegle bloquant tout le trafic entrant vers le port 389 hormis

localhost

Package drsquoinstallation

Nous avons creacutee un package deb contenant les sources du webmail ainsi

que des scripts utiles agrave lrsquoinstallation et au fonctionnement du serveur Nous avons

deacuteveloppeacute des scripts de configuration automatique pour LDAP et Postfix Comme

dpkg ne supporte pas directement lrsquoinstallation automatique des deacutependances

nous recommandons drsquoinstaller avant tout le paquet gdebi-core qui est en fait un

dpkg ameacutelioreacute Gracircce agrave la commande gdebi paquetdeb toutes les deacutependances

seront installeacutees en particulier postfix le serveur ldap le serveur web lighttpd entre

autres sans soucis Il est agrave noter que comme les scripts de configuration des

diffeacuterents services ne sont que partiellement impleacutementeacutes dans le paquet deb nous

fournissons en annexe un README complet et illustreacute qui explique pas agrave pas

comment faire fonctionner notre systegraveme sur nrsquoimporte quel Linux en particulier les

lignes de configuration des diffeacuterents services agrave changer et un exemplaire des

fichiers de configuration fonctionnels de ces services

Gestion de lrsquoeacutenergie

Une consideacuteration importante pour un systegraveme autonome Drsquoapregraves les fiches

techniques notre modegravele de Raspberry Pi (B 2) est officiellement eacutevalueacute avec un

fonctionnement agrave ~650mA pour 5V De nombreux proprieacutetaires de ce systegraveme

eacutequipeacutes se sont amuser agrave veacuterifier la consommation eacutelectrique reacuteelle de leur Pi 2 B

sous diffeacuterentes charges On pourra retenir cette eacutetude (lien en sitegraphie) qui

relegraveve la consommation en courant en fonction de lrsquoactiviteacute lanceacutee sur la Pi mais

aussi en charge sur 1 agrave 4 CPU

Ces chiffres sont releveacutes sur un systegraveme avec cameacutera connecteacutee HDMI connecteacute et

cacircble ethernet brancheacute et actif

On peut constater que globalement notre systegraveme Pi 2 B tournant sans

interface graphique sans composant suppleacutementaire sans sortie videacuteo ni cameacutera

avec plusieurs serveurs tournant tout en restant le plus leacuteger possible et demeurant

~99 idle la plupart du temps ne devrait pas deacutepasser une consommation de

300mA grand maximum

Fig 13 Un processeur tregraves tregraves peu chargeacute et une meacutemoire relativement libre

Nous avions lrsquoanneacutee derniegravere deacutejagrave reacutealiseacute un circuit permettant drsquoadapter un

panneau solaire sur une batterie USB classique de 9000mAh Nous avions alors pu

mesurer lrsquointensiteacute deacutelivreacutee par le panneau solaire En cas drsquoensoleillement moyen

habituel dans nos contreacutees le panneau solaire deacutebitait 400mA et pouvait atteindre

le double quand le soleil eacutetait directement preacutesent pour environ 800mA deacutebiteacute

Ce panneau solaire accompagneacute de son circuit drsquoadaptation devrait donc

suffire pour alimenter notre systegraveme la journeacutee le brancher ensuite sur une batterie

portable permet de stocker le surplus pour la nuit

Fig 14 le circuit drsquoadaptation

Fig 15 et son PCB

Eacutevolutions possibles

Webmail

Concernant les eacutevolutions possibles que nous aurions aimeacute apporter agrave notre

projet avec plus de temps commenccedilons par le web Nous aurions souhaiteacute apporter

la gestion de lrsquoenvoi de plusieurs piegraveces jointes comme nous lrsquoavons fait pour la

reacuteception

De plus nous aurions voulu inteacutegrer une corbeille ougrave lesmessages pourraient

aller avant drsquoecirctre deacutefinitivement supprimeacutes du systegraveme drsquoautant que nous avons

deacutejagrave eacutecrites les fonctions PHP permettant de retirer une en-tecircte drsquoun fichier JSON et

le fichier mail associeacute

Enfin nous aurions aimeacute en plus du blocage deacutejagrave preacutesent impleacutementer une

gestion plus profonde des piegravece jointes permettant notamment le remplissage de la

boicircte de spams

Systegraveme

Il aurait eacuteteacute inteacuteressant de notifier lrsquoexpeacutediteur lorsque le mail nrsquoa pas pu ecirctre

deacutelivreacute agrave un utilisateur lorsque son quota est plein En toute logique cela devrait ecirctre

fait simplement avec la commande Sendmail

Une meilleur gestion du trafic mail indeacutesirable aurait eacuteteacute la bienvenue En

effet malgreacute la limitation du spam il restera toujours une partie du volume de mail

qui sera indeacutesirable (pub pishing scam hellip)

Eacutetant donneacute la taille du systegraveme nous avions penseacute agrave une approche

ldquomachine learningrdquo Lrsquoutilisateur indiquerait pourquoi il considegravere le mail comme

indeacutesirable constituant des regravegles refusant certains mails Les mails provenant de

cet expeacutediteur pourraient ecirctre deacutetecteacute par le script agrave la reacuteception et

automatiquement envoyeacutes dans la boicircte de spams

Partie eacutenergeacutetique

Mecircme si la solution au panneau solaire ne pose aucun problegraveme en theacuteorie

nous aurions deacutejagrave dans un premier temps aimeacute lrsquoimpleacutementer en pratique Nous

nrsquoavons finalement pas reacutealiseacute notre objectif de deacutetecter deux cas drsquoalimentation

diffeacuterents soit lrsquoalimentation via panneau solaire est suffisante dans ce cas il

alimente la batterie et donc la Raspberry soit quand ce courant nrsquoest pas suffisant

on alimente la batterie par le secteur

Conclusion

En conclusion nous pensons avoir reacutepondu au cahier des charges initial dans

sa majeure partie Nous sommes aujourdrsquohui en mesure de proposer une solution

mail domestique priveacutee et personnalisable par un particulier

Notre installation de Debian a eacuteteacute au maximum alleacutegeacutee pour notre utilisation

sans interface graphique et nous avons mis en place une reacuteponse aux diverses

attaques que nous avons pu subir lors de lamise en place de notre solution logicielle

En outre le pare-feu avec notre systegraveme de liste noire bloque une partie des

attaques qui peuvent nous parvenir

Nos diffeacuterents scripts de pare-feu de gestion drsquoun mail entrant associeacute au

webmail permettent agrave un utilisateur drsquoacceacuteder aux fonctions usuelles associeacutees agrave

lrsquoenvoi et la reacuteception de mails

Gracircce agrave sa configuration personnalisable notre projet devrait pouvoir ecirctre

porteacute sur un domaine et une adresse IP diffeacuterente sans soucis et ecirctre deacuteployeacute

partout ougrave des gens souhaitent conserver leur vie priveacutee

Nous regretterons cependant de ne pas avoir exploiteacute la partie eacutenergeacutetique

de ce projet qui portait une probleacutematique inteacuteressante et qui nous parait importante

dans le monde actuel

Ce projet nous aura occupeacute pendant tregraves longtemps et nous sommes fiers du

travail que nous avons accompli Il est agrave nos yeux la preuve de ce que nous savons et

pouvons faire et nous donnera confiance pour notre deacutebut de carriegravere drsquoingeacutenieur

Sources

httpwwwradicaticomwpwp-contentuploads201401Email-Statistics-R

eport-2014-2018-Executive-Summarypdf

httpwwwcommentcamarchenetcontents525-le-protocole-ldap

httpsfrwikipediaorgwikiSimple_Mail_Transfer_Protocol

httpwwwcommentcamarchenetcontents536-pop3-smtp-imap-protocol

es-de-messagerie

httpstoolsietforghtmlrfc2821

httpsfrwikipediaorgwikiInternet_Message_Access_Protocol

httpstoolsietforghtmlrfc3501

httparstechnicacominformation-technology201402how-to-run-your-ow

n-e-mail-server-with-your-own-domain-part-1

httpswwwraspberrypiorgforumsviewtopicphpp=136912

httpstackoverflowcomquestions17394356how-can-i-make-a-bash-com

mand-run-periodically

httpuntroubledorgnullmailer

httpelinuxorgRPi_Hardware

httpraspitv2015raspberry-pi2-power-and-performance-measurement

Annexe 1 Architecture du systegraveme de fichiers

Annexe 2 Scan DNSSTUFF

Depuis httpwwwdnsstuffcomtoolsdnsReport|type=domainampampvalue=intimailpw

Annexe 3 Vue geacuteneacuterale httpswwwintimailpw

Annexe 4 Envoyer un mail

Annexe 5 Boite de reacuteception

Annexe 6 Interface drsquoadministration

Annexe 7 Gestion drsquoun utilisateur

Tutorial installation intimailtrade

Table des matiegraveres Apregraves une nouvelle installation de lrsquoOS 2

Seacutecurisation du serveur 2

Changement de lrsquoutilisateur par deacutefaut 2

Changement du port SSH 2

Interdire lrsquoauthentification SSH pour root 2

Installation de LDAP 3

Configuration de base 3

Configuration des Scheacutemas 4

Constitution de la base de donneacutees LDAP 5

Installation de Postfix 7

Installation de Bind9 8

Installation du paquet Debian et configuration de lighttpd 9

Deacutependances 11

Sources 12

2

Apregraves une nouvelle installation de lrsquoOS Exeacutecutez ces commandes pour mettre agrave jour agrave la derniegravere version Ces opeacuterations peuvent prendre un certain

temps Nous avons utiliseacute pour cet exemple Raspbian Jessie Lite sur une Raspberry Pi 2

apt-get update

apt-get upgrade ampamp apt-get dist-upgrade

apt-get install linux-headers-$(uname -r)

reboot

Puis lancer

raspi-config

Etendre au maximum lrsquoespace de stockage en navigant dans les menus

Expand Filesystem

Reacutegler une ip statique avec la box fichier etcnetworkinterfaces

iface eth0 inet static

address 192168131

netmask 2552552550

gateway 19216811

Nous avons aussi supprimeacute wpasupplicant

Seacutecurisation du serveur

Changement de lrsquoutilisateur par deacutefaut Changez le nom drsquoutilisateur par deacutefaut ainsi que son mot de passe

sudo passwd root

Sortie et login en tant que root puis

usermod -l myuname pi

usermod -m -d homemyuname myuname

groupmod ndashn myuname pi

passwd myuname

Voir cette adresse pour lrsquoutilisation de cleacutes priveacuteespubliques

Changement du port SSH sed ndashi sPort 22Port 2222g etcsshsshd_config

Interdire lrsquoauthentification SSH pour root sed -i sPermitRootLogin yesPermitRootLogin nog etcsshsshd_config

3

Installation de LDAP

Configuration de base Installation du package

apt-get install slapd

Choisir un mot de passe administrateur puis lancer la commande

dpkg-reconfigure slapd

Reacutepondre non agrave la question 1

Entrez le nom de domaine utiliseacute agrave la question 2 sous la forme domainetld

Entrez ce que vous voulez au 3egraveme eacutecran le nom de lrsquoorganisation ne sera pas utiliseacute

Entrez un mot de passe

Choisissez HDB

Choisissez si la base de donneacutees est supprimeacutee agrave la deacutesinstallation de slapd

Deacuteplacez lrsquoancienne base de donneacutees

Nrsquoutilisez pas LDAPv2

Installer les outils de conversion pour ldap (slaptest ldapmodify notamment)

apt-get install ldap-utils

On peut maintenant veacuterifier que la configuration est valable

ldapsearch -x -h localhost -b dc=domainedc=tld -LLL dc=domaine dn

Cette commande doit retourner quelque chose comme

dn dc=domainedc=tld

Il faut maintenant seacutecuriser le serveur LDAP en effet on peut y acceacuteder en anonyme avec la commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=config

(amp(objectClass=olcDatabaseConfig)(olcSuffix=dc=domainedc=tld))

Cette commande retourne un certain nombre drsquoinformations notamment agrave propos des champs suivants

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by none

olcAccess 1to dnbase= by read

olcAccess 2to by read

On va modifier ces champs avec la commande ldapmodify Pour cela on va creacuteer un fichier ldif

cat gt changeAccessldif ltlt EOF

dn olcDatabase=1hdbcn=config

changetype modify

delete olcAccess

-

add olcAccess

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by dn=cn=admindc=domainedc=tld write by none

-

add olcAccess

olcAccess 1to dnbase= by read

-

4

add olcAccess

olcAccess 2to by self write by dn=cn=admindc=domainedc=tld write by

none

-

EOF

On peut maintenant appliquer les changements avec ldapmodify

ldapmodify ndashc ndashY EXTERNAL ndashH ldapi -f changeAccessldif

La commande devrait vous confirmer que la modification srsquoest bien effectueacutee

SASLEXTERNAL authentication started

SASL username gidNumber=0+uidNumber=0cn=peercredcn=externalcn=auth

SASL SSF 0

modifying entry olcDatabase=1hdbcn=config

On peut veacuterifier qursquoon ne peut plus acceacuteder aux informations avec la commande

ldapsearch -x -c -h localhost -b dc=domainedc=tld

On peut veacuterifier la configuration en se connectant en tant qursquoadministrateur

ldapsearch -c -h localhost -b dc=domainedc=tld -D

cn=admindc=domainedc=tld ndashW

Configuration des Scheacutemas Nous allons utiliser les scheacutemas de courier-ldap Pour eacuteviter une manipulation compliqueacutee vous trouverez

directement le scheacutema avec le fichier authldapschema On place ce fichier dans le dossier

mv authldapschema etcldapschema

Nous creacuteons un fichier qui incluera tous les scheacutemas de base en plus du nouveau On peut les afficher avec la

commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

Creacuteation du fichier de configuration pour notre exemple cela donne

mkdir tmpldapconf

cat gt tmpldapconfldapconf ltlt EOF

include etcldapschemacoreschema

include etcldapschemacosineschema

include etcldapschemanisschema

include etcldapschemainetorgpersonschema

include etcldapschemaauthldapschema

EOF

On lance ensuite la commande

slaptest -f tmpldapconfldapconf -F tmpldapconf

Elle revoie un message de succegraves Cette commande a creacuteeacute dans le reacutepertoire tmpldapconf une arborescence

correspondant agrave la configuration de notre LDAP

On modifie le chemin de configuration

5

sed ndashi 0dnauthldap sauthldapauthldapcn=schemacn=config

cn=authldapldif

On supprime ensuite les 7 derniegraveres lignes du fichier

head -n -7 cn=authldapldif gt tmpldif

mv tmpldif cn=authldapldif

On peut maintenant importer notre fichier de configuration Pour ce faire

ldapadd -Y EXTERNAL -H ldapi -f

tmpldapconfcn=configcn=schemacn=authldapldif

Si tout va bien lrsquoentreacutee devrait avoir eacuteteacute ajouteacutee On peut veacuterifier avec la commande vue tout agrave lrsquoheure

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

On devrait voir en plus le nouveau scheacutema authldap

Constitution de la base de donneacutees LDAP Le remplissage de la base se fait agrave lrsquoaide de fichiers ldif Nous donnons ici un exemple de structure

Fichier pour la structure de base

dn dc=maildc=domainedc=tld

o intimailpw

description Global mail tree

dc mail

objectClass top

objectClass dcObject

objectClass organization

dn dc=peopledc=maildc=domainedc=tld

description Informations of all users

o people

dc people

objectClass top

objectClass dcObject

objectClass organization

dn dc=groupsdc=maildc=domainedc=tld

description All groups of users

o groups

dc groups

objectClass top

objectClass dcObject

objectClass organization

6

Fichier pour ajouter un utilisateur

dn cn=jbonddc=peopledc=maildc=domainedc=tld

uid jbond

mail jbonddomainetld

sn Moulin

givenName James

displayName James Bond

mailbox domainetldjbond

quota 50M

homeDirectory homevmail

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAccount

userPassword SSHA367PSXiUAegy8dpJbPU8OepEf8L5ye

Pour obtenir un hash du mot de passe

slappasswd -s password -h SSHA

On peut par la suite ajouter la configuration agrave la base de donneacutees avec la commande

ldapadd -D cn=admindc=domainedc=tld -W -h localhost -f pathtofile

Si les champs proposeacutes ne sont pas suffisants il faudra alors effectuer les modifications dans le fichier autldapschema

proposeacute plus haut et refaire la manipulation de configuration

De plus les standards du Mail deacutecrit par lrsquoIETF (RFC822 63 RFC1123 527 and RFC2821 451) impliquent drsquoavoir une

adresse Postmaster et une Abuse Pour cela nous pourrions creacuteer ces adresses avec la meacutethode vue au-dessus mais

ce nrsquoest pas la meilleure Il est preacutefeacuterable drsquoutiliser un alias comme nous le ferons avec les listes de diffusion Ici nous

proposons de rediriger ces deux adresses vers une adresse administrateur Pour cela la meacutethode est la mecircme sauf

que le fichier ldif nrsquoest pas tout agrave fait identique En voici un exemple

dn cn=postmasterdc=groupsdc=maildc=domainedc=tld

uid postmaster

mail postmasterdomainetld

sn Postmaster

displayName Postmaster

maildrop admindomainetld

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAlias

Pour faire une liste de diffusion la meacutethode est la mecircme Il suffit drsquoajouter toutes les adresses destinataires dans le

champ maildrop seacutepareacutees par des virgules ()

7

Installation de Postfix Installation des packages

apt-get install postfix postfix-ldap

Lors de lrsquoinstallation deux eacutecrans deacutefilent

- Configuration Internet Site

- Valeur par deacutefaut pour le mail name

On creacutee lrsquoutilisateur qui servira agrave exeacutecuter Postfix

groupadd vmail

useradd -g vmail -d homevmail -s binfalse -m vmail

Nous aurons besoin dans la suite des GID et UID creacuteeacutes agrave cet instant Ils peuvent ecirctre afficheacutes avec les commandes

cat etcgroup | grep vmail | cut -d -f3

cat etcpasswd | grep vmail | cut -d -f3

On ajoute les paramegravetres au fichier etcpostfixmaincf (remplacer les valeurs de GID et drsquoUID avec vos valeurs)

smtpd_banner = maildomainetld

virtual_mailbox_base = homevmail

virtual_mailbox_domains = dmainetld

virtual_mailbox_maps = ldapetcpostfixldap_accountscf

virtual_alias_maps = ldapetcpostfixldap_aliasescf

virtual_minimum_uid = 100

virtual_gid_maps = static1001 Remplacez ici par votre valeur de GID

virtual_uid_maps = static1001 Remplacez ici par votre valeur drsquoUID

Il nous faut maintenant constituer nos fichiers de configuration ldap_accountscf

cat gt etcpostfixldap_accountscf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=peopledc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAccount)(mail=s))

result_attribute = mailbox

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

Et pour ldap_aliasescf

cat gt ldap_aliasescf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=groupsdc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAlias)(mail=s))

result_attribute = maildrop

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

8

On peut maintenant veacuterifier la configuration de Postfix avec (cette commande ne doit rien retourner si crsquoest bon)

postfix check

Si crsquoest bon alors on recharge le serveur

postfix reload

On peut alors faire un envoi de mail test via telnet

telnet localhost 25

Si vous souhaitez deacutelivrer les mails agrave votre maniegravere il faut dans le fichier etcpostfixmaincf la ligne

virtual_transport = nomdevotreregle

Et de mecircme dans le fichier etcpostfixmastercf

nomdevotreregle unix - n n - 5 pipe

flags=Rq user=vmail null_sender=

argv=chemindevotreprogramme

Il nous reste maintenant agrave configurer les diffeacuterents enregistrements DNS neacutecessaire au fonctionnement drsquoun serveur

mail Vous pouvez utiliser la solution de votre choix Dans la suite vous trouverez une meacutethode utilisant Bind9

Installation de Bind9 Dans toute cette partie on se situera dans le dossier etcbind Dans la suite notre IP sera abcd

Dans le fichier namedconfoptions on ajoutera dans le champ options

version Not supported

Dans un dossier zones on eacutecrit le fichier dbdomainetld

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122111 Serial

43200 Refresh

3600 Retry

2419200 Expire

86400 ) Negative Cache TTL

IN NS nsdomainetld

IN NS ns11ovhnet

ns IN A abcd

www IN A abcd

IN A abcd

IN MX 10 maildomainetld

mail IN A abcd

Dans le mecircme dossier zones on a cbain-addrarpa

9

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122101 serial

14400 refresh

3600 retry

604800 expire

10800 minimum

)

cbain-addrarpa IN NS nsdomainetld

cbain-addrarpa IN NS ns11ovhnet

d IN PTR maildomainetld

Il faut faire attention agrave bien increacutementer le serial pour chaque modification des fichiers

Dans le fichier namedconflocal

zone domainetld

type master

file etcbindzonesdbdomainetld

allow-transfer 213251128130

notify yes

zone cbain-addrarpa IN

type master

file etcbindzonescbain-addrarpa

allow-transfer 213251128130

Ici 213251128130 est lrsquoadresse IP du serveur ns11ovhnet

Il faut bien sucircr configurer le DNS avec votre fournisseur (Gandi OVH hellip) Pour ccedila amusez-vous bien Vous pouvez

aussi tester votre configuration avec des outils en ligne tels que DNSstuff

En test final si votre configuration est bonne vous devriez pouvoir envoyer un mail depuis un service neutre (Gmail

yahoo hellip) et le voir dans votre arborescence (ici homevmaildomainetld)

Installation du paquet Debian et configuration de lighttpd

Commencez par reacutecupeacuterer le paquet deb agrave lrsquoadresse suivante httpswwwintimailpwintimaildeb

Installez ensuite GDebi Il srsquoagit drsquoun dpkg ameacutelioreacute pour teacuteleacutecharger les deacutependances automatiquement ce que

dpkg ne gegravere pas

apt-get update

apt-get install gdebi-core

10

Vous pouvez alors installer le paquet

gdebi intimaildeb

Vous aurez alors le site web drsquointiMail deacuteployeacute au chemin varwwwwebmail

Il ne vous reste plus qursquoagrave changer la configuration de lighttpd votre serveur web pour mettre en ligne le site

Vous pouvez pour cela copier-coller la configuration suivante mais veillez agrave bien changer lrsquoadresse IP preacutesente au

deacutebut de la partie SSL CONFIG avec votre adresse IP

serv ermodules = ( mod_access

mod_accesslog

mod_alias

mod_compress

mod_redirect

mod_rewrite

)

Hide server version

servertag = Such Headers Very try Now close telnet

serverdocument-root = varwwwwebmail

serverupload-dirs = ( varwwwwebmailuploads )

servererrorlog = varloglighttpderrorlog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

serverport = 80

accesslogformat = V h l u t r gts b Refereri

User-Agenti

accesslogfilename = varloglighttpdaccesslog

index-filenames = ( indexphp indexhtml

indexlighttpdhtml )

urlaccess-deny = ( ~ inc )

static-fileexclude-extensions = ( php pl fcgi )

compresscache-dir = varcachelighttpdcompress

compressfiletype = ( applicationjavascript textcss

texthtml textplain )

default listening port for IPv6 falls back to the IPv4 port

include_shell usrsharelighttpduse-ipv6pl + serverport

include_shell usrsharelighttpdcreate-mimeassignpl

include_shell usrsharelighttpdinclude-conf-enabledpl

SSL CONFIG

$SERVER[socket] == 5234485443

sslengine = enable

11

sslpemfile = etclighttpdsslintimailpwpem

sslca-file = etclighttpdsslintimailpwcrt

servername = intimailpw

votre configuration habituelle pour ce domaine

serverdocument-root = varwwwwebmail

servererrorlog = varloglighttpderror_ssllog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

Rewrite des URL pour masquer php

urlrewrite-once = ( ^()$ =gt $1 )

urlrewrite-if-not-file = ( ^([^])()$ =gt $1php$2 )

servernetwork-backend = writev

Deacutependances Slapd

Ldap-utils

Postfix

Postfix-ldap

Bind9

Lighttpd

12

Sources httpswikigandinetfrhostingusing-linuxtutorialsdebianmail-server-ldap

httpwwwpostfixorgpipe8html

httpwwwpostfixorgFILTER_READMEhtml

httpwwwpostfixorg

httpwwwpostfixorgtransport5html

Page 17: Système d'hébergement domestique...place sur les domaines .pw par Gandi.net, notre fournisseur. Nous n’avons donc pas pu l’implémenter. Nous avons configuré Postfix pour qu’il

Fig 12 La gestion drsquoun compte seacutelectionneacute ici celui de James Bond

A ce stade il peut changer lrsquoUID de lrsquoutilisateur (utile en cas de conflit) le nom

le mot de passe le quota de cet utilisateur et lrsquoajouter ou le retirer drsquoune liste de

diffusion Accessoirement il peut aussi supprimer le compte en cliquant sur lrsquoeacutenorme

bouton rouge qui lui demandera deux fois de suite de confirmer son action afin

drsquoeacuteviter les erreurs de clic Cette action entraicircne la suppression de lrsquoutilisateur de

toutes les listes de diffusion auxquelles il appartient la suppression de son compte

dans la branche people de lrsquoarbre LDAP et la suppression deacutefinitive de son dossier

utilisateur sur le disquesystegraveme de fichiers impliquant donc la perte de ses mails

Architecture du systegraveme de fichiers

Comme nous lrsquoavons dit plus haut lrsquoideacutee est de se passer des meacutecanismes

classiques avec les clients mails habituels Ces serveurs srsquoalourdissent

geacuteneacuteralement en utilisant des serveurs IMAPPOP3 et un meacutecanisme

drsquoauthentification SMTP

Pour adapter ces fonctionnaliteacutes agrave notre systegraveme nous avons donc constitueacute

une architecture pour organiser les fichiers qui transitent Vous pourrez voir un

scheacutema reacutecapitulatif en annexe 1

Dans la premiegravere moitieacute du projet les mails eacutetaient deacutelivreacutes par Postfix Nous

utilisions un script exeacutecuteacute lors de la reacuteception drsquounmail pour les traiter de lamaniegravere

que nous voulions Cette meacutethode avait les inconveacutenients drsquoecirctre lourde et pas

efficace agrave 100 En effet seuls les mails reccedilus depuis lrsquoexteacuterieur eacutetaient

correctement traiteacutes

Deacutesormais les mails sont traiteacutes totalement par notre script Cela nous

permet de geacuterer les mails dans des dossiers organiseacutes agrave notre maniegravere et de

recevoir les mails locaux crsquoest-agrave-dire entre utilisateurs du mecircme domaine Cette

nouvelle meacutethode regravegle aussi drsquoautres problegravemes notamment au niveau des

permissions sur les fichiers

Pour reacuteduire le nombre drsquoopeacuterations et pour profiter des fonctionnaliteacutes

offertes par le framework utiliseacute pour lrsquointerface web nous regroupons des

informations sur chacun des mails reccedilus sous la forme de fichiers JSON Pour ce

faire lrsquoideacutee est drsquoexeacutecuter un script lorsque leacutevegravenement ldquoreacuteception drsquoun mailrdquo

survient Postfix offre cette possibiliteacute dans sa configuration Or il se trouve qursquoil nrsquoest

pas si simple de reacutecupeacuterer le chemin du fichier contenant le mail car le nom du

fichier creacutee est sous la forme Timestamp UNIX10 Caractegraveres aleacuteatoires (ex

14562336185A8D43E97F)

La seconde probleacutematique est que le webmail doit avoir la possibiliteacute de

pouvoir lire les fichiers pour afficher les mails sur son interface Or il semble que

Postfix les eacutecrit en autorisant uniquement son utilisateur en lecture Il nous a fallu

trouver une solution pour remeacutedier agrave cela Nous avons choisi drsquoajouter www-data

(utilisateur du serveur web) au groupe vmail et de modifier les droits sur les fichiers

de sorte que les utilisateurs de ce groupe puissent lire les fichiers

Nous avons revu une partie de lrsquoorganisation des fichiers pour reacutecupeacuterer les

piegraveces jointes si elles sont preacutesentes Le script que nous avons eacutecrit reacutecupegravere le

fichier original du mail et le deacutecoupe en eacuteleacutements simples dans des fichier distincts

corps du mail et diffeacuterentes piegraveces jointes De cette maniegravere pour afficher un mail

nous nrsquoavons pas besoin de charger la totaliteacute du fichier Dans le cas ougrave il y a des

piegraveces jointes cela aurait ralenti lrsquoaffichage des informations

Nous avons eacutegalement impleacutementeacute la gestion des quotas Dans lrsquoeacutetat actuel

des choses srsquoil nrsquoy a plus de place disponible pour lrsquoutilisateur le mail nrsquoest tout

bonnement pas deacutelivreacute agrave ce destinataire Lrsquoideacuteal aurait eacuteteacute de notifier leacutemetteur avec

un mail ce qui nrsquoest pour lrsquoinstant pas le cas mais qui pourrait ecirctre reacutesolu en

renvoyant agrave postfix un code drsquoerreur deacutefini

Pour terminer nous avons revu la totaliteacute du code deacuteveloppeacute Nous sommes

passeacute du Bash au Perl Ce dernier est plus performant et plus simple agrave utiliser et agrave

lire

Firewall

Un autre gros morceau du projet mais qui nrsquoest pas speacutecifiquement lieacute agrave la

probleacutematique du mail crsquoest la seacutecurisation du serveur En effet apregraves avoir mis en

ligne notre serveur des pirates ont tregraves vite tenteacute de peacuteneacutetrer le systegraveme

Globalement les attaques eacutetaient de type force brute sur les services heacutebergeacutes sur

notre Raspberry neacutecessitant une identification tels que SSH SMTP hellip

On retrouve ici un petit point faible du protocole SMTP Eacutetant donneacute que

chaque serveur mail doit avoir une adresse postmaster et abuse lrsquoattaquant a agrave sa

disposition deux adresses agrave attaquer Ceci dit ce type drsquoattaque est simple agrave

contrecarrer car il suffit de limiter dans le temps le nombre de tentatives de

connexions

La contre-mesure que nous avons mis en place est simple une seacuterie de

regravegles Iptables En reacutesumeacute nous avons opteacute pour un systegraveme de liste blanche et

noire Les adresses IPs de la liste blanche sont autoriseacutees agrave utiliser la totaliteacute des

services (notamment SSH) tandis que celles de la liste noire sont totalement

ignoreacutees Les autres IPs nrsquoont accegraves qursquoau webmail

Eacutetant donneacute que le nombre drsquoIPs attaquant notre serveur nrsquoa cesseacute

drsquoaugmenter nous avons automatiseacute la mise agrave jour de la liste de noire en

deacuteveloppant un script pour Cron Ce script est exeacutecuteacute une fois par heure A ce jour

notre liste noire contient 47 adresses Bien sucircr ce systegraveme est susceptible drsquoecirctre

modifieacute agrave convenance pour passer sur une solution deacutedieacutee telle que Fail2ban qui fait

en fait ce qursquoon fait deacutejagrave (eacutetudier les logs et bannir des IP avec iptables) avec des

regravegles preacutedeacutefinies par la communauteacute et personnalisables En effet nous nous

attendons agrave voir la varieacuteteacute et le nombre drsquoattaques augmenter apregraves avoir migreacute sur

une IP non proteacutegeacutee par le firewall de lrsquoUniversiteacute puisque nous nrsquoavons plus la

premiegravere ligne de deacutefense du CRI en particulier pour le port 389 (LDAP) qui eacutetait

bloqueacute par lrsquouniversiteacute et srsquoest retrouveacute en premiegravere ligne apregraves la migration Nous

avons donc ajouteacute une regravegle bloquant tout le trafic entrant vers le port 389 hormis

localhost

Package drsquoinstallation

Nous avons creacutee un package deb contenant les sources du webmail ainsi

que des scripts utiles agrave lrsquoinstallation et au fonctionnement du serveur Nous avons

deacuteveloppeacute des scripts de configuration automatique pour LDAP et Postfix Comme

dpkg ne supporte pas directement lrsquoinstallation automatique des deacutependances

nous recommandons drsquoinstaller avant tout le paquet gdebi-core qui est en fait un

dpkg ameacutelioreacute Gracircce agrave la commande gdebi paquetdeb toutes les deacutependances

seront installeacutees en particulier postfix le serveur ldap le serveur web lighttpd entre

autres sans soucis Il est agrave noter que comme les scripts de configuration des

diffeacuterents services ne sont que partiellement impleacutementeacutes dans le paquet deb nous

fournissons en annexe un README complet et illustreacute qui explique pas agrave pas

comment faire fonctionner notre systegraveme sur nrsquoimporte quel Linux en particulier les

lignes de configuration des diffeacuterents services agrave changer et un exemplaire des

fichiers de configuration fonctionnels de ces services

Gestion de lrsquoeacutenergie

Une consideacuteration importante pour un systegraveme autonome Drsquoapregraves les fiches

techniques notre modegravele de Raspberry Pi (B 2) est officiellement eacutevalueacute avec un

fonctionnement agrave ~650mA pour 5V De nombreux proprieacutetaires de ce systegraveme

eacutequipeacutes se sont amuser agrave veacuterifier la consommation eacutelectrique reacuteelle de leur Pi 2 B

sous diffeacuterentes charges On pourra retenir cette eacutetude (lien en sitegraphie) qui

relegraveve la consommation en courant en fonction de lrsquoactiviteacute lanceacutee sur la Pi mais

aussi en charge sur 1 agrave 4 CPU

Ces chiffres sont releveacutes sur un systegraveme avec cameacutera connecteacutee HDMI connecteacute et

cacircble ethernet brancheacute et actif

On peut constater que globalement notre systegraveme Pi 2 B tournant sans

interface graphique sans composant suppleacutementaire sans sortie videacuteo ni cameacutera

avec plusieurs serveurs tournant tout en restant le plus leacuteger possible et demeurant

~99 idle la plupart du temps ne devrait pas deacutepasser une consommation de

300mA grand maximum

Fig 13 Un processeur tregraves tregraves peu chargeacute et une meacutemoire relativement libre

Nous avions lrsquoanneacutee derniegravere deacutejagrave reacutealiseacute un circuit permettant drsquoadapter un

panneau solaire sur une batterie USB classique de 9000mAh Nous avions alors pu

mesurer lrsquointensiteacute deacutelivreacutee par le panneau solaire En cas drsquoensoleillement moyen

habituel dans nos contreacutees le panneau solaire deacutebitait 400mA et pouvait atteindre

le double quand le soleil eacutetait directement preacutesent pour environ 800mA deacutebiteacute

Ce panneau solaire accompagneacute de son circuit drsquoadaptation devrait donc

suffire pour alimenter notre systegraveme la journeacutee le brancher ensuite sur une batterie

portable permet de stocker le surplus pour la nuit

Fig 14 le circuit drsquoadaptation

Fig 15 et son PCB

Eacutevolutions possibles

Webmail

Concernant les eacutevolutions possibles que nous aurions aimeacute apporter agrave notre

projet avec plus de temps commenccedilons par le web Nous aurions souhaiteacute apporter

la gestion de lrsquoenvoi de plusieurs piegraveces jointes comme nous lrsquoavons fait pour la

reacuteception

De plus nous aurions voulu inteacutegrer une corbeille ougrave lesmessages pourraient

aller avant drsquoecirctre deacutefinitivement supprimeacutes du systegraveme drsquoautant que nous avons

deacutejagrave eacutecrites les fonctions PHP permettant de retirer une en-tecircte drsquoun fichier JSON et

le fichier mail associeacute

Enfin nous aurions aimeacute en plus du blocage deacutejagrave preacutesent impleacutementer une

gestion plus profonde des piegravece jointes permettant notamment le remplissage de la

boicircte de spams

Systegraveme

Il aurait eacuteteacute inteacuteressant de notifier lrsquoexpeacutediteur lorsque le mail nrsquoa pas pu ecirctre

deacutelivreacute agrave un utilisateur lorsque son quota est plein En toute logique cela devrait ecirctre

fait simplement avec la commande Sendmail

Une meilleur gestion du trafic mail indeacutesirable aurait eacuteteacute la bienvenue En

effet malgreacute la limitation du spam il restera toujours une partie du volume de mail

qui sera indeacutesirable (pub pishing scam hellip)

Eacutetant donneacute la taille du systegraveme nous avions penseacute agrave une approche

ldquomachine learningrdquo Lrsquoutilisateur indiquerait pourquoi il considegravere le mail comme

indeacutesirable constituant des regravegles refusant certains mails Les mails provenant de

cet expeacutediteur pourraient ecirctre deacutetecteacute par le script agrave la reacuteception et

automatiquement envoyeacutes dans la boicircte de spams

Partie eacutenergeacutetique

Mecircme si la solution au panneau solaire ne pose aucun problegraveme en theacuteorie

nous aurions deacutejagrave dans un premier temps aimeacute lrsquoimpleacutementer en pratique Nous

nrsquoavons finalement pas reacutealiseacute notre objectif de deacutetecter deux cas drsquoalimentation

diffeacuterents soit lrsquoalimentation via panneau solaire est suffisante dans ce cas il

alimente la batterie et donc la Raspberry soit quand ce courant nrsquoest pas suffisant

on alimente la batterie par le secteur

Conclusion

En conclusion nous pensons avoir reacutepondu au cahier des charges initial dans

sa majeure partie Nous sommes aujourdrsquohui en mesure de proposer une solution

mail domestique priveacutee et personnalisable par un particulier

Notre installation de Debian a eacuteteacute au maximum alleacutegeacutee pour notre utilisation

sans interface graphique et nous avons mis en place une reacuteponse aux diverses

attaques que nous avons pu subir lors de lamise en place de notre solution logicielle

En outre le pare-feu avec notre systegraveme de liste noire bloque une partie des

attaques qui peuvent nous parvenir

Nos diffeacuterents scripts de pare-feu de gestion drsquoun mail entrant associeacute au

webmail permettent agrave un utilisateur drsquoacceacuteder aux fonctions usuelles associeacutees agrave

lrsquoenvoi et la reacuteception de mails

Gracircce agrave sa configuration personnalisable notre projet devrait pouvoir ecirctre

porteacute sur un domaine et une adresse IP diffeacuterente sans soucis et ecirctre deacuteployeacute

partout ougrave des gens souhaitent conserver leur vie priveacutee

Nous regretterons cependant de ne pas avoir exploiteacute la partie eacutenergeacutetique

de ce projet qui portait une probleacutematique inteacuteressante et qui nous parait importante

dans le monde actuel

Ce projet nous aura occupeacute pendant tregraves longtemps et nous sommes fiers du

travail que nous avons accompli Il est agrave nos yeux la preuve de ce que nous savons et

pouvons faire et nous donnera confiance pour notre deacutebut de carriegravere drsquoingeacutenieur

Sources

httpwwwradicaticomwpwp-contentuploads201401Email-Statistics-R

eport-2014-2018-Executive-Summarypdf

httpwwwcommentcamarchenetcontents525-le-protocole-ldap

httpsfrwikipediaorgwikiSimple_Mail_Transfer_Protocol

httpwwwcommentcamarchenetcontents536-pop3-smtp-imap-protocol

es-de-messagerie

httpstoolsietforghtmlrfc2821

httpsfrwikipediaorgwikiInternet_Message_Access_Protocol

httpstoolsietforghtmlrfc3501

httparstechnicacominformation-technology201402how-to-run-your-ow

n-e-mail-server-with-your-own-domain-part-1

httpswwwraspberrypiorgforumsviewtopicphpp=136912

httpstackoverflowcomquestions17394356how-can-i-make-a-bash-com

mand-run-periodically

httpuntroubledorgnullmailer

httpelinuxorgRPi_Hardware

httpraspitv2015raspberry-pi2-power-and-performance-measurement

Annexe 1 Architecture du systegraveme de fichiers

Annexe 2 Scan DNSSTUFF

Depuis httpwwwdnsstuffcomtoolsdnsReport|type=domainampampvalue=intimailpw

Annexe 3 Vue geacuteneacuterale httpswwwintimailpw

Annexe 4 Envoyer un mail

Annexe 5 Boite de reacuteception

Annexe 6 Interface drsquoadministration

Annexe 7 Gestion drsquoun utilisateur

Tutorial installation intimailtrade

Table des matiegraveres Apregraves une nouvelle installation de lrsquoOS 2

Seacutecurisation du serveur 2

Changement de lrsquoutilisateur par deacutefaut 2

Changement du port SSH 2

Interdire lrsquoauthentification SSH pour root 2

Installation de LDAP 3

Configuration de base 3

Configuration des Scheacutemas 4

Constitution de la base de donneacutees LDAP 5

Installation de Postfix 7

Installation de Bind9 8

Installation du paquet Debian et configuration de lighttpd 9

Deacutependances 11

Sources 12

2

Apregraves une nouvelle installation de lrsquoOS Exeacutecutez ces commandes pour mettre agrave jour agrave la derniegravere version Ces opeacuterations peuvent prendre un certain

temps Nous avons utiliseacute pour cet exemple Raspbian Jessie Lite sur une Raspberry Pi 2

apt-get update

apt-get upgrade ampamp apt-get dist-upgrade

apt-get install linux-headers-$(uname -r)

reboot

Puis lancer

raspi-config

Etendre au maximum lrsquoespace de stockage en navigant dans les menus

Expand Filesystem

Reacutegler une ip statique avec la box fichier etcnetworkinterfaces

iface eth0 inet static

address 192168131

netmask 2552552550

gateway 19216811

Nous avons aussi supprimeacute wpasupplicant

Seacutecurisation du serveur

Changement de lrsquoutilisateur par deacutefaut Changez le nom drsquoutilisateur par deacutefaut ainsi que son mot de passe

sudo passwd root

Sortie et login en tant que root puis

usermod -l myuname pi

usermod -m -d homemyuname myuname

groupmod ndashn myuname pi

passwd myuname

Voir cette adresse pour lrsquoutilisation de cleacutes priveacuteespubliques

Changement du port SSH sed ndashi sPort 22Port 2222g etcsshsshd_config

Interdire lrsquoauthentification SSH pour root sed -i sPermitRootLogin yesPermitRootLogin nog etcsshsshd_config

3

Installation de LDAP

Configuration de base Installation du package

apt-get install slapd

Choisir un mot de passe administrateur puis lancer la commande

dpkg-reconfigure slapd

Reacutepondre non agrave la question 1

Entrez le nom de domaine utiliseacute agrave la question 2 sous la forme domainetld

Entrez ce que vous voulez au 3egraveme eacutecran le nom de lrsquoorganisation ne sera pas utiliseacute

Entrez un mot de passe

Choisissez HDB

Choisissez si la base de donneacutees est supprimeacutee agrave la deacutesinstallation de slapd

Deacuteplacez lrsquoancienne base de donneacutees

Nrsquoutilisez pas LDAPv2

Installer les outils de conversion pour ldap (slaptest ldapmodify notamment)

apt-get install ldap-utils

On peut maintenant veacuterifier que la configuration est valable

ldapsearch -x -h localhost -b dc=domainedc=tld -LLL dc=domaine dn

Cette commande doit retourner quelque chose comme

dn dc=domainedc=tld

Il faut maintenant seacutecuriser le serveur LDAP en effet on peut y acceacuteder en anonyme avec la commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=config

(amp(objectClass=olcDatabaseConfig)(olcSuffix=dc=domainedc=tld))

Cette commande retourne un certain nombre drsquoinformations notamment agrave propos des champs suivants

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by none

olcAccess 1to dnbase= by read

olcAccess 2to by read

On va modifier ces champs avec la commande ldapmodify Pour cela on va creacuteer un fichier ldif

cat gt changeAccessldif ltlt EOF

dn olcDatabase=1hdbcn=config

changetype modify

delete olcAccess

-

add olcAccess

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by dn=cn=admindc=domainedc=tld write by none

-

add olcAccess

olcAccess 1to dnbase= by read

-

4

add olcAccess

olcAccess 2to by self write by dn=cn=admindc=domainedc=tld write by

none

-

EOF

On peut maintenant appliquer les changements avec ldapmodify

ldapmodify ndashc ndashY EXTERNAL ndashH ldapi -f changeAccessldif

La commande devrait vous confirmer que la modification srsquoest bien effectueacutee

SASLEXTERNAL authentication started

SASL username gidNumber=0+uidNumber=0cn=peercredcn=externalcn=auth

SASL SSF 0

modifying entry olcDatabase=1hdbcn=config

On peut veacuterifier qursquoon ne peut plus acceacuteder aux informations avec la commande

ldapsearch -x -c -h localhost -b dc=domainedc=tld

On peut veacuterifier la configuration en se connectant en tant qursquoadministrateur

ldapsearch -c -h localhost -b dc=domainedc=tld -D

cn=admindc=domainedc=tld ndashW

Configuration des Scheacutemas Nous allons utiliser les scheacutemas de courier-ldap Pour eacuteviter une manipulation compliqueacutee vous trouverez

directement le scheacutema avec le fichier authldapschema On place ce fichier dans le dossier

mv authldapschema etcldapschema

Nous creacuteons un fichier qui incluera tous les scheacutemas de base en plus du nouveau On peut les afficher avec la

commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

Creacuteation du fichier de configuration pour notre exemple cela donne

mkdir tmpldapconf

cat gt tmpldapconfldapconf ltlt EOF

include etcldapschemacoreschema

include etcldapschemacosineschema

include etcldapschemanisschema

include etcldapschemainetorgpersonschema

include etcldapschemaauthldapschema

EOF

On lance ensuite la commande

slaptest -f tmpldapconfldapconf -F tmpldapconf

Elle revoie un message de succegraves Cette commande a creacuteeacute dans le reacutepertoire tmpldapconf une arborescence

correspondant agrave la configuration de notre LDAP

On modifie le chemin de configuration

5

sed ndashi 0dnauthldap sauthldapauthldapcn=schemacn=config

cn=authldapldif

On supprime ensuite les 7 derniegraveres lignes du fichier

head -n -7 cn=authldapldif gt tmpldif

mv tmpldif cn=authldapldif

On peut maintenant importer notre fichier de configuration Pour ce faire

ldapadd -Y EXTERNAL -H ldapi -f

tmpldapconfcn=configcn=schemacn=authldapldif

Si tout va bien lrsquoentreacutee devrait avoir eacuteteacute ajouteacutee On peut veacuterifier avec la commande vue tout agrave lrsquoheure

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

On devrait voir en plus le nouveau scheacutema authldap

Constitution de la base de donneacutees LDAP Le remplissage de la base se fait agrave lrsquoaide de fichiers ldif Nous donnons ici un exemple de structure

Fichier pour la structure de base

dn dc=maildc=domainedc=tld

o intimailpw

description Global mail tree

dc mail

objectClass top

objectClass dcObject

objectClass organization

dn dc=peopledc=maildc=domainedc=tld

description Informations of all users

o people

dc people

objectClass top

objectClass dcObject

objectClass organization

dn dc=groupsdc=maildc=domainedc=tld

description All groups of users

o groups

dc groups

objectClass top

objectClass dcObject

objectClass organization

6

Fichier pour ajouter un utilisateur

dn cn=jbonddc=peopledc=maildc=domainedc=tld

uid jbond

mail jbonddomainetld

sn Moulin

givenName James

displayName James Bond

mailbox domainetldjbond

quota 50M

homeDirectory homevmail

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAccount

userPassword SSHA367PSXiUAegy8dpJbPU8OepEf8L5ye

Pour obtenir un hash du mot de passe

slappasswd -s password -h SSHA

On peut par la suite ajouter la configuration agrave la base de donneacutees avec la commande

ldapadd -D cn=admindc=domainedc=tld -W -h localhost -f pathtofile

Si les champs proposeacutes ne sont pas suffisants il faudra alors effectuer les modifications dans le fichier autldapschema

proposeacute plus haut et refaire la manipulation de configuration

De plus les standards du Mail deacutecrit par lrsquoIETF (RFC822 63 RFC1123 527 and RFC2821 451) impliquent drsquoavoir une

adresse Postmaster et une Abuse Pour cela nous pourrions creacuteer ces adresses avec la meacutethode vue au-dessus mais

ce nrsquoest pas la meilleure Il est preacutefeacuterable drsquoutiliser un alias comme nous le ferons avec les listes de diffusion Ici nous

proposons de rediriger ces deux adresses vers une adresse administrateur Pour cela la meacutethode est la mecircme sauf

que le fichier ldif nrsquoest pas tout agrave fait identique En voici un exemple

dn cn=postmasterdc=groupsdc=maildc=domainedc=tld

uid postmaster

mail postmasterdomainetld

sn Postmaster

displayName Postmaster

maildrop admindomainetld

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAlias

Pour faire une liste de diffusion la meacutethode est la mecircme Il suffit drsquoajouter toutes les adresses destinataires dans le

champ maildrop seacutepareacutees par des virgules ()

7

Installation de Postfix Installation des packages

apt-get install postfix postfix-ldap

Lors de lrsquoinstallation deux eacutecrans deacutefilent

- Configuration Internet Site

- Valeur par deacutefaut pour le mail name

On creacutee lrsquoutilisateur qui servira agrave exeacutecuter Postfix

groupadd vmail

useradd -g vmail -d homevmail -s binfalse -m vmail

Nous aurons besoin dans la suite des GID et UID creacuteeacutes agrave cet instant Ils peuvent ecirctre afficheacutes avec les commandes

cat etcgroup | grep vmail | cut -d -f3

cat etcpasswd | grep vmail | cut -d -f3

On ajoute les paramegravetres au fichier etcpostfixmaincf (remplacer les valeurs de GID et drsquoUID avec vos valeurs)

smtpd_banner = maildomainetld

virtual_mailbox_base = homevmail

virtual_mailbox_domains = dmainetld

virtual_mailbox_maps = ldapetcpostfixldap_accountscf

virtual_alias_maps = ldapetcpostfixldap_aliasescf

virtual_minimum_uid = 100

virtual_gid_maps = static1001 Remplacez ici par votre valeur de GID

virtual_uid_maps = static1001 Remplacez ici par votre valeur drsquoUID

Il nous faut maintenant constituer nos fichiers de configuration ldap_accountscf

cat gt etcpostfixldap_accountscf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=peopledc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAccount)(mail=s))

result_attribute = mailbox

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

Et pour ldap_aliasescf

cat gt ldap_aliasescf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=groupsdc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAlias)(mail=s))

result_attribute = maildrop

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

8

On peut maintenant veacuterifier la configuration de Postfix avec (cette commande ne doit rien retourner si crsquoest bon)

postfix check

Si crsquoest bon alors on recharge le serveur

postfix reload

On peut alors faire un envoi de mail test via telnet

telnet localhost 25

Si vous souhaitez deacutelivrer les mails agrave votre maniegravere il faut dans le fichier etcpostfixmaincf la ligne

virtual_transport = nomdevotreregle

Et de mecircme dans le fichier etcpostfixmastercf

nomdevotreregle unix - n n - 5 pipe

flags=Rq user=vmail null_sender=

argv=chemindevotreprogramme

Il nous reste maintenant agrave configurer les diffeacuterents enregistrements DNS neacutecessaire au fonctionnement drsquoun serveur

mail Vous pouvez utiliser la solution de votre choix Dans la suite vous trouverez une meacutethode utilisant Bind9

Installation de Bind9 Dans toute cette partie on se situera dans le dossier etcbind Dans la suite notre IP sera abcd

Dans le fichier namedconfoptions on ajoutera dans le champ options

version Not supported

Dans un dossier zones on eacutecrit le fichier dbdomainetld

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122111 Serial

43200 Refresh

3600 Retry

2419200 Expire

86400 ) Negative Cache TTL

IN NS nsdomainetld

IN NS ns11ovhnet

ns IN A abcd

www IN A abcd

IN A abcd

IN MX 10 maildomainetld

mail IN A abcd

Dans le mecircme dossier zones on a cbain-addrarpa

9

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122101 serial

14400 refresh

3600 retry

604800 expire

10800 minimum

)

cbain-addrarpa IN NS nsdomainetld

cbain-addrarpa IN NS ns11ovhnet

d IN PTR maildomainetld

Il faut faire attention agrave bien increacutementer le serial pour chaque modification des fichiers

Dans le fichier namedconflocal

zone domainetld

type master

file etcbindzonesdbdomainetld

allow-transfer 213251128130

notify yes

zone cbain-addrarpa IN

type master

file etcbindzonescbain-addrarpa

allow-transfer 213251128130

Ici 213251128130 est lrsquoadresse IP du serveur ns11ovhnet

Il faut bien sucircr configurer le DNS avec votre fournisseur (Gandi OVH hellip) Pour ccedila amusez-vous bien Vous pouvez

aussi tester votre configuration avec des outils en ligne tels que DNSstuff

En test final si votre configuration est bonne vous devriez pouvoir envoyer un mail depuis un service neutre (Gmail

yahoo hellip) et le voir dans votre arborescence (ici homevmaildomainetld)

Installation du paquet Debian et configuration de lighttpd

Commencez par reacutecupeacuterer le paquet deb agrave lrsquoadresse suivante httpswwwintimailpwintimaildeb

Installez ensuite GDebi Il srsquoagit drsquoun dpkg ameacutelioreacute pour teacuteleacutecharger les deacutependances automatiquement ce que

dpkg ne gegravere pas

apt-get update

apt-get install gdebi-core

10

Vous pouvez alors installer le paquet

gdebi intimaildeb

Vous aurez alors le site web drsquointiMail deacuteployeacute au chemin varwwwwebmail

Il ne vous reste plus qursquoagrave changer la configuration de lighttpd votre serveur web pour mettre en ligne le site

Vous pouvez pour cela copier-coller la configuration suivante mais veillez agrave bien changer lrsquoadresse IP preacutesente au

deacutebut de la partie SSL CONFIG avec votre adresse IP

serv ermodules = ( mod_access

mod_accesslog

mod_alias

mod_compress

mod_redirect

mod_rewrite

)

Hide server version

servertag = Such Headers Very try Now close telnet

serverdocument-root = varwwwwebmail

serverupload-dirs = ( varwwwwebmailuploads )

servererrorlog = varloglighttpderrorlog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

serverport = 80

accesslogformat = V h l u t r gts b Refereri

User-Agenti

accesslogfilename = varloglighttpdaccesslog

index-filenames = ( indexphp indexhtml

indexlighttpdhtml )

urlaccess-deny = ( ~ inc )

static-fileexclude-extensions = ( php pl fcgi )

compresscache-dir = varcachelighttpdcompress

compressfiletype = ( applicationjavascript textcss

texthtml textplain )

default listening port for IPv6 falls back to the IPv4 port

include_shell usrsharelighttpduse-ipv6pl + serverport

include_shell usrsharelighttpdcreate-mimeassignpl

include_shell usrsharelighttpdinclude-conf-enabledpl

SSL CONFIG

$SERVER[socket] == 5234485443

sslengine = enable

11

sslpemfile = etclighttpdsslintimailpwpem

sslca-file = etclighttpdsslintimailpwcrt

servername = intimailpw

votre configuration habituelle pour ce domaine

serverdocument-root = varwwwwebmail

servererrorlog = varloglighttpderror_ssllog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

Rewrite des URL pour masquer php

urlrewrite-once = ( ^()$ =gt $1 )

urlrewrite-if-not-file = ( ^([^])()$ =gt $1php$2 )

servernetwork-backend = writev

Deacutependances Slapd

Ldap-utils

Postfix

Postfix-ldap

Bind9

Lighttpd

12

Sources httpswikigandinetfrhostingusing-linuxtutorialsdebianmail-server-ldap

httpwwwpostfixorgpipe8html

httpwwwpostfixorgFILTER_READMEhtml

httpwwwpostfixorg

httpwwwpostfixorgtransport5html

Page 18: Système d'hébergement domestique...place sur les domaines .pw par Gandi.net, notre fournisseur. Nous n’avons donc pas pu l’implémenter. Nous avons configuré Postfix pour qu’il

Pour adapter ces fonctionnaliteacutes agrave notre systegraveme nous avons donc constitueacute

une architecture pour organiser les fichiers qui transitent Vous pourrez voir un

scheacutema reacutecapitulatif en annexe 1

Dans la premiegravere moitieacute du projet les mails eacutetaient deacutelivreacutes par Postfix Nous

utilisions un script exeacutecuteacute lors de la reacuteception drsquounmail pour les traiter de lamaniegravere

que nous voulions Cette meacutethode avait les inconveacutenients drsquoecirctre lourde et pas

efficace agrave 100 En effet seuls les mails reccedilus depuis lrsquoexteacuterieur eacutetaient

correctement traiteacutes

Deacutesormais les mails sont traiteacutes totalement par notre script Cela nous

permet de geacuterer les mails dans des dossiers organiseacutes agrave notre maniegravere et de

recevoir les mails locaux crsquoest-agrave-dire entre utilisateurs du mecircme domaine Cette

nouvelle meacutethode regravegle aussi drsquoautres problegravemes notamment au niveau des

permissions sur les fichiers

Pour reacuteduire le nombre drsquoopeacuterations et pour profiter des fonctionnaliteacutes

offertes par le framework utiliseacute pour lrsquointerface web nous regroupons des

informations sur chacun des mails reccedilus sous la forme de fichiers JSON Pour ce

faire lrsquoideacutee est drsquoexeacutecuter un script lorsque leacutevegravenement ldquoreacuteception drsquoun mailrdquo

survient Postfix offre cette possibiliteacute dans sa configuration Or il se trouve qursquoil nrsquoest

pas si simple de reacutecupeacuterer le chemin du fichier contenant le mail car le nom du

fichier creacutee est sous la forme Timestamp UNIX10 Caractegraveres aleacuteatoires (ex

14562336185A8D43E97F)

La seconde probleacutematique est que le webmail doit avoir la possibiliteacute de

pouvoir lire les fichiers pour afficher les mails sur son interface Or il semble que

Postfix les eacutecrit en autorisant uniquement son utilisateur en lecture Il nous a fallu

trouver une solution pour remeacutedier agrave cela Nous avons choisi drsquoajouter www-data

(utilisateur du serveur web) au groupe vmail et de modifier les droits sur les fichiers

de sorte que les utilisateurs de ce groupe puissent lire les fichiers

Nous avons revu une partie de lrsquoorganisation des fichiers pour reacutecupeacuterer les

piegraveces jointes si elles sont preacutesentes Le script que nous avons eacutecrit reacutecupegravere le

fichier original du mail et le deacutecoupe en eacuteleacutements simples dans des fichier distincts

corps du mail et diffeacuterentes piegraveces jointes De cette maniegravere pour afficher un mail

nous nrsquoavons pas besoin de charger la totaliteacute du fichier Dans le cas ougrave il y a des

piegraveces jointes cela aurait ralenti lrsquoaffichage des informations

Nous avons eacutegalement impleacutementeacute la gestion des quotas Dans lrsquoeacutetat actuel

des choses srsquoil nrsquoy a plus de place disponible pour lrsquoutilisateur le mail nrsquoest tout

bonnement pas deacutelivreacute agrave ce destinataire Lrsquoideacuteal aurait eacuteteacute de notifier leacutemetteur avec

un mail ce qui nrsquoest pour lrsquoinstant pas le cas mais qui pourrait ecirctre reacutesolu en

renvoyant agrave postfix un code drsquoerreur deacutefini

Pour terminer nous avons revu la totaliteacute du code deacuteveloppeacute Nous sommes

passeacute du Bash au Perl Ce dernier est plus performant et plus simple agrave utiliser et agrave

lire

Firewall

Un autre gros morceau du projet mais qui nrsquoest pas speacutecifiquement lieacute agrave la

probleacutematique du mail crsquoest la seacutecurisation du serveur En effet apregraves avoir mis en

ligne notre serveur des pirates ont tregraves vite tenteacute de peacuteneacutetrer le systegraveme

Globalement les attaques eacutetaient de type force brute sur les services heacutebergeacutes sur

notre Raspberry neacutecessitant une identification tels que SSH SMTP hellip

On retrouve ici un petit point faible du protocole SMTP Eacutetant donneacute que

chaque serveur mail doit avoir une adresse postmaster et abuse lrsquoattaquant a agrave sa

disposition deux adresses agrave attaquer Ceci dit ce type drsquoattaque est simple agrave

contrecarrer car il suffit de limiter dans le temps le nombre de tentatives de

connexions

La contre-mesure que nous avons mis en place est simple une seacuterie de

regravegles Iptables En reacutesumeacute nous avons opteacute pour un systegraveme de liste blanche et

noire Les adresses IPs de la liste blanche sont autoriseacutees agrave utiliser la totaliteacute des

services (notamment SSH) tandis que celles de la liste noire sont totalement

ignoreacutees Les autres IPs nrsquoont accegraves qursquoau webmail

Eacutetant donneacute que le nombre drsquoIPs attaquant notre serveur nrsquoa cesseacute

drsquoaugmenter nous avons automatiseacute la mise agrave jour de la liste de noire en

deacuteveloppant un script pour Cron Ce script est exeacutecuteacute une fois par heure A ce jour

notre liste noire contient 47 adresses Bien sucircr ce systegraveme est susceptible drsquoecirctre

modifieacute agrave convenance pour passer sur une solution deacutedieacutee telle que Fail2ban qui fait

en fait ce qursquoon fait deacutejagrave (eacutetudier les logs et bannir des IP avec iptables) avec des

regravegles preacutedeacutefinies par la communauteacute et personnalisables En effet nous nous

attendons agrave voir la varieacuteteacute et le nombre drsquoattaques augmenter apregraves avoir migreacute sur

une IP non proteacutegeacutee par le firewall de lrsquoUniversiteacute puisque nous nrsquoavons plus la

premiegravere ligne de deacutefense du CRI en particulier pour le port 389 (LDAP) qui eacutetait

bloqueacute par lrsquouniversiteacute et srsquoest retrouveacute en premiegravere ligne apregraves la migration Nous

avons donc ajouteacute une regravegle bloquant tout le trafic entrant vers le port 389 hormis

localhost

Package drsquoinstallation

Nous avons creacutee un package deb contenant les sources du webmail ainsi

que des scripts utiles agrave lrsquoinstallation et au fonctionnement du serveur Nous avons

deacuteveloppeacute des scripts de configuration automatique pour LDAP et Postfix Comme

dpkg ne supporte pas directement lrsquoinstallation automatique des deacutependances

nous recommandons drsquoinstaller avant tout le paquet gdebi-core qui est en fait un

dpkg ameacutelioreacute Gracircce agrave la commande gdebi paquetdeb toutes les deacutependances

seront installeacutees en particulier postfix le serveur ldap le serveur web lighttpd entre

autres sans soucis Il est agrave noter que comme les scripts de configuration des

diffeacuterents services ne sont que partiellement impleacutementeacutes dans le paquet deb nous

fournissons en annexe un README complet et illustreacute qui explique pas agrave pas

comment faire fonctionner notre systegraveme sur nrsquoimporte quel Linux en particulier les

lignes de configuration des diffeacuterents services agrave changer et un exemplaire des

fichiers de configuration fonctionnels de ces services

Gestion de lrsquoeacutenergie

Une consideacuteration importante pour un systegraveme autonome Drsquoapregraves les fiches

techniques notre modegravele de Raspberry Pi (B 2) est officiellement eacutevalueacute avec un

fonctionnement agrave ~650mA pour 5V De nombreux proprieacutetaires de ce systegraveme

eacutequipeacutes se sont amuser agrave veacuterifier la consommation eacutelectrique reacuteelle de leur Pi 2 B

sous diffeacuterentes charges On pourra retenir cette eacutetude (lien en sitegraphie) qui

relegraveve la consommation en courant en fonction de lrsquoactiviteacute lanceacutee sur la Pi mais

aussi en charge sur 1 agrave 4 CPU

Ces chiffres sont releveacutes sur un systegraveme avec cameacutera connecteacutee HDMI connecteacute et

cacircble ethernet brancheacute et actif

On peut constater que globalement notre systegraveme Pi 2 B tournant sans

interface graphique sans composant suppleacutementaire sans sortie videacuteo ni cameacutera

avec plusieurs serveurs tournant tout en restant le plus leacuteger possible et demeurant

~99 idle la plupart du temps ne devrait pas deacutepasser une consommation de

300mA grand maximum

Fig 13 Un processeur tregraves tregraves peu chargeacute et une meacutemoire relativement libre

Nous avions lrsquoanneacutee derniegravere deacutejagrave reacutealiseacute un circuit permettant drsquoadapter un

panneau solaire sur une batterie USB classique de 9000mAh Nous avions alors pu

mesurer lrsquointensiteacute deacutelivreacutee par le panneau solaire En cas drsquoensoleillement moyen

habituel dans nos contreacutees le panneau solaire deacutebitait 400mA et pouvait atteindre

le double quand le soleil eacutetait directement preacutesent pour environ 800mA deacutebiteacute

Ce panneau solaire accompagneacute de son circuit drsquoadaptation devrait donc

suffire pour alimenter notre systegraveme la journeacutee le brancher ensuite sur une batterie

portable permet de stocker le surplus pour la nuit

Fig 14 le circuit drsquoadaptation

Fig 15 et son PCB

Eacutevolutions possibles

Webmail

Concernant les eacutevolutions possibles que nous aurions aimeacute apporter agrave notre

projet avec plus de temps commenccedilons par le web Nous aurions souhaiteacute apporter

la gestion de lrsquoenvoi de plusieurs piegraveces jointes comme nous lrsquoavons fait pour la

reacuteception

De plus nous aurions voulu inteacutegrer une corbeille ougrave lesmessages pourraient

aller avant drsquoecirctre deacutefinitivement supprimeacutes du systegraveme drsquoautant que nous avons

deacutejagrave eacutecrites les fonctions PHP permettant de retirer une en-tecircte drsquoun fichier JSON et

le fichier mail associeacute

Enfin nous aurions aimeacute en plus du blocage deacutejagrave preacutesent impleacutementer une

gestion plus profonde des piegravece jointes permettant notamment le remplissage de la

boicircte de spams

Systegraveme

Il aurait eacuteteacute inteacuteressant de notifier lrsquoexpeacutediteur lorsque le mail nrsquoa pas pu ecirctre

deacutelivreacute agrave un utilisateur lorsque son quota est plein En toute logique cela devrait ecirctre

fait simplement avec la commande Sendmail

Une meilleur gestion du trafic mail indeacutesirable aurait eacuteteacute la bienvenue En

effet malgreacute la limitation du spam il restera toujours une partie du volume de mail

qui sera indeacutesirable (pub pishing scam hellip)

Eacutetant donneacute la taille du systegraveme nous avions penseacute agrave une approche

ldquomachine learningrdquo Lrsquoutilisateur indiquerait pourquoi il considegravere le mail comme

indeacutesirable constituant des regravegles refusant certains mails Les mails provenant de

cet expeacutediteur pourraient ecirctre deacutetecteacute par le script agrave la reacuteception et

automatiquement envoyeacutes dans la boicircte de spams

Partie eacutenergeacutetique

Mecircme si la solution au panneau solaire ne pose aucun problegraveme en theacuteorie

nous aurions deacutejagrave dans un premier temps aimeacute lrsquoimpleacutementer en pratique Nous

nrsquoavons finalement pas reacutealiseacute notre objectif de deacutetecter deux cas drsquoalimentation

diffeacuterents soit lrsquoalimentation via panneau solaire est suffisante dans ce cas il

alimente la batterie et donc la Raspberry soit quand ce courant nrsquoest pas suffisant

on alimente la batterie par le secteur

Conclusion

En conclusion nous pensons avoir reacutepondu au cahier des charges initial dans

sa majeure partie Nous sommes aujourdrsquohui en mesure de proposer une solution

mail domestique priveacutee et personnalisable par un particulier

Notre installation de Debian a eacuteteacute au maximum alleacutegeacutee pour notre utilisation

sans interface graphique et nous avons mis en place une reacuteponse aux diverses

attaques que nous avons pu subir lors de lamise en place de notre solution logicielle

En outre le pare-feu avec notre systegraveme de liste noire bloque une partie des

attaques qui peuvent nous parvenir

Nos diffeacuterents scripts de pare-feu de gestion drsquoun mail entrant associeacute au

webmail permettent agrave un utilisateur drsquoacceacuteder aux fonctions usuelles associeacutees agrave

lrsquoenvoi et la reacuteception de mails

Gracircce agrave sa configuration personnalisable notre projet devrait pouvoir ecirctre

porteacute sur un domaine et une adresse IP diffeacuterente sans soucis et ecirctre deacuteployeacute

partout ougrave des gens souhaitent conserver leur vie priveacutee

Nous regretterons cependant de ne pas avoir exploiteacute la partie eacutenergeacutetique

de ce projet qui portait une probleacutematique inteacuteressante et qui nous parait importante

dans le monde actuel

Ce projet nous aura occupeacute pendant tregraves longtemps et nous sommes fiers du

travail que nous avons accompli Il est agrave nos yeux la preuve de ce que nous savons et

pouvons faire et nous donnera confiance pour notre deacutebut de carriegravere drsquoingeacutenieur

Sources

httpwwwradicaticomwpwp-contentuploads201401Email-Statistics-R

eport-2014-2018-Executive-Summarypdf

httpwwwcommentcamarchenetcontents525-le-protocole-ldap

httpsfrwikipediaorgwikiSimple_Mail_Transfer_Protocol

httpwwwcommentcamarchenetcontents536-pop3-smtp-imap-protocol

es-de-messagerie

httpstoolsietforghtmlrfc2821

httpsfrwikipediaorgwikiInternet_Message_Access_Protocol

httpstoolsietforghtmlrfc3501

httparstechnicacominformation-technology201402how-to-run-your-ow

n-e-mail-server-with-your-own-domain-part-1

httpswwwraspberrypiorgforumsviewtopicphpp=136912

httpstackoverflowcomquestions17394356how-can-i-make-a-bash-com

mand-run-periodically

httpuntroubledorgnullmailer

httpelinuxorgRPi_Hardware

httpraspitv2015raspberry-pi2-power-and-performance-measurement

Annexe 1 Architecture du systegraveme de fichiers

Annexe 2 Scan DNSSTUFF

Depuis httpwwwdnsstuffcomtoolsdnsReport|type=domainampampvalue=intimailpw

Annexe 3 Vue geacuteneacuterale httpswwwintimailpw

Annexe 4 Envoyer un mail

Annexe 5 Boite de reacuteception

Annexe 6 Interface drsquoadministration

Annexe 7 Gestion drsquoun utilisateur

Tutorial installation intimailtrade

Table des matiegraveres Apregraves une nouvelle installation de lrsquoOS 2

Seacutecurisation du serveur 2

Changement de lrsquoutilisateur par deacutefaut 2

Changement du port SSH 2

Interdire lrsquoauthentification SSH pour root 2

Installation de LDAP 3

Configuration de base 3

Configuration des Scheacutemas 4

Constitution de la base de donneacutees LDAP 5

Installation de Postfix 7

Installation de Bind9 8

Installation du paquet Debian et configuration de lighttpd 9

Deacutependances 11

Sources 12

2

Apregraves une nouvelle installation de lrsquoOS Exeacutecutez ces commandes pour mettre agrave jour agrave la derniegravere version Ces opeacuterations peuvent prendre un certain

temps Nous avons utiliseacute pour cet exemple Raspbian Jessie Lite sur une Raspberry Pi 2

apt-get update

apt-get upgrade ampamp apt-get dist-upgrade

apt-get install linux-headers-$(uname -r)

reboot

Puis lancer

raspi-config

Etendre au maximum lrsquoespace de stockage en navigant dans les menus

Expand Filesystem

Reacutegler une ip statique avec la box fichier etcnetworkinterfaces

iface eth0 inet static

address 192168131

netmask 2552552550

gateway 19216811

Nous avons aussi supprimeacute wpasupplicant

Seacutecurisation du serveur

Changement de lrsquoutilisateur par deacutefaut Changez le nom drsquoutilisateur par deacutefaut ainsi que son mot de passe

sudo passwd root

Sortie et login en tant que root puis

usermod -l myuname pi

usermod -m -d homemyuname myuname

groupmod ndashn myuname pi

passwd myuname

Voir cette adresse pour lrsquoutilisation de cleacutes priveacuteespubliques

Changement du port SSH sed ndashi sPort 22Port 2222g etcsshsshd_config

Interdire lrsquoauthentification SSH pour root sed -i sPermitRootLogin yesPermitRootLogin nog etcsshsshd_config

3

Installation de LDAP

Configuration de base Installation du package

apt-get install slapd

Choisir un mot de passe administrateur puis lancer la commande

dpkg-reconfigure slapd

Reacutepondre non agrave la question 1

Entrez le nom de domaine utiliseacute agrave la question 2 sous la forme domainetld

Entrez ce que vous voulez au 3egraveme eacutecran le nom de lrsquoorganisation ne sera pas utiliseacute

Entrez un mot de passe

Choisissez HDB

Choisissez si la base de donneacutees est supprimeacutee agrave la deacutesinstallation de slapd

Deacuteplacez lrsquoancienne base de donneacutees

Nrsquoutilisez pas LDAPv2

Installer les outils de conversion pour ldap (slaptest ldapmodify notamment)

apt-get install ldap-utils

On peut maintenant veacuterifier que la configuration est valable

ldapsearch -x -h localhost -b dc=domainedc=tld -LLL dc=domaine dn

Cette commande doit retourner quelque chose comme

dn dc=domainedc=tld

Il faut maintenant seacutecuriser le serveur LDAP en effet on peut y acceacuteder en anonyme avec la commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=config

(amp(objectClass=olcDatabaseConfig)(olcSuffix=dc=domainedc=tld))

Cette commande retourne un certain nombre drsquoinformations notamment agrave propos des champs suivants

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by none

olcAccess 1to dnbase= by read

olcAccess 2to by read

On va modifier ces champs avec la commande ldapmodify Pour cela on va creacuteer un fichier ldif

cat gt changeAccessldif ltlt EOF

dn olcDatabase=1hdbcn=config

changetype modify

delete olcAccess

-

add olcAccess

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by dn=cn=admindc=domainedc=tld write by none

-

add olcAccess

olcAccess 1to dnbase= by read

-

4

add olcAccess

olcAccess 2to by self write by dn=cn=admindc=domainedc=tld write by

none

-

EOF

On peut maintenant appliquer les changements avec ldapmodify

ldapmodify ndashc ndashY EXTERNAL ndashH ldapi -f changeAccessldif

La commande devrait vous confirmer que la modification srsquoest bien effectueacutee

SASLEXTERNAL authentication started

SASL username gidNumber=0+uidNumber=0cn=peercredcn=externalcn=auth

SASL SSF 0

modifying entry olcDatabase=1hdbcn=config

On peut veacuterifier qursquoon ne peut plus acceacuteder aux informations avec la commande

ldapsearch -x -c -h localhost -b dc=domainedc=tld

On peut veacuterifier la configuration en se connectant en tant qursquoadministrateur

ldapsearch -c -h localhost -b dc=domainedc=tld -D

cn=admindc=domainedc=tld ndashW

Configuration des Scheacutemas Nous allons utiliser les scheacutemas de courier-ldap Pour eacuteviter une manipulation compliqueacutee vous trouverez

directement le scheacutema avec le fichier authldapschema On place ce fichier dans le dossier

mv authldapschema etcldapschema

Nous creacuteons un fichier qui incluera tous les scheacutemas de base en plus du nouveau On peut les afficher avec la

commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

Creacuteation du fichier de configuration pour notre exemple cela donne

mkdir tmpldapconf

cat gt tmpldapconfldapconf ltlt EOF

include etcldapschemacoreschema

include etcldapschemacosineschema

include etcldapschemanisschema

include etcldapschemainetorgpersonschema

include etcldapschemaauthldapschema

EOF

On lance ensuite la commande

slaptest -f tmpldapconfldapconf -F tmpldapconf

Elle revoie un message de succegraves Cette commande a creacuteeacute dans le reacutepertoire tmpldapconf une arborescence

correspondant agrave la configuration de notre LDAP

On modifie le chemin de configuration

5

sed ndashi 0dnauthldap sauthldapauthldapcn=schemacn=config

cn=authldapldif

On supprime ensuite les 7 derniegraveres lignes du fichier

head -n -7 cn=authldapldif gt tmpldif

mv tmpldif cn=authldapldif

On peut maintenant importer notre fichier de configuration Pour ce faire

ldapadd -Y EXTERNAL -H ldapi -f

tmpldapconfcn=configcn=schemacn=authldapldif

Si tout va bien lrsquoentreacutee devrait avoir eacuteteacute ajouteacutee On peut veacuterifier avec la commande vue tout agrave lrsquoheure

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

On devrait voir en plus le nouveau scheacutema authldap

Constitution de la base de donneacutees LDAP Le remplissage de la base se fait agrave lrsquoaide de fichiers ldif Nous donnons ici un exemple de structure

Fichier pour la structure de base

dn dc=maildc=domainedc=tld

o intimailpw

description Global mail tree

dc mail

objectClass top

objectClass dcObject

objectClass organization

dn dc=peopledc=maildc=domainedc=tld

description Informations of all users

o people

dc people

objectClass top

objectClass dcObject

objectClass organization

dn dc=groupsdc=maildc=domainedc=tld

description All groups of users

o groups

dc groups

objectClass top

objectClass dcObject

objectClass organization

6

Fichier pour ajouter un utilisateur

dn cn=jbonddc=peopledc=maildc=domainedc=tld

uid jbond

mail jbonddomainetld

sn Moulin

givenName James

displayName James Bond

mailbox domainetldjbond

quota 50M

homeDirectory homevmail

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAccount

userPassword SSHA367PSXiUAegy8dpJbPU8OepEf8L5ye

Pour obtenir un hash du mot de passe

slappasswd -s password -h SSHA

On peut par la suite ajouter la configuration agrave la base de donneacutees avec la commande

ldapadd -D cn=admindc=domainedc=tld -W -h localhost -f pathtofile

Si les champs proposeacutes ne sont pas suffisants il faudra alors effectuer les modifications dans le fichier autldapschema

proposeacute plus haut et refaire la manipulation de configuration

De plus les standards du Mail deacutecrit par lrsquoIETF (RFC822 63 RFC1123 527 and RFC2821 451) impliquent drsquoavoir une

adresse Postmaster et une Abuse Pour cela nous pourrions creacuteer ces adresses avec la meacutethode vue au-dessus mais

ce nrsquoest pas la meilleure Il est preacutefeacuterable drsquoutiliser un alias comme nous le ferons avec les listes de diffusion Ici nous

proposons de rediriger ces deux adresses vers une adresse administrateur Pour cela la meacutethode est la mecircme sauf

que le fichier ldif nrsquoest pas tout agrave fait identique En voici un exemple

dn cn=postmasterdc=groupsdc=maildc=domainedc=tld

uid postmaster

mail postmasterdomainetld

sn Postmaster

displayName Postmaster

maildrop admindomainetld

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAlias

Pour faire une liste de diffusion la meacutethode est la mecircme Il suffit drsquoajouter toutes les adresses destinataires dans le

champ maildrop seacutepareacutees par des virgules ()

7

Installation de Postfix Installation des packages

apt-get install postfix postfix-ldap

Lors de lrsquoinstallation deux eacutecrans deacutefilent

- Configuration Internet Site

- Valeur par deacutefaut pour le mail name

On creacutee lrsquoutilisateur qui servira agrave exeacutecuter Postfix

groupadd vmail

useradd -g vmail -d homevmail -s binfalse -m vmail

Nous aurons besoin dans la suite des GID et UID creacuteeacutes agrave cet instant Ils peuvent ecirctre afficheacutes avec les commandes

cat etcgroup | grep vmail | cut -d -f3

cat etcpasswd | grep vmail | cut -d -f3

On ajoute les paramegravetres au fichier etcpostfixmaincf (remplacer les valeurs de GID et drsquoUID avec vos valeurs)

smtpd_banner = maildomainetld

virtual_mailbox_base = homevmail

virtual_mailbox_domains = dmainetld

virtual_mailbox_maps = ldapetcpostfixldap_accountscf

virtual_alias_maps = ldapetcpostfixldap_aliasescf

virtual_minimum_uid = 100

virtual_gid_maps = static1001 Remplacez ici par votre valeur de GID

virtual_uid_maps = static1001 Remplacez ici par votre valeur drsquoUID

Il nous faut maintenant constituer nos fichiers de configuration ldap_accountscf

cat gt etcpostfixldap_accountscf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=peopledc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAccount)(mail=s))

result_attribute = mailbox

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

Et pour ldap_aliasescf

cat gt ldap_aliasescf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=groupsdc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAlias)(mail=s))

result_attribute = maildrop

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

8

On peut maintenant veacuterifier la configuration de Postfix avec (cette commande ne doit rien retourner si crsquoest bon)

postfix check

Si crsquoest bon alors on recharge le serveur

postfix reload

On peut alors faire un envoi de mail test via telnet

telnet localhost 25

Si vous souhaitez deacutelivrer les mails agrave votre maniegravere il faut dans le fichier etcpostfixmaincf la ligne

virtual_transport = nomdevotreregle

Et de mecircme dans le fichier etcpostfixmastercf

nomdevotreregle unix - n n - 5 pipe

flags=Rq user=vmail null_sender=

argv=chemindevotreprogramme

Il nous reste maintenant agrave configurer les diffeacuterents enregistrements DNS neacutecessaire au fonctionnement drsquoun serveur

mail Vous pouvez utiliser la solution de votre choix Dans la suite vous trouverez une meacutethode utilisant Bind9

Installation de Bind9 Dans toute cette partie on se situera dans le dossier etcbind Dans la suite notre IP sera abcd

Dans le fichier namedconfoptions on ajoutera dans le champ options

version Not supported

Dans un dossier zones on eacutecrit le fichier dbdomainetld

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122111 Serial

43200 Refresh

3600 Retry

2419200 Expire

86400 ) Negative Cache TTL

IN NS nsdomainetld

IN NS ns11ovhnet

ns IN A abcd

www IN A abcd

IN A abcd

IN MX 10 maildomainetld

mail IN A abcd

Dans le mecircme dossier zones on a cbain-addrarpa

9

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122101 serial

14400 refresh

3600 retry

604800 expire

10800 minimum

)

cbain-addrarpa IN NS nsdomainetld

cbain-addrarpa IN NS ns11ovhnet

d IN PTR maildomainetld

Il faut faire attention agrave bien increacutementer le serial pour chaque modification des fichiers

Dans le fichier namedconflocal

zone domainetld

type master

file etcbindzonesdbdomainetld

allow-transfer 213251128130

notify yes

zone cbain-addrarpa IN

type master

file etcbindzonescbain-addrarpa

allow-transfer 213251128130

Ici 213251128130 est lrsquoadresse IP du serveur ns11ovhnet

Il faut bien sucircr configurer le DNS avec votre fournisseur (Gandi OVH hellip) Pour ccedila amusez-vous bien Vous pouvez

aussi tester votre configuration avec des outils en ligne tels que DNSstuff

En test final si votre configuration est bonne vous devriez pouvoir envoyer un mail depuis un service neutre (Gmail

yahoo hellip) et le voir dans votre arborescence (ici homevmaildomainetld)

Installation du paquet Debian et configuration de lighttpd

Commencez par reacutecupeacuterer le paquet deb agrave lrsquoadresse suivante httpswwwintimailpwintimaildeb

Installez ensuite GDebi Il srsquoagit drsquoun dpkg ameacutelioreacute pour teacuteleacutecharger les deacutependances automatiquement ce que

dpkg ne gegravere pas

apt-get update

apt-get install gdebi-core

10

Vous pouvez alors installer le paquet

gdebi intimaildeb

Vous aurez alors le site web drsquointiMail deacuteployeacute au chemin varwwwwebmail

Il ne vous reste plus qursquoagrave changer la configuration de lighttpd votre serveur web pour mettre en ligne le site

Vous pouvez pour cela copier-coller la configuration suivante mais veillez agrave bien changer lrsquoadresse IP preacutesente au

deacutebut de la partie SSL CONFIG avec votre adresse IP

serv ermodules = ( mod_access

mod_accesslog

mod_alias

mod_compress

mod_redirect

mod_rewrite

)

Hide server version

servertag = Such Headers Very try Now close telnet

serverdocument-root = varwwwwebmail

serverupload-dirs = ( varwwwwebmailuploads )

servererrorlog = varloglighttpderrorlog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

serverport = 80

accesslogformat = V h l u t r gts b Refereri

User-Agenti

accesslogfilename = varloglighttpdaccesslog

index-filenames = ( indexphp indexhtml

indexlighttpdhtml )

urlaccess-deny = ( ~ inc )

static-fileexclude-extensions = ( php pl fcgi )

compresscache-dir = varcachelighttpdcompress

compressfiletype = ( applicationjavascript textcss

texthtml textplain )

default listening port for IPv6 falls back to the IPv4 port

include_shell usrsharelighttpduse-ipv6pl + serverport

include_shell usrsharelighttpdcreate-mimeassignpl

include_shell usrsharelighttpdinclude-conf-enabledpl

SSL CONFIG

$SERVER[socket] == 5234485443

sslengine = enable

11

sslpemfile = etclighttpdsslintimailpwpem

sslca-file = etclighttpdsslintimailpwcrt

servername = intimailpw

votre configuration habituelle pour ce domaine

serverdocument-root = varwwwwebmail

servererrorlog = varloglighttpderror_ssllog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

Rewrite des URL pour masquer php

urlrewrite-once = ( ^()$ =gt $1 )

urlrewrite-if-not-file = ( ^([^])()$ =gt $1php$2 )

servernetwork-backend = writev

Deacutependances Slapd

Ldap-utils

Postfix

Postfix-ldap

Bind9

Lighttpd

12

Sources httpswikigandinetfrhostingusing-linuxtutorialsdebianmail-server-ldap

httpwwwpostfixorgpipe8html

httpwwwpostfixorgFILTER_READMEhtml

httpwwwpostfixorg

httpwwwpostfixorgtransport5html

Page 19: Système d'hébergement domestique...place sur les domaines .pw par Gandi.net, notre fournisseur. Nous n’avons donc pas pu l’implémenter. Nous avons configuré Postfix pour qu’il

Pour terminer nous avons revu la totaliteacute du code deacuteveloppeacute Nous sommes

passeacute du Bash au Perl Ce dernier est plus performant et plus simple agrave utiliser et agrave

lire

Firewall

Un autre gros morceau du projet mais qui nrsquoest pas speacutecifiquement lieacute agrave la

probleacutematique du mail crsquoest la seacutecurisation du serveur En effet apregraves avoir mis en

ligne notre serveur des pirates ont tregraves vite tenteacute de peacuteneacutetrer le systegraveme

Globalement les attaques eacutetaient de type force brute sur les services heacutebergeacutes sur

notre Raspberry neacutecessitant une identification tels que SSH SMTP hellip

On retrouve ici un petit point faible du protocole SMTP Eacutetant donneacute que

chaque serveur mail doit avoir une adresse postmaster et abuse lrsquoattaquant a agrave sa

disposition deux adresses agrave attaquer Ceci dit ce type drsquoattaque est simple agrave

contrecarrer car il suffit de limiter dans le temps le nombre de tentatives de

connexions

La contre-mesure que nous avons mis en place est simple une seacuterie de

regravegles Iptables En reacutesumeacute nous avons opteacute pour un systegraveme de liste blanche et

noire Les adresses IPs de la liste blanche sont autoriseacutees agrave utiliser la totaliteacute des

services (notamment SSH) tandis que celles de la liste noire sont totalement

ignoreacutees Les autres IPs nrsquoont accegraves qursquoau webmail

Eacutetant donneacute que le nombre drsquoIPs attaquant notre serveur nrsquoa cesseacute

drsquoaugmenter nous avons automatiseacute la mise agrave jour de la liste de noire en

deacuteveloppant un script pour Cron Ce script est exeacutecuteacute une fois par heure A ce jour

notre liste noire contient 47 adresses Bien sucircr ce systegraveme est susceptible drsquoecirctre

modifieacute agrave convenance pour passer sur une solution deacutedieacutee telle que Fail2ban qui fait

en fait ce qursquoon fait deacutejagrave (eacutetudier les logs et bannir des IP avec iptables) avec des

regravegles preacutedeacutefinies par la communauteacute et personnalisables En effet nous nous

attendons agrave voir la varieacuteteacute et le nombre drsquoattaques augmenter apregraves avoir migreacute sur

une IP non proteacutegeacutee par le firewall de lrsquoUniversiteacute puisque nous nrsquoavons plus la

premiegravere ligne de deacutefense du CRI en particulier pour le port 389 (LDAP) qui eacutetait

bloqueacute par lrsquouniversiteacute et srsquoest retrouveacute en premiegravere ligne apregraves la migration Nous

avons donc ajouteacute une regravegle bloquant tout le trafic entrant vers le port 389 hormis

localhost

Package drsquoinstallation

Nous avons creacutee un package deb contenant les sources du webmail ainsi

que des scripts utiles agrave lrsquoinstallation et au fonctionnement du serveur Nous avons

deacuteveloppeacute des scripts de configuration automatique pour LDAP et Postfix Comme

dpkg ne supporte pas directement lrsquoinstallation automatique des deacutependances

nous recommandons drsquoinstaller avant tout le paquet gdebi-core qui est en fait un

dpkg ameacutelioreacute Gracircce agrave la commande gdebi paquetdeb toutes les deacutependances

seront installeacutees en particulier postfix le serveur ldap le serveur web lighttpd entre

autres sans soucis Il est agrave noter que comme les scripts de configuration des

diffeacuterents services ne sont que partiellement impleacutementeacutes dans le paquet deb nous

fournissons en annexe un README complet et illustreacute qui explique pas agrave pas

comment faire fonctionner notre systegraveme sur nrsquoimporte quel Linux en particulier les

lignes de configuration des diffeacuterents services agrave changer et un exemplaire des

fichiers de configuration fonctionnels de ces services

Gestion de lrsquoeacutenergie

Une consideacuteration importante pour un systegraveme autonome Drsquoapregraves les fiches

techniques notre modegravele de Raspberry Pi (B 2) est officiellement eacutevalueacute avec un

fonctionnement agrave ~650mA pour 5V De nombreux proprieacutetaires de ce systegraveme

eacutequipeacutes se sont amuser agrave veacuterifier la consommation eacutelectrique reacuteelle de leur Pi 2 B

sous diffeacuterentes charges On pourra retenir cette eacutetude (lien en sitegraphie) qui

relegraveve la consommation en courant en fonction de lrsquoactiviteacute lanceacutee sur la Pi mais

aussi en charge sur 1 agrave 4 CPU

Ces chiffres sont releveacutes sur un systegraveme avec cameacutera connecteacutee HDMI connecteacute et

cacircble ethernet brancheacute et actif

On peut constater que globalement notre systegraveme Pi 2 B tournant sans

interface graphique sans composant suppleacutementaire sans sortie videacuteo ni cameacutera

avec plusieurs serveurs tournant tout en restant le plus leacuteger possible et demeurant

~99 idle la plupart du temps ne devrait pas deacutepasser une consommation de

300mA grand maximum

Fig 13 Un processeur tregraves tregraves peu chargeacute et une meacutemoire relativement libre

Nous avions lrsquoanneacutee derniegravere deacutejagrave reacutealiseacute un circuit permettant drsquoadapter un

panneau solaire sur une batterie USB classique de 9000mAh Nous avions alors pu

mesurer lrsquointensiteacute deacutelivreacutee par le panneau solaire En cas drsquoensoleillement moyen

habituel dans nos contreacutees le panneau solaire deacutebitait 400mA et pouvait atteindre

le double quand le soleil eacutetait directement preacutesent pour environ 800mA deacutebiteacute

Ce panneau solaire accompagneacute de son circuit drsquoadaptation devrait donc

suffire pour alimenter notre systegraveme la journeacutee le brancher ensuite sur une batterie

portable permet de stocker le surplus pour la nuit

Fig 14 le circuit drsquoadaptation

Fig 15 et son PCB

Eacutevolutions possibles

Webmail

Concernant les eacutevolutions possibles que nous aurions aimeacute apporter agrave notre

projet avec plus de temps commenccedilons par le web Nous aurions souhaiteacute apporter

la gestion de lrsquoenvoi de plusieurs piegraveces jointes comme nous lrsquoavons fait pour la

reacuteception

De plus nous aurions voulu inteacutegrer une corbeille ougrave lesmessages pourraient

aller avant drsquoecirctre deacutefinitivement supprimeacutes du systegraveme drsquoautant que nous avons

deacutejagrave eacutecrites les fonctions PHP permettant de retirer une en-tecircte drsquoun fichier JSON et

le fichier mail associeacute

Enfin nous aurions aimeacute en plus du blocage deacutejagrave preacutesent impleacutementer une

gestion plus profonde des piegravece jointes permettant notamment le remplissage de la

boicircte de spams

Systegraveme

Il aurait eacuteteacute inteacuteressant de notifier lrsquoexpeacutediteur lorsque le mail nrsquoa pas pu ecirctre

deacutelivreacute agrave un utilisateur lorsque son quota est plein En toute logique cela devrait ecirctre

fait simplement avec la commande Sendmail

Une meilleur gestion du trafic mail indeacutesirable aurait eacuteteacute la bienvenue En

effet malgreacute la limitation du spam il restera toujours une partie du volume de mail

qui sera indeacutesirable (pub pishing scam hellip)

Eacutetant donneacute la taille du systegraveme nous avions penseacute agrave une approche

ldquomachine learningrdquo Lrsquoutilisateur indiquerait pourquoi il considegravere le mail comme

indeacutesirable constituant des regravegles refusant certains mails Les mails provenant de

cet expeacutediteur pourraient ecirctre deacutetecteacute par le script agrave la reacuteception et

automatiquement envoyeacutes dans la boicircte de spams

Partie eacutenergeacutetique

Mecircme si la solution au panneau solaire ne pose aucun problegraveme en theacuteorie

nous aurions deacutejagrave dans un premier temps aimeacute lrsquoimpleacutementer en pratique Nous

nrsquoavons finalement pas reacutealiseacute notre objectif de deacutetecter deux cas drsquoalimentation

diffeacuterents soit lrsquoalimentation via panneau solaire est suffisante dans ce cas il

alimente la batterie et donc la Raspberry soit quand ce courant nrsquoest pas suffisant

on alimente la batterie par le secteur

Conclusion

En conclusion nous pensons avoir reacutepondu au cahier des charges initial dans

sa majeure partie Nous sommes aujourdrsquohui en mesure de proposer une solution

mail domestique priveacutee et personnalisable par un particulier

Notre installation de Debian a eacuteteacute au maximum alleacutegeacutee pour notre utilisation

sans interface graphique et nous avons mis en place une reacuteponse aux diverses

attaques que nous avons pu subir lors de lamise en place de notre solution logicielle

En outre le pare-feu avec notre systegraveme de liste noire bloque une partie des

attaques qui peuvent nous parvenir

Nos diffeacuterents scripts de pare-feu de gestion drsquoun mail entrant associeacute au

webmail permettent agrave un utilisateur drsquoacceacuteder aux fonctions usuelles associeacutees agrave

lrsquoenvoi et la reacuteception de mails

Gracircce agrave sa configuration personnalisable notre projet devrait pouvoir ecirctre

porteacute sur un domaine et une adresse IP diffeacuterente sans soucis et ecirctre deacuteployeacute

partout ougrave des gens souhaitent conserver leur vie priveacutee

Nous regretterons cependant de ne pas avoir exploiteacute la partie eacutenergeacutetique

de ce projet qui portait une probleacutematique inteacuteressante et qui nous parait importante

dans le monde actuel

Ce projet nous aura occupeacute pendant tregraves longtemps et nous sommes fiers du

travail que nous avons accompli Il est agrave nos yeux la preuve de ce que nous savons et

pouvons faire et nous donnera confiance pour notre deacutebut de carriegravere drsquoingeacutenieur

Sources

httpwwwradicaticomwpwp-contentuploads201401Email-Statistics-R

eport-2014-2018-Executive-Summarypdf

httpwwwcommentcamarchenetcontents525-le-protocole-ldap

httpsfrwikipediaorgwikiSimple_Mail_Transfer_Protocol

httpwwwcommentcamarchenetcontents536-pop3-smtp-imap-protocol

es-de-messagerie

httpstoolsietforghtmlrfc2821

httpsfrwikipediaorgwikiInternet_Message_Access_Protocol

httpstoolsietforghtmlrfc3501

httparstechnicacominformation-technology201402how-to-run-your-ow

n-e-mail-server-with-your-own-domain-part-1

httpswwwraspberrypiorgforumsviewtopicphpp=136912

httpstackoverflowcomquestions17394356how-can-i-make-a-bash-com

mand-run-periodically

httpuntroubledorgnullmailer

httpelinuxorgRPi_Hardware

httpraspitv2015raspberry-pi2-power-and-performance-measurement

Annexe 1 Architecture du systegraveme de fichiers

Annexe 2 Scan DNSSTUFF

Depuis httpwwwdnsstuffcomtoolsdnsReport|type=domainampampvalue=intimailpw

Annexe 3 Vue geacuteneacuterale httpswwwintimailpw

Annexe 4 Envoyer un mail

Annexe 5 Boite de reacuteception

Annexe 6 Interface drsquoadministration

Annexe 7 Gestion drsquoun utilisateur

Tutorial installation intimailtrade

Table des matiegraveres Apregraves une nouvelle installation de lrsquoOS 2

Seacutecurisation du serveur 2

Changement de lrsquoutilisateur par deacutefaut 2

Changement du port SSH 2

Interdire lrsquoauthentification SSH pour root 2

Installation de LDAP 3

Configuration de base 3

Configuration des Scheacutemas 4

Constitution de la base de donneacutees LDAP 5

Installation de Postfix 7

Installation de Bind9 8

Installation du paquet Debian et configuration de lighttpd 9

Deacutependances 11

Sources 12

2

Apregraves une nouvelle installation de lrsquoOS Exeacutecutez ces commandes pour mettre agrave jour agrave la derniegravere version Ces opeacuterations peuvent prendre un certain

temps Nous avons utiliseacute pour cet exemple Raspbian Jessie Lite sur une Raspberry Pi 2

apt-get update

apt-get upgrade ampamp apt-get dist-upgrade

apt-get install linux-headers-$(uname -r)

reboot

Puis lancer

raspi-config

Etendre au maximum lrsquoespace de stockage en navigant dans les menus

Expand Filesystem

Reacutegler une ip statique avec la box fichier etcnetworkinterfaces

iface eth0 inet static

address 192168131

netmask 2552552550

gateway 19216811

Nous avons aussi supprimeacute wpasupplicant

Seacutecurisation du serveur

Changement de lrsquoutilisateur par deacutefaut Changez le nom drsquoutilisateur par deacutefaut ainsi que son mot de passe

sudo passwd root

Sortie et login en tant que root puis

usermod -l myuname pi

usermod -m -d homemyuname myuname

groupmod ndashn myuname pi

passwd myuname

Voir cette adresse pour lrsquoutilisation de cleacutes priveacuteespubliques

Changement du port SSH sed ndashi sPort 22Port 2222g etcsshsshd_config

Interdire lrsquoauthentification SSH pour root sed -i sPermitRootLogin yesPermitRootLogin nog etcsshsshd_config

3

Installation de LDAP

Configuration de base Installation du package

apt-get install slapd

Choisir un mot de passe administrateur puis lancer la commande

dpkg-reconfigure slapd

Reacutepondre non agrave la question 1

Entrez le nom de domaine utiliseacute agrave la question 2 sous la forme domainetld

Entrez ce que vous voulez au 3egraveme eacutecran le nom de lrsquoorganisation ne sera pas utiliseacute

Entrez un mot de passe

Choisissez HDB

Choisissez si la base de donneacutees est supprimeacutee agrave la deacutesinstallation de slapd

Deacuteplacez lrsquoancienne base de donneacutees

Nrsquoutilisez pas LDAPv2

Installer les outils de conversion pour ldap (slaptest ldapmodify notamment)

apt-get install ldap-utils

On peut maintenant veacuterifier que la configuration est valable

ldapsearch -x -h localhost -b dc=domainedc=tld -LLL dc=domaine dn

Cette commande doit retourner quelque chose comme

dn dc=domainedc=tld

Il faut maintenant seacutecuriser le serveur LDAP en effet on peut y acceacuteder en anonyme avec la commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=config

(amp(objectClass=olcDatabaseConfig)(olcSuffix=dc=domainedc=tld))

Cette commande retourne un certain nombre drsquoinformations notamment agrave propos des champs suivants

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by none

olcAccess 1to dnbase= by read

olcAccess 2to by read

On va modifier ces champs avec la commande ldapmodify Pour cela on va creacuteer un fichier ldif

cat gt changeAccessldif ltlt EOF

dn olcDatabase=1hdbcn=config

changetype modify

delete olcAccess

-

add olcAccess

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by dn=cn=admindc=domainedc=tld write by none

-

add olcAccess

olcAccess 1to dnbase= by read

-

4

add olcAccess

olcAccess 2to by self write by dn=cn=admindc=domainedc=tld write by

none

-

EOF

On peut maintenant appliquer les changements avec ldapmodify

ldapmodify ndashc ndashY EXTERNAL ndashH ldapi -f changeAccessldif

La commande devrait vous confirmer que la modification srsquoest bien effectueacutee

SASLEXTERNAL authentication started

SASL username gidNumber=0+uidNumber=0cn=peercredcn=externalcn=auth

SASL SSF 0

modifying entry olcDatabase=1hdbcn=config

On peut veacuterifier qursquoon ne peut plus acceacuteder aux informations avec la commande

ldapsearch -x -c -h localhost -b dc=domainedc=tld

On peut veacuterifier la configuration en se connectant en tant qursquoadministrateur

ldapsearch -c -h localhost -b dc=domainedc=tld -D

cn=admindc=domainedc=tld ndashW

Configuration des Scheacutemas Nous allons utiliser les scheacutemas de courier-ldap Pour eacuteviter une manipulation compliqueacutee vous trouverez

directement le scheacutema avec le fichier authldapschema On place ce fichier dans le dossier

mv authldapschema etcldapschema

Nous creacuteons un fichier qui incluera tous les scheacutemas de base en plus du nouveau On peut les afficher avec la

commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

Creacuteation du fichier de configuration pour notre exemple cela donne

mkdir tmpldapconf

cat gt tmpldapconfldapconf ltlt EOF

include etcldapschemacoreschema

include etcldapschemacosineschema

include etcldapschemanisschema

include etcldapschemainetorgpersonschema

include etcldapschemaauthldapschema

EOF

On lance ensuite la commande

slaptest -f tmpldapconfldapconf -F tmpldapconf

Elle revoie un message de succegraves Cette commande a creacuteeacute dans le reacutepertoire tmpldapconf une arborescence

correspondant agrave la configuration de notre LDAP

On modifie le chemin de configuration

5

sed ndashi 0dnauthldap sauthldapauthldapcn=schemacn=config

cn=authldapldif

On supprime ensuite les 7 derniegraveres lignes du fichier

head -n -7 cn=authldapldif gt tmpldif

mv tmpldif cn=authldapldif

On peut maintenant importer notre fichier de configuration Pour ce faire

ldapadd -Y EXTERNAL -H ldapi -f

tmpldapconfcn=configcn=schemacn=authldapldif

Si tout va bien lrsquoentreacutee devrait avoir eacuteteacute ajouteacutee On peut veacuterifier avec la commande vue tout agrave lrsquoheure

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

On devrait voir en plus le nouveau scheacutema authldap

Constitution de la base de donneacutees LDAP Le remplissage de la base se fait agrave lrsquoaide de fichiers ldif Nous donnons ici un exemple de structure

Fichier pour la structure de base

dn dc=maildc=domainedc=tld

o intimailpw

description Global mail tree

dc mail

objectClass top

objectClass dcObject

objectClass organization

dn dc=peopledc=maildc=domainedc=tld

description Informations of all users

o people

dc people

objectClass top

objectClass dcObject

objectClass organization

dn dc=groupsdc=maildc=domainedc=tld

description All groups of users

o groups

dc groups

objectClass top

objectClass dcObject

objectClass organization

6

Fichier pour ajouter un utilisateur

dn cn=jbonddc=peopledc=maildc=domainedc=tld

uid jbond

mail jbonddomainetld

sn Moulin

givenName James

displayName James Bond

mailbox domainetldjbond

quota 50M

homeDirectory homevmail

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAccount

userPassword SSHA367PSXiUAegy8dpJbPU8OepEf8L5ye

Pour obtenir un hash du mot de passe

slappasswd -s password -h SSHA

On peut par la suite ajouter la configuration agrave la base de donneacutees avec la commande

ldapadd -D cn=admindc=domainedc=tld -W -h localhost -f pathtofile

Si les champs proposeacutes ne sont pas suffisants il faudra alors effectuer les modifications dans le fichier autldapschema

proposeacute plus haut et refaire la manipulation de configuration

De plus les standards du Mail deacutecrit par lrsquoIETF (RFC822 63 RFC1123 527 and RFC2821 451) impliquent drsquoavoir une

adresse Postmaster et une Abuse Pour cela nous pourrions creacuteer ces adresses avec la meacutethode vue au-dessus mais

ce nrsquoest pas la meilleure Il est preacutefeacuterable drsquoutiliser un alias comme nous le ferons avec les listes de diffusion Ici nous

proposons de rediriger ces deux adresses vers une adresse administrateur Pour cela la meacutethode est la mecircme sauf

que le fichier ldif nrsquoest pas tout agrave fait identique En voici un exemple

dn cn=postmasterdc=groupsdc=maildc=domainedc=tld

uid postmaster

mail postmasterdomainetld

sn Postmaster

displayName Postmaster

maildrop admindomainetld

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAlias

Pour faire une liste de diffusion la meacutethode est la mecircme Il suffit drsquoajouter toutes les adresses destinataires dans le

champ maildrop seacutepareacutees par des virgules ()

7

Installation de Postfix Installation des packages

apt-get install postfix postfix-ldap

Lors de lrsquoinstallation deux eacutecrans deacutefilent

- Configuration Internet Site

- Valeur par deacutefaut pour le mail name

On creacutee lrsquoutilisateur qui servira agrave exeacutecuter Postfix

groupadd vmail

useradd -g vmail -d homevmail -s binfalse -m vmail

Nous aurons besoin dans la suite des GID et UID creacuteeacutes agrave cet instant Ils peuvent ecirctre afficheacutes avec les commandes

cat etcgroup | grep vmail | cut -d -f3

cat etcpasswd | grep vmail | cut -d -f3

On ajoute les paramegravetres au fichier etcpostfixmaincf (remplacer les valeurs de GID et drsquoUID avec vos valeurs)

smtpd_banner = maildomainetld

virtual_mailbox_base = homevmail

virtual_mailbox_domains = dmainetld

virtual_mailbox_maps = ldapetcpostfixldap_accountscf

virtual_alias_maps = ldapetcpostfixldap_aliasescf

virtual_minimum_uid = 100

virtual_gid_maps = static1001 Remplacez ici par votre valeur de GID

virtual_uid_maps = static1001 Remplacez ici par votre valeur drsquoUID

Il nous faut maintenant constituer nos fichiers de configuration ldap_accountscf

cat gt etcpostfixldap_accountscf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=peopledc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAccount)(mail=s))

result_attribute = mailbox

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

Et pour ldap_aliasescf

cat gt ldap_aliasescf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=groupsdc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAlias)(mail=s))

result_attribute = maildrop

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

8

On peut maintenant veacuterifier la configuration de Postfix avec (cette commande ne doit rien retourner si crsquoest bon)

postfix check

Si crsquoest bon alors on recharge le serveur

postfix reload

On peut alors faire un envoi de mail test via telnet

telnet localhost 25

Si vous souhaitez deacutelivrer les mails agrave votre maniegravere il faut dans le fichier etcpostfixmaincf la ligne

virtual_transport = nomdevotreregle

Et de mecircme dans le fichier etcpostfixmastercf

nomdevotreregle unix - n n - 5 pipe

flags=Rq user=vmail null_sender=

argv=chemindevotreprogramme

Il nous reste maintenant agrave configurer les diffeacuterents enregistrements DNS neacutecessaire au fonctionnement drsquoun serveur

mail Vous pouvez utiliser la solution de votre choix Dans la suite vous trouverez une meacutethode utilisant Bind9

Installation de Bind9 Dans toute cette partie on se situera dans le dossier etcbind Dans la suite notre IP sera abcd

Dans le fichier namedconfoptions on ajoutera dans le champ options

version Not supported

Dans un dossier zones on eacutecrit le fichier dbdomainetld

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122111 Serial

43200 Refresh

3600 Retry

2419200 Expire

86400 ) Negative Cache TTL

IN NS nsdomainetld

IN NS ns11ovhnet

ns IN A abcd

www IN A abcd

IN A abcd

IN MX 10 maildomainetld

mail IN A abcd

Dans le mecircme dossier zones on a cbain-addrarpa

9

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122101 serial

14400 refresh

3600 retry

604800 expire

10800 minimum

)

cbain-addrarpa IN NS nsdomainetld

cbain-addrarpa IN NS ns11ovhnet

d IN PTR maildomainetld

Il faut faire attention agrave bien increacutementer le serial pour chaque modification des fichiers

Dans le fichier namedconflocal

zone domainetld

type master

file etcbindzonesdbdomainetld

allow-transfer 213251128130

notify yes

zone cbain-addrarpa IN

type master

file etcbindzonescbain-addrarpa

allow-transfer 213251128130

Ici 213251128130 est lrsquoadresse IP du serveur ns11ovhnet

Il faut bien sucircr configurer le DNS avec votre fournisseur (Gandi OVH hellip) Pour ccedila amusez-vous bien Vous pouvez

aussi tester votre configuration avec des outils en ligne tels que DNSstuff

En test final si votre configuration est bonne vous devriez pouvoir envoyer un mail depuis un service neutre (Gmail

yahoo hellip) et le voir dans votre arborescence (ici homevmaildomainetld)

Installation du paquet Debian et configuration de lighttpd

Commencez par reacutecupeacuterer le paquet deb agrave lrsquoadresse suivante httpswwwintimailpwintimaildeb

Installez ensuite GDebi Il srsquoagit drsquoun dpkg ameacutelioreacute pour teacuteleacutecharger les deacutependances automatiquement ce que

dpkg ne gegravere pas

apt-get update

apt-get install gdebi-core

10

Vous pouvez alors installer le paquet

gdebi intimaildeb

Vous aurez alors le site web drsquointiMail deacuteployeacute au chemin varwwwwebmail

Il ne vous reste plus qursquoagrave changer la configuration de lighttpd votre serveur web pour mettre en ligne le site

Vous pouvez pour cela copier-coller la configuration suivante mais veillez agrave bien changer lrsquoadresse IP preacutesente au

deacutebut de la partie SSL CONFIG avec votre adresse IP

serv ermodules = ( mod_access

mod_accesslog

mod_alias

mod_compress

mod_redirect

mod_rewrite

)

Hide server version

servertag = Such Headers Very try Now close telnet

serverdocument-root = varwwwwebmail

serverupload-dirs = ( varwwwwebmailuploads )

servererrorlog = varloglighttpderrorlog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

serverport = 80

accesslogformat = V h l u t r gts b Refereri

User-Agenti

accesslogfilename = varloglighttpdaccesslog

index-filenames = ( indexphp indexhtml

indexlighttpdhtml )

urlaccess-deny = ( ~ inc )

static-fileexclude-extensions = ( php pl fcgi )

compresscache-dir = varcachelighttpdcompress

compressfiletype = ( applicationjavascript textcss

texthtml textplain )

default listening port for IPv6 falls back to the IPv4 port

include_shell usrsharelighttpduse-ipv6pl + serverport

include_shell usrsharelighttpdcreate-mimeassignpl

include_shell usrsharelighttpdinclude-conf-enabledpl

SSL CONFIG

$SERVER[socket] == 5234485443

sslengine = enable

11

sslpemfile = etclighttpdsslintimailpwpem

sslca-file = etclighttpdsslintimailpwcrt

servername = intimailpw

votre configuration habituelle pour ce domaine

serverdocument-root = varwwwwebmail

servererrorlog = varloglighttpderror_ssllog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

Rewrite des URL pour masquer php

urlrewrite-once = ( ^()$ =gt $1 )

urlrewrite-if-not-file = ( ^([^])()$ =gt $1php$2 )

servernetwork-backend = writev

Deacutependances Slapd

Ldap-utils

Postfix

Postfix-ldap

Bind9

Lighttpd

12

Sources httpswikigandinetfrhostingusing-linuxtutorialsdebianmail-server-ldap

httpwwwpostfixorgpipe8html

httpwwwpostfixorgFILTER_READMEhtml

httpwwwpostfixorg

httpwwwpostfixorgtransport5html

Page 20: Système d'hébergement domestique...place sur les domaines .pw par Gandi.net, notre fournisseur. Nous n’avons donc pas pu l’implémenter. Nous avons configuré Postfix pour qu’il

Package drsquoinstallation

Nous avons creacutee un package deb contenant les sources du webmail ainsi

que des scripts utiles agrave lrsquoinstallation et au fonctionnement du serveur Nous avons

deacuteveloppeacute des scripts de configuration automatique pour LDAP et Postfix Comme

dpkg ne supporte pas directement lrsquoinstallation automatique des deacutependances

nous recommandons drsquoinstaller avant tout le paquet gdebi-core qui est en fait un

dpkg ameacutelioreacute Gracircce agrave la commande gdebi paquetdeb toutes les deacutependances

seront installeacutees en particulier postfix le serveur ldap le serveur web lighttpd entre

autres sans soucis Il est agrave noter que comme les scripts de configuration des

diffeacuterents services ne sont que partiellement impleacutementeacutes dans le paquet deb nous

fournissons en annexe un README complet et illustreacute qui explique pas agrave pas

comment faire fonctionner notre systegraveme sur nrsquoimporte quel Linux en particulier les

lignes de configuration des diffeacuterents services agrave changer et un exemplaire des

fichiers de configuration fonctionnels de ces services

Gestion de lrsquoeacutenergie

Une consideacuteration importante pour un systegraveme autonome Drsquoapregraves les fiches

techniques notre modegravele de Raspberry Pi (B 2) est officiellement eacutevalueacute avec un

fonctionnement agrave ~650mA pour 5V De nombreux proprieacutetaires de ce systegraveme

eacutequipeacutes se sont amuser agrave veacuterifier la consommation eacutelectrique reacuteelle de leur Pi 2 B

sous diffeacuterentes charges On pourra retenir cette eacutetude (lien en sitegraphie) qui

relegraveve la consommation en courant en fonction de lrsquoactiviteacute lanceacutee sur la Pi mais

aussi en charge sur 1 agrave 4 CPU

Ces chiffres sont releveacutes sur un systegraveme avec cameacutera connecteacutee HDMI connecteacute et

cacircble ethernet brancheacute et actif

On peut constater que globalement notre systegraveme Pi 2 B tournant sans

interface graphique sans composant suppleacutementaire sans sortie videacuteo ni cameacutera

avec plusieurs serveurs tournant tout en restant le plus leacuteger possible et demeurant

~99 idle la plupart du temps ne devrait pas deacutepasser une consommation de

300mA grand maximum

Fig 13 Un processeur tregraves tregraves peu chargeacute et une meacutemoire relativement libre

Nous avions lrsquoanneacutee derniegravere deacutejagrave reacutealiseacute un circuit permettant drsquoadapter un

panneau solaire sur une batterie USB classique de 9000mAh Nous avions alors pu

mesurer lrsquointensiteacute deacutelivreacutee par le panneau solaire En cas drsquoensoleillement moyen

habituel dans nos contreacutees le panneau solaire deacutebitait 400mA et pouvait atteindre

le double quand le soleil eacutetait directement preacutesent pour environ 800mA deacutebiteacute

Ce panneau solaire accompagneacute de son circuit drsquoadaptation devrait donc

suffire pour alimenter notre systegraveme la journeacutee le brancher ensuite sur une batterie

portable permet de stocker le surplus pour la nuit

Fig 14 le circuit drsquoadaptation

Fig 15 et son PCB

Eacutevolutions possibles

Webmail

Concernant les eacutevolutions possibles que nous aurions aimeacute apporter agrave notre

projet avec plus de temps commenccedilons par le web Nous aurions souhaiteacute apporter

la gestion de lrsquoenvoi de plusieurs piegraveces jointes comme nous lrsquoavons fait pour la

reacuteception

De plus nous aurions voulu inteacutegrer une corbeille ougrave lesmessages pourraient

aller avant drsquoecirctre deacutefinitivement supprimeacutes du systegraveme drsquoautant que nous avons

deacutejagrave eacutecrites les fonctions PHP permettant de retirer une en-tecircte drsquoun fichier JSON et

le fichier mail associeacute

Enfin nous aurions aimeacute en plus du blocage deacutejagrave preacutesent impleacutementer une

gestion plus profonde des piegravece jointes permettant notamment le remplissage de la

boicircte de spams

Systegraveme

Il aurait eacuteteacute inteacuteressant de notifier lrsquoexpeacutediteur lorsque le mail nrsquoa pas pu ecirctre

deacutelivreacute agrave un utilisateur lorsque son quota est plein En toute logique cela devrait ecirctre

fait simplement avec la commande Sendmail

Une meilleur gestion du trafic mail indeacutesirable aurait eacuteteacute la bienvenue En

effet malgreacute la limitation du spam il restera toujours une partie du volume de mail

qui sera indeacutesirable (pub pishing scam hellip)

Eacutetant donneacute la taille du systegraveme nous avions penseacute agrave une approche

ldquomachine learningrdquo Lrsquoutilisateur indiquerait pourquoi il considegravere le mail comme

indeacutesirable constituant des regravegles refusant certains mails Les mails provenant de

cet expeacutediteur pourraient ecirctre deacutetecteacute par le script agrave la reacuteception et

automatiquement envoyeacutes dans la boicircte de spams

Partie eacutenergeacutetique

Mecircme si la solution au panneau solaire ne pose aucun problegraveme en theacuteorie

nous aurions deacutejagrave dans un premier temps aimeacute lrsquoimpleacutementer en pratique Nous

nrsquoavons finalement pas reacutealiseacute notre objectif de deacutetecter deux cas drsquoalimentation

diffeacuterents soit lrsquoalimentation via panneau solaire est suffisante dans ce cas il

alimente la batterie et donc la Raspberry soit quand ce courant nrsquoest pas suffisant

on alimente la batterie par le secteur

Conclusion

En conclusion nous pensons avoir reacutepondu au cahier des charges initial dans

sa majeure partie Nous sommes aujourdrsquohui en mesure de proposer une solution

mail domestique priveacutee et personnalisable par un particulier

Notre installation de Debian a eacuteteacute au maximum alleacutegeacutee pour notre utilisation

sans interface graphique et nous avons mis en place une reacuteponse aux diverses

attaques que nous avons pu subir lors de lamise en place de notre solution logicielle

En outre le pare-feu avec notre systegraveme de liste noire bloque une partie des

attaques qui peuvent nous parvenir

Nos diffeacuterents scripts de pare-feu de gestion drsquoun mail entrant associeacute au

webmail permettent agrave un utilisateur drsquoacceacuteder aux fonctions usuelles associeacutees agrave

lrsquoenvoi et la reacuteception de mails

Gracircce agrave sa configuration personnalisable notre projet devrait pouvoir ecirctre

porteacute sur un domaine et une adresse IP diffeacuterente sans soucis et ecirctre deacuteployeacute

partout ougrave des gens souhaitent conserver leur vie priveacutee

Nous regretterons cependant de ne pas avoir exploiteacute la partie eacutenergeacutetique

de ce projet qui portait une probleacutematique inteacuteressante et qui nous parait importante

dans le monde actuel

Ce projet nous aura occupeacute pendant tregraves longtemps et nous sommes fiers du

travail que nous avons accompli Il est agrave nos yeux la preuve de ce que nous savons et

pouvons faire et nous donnera confiance pour notre deacutebut de carriegravere drsquoingeacutenieur

Sources

httpwwwradicaticomwpwp-contentuploads201401Email-Statistics-R

eport-2014-2018-Executive-Summarypdf

httpwwwcommentcamarchenetcontents525-le-protocole-ldap

httpsfrwikipediaorgwikiSimple_Mail_Transfer_Protocol

httpwwwcommentcamarchenetcontents536-pop3-smtp-imap-protocol

es-de-messagerie

httpstoolsietforghtmlrfc2821

httpsfrwikipediaorgwikiInternet_Message_Access_Protocol

httpstoolsietforghtmlrfc3501

httparstechnicacominformation-technology201402how-to-run-your-ow

n-e-mail-server-with-your-own-domain-part-1

httpswwwraspberrypiorgforumsviewtopicphpp=136912

httpstackoverflowcomquestions17394356how-can-i-make-a-bash-com

mand-run-periodically

httpuntroubledorgnullmailer

httpelinuxorgRPi_Hardware

httpraspitv2015raspberry-pi2-power-and-performance-measurement

Annexe 1 Architecture du systegraveme de fichiers

Annexe 2 Scan DNSSTUFF

Depuis httpwwwdnsstuffcomtoolsdnsReport|type=domainampampvalue=intimailpw

Annexe 3 Vue geacuteneacuterale httpswwwintimailpw

Annexe 4 Envoyer un mail

Annexe 5 Boite de reacuteception

Annexe 6 Interface drsquoadministration

Annexe 7 Gestion drsquoun utilisateur

Tutorial installation intimailtrade

Table des matiegraveres Apregraves une nouvelle installation de lrsquoOS 2

Seacutecurisation du serveur 2

Changement de lrsquoutilisateur par deacutefaut 2

Changement du port SSH 2

Interdire lrsquoauthentification SSH pour root 2

Installation de LDAP 3

Configuration de base 3

Configuration des Scheacutemas 4

Constitution de la base de donneacutees LDAP 5

Installation de Postfix 7

Installation de Bind9 8

Installation du paquet Debian et configuration de lighttpd 9

Deacutependances 11

Sources 12

2

Apregraves une nouvelle installation de lrsquoOS Exeacutecutez ces commandes pour mettre agrave jour agrave la derniegravere version Ces opeacuterations peuvent prendre un certain

temps Nous avons utiliseacute pour cet exemple Raspbian Jessie Lite sur une Raspberry Pi 2

apt-get update

apt-get upgrade ampamp apt-get dist-upgrade

apt-get install linux-headers-$(uname -r)

reboot

Puis lancer

raspi-config

Etendre au maximum lrsquoespace de stockage en navigant dans les menus

Expand Filesystem

Reacutegler une ip statique avec la box fichier etcnetworkinterfaces

iface eth0 inet static

address 192168131

netmask 2552552550

gateway 19216811

Nous avons aussi supprimeacute wpasupplicant

Seacutecurisation du serveur

Changement de lrsquoutilisateur par deacutefaut Changez le nom drsquoutilisateur par deacutefaut ainsi que son mot de passe

sudo passwd root

Sortie et login en tant que root puis

usermod -l myuname pi

usermod -m -d homemyuname myuname

groupmod ndashn myuname pi

passwd myuname

Voir cette adresse pour lrsquoutilisation de cleacutes priveacuteespubliques

Changement du port SSH sed ndashi sPort 22Port 2222g etcsshsshd_config

Interdire lrsquoauthentification SSH pour root sed -i sPermitRootLogin yesPermitRootLogin nog etcsshsshd_config

3

Installation de LDAP

Configuration de base Installation du package

apt-get install slapd

Choisir un mot de passe administrateur puis lancer la commande

dpkg-reconfigure slapd

Reacutepondre non agrave la question 1

Entrez le nom de domaine utiliseacute agrave la question 2 sous la forme domainetld

Entrez ce que vous voulez au 3egraveme eacutecran le nom de lrsquoorganisation ne sera pas utiliseacute

Entrez un mot de passe

Choisissez HDB

Choisissez si la base de donneacutees est supprimeacutee agrave la deacutesinstallation de slapd

Deacuteplacez lrsquoancienne base de donneacutees

Nrsquoutilisez pas LDAPv2

Installer les outils de conversion pour ldap (slaptest ldapmodify notamment)

apt-get install ldap-utils

On peut maintenant veacuterifier que la configuration est valable

ldapsearch -x -h localhost -b dc=domainedc=tld -LLL dc=domaine dn

Cette commande doit retourner quelque chose comme

dn dc=domainedc=tld

Il faut maintenant seacutecuriser le serveur LDAP en effet on peut y acceacuteder en anonyme avec la commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=config

(amp(objectClass=olcDatabaseConfig)(olcSuffix=dc=domainedc=tld))

Cette commande retourne un certain nombre drsquoinformations notamment agrave propos des champs suivants

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by none

olcAccess 1to dnbase= by read

olcAccess 2to by read

On va modifier ces champs avec la commande ldapmodify Pour cela on va creacuteer un fichier ldif

cat gt changeAccessldif ltlt EOF

dn olcDatabase=1hdbcn=config

changetype modify

delete olcAccess

-

add olcAccess

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by dn=cn=admindc=domainedc=tld write by none

-

add olcAccess

olcAccess 1to dnbase= by read

-

4

add olcAccess

olcAccess 2to by self write by dn=cn=admindc=domainedc=tld write by

none

-

EOF

On peut maintenant appliquer les changements avec ldapmodify

ldapmodify ndashc ndashY EXTERNAL ndashH ldapi -f changeAccessldif

La commande devrait vous confirmer que la modification srsquoest bien effectueacutee

SASLEXTERNAL authentication started

SASL username gidNumber=0+uidNumber=0cn=peercredcn=externalcn=auth

SASL SSF 0

modifying entry olcDatabase=1hdbcn=config

On peut veacuterifier qursquoon ne peut plus acceacuteder aux informations avec la commande

ldapsearch -x -c -h localhost -b dc=domainedc=tld

On peut veacuterifier la configuration en se connectant en tant qursquoadministrateur

ldapsearch -c -h localhost -b dc=domainedc=tld -D

cn=admindc=domainedc=tld ndashW

Configuration des Scheacutemas Nous allons utiliser les scheacutemas de courier-ldap Pour eacuteviter une manipulation compliqueacutee vous trouverez

directement le scheacutema avec le fichier authldapschema On place ce fichier dans le dossier

mv authldapschema etcldapschema

Nous creacuteons un fichier qui incluera tous les scheacutemas de base en plus du nouveau On peut les afficher avec la

commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

Creacuteation du fichier de configuration pour notre exemple cela donne

mkdir tmpldapconf

cat gt tmpldapconfldapconf ltlt EOF

include etcldapschemacoreschema

include etcldapschemacosineschema

include etcldapschemanisschema

include etcldapschemainetorgpersonschema

include etcldapschemaauthldapschema

EOF

On lance ensuite la commande

slaptest -f tmpldapconfldapconf -F tmpldapconf

Elle revoie un message de succegraves Cette commande a creacuteeacute dans le reacutepertoire tmpldapconf une arborescence

correspondant agrave la configuration de notre LDAP

On modifie le chemin de configuration

5

sed ndashi 0dnauthldap sauthldapauthldapcn=schemacn=config

cn=authldapldif

On supprime ensuite les 7 derniegraveres lignes du fichier

head -n -7 cn=authldapldif gt tmpldif

mv tmpldif cn=authldapldif

On peut maintenant importer notre fichier de configuration Pour ce faire

ldapadd -Y EXTERNAL -H ldapi -f

tmpldapconfcn=configcn=schemacn=authldapldif

Si tout va bien lrsquoentreacutee devrait avoir eacuteteacute ajouteacutee On peut veacuterifier avec la commande vue tout agrave lrsquoheure

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

On devrait voir en plus le nouveau scheacutema authldap

Constitution de la base de donneacutees LDAP Le remplissage de la base se fait agrave lrsquoaide de fichiers ldif Nous donnons ici un exemple de structure

Fichier pour la structure de base

dn dc=maildc=domainedc=tld

o intimailpw

description Global mail tree

dc mail

objectClass top

objectClass dcObject

objectClass organization

dn dc=peopledc=maildc=domainedc=tld

description Informations of all users

o people

dc people

objectClass top

objectClass dcObject

objectClass organization

dn dc=groupsdc=maildc=domainedc=tld

description All groups of users

o groups

dc groups

objectClass top

objectClass dcObject

objectClass organization

6

Fichier pour ajouter un utilisateur

dn cn=jbonddc=peopledc=maildc=domainedc=tld

uid jbond

mail jbonddomainetld

sn Moulin

givenName James

displayName James Bond

mailbox domainetldjbond

quota 50M

homeDirectory homevmail

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAccount

userPassword SSHA367PSXiUAegy8dpJbPU8OepEf8L5ye

Pour obtenir un hash du mot de passe

slappasswd -s password -h SSHA

On peut par la suite ajouter la configuration agrave la base de donneacutees avec la commande

ldapadd -D cn=admindc=domainedc=tld -W -h localhost -f pathtofile

Si les champs proposeacutes ne sont pas suffisants il faudra alors effectuer les modifications dans le fichier autldapschema

proposeacute plus haut et refaire la manipulation de configuration

De plus les standards du Mail deacutecrit par lrsquoIETF (RFC822 63 RFC1123 527 and RFC2821 451) impliquent drsquoavoir une

adresse Postmaster et une Abuse Pour cela nous pourrions creacuteer ces adresses avec la meacutethode vue au-dessus mais

ce nrsquoest pas la meilleure Il est preacutefeacuterable drsquoutiliser un alias comme nous le ferons avec les listes de diffusion Ici nous

proposons de rediriger ces deux adresses vers une adresse administrateur Pour cela la meacutethode est la mecircme sauf

que le fichier ldif nrsquoest pas tout agrave fait identique En voici un exemple

dn cn=postmasterdc=groupsdc=maildc=domainedc=tld

uid postmaster

mail postmasterdomainetld

sn Postmaster

displayName Postmaster

maildrop admindomainetld

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAlias

Pour faire une liste de diffusion la meacutethode est la mecircme Il suffit drsquoajouter toutes les adresses destinataires dans le

champ maildrop seacutepareacutees par des virgules ()

7

Installation de Postfix Installation des packages

apt-get install postfix postfix-ldap

Lors de lrsquoinstallation deux eacutecrans deacutefilent

- Configuration Internet Site

- Valeur par deacutefaut pour le mail name

On creacutee lrsquoutilisateur qui servira agrave exeacutecuter Postfix

groupadd vmail

useradd -g vmail -d homevmail -s binfalse -m vmail

Nous aurons besoin dans la suite des GID et UID creacuteeacutes agrave cet instant Ils peuvent ecirctre afficheacutes avec les commandes

cat etcgroup | grep vmail | cut -d -f3

cat etcpasswd | grep vmail | cut -d -f3

On ajoute les paramegravetres au fichier etcpostfixmaincf (remplacer les valeurs de GID et drsquoUID avec vos valeurs)

smtpd_banner = maildomainetld

virtual_mailbox_base = homevmail

virtual_mailbox_domains = dmainetld

virtual_mailbox_maps = ldapetcpostfixldap_accountscf

virtual_alias_maps = ldapetcpostfixldap_aliasescf

virtual_minimum_uid = 100

virtual_gid_maps = static1001 Remplacez ici par votre valeur de GID

virtual_uid_maps = static1001 Remplacez ici par votre valeur drsquoUID

Il nous faut maintenant constituer nos fichiers de configuration ldap_accountscf

cat gt etcpostfixldap_accountscf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=peopledc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAccount)(mail=s))

result_attribute = mailbox

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

Et pour ldap_aliasescf

cat gt ldap_aliasescf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=groupsdc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAlias)(mail=s))

result_attribute = maildrop

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

8

On peut maintenant veacuterifier la configuration de Postfix avec (cette commande ne doit rien retourner si crsquoest bon)

postfix check

Si crsquoest bon alors on recharge le serveur

postfix reload

On peut alors faire un envoi de mail test via telnet

telnet localhost 25

Si vous souhaitez deacutelivrer les mails agrave votre maniegravere il faut dans le fichier etcpostfixmaincf la ligne

virtual_transport = nomdevotreregle

Et de mecircme dans le fichier etcpostfixmastercf

nomdevotreregle unix - n n - 5 pipe

flags=Rq user=vmail null_sender=

argv=chemindevotreprogramme

Il nous reste maintenant agrave configurer les diffeacuterents enregistrements DNS neacutecessaire au fonctionnement drsquoun serveur

mail Vous pouvez utiliser la solution de votre choix Dans la suite vous trouverez une meacutethode utilisant Bind9

Installation de Bind9 Dans toute cette partie on se situera dans le dossier etcbind Dans la suite notre IP sera abcd

Dans le fichier namedconfoptions on ajoutera dans le champ options

version Not supported

Dans un dossier zones on eacutecrit le fichier dbdomainetld

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122111 Serial

43200 Refresh

3600 Retry

2419200 Expire

86400 ) Negative Cache TTL

IN NS nsdomainetld

IN NS ns11ovhnet

ns IN A abcd

www IN A abcd

IN A abcd

IN MX 10 maildomainetld

mail IN A abcd

Dans le mecircme dossier zones on a cbain-addrarpa

9

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122101 serial

14400 refresh

3600 retry

604800 expire

10800 minimum

)

cbain-addrarpa IN NS nsdomainetld

cbain-addrarpa IN NS ns11ovhnet

d IN PTR maildomainetld

Il faut faire attention agrave bien increacutementer le serial pour chaque modification des fichiers

Dans le fichier namedconflocal

zone domainetld

type master

file etcbindzonesdbdomainetld

allow-transfer 213251128130

notify yes

zone cbain-addrarpa IN

type master

file etcbindzonescbain-addrarpa

allow-transfer 213251128130

Ici 213251128130 est lrsquoadresse IP du serveur ns11ovhnet

Il faut bien sucircr configurer le DNS avec votre fournisseur (Gandi OVH hellip) Pour ccedila amusez-vous bien Vous pouvez

aussi tester votre configuration avec des outils en ligne tels que DNSstuff

En test final si votre configuration est bonne vous devriez pouvoir envoyer un mail depuis un service neutre (Gmail

yahoo hellip) et le voir dans votre arborescence (ici homevmaildomainetld)

Installation du paquet Debian et configuration de lighttpd

Commencez par reacutecupeacuterer le paquet deb agrave lrsquoadresse suivante httpswwwintimailpwintimaildeb

Installez ensuite GDebi Il srsquoagit drsquoun dpkg ameacutelioreacute pour teacuteleacutecharger les deacutependances automatiquement ce que

dpkg ne gegravere pas

apt-get update

apt-get install gdebi-core

10

Vous pouvez alors installer le paquet

gdebi intimaildeb

Vous aurez alors le site web drsquointiMail deacuteployeacute au chemin varwwwwebmail

Il ne vous reste plus qursquoagrave changer la configuration de lighttpd votre serveur web pour mettre en ligne le site

Vous pouvez pour cela copier-coller la configuration suivante mais veillez agrave bien changer lrsquoadresse IP preacutesente au

deacutebut de la partie SSL CONFIG avec votre adresse IP

serv ermodules = ( mod_access

mod_accesslog

mod_alias

mod_compress

mod_redirect

mod_rewrite

)

Hide server version

servertag = Such Headers Very try Now close telnet

serverdocument-root = varwwwwebmail

serverupload-dirs = ( varwwwwebmailuploads )

servererrorlog = varloglighttpderrorlog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

serverport = 80

accesslogformat = V h l u t r gts b Refereri

User-Agenti

accesslogfilename = varloglighttpdaccesslog

index-filenames = ( indexphp indexhtml

indexlighttpdhtml )

urlaccess-deny = ( ~ inc )

static-fileexclude-extensions = ( php pl fcgi )

compresscache-dir = varcachelighttpdcompress

compressfiletype = ( applicationjavascript textcss

texthtml textplain )

default listening port for IPv6 falls back to the IPv4 port

include_shell usrsharelighttpduse-ipv6pl + serverport

include_shell usrsharelighttpdcreate-mimeassignpl

include_shell usrsharelighttpdinclude-conf-enabledpl

SSL CONFIG

$SERVER[socket] == 5234485443

sslengine = enable

11

sslpemfile = etclighttpdsslintimailpwpem

sslca-file = etclighttpdsslintimailpwcrt

servername = intimailpw

votre configuration habituelle pour ce domaine

serverdocument-root = varwwwwebmail

servererrorlog = varloglighttpderror_ssllog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

Rewrite des URL pour masquer php

urlrewrite-once = ( ^()$ =gt $1 )

urlrewrite-if-not-file = ( ^([^])()$ =gt $1php$2 )

servernetwork-backend = writev

Deacutependances Slapd

Ldap-utils

Postfix

Postfix-ldap

Bind9

Lighttpd

12

Sources httpswikigandinetfrhostingusing-linuxtutorialsdebianmail-server-ldap

httpwwwpostfixorgpipe8html

httpwwwpostfixorgFILTER_READMEhtml

httpwwwpostfixorg

httpwwwpostfixorgtransport5html

Page 21: Système d'hébergement domestique...place sur les domaines .pw par Gandi.net, notre fournisseur. Nous n’avons donc pas pu l’implémenter. Nous avons configuré Postfix pour qu’il

Ces chiffres sont releveacutes sur un systegraveme avec cameacutera connecteacutee HDMI connecteacute et

cacircble ethernet brancheacute et actif

On peut constater que globalement notre systegraveme Pi 2 B tournant sans

interface graphique sans composant suppleacutementaire sans sortie videacuteo ni cameacutera

avec plusieurs serveurs tournant tout en restant le plus leacuteger possible et demeurant

~99 idle la plupart du temps ne devrait pas deacutepasser une consommation de

300mA grand maximum

Fig 13 Un processeur tregraves tregraves peu chargeacute et une meacutemoire relativement libre

Nous avions lrsquoanneacutee derniegravere deacutejagrave reacutealiseacute un circuit permettant drsquoadapter un

panneau solaire sur une batterie USB classique de 9000mAh Nous avions alors pu

mesurer lrsquointensiteacute deacutelivreacutee par le panneau solaire En cas drsquoensoleillement moyen

habituel dans nos contreacutees le panneau solaire deacutebitait 400mA et pouvait atteindre

le double quand le soleil eacutetait directement preacutesent pour environ 800mA deacutebiteacute

Ce panneau solaire accompagneacute de son circuit drsquoadaptation devrait donc

suffire pour alimenter notre systegraveme la journeacutee le brancher ensuite sur une batterie

portable permet de stocker le surplus pour la nuit

Fig 14 le circuit drsquoadaptation

Fig 15 et son PCB

Eacutevolutions possibles

Webmail

Concernant les eacutevolutions possibles que nous aurions aimeacute apporter agrave notre

projet avec plus de temps commenccedilons par le web Nous aurions souhaiteacute apporter

la gestion de lrsquoenvoi de plusieurs piegraveces jointes comme nous lrsquoavons fait pour la

reacuteception

De plus nous aurions voulu inteacutegrer une corbeille ougrave lesmessages pourraient

aller avant drsquoecirctre deacutefinitivement supprimeacutes du systegraveme drsquoautant que nous avons

deacutejagrave eacutecrites les fonctions PHP permettant de retirer une en-tecircte drsquoun fichier JSON et

le fichier mail associeacute

Enfin nous aurions aimeacute en plus du blocage deacutejagrave preacutesent impleacutementer une

gestion plus profonde des piegravece jointes permettant notamment le remplissage de la

boicircte de spams

Systegraveme

Il aurait eacuteteacute inteacuteressant de notifier lrsquoexpeacutediteur lorsque le mail nrsquoa pas pu ecirctre

deacutelivreacute agrave un utilisateur lorsque son quota est plein En toute logique cela devrait ecirctre

fait simplement avec la commande Sendmail

Une meilleur gestion du trafic mail indeacutesirable aurait eacuteteacute la bienvenue En

effet malgreacute la limitation du spam il restera toujours une partie du volume de mail

qui sera indeacutesirable (pub pishing scam hellip)

Eacutetant donneacute la taille du systegraveme nous avions penseacute agrave une approche

ldquomachine learningrdquo Lrsquoutilisateur indiquerait pourquoi il considegravere le mail comme

indeacutesirable constituant des regravegles refusant certains mails Les mails provenant de

cet expeacutediteur pourraient ecirctre deacutetecteacute par le script agrave la reacuteception et

automatiquement envoyeacutes dans la boicircte de spams

Partie eacutenergeacutetique

Mecircme si la solution au panneau solaire ne pose aucun problegraveme en theacuteorie

nous aurions deacutejagrave dans un premier temps aimeacute lrsquoimpleacutementer en pratique Nous

nrsquoavons finalement pas reacutealiseacute notre objectif de deacutetecter deux cas drsquoalimentation

diffeacuterents soit lrsquoalimentation via panneau solaire est suffisante dans ce cas il

alimente la batterie et donc la Raspberry soit quand ce courant nrsquoest pas suffisant

on alimente la batterie par le secteur

Conclusion

En conclusion nous pensons avoir reacutepondu au cahier des charges initial dans

sa majeure partie Nous sommes aujourdrsquohui en mesure de proposer une solution

mail domestique priveacutee et personnalisable par un particulier

Notre installation de Debian a eacuteteacute au maximum alleacutegeacutee pour notre utilisation

sans interface graphique et nous avons mis en place une reacuteponse aux diverses

attaques que nous avons pu subir lors de lamise en place de notre solution logicielle

En outre le pare-feu avec notre systegraveme de liste noire bloque une partie des

attaques qui peuvent nous parvenir

Nos diffeacuterents scripts de pare-feu de gestion drsquoun mail entrant associeacute au

webmail permettent agrave un utilisateur drsquoacceacuteder aux fonctions usuelles associeacutees agrave

lrsquoenvoi et la reacuteception de mails

Gracircce agrave sa configuration personnalisable notre projet devrait pouvoir ecirctre

porteacute sur un domaine et une adresse IP diffeacuterente sans soucis et ecirctre deacuteployeacute

partout ougrave des gens souhaitent conserver leur vie priveacutee

Nous regretterons cependant de ne pas avoir exploiteacute la partie eacutenergeacutetique

de ce projet qui portait une probleacutematique inteacuteressante et qui nous parait importante

dans le monde actuel

Ce projet nous aura occupeacute pendant tregraves longtemps et nous sommes fiers du

travail que nous avons accompli Il est agrave nos yeux la preuve de ce que nous savons et

pouvons faire et nous donnera confiance pour notre deacutebut de carriegravere drsquoingeacutenieur

Sources

httpwwwradicaticomwpwp-contentuploads201401Email-Statistics-R

eport-2014-2018-Executive-Summarypdf

httpwwwcommentcamarchenetcontents525-le-protocole-ldap

httpsfrwikipediaorgwikiSimple_Mail_Transfer_Protocol

httpwwwcommentcamarchenetcontents536-pop3-smtp-imap-protocol

es-de-messagerie

httpstoolsietforghtmlrfc2821

httpsfrwikipediaorgwikiInternet_Message_Access_Protocol

httpstoolsietforghtmlrfc3501

httparstechnicacominformation-technology201402how-to-run-your-ow

n-e-mail-server-with-your-own-domain-part-1

httpswwwraspberrypiorgforumsviewtopicphpp=136912

httpstackoverflowcomquestions17394356how-can-i-make-a-bash-com

mand-run-periodically

httpuntroubledorgnullmailer

httpelinuxorgRPi_Hardware

httpraspitv2015raspberry-pi2-power-and-performance-measurement

Annexe 1 Architecture du systegraveme de fichiers

Annexe 2 Scan DNSSTUFF

Depuis httpwwwdnsstuffcomtoolsdnsReport|type=domainampampvalue=intimailpw

Annexe 3 Vue geacuteneacuterale httpswwwintimailpw

Annexe 4 Envoyer un mail

Annexe 5 Boite de reacuteception

Annexe 6 Interface drsquoadministration

Annexe 7 Gestion drsquoun utilisateur

Tutorial installation intimailtrade

Table des matiegraveres Apregraves une nouvelle installation de lrsquoOS 2

Seacutecurisation du serveur 2

Changement de lrsquoutilisateur par deacutefaut 2

Changement du port SSH 2

Interdire lrsquoauthentification SSH pour root 2

Installation de LDAP 3

Configuration de base 3

Configuration des Scheacutemas 4

Constitution de la base de donneacutees LDAP 5

Installation de Postfix 7

Installation de Bind9 8

Installation du paquet Debian et configuration de lighttpd 9

Deacutependances 11

Sources 12

2

Apregraves une nouvelle installation de lrsquoOS Exeacutecutez ces commandes pour mettre agrave jour agrave la derniegravere version Ces opeacuterations peuvent prendre un certain

temps Nous avons utiliseacute pour cet exemple Raspbian Jessie Lite sur une Raspberry Pi 2

apt-get update

apt-get upgrade ampamp apt-get dist-upgrade

apt-get install linux-headers-$(uname -r)

reboot

Puis lancer

raspi-config

Etendre au maximum lrsquoespace de stockage en navigant dans les menus

Expand Filesystem

Reacutegler une ip statique avec la box fichier etcnetworkinterfaces

iface eth0 inet static

address 192168131

netmask 2552552550

gateway 19216811

Nous avons aussi supprimeacute wpasupplicant

Seacutecurisation du serveur

Changement de lrsquoutilisateur par deacutefaut Changez le nom drsquoutilisateur par deacutefaut ainsi que son mot de passe

sudo passwd root

Sortie et login en tant que root puis

usermod -l myuname pi

usermod -m -d homemyuname myuname

groupmod ndashn myuname pi

passwd myuname

Voir cette adresse pour lrsquoutilisation de cleacutes priveacuteespubliques

Changement du port SSH sed ndashi sPort 22Port 2222g etcsshsshd_config

Interdire lrsquoauthentification SSH pour root sed -i sPermitRootLogin yesPermitRootLogin nog etcsshsshd_config

3

Installation de LDAP

Configuration de base Installation du package

apt-get install slapd

Choisir un mot de passe administrateur puis lancer la commande

dpkg-reconfigure slapd

Reacutepondre non agrave la question 1

Entrez le nom de domaine utiliseacute agrave la question 2 sous la forme domainetld

Entrez ce que vous voulez au 3egraveme eacutecran le nom de lrsquoorganisation ne sera pas utiliseacute

Entrez un mot de passe

Choisissez HDB

Choisissez si la base de donneacutees est supprimeacutee agrave la deacutesinstallation de slapd

Deacuteplacez lrsquoancienne base de donneacutees

Nrsquoutilisez pas LDAPv2

Installer les outils de conversion pour ldap (slaptest ldapmodify notamment)

apt-get install ldap-utils

On peut maintenant veacuterifier que la configuration est valable

ldapsearch -x -h localhost -b dc=domainedc=tld -LLL dc=domaine dn

Cette commande doit retourner quelque chose comme

dn dc=domainedc=tld

Il faut maintenant seacutecuriser le serveur LDAP en effet on peut y acceacuteder en anonyme avec la commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=config

(amp(objectClass=olcDatabaseConfig)(olcSuffix=dc=domainedc=tld))

Cette commande retourne un certain nombre drsquoinformations notamment agrave propos des champs suivants

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by none

olcAccess 1to dnbase= by read

olcAccess 2to by read

On va modifier ces champs avec la commande ldapmodify Pour cela on va creacuteer un fichier ldif

cat gt changeAccessldif ltlt EOF

dn olcDatabase=1hdbcn=config

changetype modify

delete olcAccess

-

add olcAccess

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by dn=cn=admindc=domainedc=tld write by none

-

add olcAccess

olcAccess 1to dnbase= by read

-

4

add olcAccess

olcAccess 2to by self write by dn=cn=admindc=domainedc=tld write by

none

-

EOF

On peut maintenant appliquer les changements avec ldapmodify

ldapmodify ndashc ndashY EXTERNAL ndashH ldapi -f changeAccessldif

La commande devrait vous confirmer que la modification srsquoest bien effectueacutee

SASLEXTERNAL authentication started

SASL username gidNumber=0+uidNumber=0cn=peercredcn=externalcn=auth

SASL SSF 0

modifying entry olcDatabase=1hdbcn=config

On peut veacuterifier qursquoon ne peut plus acceacuteder aux informations avec la commande

ldapsearch -x -c -h localhost -b dc=domainedc=tld

On peut veacuterifier la configuration en se connectant en tant qursquoadministrateur

ldapsearch -c -h localhost -b dc=domainedc=tld -D

cn=admindc=domainedc=tld ndashW

Configuration des Scheacutemas Nous allons utiliser les scheacutemas de courier-ldap Pour eacuteviter une manipulation compliqueacutee vous trouverez

directement le scheacutema avec le fichier authldapschema On place ce fichier dans le dossier

mv authldapschema etcldapschema

Nous creacuteons un fichier qui incluera tous les scheacutemas de base en plus du nouveau On peut les afficher avec la

commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

Creacuteation du fichier de configuration pour notre exemple cela donne

mkdir tmpldapconf

cat gt tmpldapconfldapconf ltlt EOF

include etcldapschemacoreschema

include etcldapschemacosineschema

include etcldapschemanisschema

include etcldapschemainetorgpersonschema

include etcldapschemaauthldapschema

EOF

On lance ensuite la commande

slaptest -f tmpldapconfldapconf -F tmpldapconf

Elle revoie un message de succegraves Cette commande a creacuteeacute dans le reacutepertoire tmpldapconf une arborescence

correspondant agrave la configuration de notre LDAP

On modifie le chemin de configuration

5

sed ndashi 0dnauthldap sauthldapauthldapcn=schemacn=config

cn=authldapldif

On supprime ensuite les 7 derniegraveres lignes du fichier

head -n -7 cn=authldapldif gt tmpldif

mv tmpldif cn=authldapldif

On peut maintenant importer notre fichier de configuration Pour ce faire

ldapadd -Y EXTERNAL -H ldapi -f

tmpldapconfcn=configcn=schemacn=authldapldif

Si tout va bien lrsquoentreacutee devrait avoir eacuteteacute ajouteacutee On peut veacuterifier avec la commande vue tout agrave lrsquoheure

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

On devrait voir en plus le nouveau scheacutema authldap

Constitution de la base de donneacutees LDAP Le remplissage de la base se fait agrave lrsquoaide de fichiers ldif Nous donnons ici un exemple de structure

Fichier pour la structure de base

dn dc=maildc=domainedc=tld

o intimailpw

description Global mail tree

dc mail

objectClass top

objectClass dcObject

objectClass organization

dn dc=peopledc=maildc=domainedc=tld

description Informations of all users

o people

dc people

objectClass top

objectClass dcObject

objectClass organization

dn dc=groupsdc=maildc=domainedc=tld

description All groups of users

o groups

dc groups

objectClass top

objectClass dcObject

objectClass organization

6

Fichier pour ajouter un utilisateur

dn cn=jbonddc=peopledc=maildc=domainedc=tld

uid jbond

mail jbonddomainetld

sn Moulin

givenName James

displayName James Bond

mailbox domainetldjbond

quota 50M

homeDirectory homevmail

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAccount

userPassword SSHA367PSXiUAegy8dpJbPU8OepEf8L5ye

Pour obtenir un hash du mot de passe

slappasswd -s password -h SSHA

On peut par la suite ajouter la configuration agrave la base de donneacutees avec la commande

ldapadd -D cn=admindc=domainedc=tld -W -h localhost -f pathtofile

Si les champs proposeacutes ne sont pas suffisants il faudra alors effectuer les modifications dans le fichier autldapschema

proposeacute plus haut et refaire la manipulation de configuration

De plus les standards du Mail deacutecrit par lrsquoIETF (RFC822 63 RFC1123 527 and RFC2821 451) impliquent drsquoavoir une

adresse Postmaster et une Abuse Pour cela nous pourrions creacuteer ces adresses avec la meacutethode vue au-dessus mais

ce nrsquoest pas la meilleure Il est preacutefeacuterable drsquoutiliser un alias comme nous le ferons avec les listes de diffusion Ici nous

proposons de rediriger ces deux adresses vers une adresse administrateur Pour cela la meacutethode est la mecircme sauf

que le fichier ldif nrsquoest pas tout agrave fait identique En voici un exemple

dn cn=postmasterdc=groupsdc=maildc=domainedc=tld

uid postmaster

mail postmasterdomainetld

sn Postmaster

displayName Postmaster

maildrop admindomainetld

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAlias

Pour faire une liste de diffusion la meacutethode est la mecircme Il suffit drsquoajouter toutes les adresses destinataires dans le

champ maildrop seacutepareacutees par des virgules ()

7

Installation de Postfix Installation des packages

apt-get install postfix postfix-ldap

Lors de lrsquoinstallation deux eacutecrans deacutefilent

- Configuration Internet Site

- Valeur par deacutefaut pour le mail name

On creacutee lrsquoutilisateur qui servira agrave exeacutecuter Postfix

groupadd vmail

useradd -g vmail -d homevmail -s binfalse -m vmail

Nous aurons besoin dans la suite des GID et UID creacuteeacutes agrave cet instant Ils peuvent ecirctre afficheacutes avec les commandes

cat etcgroup | grep vmail | cut -d -f3

cat etcpasswd | grep vmail | cut -d -f3

On ajoute les paramegravetres au fichier etcpostfixmaincf (remplacer les valeurs de GID et drsquoUID avec vos valeurs)

smtpd_banner = maildomainetld

virtual_mailbox_base = homevmail

virtual_mailbox_domains = dmainetld

virtual_mailbox_maps = ldapetcpostfixldap_accountscf

virtual_alias_maps = ldapetcpostfixldap_aliasescf

virtual_minimum_uid = 100

virtual_gid_maps = static1001 Remplacez ici par votre valeur de GID

virtual_uid_maps = static1001 Remplacez ici par votre valeur drsquoUID

Il nous faut maintenant constituer nos fichiers de configuration ldap_accountscf

cat gt etcpostfixldap_accountscf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=peopledc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAccount)(mail=s))

result_attribute = mailbox

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

Et pour ldap_aliasescf

cat gt ldap_aliasescf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=groupsdc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAlias)(mail=s))

result_attribute = maildrop

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

8

On peut maintenant veacuterifier la configuration de Postfix avec (cette commande ne doit rien retourner si crsquoest bon)

postfix check

Si crsquoest bon alors on recharge le serveur

postfix reload

On peut alors faire un envoi de mail test via telnet

telnet localhost 25

Si vous souhaitez deacutelivrer les mails agrave votre maniegravere il faut dans le fichier etcpostfixmaincf la ligne

virtual_transport = nomdevotreregle

Et de mecircme dans le fichier etcpostfixmastercf

nomdevotreregle unix - n n - 5 pipe

flags=Rq user=vmail null_sender=

argv=chemindevotreprogramme

Il nous reste maintenant agrave configurer les diffeacuterents enregistrements DNS neacutecessaire au fonctionnement drsquoun serveur

mail Vous pouvez utiliser la solution de votre choix Dans la suite vous trouverez une meacutethode utilisant Bind9

Installation de Bind9 Dans toute cette partie on se situera dans le dossier etcbind Dans la suite notre IP sera abcd

Dans le fichier namedconfoptions on ajoutera dans le champ options

version Not supported

Dans un dossier zones on eacutecrit le fichier dbdomainetld

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122111 Serial

43200 Refresh

3600 Retry

2419200 Expire

86400 ) Negative Cache TTL

IN NS nsdomainetld

IN NS ns11ovhnet

ns IN A abcd

www IN A abcd

IN A abcd

IN MX 10 maildomainetld

mail IN A abcd

Dans le mecircme dossier zones on a cbain-addrarpa

9

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122101 serial

14400 refresh

3600 retry

604800 expire

10800 minimum

)

cbain-addrarpa IN NS nsdomainetld

cbain-addrarpa IN NS ns11ovhnet

d IN PTR maildomainetld

Il faut faire attention agrave bien increacutementer le serial pour chaque modification des fichiers

Dans le fichier namedconflocal

zone domainetld

type master

file etcbindzonesdbdomainetld

allow-transfer 213251128130

notify yes

zone cbain-addrarpa IN

type master

file etcbindzonescbain-addrarpa

allow-transfer 213251128130

Ici 213251128130 est lrsquoadresse IP du serveur ns11ovhnet

Il faut bien sucircr configurer le DNS avec votre fournisseur (Gandi OVH hellip) Pour ccedila amusez-vous bien Vous pouvez

aussi tester votre configuration avec des outils en ligne tels que DNSstuff

En test final si votre configuration est bonne vous devriez pouvoir envoyer un mail depuis un service neutre (Gmail

yahoo hellip) et le voir dans votre arborescence (ici homevmaildomainetld)

Installation du paquet Debian et configuration de lighttpd

Commencez par reacutecupeacuterer le paquet deb agrave lrsquoadresse suivante httpswwwintimailpwintimaildeb

Installez ensuite GDebi Il srsquoagit drsquoun dpkg ameacutelioreacute pour teacuteleacutecharger les deacutependances automatiquement ce que

dpkg ne gegravere pas

apt-get update

apt-get install gdebi-core

10

Vous pouvez alors installer le paquet

gdebi intimaildeb

Vous aurez alors le site web drsquointiMail deacuteployeacute au chemin varwwwwebmail

Il ne vous reste plus qursquoagrave changer la configuration de lighttpd votre serveur web pour mettre en ligne le site

Vous pouvez pour cela copier-coller la configuration suivante mais veillez agrave bien changer lrsquoadresse IP preacutesente au

deacutebut de la partie SSL CONFIG avec votre adresse IP

serv ermodules = ( mod_access

mod_accesslog

mod_alias

mod_compress

mod_redirect

mod_rewrite

)

Hide server version

servertag = Such Headers Very try Now close telnet

serverdocument-root = varwwwwebmail

serverupload-dirs = ( varwwwwebmailuploads )

servererrorlog = varloglighttpderrorlog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

serverport = 80

accesslogformat = V h l u t r gts b Refereri

User-Agenti

accesslogfilename = varloglighttpdaccesslog

index-filenames = ( indexphp indexhtml

indexlighttpdhtml )

urlaccess-deny = ( ~ inc )

static-fileexclude-extensions = ( php pl fcgi )

compresscache-dir = varcachelighttpdcompress

compressfiletype = ( applicationjavascript textcss

texthtml textplain )

default listening port for IPv6 falls back to the IPv4 port

include_shell usrsharelighttpduse-ipv6pl + serverport

include_shell usrsharelighttpdcreate-mimeassignpl

include_shell usrsharelighttpdinclude-conf-enabledpl

SSL CONFIG

$SERVER[socket] == 5234485443

sslengine = enable

11

sslpemfile = etclighttpdsslintimailpwpem

sslca-file = etclighttpdsslintimailpwcrt

servername = intimailpw

votre configuration habituelle pour ce domaine

serverdocument-root = varwwwwebmail

servererrorlog = varloglighttpderror_ssllog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

Rewrite des URL pour masquer php

urlrewrite-once = ( ^()$ =gt $1 )

urlrewrite-if-not-file = ( ^([^])()$ =gt $1php$2 )

servernetwork-backend = writev

Deacutependances Slapd

Ldap-utils

Postfix

Postfix-ldap

Bind9

Lighttpd

12

Sources httpswikigandinetfrhostingusing-linuxtutorialsdebianmail-server-ldap

httpwwwpostfixorgpipe8html

httpwwwpostfixorgFILTER_READMEhtml

httpwwwpostfixorg

httpwwwpostfixorgtransport5html

Page 22: Système d'hébergement domestique...place sur les domaines .pw par Gandi.net, notre fournisseur. Nous n’avons donc pas pu l’implémenter. Nous avons configuré Postfix pour qu’il

Fig 13 Un processeur tregraves tregraves peu chargeacute et une meacutemoire relativement libre

Nous avions lrsquoanneacutee derniegravere deacutejagrave reacutealiseacute un circuit permettant drsquoadapter un

panneau solaire sur une batterie USB classique de 9000mAh Nous avions alors pu

mesurer lrsquointensiteacute deacutelivreacutee par le panneau solaire En cas drsquoensoleillement moyen

habituel dans nos contreacutees le panneau solaire deacutebitait 400mA et pouvait atteindre

le double quand le soleil eacutetait directement preacutesent pour environ 800mA deacutebiteacute

Ce panneau solaire accompagneacute de son circuit drsquoadaptation devrait donc

suffire pour alimenter notre systegraveme la journeacutee le brancher ensuite sur une batterie

portable permet de stocker le surplus pour la nuit

Fig 14 le circuit drsquoadaptation

Fig 15 et son PCB

Eacutevolutions possibles

Webmail

Concernant les eacutevolutions possibles que nous aurions aimeacute apporter agrave notre

projet avec plus de temps commenccedilons par le web Nous aurions souhaiteacute apporter

la gestion de lrsquoenvoi de plusieurs piegraveces jointes comme nous lrsquoavons fait pour la

reacuteception

De plus nous aurions voulu inteacutegrer une corbeille ougrave lesmessages pourraient

aller avant drsquoecirctre deacutefinitivement supprimeacutes du systegraveme drsquoautant que nous avons

deacutejagrave eacutecrites les fonctions PHP permettant de retirer une en-tecircte drsquoun fichier JSON et

le fichier mail associeacute

Enfin nous aurions aimeacute en plus du blocage deacutejagrave preacutesent impleacutementer une

gestion plus profonde des piegravece jointes permettant notamment le remplissage de la

boicircte de spams

Systegraveme

Il aurait eacuteteacute inteacuteressant de notifier lrsquoexpeacutediteur lorsque le mail nrsquoa pas pu ecirctre

deacutelivreacute agrave un utilisateur lorsque son quota est plein En toute logique cela devrait ecirctre

fait simplement avec la commande Sendmail

Une meilleur gestion du trafic mail indeacutesirable aurait eacuteteacute la bienvenue En

effet malgreacute la limitation du spam il restera toujours une partie du volume de mail

qui sera indeacutesirable (pub pishing scam hellip)

Eacutetant donneacute la taille du systegraveme nous avions penseacute agrave une approche

ldquomachine learningrdquo Lrsquoutilisateur indiquerait pourquoi il considegravere le mail comme

indeacutesirable constituant des regravegles refusant certains mails Les mails provenant de

cet expeacutediteur pourraient ecirctre deacutetecteacute par le script agrave la reacuteception et

automatiquement envoyeacutes dans la boicircte de spams

Partie eacutenergeacutetique

Mecircme si la solution au panneau solaire ne pose aucun problegraveme en theacuteorie

nous aurions deacutejagrave dans un premier temps aimeacute lrsquoimpleacutementer en pratique Nous

nrsquoavons finalement pas reacutealiseacute notre objectif de deacutetecter deux cas drsquoalimentation

diffeacuterents soit lrsquoalimentation via panneau solaire est suffisante dans ce cas il

alimente la batterie et donc la Raspberry soit quand ce courant nrsquoest pas suffisant

on alimente la batterie par le secteur

Conclusion

En conclusion nous pensons avoir reacutepondu au cahier des charges initial dans

sa majeure partie Nous sommes aujourdrsquohui en mesure de proposer une solution

mail domestique priveacutee et personnalisable par un particulier

Notre installation de Debian a eacuteteacute au maximum alleacutegeacutee pour notre utilisation

sans interface graphique et nous avons mis en place une reacuteponse aux diverses

attaques que nous avons pu subir lors de lamise en place de notre solution logicielle

En outre le pare-feu avec notre systegraveme de liste noire bloque une partie des

attaques qui peuvent nous parvenir

Nos diffeacuterents scripts de pare-feu de gestion drsquoun mail entrant associeacute au

webmail permettent agrave un utilisateur drsquoacceacuteder aux fonctions usuelles associeacutees agrave

lrsquoenvoi et la reacuteception de mails

Gracircce agrave sa configuration personnalisable notre projet devrait pouvoir ecirctre

porteacute sur un domaine et une adresse IP diffeacuterente sans soucis et ecirctre deacuteployeacute

partout ougrave des gens souhaitent conserver leur vie priveacutee

Nous regretterons cependant de ne pas avoir exploiteacute la partie eacutenergeacutetique

de ce projet qui portait une probleacutematique inteacuteressante et qui nous parait importante

dans le monde actuel

Ce projet nous aura occupeacute pendant tregraves longtemps et nous sommes fiers du

travail que nous avons accompli Il est agrave nos yeux la preuve de ce que nous savons et

pouvons faire et nous donnera confiance pour notre deacutebut de carriegravere drsquoingeacutenieur

Sources

httpwwwradicaticomwpwp-contentuploads201401Email-Statistics-R

eport-2014-2018-Executive-Summarypdf

httpwwwcommentcamarchenetcontents525-le-protocole-ldap

httpsfrwikipediaorgwikiSimple_Mail_Transfer_Protocol

httpwwwcommentcamarchenetcontents536-pop3-smtp-imap-protocol

es-de-messagerie

httpstoolsietforghtmlrfc2821

httpsfrwikipediaorgwikiInternet_Message_Access_Protocol

httpstoolsietforghtmlrfc3501

httparstechnicacominformation-technology201402how-to-run-your-ow

n-e-mail-server-with-your-own-domain-part-1

httpswwwraspberrypiorgforumsviewtopicphpp=136912

httpstackoverflowcomquestions17394356how-can-i-make-a-bash-com

mand-run-periodically

httpuntroubledorgnullmailer

httpelinuxorgRPi_Hardware

httpraspitv2015raspberry-pi2-power-and-performance-measurement

Annexe 1 Architecture du systegraveme de fichiers

Annexe 2 Scan DNSSTUFF

Depuis httpwwwdnsstuffcomtoolsdnsReport|type=domainampampvalue=intimailpw

Annexe 3 Vue geacuteneacuterale httpswwwintimailpw

Annexe 4 Envoyer un mail

Annexe 5 Boite de reacuteception

Annexe 6 Interface drsquoadministration

Annexe 7 Gestion drsquoun utilisateur

Tutorial installation intimailtrade

Table des matiegraveres Apregraves une nouvelle installation de lrsquoOS 2

Seacutecurisation du serveur 2

Changement de lrsquoutilisateur par deacutefaut 2

Changement du port SSH 2

Interdire lrsquoauthentification SSH pour root 2

Installation de LDAP 3

Configuration de base 3

Configuration des Scheacutemas 4

Constitution de la base de donneacutees LDAP 5

Installation de Postfix 7

Installation de Bind9 8

Installation du paquet Debian et configuration de lighttpd 9

Deacutependances 11

Sources 12

2

Apregraves une nouvelle installation de lrsquoOS Exeacutecutez ces commandes pour mettre agrave jour agrave la derniegravere version Ces opeacuterations peuvent prendre un certain

temps Nous avons utiliseacute pour cet exemple Raspbian Jessie Lite sur une Raspberry Pi 2

apt-get update

apt-get upgrade ampamp apt-get dist-upgrade

apt-get install linux-headers-$(uname -r)

reboot

Puis lancer

raspi-config

Etendre au maximum lrsquoespace de stockage en navigant dans les menus

Expand Filesystem

Reacutegler une ip statique avec la box fichier etcnetworkinterfaces

iface eth0 inet static

address 192168131

netmask 2552552550

gateway 19216811

Nous avons aussi supprimeacute wpasupplicant

Seacutecurisation du serveur

Changement de lrsquoutilisateur par deacutefaut Changez le nom drsquoutilisateur par deacutefaut ainsi que son mot de passe

sudo passwd root

Sortie et login en tant que root puis

usermod -l myuname pi

usermod -m -d homemyuname myuname

groupmod ndashn myuname pi

passwd myuname

Voir cette adresse pour lrsquoutilisation de cleacutes priveacuteespubliques

Changement du port SSH sed ndashi sPort 22Port 2222g etcsshsshd_config

Interdire lrsquoauthentification SSH pour root sed -i sPermitRootLogin yesPermitRootLogin nog etcsshsshd_config

3

Installation de LDAP

Configuration de base Installation du package

apt-get install slapd

Choisir un mot de passe administrateur puis lancer la commande

dpkg-reconfigure slapd

Reacutepondre non agrave la question 1

Entrez le nom de domaine utiliseacute agrave la question 2 sous la forme domainetld

Entrez ce que vous voulez au 3egraveme eacutecran le nom de lrsquoorganisation ne sera pas utiliseacute

Entrez un mot de passe

Choisissez HDB

Choisissez si la base de donneacutees est supprimeacutee agrave la deacutesinstallation de slapd

Deacuteplacez lrsquoancienne base de donneacutees

Nrsquoutilisez pas LDAPv2

Installer les outils de conversion pour ldap (slaptest ldapmodify notamment)

apt-get install ldap-utils

On peut maintenant veacuterifier que la configuration est valable

ldapsearch -x -h localhost -b dc=domainedc=tld -LLL dc=domaine dn

Cette commande doit retourner quelque chose comme

dn dc=domainedc=tld

Il faut maintenant seacutecuriser le serveur LDAP en effet on peut y acceacuteder en anonyme avec la commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=config

(amp(objectClass=olcDatabaseConfig)(olcSuffix=dc=domainedc=tld))

Cette commande retourne un certain nombre drsquoinformations notamment agrave propos des champs suivants

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by none

olcAccess 1to dnbase= by read

olcAccess 2to by read

On va modifier ces champs avec la commande ldapmodify Pour cela on va creacuteer un fichier ldif

cat gt changeAccessldif ltlt EOF

dn olcDatabase=1hdbcn=config

changetype modify

delete olcAccess

-

add olcAccess

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by dn=cn=admindc=domainedc=tld write by none

-

add olcAccess

olcAccess 1to dnbase= by read

-

4

add olcAccess

olcAccess 2to by self write by dn=cn=admindc=domainedc=tld write by

none

-

EOF

On peut maintenant appliquer les changements avec ldapmodify

ldapmodify ndashc ndashY EXTERNAL ndashH ldapi -f changeAccessldif

La commande devrait vous confirmer que la modification srsquoest bien effectueacutee

SASLEXTERNAL authentication started

SASL username gidNumber=0+uidNumber=0cn=peercredcn=externalcn=auth

SASL SSF 0

modifying entry olcDatabase=1hdbcn=config

On peut veacuterifier qursquoon ne peut plus acceacuteder aux informations avec la commande

ldapsearch -x -c -h localhost -b dc=domainedc=tld

On peut veacuterifier la configuration en se connectant en tant qursquoadministrateur

ldapsearch -c -h localhost -b dc=domainedc=tld -D

cn=admindc=domainedc=tld ndashW

Configuration des Scheacutemas Nous allons utiliser les scheacutemas de courier-ldap Pour eacuteviter une manipulation compliqueacutee vous trouverez

directement le scheacutema avec le fichier authldapschema On place ce fichier dans le dossier

mv authldapschema etcldapschema

Nous creacuteons un fichier qui incluera tous les scheacutemas de base en plus du nouveau On peut les afficher avec la

commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

Creacuteation du fichier de configuration pour notre exemple cela donne

mkdir tmpldapconf

cat gt tmpldapconfldapconf ltlt EOF

include etcldapschemacoreschema

include etcldapschemacosineschema

include etcldapschemanisschema

include etcldapschemainetorgpersonschema

include etcldapschemaauthldapschema

EOF

On lance ensuite la commande

slaptest -f tmpldapconfldapconf -F tmpldapconf

Elle revoie un message de succegraves Cette commande a creacuteeacute dans le reacutepertoire tmpldapconf une arborescence

correspondant agrave la configuration de notre LDAP

On modifie le chemin de configuration

5

sed ndashi 0dnauthldap sauthldapauthldapcn=schemacn=config

cn=authldapldif

On supprime ensuite les 7 derniegraveres lignes du fichier

head -n -7 cn=authldapldif gt tmpldif

mv tmpldif cn=authldapldif

On peut maintenant importer notre fichier de configuration Pour ce faire

ldapadd -Y EXTERNAL -H ldapi -f

tmpldapconfcn=configcn=schemacn=authldapldif

Si tout va bien lrsquoentreacutee devrait avoir eacuteteacute ajouteacutee On peut veacuterifier avec la commande vue tout agrave lrsquoheure

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

On devrait voir en plus le nouveau scheacutema authldap

Constitution de la base de donneacutees LDAP Le remplissage de la base se fait agrave lrsquoaide de fichiers ldif Nous donnons ici un exemple de structure

Fichier pour la structure de base

dn dc=maildc=domainedc=tld

o intimailpw

description Global mail tree

dc mail

objectClass top

objectClass dcObject

objectClass organization

dn dc=peopledc=maildc=domainedc=tld

description Informations of all users

o people

dc people

objectClass top

objectClass dcObject

objectClass organization

dn dc=groupsdc=maildc=domainedc=tld

description All groups of users

o groups

dc groups

objectClass top

objectClass dcObject

objectClass organization

6

Fichier pour ajouter un utilisateur

dn cn=jbonddc=peopledc=maildc=domainedc=tld

uid jbond

mail jbonddomainetld

sn Moulin

givenName James

displayName James Bond

mailbox domainetldjbond

quota 50M

homeDirectory homevmail

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAccount

userPassword SSHA367PSXiUAegy8dpJbPU8OepEf8L5ye

Pour obtenir un hash du mot de passe

slappasswd -s password -h SSHA

On peut par la suite ajouter la configuration agrave la base de donneacutees avec la commande

ldapadd -D cn=admindc=domainedc=tld -W -h localhost -f pathtofile

Si les champs proposeacutes ne sont pas suffisants il faudra alors effectuer les modifications dans le fichier autldapschema

proposeacute plus haut et refaire la manipulation de configuration

De plus les standards du Mail deacutecrit par lrsquoIETF (RFC822 63 RFC1123 527 and RFC2821 451) impliquent drsquoavoir une

adresse Postmaster et une Abuse Pour cela nous pourrions creacuteer ces adresses avec la meacutethode vue au-dessus mais

ce nrsquoest pas la meilleure Il est preacutefeacuterable drsquoutiliser un alias comme nous le ferons avec les listes de diffusion Ici nous

proposons de rediriger ces deux adresses vers une adresse administrateur Pour cela la meacutethode est la mecircme sauf

que le fichier ldif nrsquoest pas tout agrave fait identique En voici un exemple

dn cn=postmasterdc=groupsdc=maildc=domainedc=tld

uid postmaster

mail postmasterdomainetld

sn Postmaster

displayName Postmaster

maildrop admindomainetld

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAlias

Pour faire une liste de diffusion la meacutethode est la mecircme Il suffit drsquoajouter toutes les adresses destinataires dans le

champ maildrop seacutepareacutees par des virgules ()

7

Installation de Postfix Installation des packages

apt-get install postfix postfix-ldap

Lors de lrsquoinstallation deux eacutecrans deacutefilent

- Configuration Internet Site

- Valeur par deacutefaut pour le mail name

On creacutee lrsquoutilisateur qui servira agrave exeacutecuter Postfix

groupadd vmail

useradd -g vmail -d homevmail -s binfalse -m vmail

Nous aurons besoin dans la suite des GID et UID creacuteeacutes agrave cet instant Ils peuvent ecirctre afficheacutes avec les commandes

cat etcgroup | grep vmail | cut -d -f3

cat etcpasswd | grep vmail | cut -d -f3

On ajoute les paramegravetres au fichier etcpostfixmaincf (remplacer les valeurs de GID et drsquoUID avec vos valeurs)

smtpd_banner = maildomainetld

virtual_mailbox_base = homevmail

virtual_mailbox_domains = dmainetld

virtual_mailbox_maps = ldapetcpostfixldap_accountscf

virtual_alias_maps = ldapetcpostfixldap_aliasescf

virtual_minimum_uid = 100

virtual_gid_maps = static1001 Remplacez ici par votre valeur de GID

virtual_uid_maps = static1001 Remplacez ici par votre valeur drsquoUID

Il nous faut maintenant constituer nos fichiers de configuration ldap_accountscf

cat gt etcpostfixldap_accountscf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=peopledc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAccount)(mail=s))

result_attribute = mailbox

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

Et pour ldap_aliasescf

cat gt ldap_aliasescf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=groupsdc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAlias)(mail=s))

result_attribute = maildrop

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

8

On peut maintenant veacuterifier la configuration de Postfix avec (cette commande ne doit rien retourner si crsquoest bon)

postfix check

Si crsquoest bon alors on recharge le serveur

postfix reload

On peut alors faire un envoi de mail test via telnet

telnet localhost 25

Si vous souhaitez deacutelivrer les mails agrave votre maniegravere il faut dans le fichier etcpostfixmaincf la ligne

virtual_transport = nomdevotreregle

Et de mecircme dans le fichier etcpostfixmastercf

nomdevotreregle unix - n n - 5 pipe

flags=Rq user=vmail null_sender=

argv=chemindevotreprogramme

Il nous reste maintenant agrave configurer les diffeacuterents enregistrements DNS neacutecessaire au fonctionnement drsquoun serveur

mail Vous pouvez utiliser la solution de votre choix Dans la suite vous trouverez une meacutethode utilisant Bind9

Installation de Bind9 Dans toute cette partie on se situera dans le dossier etcbind Dans la suite notre IP sera abcd

Dans le fichier namedconfoptions on ajoutera dans le champ options

version Not supported

Dans un dossier zones on eacutecrit le fichier dbdomainetld

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122111 Serial

43200 Refresh

3600 Retry

2419200 Expire

86400 ) Negative Cache TTL

IN NS nsdomainetld

IN NS ns11ovhnet

ns IN A abcd

www IN A abcd

IN A abcd

IN MX 10 maildomainetld

mail IN A abcd

Dans le mecircme dossier zones on a cbain-addrarpa

9

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122101 serial

14400 refresh

3600 retry

604800 expire

10800 minimum

)

cbain-addrarpa IN NS nsdomainetld

cbain-addrarpa IN NS ns11ovhnet

d IN PTR maildomainetld

Il faut faire attention agrave bien increacutementer le serial pour chaque modification des fichiers

Dans le fichier namedconflocal

zone domainetld

type master

file etcbindzonesdbdomainetld

allow-transfer 213251128130

notify yes

zone cbain-addrarpa IN

type master

file etcbindzonescbain-addrarpa

allow-transfer 213251128130

Ici 213251128130 est lrsquoadresse IP du serveur ns11ovhnet

Il faut bien sucircr configurer le DNS avec votre fournisseur (Gandi OVH hellip) Pour ccedila amusez-vous bien Vous pouvez

aussi tester votre configuration avec des outils en ligne tels que DNSstuff

En test final si votre configuration est bonne vous devriez pouvoir envoyer un mail depuis un service neutre (Gmail

yahoo hellip) et le voir dans votre arborescence (ici homevmaildomainetld)

Installation du paquet Debian et configuration de lighttpd

Commencez par reacutecupeacuterer le paquet deb agrave lrsquoadresse suivante httpswwwintimailpwintimaildeb

Installez ensuite GDebi Il srsquoagit drsquoun dpkg ameacutelioreacute pour teacuteleacutecharger les deacutependances automatiquement ce que

dpkg ne gegravere pas

apt-get update

apt-get install gdebi-core

10

Vous pouvez alors installer le paquet

gdebi intimaildeb

Vous aurez alors le site web drsquointiMail deacuteployeacute au chemin varwwwwebmail

Il ne vous reste plus qursquoagrave changer la configuration de lighttpd votre serveur web pour mettre en ligne le site

Vous pouvez pour cela copier-coller la configuration suivante mais veillez agrave bien changer lrsquoadresse IP preacutesente au

deacutebut de la partie SSL CONFIG avec votre adresse IP

serv ermodules = ( mod_access

mod_accesslog

mod_alias

mod_compress

mod_redirect

mod_rewrite

)

Hide server version

servertag = Such Headers Very try Now close telnet

serverdocument-root = varwwwwebmail

serverupload-dirs = ( varwwwwebmailuploads )

servererrorlog = varloglighttpderrorlog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

serverport = 80

accesslogformat = V h l u t r gts b Refereri

User-Agenti

accesslogfilename = varloglighttpdaccesslog

index-filenames = ( indexphp indexhtml

indexlighttpdhtml )

urlaccess-deny = ( ~ inc )

static-fileexclude-extensions = ( php pl fcgi )

compresscache-dir = varcachelighttpdcompress

compressfiletype = ( applicationjavascript textcss

texthtml textplain )

default listening port for IPv6 falls back to the IPv4 port

include_shell usrsharelighttpduse-ipv6pl + serverport

include_shell usrsharelighttpdcreate-mimeassignpl

include_shell usrsharelighttpdinclude-conf-enabledpl

SSL CONFIG

$SERVER[socket] == 5234485443

sslengine = enable

11

sslpemfile = etclighttpdsslintimailpwpem

sslca-file = etclighttpdsslintimailpwcrt

servername = intimailpw

votre configuration habituelle pour ce domaine

serverdocument-root = varwwwwebmail

servererrorlog = varloglighttpderror_ssllog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

Rewrite des URL pour masquer php

urlrewrite-once = ( ^()$ =gt $1 )

urlrewrite-if-not-file = ( ^([^])()$ =gt $1php$2 )

servernetwork-backend = writev

Deacutependances Slapd

Ldap-utils

Postfix

Postfix-ldap

Bind9

Lighttpd

12

Sources httpswikigandinetfrhostingusing-linuxtutorialsdebianmail-server-ldap

httpwwwpostfixorgpipe8html

httpwwwpostfixorgFILTER_READMEhtml

httpwwwpostfixorg

httpwwwpostfixorgtransport5html

Page 23: Système d'hébergement domestique...place sur les domaines .pw par Gandi.net, notre fournisseur. Nous n’avons donc pas pu l’implémenter. Nous avons configuré Postfix pour qu’il

Fig 14 le circuit drsquoadaptation

Fig 15 et son PCB

Eacutevolutions possibles

Webmail

Concernant les eacutevolutions possibles que nous aurions aimeacute apporter agrave notre

projet avec plus de temps commenccedilons par le web Nous aurions souhaiteacute apporter

la gestion de lrsquoenvoi de plusieurs piegraveces jointes comme nous lrsquoavons fait pour la

reacuteception

De plus nous aurions voulu inteacutegrer une corbeille ougrave lesmessages pourraient

aller avant drsquoecirctre deacutefinitivement supprimeacutes du systegraveme drsquoautant que nous avons

deacutejagrave eacutecrites les fonctions PHP permettant de retirer une en-tecircte drsquoun fichier JSON et

le fichier mail associeacute

Enfin nous aurions aimeacute en plus du blocage deacutejagrave preacutesent impleacutementer une

gestion plus profonde des piegravece jointes permettant notamment le remplissage de la

boicircte de spams

Systegraveme

Il aurait eacuteteacute inteacuteressant de notifier lrsquoexpeacutediteur lorsque le mail nrsquoa pas pu ecirctre

deacutelivreacute agrave un utilisateur lorsque son quota est plein En toute logique cela devrait ecirctre

fait simplement avec la commande Sendmail

Une meilleur gestion du trafic mail indeacutesirable aurait eacuteteacute la bienvenue En

effet malgreacute la limitation du spam il restera toujours une partie du volume de mail

qui sera indeacutesirable (pub pishing scam hellip)

Eacutetant donneacute la taille du systegraveme nous avions penseacute agrave une approche

ldquomachine learningrdquo Lrsquoutilisateur indiquerait pourquoi il considegravere le mail comme

indeacutesirable constituant des regravegles refusant certains mails Les mails provenant de

cet expeacutediteur pourraient ecirctre deacutetecteacute par le script agrave la reacuteception et

automatiquement envoyeacutes dans la boicircte de spams

Partie eacutenergeacutetique

Mecircme si la solution au panneau solaire ne pose aucun problegraveme en theacuteorie

nous aurions deacutejagrave dans un premier temps aimeacute lrsquoimpleacutementer en pratique Nous

nrsquoavons finalement pas reacutealiseacute notre objectif de deacutetecter deux cas drsquoalimentation

diffeacuterents soit lrsquoalimentation via panneau solaire est suffisante dans ce cas il

alimente la batterie et donc la Raspberry soit quand ce courant nrsquoest pas suffisant

on alimente la batterie par le secteur

Conclusion

En conclusion nous pensons avoir reacutepondu au cahier des charges initial dans

sa majeure partie Nous sommes aujourdrsquohui en mesure de proposer une solution

mail domestique priveacutee et personnalisable par un particulier

Notre installation de Debian a eacuteteacute au maximum alleacutegeacutee pour notre utilisation

sans interface graphique et nous avons mis en place une reacuteponse aux diverses

attaques que nous avons pu subir lors de lamise en place de notre solution logicielle

En outre le pare-feu avec notre systegraveme de liste noire bloque une partie des

attaques qui peuvent nous parvenir

Nos diffeacuterents scripts de pare-feu de gestion drsquoun mail entrant associeacute au

webmail permettent agrave un utilisateur drsquoacceacuteder aux fonctions usuelles associeacutees agrave

lrsquoenvoi et la reacuteception de mails

Gracircce agrave sa configuration personnalisable notre projet devrait pouvoir ecirctre

porteacute sur un domaine et une adresse IP diffeacuterente sans soucis et ecirctre deacuteployeacute

partout ougrave des gens souhaitent conserver leur vie priveacutee

Nous regretterons cependant de ne pas avoir exploiteacute la partie eacutenergeacutetique

de ce projet qui portait une probleacutematique inteacuteressante et qui nous parait importante

dans le monde actuel

Ce projet nous aura occupeacute pendant tregraves longtemps et nous sommes fiers du

travail que nous avons accompli Il est agrave nos yeux la preuve de ce que nous savons et

pouvons faire et nous donnera confiance pour notre deacutebut de carriegravere drsquoingeacutenieur

Sources

httpwwwradicaticomwpwp-contentuploads201401Email-Statistics-R

eport-2014-2018-Executive-Summarypdf

httpwwwcommentcamarchenetcontents525-le-protocole-ldap

httpsfrwikipediaorgwikiSimple_Mail_Transfer_Protocol

httpwwwcommentcamarchenetcontents536-pop3-smtp-imap-protocol

es-de-messagerie

httpstoolsietforghtmlrfc2821

httpsfrwikipediaorgwikiInternet_Message_Access_Protocol

httpstoolsietforghtmlrfc3501

httparstechnicacominformation-technology201402how-to-run-your-ow

n-e-mail-server-with-your-own-domain-part-1

httpswwwraspberrypiorgforumsviewtopicphpp=136912

httpstackoverflowcomquestions17394356how-can-i-make-a-bash-com

mand-run-periodically

httpuntroubledorgnullmailer

httpelinuxorgRPi_Hardware

httpraspitv2015raspberry-pi2-power-and-performance-measurement

Annexe 1 Architecture du systegraveme de fichiers

Annexe 2 Scan DNSSTUFF

Depuis httpwwwdnsstuffcomtoolsdnsReport|type=domainampampvalue=intimailpw

Annexe 3 Vue geacuteneacuterale httpswwwintimailpw

Annexe 4 Envoyer un mail

Annexe 5 Boite de reacuteception

Annexe 6 Interface drsquoadministration

Annexe 7 Gestion drsquoun utilisateur

Tutorial installation intimailtrade

Table des matiegraveres Apregraves une nouvelle installation de lrsquoOS 2

Seacutecurisation du serveur 2

Changement de lrsquoutilisateur par deacutefaut 2

Changement du port SSH 2

Interdire lrsquoauthentification SSH pour root 2

Installation de LDAP 3

Configuration de base 3

Configuration des Scheacutemas 4

Constitution de la base de donneacutees LDAP 5

Installation de Postfix 7

Installation de Bind9 8

Installation du paquet Debian et configuration de lighttpd 9

Deacutependances 11

Sources 12

2

Apregraves une nouvelle installation de lrsquoOS Exeacutecutez ces commandes pour mettre agrave jour agrave la derniegravere version Ces opeacuterations peuvent prendre un certain

temps Nous avons utiliseacute pour cet exemple Raspbian Jessie Lite sur une Raspberry Pi 2

apt-get update

apt-get upgrade ampamp apt-get dist-upgrade

apt-get install linux-headers-$(uname -r)

reboot

Puis lancer

raspi-config

Etendre au maximum lrsquoespace de stockage en navigant dans les menus

Expand Filesystem

Reacutegler une ip statique avec la box fichier etcnetworkinterfaces

iface eth0 inet static

address 192168131

netmask 2552552550

gateway 19216811

Nous avons aussi supprimeacute wpasupplicant

Seacutecurisation du serveur

Changement de lrsquoutilisateur par deacutefaut Changez le nom drsquoutilisateur par deacutefaut ainsi que son mot de passe

sudo passwd root

Sortie et login en tant que root puis

usermod -l myuname pi

usermod -m -d homemyuname myuname

groupmod ndashn myuname pi

passwd myuname

Voir cette adresse pour lrsquoutilisation de cleacutes priveacuteespubliques

Changement du port SSH sed ndashi sPort 22Port 2222g etcsshsshd_config

Interdire lrsquoauthentification SSH pour root sed -i sPermitRootLogin yesPermitRootLogin nog etcsshsshd_config

3

Installation de LDAP

Configuration de base Installation du package

apt-get install slapd

Choisir un mot de passe administrateur puis lancer la commande

dpkg-reconfigure slapd

Reacutepondre non agrave la question 1

Entrez le nom de domaine utiliseacute agrave la question 2 sous la forme domainetld

Entrez ce que vous voulez au 3egraveme eacutecran le nom de lrsquoorganisation ne sera pas utiliseacute

Entrez un mot de passe

Choisissez HDB

Choisissez si la base de donneacutees est supprimeacutee agrave la deacutesinstallation de slapd

Deacuteplacez lrsquoancienne base de donneacutees

Nrsquoutilisez pas LDAPv2

Installer les outils de conversion pour ldap (slaptest ldapmodify notamment)

apt-get install ldap-utils

On peut maintenant veacuterifier que la configuration est valable

ldapsearch -x -h localhost -b dc=domainedc=tld -LLL dc=domaine dn

Cette commande doit retourner quelque chose comme

dn dc=domainedc=tld

Il faut maintenant seacutecuriser le serveur LDAP en effet on peut y acceacuteder en anonyme avec la commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=config

(amp(objectClass=olcDatabaseConfig)(olcSuffix=dc=domainedc=tld))

Cette commande retourne un certain nombre drsquoinformations notamment agrave propos des champs suivants

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by none

olcAccess 1to dnbase= by read

olcAccess 2to by read

On va modifier ces champs avec la commande ldapmodify Pour cela on va creacuteer un fichier ldif

cat gt changeAccessldif ltlt EOF

dn olcDatabase=1hdbcn=config

changetype modify

delete olcAccess

-

add olcAccess

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by dn=cn=admindc=domainedc=tld write by none

-

add olcAccess

olcAccess 1to dnbase= by read

-

4

add olcAccess

olcAccess 2to by self write by dn=cn=admindc=domainedc=tld write by

none

-

EOF

On peut maintenant appliquer les changements avec ldapmodify

ldapmodify ndashc ndashY EXTERNAL ndashH ldapi -f changeAccessldif

La commande devrait vous confirmer que la modification srsquoest bien effectueacutee

SASLEXTERNAL authentication started

SASL username gidNumber=0+uidNumber=0cn=peercredcn=externalcn=auth

SASL SSF 0

modifying entry olcDatabase=1hdbcn=config

On peut veacuterifier qursquoon ne peut plus acceacuteder aux informations avec la commande

ldapsearch -x -c -h localhost -b dc=domainedc=tld

On peut veacuterifier la configuration en se connectant en tant qursquoadministrateur

ldapsearch -c -h localhost -b dc=domainedc=tld -D

cn=admindc=domainedc=tld ndashW

Configuration des Scheacutemas Nous allons utiliser les scheacutemas de courier-ldap Pour eacuteviter une manipulation compliqueacutee vous trouverez

directement le scheacutema avec le fichier authldapschema On place ce fichier dans le dossier

mv authldapschema etcldapschema

Nous creacuteons un fichier qui incluera tous les scheacutemas de base en plus du nouveau On peut les afficher avec la

commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

Creacuteation du fichier de configuration pour notre exemple cela donne

mkdir tmpldapconf

cat gt tmpldapconfldapconf ltlt EOF

include etcldapschemacoreschema

include etcldapschemacosineschema

include etcldapschemanisschema

include etcldapschemainetorgpersonschema

include etcldapschemaauthldapschema

EOF

On lance ensuite la commande

slaptest -f tmpldapconfldapconf -F tmpldapconf

Elle revoie un message de succegraves Cette commande a creacuteeacute dans le reacutepertoire tmpldapconf une arborescence

correspondant agrave la configuration de notre LDAP

On modifie le chemin de configuration

5

sed ndashi 0dnauthldap sauthldapauthldapcn=schemacn=config

cn=authldapldif

On supprime ensuite les 7 derniegraveres lignes du fichier

head -n -7 cn=authldapldif gt tmpldif

mv tmpldif cn=authldapldif

On peut maintenant importer notre fichier de configuration Pour ce faire

ldapadd -Y EXTERNAL -H ldapi -f

tmpldapconfcn=configcn=schemacn=authldapldif

Si tout va bien lrsquoentreacutee devrait avoir eacuteteacute ajouteacutee On peut veacuterifier avec la commande vue tout agrave lrsquoheure

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

On devrait voir en plus le nouveau scheacutema authldap

Constitution de la base de donneacutees LDAP Le remplissage de la base se fait agrave lrsquoaide de fichiers ldif Nous donnons ici un exemple de structure

Fichier pour la structure de base

dn dc=maildc=domainedc=tld

o intimailpw

description Global mail tree

dc mail

objectClass top

objectClass dcObject

objectClass organization

dn dc=peopledc=maildc=domainedc=tld

description Informations of all users

o people

dc people

objectClass top

objectClass dcObject

objectClass organization

dn dc=groupsdc=maildc=domainedc=tld

description All groups of users

o groups

dc groups

objectClass top

objectClass dcObject

objectClass organization

6

Fichier pour ajouter un utilisateur

dn cn=jbonddc=peopledc=maildc=domainedc=tld

uid jbond

mail jbonddomainetld

sn Moulin

givenName James

displayName James Bond

mailbox domainetldjbond

quota 50M

homeDirectory homevmail

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAccount

userPassword SSHA367PSXiUAegy8dpJbPU8OepEf8L5ye

Pour obtenir un hash du mot de passe

slappasswd -s password -h SSHA

On peut par la suite ajouter la configuration agrave la base de donneacutees avec la commande

ldapadd -D cn=admindc=domainedc=tld -W -h localhost -f pathtofile

Si les champs proposeacutes ne sont pas suffisants il faudra alors effectuer les modifications dans le fichier autldapschema

proposeacute plus haut et refaire la manipulation de configuration

De plus les standards du Mail deacutecrit par lrsquoIETF (RFC822 63 RFC1123 527 and RFC2821 451) impliquent drsquoavoir une

adresse Postmaster et une Abuse Pour cela nous pourrions creacuteer ces adresses avec la meacutethode vue au-dessus mais

ce nrsquoest pas la meilleure Il est preacutefeacuterable drsquoutiliser un alias comme nous le ferons avec les listes de diffusion Ici nous

proposons de rediriger ces deux adresses vers une adresse administrateur Pour cela la meacutethode est la mecircme sauf

que le fichier ldif nrsquoest pas tout agrave fait identique En voici un exemple

dn cn=postmasterdc=groupsdc=maildc=domainedc=tld

uid postmaster

mail postmasterdomainetld

sn Postmaster

displayName Postmaster

maildrop admindomainetld

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAlias

Pour faire une liste de diffusion la meacutethode est la mecircme Il suffit drsquoajouter toutes les adresses destinataires dans le

champ maildrop seacutepareacutees par des virgules ()

7

Installation de Postfix Installation des packages

apt-get install postfix postfix-ldap

Lors de lrsquoinstallation deux eacutecrans deacutefilent

- Configuration Internet Site

- Valeur par deacutefaut pour le mail name

On creacutee lrsquoutilisateur qui servira agrave exeacutecuter Postfix

groupadd vmail

useradd -g vmail -d homevmail -s binfalse -m vmail

Nous aurons besoin dans la suite des GID et UID creacuteeacutes agrave cet instant Ils peuvent ecirctre afficheacutes avec les commandes

cat etcgroup | grep vmail | cut -d -f3

cat etcpasswd | grep vmail | cut -d -f3

On ajoute les paramegravetres au fichier etcpostfixmaincf (remplacer les valeurs de GID et drsquoUID avec vos valeurs)

smtpd_banner = maildomainetld

virtual_mailbox_base = homevmail

virtual_mailbox_domains = dmainetld

virtual_mailbox_maps = ldapetcpostfixldap_accountscf

virtual_alias_maps = ldapetcpostfixldap_aliasescf

virtual_minimum_uid = 100

virtual_gid_maps = static1001 Remplacez ici par votre valeur de GID

virtual_uid_maps = static1001 Remplacez ici par votre valeur drsquoUID

Il nous faut maintenant constituer nos fichiers de configuration ldap_accountscf

cat gt etcpostfixldap_accountscf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=peopledc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAccount)(mail=s))

result_attribute = mailbox

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

Et pour ldap_aliasescf

cat gt ldap_aliasescf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=groupsdc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAlias)(mail=s))

result_attribute = maildrop

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

8

On peut maintenant veacuterifier la configuration de Postfix avec (cette commande ne doit rien retourner si crsquoest bon)

postfix check

Si crsquoest bon alors on recharge le serveur

postfix reload

On peut alors faire un envoi de mail test via telnet

telnet localhost 25

Si vous souhaitez deacutelivrer les mails agrave votre maniegravere il faut dans le fichier etcpostfixmaincf la ligne

virtual_transport = nomdevotreregle

Et de mecircme dans le fichier etcpostfixmastercf

nomdevotreregle unix - n n - 5 pipe

flags=Rq user=vmail null_sender=

argv=chemindevotreprogramme

Il nous reste maintenant agrave configurer les diffeacuterents enregistrements DNS neacutecessaire au fonctionnement drsquoun serveur

mail Vous pouvez utiliser la solution de votre choix Dans la suite vous trouverez une meacutethode utilisant Bind9

Installation de Bind9 Dans toute cette partie on se situera dans le dossier etcbind Dans la suite notre IP sera abcd

Dans le fichier namedconfoptions on ajoutera dans le champ options

version Not supported

Dans un dossier zones on eacutecrit le fichier dbdomainetld

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122111 Serial

43200 Refresh

3600 Retry

2419200 Expire

86400 ) Negative Cache TTL

IN NS nsdomainetld

IN NS ns11ovhnet

ns IN A abcd

www IN A abcd

IN A abcd

IN MX 10 maildomainetld

mail IN A abcd

Dans le mecircme dossier zones on a cbain-addrarpa

9

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122101 serial

14400 refresh

3600 retry

604800 expire

10800 minimum

)

cbain-addrarpa IN NS nsdomainetld

cbain-addrarpa IN NS ns11ovhnet

d IN PTR maildomainetld

Il faut faire attention agrave bien increacutementer le serial pour chaque modification des fichiers

Dans le fichier namedconflocal

zone domainetld

type master

file etcbindzonesdbdomainetld

allow-transfer 213251128130

notify yes

zone cbain-addrarpa IN

type master

file etcbindzonescbain-addrarpa

allow-transfer 213251128130

Ici 213251128130 est lrsquoadresse IP du serveur ns11ovhnet

Il faut bien sucircr configurer le DNS avec votre fournisseur (Gandi OVH hellip) Pour ccedila amusez-vous bien Vous pouvez

aussi tester votre configuration avec des outils en ligne tels que DNSstuff

En test final si votre configuration est bonne vous devriez pouvoir envoyer un mail depuis un service neutre (Gmail

yahoo hellip) et le voir dans votre arborescence (ici homevmaildomainetld)

Installation du paquet Debian et configuration de lighttpd

Commencez par reacutecupeacuterer le paquet deb agrave lrsquoadresse suivante httpswwwintimailpwintimaildeb

Installez ensuite GDebi Il srsquoagit drsquoun dpkg ameacutelioreacute pour teacuteleacutecharger les deacutependances automatiquement ce que

dpkg ne gegravere pas

apt-get update

apt-get install gdebi-core

10

Vous pouvez alors installer le paquet

gdebi intimaildeb

Vous aurez alors le site web drsquointiMail deacuteployeacute au chemin varwwwwebmail

Il ne vous reste plus qursquoagrave changer la configuration de lighttpd votre serveur web pour mettre en ligne le site

Vous pouvez pour cela copier-coller la configuration suivante mais veillez agrave bien changer lrsquoadresse IP preacutesente au

deacutebut de la partie SSL CONFIG avec votre adresse IP

serv ermodules = ( mod_access

mod_accesslog

mod_alias

mod_compress

mod_redirect

mod_rewrite

)

Hide server version

servertag = Such Headers Very try Now close telnet

serverdocument-root = varwwwwebmail

serverupload-dirs = ( varwwwwebmailuploads )

servererrorlog = varloglighttpderrorlog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

serverport = 80

accesslogformat = V h l u t r gts b Refereri

User-Agenti

accesslogfilename = varloglighttpdaccesslog

index-filenames = ( indexphp indexhtml

indexlighttpdhtml )

urlaccess-deny = ( ~ inc )

static-fileexclude-extensions = ( php pl fcgi )

compresscache-dir = varcachelighttpdcompress

compressfiletype = ( applicationjavascript textcss

texthtml textplain )

default listening port for IPv6 falls back to the IPv4 port

include_shell usrsharelighttpduse-ipv6pl + serverport

include_shell usrsharelighttpdcreate-mimeassignpl

include_shell usrsharelighttpdinclude-conf-enabledpl

SSL CONFIG

$SERVER[socket] == 5234485443

sslengine = enable

11

sslpemfile = etclighttpdsslintimailpwpem

sslca-file = etclighttpdsslintimailpwcrt

servername = intimailpw

votre configuration habituelle pour ce domaine

serverdocument-root = varwwwwebmail

servererrorlog = varloglighttpderror_ssllog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

Rewrite des URL pour masquer php

urlrewrite-once = ( ^()$ =gt $1 )

urlrewrite-if-not-file = ( ^([^])()$ =gt $1php$2 )

servernetwork-backend = writev

Deacutependances Slapd

Ldap-utils

Postfix

Postfix-ldap

Bind9

Lighttpd

12

Sources httpswikigandinetfrhostingusing-linuxtutorialsdebianmail-server-ldap

httpwwwpostfixorgpipe8html

httpwwwpostfixorgFILTER_READMEhtml

httpwwwpostfixorg

httpwwwpostfixorgtransport5html

Page 24: Système d'hébergement domestique...place sur les domaines .pw par Gandi.net, notre fournisseur. Nous n’avons donc pas pu l’implémenter. Nous avons configuré Postfix pour qu’il

la gestion de lrsquoenvoi de plusieurs piegraveces jointes comme nous lrsquoavons fait pour la

reacuteception

De plus nous aurions voulu inteacutegrer une corbeille ougrave lesmessages pourraient

aller avant drsquoecirctre deacutefinitivement supprimeacutes du systegraveme drsquoautant que nous avons

deacutejagrave eacutecrites les fonctions PHP permettant de retirer une en-tecircte drsquoun fichier JSON et

le fichier mail associeacute

Enfin nous aurions aimeacute en plus du blocage deacutejagrave preacutesent impleacutementer une

gestion plus profonde des piegravece jointes permettant notamment le remplissage de la

boicircte de spams

Systegraveme

Il aurait eacuteteacute inteacuteressant de notifier lrsquoexpeacutediteur lorsque le mail nrsquoa pas pu ecirctre

deacutelivreacute agrave un utilisateur lorsque son quota est plein En toute logique cela devrait ecirctre

fait simplement avec la commande Sendmail

Une meilleur gestion du trafic mail indeacutesirable aurait eacuteteacute la bienvenue En

effet malgreacute la limitation du spam il restera toujours une partie du volume de mail

qui sera indeacutesirable (pub pishing scam hellip)

Eacutetant donneacute la taille du systegraveme nous avions penseacute agrave une approche

ldquomachine learningrdquo Lrsquoutilisateur indiquerait pourquoi il considegravere le mail comme

indeacutesirable constituant des regravegles refusant certains mails Les mails provenant de

cet expeacutediteur pourraient ecirctre deacutetecteacute par le script agrave la reacuteception et

automatiquement envoyeacutes dans la boicircte de spams

Partie eacutenergeacutetique

Mecircme si la solution au panneau solaire ne pose aucun problegraveme en theacuteorie

nous aurions deacutejagrave dans un premier temps aimeacute lrsquoimpleacutementer en pratique Nous

nrsquoavons finalement pas reacutealiseacute notre objectif de deacutetecter deux cas drsquoalimentation

diffeacuterents soit lrsquoalimentation via panneau solaire est suffisante dans ce cas il

alimente la batterie et donc la Raspberry soit quand ce courant nrsquoest pas suffisant

on alimente la batterie par le secteur

Conclusion

En conclusion nous pensons avoir reacutepondu au cahier des charges initial dans

sa majeure partie Nous sommes aujourdrsquohui en mesure de proposer une solution

mail domestique priveacutee et personnalisable par un particulier

Notre installation de Debian a eacuteteacute au maximum alleacutegeacutee pour notre utilisation

sans interface graphique et nous avons mis en place une reacuteponse aux diverses

attaques que nous avons pu subir lors de lamise en place de notre solution logicielle

En outre le pare-feu avec notre systegraveme de liste noire bloque une partie des

attaques qui peuvent nous parvenir

Nos diffeacuterents scripts de pare-feu de gestion drsquoun mail entrant associeacute au

webmail permettent agrave un utilisateur drsquoacceacuteder aux fonctions usuelles associeacutees agrave

lrsquoenvoi et la reacuteception de mails

Gracircce agrave sa configuration personnalisable notre projet devrait pouvoir ecirctre

porteacute sur un domaine et une adresse IP diffeacuterente sans soucis et ecirctre deacuteployeacute

partout ougrave des gens souhaitent conserver leur vie priveacutee

Nous regretterons cependant de ne pas avoir exploiteacute la partie eacutenergeacutetique

de ce projet qui portait une probleacutematique inteacuteressante et qui nous parait importante

dans le monde actuel

Ce projet nous aura occupeacute pendant tregraves longtemps et nous sommes fiers du

travail que nous avons accompli Il est agrave nos yeux la preuve de ce que nous savons et

pouvons faire et nous donnera confiance pour notre deacutebut de carriegravere drsquoingeacutenieur

Sources

httpwwwradicaticomwpwp-contentuploads201401Email-Statistics-R

eport-2014-2018-Executive-Summarypdf

httpwwwcommentcamarchenetcontents525-le-protocole-ldap

httpsfrwikipediaorgwikiSimple_Mail_Transfer_Protocol

httpwwwcommentcamarchenetcontents536-pop3-smtp-imap-protocol

es-de-messagerie

httpstoolsietforghtmlrfc2821

httpsfrwikipediaorgwikiInternet_Message_Access_Protocol

httpstoolsietforghtmlrfc3501

httparstechnicacominformation-technology201402how-to-run-your-ow

n-e-mail-server-with-your-own-domain-part-1

httpswwwraspberrypiorgforumsviewtopicphpp=136912

httpstackoverflowcomquestions17394356how-can-i-make-a-bash-com

mand-run-periodically

httpuntroubledorgnullmailer

httpelinuxorgRPi_Hardware

httpraspitv2015raspberry-pi2-power-and-performance-measurement

Annexe 1 Architecture du systegraveme de fichiers

Annexe 2 Scan DNSSTUFF

Depuis httpwwwdnsstuffcomtoolsdnsReport|type=domainampampvalue=intimailpw

Annexe 3 Vue geacuteneacuterale httpswwwintimailpw

Annexe 4 Envoyer un mail

Annexe 5 Boite de reacuteception

Annexe 6 Interface drsquoadministration

Annexe 7 Gestion drsquoun utilisateur

Tutorial installation intimailtrade

Table des matiegraveres Apregraves une nouvelle installation de lrsquoOS 2

Seacutecurisation du serveur 2

Changement de lrsquoutilisateur par deacutefaut 2

Changement du port SSH 2

Interdire lrsquoauthentification SSH pour root 2

Installation de LDAP 3

Configuration de base 3

Configuration des Scheacutemas 4

Constitution de la base de donneacutees LDAP 5

Installation de Postfix 7

Installation de Bind9 8

Installation du paquet Debian et configuration de lighttpd 9

Deacutependances 11

Sources 12

2

Apregraves une nouvelle installation de lrsquoOS Exeacutecutez ces commandes pour mettre agrave jour agrave la derniegravere version Ces opeacuterations peuvent prendre un certain

temps Nous avons utiliseacute pour cet exemple Raspbian Jessie Lite sur une Raspberry Pi 2

apt-get update

apt-get upgrade ampamp apt-get dist-upgrade

apt-get install linux-headers-$(uname -r)

reboot

Puis lancer

raspi-config

Etendre au maximum lrsquoespace de stockage en navigant dans les menus

Expand Filesystem

Reacutegler une ip statique avec la box fichier etcnetworkinterfaces

iface eth0 inet static

address 192168131

netmask 2552552550

gateway 19216811

Nous avons aussi supprimeacute wpasupplicant

Seacutecurisation du serveur

Changement de lrsquoutilisateur par deacutefaut Changez le nom drsquoutilisateur par deacutefaut ainsi que son mot de passe

sudo passwd root

Sortie et login en tant que root puis

usermod -l myuname pi

usermod -m -d homemyuname myuname

groupmod ndashn myuname pi

passwd myuname

Voir cette adresse pour lrsquoutilisation de cleacutes priveacuteespubliques

Changement du port SSH sed ndashi sPort 22Port 2222g etcsshsshd_config

Interdire lrsquoauthentification SSH pour root sed -i sPermitRootLogin yesPermitRootLogin nog etcsshsshd_config

3

Installation de LDAP

Configuration de base Installation du package

apt-get install slapd

Choisir un mot de passe administrateur puis lancer la commande

dpkg-reconfigure slapd

Reacutepondre non agrave la question 1

Entrez le nom de domaine utiliseacute agrave la question 2 sous la forme domainetld

Entrez ce que vous voulez au 3egraveme eacutecran le nom de lrsquoorganisation ne sera pas utiliseacute

Entrez un mot de passe

Choisissez HDB

Choisissez si la base de donneacutees est supprimeacutee agrave la deacutesinstallation de slapd

Deacuteplacez lrsquoancienne base de donneacutees

Nrsquoutilisez pas LDAPv2

Installer les outils de conversion pour ldap (slaptest ldapmodify notamment)

apt-get install ldap-utils

On peut maintenant veacuterifier que la configuration est valable

ldapsearch -x -h localhost -b dc=domainedc=tld -LLL dc=domaine dn

Cette commande doit retourner quelque chose comme

dn dc=domainedc=tld

Il faut maintenant seacutecuriser le serveur LDAP en effet on peut y acceacuteder en anonyme avec la commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=config

(amp(objectClass=olcDatabaseConfig)(olcSuffix=dc=domainedc=tld))

Cette commande retourne un certain nombre drsquoinformations notamment agrave propos des champs suivants

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by none

olcAccess 1to dnbase= by read

olcAccess 2to by read

On va modifier ces champs avec la commande ldapmodify Pour cela on va creacuteer un fichier ldif

cat gt changeAccessldif ltlt EOF

dn olcDatabase=1hdbcn=config

changetype modify

delete olcAccess

-

add olcAccess

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by dn=cn=admindc=domainedc=tld write by none

-

add olcAccess

olcAccess 1to dnbase= by read

-

4

add olcAccess

olcAccess 2to by self write by dn=cn=admindc=domainedc=tld write by

none

-

EOF

On peut maintenant appliquer les changements avec ldapmodify

ldapmodify ndashc ndashY EXTERNAL ndashH ldapi -f changeAccessldif

La commande devrait vous confirmer que la modification srsquoest bien effectueacutee

SASLEXTERNAL authentication started

SASL username gidNumber=0+uidNumber=0cn=peercredcn=externalcn=auth

SASL SSF 0

modifying entry olcDatabase=1hdbcn=config

On peut veacuterifier qursquoon ne peut plus acceacuteder aux informations avec la commande

ldapsearch -x -c -h localhost -b dc=domainedc=tld

On peut veacuterifier la configuration en se connectant en tant qursquoadministrateur

ldapsearch -c -h localhost -b dc=domainedc=tld -D

cn=admindc=domainedc=tld ndashW

Configuration des Scheacutemas Nous allons utiliser les scheacutemas de courier-ldap Pour eacuteviter une manipulation compliqueacutee vous trouverez

directement le scheacutema avec le fichier authldapschema On place ce fichier dans le dossier

mv authldapschema etcldapschema

Nous creacuteons un fichier qui incluera tous les scheacutemas de base en plus du nouveau On peut les afficher avec la

commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

Creacuteation du fichier de configuration pour notre exemple cela donne

mkdir tmpldapconf

cat gt tmpldapconfldapconf ltlt EOF

include etcldapschemacoreschema

include etcldapschemacosineschema

include etcldapschemanisschema

include etcldapschemainetorgpersonschema

include etcldapschemaauthldapschema

EOF

On lance ensuite la commande

slaptest -f tmpldapconfldapconf -F tmpldapconf

Elle revoie un message de succegraves Cette commande a creacuteeacute dans le reacutepertoire tmpldapconf une arborescence

correspondant agrave la configuration de notre LDAP

On modifie le chemin de configuration

5

sed ndashi 0dnauthldap sauthldapauthldapcn=schemacn=config

cn=authldapldif

On supprime ensuite les 7 derniegraveres lignes du fichier

head -n -7 cn=authldapldif gt tmpldif

mv tmpldif cn=authldapldif

On peut maintenant importer notre fichier de configuration Pour ce faire

ldapadd -Y EXTERNAL -H ldapi -f

tmpldapconfcn=configcn=schemacn=authldapldif

Si tout va bien lrsquoentreacutee devrait avoir eacuteteacute ajouteacutee On peut veacuterifier avec la commande vue tout agrave lrsquoheure

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

On devrait voir en plus le nouveau scheacutema authldap

Constitution de la base de donneacutees LDAP Le remplissage de la base se fait agrave lrsquoaide de fichiers ldif Nous donnons ici un exemple de structure

Fichier pour la structure de base

dn dc=maildc=domainedc=tld

o intimailpw

description Global mail tree

dc mail

objectClass top

objectClass dcObject

objectClass organization

dn dc=peopledc=maildc=domainedc=tld

description Informations of all users

o people

dc people

objectClass top

objectClass dcObject

objectClass organization

dn dc=groupsdc=maildc=domainedc=tld

description All groups of users

o groups

dc groups

objectClass top

objectClass dcObject

objectClass organization

6

Fichier pour ajouter un utilisateur

dn cn=jbonddc=peopledc=maildc=domainedc=tld

uid jbond

mail jbonddomainetld

sn Moulin

givenName James

displayName James Bond

mailbox domainetldjbond

quota 50M

homeDirectory homevmail

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAccount

userPassword SSHA367PSXiUAegy8dpJbPU8OepEf8L5ye

Pour obtenir un hash du mot de passe

slappasswd -s password -h SSHA

On peut par la suite ajouter la configuration agrave la base de donneacutees avec la commande

ldapadd -D cn=admindc=domainedc=tld -W -h localhost -f pathtofile

Si les champs proposeacutes ne sont pas suffisants il faudra alors effectuer les modifications dans le fichier autldapschema

proposeacute plus haut et refaire la manipulation de configuration

De plus les standards du Mail deacutecrit par lrsquoIETF (RFC822 63 RFC1123 527 and RFC2821 451) impliquent drsquoavoir une

adresse Postmaster et une Abuse Pour cela nous pourrions creacuteer ces adresses avec la meacutethode vue au-dessus mais

ce nrsquoest pas la meilleure Il est preacutefeacuterable drsquoutiliser un alias comme nous le ferons avec les listes de diffusion Ici nous

proposons de rediriger ces deux adresses vers une adresse administrateur Pour cela la meacutethode est la mecircme sauf

que le fichier ldif nrsquoest pas tout agrave fait identique En voici un exemple

dn cn=postmasterdc=groupsdc=maildc=domainedc=tld

uid postmaster

mail postmasterdomainetld

sn Postmaster

displayName Postmaster

maildrop admindomainetld

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAlias

Pour faire une liste de diffusion la meacutethode est la mecircme Il suffit drsquoajouter toutes les adresses destinataires dans le

champ maildrop seacutepareacutees par des virgules ()

7

Installation de Postfix Installation des packages

apt-get install postfix postfix-ldap

Lors de lrsquoinstallation deux eacutecrans deacutefilent

- Configuration Internet Site

- Valeur par deacutefaut pour le mail name

On creacutee lrsquoutilisateur qui servira agrave exeacutecuter Postfix

groupadd vmail

useradd -g vmail -d homevmail -s binfalse -m vmail

Nous aurons besoin dans la suite des GID et UID creacuteeacutes agrave cet instant Ils peuvent ecirctre afficheacutes avec les commandes

cat etcgroup | grep vmail | cut -d -f3

cat etcpasswd | grep vmail | cut -d -f3

On ajoute les paramegravetres au fichier etcpostfixmaincf (remplacer les valeurs de GID et drsquoUID avec vos valeurs)

smtpd_banner = maildomainetld

virtual_mailbox_base = homevmail

virtual_mailbox_domains = dmainetld

virtual_mailbox_maps = ldapetcpostfixldap_accountscf

virtual_alias_maps = ldapetcpostfixldap_aliasescf

virtual_minimum_uid = 100

virtual_gid_maps = static1001 Remplacez ici par votre valeur de GID

virtual_uid_maps = static1001 Remplacez ici par votre valeur drsquoUID

Il nous faut maintenant constituer nos fichiers de configuration ldap_accountscf

cat gt etcpostfixldap_accountscf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=peopledc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAccount)(mail=s))

result_attribute = mailbox

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

Et pour ldap_aliasescf

cat gt ldap_aliasescf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=groupsdc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAlias)(mail=s))

result_attribute = maildrop

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

8

On peut maintenant veacuterifier la configuration de Postfix avec (cette commande ne doit rien retourner si crsquoest bon)

postfix check

Si crsquoest bon alors on recharge le serveur

postfix reload

On peut alors faire un envoi de mail test via telnet

telnet localhost 25

Si vous souhaitez deacutelivrer les mails agrave votre maniegravere il faut dans le fichier etcpostfixmaincf la ligne

virtual_transport = nomdevotreregle

Et de mecircme dans le fichier etcpostfixmastercf

nomdevotreregle unix - n n - 5 pipe

flags=Rq user=vmail null_sender=

argv=chemindevotreprogramme

Il nous reste maintenant agrave configurer les diffeacuterents enregistrements DNS neacutecessaire au fonctionnement drsquoun serveur

mail Vous pouvez utiliser la solution de votre choix Dans la suite vous trouverez une meacutethode utilisant Bind9

Installation de Bind9 Dans toute cette partie on se situera dans le dossier etcbind Dans la suite notre IP sera abcd

Dans le fichier namedconfoptions on ajoutera dans le champ options

version Not supported

Dans un dossier zones on eacutecrit le fichier dbdomainetld

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122111 Serial

43200 Refresh

3600 Retry

2419200 Expire

86400 ) Negative Cache TTL

IN NS nsdomainetld

IN NS ns11ovhnet

ns IN A abcd

www IN A abcd

IN A abcd

IN MX 10 maildomainetld

mail IN A abcd

Dans le mecircme dossier zones on a cbain-addrarpa

9

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122101 serial

14400 refresh

3600 retry

604800 expire

10800 minimum

)

cbain-addrarpa IN NS nsdomainetld

cbain-addrarpa IN NS ns11ovhnet

d IN PTR maildomainetld

Il faut faire attention agrave bien increacutementer le serial pour chaque modification des fichiers

Dans le fichier namedconflocal

zone domainetld

type master

file etcbindzonesdbdomainetld

allow-transfer 213251128130

notify yes

zone cbain-addrarpa IN

type master

file etcbindzonescbain-addrarpa

allow-transfer 213251128130

Ici 213251128130 est lrsquoadresse IP du serveur ns11ovhnet

Il faut bien sucircr configurer le DNS avec votre fournisseur (Gandi OVH hellip) Pour ccedila amusez-vous bien Vous pouvez

aussi tester votre configuration avec des outils en ligne tels que DNSstuff

En test final si votre configuration est bonne vous devriez pouvoir envoyer un mail depuis un service neutre (Gmail

yahoo hellip) et le voir dans votre arborescence (ici homevmaildomainetld)

Installation du paquet Debian et configuration de lighttpd

Commencez par reacutecupeacuterer le paquet deb agrave lrsquoadresse suivante httpswwwintimailpwintimaildeb

Installez ensuite GDebi Il srsquoagit drsquoun dpkg ameacutelioreacute pour teacuteleacutecharger les deacutependances automatiquement ce que

dpkg ne gegravere pas

apt-get update

apt-get install gdebi-core

10

Vous pouvez alors installer le paquet

gdebi intimaildeb

Vous aurez alors le site web drsquointiMail deacuteployeacute au chemin varwwwwebmail

Il ne vous reste plus qursquoagrave changer la configuration de lighttpd votre serveur web pour mettre en ligne le site

Vous pouvez pour cela copier-coller la configuration suivante mais veillez agrave bien changer lrsquoadresse IP preacutesente au

deacutebut de la partie SSL CONFIG avec votre adresse IP

serv ermodules = ( mod_access

mod_accesslog

mod_alias

mod_compress

mod_redirect

mod_rewrite

)

Hide server version

servertag = Such Headers Very try Now close telnet

serverdocument-root = varwwwwebmail

serverupload-dirs = ( varwwwwebmailuploads )

servererrorlog = varloglighttpderrorlog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

serverport = 80

accesslogformat = V h l u t r gts b Refereri

User-Agenti

accesslogfilename = varloglighttpdaccesslog

index-filenames = ( indexphp indexhtml

indexlighttpdhtml )

urlaccess-deny = ( ~ inc )

static-fileexclude-extensions = ( php pl fcgi )

compresscache-dir = varcachelighttpdcompress

compressfiletype = ( applicationjavascript textcss

texthtml textplain )

default listening port for IPv6 falls back to the IPv4 port

include_shell usrsharelighttpduse-ipv6pl + serverport

include_shell usrsharelighttpdcreate-mimeassignpl

include_shell usrsharelighttpdinclude-conf-enabledpl

SSL CONFIG

$SERVER[socket] == 5234485443

sslengine = enable

11

sslpemfile = etclighttpdsslintimailpwpem

sslca-file = etclighttpdsslintimailpwcrt

servername = intimailpw

votre configuration habituelle pour ce domaine

serverdocument-root = varwwwwebmail

servererrorlog = varloglighttpderror_ssllog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

Rewrite des URL pour masquer php

urlrewrite-once = ( ^()$ =gt $1 )

urlrewrite-if-not-file = ( ^([^])()$ =gt $1php$2 )

servernetwork-backend = writev

Deacutependances Slapd

Ldap-utils

Postfix

Postfix-ldap

Bind9

Lighttpd

12

Sources httpswikigandinetfrhostingusing-linuxtutorialsdebianmail-server-ldap

httpwwwpostfixorgpipe8html

httpwwwpostfixorgFILTER_READMEhtml

httpwwwpostfixorg

httpwwwpostfixorgtransport5html

Page 25: Système d'hébergement domestique...place sur les domaines .pw par Gandi.net, notre fournisseur. Nous n’avons donc pas pu l’implémenter. Nous avons configuré Postfix pour qu’il

Notre installation de Debian a eacuteteacute au maximum alleacutegeacutee pour notre utilisation

sans interface graphique et nous avons mis en place une reacuteponse aux diverses

attaques que nous avons pu subir lors de lamise en place de notre solution logicielle

En outre le pare-feu avec notre systegraveme de liste noire bloque une partie des

attaques qui peuvent nous parvenir

Nos diffeacuterents scripts de pare-feu de gestion drsquoun mail entrant associeacute au

webmail permettent agrave un utilisateur drsquoacceacuteder aux fonctions usuelles associeacutees agrave

lrsquoenvoi et la reacuteception de mails

Gracircce agrave sa configuration personnalisable notre projet devrait pouvoir ecirctre

porteacute sur un domaine et une adresse IP diffeacuterente sans soucis et ecirctre deacuteployeacute

partout ougrave des gens souhaitent conserver leur vie priveacutee

Nous regretterons cependant de ne pas avoir exploiteacute la partie eacutenergeacutetique

de ce projet qui portait une probleacutematique inteacuteressante et qui nous parait importante

dans le monde actuel

Ce projet nous aura occupeacute pendant tregraves longtemps et nous sommes fiers du

travail que nous avons accompli Il est agrave nos yeux la preuve de ce que nous savons et

pouvons faire et nous donnera confiance pour notre deacutebut de carriegravere drsquoingeacutenieur

Sources

httpwwwradicaticomwpwp-contentuploads201401Email-Statistics-R

eport-2014-2018-Executive-Summarypdf

httpwwwcommentcamarchenetcontents525-le-protocole-ldap

httpsfrwikipediaorgwikiSimple_Mail_Transfer_Protocol

httpwwwcommentcamarchenetcontents536-pop3-smtp-imap-protocol

es-de-messagerie

httpstoolsietforghtmlrfc2821

httpsfrwikipediaorgwikiInternet_Message_Access_Protocol

httpstoolsietforghtmlrfc3501

httparstechnicacominformation-technology201402how-to-run-your-ow

n-e-mail-server-with-your-own-domain-part-1

httpswwwraspberrypiorgforumsviewtopicphpp=136912

httpstackoverflowcomquestions17394356how-can-i-make-a-bash-com

mand-run-periodically

httpuntroubledorgnullmailer

httpelinuxorgRPi_Hardware

httpraspitv2015raspberry-pi2-power-and-performance-measurement

Annexe 1 Architecture du systegraveme de fichiers

Annexe 2 Scan DNSSTUFF

Depuis httpwwwdnsstuffcomtoolsdnsReport|type=domainampampvalue=intimailpw

Annexe 3 Vue geacuteneacuterale httpswwwintimailpw

Annexe 4 Envoyer un mail

Annexe 5 Boite de reacuteception

Annexe 6 Interface drsquoadministration

Annexe 7 Gestion drsquoun utilisateur

Tutorial installation intimailtrade

Table des matiegraveres Apregraves une nouvelle installation de lrsquoOS 2

Seacutecurisation du serveur 2

Changement de lrsquoutilisateur par deacutefaut 2

Changement du port SSH 2

Interdire lrsquoauthentification SSH pour root 2

Installation de LDAP 3

Configuration de base 3

Configuration des Scheacutemas 4

Constitution de la base de donneacutees LDAP 5

Installation de Postfix 7

Installation de Bind9 8

Installation du paquet Debian et configuration de lighttpd 9

Deacutependances 11

Sources 12

2

Apregraves une nouvelle installation de lrsquoOS Exeacutecutez ces commandes pour mettre agrave jour agrave la derniegravere version Ces opeacuterations peuvent prendre un certain

temps Nous avons utiliseacute pour cet exemple Raspbian Jessie Lite sur une Raspberry Pi 2

apt-get update

apt-get upgrade ampamp apt-get dist-upgrade

apt-get install linux-headers-$(uname -r)

reboot

Puis lancer

raspi-config

Etendre au maximum lrsquoespace de stockage en navigant dans les menus

Expand Filesystem

Reacutegler une ip statique avec la box fichier etcnetworkinterfaces

iface eth0 inet static

address 192168131

netmask 2552552550

gateway 19216811

Nous avons aussi supprimeacute wpasupplicant

Seacutecurisation du serveur

Changement de lrsquoutilisateur par deacutefaut Changez le nom drsquoutilisateur par deacutefaut ainsi que son mot de passe

sudo passwd root

Sortie et login en tant que root puis

usermod -l myuname pi

usermod -m -d homemyuname myuname

groupmod ndashn myuname pi

passwd myuname

Voir cette adresse pour lrsquoutilisation de cleacutes priveacuteespubliques

Changement du port SSH sed ndashi sPort 22Port 2222g etcsshsshd_config

Interdire lrsquoauthentification SSH pour root sed -i sPermitRootLogin yesPermitRootLogin nog etcsshsshd_config

3

Installation de LDAP

Configuration de base Installation du package

apt-get install slapd

Choisir un mot de passe administrateur puis lancer la commande

dpkg-reconfigure slapd

Reacutepondre non agrave la question 1

Entrez le nom de domaine utiliseacute agrave la question 2 sous la forme domainetld

Entrez ce que vous voulez au 3egraveme eacutecran le nom de lrsquoorganisation ne sera pas utiliseacute

Entrez un mot de passe

Choisissez HDB

Choisissez si la base de donneacutees est supprimeacutee agrave la deacutesinstallation de slapd

Deacuteplacez lrsquoancienne base de donneacutees

Nrsquoutilisez pas LDAPv2

Installer les outils de conversion pour ldap (slaptest ldapmodify notamment)

apt-get install ldap-utils

On peut maintenant veacuterifier que la configuration est valable

ldapsearch -x -h localhost -b dc=domainedc=tld -LLL dc=domaine dn

Cette commande doit retourner quelque chose comme

dn dc=domainedc=tld

Il faut maintenant seacutecuriser le serveur LDAP en effet on peut y acceacuteder en anonyme avec la commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=config

(amp(objectClass=olcDatabaseConfig)(olcSuffix=dc=domainedc=tld))

Cette commande retourne un certain nombre drsquoinformations notamment agrave propos des champs suivants

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by none

olcAccess 1to dnbase= by read

olcAccess 2to by read

On va modifier ces champs avec la commande ldapmodify Pour cela on va creacuteer un fichier ldif

cat gt changeAccessldif ltlt EOF

dn olcDatabase=1hdbcn=config

changetype modify

delete olcAccess

-

add olcAccess

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by dn=cn=admindc=domainedc=tld write by none

-

add olcAccess

olcAccess 1to dnbase= by read

-

4

add olcAccess

olcAccess 2to by self write by dn=cn=admindc=domainedc=tld write by

none

-

EOF

On peut maintenant appliquer les changements avec ldapmodify

ldapmodify ndashc ndashY EXTERNAL ndashH ldapi -f changeAccessldif

La commande devrait vous confirmer que la modification srsquoest bien effectueacutee

SASLEXTERNAL authentication started

SASL username gidNumber=0+uidNumber=0cn=peercredcn=externalcn=auth

SASL SSF 0

modifying entry olcDatabase=1hdbcn=config

On peut veacuterifier qursquoon ne peut plus acceacuteder aux informations avec la commande

ldapsearch -x -c -h localhost -b dc=domainedc=tld

On peut veacuterifier la configuration en se connectant en tant qursquoadministrateur

ldapsearch -c -h localhost -b dc=domainedc=tld -D

cn=admindc=domainedc=tld ndashW

Configuration des Scheacutemas Nous allons utiliser les scheacutemas de courier-ldap Pour eacuteviter une manipulation compliqueacutee vous trouverez

directement le scheacutema avec le fichier authldapschema On place ce fichier dans le dossier

mv authldapschema etcldapschema

Nous creacuteons un fichier qui incluera tous les scheacutemas de base en plus du nouveau On peut les afficher avec la

commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

Creacuteation du fichier de configuration pour notre exemple cela donne

mkdir tmpldapconf

cat gt tmpldapconfldapconf ltlt EOF

include etcldapschemacoreschema

include etcldapschemacosineschema

include etcldapschemanisschema

include etcldapschemainetorgpersonschema

include etcldapschemaauthldapschema

EOF

On lance ensuite la commande

slaptest -f tmpldapconfldapconf -F tmpldapconf

Elle revoie un message de succegraves Cette commande a creacuteeacute dans le reacutepertoire tmpldapconf une arborescence

correspondant agrave la configuration de notre LDAP

On modifie le chemin de configuration

5

sed ndashi 0dnauthldap sauthldapauthldapcn=schemacn=config

cn=authldapldif

On supprime ensuite les 7 derniegraveres lignes du fichier

head -n -7 cn=authldapldif gt tmpldif

mv tmpldif cn=authldapldif

On peut maintenant importer notre fichier de configuration Pour ce faire

ldapadd -Y EXTERNAL -H ldapi -f

tmpldapconfcn=configcn=schemacn=authldapldif

Si tout va bien lrsquoentreacutee devrait avoir eacuteteacute ajouteacutee On peut veacuterifier avec la commande vue tout agrave lrsquoheure

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

On devrait voir en plus le nouveau scheacutema authldap

Constitution de la base de donneacutees LDAP Le remplissage de la base se fait agrave lrsquoaide de fichiers ldif Nous donnons ici un exemple de structure

Fichier pour la structure de base

dn dc=maildc=domainedc=tld

o intimailpw

description Global mail tree

dc mail

objectClass top

objectClass dcObject

objectClass organization

dn dc=peopledc=maildc=domainedc=tld

description Informations of all users

o people

dc people

objectClass top

objectClass dcObject

objectClass organization

dn dc=groupsdc=maildc=domainedc=tld

description All groups of users

o groups

dc groups

objectClass top

objectClass dcObject

objectClass organization

6

Fichier pour ajouter un utilisateur

dn cn=jbonddc=peopledc=maildc=domainedc=tld

uid jbond

mail jbonddomainetld

sn Moulin

givenName James

displayName James Bond

mailbox domainetldjbond

quota 50M

homeDirectory homevmail

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAccount

userPassword SSHA367PSXiUAegy8dpJbPU8OepEf8L5ye

Pour obtenir un hash du mot de passe

slappasswd -s password -h SSHA

On peut par la suite ajouter la configuration agrave la base de donneacutees avec la commande

ldapadd -D cn=admindc=domainedc=tld -W -h localhost -f pathtofile

Si les champs proposeacutes ne sont pas suffisants il faudra alors effectuer les modifications dans le fichier autldapschema

proposeacute plus haut et refaire la manipulation de configuration

De plus les standards du Mail deacutecrit par lrsquoIETF (RFC822 63 RFC1123 527 and RFC2821 451) impliquent drsquoavoir une

adresse Postmaster et une Abuse Pour cela nous pourrions creacuteer ces adresses avec la meacutethode vue au-dessus mais

ce nrsquoest pas la meilleure Il est preacutefeacuterable drsquoutiliser un alias comme nous le ferons avec les listes de diffusion Ici nous

proposons de rediriger ces deux adresses vers une adresse administrateur Pour cela la meacutethode est la mecircme sauf

que le fichier ldif nrsquoest pas tout agrave fait identique En voici un exemple

dn cn=postmasterdc=groupsdc=maildc=domainedc=tld

uid postmaster

mail postmasterdomainetld

sn Postmaster

displayName Postmaster

maildrop admindomainetld

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAlias

Pour faire une liste de diffusion la meacutethode est la mecircme Il suffit drsquoajouter toutes les adresses destinataires dans le

champ maildrop seacutepareacutees par des virgules ()

7

Installation de Postfix Installation des packages

apt-get install postfix postfix-ldap

Lors de lrsquoinstallation deux eacutecrans deacutefilent

- Configuration Internet Site

- Valeur par deacutefaut pour le mail name

On creacutee lrsquoutilisateur qui servira agrave exeacutecuter Postfix

groupadd vmail

useradd -g vmail -d homevmail -s binfalse -m vmail

Nous aurons besoin dans la suite des GID et UID creacuteeacutes agrave cet instant Ils peuvent ecirctre afficheacutes avec les commandes

cat etcgroup | grep vmail | cut -d -f3

cat etcpasswd | grep vmail | cut -d -f3

On ajoute les paramegravetres au fichier etcpostfixmaincf (remplacer les valeurs de GID et drsquoUID avec vos valeurs)

smtpd_banner = maildomainetld

virtual_mailbox_base = homevmail

virtual_mailbox_domains = dmainetld

virtual_mailbox_maps = ldapetcpostfixldap_accountscf

virtual_alias_maps = ldapetcpostfixldap_aliasescf

virtual_minimum_uid = 100

virtual_gid_maps = static1001 Remplacez ici par votre valeur de GID

virtual_uid_maps = static1001 Remplacez ici par votre valeur drsquoUID

Il nous faut maintenant constituer nos fichiers de configuration ldap_accountscf

cat gt etcpostfixldap_accountscf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=peopledc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAccount)(mail=s))

result_attribute = mailbox

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

Et pour ldap_aliasescf

cat gt ldap_aliasescf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=groupsdc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAlias)(mail=s))

result_attribute = maildrop

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

8

On peut maintenant veacuterifier la configuration de Postfix avec (cette commande ne doit rien retourner si crsquoest bon)

postfix check

Si crsquoest bon alors on recharge le serveur

postfix reload

On peut alors faire un envoi de mail test via telnet

telnet localhost 25

Si vous souhaitez deacutelivrer les mails agrave votre maniegravere il faut dans le fichier etcpostfixmaincf la ligne

virtual_transport = nomdevotreregle

Et de mecircme dans le fichier etcpostfixmastercf

nomdevotreregle unix - n n - 5 pipe

flags=Rq user=vmail null_sender=

argv=chemindevotreprogramme

Il nous reste maintenant agrave configurer les diffeacuterents enregistrements DNS neacutecessaire au fonctionnement drsquoun serveur

mail Vous pouvez utiliser la solution de votre choix Dans la suite vous trouverez une meacutethode utilisant Bind9

Installation de Bind9 Dans toute cette partie on se situera dans le dossier etcbind Dans la suite notre IP sera abcd

Dans le fichier namedconfoptions on ajoutera dans le champ options

version Not supported

Dans un dossier zones on eacutecrit le fichier dbdomainetld

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122111 Serial

43200 Refresh

3600 Retry

2419200 Expire

86400 ) Negative Cache TTL

IN NS nsdomainetld

IN NS ns11ovhnet

ns IN A abcd

www IN A abcd

IN A abcd

IN MX 10 maildomainetld

mail IN A abcd

Dans le mecircme dossier zones on a cbain-addrarpa

9

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122101 serial

14400 refresh

3600 retry

604800 expire

10800 minimum

)

cbain-addrarpa IN NS nsdomainetld

cbain-addrarpa IN NS ns11ovhnet

d IN PTR maildomainetld

Il faut faire attention agrave bien increacutementer le serial pour chaque modification des fichiers

Dans le fichier namedconflocal

zone domainetld

type master

file etcbindzonesdbdomainetld

allow-transfer 213251128130

notify yes

zone cbain-addrarpa IN

type master

file etcbindzonescbain-addrarpa

allow-transfer 213251128130

Ici 213251128130 est lrsquoadresse IP du serveur ns11ovhnet

Il faut bien sucircr configurer le DNS avec votre fournisseur (Gandi OVH hellip) Pour ccedila amusez-vous bien Vous pouvez

aussi tester votre configuration avec des outils en ligne tels que DNSstuff

En test final si votre configuration est bonne vous devriez pouvoir envoyer un mail depuis un service neutre (Gmail

yahoo hellip) et le voir dans votre arborescence (ici homevmaildomainetld)

Installation du paquet Debian et configuration de lighttpd

Commencez par reacutecupeacuterer le paquet deb agrave lrsquoadresse suivante httpswwwintimailpwintimaildeb

Installez ensuite GDebi Il srsquoagit drsquoun dpkg ameacutelioreacute pour teacuteleacutecharger les deacutependances automatiquement ce que

dpkg ne gegravere pas

apt-get update

apt-get install gdebi-core

10

Vous pouvez alors installer le paquet

gdebi intimaildeb

Vous aurez alors le site web drsquointiMail deacuteployeacute au chemin varwwwwebmail

Il ne vous reste plus qursquoagrave changer la configuration de lighttpd votre serveur web pour mettre en ligne le site

Vous pouvez pour cela copier-coller la configuration suivante mais veillez agrave bien changer lrsquoadresse IP preacutesente au

deacutebut de la partie SSL CONFIG avec votre adresse IP

serv ermodules = ( mod_access

mod_accesslog

mod_alias

mod_compress

mod_redirect

mod_rewrite

)

Hide server version

servertag = Such Headers Very try Now close telnet

serverdocument-root = varwwwwebmail

serverupload-dirs = ( varwwwwebmailuploads )

servererrorlog = varloglighttpderrorlog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

serverport = 80

accesslogformat = V h l u t r gts b Refereri

User-Agenti

accesslogfilename = varloglighttpdaccesslog

index-filenames = ( indexphp indexhtml

indexlighttpdhtml )

urlaccess-deny = ( ~ inc )

static-fileexclude-extensions = ( php pl fcgi )

compresscache-dir = varcachelighttpdcompress

compressfiletype = ( applicationjavascript textcss

texthtml textplain )

default listening port for IPv6 falls back to the IPv4 port

include_shell usrsharelighttpduse-ipv6pl + serverport

include_shell usrsharelighttpdcreate-mimeassignpl

include_shell usrsharelighttpdinclude-conf-enabledpl

SSL CONFIG

$SERVER[socket] == 5234485443

sslengine = enable

11

sslpemfile = etclighttpdsslintimailpwpem

sslca-file = etclighttpdsslintimailpwcrt

servername = intimailpw

votre configuration habituelle pour ce domaine

serverdocument-root = varwwwwebmail

servererrorlog = varloglighttpderror_ssllog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

Rewrite des URL pour masquer php

urlrewrite-once = ( ^()$ =gt $1 )

urlrewrite-if-not-file = ( ^([^])()$ =gt $1php$2 )

servernetwork-backend = writev

Deacutependances Slapd

Ldap-utils

Postfix

Postfix-ldap

Bind9

Lighttpd

12

Sources httpswikigandinetfrhostingusing-linuxtutorialsdebianmail-server-ldap

httpwwwpostfixorgpipe8html

httpwwwpostfixorgFILTER_READMEhtml

httpwwwpostfixorg

httpwwwpostfixorgtransport5html

Page 26: Système d'hébergement domestique...place sur les domaines .pw par Gandi.net, notre fournisseur. Nous n’avons donc pas pu l’implémenter. Nous avons configuré Postfix pour qu’il

Sources

httpwwwradicaticomwpwp-contentuploads201401Email-Statistics-R

eport-2014-2018-Executive-Summarypdf

httpwwwcommentcamarchenetcontents525-le-protocole-ldap

httpsfrwikipediaorgwikiSimple_Mail_Transfer_Protocol

httpwwwcommentcamarchenetcontents536-pop3-smtp-imap-protocol

es-de-messagerie

httpstoolsietforghtmlrfc2821

httpsfrwikipediaorgwikiInternet_Message_Access_Protocol

httpstoolsietforghtmlrfc3501

httparstechnicacominformation-technology201402how-to-run-your-ow

n-e-mail-server-with-your-own-domain-part-1

httpswwwraspberrypiorgforumsviewtopicphpp=136912

httpstackoverflowcomquestions17394356how-can-i-make-a-bash-com

mand-run-periodically

httpuntroubledorgnullmailer

httpelinuxorgRPi_Hardware

httpraspitv2015raspberry-pi2-power-and-performance-measurement

Annexe 1 Architecture du systegraveme de fichiers

Annexe 2 Scan DNSSTUFF

Depuis httpwwwdnsstuffcomtoolsdnsReport|type=domainampampvalue=intimailpw

Annexe 3 Vue geacuteneacuterale httpswwwintimailpw

Annexe 4 Envoyer un mail

Annexe 5 Boite de reacuteception

Annexe 6 Interface drsquoadministration

Annexe 7 Gestion drsquoun utilisateur

Tutorial installation intimailtrade

Table des matiegraveres Apregraves une nouvelle installation de lrsquoOS 2

Seacutecurisation du serveur 2

Changement de lrsquoutilisateur par deacutefaut 2

Changement du port SSH 2

Interdire lrsquoauthentification SSH pour root 2

Installation de LDAP 3

Configuration de base 3

Configuration des Scheacutemas 4

Constitution de la base de donneacutees LDAP 5

Installation de Postfix 7

Installation de Bind9 8

Installation du paquet Debian et configuration de lighttpd 9

Deacutependances 11

Sources 12

2

Apregraves une nouvelle installation de lrsquoOS Exeacutecutez ces commandes pour mettre agrave jour agrave la derniegravere version Ces opeacuterations peuvent prendre un certain

temps Nous avons utiliseacute pour cet exemple Raspbian Jessie Lite sur une Raspberry Pi 2

apt-get update

apt-get upgrade ampamp apt-get dist-upgrade

apt-get install linux-headers-$(uname -r)

reboot

Puis lancer

raspi-config

Etendre au maximum lrsquoespace de stockage en navigant dans les menus

Expand Filesystem

Reacutegler une ip statique avec la box fichier etcnetworkinterfaces

iface eth0 inet static

address 192168131

netmask 2552552550

gateway 19216811

Nous avons aussi supprimeacute wpasupplicant

Seacutecurisation du serveur

Changement de lrsquoutilisateur par deacutefaut Changez le nom drsquoutilisateur par deacutefaut ainsi que son mot de passe

sudo passwd root

Sortie et login en tant que root puis

usermod -l myuname pi

usermod -m -d homemyuname myuname

groupmod ndashn myuname pi

passwd myuname

Voir cette adresse pour lrsquoutilisation de cleacutes priveacuteespubliques

Changement du port SSH sed ndashi sPort 22Port 2222g etcsshsshd_config

Interdire lrsquoauthentification SSH pour root sed -i sPermitRootLogin yesPermitRootLogin nog etcsshsshd_config

3

Installation de LDAP

Configuration de base Installation du package

apt-get install slapd

Choisir un mot de passe administrateur puis lancer la commande

dpkg-reconfigure slapd

Reacutepondre non agrave la question 1

Entrez le nom de domaine utiliseacute agrave la question 2 sous la forme domainetld

Entrez ce que vous voulez au 3egraveme eacutecran le nom de lrsquoorganisation ne sera pas utiliseacute

Entrez un mot de passe

Choisissez HDB

Choisissez si la base de donneacutees est supprimeacutee agrave la deacutesinstallation de slapd

Deacuteplacez lrsquoancienne base de donneacutees

Nrsquoutilisez pas LDAPv2

Installer les outils de conversion pour ldap (slaptest ldapmodify notamment)

apt-get install ldap-utils

On peut maintenant veacuterifier que la configuration est valable

ldapsearch -x -h localhost -b dc=domainedc=tld -LLL dc=domaine dn

Cette commande doit retourner quelque chose comme

dn dc=domainedc=tld

Il faut maintenant seacutecuriser le serveur LDAP en effet on peut y acceacuteder en anonyme avec la commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=config

(amp(objectClass=olcDatabaseConfig)(olcSuffix=dc=domainedc=tld))

Cette commande retourne un certain nombre drsquoinformations notamment agrave propos des champs suivants

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by none

olcAccess 1to dnbase= by read

olcAccess 2to by read

On va modifier ces champs avec la commande ldapmodify Pour cela on va creacuteer un fichier ldif

cat gt changeAccessldif ltlt EOF

dn olcDatabase=1hdbcn=config

changetype modify

delete olcAccess

-

add olcAccess

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by dn=cn=admindc=domainedc=tld write by none

-

add olcAccess

olcAccess 1to dnbase= by read

-

4

add olcAccess

olcAccess 2to by self write by dn=cn=admindc=domainedc=tld write by

none

-

EOF

On peut maintenant appliquer les changements avec ldapmodify

ldapmodify ndashc ndashY EXTERNAL ndashH ldapi -f changeAccessldif

La commande devrait vous confirmer que la modification srsquoest bien effectueacutee

SASLEXTERNAL authentication started

SASL username gidNumber=0+uidNumber=0cn=peercredcn=externalcn=auth

SASL SSF 0

modifying entry olcDatabase=1hdbcn=config

On peut veacuterifier qursquoon ne peut plus acceacuteder aux informations avec la commande

ldapsearch -x -c -h localhost -b dc=domainedc=tld

On peut veacuterifier la configuration en se connectant en tant qursquoadministrateur

ldapsearch -c -h localhost -b dc=domainedc=tld -D

cn=admindc=domainedc=tld ndashW

Configuration des Scheacutemas Nous allons utiliser les scheacutemas de courier-ldap Pour eacuteviter une manipulation compliqueacutee vous trouverez

directement le scheacutema avec le fichier authldapschema On place ce fichier dans le dossier

mv authldapschema etcldapschema

Nous creacuteons un fichier qui incluera tous les scheacutemas de base en plus du nouveau On peut les afficher avec la

commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

Creacuteation du fichier de configuration pour notre exemple cela donne

mkdir tmpldapconf

cat gt tmpldapconfldapconf ltlt EOF

include etcldapschemacoreschema

include etcldapschemacosineschema

include etcldapschemanisschema

include etcldapschemainetorgpersonschema

include etcldapschemaauthldapschema

EOF

On lance ensuite la commande

slaptest -f tmpldapconfldapconf -F tmpldapconf

Elle revoie un message de succegraves Cette commande a creacuteeacute dans le reacutepertoire tmpldapconf une arborescence

correspondant agrave la configuration de notre LDAP

On modifie le chemin de configuration

5

sed ndashi 0dnauthldap sauthldapauthldapcn=schemacn=config

cn=authldapldif

On supprime ensuite les 7 derniegraveres lignes du fichier

head -n -7 cn=authldapldif gt tmpldif

mv tmpldif cn=authldapldif

On peut maintenant importer notre fichier de configuration Pour ce faire

ldapadd -Y EXTERNAL -H ldapi -f

tmpldapconfcn=configcn=schemacn=authldapldif

Si tout va bien lrsquoentreacutee devrait avoir eacuteteacute ajouteacutee On peut veacuterifier avec la commande vue tout agrave lrsquoheure

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

On devrait voir en plus le nouveau scheacutema authldap

Constitution de la base de donneacutees LDAP Le remplissage de la base se fait agrave lrsquoaide de fichiers ldif Nous donnons ici un exemple de structure

Fichier pour la structure de base

dn dc=maildc=domainedc=tld

o intimailpw

description Global mail tree

dc mail

objectClass top

objectClass dcObject

objectClass organization

dn dc=peopledc=maildc=domainedc=tld

description Informations of all users

o people

dc people

objectClass top

objectClass dcObject

objectClass organization

dn dc=groupsdc=maildc=domainedc=tld

description All groups of users

o groups

dc groups

objectClass top

objectClass dcObject

objectClass organization

6

Fichier pour ajouter un utilisateur

dn cn=jbonddc=peopledc=maildc=domainedc=tld

uid jbond

mail jbonddomainetld

sn Moulin

givenName James

displayName James Bond

mailbox domainetldjbond

quota 50M

homeDirectory homevmail

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAccount

userPassword SSHA367PSXiUAegy8dpJbPU8OepEf8L5ye

Pour obtenir un hash du mot de passe

slappasswd -s password -h SSHA

On peut par la suite ajouter la configuration agrave la base de donneacutees avec la commande

ldapadd -D cn=admindc=domainedc=tld -W -h localhost -f pathtofile

Si les champs proposeacutes ne sont pas suffisants il faudra alors effectuer les modifications dans le fichier autldapschema

proposeacute plus haut et refaire la manipulation de configuration

De plus les standards du Mail deacutecrit par lrsquoIETF (RFC822 63 RFC1123 527 and RFC2821 451) impliquent drsquoavoir une

adresse Postmaster et une Abuse Pour cela nous pourrions creacuteer ces adresses avec la meacutethode vue au-dessus mais

ce nrsquoest pas la meilleure Il est preacutefeacuterable drsquoutiliser un alias comme nous le ferons avec les listes de diffusion Ici nous

proposons de rediriger ces deux adresses vers une adresse administrateur Pour cela la meacutethode est la mecircme sauf

que le fichier ldif nrsquoest pas tout agrave fait identique En voici un exemple

dn cn=postmasterdc=groupsdc=maildc=domainedc=tld

uid postmaster

mail postmasterdomainetld

sn Postmaster

displayName Postmaster

maildrop admindomainetld

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAlias

Pour faire une liste de diffusion la meacutethode est la mecircme Il suffit drsquoajouter toutes les adresses destinataires dans le

champ maildrop seacutepareacutees par des virgules ()

7

Installation de Postfix Installation des packages

apt-get install postfix postfix-ldap

Lors de lrsquoinstallation deux eacutecrans deacutefilent

- Configuration Internet Site

- Valeur par deacutefaut pour le mail name

On creacutee lrsquoutilisateur qui servira agrave exeacutecuter Postfix

groupadd vmail

useradd -g vmail -d homevmail -s binfalse -m vmail

Nous aurons besoin dans la suite des GID et UID creacuteeacutes agrave cet instant Ils peuvent ecirctre afficheacutes avec les commandes

cat etcgroup | grep vmail | cut -d -f3

cat etcpasswd | grep vmail | cut -d -f3

On ajoute les paramegravetres au fichier etcpostfixmaincf (remplacer les valeurs de GID et drsquoUID avec vos valeurs)

smtpd_banner = maildomainetld

virtual_mailbox_base = homevmail

virtual_mailbox_domains = dmainetld

virtual_mailbox_maps = ldapetcpostfixldap_accountscf

virtual_alias_maps = ldapetcpostfixldap_aliasescf

virtual_minimum_uid = 100

virtual_gid_maps = static1001 Remplacez ici par votre valeur de GID

virtual_uid_maps = static1001 Remplacez ici par votre valeur drsquoUID

Il nous faut maintenant constituer nos fichiers de configuration ldap_accountscf

cat gt etcpostfixldap_accountscf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=peopledc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAccount)(mail=s))

result_attribute = mailbox

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

Et pour ldap_aliasescf

cat gt ldap_aliasescf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=groupsdc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAlias)(mail=s))

result_attribute = maildrop

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

8

On peut maintenant veacuterifier la configuration de Postfix avec (cette commande ne doit rien retourner si crsquoest bon)

postfix check

Si crsquoest bon alors on recharge le serveur

postfix reload

On peut alors faire un envoi de mail test via telnet

telnet localhost 25

Si vous souhaitez deacutelivrer les mails agrave votre maniegravere il faut dans le fichier etcpostfixmaincf la ligne

virtual_transport = nomdevotreregle

Et de mecircme dans le fichier etcpostfixmastercf

nomdevotreregle unix - n n - 5 pipe

flags=Rq user=vmail null_sender=

argv=chemindevotreprogramme

Il nous reste maintenant agrave configurer les diffeacuterents enregistrements DNS neacutecessaire au fonctionnement drsquoun serveur

mail Vous pouvez utiliser la solution de votre choix Dans la suite vous trouverez une meacutethode utilisant Bind9

Installation de Bind9 Dans toute cette partie on se situera dans le dossier etcbind Dans la suite notre IP sera abcd

Dans le fichier namedconfoptions on ajoutera dans le champ options

version Not supported

Dans un dossier zones on eacutecrit le fichier dbdomainetld

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122111 Serial

43200 Refresh

3600 Retry

2419200 Expire

86400 ) Negative Cache TTL

IN NS nsdomainetld

IN NS ns11ovhnet

ns IN A abcd

www IN A abcd

IN A abcd

IN MX 10 maildomainetld

mail IN A abcd

Dans le mecircme dossier zones on a cbain-addrarpa

9

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122101 serial

14400 refresh

3600 retry

604800 expire

10800 minimum

)

cbain-addrarpa IN NS nsdomainetld

cbain-addrarpa IN NS ns11ovhnet

d IN PTR maildomainetld

Il faut faire attention agrave bien increacutementer le serial pour chaque modification des fichiers

Dans le fichier namedconflocal

zone domainetld

type master

file etcbindzonesdbdomainetld

allow-transfer 213251128130

notify yes

zone cbain-addrarpa IN

type master

file etcbindzonescbain-addrarpa

allow-transfer 213251128130

Ici 213251128130 est lrsquoadresse IP du serveur ns11ovhnet

Il faut bien sucircr configurer le DNS avec votre fournisseur (Gandi OVH hellip) Pour ccedila amusez-vous bien Vous pouvez

aussi tester votre configuration avec des outils en ligne tels que DNSstuff

En test final si votre configuration est bonne vous devriez pouvoir envoyer un mail depuis un service neutre (Gmail

yahoo hellip) et le voir dans votre arborescence (ici homevmaildomainetld)

Installation du paquet Debian et configuration de lighttpd

Commencez par reacutecupeacuterer le paquet deb agrave lrsquoadresse suivante httpswwwintimailpwintimaildeb

Installez ensuite GDebi Il srsquoagit drsquoun dpkg ameacutelioreacute pour teacuteleacutecharger les deacutependances automatiquement ce que

dpkg ne gegravere pas

apt-get update

apt-get install gdebi-core

10

Vous pouvez alors installer le paquet

gdebi intimaildeb

Vous aurez alors le site web drsquointiMail deacuteployeacute au chemin varwwwwebmail

Il ne vous reste plus qursquoagrave changer la configuration de lighttpd votre serveur web pour mettre en ligne le site

Vous pouvez pour cela copier-coller la configuration suivante mais veillez agrave bien changer lrsquoadresse IP preacutesente au

deacutebut de la partie SSL CONFIG avec votre adresse IP

serv ermodules = ( mod_access

mod_accesslog

mod_alias

mod_compress

mod_redirect

mod_rewrite

)

Hide server version

servertag = Such Headers Very try Now close telnet

serverdocument-root = varwwwwebmail

serverupload-dirs = ( varwwwwebmailuploads )

servererrorlog = varloglighttpderrorlog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

serverport = 80

accesslogformat = V h l u t r gts b Refereri

User-Agenti

accesslogfilename = varloglighttpdaccesslog

index-filenames = ( indexphp indexhtml

indexlighttpdhtml )

urlaccess-deny = ( ~ inc )

static-fileexclude-extensions = ( php pl fcgi )

compresscache-dir = varcachelighttpdcompress

compressfiletype = ( applicationjavascript textcss

texthtml textplain )

default listening port for IPv6 falls back to the IPv4 port

include_shell usrsharelighttpduse-ipv6pl + serverport

include_shell usrsharelighttpdcreate-mimeassignpl

include_shell usrsharelighttpdinclude-conf-enabledpl

SSL CONFIG

$SERVER[socket] == 5234485443

sslengine = enable

11

sslpemfile = etclighttpdsslintimailpwpem

sslca-file = etclighttpdsslintimailpwcrt

servername = intimailpw

votre configuration habituelle pour ce domaine

serverdocument-root = varwwwwebmail

servererrorlog = varloglighttpderror_ssllog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

Rewrite des URL pour masquer php

urlrewrite-once = ( ^()$ =gt $1 )

urlrewrite-if-not-file = ( ^([^])()$ =gt $1php$2 )

servernetwork-backend = writev

Deacutependances Slapd

Ldap-utils

Postfix

Postfix-ldap

Bind9

Lighttpd

12

Sources httpswikigandinetfrhostingusing-linuxtutorialsdebianmail-server-ldap

httpwwwpostfixorgpipe8html

httpwwwpostfixorgFILTER_READMEhtml

httpwwwpostfixorg

httpwwwpostfixorgtransport5html

Page 27: Système d'hébergement domestique...place sur les domaines .pw par Gandi.net, notre fournisseur. Nous n’avons donc pas pu l’implémenter. Nous avons configuré Postfix pour qu’il

Annexe 1 Architecture du systegraveme de fichiers

Annexe 2 Scan DNSSTUFF

Depuis httpwwwdnsstuffcomtoolsdnsReport|type=domainampampvalue=intimailpw

Annexe 3 Vue geacuteneacuterale httpswwwintimailpw

Annexe 4 Envoyer un mail

Annexe 5 Boite de reacuteception

Annexe 6 Interface drsquoadministration

Annexe 7 Gestion drsquoun utilisateur

Tutorial installation intimailtrade

Table des matiegraveres Apregraves une nouvelle installation de lrsquoOS 2

Seacutecurisation du serveur 2

Changement de lrsquoutilisateur par deacutefaut 2

Changement du port SSH 2

Interdire lrsquoauthentification SSH pour root 2

Installation de LDAP 3

Configuration de base 3

Configuration des Scheacutemas 4

Constitution de la base de donneacutees LDAP 5

Installation de Postfix 7

Installation de Bind9 8

Installation du paquet Debian et configuration de lighttpd 9

Deacutependances 11

Sources 12

2

Apregraves une nouvelle installation de lrsquoOS Exeacutecutez ces commandes pour mettre agrave jour agrave la derniegravere version Ces opeacuterations peuvent prendre un certain

temps Nous avons utiliseacute pour cet exemple Raspbian Jessie Lite sur une Raspberry Pi 2

apt-get update

apt-get upgrade ampamp apt-get dist-upgrade

apt-get install linux-headers-$(uname -r)

reboot

Puis lancer

raspi-config

Etendre au maximum lrsquoespace de stockage en navigant dans les menus

Expand Filesystem

Reacutegler une ip statique avec la box fichier etcnetworkinterfaces

iface eth0 inet static

address 192168131

netmask 2552552550

gateway 19216811

Nous avons aussi supprimeacute wpasupplicant

Seacutecurisation du serveur

Changement de lrsquoutilisateur par deacutefaut Changez le nom drsquoutilisateur par deacutefaut ainsi que son mot de passe

sudo passwd root

Sortie et login en tant que root puis

usermod -l myuname pi

usermod -m -d homemyuname myuname

groupmod ndashn myuname pi

passwd myuname

Voir cette adresse pour lrsquoutilisation de cleacutes priveacuteespubliques

Changement du port SSH sed ndashi sPort 22Port 2222g etcsshsshd_config

Interdire lrsquoauthentification SSH pour root sed -i sPermitRootLogin yesPermitRootLogin nog etcsshsshd_config

3

Installation de LDAP

Configuration de base Installation du package

apt-get install slapd

Choisir un mot de passe administrateur puis lancer la commande

dpkg-reconfigure slapd

Reacutepondre non agrave la question 1

Entrez le nom de domaine utiliseacute agrave la question 2 sous la forme domainetld

Entrez ce que vous voulez au 3egraveme eacutecran le nom de lrsquoorganisation ne sera pas utiliseacute

Entrez un mot de passe

Choisissez HDB

Choisissez si la base de donneacutees est supprimeacutee agrave la deacutesinstallation de slapd

Deacuteplacez lrsquoancienne base de donneacutees

Nrsquoutilisez pas LDAPv2

Installer les outils de conversion pour ldap (slaptest ldapmodify notamment)

apt-get install ldap-utils

On peut maintenant veacuterifier que la configuration est valable

ldapsearch -x -h localhost -b dc=domainedc=tld -LLL dc=domaine dn

Cette commande doit retourner quelque chose comme

dn dc=domainedc=tld

Il faut maintenant seacutecuriser le serveur LDAP en effet on peut y acceacuteder en anonyme avec la commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=config

(amp(objectClass=olcDatabaseConfig)(olcSuffix=dc=domainedc=tld))

Cette commande retourne un certain nombre drsquoinformations notamment agrave propos des champs suivants

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by none

olcAccess 1to dnbase= by read

olcAccess 2to by read

On va modifier ces champs avec la commande ldapmodify Pour cela on va creacuteer un fichier ldif

cat gt changeAccessldif ltlt EOF

dn olcDatabase=1hdbcn=config

changetype modify

delete olcAccess

-

add olcAccess

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by dn=cn=admindc=domainedc=tld write by none

-

add olcAccess

olcAccess 1to dnbase= by read

-

4

add olcAccess

olcAccess 2to by self write by dn=cn=admindc=domainedc=tld write by

none

-

EOF

On peut maintenant appliquer les changements avec ldapmodify

ldapmodify ndashc ndashY EXTERNAL ndashH ldapi -f changeAccessldif

La commande devrait vous confirmer que la modification srsquoest bien effectueacutee

SASLEXTERNAL authentication started

SASL username gidNumber=0+uidNumber=0cn=peercredcn=externalcn=auth

SASL SSF 0

modifying entry olcDatabase=1hdbcn=config

On peut veacuterifier qursquoon ne peut plus acceacuteder aux informations avec la commande

ldapsearch -x -c -h localhost -b dc=domainedc=tld

On peut veacuterifier la configuration en se connectant en tant qursquoadministrateur

ldapsearch -c -h localhost -b dc=domainedc=tld -D

cn=admindc=domainedc=tld ndashW

Configuration des Scheacutemas Nous allons utiliser les scheacutemas de courier-ldap Pour eacuteviter une manipulation compliqueacutee vous trouverez

directement le scheacutema avec le fichier authldapschema On place ce fichier dans le dossier

mv authldapschema etcldapschema

Nous creacuteons un fichier qui incluera tous les scheacutemas de base en plus du nouveau On peut les afficher avec la

commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

Creacuteation du fichier de configuration pour notre exemple cela donne

mkdir tmpldapconf

cat gt tmpldapconfldapconf ltlt EOF

include etcldapschemacoreschema

include etcldapschemacosineschema

include etcldapschemanisschema

include etcldapschemainetorgpersonschema

include etcldapschemaauthldapschema

EOF

On lance ensuite la commande

slaptest -f tmpldapconfldapconf -F tmpldapconf

Elle revoie un message de succegraves Cette commande a creacuteeacute dans le reacutepertoire tmpldapconf une arborescence

correspondant agrave la configuration de notre LDAP

On modifie le chemin de configuration

5

sed ndashi 0dnauthldap sauthldapauthldapcn=schemacn=config

cn=authldapldif

On supprime ensuite les 7 derniegraveres lignes du fichier

head -n -7 cn=authldapldif gt tmpldif

mv tmpldif cn=authldapldif

On peut maintenant importer notre fichier de configuration Pour ce faire

ldapadd -Y EXTERNAL -H ldapi -f

tmpldapconfcn=configcn=schemacn=authldapldif

Si tout va bien lrsquoentreacutee devrait avoir eacuteteacute ajouteacutee On peut veacuterifier avec la commande vue tout agrave lrsquoheure

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

On devrait voir en plus le nouveau scheacutema authldap

Constitution de la base de donneacutees LDAP Le remplissage de la base se fait agrave lrsquoaide de fichiers ldif Nous donnons ici un exemple de structure

Fichier pour la structure de base

dn dc=maildc=domainedc=tld

o intimailpw

description Global mail tree

dc mail

objectClass top

objectClass dcObject

objectClass organization

dn dc=peopledc=maildc=domainedc=tld

description Informations of all users

o people

dc people

objectClass top

objectClass dcObject

objectClass organization

dn dc=groupsdc=maildc=domainedc=tld

description All groups of users

o groups

dc groups

objectClass top

objectClass dcObject

objectClass organization

6

Fichier pour ajouter un utilisateur

dn cn=jbonddc=peopledc=maildc=domainedc=tld

uid jbond

mail jbonddomainetld

sn Moulin

givenName James

displayName James Bond

mailbox domainetldjbond

quota 50M

homeDirectory homevmail

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAccount

userPassword SSHA367PSXiUAegy8dpJbPU8OepEf8L5ye

Pour obtenir un hash du mot de passe

slappasswd -s password -h SSHA

On peut par la suite ajouter la configuration agrave la base de donneacutees avec la commande

ldapadd -D cn=admindc=domainedc=tld -W -h localhost -f pathtofile

Si les champs proposeacutes ne sont pas suffisants il faudra alors effectuer les modifications dans le fichier autldapschema

proposeacute plus haut et refaire la manipulation de configuration

De plus les standards du Mail deacutecrit par lrsquoIETF (RFC822 63 RFC1123 527 and RFC2821 451) impliquent drsquoavoir une

adresse Postmaster et une Abuse Pour cela nous pourrions creacuteer ces adresses avec la meacutethode vue au-dessus mais

ce nrsquoest pas la meilleure Il est preacutefeacuterable drsquoutiliser un alias comme nous le ferons avec les listes de diffusion Ici nous

proposons de rediriger ces deux adresses vers une adresse administrateur Pour cela la meacutethode est la mecircme sauf

que le fichier ldif nrsquoest pas tout agrave fait identique En voici un exemple

dn cn=postmasterdc=groupsdc=maildc=domainedc=tld

uid postmaster

mail postmasterdomainetld

sn Postmaster

displayName Postmaster

maildrop admindomainetld

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAlias

Pour faire une liste de diffusion la meacutethode est la mecircme Il suffit drsquoajouter toutes les adresses destinataires dans le

champ maildrop seacutepareacutees par des virgules ()

7

Installation de Postfix Installation des packages

apt-get install postfix postfix-ldap

Lors de lrsquoinstallation deux eacutecrans deacutefilent

- Configuration Internet Site

- Valeur par deacutefaut pour le mail name

On creacutee lrsquoutilisateur qui servira agrave exeacutecuter Postfix

groupadd vmail

useradd -g vmail -d homevmail -s binfalse -m vmail

Nous aurons besoin dans la suite des GID et UID creacuteeacutes agrave cet instant Ils peuvent ecirctre afficheacutes avec les commandes

cat etcgroup | grep vmail | cut -d -f3

cat etcpasswd | grep vmail | cut -d -f3

On ajoute les paramegravetres au fichier etcpostfixmaincf (remplacer les valeurs de GID et drsquoUID avec vos valeurs)

smtpd_banner = maildomainetld

virtual_mailbox_base = homevmail

virtual_mailbox_domains = dmainetld

virtual_mailbox_maps = ldapetcpostfixldap_accountscf

virtual_alias_maps = ldapetcpostfixldap_aliasescf

virtual_minimum_uid = 100

virtual_gid_maps = static1001 Remplacez ici par votre valeur de GID

virtual_uid_maps = static1001 Remplacez ici par votre valeur drsquoUID

Il nous faut maintenant constituer nos fichiers de configuration ldap_accountscf

cat gt etcpostfixldap_accountscf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=peopledc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAccount)(mail=s))

result_attribute = mailbox

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

Et pour ldap_aliasescf

cat gt ldap_aliasescf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=groupsdc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAlias)(mail=s))

result_attribute = maildrop

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

8

On peut maintenant veacuterifier la configuration de Postfix avec (cette commande ne doit rien retourner si crsquoest bon)

postfix check

Si crsquoest bon alors on recharge le serveur

postfix reload

On peut alors faire un envoi de mail test via telnet

telnet localhost 25

Si vous souhaitez deacutelivrer les mails agrave votre maniegravere il faut dans le fichier etcpostfixmaincf la ligne

virtual_transport = nomdevotreregle

Et de mecircme dans le fichier etcpostfixmastercf

nomdevotreregle unix - n n - 5 pipe

flags=Rq user=vmail null_sender=

argv=chemindevotreprogramme

Il nous reste maintenant agrave configurer les diffeacuterents enregistrements DNS neacutecessaire au fonctionnement drsquoun serveur

mail Vous pouvez utiliser la solution de votre choix Dans la suite vous trouverez une meacutethode utilisant Bind9

Installation de Bind9 Dans toute cette partie on se situera dans le dossier etcbind Dans la suite notre IP sera abcd

Dans le fichier namedconfoptions on ajoutera dans le champ options

version Not supported

Dans un dossier zones on eacutecrit le fichier dbdomainetld

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122111 Serial

43200 Refresh

3600 Retry

2419200 Expire

86400 ) Negative Cache TTL

IN NS nsdomainetld

IN NS ns11ovhnet

ns IN A abcd

www IN A abcd

IN A abcd

IN MX 10 maildomainetld

mail IN A abcd

Dans le mecircme dossier zones on a cbain-addrarpa

9

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122101 serial

14400 refresh

3600 retry

604800 expire

10800 minimum

)

cbain-addrarpa IN NS nsdomainetld

cbain-addrarpa IN NS ns11ovhnet

d IN PTR maildomainetld

Il faut faire attention agrave bien increacutementer le serial pour chaque modification des fichiers

Dans le fichier namedconflocal

zone domainetld

type master

file etcbindzonesdbdomainetld

allow-transfer 213251128130

notify yes

zone cbain-addrarpa IN

type master

file etcbindzonescbain-addrarpa

allow-transfer 213251128130

Ici 213251128130 est lrsquoadresse IP du serveur ns11ovhnet

Il faut bien sucircr configurer le DNS avec votre fournisseur (Gandi OVH hellip) Pour ccedila amusez-vous bien Vous pouvez

aussi tester votre configuration avec des outils en ligne tels que DNSstuff

En test final si votre configuration est bonne vous devriez pouvoir envoyer un mail depuis un service neutre (Gmail

yahoo hellip) et le voir dans votre arborescence (ici homevmaildomainetld)

Installation du paquet Debian et configuration de lighttpd

Commencez par reacutecupeacuterer le paquet deb agrave lrsquoadresse suivante httpswwwintimailpwintimaildeb

Installez ensuite GDebi Il srsquoagit drsquoun dpkg ameacutelioreacute pour teacuteleacutecharger les deacutependances automatiquement ce que

dpkg ne gegravere pas

apt-get update

apt-get install gdebi-core

10

Vous pouvez alors installer le paquet

gdebi intimaildeb

Vous aurez alors le site web drsquointiMail deacuteployeacute au chemin varwwwwebmail

Il ne vous reste plus qursquoagrave changer la configuration de lighttpd votre serveur web pour mettre en ligne le site

Vous pouvez pour cela copier-coller la configuration suivante mais veillez agrave bien changer lrsquoadresse IP preacutesente au

deacutebut de la partie SSL CONFIG avec votre adresse IP

serv ermodules = ( mod_access

mod_accesslog

mod_alias

mod_compress

mod_redirect

mod_rewrite

)

Hide server version

servertag = Such Headers Very try Now close telnet

serverdocument-root = varwwwwebmail

serverupload-dirs = ( varwwwwebmailuploads )

servererrorlog = varloglighttpderrorlog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

serverport = 80

accesslogformat = V h l u t r gts b Refereri

User-Agenti

accesslogfilename = varloglighttpdaccesslog

index-filenames = ( indexphp indexhtml

indexlighttpdhtml )

urlaccess-deny = ( ~ inc )

static-fileexclude-extensions = ( php pl fcgi )

compresscache-dir = varcachelighttpdcompress

compressfiletype = ( applicationjavascript textcss

texthtml textplain )

default listening port for IPv6 falls back to the IPv4 port

include_shell usrsharelighttpduse-ipv6pl + serverport

include_shell usrsharelighttpdcreate-mimeassignpl

include_shell usrsharelighttpdinclude-conf-enabledpl

SSL CONFIG

$SERVER[socket] == 5234485443

sslengine = enable

11

sslpemfile = etclighttpdsslintimailpwpem

sslca-file = etclighttpdsslintimailpwcrt

servername = intimailpw

votre configuration habituelle pour ce domaine

serverdocument-root = varwwwwebmail

servererrorlog = varloglighttpderror_ssllog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

Rewrite des URL pour masquer php

urlrewrite-once = ( ^()$ =gt $1 )

urlrewrite-if-not-file = ( ^([^])()$ =gt $1php$2 )

servernetwork-backend = writev

Deacutependances Slapd

Ldap-utils

Postfix

Postfix-ldap

Bind9

Lighttpd

12

Sources httpswikigandinetfrhostingusing-linuxtutorialsdebianmail-server-ldap

httpwwwpostfixorgpipe8html

httpwwwpostfixorgFILTER_READMEhtml

httpwwwpostfixorg

httpwwwpostfixorgtransport5html

Page 28: Système d'hébergement domestique...place sur les domaines .pw par Gandi.net, notre fournisseur. Nous n’avons donc pas pu l’implémenter. Nous avons configuré Postfix pour qu’il

Annexe 2 Scan DNSSTUFF

Depuis httpwwwdnsstuffcomtoolsdnsReport|type=domainampampvalue=intimailpw

Annexe 3 Vue geacuteneacuterale httpswwwintimailpw

Annexe 4 Envoyer un mail

Annexe 5 Boite de reacuteception

Annexe 6 Interface drsquoadministration

Annexe 7 Gestion drsquoun utilisateur

Tutorial installation intimailtrade

Table des matiegraveres Apregraves une nouvelle installation de lrsquoOS 2

Seacutecurisation du serveur 2

Changement de lrsquoutilisateur par deacutefaut 2

Changement du port SSH 2

Interdire lrsquoauthentification SSH pour root 2

Installation de LDAP 3

Configuration de base 3

Configuration des Scheacutemas 4

Constitution de la base de donneacutees LDAP 5

Installation de Postfix 7

Installation de Bind9 8

Installation du paquet Debian et configuration de lighttpd 9

Deacutependances 11

Sources 12

2

Apregraves une nouvelle installation de lrsquoOS Exeacutecutez ces commandes pour mettre agrave jour agrave la derniegravere version Ces opeacuterations peuvent prendre un certain

temps Nous avons utiliseacute pour cet exemple Raspbian Jessie Lite sur une Raspberry Pi 2

apt-get update

apt-get upgrade ampamp apt-get dist-upgrade

apt-get install linux-headers-$(uname -r)

reboot

Puis lancer

raspi-config

Etendre au maximum lrsquoespace de stockage en navigant dans les menus

Expand Filesystem

Reacutegler une ip statique avec la box fichier etcnetworkinterfaces

iface eth0 inet static

address 192168131

netmask 2552552550

gateway 19216811

Nous avons aussi supprimeacute wpasupplicant

Seacutecurisation du serveur

Changement de lrsquoutilisateur par deacutefaut Changez le nom drsquoutilisateur par deacutefaut ainsi que son mot de passe

sudo passwd root

Sortie et login en tant que root puis

usermod -l myuname pi

usermod -m -d homemyuname myuname

groupmod ndashn myuname pi

passwd myuname

Voir cette adresse pour lrsquoutilisation de cleacutes priveacuteespubliques

Changement du port SSH sed ndashi sPort 22Port 2222g etcsshsshd_config

Interdire lrsquoauthentification SSH pour root sed -i sPermitRootLogin yesPermitRootLogin nog etcsshsshd_config

3

Installation de LDAP

Configuration de base Installation du package

apt-get install slapd

Choisir un mot de passe administrateur puis lancer la commande

dpkg-reconfigure slapd

Reacutepondre non agrave la question 1

Entrez le nom de domaine utiliseacute agrave la question 2 sous la forme domainetld

Entrez ce que vous voulez au 3egraveme eacutecran le nom de lrsquoorganisation ne sera pas utiliseacute

Entrez un mot de passe

Choisissez HDB

Choisissez si la base de donneacutees est supprimeacutee agrave la deacutesinstallation de slapd

Deacuteplacez lrsquoancienne base de donneacutees

Nrsquoutilisez pas LDAPv2

Installer les outils de conversion pour ldap (slaptest ldapmodify notamment)

apt-get install ldap-utils

On peut maintenant veacuterifier que la configuration est valable

ldapsearch -x -h localhost -b dc=domainedc=tld -LLL dc=domaine dn

Cette commande doit retourner quelque chose comme

dn dc=domainedc=tld

Il faut maintenant seacutecuriser le serveur LDAP en effet on peut y acceacuteder en anonyme avec la commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=config

(amp(objectClass=olcDatabaseConfig)(olcSuffix=dc=domainedc=tld))

Cette commande retourne un certain nombre drsquoinformations notamment agrave propos des champs suivants

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by none

olcAccess 1to dnbase= by read

olcAccess 2to by read

On va modifier ces champs avec la commande ldapmodify Pour cela on va creacuteer un fichier ldif

cat gt changeAccessldif ltlt EOF

dn olcDatabase=1hdbcn=config

changetype modify

delete olcAccess

-

add olcAccess

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by dn=cn=admindc=domainedc=tld write by none

-

add olcAccess

olcAccess 1to dnbase= by read

-

4

add olcAccess

olcAccess 2to by self write by dn=cn=admindc=domainedc=tld write by

none

-

EOF

On peut maintenant appliquer les changements avec ldapmodify

ldapmodify ndashc ndashY EXTERNAL ndashH ldapi -f changeAccessldif

La commande devrait vous confirmer que la modification srsquoest bien effectueacutee

SASLEXTERNAL authentication started

SASL username gidNumber=0+uidNumber=0cn=peercredcn=externalcn=auth

SASL SSF 0

modifying entry olcDatabase=1hdbcn=config

On peut veacuterifier qursquoon ne peut plus acceacuteder aux informations avec la commande

ldapsearch -x -c -h localhost -b dc=domainedc=tld

On peut veacuterifier la configuration en se connectant en tant qursquoadministrateur

ldapsearch -c -h localhost -b dc=domainedc=tld -D

cn=admindc=domainedc=tld ndashW

Configuration des Scheacutemas Nous allons utiliser les scheacutemas de courier-ldap Pour eacuteviter une manipulation compliqueacutee vous trouverez

directement le scheacutema avec le fichier authldapschema On place ce fichier dans le dossier

mv authldapschema etcldapschema

Nous creacuteons un fichier qui incluera tous les scheacutemas de base en plus du nouveau On peut les afficher avec la

commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

Creacuteation du fichier de configuration pour notre exemple cela donne

mkdir tmpldapconf

cat gt tmpldapconfldapconf ltlt EOF

include etcldapschemacoreschema

include etcldapschemacosineschema

include etcldapschemanisschema

include etcldapschemainetorgpersonschema

include etcldapschemaauthldapschema

EOF

On lance ensuite la commande

slaptest -f tmpldapconfldapconf -F tmpldapconf

Elle revoie un message de succegraves Cette commande a creacuteeacute dans le reacutepertoire tmpldapconf une arborescence

correspondant agrave la configuration de notre LDAP

On modifie le chemin de configuration

5

sed ndashi 0dnauthldap sauthldapauthldapcn=schemacn=config

cn=authldapldif

On supprime ensuite les 7 derniegraveres lignes du fichier

head -n -7 cn=authldapldif gt tmpldif

mv tmpldif cn=authldapldif

On peut maintenant importer notre fichier de configuration Pour ce faire

ldapadd -Y EXTERNAL -H ldapi -f

tmpldapconfcn=configcn=schemacn=authldapldif

Si tout va bien lrsquoentreacutee devrait avoir eacuteteacute ajouteacutee On peut veacuterifier avec la commande vue tout agrave lrsquoheure

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

On devrait voir en plus le nouveau scheacutema authldap

Constitution de la base de donneacutees LDAP Le remplissage de la base se fait agrave lrsquoaide de fichiers ldif Nous donnons ici un exemple de structure

Fichier pour la structure de base

dn dc=maildc=domainedc=tld

o intimailpw

description Global mail tree

dc mail

objectClass top

objectClass dcObject

objectClass organization

dn dc=peopledc=maildc=domainedc=tld

description Informations of all users

o people

dc people

objectClass top

objectClass dcObject

objectClass organization

dn dc=groupsdc=maildc=domainedc=tld

description All groups of users

o groups

dc groups

objectClass top

objectClass dcObject

objectClass organization

6

Fichier pour ajouter un utilisateur

dn cn=jbonddc=peopledc=maildc=domainedc=tld

uid jbond

mail jbonddomainetld

sn Moulin

givenName James

displayName James Bond

mailbox domainetldjbond

quota 50M

homeDirectory homevmail

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAccount

userPassword SSHA367PSXiUAegy8dpJbPU8OepEf8L5ye

Pour obtenir un hash du mot de passe

slappasswd -s password -h SSHA

On peut par la suite ajouter la configuration agrave la base de donneacutees avec la commande

ldapadd -D cn=admindc=domainedc=tld -W -h localhost -f pathtofile

Si les champs proposeacutes ne sont pas suffisants il faudra alors effectuer les modifications dans le fichier autldapschema

proposeacute plus haut et refaire la manipulation de configuration

De plus les standards du Mail deacutecrit par lrsquoIETF (RFC822 63 RFC1123 527 and RFC2821 451) impliquent drsquoavoir une

adresse Postmaster et une Abuse Pour cela nous pourrions creacuteer ces adresses avec la meacutethode vue au-dessus mais

ce nrsquoest pas la meilleure Il est preacutefeacuterable drsquoutiliser un alias comme nous le ferons avec les listes de diffusion Ici nous

proposons de rediriger ces deux adresses vers une adresse administrateur Pour cela la meacutethode est la mecircme sauf

que le fichier ldif nrsquoest pas tout agrave fait identique En voici un exemple

dn cn=postmasterdc=groupsdc=maildc=domainedc=tld

uid postmaster

mail postmasterdomainetld

sn Postmaster

displayName Postmaster

maildrop admindomainetld

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAlias

Pour faire une liste de diffusion la meacutethode est la mecircme Il suffit drsquoajouter toutes les adresses destinataires dans le

champ maildrop seacutepareacutees par des virgules ()

7

Installation de Postfix Installation des packages

apt-get install postfix postfix-ldap

Lors de lrsquoinstallation deux eacutecrans deacutefilent

- Configuration Internet Site

- Valeur par deacutefaut pour le mail name

On creacutee lrsquoutilisateur qui servira agrave exeacutecuter Postfix

groupadd vmail

useradd -g vmail -d homevmail -s binfalse -m vmail

Nous aurons besoin dans la suite des GID et UID creacuteeacutes agrave cet instant Ils peuvent ecirctre afficheacutes avec les commandes

cat etcgroup | grep vmail | cut -d -f3

cat etcpasswd | grep vmail | cut -d -f3

On ajoute les paramegravetres au fichier etcpostfixmaincf (remplacer les valeurs de GID et drsquoUID avec vos valeurs)

smtpd_banner = maildomainetld

virtual_mailbox_base = homevmail

virtual_mailbox_domains = dmainetld

virtual_mailbox_maps = ldapetcpostfixldap_accountscf

virtual_alias_maps = ldapetcpostfixldap_aliasescf

virtual_minimum_uid = 100

virtual_gid_maps = static1001 Remplacez ici par votre valeur de GID

virtual_uid_maps = static1001 Remplacez ici par votre valeur drsquoUID

Il nous faut maintenant constituer nos fichiers de configuration ldap_accountscf

cat gt etcpostfixldap_accountscf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=peopledc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAccount)(mail=s))

result_attribute = mailbox

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

Et pour ldap_aliasescf

cat gt ldap_aliasescf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=groupsdc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAlias)(mail=s))

result_attribute = maildrop

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

8

On peut maintenant veacuterifier la configuration de Postfix avec (cette commande ne doit rien retourner si crsquoest bon)

postfix check

Si crsquoest bon alors on recharge le serveur

postfix reload

On peut alors faire un envoi de mail test via telnet

telnet localhost 25

Si vous souhaitez deacutelivrer les mails agrave votre maniegravere il faut dans le fichier etcpostfixmaincf la ligne

virtual_transport = nomdevotreregle

Et de mecircme dans le fichier etcpostfixmastercf

nomdevotreregle unix - n n - 5 pipe

flags=Rq user=vmail null_sender=

argv=chemindevotreprogramme

Il nous reste maintenant agrave configurer les diffeacuterents enregistrements DNS neacutecessaire au fonctionnement drsquoun serveur

mail Vous pouvez utiliser la solution de votre choix Dans la suite vous trouverez une meacutethode utilisant Bind9

Installation de Bind9 Dans toute cette partie on se situera dans le dossier etcbind Dans la suite notre IP sera abcd

Dans le fichier namedconfoptions on ajoutera dans le champ options

version Not supported

Dans un dossier zones on eacutecrit le fichier dbdomainetld

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122111 Serial

43200 Refresh

3600 Retry

2419200 Expire

86400 ) Negative Cache TTL

IN NS nsdomainetld

IN NS ns11ovhnet

ns IN A abcd

www IN A abcd

IN A abcd

IN MX 10 maildomainetld

mail IN A abcd

Dans le mecircme dossier zones on a cbain-addrarpa

9

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122101 serial

14400 refresh

3600 retry

604800 expire

10800 minimum

)

cbain-addrarpa IN NS nsdomainetld

cbain-addrarpa IN NS ns11ovhnet

d IN PTR maildomainetld

Il faut faire attention agrave bien increacutementer le serial pour chaque modification des fichiers

Dans le fichier namedconflocal

zone domainetld

type master

file etcbindzonesdbdomainetld

allow-transfer 213251128130

notify yes

zone cbain-addrarpa IN

type master

file etcbindzonescbain-addrarpa

allow-transfer 213251128130

Ici 213251128130 est lrsquoadresse IP du serveur ns11ovhnet

Il faut bien sucircr configurer le DNS avec votre fournisseur (Gandi OVH hellip) Pour ccedila amusez-vous bien Vous pouvez

aussi tester votre configuration avec des outils en ligne tels que DNSstuff

En test final si votre configuration est bonne vous devriez pouvoir envoyer un mail depuis un service neutre (Gmail

yahoo hellip) et le voir dans votre arborescence (ici homevmaildomainetld)

Installation du paquet Debian et configuration de lighttpd

Commencez par reacutecupeacuterer le paquet deb agrave lrsquoadresse suivante httpswwwintimailpwintimaildeb

Installez ensuite GDebi Il srsquoagit drsquoun dpkg ameacutelioreacute pour teacuteleacutecharger les deacutependances automatiquement ce que

dpkg ne gegravere pas

apt-get update

apt-get install gdebi-core

10

Vous pouvez alors installer le paquet

gdebi intimaildeb

Vous aurez alors le site web drsquointiMail deacuteployeacute au chemin varwwwwebmail

Il ne vous reste plus qursquoagrave changer la configuration de lighttpd votre serveur web pour mettre en ligne le site

Vous pouvez pour cela copier-coller la configuration suivante mais veillez agrave bien changer lrsquoadresse IP preacutesente au

deacutebut de la partie SSL CONFIG avec votre adresse IP

serv ermodules = ( mod_access

mod_accesslog

mod_alias

mod_compress

mod_redirect

mod_rewrite

)

Hide server version

servertag = Such Headers Very try Now close telnet

serverdocument-root = varwwwwebmail

serverupload-dirs = ( varwwwwebmailuploads )

servererrorlog = varloglighttpderrorlog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

serverport = 80

accesslogformat = V h l u t r gts b Refereri

User-Agenti

accesslogfilename = varloglighttpdaccesslog

index-filenames = ( indexphp indexhtml

indexlighttpdhtml )

urlaccess-deny = ( ~ inc )

static-fileexclude-extensions = ( php pl fcgi )

compresscache-dir = varcachelighttpdcompress

compressfiletype = ( applicationjavascript textcss

texthtml textplain )

default listening port for IPv6 falls back to the IPv4 port

include_shell usrsharelighttpduse-ipv6pl + serverport

include_shell usrsharelighttpdcreate-mimeassignpl

include_shell usrsharelighttpdinclude-conf-enabledpl

SSL CONFIG

$SERVER[socket] == 5234485443

sslengine = enable

11

sslpemfile = etclighttpdsslintimailpwpem

sslca-file = etclighttpdsslintimailpwcrt

servername = intimailpw

votre configuration habituelle pour ce domaine

serverdocument-root = varwwwwebmail

servererrorlog = varloglighttpderror_ssllog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

Rewrite des URL pour masquer php

urlrewrite-once = ( ^()$ =gt $1 )

urlrewrite-if-not-file = ( ^([^])()$ =gt $1php$2 )

servernetwork-backend = writev

Deacutependances Slapd

Ldap-utils

Postfix

Postfix-ldap

Bind9

Lighttpd

12

Sources httpswikigandinetfrhostingusing-linuxtutorialsdebianmail-server-ldap

httpwwwpostfixorgpipe8html

httpwwwpostfixorgFILTER_READMEhtml

httpwwwpostfixorg

httpwwwpostfixorgtransport5html

Page 29: Système d'hébergement domestique...place sur les domaines .pw par Gandi.net, notre fournisseur. Nous n’avons donc pas pu l’implémenter. Nous avons configuré Postfix pour qu’il

Annexe 3 Vue geacuteneacuterale httpswwwintimailpw

Annexe 4 Envoyer un mail

Annexe 5 Boite de reacuteception

Annexe 6 Interface drsquoadministration

Annexe 7 Gestion drsquoun utilisateur

Tutorial installation intimailtrade

Table des matiegraveres Apregraves une nouvelle installation de lrsquoOS 2

Seacutecurisation du serveur 2

Changement de lrsquoutilisateur par deacutefaut 2

Changement du port SSH 2

Interdire lrsquoauthentification SSH pour root 2

Installation de LDAP 3

Configuration de base 3

Configuration des Scheacutemas 4

Constitution de la base de donneacutees LDAP 5

Installation de Postfix 7

Installation de Bind9 8

Installation du paquet Debian et configuration de lighttpd 9

Deacutependances 11

Sources 12

2

Apregraves une nouvelle installation de lrsquoOS Exeacutecutez ces commandes pour mettre agrave jour agrave la derniegravere version Ces opeacuterations peuvent prendre un certain

temps Nous avons utiliseacute pour cet exemple Raspbian Jessie Lite sur une Raspberry Pi 2

apt-get update

apt-get upgrade ampamp apt-get dist-upgrade

apt-get install linux-headers-$(uname -r)

reboot

Puis lancer

raspi-config

Etendre au maximum lrsquoespace de stockage en navigant dans les menus

Expand Filesystem

Reacutegler une ip statique avec la box fichier etcnetworkinterfaces

iface eth0 inet static

address 192168131

netmask 2552552550

gateway 19216811

Nous avons aussi supprimeacute wpasupplicant

Seacutecurisation du serveur

Changement de lrsquoutilisateur par deacutefaut Changez le nom drsquoutilisateur par deacutefaut ainsi que son mot de passe

sudo passwd root

Sortie et login en tant que root puis

usermod -l myuname pi

usermod -m -d homemyuname myuname

groupmod ndashn myuname pi

passwd myuname

Voir cette adresse pour lrsquoutilisation de cleacutes priveacuteespubliques

Changement du port SSH sed ndashi sPort 22Port 2222g etcsshsshd_config

Interdire lrsquoauthentification SSH pour root sed -i sPermitRootLogin yesPermitRootLogin nog etcsshsshd_config

3

Installation de LDAP

Configuration de base Installation du package

apt-get install slapd

Choisir un mot de passe administrateur puis lancer la commande

dpkg-reconfigure slapd

Reacutepondre non agrave la question 1

Entrez le nom de domaine utiliseacute agrave la question 2 sous la forme domainetld

Entrez ce que vous voulez au 3egraveme eacutecran le nom de lrsquoorganisation ne sera pas utiliseacute

Entrez un mot de passe

Choisissez HDB

Choisissez si la base de donneacutees est supprimeacutee agrave la deacutesinstallation de slapd

Deacuteplacez lrsquoancienne base de donneacutees

Nrsquoutilisez pas LDAPv2

Installer les outils de conversion pour ldap (slaptest ldapmodify notamment)

apt-get install ldap-utils

On peut maintenant veacuterifier que la configuration est valable

ldapsearch -x -h localhost -b dc=domainedc=tld -LLL dc=domaine dn

Cette commande doit retourner quelque chose comme

dn dc=domainedc=tld

Il faut maintenant seacutecuriser le serveur LDAP en effet on peut y acceacuteder en anonyme avec la commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=config

(amp(objectClass=olcDatabaseConfig)(olcSuffix=dc=domainedc=tld))

Cette commande retourne un certain nombre drsquoinformations notamment agrave propos des champs suivants

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by none

olcAccess 1to dnbase= by read

olcAccess 2to by read

On va modifier ces champs avec la commande ldapmodify Pour cela on va creacuteer un fichier ldif

cat gt changeAccessldif ltlt EOF

dn olcDatabase=1hdbcn=config

changetype modify

delete olcAccess

-

add olcAccess

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by dn=cn=admindc=domainedc=tld write by none

-

add olcAccess

olcAccess 1to dnbase= by read

-

4

add olcAccess

olcAccess 2to by self write by dn=cn=admindc=domainedc=tld write by

none

-

EOF

On peut maintenant appliquer les changements avec ldapmodify

ldapmodify ndashc ndashY EXTERNAL ndashH ldapi -f changeAccessldif

La commande devrait vous confirmer que la modification srsquoest bien effectueacutee

SASLEXTERNAL authentication started

SASL username gidNumber=0+uidNumber=0cn=peercredcn=externalcn=auth

SASL SSF 0

modifying entry olcDatabase=1hdbcn=config

On peut veacuterifier qursquoon ne peut plus acceacuteder aux informations avec la commande

ldapsearch -x -c -h localhost -b dc=domainedc=tld

On peut veacuterifier la configuration en se connectant en tant qursquoadministrateur

ldapsearch -c -h localhost -b dc=domainedc=tld -D

cn=admindc=domainedc=tld ndashW

Configuration des Scheacutemas Nous allons utiliser les scheacutemas de courier-ldap Pour eacuteviter une manipulation compliqueacutee vous trouverez

directement le scheacutema avec le fichier authldapschema On place ce fichier dans le dossier

mv authldapschema etcldapschema

Nous creacuteons un fichier qui incluera tous les scheacutemas de base en plus du nouveau On peut les afficher avec la

commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

Creacuteation du fichier de configuration pour notre exemple cela donne

mkdir tmpldapconf

cat gt tmpldapconfldapconf ltlt EOF

include etcldapschemacoreschema

include etcldapschemacosineschema

include etcldapschemanisschema

include etcldapschemainetorgpersonschema

include etcldapschemaauthldapschema

EOF

On lance ensuite la commande

slaptest -f tmpldapconfldapconf -F tmpldapconf

Elle revoie un message de succegraves Cette commande a creacuteeacute dans le reacutepertoire tmpldapconf une arborescence

correspondant agrave la configuration de notre LDAP

On modifie le chemin de configuration

5

sed ndashi 0dnauthldap sauthldapauthldapcn=schemacn=config

cn=authldapldif

On supprime ensuite les 7 derniegraveres lignes du fichier

head -n -7 cn=authldapldif gt tmpldif

mv tmpldif cn=authldapldif

On peut maintenant importer notre fichier de configuration Pour ce faire

ldapadd -Y EXTERNAL -H ldapi -f

tmpldapconfcn=configcn=schemacn=authldapldif

Si tout va bien lrsquoentreacutee devrait avoir eacuteteacute ajouteacutee On peut veacuterifier avec la commande vue tout agrave lrsquoheure

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

On devrait voir en plus le nouveau scheacutema authldap

Constitution de la base de donneacutees LDAP Le remplissage de la base se fait agrave lrsquoaide de fichiers ldif Nous donnons ici un exemple de structure

Fichier pour la structure de base

dn dc=maildc=domainedc=tld

o intimailpw

description Global mail tree

dc mail

objectClass top

objectClass dcObject

objectClass organization

dn dc=peopledc=maildc=domainedc=tld

description Informations of all users

o people

dc people

objectClass top

objectClass dcObject

objectClass organization

dn dc=groupsdc=maildc=domainedc=tld

description All groups of users

o groups

dc groups

objectClass top

objectClass dcObject

objectClass organization

6

Fichier pour ajouter un utilisateur

dn cn=jbonddc=peopledc=maildc=domainedc=tld

uid jbond

mail jbonddomainetld

sn Moulin

givenName James

displayName James Bond

mailbox domainetldjbond

quota 50M

homeDirectory homevmail

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAccount

userPassword SSHA367PSXiUAegy8dpJbPU8OepEf8L5ye

Pour obtenir un hash du mot de passe

slappasswd -s password -h SSHA

On peut par la suite ajouter la configuration agrave la base de donneacutees avec la commande

ldapadd -D cn=admindc=domainedc=tld -W -h localhost -f pathtofile

Si les champs proposeacutes ne sont pas suffisants il faudra alors effectuer les modifications dans le fichier autldapschema

proposeacute plus haut et refaire la manipulation de configuration

De plus les standards du Mail deacutecrit par lrsquoIETF (RFC822 63 RFC1123 527 and RFC2821 451) impliquent drsquoavoir une

adresse Postmaster et une Abuse Pour cela nous pourrions creacuteer ces adresses avec la meacutethode vue au-dessus mais

ce nrsquoest pas la meilleure Il est preacutefeacuterable drsquoutiliser un alias comme nous le ferons avec les listes de diffusion Ici nous

proposons de rediriger ces deux adresses vers une adresse administrateur Pour cela la meacutethode est la mecircme sauf

que le fichier ldif nrsquoest pas tout agrave fait identique En voici un exemple

dn cn=postmasterdc=groupsdc=maildc=domainedc=tld

uid postmaster

mail postmasterdomainetld

sn Postmaster

displayName Postmaster

maildrop admindomainetld

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAlias

Pour faire une liste de diffusion la meacutethode est la mecircme Il suffit drsquoajouter toutes les adresses destinataires dans le

champ maildrop seacutepareacutees par des virgules ()

7

Installation de Postfix Installation des packages

apt-get install postfix postfix-ldap

Lors de lrsquoinstallation deux eacutecrans deacutefilent

- Configuration Internet Site

- Valeur par deacutefaut pour le mail name

On creacutee lrsquoutilisateur qui servira agrave exeacutecuter Postfix

groupadd vmail

useradd -g vmail -d homevmail -s binfalse -m vmail

Nous aurons besoin dans la suite des GID et UID creacuteeacutes agrave cet instant Ils peuvent ecirctre afficheacutes avec les commandes

cat etcgroup | grep vmail | cut -d -f3

cat etcpasswd | grep vmail | cut -d -f3

On ajoute les paramegravetres au fichier etcpostfixmaincf (remplacer les valeurs de GID et drsquoUID avec vos valeurs)

smtpd_banner = maildomainetld

virtual_mailbox_base = homevmail

virtual_mailbox_domains = dmainetld

virtual_mailbox_maps = ldapetcpostfixldap_accountscf

virtual_alias_maps = ldapetcpostfixldap_aliasescf

virtual_minimum_uid = 100

virtual_gid_maps = static1001 Remplacez ici par votre valeur de GID

virtual_uid_maps = static1001 Remplacez ici par votre valeur drsquoUID

Il nous faut maintenant constituer nos fichiers de configuration ldap_accountscf

cat gt etcpostfixldap_accountscf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=peopledc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAccount)(mail=s))

result_attribute = mailbox

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

Et pour ldap_aliasescf

cat gt ldap_aliasescf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=groupsdc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAlias)(mail=s))

result_attribute = maildrop

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

8

On peut maintenant veacuterifier la configuration de Postfix avec (cette commande ne doit rien retourner si crsquoest bon)

postfix check

Si crsquoest bon alors on recharge le serveur

postfix reload

On peut alors faire un envoi de mail test via telnet

telnet localhost 25

Si vous souhaitez deacutelivrer les mails agrave votre maniegravere il faut dans le fichier etcpostfixmaincf la ligne

virtual_transport = nomdevotreregle

Et de mecircme dans le fichier etcpostfixmastercf

nomdevotreregle unix - n n - 5 pipe

flags=Rq user=vmail null_sender=

argv=chemindevotreprogramme

Il nous reste maintenant agrave configurer les diffeacuterents enregistrements DNS neacutecessaire au fonctionnement drsquoun serveur

mail Vous pouvez utiliser la solution de votre choix Dans la suite vous trouverez une meacutethode utilisant Bind9

Installation de Bind9 Dans toute cette partie on se situera dans le dossier etcbind Dans la suite notre IP sera abcd

Dans le fichier namedconfoptions on ajoutera dans le champ options

version Not supported

Dans un dossier zones on eacutecrit le fichier dbdomainetld

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122111 Serial

43200 Refresh

3600 Retry

2419200 Expire

86400 ) Negative Cache TTL

IN NS nsdomainetld

IN NS ns11ovhnet

ns IN A abcd

www IN A abcd

IN A abcd

IN MX 10 maildomainetld

mail IN A abcd

Dans le mecircme dossier zones on a cbain-addrarpa

9

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122101 serial

14400 refresh

3600 retry

604800 expire

10800 minimum

)

cbain-addrarpa IN NS nsdomainetld

cbain-addrarpa IN NS ns11ovhnet

d IN PTR maildomainetld

Il faut faire attention agrave bien increacutementer le serial pour chaque modification des fichiers

Dans le fichier namedconflocal

zone domainetld

type master

file etcbindzonesdbdomainetld

allow-transfer 213251128130

notify yes

zone cbain-addrarpa IN

type master

file etcbindzonescbain-addrarpa

allow-transfer 213251128130

Ici 213251128130 est lrsquoadresse IP du serveur ns11ovhnet

Il faut bien sucircr configurer le DNS avec votre fournisseur (Gandi OVH hellip) Pour ccedila amusez-vous bien Vous pouvez

aussi tester votre configuration avec des outils en ligne tels que DNSstuff

En test final si votre configuration est bonne vous devriez pouvoir envoyer un mail depuis un service neutre (Gmail

yahoo hellip) et le voir dans votre arborescence (ici homevmaildomainetld)

Installation du paquet Debian et configuration de lighttpd

Commencez par reacutecupeacuterer le paquet deb agrave lrsquoadresse suivante httpswwwintimailpwintimaildeb

Installez ensuite GDebi Il srsquoagit drsquoun dpkg ameacutelioreacute pour teacuteleacutecharger les deacutependances automatiquement ce que

dpkg ne gegravere pas

apt-get update

apt-get install gdebi-core

10

Vous pouvez alors installer le paquet

gdebi intimaildeb

Vous aurez alors le site web drsquointiMail deacuteployeacute au chemin varwwwwebmail

Il ne vous reste plus qursquoagrave changer la configuration de lighttpd votre serveur web pour mettre en ligne le site

Vous pouvez pour cela copier-coller la configuration suivante mais veillez agrave bien changer lrsquoadresse IP preacutesente au

deacutebut de la partie SSL CONFIG avec votre adresse IP

serv ermodules = ( mod_access

mod_accesslog

mod_alias

mod_compress

mod_redirect

mod_rewrite

)

Hide server version

servertag = Such Headers Very try Now close telnet

serverdocument-root = varwwwwebmail

serverupload-dirs = ( varwwwwebmailuploads )

servererrorlog = varloglighttpderrorlog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

serverport = 80

accesslogformat = V h l u t r gts b Refereri

User-Agenti

accesslogfilename = varloglighttpdaccesslog

index-filenames = ( indexphp indexhtml

indexlighttpdhtml )

urlaccess-deny = ( ~ inc )

static-fileexclude-extensions = ( php pl fcgi )

compresscache-dir = varcachelighttpdcompress

compressfiletype = ( applicationjavascript textcss

texthtml textplain )

default listening port for IPv6 falls back to the IPv4 port

include_shell usrsharelighttpduse-ipv6pl + serverport

include_shell usrsharelighttpdcreate-mimeassignpl

include_shell usrsharelighttpdinclude-conf-enabledpl

SSL CONFIG

$SERVER[socket] == 5234485443

sslengine = enable

11

sslpemfile = etclighttpdsslintimailpwpem

sslca-file = etclighttpdsslintimailpwcrt

servername = intimailpw

votre configuration habituelle pour ce domaine

serverdocument-root = varwwwwebmail

servererrorlog = varloglighttpderror_ssllog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

Rewrite des URL pour masquer php

urlrewrite-once = ( ^()$ =gt $1 )

urlrewrite-if-not-file = ( ^([^])()$ =gt $1php$2 )

servernetwork-backend = writev

Deacutependances Slapd

Ldap-utils

Postfix

Postfix-ldap

Bind9

Lighttpd

12

Sources httpswikigandinetfrhostingusing-linuxtutorialsdebianmail-server-ldap

httpwwwpostfixorgpipe8html

httpwwwpostfixorgFILTER_READMEhtml

httpwwwpostfixorg

httpwwwpostfixorgtransport5html

Page 30: Système d'hébergement domestique...place sur les domaines .pw par Gandi.net, notre fournisseur. Nous n’avons donc pas pu l’implémenter. Nous avons configuré Postfix pour qu’il

Annexe 4 Envoyer un mail

Annexe 5 Boite de reacuteception

Annexe 6 Interface drsquoadministration

Annexe 7 Gestion drsquoun utilisateur

Tutorial installation intimailtrade

Table des matiegraveres Apregraves une nouvelle installation de lrsquoOS 2

Seacutecurisation du serveur 2

Changement de lrsquoutilisateur par deacutefaut 2

Changement du port SSH 2

Interdire lrsquoauthentification SSH pour root 2

Installation de LDAP 3

Configuration de base 3

Configuration des Scheacutemas 4

Constitution de la base de donneacutees LDAP 5

Installation de Postfix 7

Installation de Bind9 8

Installation du paquet Debian et configuration de lighttpd 9

Deacutependances 11

Sources 12

2

Apregraves une nouvelle installation de lrsquoOS Exeacutecutez ces commandes pour mettre agrave jour agrave la derniegravere version Ces opeacuterations peuvent prendre un certain

temps Nous avons utiliseacute pour cet exemple Raspbian Jessie Lite sur une Raspberry Pi 2

apt-get update

apt-get upgrade ampamp apt-get dist-upgrade

apt-get install linux-headers-$(uname -r)

reboot

Puis lancer

raspi-config

Etendre au maximum lrsquoespace de stockage en navigant dans les menus

Expand Filesystem

Reacutegler une ip statique avec la box fichier etcnetworkinterfaces

iface eth0 inet static

address 192168131

netmask 2552552550

gateway 19216811

Nous avons aussi supprimeacute wpasupplicant

Seacutecurisation du serveur

Changement de lrsquoutilisateur par deacutefaut Changez le nom drsquoutilisateur par deacutefaut ainsi que son mot de passe

sudo passwd root

Sortie et login en tant que root puis

usermod -l myuname pi

usermod -m -d homemyuname myuname

groupmod ndashn myuname pi

passwd myuname

Voir cette adresse pour lrsquoutilisation de cleacutes priveacuteespubliques

Changement du port SSH sed ndashi sPort 22Port 2222g etcsshsshd_config

Interdire lrsquoauthentification SSH pour root sed -i sPermitRootLogin yesPermitRootLogin nog etcsshsshd_config

3

Installation de LDAP

Configuration de base Installation du package

apt-get install slapd

Choisir un mot de passe administrateur puis lancer la commande

dpkg-reconfigure slapd

Reacutepondre non agrave la question 1

Entrez le nom de domaine utiliseacute agrave la question 2 sous la forme domainetld

Entrez ce que vous voulez au 3egraveme eacutecran le nom de lrsquoorganisation ne sera pas utiliseacute

Entrez un mot de passe

Choisissez HDB

Choisissez si la base de donneacutees est supprimeacutee agrave la deacutesinstallation de slapd

Deacuteplacez lrsquoancienne base de donneacutees

Nrsquoutilisez pas LDAPv2

Installer les outils de conversion pour ldap (slaptest ldapmodify notamment)

apt-get install ldap-utils

On peut maintenant veacuterifier que la configuration est valable

ldapsearch -x -h localhost -b dc=domainedc=tld -LLL dc=domaine dn

Cette commande doit retourner quelque chose comme

dn dc=domainedc=tld

Il faut maintenant seacutecuriser le serveur LDAP en effet on peut y acceacuteder en anonyme avec la commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=config

(amp(objectClass=olcDatabaseConfig)(olcSuffix=dc=domainedc=tld))

Cette commande retourne un certain nombre drsquoinformations notamment agrave propos des champs suivants

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by none

olcAccess 1to dnbase= by read

olcAccess 2to by read

On va modifier ces champs avec la commande ldapmodify Pour cela on va creacuteer un fichier ldif

cat gt changeAccessldif ltlt EOF

dn olcDatabase=1hdbcn=config

changetype modify

delete olcAccess

-

add olcAccess

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by dn=cn=admindc=domainedc=tld write by none

-

add olcAccess

olcAccess 1to dnbase= by read

-

4

add olcAccess

olcAccess 2to by self write by dn=cn=admindc=domainedc=tld write by

none

-

EOF

On peut maintenant appliquer les changements avec ldapmodify

ldapmodify ndashc ndashY EXTERNAL ndashH ldapi -f changeAccessldif

La commande devrait vous confirmer que la modification srsquoest bien effectueacutee

SASLEXTERNAL authentication started

SASL username gidNumber=0+uidNumber=0cn=peercredcn=externalcn=auth

SASL SSF 0

modifying entry olcDatabase=1hdbcn=config

On peut veacuterifier qursquoon ne peut plus acceacuteder aux informations avec la commande

ldapsearch -x -c -h localhost -b dc=domainedc=tld

On peut veacuterifier la configuration en se connectant en tant qursquoadministrateur

ldapsearch -c -h localhost -b dc=domainedc=tld -D

cn=admindc=domainedc=tld ndashW

Configuration des Scheacutemas Nous allons utiliser les scheacutemas de courier-ldap Pour eacuteviter une manipulation compliqueacutee vous trouverez

directement le scheacutema avec le fichier authldapschema On place ce fichier dans le dossier

mv authldapschema etcldapschema

Nous creacuteons un fichier qui incluera tous les scheacutemas de base en plus du nouveau On peut les afficher avec la

commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

Creacuteation du fichier de configuration pour notre exemple cela donne

mkdir tmpldapconf

cat gt tmpldapconfldapconf ltlt EOF

include etcldapschemacoreschema

include etcldapschemacosineschema

include etcldapschemanisschema

include etcldapschemainetorgpersonschema

include etcldapschemaauthldapschema

EOF

On lance ensuite la commande

slaptest -f tmpldapconfldapconf -F tmpldapconf

Elle revoie un message de succegraves Cette commande a creacuteeacute dans le reacutepertoire tmpldapconf une arborescence

correspondant agrave la configuration de notre LDAP

On modifie le chemin de configuration

5

sed ndashi 0dnauthldap sauthldapauthldapcn=schemacn=config

cn=authldapldif

On supprime ensuite les 7 derniegraveres lignes du fichier

head -n -7 cn=authldapldif gt tmpldif

mv tmpldif cn=authldapldif

On peut maintenant importer notre fichier de configuration Pour ce faire

ldapadd -Y EXTERNAL -H ldapi -f

tmpldapconfcn=configcn=schemacn=authldapldif

Si tout va bien lrsquoentreacutee devrait avoir eacuteteacute ajouteacutee On peut veacuterifier avec la commande vue tout agrave lrsquoheure

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

On devrait voir en plus le nouveau scheacutema authldap

Constitution de la base de donneacutees LDAP Le remplissage de la base se fait agrave lrsquoaide de fichiers ldif Nous donnons ici un exemple de structure

Fichier pour la structure de base

dn dc=maildc=domainedc=tld

o intimailpw

description Global mail tree

dc mail

objectClass top

objectClass dcObject

objectClass organization

dn dc=peopledc=maildc=domainedc=tld

description Informations of all users

o people

dc people

objectClass top

objectClass dcObject

objectClass organization

dn dc=groupsdc=maildc=domainedc=tld

description All groups of users

o groups

dc groups

objectClass top

objectClass dcObject

objectClass organization

6

Fichier pour ajouter un utilisateur

dn cn=jbonddc=peopledc=maildc=domainedc=tld

uid jbond

mail jbonddomainetld

sn Moulin

givenName James

displayName James Bond

mailbox domainetldjbond

quota 50M

homeDirectory homevmail

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAccount

userPassword SSHA367PSXiUAegy8dpJbPU8OepEf8L5ye

Pour obtenir un hash du mot de passe

slappasswd -s password -h SSHA

On peut par la suite ajouter la configuration agrave la base de donneacutees avec la commande

ldapadd -D cn=admindc=domainedc=tld -W -h localhost -f pathtofile

Si les champs proposeacutes ne sont pas suffisants il faudra alors effectuer les modifications dans le fichier autldapschema

proposeacute plus haut et refaire la manipulation de configuration

De plus les standards du Mail deacutecrit par lrsquoIETF (RFC822 63 RFC1123 527 and RFC2821 451) impliquent drsquoavoir une

adresse Postmaster et une Abuse Pour cela nous pourrions creacuteer ces adresses avec la meacutethode vue au-dessus mais

ce nrsquoest pas la meilleure Il est preacutefeacuterable drsquoutiliser un alias comme nous le ferons avec les listes de diffusion Ici nous

proposons de rediriger ces deux adresses vers une adresse administrateur Pour cela la meacutethode est la mecircme sauf

que le fichier ldif nrsquoest pas tout agrave fait identique En voici un exemple

dn cn=postmasterdc=groupsdc=maildc=domainedc=tld

uid postmaster

mail postmasterdomainetld

sn Postmaster

displayName Postmaster

maildrop admindomainetld

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAlias

Pour faire une liste de diffusion la meacutethode est la mecircme Il suffit drsquoajouter toutes les adresses destinataires dans le

champ maildrop seacutepareacutees par des virgules ()

7

Installation de Postfix Installation des packages

apt-get install postfix postfix-ldap

Lors de lrsquoinstallation deux eacutecrans deacutefilent

- Configuration Internet Site

- Valeur par deacutefaut pour le mail name

On creacutee lrsquoutilisateur qui servira agrave exeacutecuter Postfix

groupadd vmail

useradd -g vmail -d homevmail -s binfalse -m vmail

Nous aurons besoin dans la suite des GID et UID creacuteeacutes agrave cet instant Ils peuvent ecirctre afficheacutes avec les commandes

cat etcgroup | grep vmail | cut -d -f3

cat etcpasswd | grep vmail | cut -d -f3

On ajoute les paramegravetres au fichier etcpostfixmaincf (remplacer les valeurs de GID et drsquoUID avec vos valeurs)

smtpd_banner = maildomainetld

virtual_mailbox_base = homevmail

virtual_mailbox_domains = dmainetld

virtual_mailbox_maps = ldapetcpostfixldap_accountscf

virtual_alias_maps = ldapetcpostfixldap_aliasescf

virtual_minimum_uid = 100

virtual_gid_maps = static1001 Remplacez ici par votre valeur de GID

virtual_uid_maps = static1001 Remplacez ici par votre valeur drsquoUID

Il nous faut maintenant constituer nos fichiers de configuration ldap_accountscf

cat gt etcpostfixldap_accountscf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=peopledc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAccount)(mail=s))

result_attribute = mailbox

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

Et pour ldap_aliasescf

cat gt ldap_aliasescf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=groupsdc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAlias)(mail=s))

result_attribute = maildrop

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

8

On peut maintenant veacuterifier la configuration de Postfix avec (cette commande ne doit rien retourner si crsquoest bon)

postfix check

Si crsquoest bon alors on recharge le serveur

postfix reload

On peut alors faire un envoi de mail test via telnet

telnet localhost 25

Si vous souhaitez deacutelivrer les mails agrave votre maniegravere il faut dans le fichier etcpostfixmaincf la ligne

virtual_transport = nomdevotreregle

Et de mecircme dans le fichier etcpostfixmastercf

nomdevotreregle unix - n n - 5 pipe

flags=Rq user=vmail null_sender=

argv=chemindevotreprogramme

Il nous reste maintenant agrave configurer les diffeacuterents enregistrements DNS neacutecessaire au fonctionnement drsquoun serveur

mail Vous pouvez utiliser la solution de votre choix Dans la suite vous trouverez une meacutethode utilisant Bind9

Installation de Bind9 Dans toute cette partie on se situera dans le dossier etcbind Dans la suite notre IP sera abcd

Dans le fichier namedconfoptions on ajoutera dans le champ options

version Not supported

Dans un dossier zones on eacutecrit le fichier dbdomainetld

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122111 Serial

43200 Refresh

3600 Retry

2419200 Expire

86400 ) Negative Cache TTL

IN NS nsdomainetld

IN NS ns11ovhnet

ns IN A abcd

www IN A abcd

IN A abcd

IN MX 10 maildomainetld

mail IN A abcd

Dans le mecircme dossier zones on a cbain-addrarpa

9

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122101 serial

14400 refresh

3600 retry

604800 expire

10800 minimum

)

cbain-addrarpa IN NS nsdomainetld

cbain-addrarpa IN NS ns11ovhnet

d IN PTR maildomainetld

Il faut faire attention agrave bien increacutementer le serial pour chaque modification des fichiers

Dans le fichier namedconflocal

zone domainetld

type master

file etcbindzonesdbdomainetld

allow-transfer 213251128130

notify yes

zone cbain-addrarpa IN

type master

file etcbindzonescbain-addrarpa

allow-transfer 213251128130

Ici 213251128130 est lrsquoadresse IP du serveur ns11ovhnet

Il faut bien sucircr configurer le DNS avec votre fournisseur (Gandi OVH hellip) Pour ccedila amusez-vous bien Vous pouvez

aussi tester votre configuration avec des outils en ligne tels que DNSstuff

En test final si votre configuration est bonne vous devriez pouvoir envoyer un mail depuis un service neutre (Gmail

yahoo hellip) et le voir dans votre arborescence (ici homevmaildomainetld)

Installation du paquet Debian et configuration de lighttpd

Commencez par reacutecupeacuterer le paquet deb agrave lrsquoadresse suivante httpswwwintimailpwintimaildeb

Installez ensuite GDebi Il srsquoagit drsquoun dpkg ameacutelioreacute pour teacuteleacutecharger les deacutependances automatiquement ce que

dpkg ne gegravere pas

apt-get update

apt-get install gdebi-core

10

Vous pouvez alors installer le paquet

gdebi intimaildeb

Vous aurez alors le site web drsquointiMail deacuteployeacute au chemin varwwwwebmail

Il ne vous reste plus qursquoagrave changer la configuration de lighttpd votre serveur web pour mettre en ligne le site

Vous pouvez pour cela copier-coller la configuration suivante mais veillez agrave bien changer lrsquoadresse IP preacutesente au

deacutebut de la partie SSL CONFIG avec votre adresse IP

serv ermodules = ( mod_access

mod_accesslog

mod_alias

mod_compress

mod_redirect

mod_rewrite

)

Hide server version

servertag = Such Headers Very try Now close telnet

serverdocument-root = varwwwwebmail

serverupload-dirs = ( varwwwwebmailuploads )

servererrorlog = varloglighttpderrorlog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

serverport = 80

accesslogformat = V h l u t r gts b Refereri

User-Agenti

accesslogfilename = varloglighttpdaccesslog

index-filenames = ( indexphp indexhtml

indexlighttpdhtml )

urlaccess-deny = ( ~ inc )

static-fileexclude-extensions = ( php pl fcgi )

compresscache-dir = varcachelighttpdcompress

compressfiletype = ( applicationjavascript textcss

texthtml textplain )

default listening port for IPv6 falls back to the IPv4 port

include_shell usrsharelighttpduse-ipv6pl + serverport

include_shell usrsharelighttpdcreate-mimeassignpl

include_shell usrsharelighttpdinclude-conf-enabledpl

SSL CONFIG

$SERVER[socket] == 5234485443

sslengine = enable

11

sslpemfile = etclighttpdsslintimailpwpem

sslca-file = etclighttpdsslintimailpwcrt

servername = intimailpw

votre configuration habituelle pour ce domaine

serverdocument-root = varwwwwebmail

servererrorlog = varloglighttpderror_ssllog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

Rewrite des URL pour masquer php

urlrewrite-once = ( ^()$ =gt $1 )

urlrewrite-if-not-file = ( ^([^])()$ =gt $1php$2 )

servernetwork-backend = writev

Deacutependances Slapd

Ldap-utils

Postfix

Postfix-ldap

Bind9

Lighttpd

12

Sources httpswikigandinetfrhostingusing-linuxtutorialsdebianmail-server-ldap

httpwwwpostfixorgpipe8html

httpwwwpostfixorgFILTER_READMEhtml

httpwwwpostfixorg

httpwwwpostfixorgtransport5html

Page 31: Système d'hébergement domestique...place sur les domaines .pw par Gandi.net, notre fournisseur. Nous n’avons donc pas pu l’implémenter. Nous avons configuré Postfix pour qu’il

Annexe 5 Boite de reacuteception

Annexe 6 Interface drsquoadministration

Annexe 7 Gestion drsquoun utilisateur

Tutorial installation intimailtrade

Table des matiegraveres Apregraves une nouvelle installation de lrsquoOS 2

Seacutecurisation du serveur 2

Changement de lrsquoutilisateur par deacutefaut 2

Changement du port SSH 2

Interdire lrsquoauthentification SSH pour root 2

Installation de LDAP 3

Configuration de base 3

Configuration des Scheacutemas 4

Constitution de la base de donneacutees LDAP 5

Installation de Postfix 7

Installation de Bind9 8

Installation du paquet Debian et configuration de lighttpd 9

Deacutependances 11

Sources 12

2

Apregraves une nouvelle installation de lrsquoOS Exeacutecutez ces commandes pour mettre agrave jour agrave la derniegravere version Ces opeacuterations peuvent prendre un certain

temps Nous avons utiliseacute pour cet exemple Raspbian Jessie Lite sur une Raspberry Pi 2

apt-get update

apt-get upgrade ampamp apt-get dist-upgrade

apt-get install linux-headers-$(uname -r)

reboot

Puis lancer

raspi-config

Etendre au maximum lrsquoespace de stockage en navigant dans les menus

Expand Filesystem

Reacutegler une ip statique avec la box fichier etcnetworkinterfaces

iface eth0 inet static

address 192168131

netmask 2552552550

gateway 19216811

Nous avons aussi supprimeacute wpasupplicant

Seacutecurisation du serveur

Changement de lrsquoutilisateur par deacutefaut Changez le nom drsquoutilisateur par deacutefaut ainsi que son mot de passe

sudo passwd root

Sortie et login en tant que root puis

usermod -l myuname pi

usermod -m -d homemyuname myuname

groupmod ndashn myuname pi

passwd myuname

Voir cette adresse pour lrsquoutilisation de cleacutes priveacuteespubliques

Changement du port SSH sed ndashi sPort 22Port 2222g etcsshsshd_config

Interdire lrsquoauthentification SSH pour root sed -i sPermitRootLogin yesPermitRootLogin nog etcsshsshd_config

3

Installation de LDAP

Configuration de base Installation du package

apt-get install slapd

Choisir un mot de passe administrateur puis lancer la commande

dpkg-reconfigure slapd

Reacutepondre non agrave la question 1

Entrez le nom de domaine utiliseacute agrave la question 2 sous la forme domainetld

Entrez ce que vous voulez au 3egraveme eacutecran le nom de lrsquoorganisation ne sera pas utiliseacute

Entrez un mot de passe

Choisissez HDB

Choisissez si la base de donneacutees est supprimeacutee agrave la deacutesinstallation de slapd

Deacuteplacez lrsquoancienne base de donneacutees

Nrsquoutilisez pas LDAPv2

Installer les outils de conversion pour ldap (slaptest ldapmodify notamment)

apt-get install ldap-utils

On peut maintenant veacuterifier que la configuration est valable

ldapsearch -x -h localhost -b dc=domainedc=tld -LLL dc=domaine dn

Cette commande doit retourner quelque chose comme

dn dc=domainedc=tld

Il faut maintenant seacutecuriser le serveur LDAP en effet on peut y acceacuteder en anonyme avec la commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=config

(amp(objectClass=olcDatabaseConfig)(olcSuffix=dc=domainedc=tld))

Cette commande retourne un certain nombre drsquoinformations notamment agrave propos des champs suivants

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by none

olcAccess 1to dnbase= by read

olcAccess 2to by read

On va modifier ces champs avec la commande ldapmodify Pour cela on va creacuteer un fichier ldif

cat gt changeAccessldif ltlt EOF

dn olcDatabase=1hdbcn=config

changetype modify

delete olcAccess

-

add olcAccess

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by dn=cn=admindc=domainedc=tld write by none

-

add olcAccess

olcAccess 1to dnbase= by read

-

4

add olcAccess

olcAccess 2to by self write by dn=cn=admindc=domainedc=tld write by

none

-

EOF

On peut maintenant appliquer les changements avec ldapmodify

ldapmodify ndashc ndashY EXTERNAL ndashH ldapi -f changeAccessldif

La commande devrait vous confirmer que la modification srsquoest bien effectueacutee

SASLEXTERNAL authentication started

SASL username gidNumber=0+uidNumber=0cn=peercredcn=externalcn=auth

SASL SSF 0

modifying entry olcDatabase=1hdbcn=config

On peut veacuterifier qursquoon ne peut plus acceacuteder aux informations avec la commande

ldapsearch -x -c -h localhost -b dc=domainedc=tld

On peut veacuterifier la configuration en se connectant en tant qursquoadministrateur

ldapsearch -c -h localhost -b dc=domainedc=tld -D

cn=admindc=domainedc=tld ndashW

Configuration des Scheacutemas Nous allons utiliser les scheacutemas de courier-ldap Pour eacuteviter une manipulation compliqueacutee vous trouverez

directement le scheacutema avec le fichier authldapschema On place ce fichier dans le dossier

mv authldapschema etcldapschema

Nous creacuteons un fichier qui incluera tous les scheacutemas de base en plus du nouveau On peut les afficher avec la

commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

Creacuteation du fichier de configuration pour notre exemple cela donne

mkdir tmpldapconf

cat gt tmpldapconfldapconf ltlt EOF

include etcldapschemacoreschema

include etcldapschemacosineschema

include etcldapschemanisschema

include etcldapschemainetorgpersonschema

include etcldapschemaauthldapschema

EOF

On lance ensuite la commande

slaptest -f tmpldapconfldapconf -F tmpldapconf

Elle revoie un message de succegraves Cette commande a creacuteeacute dans le reacutepertoire tmpldapconf une arborescence

correspondant agrave la configuration de notre LDAP

On modifie le chemin de configuration

5

sed ndashi 0dnauthldap sauthldapauthldapcn=schemacn=config

cn=authldapldif

On supprime ensuite les 7 derniegraveres lignes du fichier

head -n -7 cn=authldapldif gt tmpldif

mv tmpldif cn=authldapldif

On peut maintenant importer notre fichier de configuration Pour ce faire

ldapadd -Y EXTERNAL -H ldapi -f

tmpldapconfcn=configcn=schemacn=authldapldif

Si tout va bien lrsquoentreacutee devrait avoir eacuteteacute ajouteacutee On peut veacuterifier avec la commande vue tout agrave lrsquoheure

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

On devrait voir en plus le nouveau scheacutema authldap

Constitution de la base de donneacutees LDAP Le remplissage de la base se fait agrave lrsquoaide de fichiers ldif Nous donnons ici un exemple de structure

Fichier pour la structure de base

dn dc=maildc=domainedc=tld

o intimailpw

description Global mail tree

dc mail

objectClass top

objectClass dcObject

objectClass organization

dn dc=peopledc=maildc=domainedc=tld

description Informations of all users

o people

dc people

objectClass top

objectClass dcObject

objectClass organization

dn dc=groupsdc=maildc=domainedc=tld

description All groups of users

o groups

dc groups

objectClass top

objectClass dcObject

objectClass organization

6

Fichier pour ajouter un utilisateur

dn cn=jbonddc=peopledc=maildc=domainedc=tld

uid jbond

mail jbonddomainetld

sn Moulin

givenName James

displayName James Bond

mailbox domainetldjbond

quota 50M

homeDirectory homevmail

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAccount

userPassword SSHA367PSXiUAegy8dpJbPU8OepEf8L5ye

Pour obtenir un hash du mot de passe

slappasswd -s password -h SSHA

On peut par la suite ajouter la configuration agrave la base de donneacutees avec la commande

ldapadd -D cn=admindc=domainedc=tld -W -h localhost -f pathtofile

Si les champs proposeacutes ne sont pas suffisants il faudra alors effectuer les modifications dans le fichier autldapschema

proposeacute plus haut et refaire la manipulation de configuration

De plus les standards du Mail deacutecrit par lrsquoIETF (RFC822 63 RFC1123 527 and RFC2821 451) impliquent drsquoavoir une

adresse Postmaster et une Abuse Pour cela nous pourrions creacuteer ces adresses avec la meacutethode vue au-dessus mais

ce nrsquoest pas la meilleure Il est preacutefeacuterable drsquoutiliser un alias comme nous le ferons avec les listes de diffusion Ici nous

proposons de rediriger ces deux adresses vers une adresse administrateur Pour cela la meacutethode est la mecircme sauf

que le fichier ldif nrsquoest pas tout agrave fait identique En voici un exemple

dn cn=postmasterdc=groupsdc=maildc=domainedc=tld

uid postmaster

mail postmasterdomainetld

sn Postmaster

displayName Postmaster

maildrop admindomainetld

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAlias

Pour faire une liste de diffusion la meacutethode est la mecircme Il suffit drsquoajouter toutes les adresses destinataires dans le

champ maildrop seacutepareacutees par des virgules ()

7

Installation de Postfix Installation des packages

apt-get install postfix postfix-ldap

Lors de lrsquoinstallation deux eacutecrans deacutefilent

- Configuration Internet Site

- Valeur par deacutefaut pour le mail name

On creacutee lrsquoutilisateur qui servira agrave exeacutecuter Postfix

groupadd vmail

useradd -g vmail -d homevmail -s binfalse -m vmail

Nous aurons besoin dans la suite des GID et UID creacuteeacutes agrave cet instant Ils peuvent ecirctre afficheacutes avec les commandes

cat etcgroup | grep vmail | cut -d -f3

cat etcpasswd | grep vmail | cut -d -f3

On ajoute les paramegravetres au fichier etcpostfixmaincf (remplacer les valeurs de GID et drsquoUID avec vos valeurs)

smtpd_banner = maildomainetld

virtual_mailbox_base = homevmail

virtual_mailbox_domains = dmainetld

virtual_mailbox_maps = ldapetcpostfixldap_accountscf

virtual_alias_maps = ldapetcpostfixldap_aliasescf

virtual_minimum_uid = 100

virtual_gid_maps = static1001 Remplacez ici par votre valeur de GID

virtual_uid_maps = static1001 Remplacez ici par votre valeur drsquoUID

Il nous faut maintenant constituer nos fichiers de configuration ldap_accountscf

cat gt etcpostfixldap_accountscf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=peopledc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAccount)(mail=s))

result_attribute = mailbox

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

Et pour ldap_aliasescf

cat gt ldap_aliasescf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=groupsdc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAlias)(mail=s))

result_attribute = maildrop

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

8

On peut maintenant veacuterifier la configuration de Postfix avec (cette commande ne doit rien retourner si crsquoest bon)

postfix check

Si crsquoest bon alors on recharge le serveur

postfix reload

On peut alors faire un envoi de mail test via telnet

telnet localhost 25

Si vous souhaitez deacutelivrer les mails agrave votre maniegravere il faut dans le fichier etcpostfixmaincf la ligne

virtual_transport = nomdevotreregle

Et de mecircme dans le fichier etcpostfixmastercf

nomdevotreregle unix - n n - 5 pipe

flags=Rq user=vmail null_sender=

argv=chemindevotreprogramme

Il nous reste maintenant agrave configurer les diffeacuterents enregistrements DNS neacutecessaire au fonctionnement drsquoun serveur

mail Vous pouvez utiliser la solution de votre choix Dans la suite vous trouverez une meacutethode utilisant Bind9

Installation de Bind9 Dans toute cette partie on se situera dans le dossier etcbind Dans la suite notre IP sera abcd

Dans le fichier namedconfoptions on ajoutera dans le champ options

version Not supported

Dans un dossier zones on eacutecrit le fichier dbdomainetld

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122111 Serial

43200 Refresh

3600 Retry

2419200 Expire

86400 ) Negative Cache TTL

IN NS nsdomainetld

IN NS ns11ovhnet

ns IN A abcd

www IN A abcd

IN A abcd

IN MX 10 maildomainetld

mail IN A abcd

Dans le mecircme dossier zones on a cbain-addrarpa

9

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122101 serial

14400 refresh

3600 retry

604800 expire

10800 minimum

)

cbain-addrarpa IN NS nsdomainetld

cbain-addrarpa IN NS ns11ovhnet

d IN PTR maildomainetld

Il faut faire attention agrave bien increacutementer le serial pour chaque modification des fichiers

Dans le fichier namedconflocal

zone domainetld

type master

file etcbindzonesdbdomainetld

allow-transfer 213251128130

notify yes

zone cbain-addrarpa IN

type master

file etcbindzonescbain-addrarpa

allow-transfer 213251128130

Ici 213251128130 est lrsquoadresse IP du serveur ns11ovhnet

Il faut bien sucircr configurer le DNS avec votre fournisseur (Gandi OVH hellip) Pour ccedila amusez-vous bien Vous pouvez

aussi tester votre configuration avec des outils en ligne tels que DNSstuff

En test final si votre configuration est bonne vous devriez pouvoir envoyer un mail depuis un service neutre (Gmail

yahoo hellip) et le voir dans votre arborescence (ici homevmaildomainetld)

Installation du paquet Debian et configuration de lighttpd

Commencez par reacutecupeacuterer le paquet deb agrave lrsquoadresse suivante httpswwwintimailpwintimaildeb

Installez ensuite GDebi Il srsquoagit drsquoun dpkg ameacutelioreacute pour teacuteleacutecharger les deacutependances automatiquement ce que

dpkg ne gegravere pas

apt-get update

apt-get install gdebi-core

10

Vous pouvez alors installer le paquet

gdebi intimaildeb

Vous aurez alors le site web drsquointiMail deacuteployeacute au chemin varwwwwebmail

Il ne vous reste plus qursquoagrave changer la configuration de lighttpd votre serveur web pour mettre en ligne le site

Vous pouvez pour cela copier-coller la configuration suivante mais veillez agrave bien changer lrsquoadresse IP preacutesente au

deacutebut de la partie SSL CONFIG avec votre adresse IP

serv ermodules = ( mod_access

mod_accesslog

mod_alias

mod_compress

mod_redirect

mod_rewrite

)

Hide server version

servertag = Such Headers Very try Now close telnet

serverdocument-root = varwwwwebmail

serverupload-dirs = ( varwwwwebmailuploads )

servererrorlog = varloglighttpderrorlog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

serverport = 80

accesslogformat = V h l u t r gts b Refereri

User-Agenti

accesslogfilename = varloglighttpdaccesslog

index-filenames = ( indexphp indexhtml

indexlighttpdhtml )

urlaccess-deny = ( ~ inc )

static-fileexclude-extensions = ( php pl fcgi )

compresscache-dir = varcachelighttpdcompress

compressfiletype = ( applicationjavascript textcss

texthtml textplain )

default listening port for IPv6 falls back to the IPv4 port

include_shell usrsharelighttpduse-ipv6pl + serverport

include_shell usrsharelighttpdcreate-mimeassignpl

include_shell usrsharelighttpdinclude-conf-enabledpl

SSL CONFIG

$SERVER[socket] == 5234485443

sslengine = enable

11

sslpemfile = etclighttpdsslintimailpwpem

sslca-file = etclighttpdsslintimailpwcrt

servername = intimailpw

votre configuration habituelle pour ce domaine

serverdocument-root = varwwwwebmail

servererrorlog = varloglighttpderror_ssllog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

Rewrite des URL pour masquer php

urlrewrite-once = ( ^()$ =gt $1 )

urlrewrite-if-not-file = ( ^([^])()$ =gt $1php$2 )

servernetwork-backend = writev

Deacutependances Slapd

Ldap-utils

Postfix

Postfix-ldap

Bind9

Lighttpd

12

Sources httpswikigandinetfrhostingusing-linuxtutorialsdebianmail-server-ldap

httpwwwpostfixorgpipe8html

httpwwwpostfixorgFILTER_READMEhtml

httpwwwpostfixorg

httpwwwpostfixorgtransport5html

Page 32: Système d'hébergement domestique...place sur les domaines .pw par Gandi.net, notre fournisseur. Nous n’avons donc pas pu l’implémenter. Nous avons configuré Postfix pour qu’il

Annexe 6 Interface drsquoadministration

Annexe 7 Gestion drsquoun utilisateur

Tutorial installation intimailtrade

Table des matiegraveres Apregraves une nouvelle installation de lrsquoOS 2

Seacutecurisation du serveur 2

Changement de lrsquoutilisateur par deacutefaut 2

Changement du port SSH 2

Interdire lrsquoauthentification SSH pour root 2

Installation de LDAP 3

Configuration de base 3

Configuration des Scheacutemas 4

Constitution de la base de donneacutees LDAP 5

Installation de Postfix 7

Installation de Bind9 8

Installation du paquet Debian et configuration de lighttpd 9

Deacutependances 11

Sources 12

2

Apregraves une nouvelle installation de lrsquoOS Exeacutecutez ces commandes pour mettre agrave jour agrave la derniegravere version Ces opeacuterations peuvent prendre un certain

temps Nous avons utiliseacute pour cet exemple Raspbian Jessie Lite sur une Raspberry Pi 2

apt-get update

apt-get upgrade ampamp apt-get dist-upgrade

apt-get install linux-headers-$(uname -r)

reboot

Puis lancer

raspi-config

Etendre au maximum lrsquoespace de stockage en navigant dans les menus

Expand Filesystem

Reacutegler une ip statique avec la box fichier etcnetworkinterfaces

iface eth0 inet static

address 192168131

netmask 2552552550

gateway 19216811

Nous avons aussi supprimeacute wpasupplicant

Seacutecurisation du serveur

Changement de lrsquoutilisateur par deacutefaut Changez le nom drsquoutilisateur par deacutefaut ainsi que son mot de passe

sudo passwd root

Sortie et login en tant que root puis

usermod -l myuname pi

usermod -m -d homemyuname myuname

groupmod ndashn myuname pi

passwd myuname

Voir cette adresse pour lrsquoutilisation de cleacutes priveacuteespubliques

Changement du port SSH sed ndashi sPort 22Port 2222g etcsshsshd_config

Interdire lrsquoauthentification SSH pour root sed -i sPermitRootLogin yesPermitRootLogin nog etcsshsshd_config

3

Installation de LDAP

Configuration de base Installation du package

apt-get install slapd

Choisir un mot de passe administrateur puis lancer la commande

dpkg-reconfigure slapd

Reacutepondre non agrave la question 1

Entrez le nom de domaine utiliseacute agrave la question 2 sous la forme domainetld

Entrez ce que vous voulez au 3egraveme eacutecran le nom de lrsquoorganisation ne sera pas utiliseacute

Entrez un mot de passe

Choisissez HDB

Choisissez si la base de donneacutees est supprimeacutee agrave la deacutesinstallation de slapd

Deacuteplacez lrsquoancienne base de donneacutees

Nrsquoutilisez pas LDAPv2

Installer les outils de conversion pour ldap (slaptest ldapmodify notamment)

apt-get install ldap-utils

On peut maintenant veacuterifier que la configuration est valable

ldapsearch -x -h localhost -b dc=domainedc=tld -LLL dc=domaine dn

Cette commande doit retourner quelque chose comme

dn dc=domainedc=tld

Il faut maintenant seacutecuriser le serveur LDAP en effet on peut y acceacuteder en anonyme avec la commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=config

(amp(objectClass=olcDatabaseConfig)(olcSuffix=dc=domainedc=tld))

Cette commande retourne un certain nombre drsquoinformations notamment agrave propos des champs suivants

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by none

olcAccess 1to dnbase= by read

olcAccess 2to by read

On va modifier ces champs avec la commande ldapmodify Pour cela on va creacuteer un fichier ldif

cat gt changeAccessldif ltlt EOF

dn olcDatabase=1hdbcn=config

changetype modify

delete olcAccess

-

add olcAccess

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by dn=cn=admindc=domainedc=tld write by none

-

add olcAccess

olcAccess 1to dnbase= by read

-

4

add olcAccess

olcAccess 2to by self write by dn=cn=admindc=domainedc=tld write by

none

-

EOF

On peut maintenant appliquer les changements avec ldapmodify

ldapmodify ndashc ndashY EXTERNAL ndashH ldapi -f changeAccessldif

La commande devrait vous confirmer que la modification srsquoest bien effectueacutee

SASLEXTERNAL authentication started

SASL username gidNumber=0+uidNumber=0cn=peercredcn=externalcn=auth

SASL SSF 0

modifying entry olcDatabase=1hdbcn=config

On peut veacuterifier qursquoon ne peut plus acceacuteder aux informations avec la commande

ldapsearch -x -c -h localhost -b dc=domainedc=tld

On peut veacuterifier la configuration en se connectant en tant qursquoadministrateur

ldapsearch -c -h localhost -b dc=domainedc=tld -D

cn=admindc=domainedc=tld ndashW

Configuration des Scheacutemas Nous allons utiliser les scheacutemas de courier-ldap Pour eacuteviter une manipulation compliqueacutee vous trouverez

directement le scheacutema avec le fichier authldapschema On place ce fichier dans le dossier

mv authldapschema etcldapschema

Nous creacuteons un fichier qui incluera tous les scheacutemas de base en plus du nouveau On peut les afficher avec la

commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

Creacuteation du fichier de configuration pour notre exemple cela donne

mkdir tmpldapconf

cat gt tmpldapconfldapconf ltlt EOF

include etcldapschemacoreschema

include etcldapschemacosineschema

include etcldapschemanisschema

include etcldapschemainetorgpersonschema

include etcldapschemaauthldapschema

EOF

On lance ensuite la commande

slaptest -f tmpldapconfldapconf -F tmpldapconf

Elle revoie un message de succegraves Cette commande a creacuteeacute dans le reacutepertoire tmpldapconf une arborescence

correspondant agrave la configuration de notre LDAP

On modifie le chemin de configuration

5

sed ndashi 0dnauthldap sauthldapauthldapcn=schemacn=config

cn=authldapldif

On supprime ensuite les 7 derniegraveres lignes du fichier

head -n -7 cn=authldapldif gt tmpldif

mv tmpldif cn=authldapldif

On peut maintenant importer notre fichier de configuration Pour ce faire

ldapadd -Y EXTERNAL -H ldapi -f

tmpldapconfcn=configcn=schemacn=authldapldif

Si tout va bien lrsquoentreacutee devrait avoir eacuteteacute ajouteacutee On peut veacuterifier avec la commande vue tout agrave lrsquoheure

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

On devrait voir en plus le nouveau scheacutema authldap

Constitution de la base de donneacutees LDAP Le remplissage de la base se fait agrave lrsquoaide de fichiers ldif Nous donnons ici un exemple de structure

Fichier pour la structure de base

dn dc=maildc=domainedc=tld

o intimailpw

description Global mail tree

dc mail

objectClass top

objectClass dcObject

objectClass organization

dn dc=peopledc=maildc=domainedc=tld

description Informations of all users

o people

dc people

objectClass top

objectClass dcObject

objectClass organization

dn dc=groupsdc=maildc=domainedc=tld

description All groups of users

o groups

dc groups

objectClass top

objectClass dcObject

objectClass organization

6

Fichier pour ajouter un utilisateur

dn cn=jbonddc=peopledc=maildc=domainedc=tld

uid jbond

mail jbonddomainetld

sn Moulin

givenName James

displayName James Bond

mailbox domainetldjbond

quota 50M

homeDirectory homevmail

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAccount

userPassword SSHA367PSXiUAegy8dpJbPU8OepEf8L5ye

Pour obtenir un hash du mot de passe

slappasswd -s password -h SSHA

On peut par la suite ajouter la configuration agrave la base de donneacutees avec la commande

ldapadd -D cn=admindc=domainedc=tld -W -h localhost -f pathtofile

Si les champs proposeacutes ne sont pas suffisants il faudra alors effectuer les modifications dans le fichier autldapschema

proposeacute plus haut et refaire la manipulation de configuration

De plus les standards du Mail deacutecrit par lrsquoIETF (RFC822 63 RFC1123 527 and RFC2821 451) impliquent drsquoavoir une

adresse Postmaster et une Abuse Pour cela nous pourrions creacuteer ces adresses avec la meacutethode vue au-dessus mais

ce nrsquoest pas la meilleure Il est preacutefeacuterable drsquoutiliser un alias comme nous le ferons avec les listes de diffusion Ici nous

proposons de rediriger ces deux adresses vers une adresse administrateur Pour cela la meacutethode est la mecircme sauf

que le fichier ldif nrsquoest pas tout agrave fait identique En voici un exemple

dn cn=postmasterdc=groupsdc=maildc=domainedc=tld

uid postmaster

mail postmasterdomainetld

sn Postmaster

displayName Postmaster

maildrop admindomainetld

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAlias

Pour faire une liste de diffusion la meacutethode est la mecircme Il suffit drsquoajouter toutes les adresses destinataires dans le

champ maildrop seacutepareacutees par des virgules ()

7

Installation de Postfix Installation des packages

apt-get install postfix postfix-ldap

Lors de lrsquoinstallation deux eacutecrans deacutefilent

- Configuration Internet Site

- Valeur par deacutefaut pour le mail name

On creacutee lrsquoutilisateur qui servira agrave exeacutecuter Postfix

groupadd vmail

useradd -g vmail -d homevmail -s binfalse -m vmail

Nous aurons besoin dans la suite des GID et UID creacuteeacutes agrave cet instant Ils peuvent ecirctre afficheacutes avec les commandes

cat etcgroup | grep vmail | cut -d -f3

cat etcpasswd | grep vmail | cut -d -f3

On ajoute les paramegravetres au fichier etcpostfixmaincf (remplacer les valeurs de GID et drsquoUID avec vos valeurs)

smtpd_banner = maildomainetld

virtual_mailbox_base = homevmail

virtual_mailbox_domains = dmainetld

virtual_mailbox_maps = ldapetcpostfixldap_accountscf

virtual_alias_maps = ldapetcpostfixldap_aliasescf

virtual_minimum_uid = 100

virtual_gid_maps = static1001 Remplacez ici par votre valeur de GID

virtual_uid_maps = static1001 Remplacez ici par votre valeur drsquoUID

Il nous faut maintenant constituer nos fichiers de configuration ldap_accountscf

cat gt etcpostfixldap_accountscf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=peopledc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAccount)(mail=s))

result_attribute = mailbox

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

Et pour ldap_aliasescf

cat gt ldap_aliasescf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=groupsdc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAlias)(mail=s))

result_attribute = maildrop

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

8

On peut maintenant veacuterifier la configuration de Postfix avec (cette commande ne doit rien retourner si crsquoest bon)

postfix check

Si crsquoest bon alors on recharge le serveur

postfix reload

On peut alors faire un envoi de mail test via telnet

telnet localhost 25

Si vous souhaitez deacutelivrer les mails agrave votre maniegravere il faut dans le fichier etcpostfixmaincf la ligne

virtual_transport = nomdevotreregle

Et de mecircme dans le fichier etcpostfixmastercf

nomdevotreregle unix - n n - 5 pipe

flags=Rq user=vmail null_sender=

argv=chemindevotreprogramme

Il nous reste maintenant agrave configurer les diffeacuterents enregistrements DNS neacutecessaire au fonctionnement drsquoun serveur

mail Vous pouvez utiliser la solution de votre choix Dans la suite vous trouverez une meacutethode utilisant Bind9

Installation de Bind9 Dans toute cette partie on se situera dans le dossier etcbind Dans la suite notre IP sera abcd

Dans le fichier namedconfoptions on ajoutera dans le champ options

version Not supported

Dans un dossier zones on eacutecrit le fichier dbdomainetld

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122111 Serial

43200 Refresh

3600 Retry

2419200 Expire

86400 ) Negative Cache TTL

IN NS nsdomainetld

IN NS ns11ovhnet

ns IN A abcd

www IN A abcd

IN A abcd

IN MX 10 maildomainetld

mail IN A abcd

Dans le mecircme dossier zones on a cbain-addrarpa

9

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122101 serial

14400 refresh

3600 retry

604800 expire

10800 minimum

)

cbain-addrarpa IN NS nsdomainetld

cbain-addrarpa IN NS ns11ovhnet

d IN PTR maildomainetld

Il faut faire attention agrave bien increacutementer le serial pour chaque modification des fichiers

Dans le fichier namedconflocal

zone domainetld

type master

file etcbindzonesdbdomainetld

allow-transfer 213251128130

notify yes

zone cbain-addrarpa IN

type master

file etcbindzonescbain-addrarpa

allow-transfer 213251128130

Ici 213251128130 est lrsquoadresse IP du serveur ns11ovhnet

Il faut bien sucircr configurer le DNS avec votre fournisseur (Gandi OVH hellip) Pour ccedila amusez-vous bien Vous pouvez

aussi tester votre configuration avec des outils en ligne tels que DNSstuff

En test final si votre configuration est bonne vous devriez pouvoir envoyer un mail depuis un service neutre (Gmail

yahoo hellip) et le voir dans votre arborescence (ici homevmaildomainetld)

Installation du paquet Debian et configuration de lighttpd

Commencez par reacutecupeacuterer le paquet deb agrave lrsquoadresse suivante httpswwwintimailpwintimaildeb

Installez ensuite GDebi Il srsquoagit drsquoun dpkg ameacutelioreacute pour teacuteleacutecharger les deacutependances automatiquement ce que

dpkg ne gegravere pas

apt-get update

apt-get install gdebi-core

10

Vous pouvez alors installer le paquet

gdebi intimaildeb

Vous aurez alors le site web drsquointiMail deacuteployeacute au chemin varwwwwebmail

Il ne vous reste plus qursquoagrave changer la configuration de lighttpd votre serveur web pour mettre en ligne le site

Vous pouvez pour cela copier-coller la configuration suivante mais veillez agrave bien changer lrsquoadresse IP preacutesente au

deacutebut de la partie SSL CONFIG avec votre adresse IP

serv ermodules = ( mod_access

mod_accesslog

mod_alias

mod_compress

mod_redirect

mod_rewrite

)

Hide server version

servertag = Such Headers Very try Now close telnet

serverdocument-root = varwwwwebmail

serverupload-dirs = ( varwwwwebmailuploads )

servererrorlog = varloglighttpderrorlog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

serverport = 80

accesslogformat = V h l u t r gts b Refereri

User-Agenti

accesslogfilename = varloglighttpdaccesslog

index-filenames = ( indexphp indexhtml

indexlighttpdhtml )

urlaccess-deny = ( ~ inc )

static-fileexclude-extensions = ( php pl fcgi )

compresscache-dir = varcachelighttpdcompress

compressfiletype = ( applicationjavascript textcss

texthtml textplain )

default listening port for IPv6 falls back to the IPv4 port

include_shell usrsharelighttpduse-ipv6pl + serverport

include_shell usrsharelighttpdcreate-mimeassignpl

include_shell usrsharelighttpdinclude-conf-enabledpl

SSL CONFIG

$SERVER[socket] == 5234485443

sslengine = enable

11

sslpemfile = etclighttpdsslintimailpwpem

sslca-file = etclighttpdsslintimailpwcrt

servername = intimailpw

votre configuration habituelle pour ce domaine

serverdocument-root = varwwwwebmail

servererrorlog = varloglighttpderror_ssllog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

Rewrite des URL pour masquer php

urlrewrite-once = ( ^()$ =gt $1 )

urlrewrite-if-not-file = ( ^([^])()$ =gt $1php$2 )

servernetwork-backend = writev

Deacutependances Slapd

Ldap-utils

Postfix

Postfix-ldap

Bind9

Lighttpd

12

Sources httpswikigandinetfrhostingusing-linuxtutorialsdebianmail-server-ldap

httpwwwpostfixorgpipe8html

httpwwwpostfixorgFILTER_READMEhtml

httpwwwpostfixorg

httpwwwpostfixorgtransport5html

Page 33: Système d'hébergement domestique...place sur les domaines .pw par Gandi.net, notre fournisseur. Nous n’avons donc pas pu l’implémenter. Nous avons configuré Postfix pour qu’il

Annexe 7 Gestion drsquoun utilisateur

Tutorial installation intimailtrade

Table des matiegraveres Apregraves une nouvelle installation de lrsquoOS 2

Seacutecurisation du serveur 2

Changement de lrsquoutilisateur par deacutefaut 2

Changement du port SSH 2

Interdire lrsquoauthentification SSH pour root 2

Installation de LDAP 3

Configuration de base 3

Configuration des Scheacutemas 4

Constitution de la base de donneacutees LDAP 5

Installation de Postfix 7

Installation de Bind9 8

Installation du paquet Debian et configuration de lighttpd 9

Deacutependances 11

Sources 12

2

Apregraves une nouvelle installation de lrsquoOS Exeacutecutez ces commandes pour mettre agrave jour agrave la derniegravere version Ces opeacuterations peuvent prendre un certain

temps Nous avons utiliseacute pour cet exemple Raspbian Jessie Lite sur une Raspberry Pi 2

apt-get update

apt-get upgrade ampamp apt-get dist-upgrade

apt-get install linux-headers-$(uname -r)

reboot

Puis lancer

raspi-config

Etendre au maximum lrsquoespace de stockage en navigant dans les menus

Expand Filesystem

Reacutegler une ip statique avec la box fichier etcnetworkinterfaces

iface eth0 inet static

address 192168131

netmask 2552552550

gateway 19216811

Nous avons aussi supprimeacute wpasupplicant

Seacutecurisation du serveur

Changement de lrsquoutilisateur par deacutefaut Changez le nom drsquoutilisateur par deacutefaut ainsi que son mot de passe

sudo passwd root

Sortie et login en tant que root puis

usermod -l myuname pi

usermod -m -d homemyuname myuname

groupmod ndashn myuname pi

passwd myuname

Voir cette adresse pour lrsquoutilisation de cleacutes priveacuteespubliques

Changement du port SSH sed ndashi sPort 22Port 2222g etcsshsshd_config

Interdire lrsquoauthentification SSH pour root sed -i sPermitRootLogin yesPermitRootLogin nog etcsshsshd_config

3

Installation de LDAP

Configuration de base Installation du package

apt-get install slapd

Choisir un mot de passe administrateur puis lancer la commande

dpkg-reconfigure slapd

Reacutepondre non agrave la question 1

Entrez le nom de domaine utiliseacute agrave la question 2 sous la forme domainetld

Entrez ce que vous voulez au 3egraveme eacutecran le nom de lrsquoorganisation ne sera pas utiliseacute

Entrez un mot de passe

Choisissez HDB

Choisissez si la base de donneacutees est supprimeacutee agrave la deacutesinstallation de slapd

Deacuteplacez lrsquoancienne base de donneacutees

Nrsquoutilisez pas LDAPv2

Installer les outils de conversion pour ldap (slaptest ldapmodify notamment)

apt-get install ldap-utils

On peut maintenant veacuterifier que la configuration est valable

ldapsearch -x -h localhost -b dc=domainedc=tld -LLL dc=domaine dn

Cette commande doit retourner quelque chose comme

dn dc=domainedc=tld

Il faut maintenant seacutecuriser le serveur LDAP en effet on peut y acceacuteder en anonyme avec la commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=config

(amp(objectClass=olcDatabaseConfig)(olcSuffix=dc=domainedc=tld))

Cette commande retourne un certain nombre drsquoinformations notamment agrave propos des champs suivants

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by none

olcAccess 1to dnbase= by read

olcAccess 2to by read

On va modifier ces champs avec la commande ldapmodify Pour cela on va creacuteer un fichier ldif

cat gt changeAccessldif ltlt EOF

dn olcDatabase=1hdbcn=config

changetype modify

delete olcAccess

-

add olcAccess

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by dn=cn=admindc=domainedc=tld write by none

-

add olcAccess

olcAccess 1to dnbase= by read

-

4

add olcAccess

olcAccess 2to by self write by dn=cn=admindc=domainedc=tld write by

none

-

EOF

On peut maintenant appliquer les changements avec ldapmodify

ldapmodify ndashc ndashY EXTERNAL ndashH ldapi -f changeAccessldif

La commande devrait vous confirmer que la modification srsquoest bien effectueacutee

SASLEXTERNAL authentication started

SASL username gidNumber=0+uidNumber=0cn=peercredcn=externalcn=auth

SASL SSF 0

modifying entry olcDatabase=1hdbcn=config

On peut veacuterifier qursquoon ne peut plus acceacuteder aux informations avec la commande

ldapsearch -x -c -h localhost -b dc=domainedc=tld

On peut veacuterifier la configuration en se connectant en tant qursquoadministrateur

ldapsearch -c -h localhost -b dc=domainedc=tld -D

cn=admindc=domainedc=tld ndashW

Configuration des Scheacutemas Nous allons utiliser les scheacutemas de courier-ldap Pour eacuteviter une manipulation compliqueacutee vous trouverez

directement le scheacutema avec le fichier authldapschema On place ce fichier dans le dossier

mv authldapschema etcldapschema

Nous creacuteons un fichier qui incluera tous les scheacutemas de base en plus du nouveau On peut les afficher avec la

commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

Creacuteation du fichier de configuration pour notre exemple cela donne

mkdir tmpldapconf

cat gt tmpldapconfldapconf ltlt EOF

include etcldapschemacoreschema

include etcldapschemacosineschema

include etcldapschemanisschema

include etcldapschemainetorgpersonschema

include etcldapschemaauthldapschema

EOF

On lance ensuite la commande

slaptest -f tmpldapconfldapconf -F tmpldapconf

Elle revoie un message de succegraves Cette commande a creacuteeacute dans le reacutepertoire tmpldapconf une arborescence

correspondant agrave la configuration de notre LDAP

On modifie le chemin de configuration

5

sed ndashi 0dnauthldap sauthldapauthldapcn=schemacn=config

cn=authldapldif

On supprime ensuite les 7 derniegraveres lignes du fichier

head -n -7 cn=authldapldif gt tmpldif

mv tmpldif cn=authldapldif

On peut maintenant importer notre fichier de configuration Pour ce faire

ldapadd -Y EXTERNAL -H ldapi -f

tmpldapconfcn=configcn=schemacn=authldapldif

Si tout va bien lrsquoentreacutee devrait avoir eacuteteacute ajouteacutee On peut veacuterifier avec la commande vue tout agrave lrsquoheure

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

On devrait voir en plus le nouveau scheacutema authldap

Constitution de la base de donneacutees LDAP Le remplissage de la base se fait agrave lrsquoaide de fichiers ldif Nous donnons ici un exemple de structure

Fichier pour la structure de base

dn dc=maildc=domainedc=tld

o intimailpw

description Global mail tree

dc mail

objectClass top

objectClass dcObject

objectClass organization

dn dc=peopledc=maildc=domainedc=tld

description Informations of all users

o people

dc people

objectClass top

objectClass dcObject

objectClass organization

dn dc=groupsdc=maildc=domainedc=tld

description All groups of users

o groups

dc groups

objectClass top

objectClass dcObject

objectClass organization

6

Fichier pour ajouter un utilisateur

dn cn=jbonddc=peopledc=maildc=domainedc=tld

uid jbond

mail jbonddomainetld

sn Moulin

givenName James

displayName James Bond

mailbox domainetldjbond

quota 50M

homeDirectory homevmail

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAccount

userPassword SSHA367PSXiUAegy8dpJbPU8OepEf8L5ye

Pour obtenir un hash du mot de passe

slappasswd -s password -h SSHA

On peut par la suite ajouter la configuration agrave la base de donneacutees avec la commande

ldapadd -D cn=admindc=domainedc=tld -W -h localhost -f pathtofile

Si les champs proposeacutes ne sont pas suffisants il faudra alors effectuer les modifications dans le fichier autldapschema

proposeacute plus haut et refaire la manipulation de configuration

De plus les standards du Mail deacutecrit par lrsquoIETF (RFC822 63 RFC1123 527 and RFC2821 451) impliquent drsquoavoir une

adresse Postmaster et une Abuse Pour cela nous pourrions creacuteer ces adresses avec la meacutethode vue au-dessus mais

ce nrsquoest pas la meilleure Il est preacutefeacuterable drsquoutiliser un alias comme nous le ferons avec les listes de diffusion Ici nous

proposons de rediriger ces deux adresses vers une adresse administrateur Pour cela la meacutethode est la mecircme sauf

que le fichier ldif nrsquoest pas tout agrave fait identique En voici un exemple

dn cn=postmasterdc=groupsdc=maildc=domainedc=tld

uid postmaster

mail postmasterdomainetld

sn Postmaster

displayName Postmaster

maildrop admindomainetld

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAlias

Pour faire une liste de diffusion la meacutethode est la mecircme Il suffit drsquoajouter toutes les adresses destinataires dans le

champ maildrop seacutepareacutees par des virgules ()

7

Installation de Postfix Installation des packages

apt-get install postfix postfix-ldap

Lors de lrsquoinstallation deux eacutecrans deacutefilent

- Configuration Internet Site

- Valeur par deacutefaut pour le mail name

On creacutee lrsquoutilisateur qui servira agrave exeacutecuter Postfix

groupadd vmail

useradd -g vmail -d homevmail -s binfalse -m vmail

Nous aurons besoin dans la suite des GID et UID creacuteeacutes agrave cet instant Ils peuvent ecirctre afficheacutes avec les commandes

cat etcgroup | grep vmail | cut -d -f3

cat etcpasswd | grep vmail | cut -d -f3

On ajoute les paramegravetres au fichier etcpostfixmaincf (remplacer les valeurs de GID et drsquoUID avec vos valeurs)

smtpd_banner = maildomainetld

virtual_mailbox_base = homevmail

virtual_mailbox_domains = dmainetld

virtual_mailbox_maps = ldapetcpostfixldap_accountscf

virtual_alias_maps = ldapetcpostfixldap_aliasescf

virtual_minimum_uid = 100

virtual_gid_maps = static1001 Remplacez ici par votre valeur de GID

virtual_uid_maps = static1001 Remplacez ici par votre valeur drsquoUID

Il nous faut maintenant constituer nos fichiers de configuration ldap_accountscf

cat gt etcpostfixldap_accountscf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=peopledc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAccount)(mail=s))

result_attribute = mailbox

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

Et pour ldap_aliasescf

cat gt ldap_aliasescf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=groupsdc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAlias)(mail=s))

result_attribute = maildrop

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

8

On peut maintenant veacuterifier la configuration de Postfix avec (cette commande ne doit rien retourner si crsquoest bon)

postfix check

Si crsquoest bon alors on recharge le serveur

postfix reload

On peut alors faire un envoi de mail test via telnet

telnet localhost 25

Si vous souhaitez deacutelivrer les mails agrave votre maniegravere il faut dans le fichier etcpostfixmaincf la ligne

virtual_transport = nomdevotreregle

Et de mecircme dans le fichier etcpostfixmastercf

nomdevotreregle unix - n n - 5 pipe

flags=Rq user=vmail null_sender=

argv=chemindevotreprogramme

Il nous reste maintenant agrave configurer les diffeacuterents enregistrements DNS neacutecessaire au fonctionnement drsquoun serveur

mail Vous pouvez utiliser la solution de votre choix Dans la suite vous trouverez une meacutethode utilisant Bind9

Installation de Bind9 Dans toute cette partie on se situera dans le dossier etcbind Dans la suite notre IP sera abcd

Dans le fichier namedconfoptions on ajoutera dans le champ options

version Not supported

Dans un dossier zones on eacutecrit le fichier dbdomainetld

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122111 Serial

43200 Refresh

3600 Retry

2419200 Expire

86400 ) Negative Cache TTL

IN NS nsdomainetld

IN NS ns11ovhnet

ns IN A abcd

www IN A abcd

IN A abcd

IN MX 10 maildomainetld

mail IN A abcd

Dans le mecircme dossier zones on a cbain-addrarpa

9

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122101 serial

14400 refresh

3600 retry

604800 expire

10800 minimum

)

cbain-addrarpa IN NS nsdomainetld

cbain-addrarpa IN NS ns11ovhnet

d IN PTR maildomainetld

Il faut faire attention agrave bien increacutementer le serial pour chaque modification des fichiers

Dans le fichier namedconflocal

zone domainetld

type master

file etcbindzonesdbdomainetld

allow-transfer 213251128130

notify yes

zone cbain-addrarpa IN

type master

file etcbindzonescbain-addrarpa

allow-transfer 213251128130

Ici 213251128130 est lrsquoadresse IP du serveur ns11ovhnet

Il faut bien sucircr configurer le DNS avec votre fournisseur (Gandi OVH hellip) Pour ccedila amusez-vous bien Vous pouvez

aussi tester votre configuration avec des outils en ligne tels que DNSstuff

En test final si votre configuration est bonne vous devriez pouvoir envoyer un mail depuis un service neutre (Gmail

yahoo hellip) et le voir dans votre arborescence (ici homevmaildomainetld)

Installation du paquet Debian et configuration de lighttpd

Commencez par reacutecupeacuterer le paquet deb agrave lrsquoadresse suivante httpswwwintimailpwintimaildeb

Installez ensuite GDebi Il srsquoagit drsquoun dpkg ameacutelioreacute pour teacuteleacutecharger les deacutependances automatiquement ce que

dpkg ne gegravere pas

apt-get update

apt-get install gdebi-core

10

Vous pouvez alors installer le paquet

gdebi intimaildeb

Vous aurez alors le site web drsquointiMail deacuteployeacute au chemin varwwwwebmail

Il ne vous reste plus qursquoagrave changer la configuration de lighttpd votre serveur web pour mettre en ligne le site

Vous pouvez pour cela copier-coller la configuration suivante mais veillez agrave bien changer lrsquoadresse IP preacutesente au

deacutebut de la partie SSL CONFIG avec votre adresse IP

serv ermodules = ( mod_access

mod_accesslog

mod_alias

mod_compress

mod_redirect

mod_rewrite

)

Hide server version

servertag = Such Headers Very try Now close telnet

serverdocument-root = varwwwwebmail

serverupload-dirs = ( varwwwwebmailuploads )

servererrorlog = varloglighttpderrorlog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

serverport = 80

accesslogformat = V h l u t r gts b Refereri

User-Agenti

accesslogfilename = varloglighttpdaccesslog

index-filenames = ( indexphp indexhtml

indexlighttpdhtml )

urlaccess-deny = ( ~ inc )

static-fileexclude-extensions = ( php pl fcgi )

compresscache-dir = varcachelighttpdcompress

compressfiletype = ( applicationjavascript textcss

texthtml textplain )

default listening port for IPv6 falls back to the IPv4 port

include_shell usrsharelighttpduse-ipv6pl + serverport

include_shell usrsharelighttpdcreate-mimeassignpl

include_shell usrsharelighttpdinclude-conf-enabledpl

SSL CONFIG

$SERVER[socket] == 5234485443

sslengine = enable

11

sslpemfile = etclighttpdsslintimailpwpem

sslca-file = etclighttpdsslintimailpwcrt

servername = intimailpw

votre configuration habituelle pour ce domaine

serverdocument-root = varwwwwebmail

servererrorlog = varloglighttpderror_ssllog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

Rewrite des URL pour masquer php

urlrewrite-once = ( ^()$ =gt $1 )

urlrewrite-if-not-file = ( ^([^])()$ =gt $1php$2 )

servernetwork-backend = writev

Deacutependances Slapd

Ldap-utils

Postfix

Postfix-ldap

Bind9

Lighttpd

12

Sources httpswikigandinetfrhostingusing-linuxtutorialsdebianmail-server-ldap

httpwwwpostfixorgpipe8html

httpwwwpostfixorgFILTER_READMEhtml

httpwwwpostfixorg

httpwwwpostfixorgtransport5html

Page 34: Système d'hébergement domestique...place sur les domaines .pw par Gandi.net, notre fournisseur. Nous n’avons donc pas pu l’implémenter. Nous avons configuré Postfix pour qu’il

Tutorial installation intimailtrade

Table des matiegraveres Apregraves une nouvelle installation de lrsquoOS 2

Seacutecurisation du serveur 2

Changement de lrsquoutilisateur par deacutefaut 2

Changement du port SSH 2

Interdire lrsquoauthentification SSH pour root 2

Installation de LDAP 3

Configuration de base 3

Configuration des Scheacutemas 4

Constitution de la base de donneacutees LDAP 5

Installation de Postfix 7

Installation de Bind9 8

Installation du paquet Debian et configuration de lighttpd 9

Deacutependances 11

Sources 12

2

Apregraves une nouvelle installation de lrsquoOS Exeacutecutez ces commandes pour mettre agrave jour agrave la derniegravere version Ces opeacuterations peuvent prendre un certain

temps Nous avons utiliseacute pour cet exemple Raspbian Jessie Lite sur une Raspberry Pi 2

apt-get update

apt-get upgrade ampamp apt-get dist-upgrade

apt-get install linux-headers-$(uname -r)

reboot

Puis lancer

raspi-config

Etendre au maximum lrsquoespace de stockage en navigant dans les menus

Expand Filesystem

Reacutegler une ip statique avec la box fichier etcnetworkinterfaces

iface eth0 inet static

address 192168131

netmask 2552552550

gateway 19216811

Nous avons aussi supprimeacute wpasupplicant

Seacutecurisation du serveur

Changement de lrsquoutilisateur par deacutefaut Changez le nom drsquoutilisateur par deacutefaut ainsi que son mot de passe

sudo passwd root

Sortie et login en tant que root puis

usermod -l myuname pi

usermod -m -d homemyuname myuname

groupmod ndashn myuname pi

passwd myuname

Voir cette adresse pour lrsquoutilisation de cleacutes priveacuteespubliques

Changement du port SSH sed ndashi sPort 22Port 2222g etcsshsshd_config

Interdire lrsquoauthentification SSH pour root sed -i sPermitRootLogin yesPermitRootLogin nog etcsshsshd_config

3

Installation de LDAP

Configuration de base Installation du package

apt-get install slapd

Choisir un mot de passe administrateur puis lancer la commande

dpkg-reconfigure slapd

Reacutepondre non agrave la question 1

Entrez le nom de domaine utiliseacute agrave la question 2 sous la forme domainetld

Entrez ce que vous voulez au 3egraveme eacutecran le nom de lrsquoorganisation ne sera pas utiliseacute

Entrez un mot de passe

Choisissez HDB

Choisissez si la base de donneacutees est supprimeacutee agrave la deacutesinstallation de slapd

Deacuteplacez lrsquoancienne base de donneacutees

Nrsquoutilisez pas LDAPv2

Installer les outils de conversion pour ldap (slaptest ldapmodify notamment)

apt-get install ldap-utils

On peut maintenant veacuterifier que la configuration est valable

ldapsearch -x -h localhost -b dc=domainedc=tld -LLL dc=domaine dn

Cette commande doit retourner quelque chose comme

dn dc=domainedc=tld

Il faut maintenant seacutecuriser le serveur LDAP en effet on peut y acceacuteder en anonyme avec la commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=config

(amp(objectClass=olcDatabaseConfig)(olcSuffix=dc=domainedc=tld))

Cette commande retourne un certain nombre drsquoinformations notamment agrave propos des champs suivants

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by none

olcAccess 1to dnbase= by read

olcAccess 2to by read

On va modifier ces champs avec la commande ldapmodify Pour cela on va creacuteer un fichier ldif

cat gt changeAccessldif ltlt EOF

dn olcDatabase=1hdbcn=config

changetype modify

delete olcAccess

-

add olcAccess

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by dn=cn=admindc=domainedc=tld write by none

-

add olcAccess

olcAccess 1to dnbase= by read

-

4

add olcAccess

olcAccess 2to by self write by dn=cn=admindc=domainedc=tld write by

none

-

EOF

On peut maintenant appliquer les changements avec ldapmodify

ldapmodify ndashc ndashY EXTERNAL ndashH ldapi -f changeAccessldif

La commande devrait vous confirmer que la modification srsquoest bien effectueacutee

SASLEXTERNAL authentication started

SASL username gidNumber=0+uidNumber=0cn=peercredcn=externalcn=auth

SASL SSF 0

modifying entry olcDatabase=1hdbcn=config

On peut veacuterifier qursquoon ne peut plus acceacuteder aux informations avec la commande

ldapsearch -x -c -h localhost -b dc=domainedc=tld

On peut veacuterifier la configuration en se connectant en tant qursquoadministrateur

ldapsearch -c -h localhost -b dc=domainedc=tld -D

cn=admindc=domainedc=tld ndashW

Configuration des Scheacutemas Nous allons utiliser les scheacutemas de courier-ldap Pour eacuteviter une manipulation compliqueacutee vous trouverez

directement le scheacutema avec le fichier authldapschema On place ce fichier dans le dossier

mv authldapschema etcldapschema

Nous creacuteons un fichier qui incluera tous les scheacutemas de base en plus du nouveau On peut les afficher avec la

commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

Creacuteation du fichier de configuration pour notre exemple cela donne

mkdir tmpldapconf

cat gt tmpldapconfldapconf ltlt EOF

include etcldapschemacoreschema

include etcldapschemacosineschema

include etcldapschemanisschema

include etcldapschemainetorgpersonschema

include etcldapschemaauthldapschema

EOF

On lance ensuite la commande

slaptest -f tmpldapconfldapconf -F tmpldapconf

Elle revoie un message de succegraves Cette commande a creacuteeacute dans le reacutepertoire tmpldapconf une arborescence

correspondant agrave la configuration de notre LDAP

On modifie le chemin de configuration

5

sed ndashi 0dnauthldap sauthldapauthldapcn=schemacn=config

cn=authldapldif

On supprime ensuite les 7 derniegraveres lignes du fichier

head -n -7 cn=authldapldif gt tmpldif

mv tmpldif cn=authldapldif

On peut maintenant importer notre fichier de configuration Pour ce faire

ldapadd -Y EXTERNAL -H ldapi -f

tmpldapconfcn=configcn=schemacn=authldapldif

Si tout va bien lrsquoentreacutee devrait avoir eacuteteacute ajouteacutee On peut veacuterifier avec la commande vue tout agrave lrsquoheure

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

On devrait voir en plus le nouveau scheacutema authldap

Constitution de la base de donneacutees LDAP Le remplissage de la base se fait agrave lrsquoaide de fichiers ldif Nous donnons ici un exemple de structure

Fichier pour la structure de base

dn dc=maildc=domainedc=tld

o intimailpw

description Global mail tree

dc mail

objectClass top

objectClass dcObject

objectClass organization

dn dc=peopledc=maildc=domainedc=tld

description Informations of all users

o people

dc people

objectClass top

objectClass dcObject

objectClass organization

dn dc=groupsdc=maildc=domainedc=tld

description All groups of users

o groups

dc groups

objectClass top

objectClass dcObject

objectClass organization

6

Fichier pour ajouter un utilisateur

dn cn=jbonddc=peopledc=maildc=domainedc=tld

uid jbond

mail jbonddomainetld

sn Moulin

givenName James

displayName James Bond

mailbox domainetldjbond

quota 50M

homeDirectory homevmail

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAccount

userPassword SSHA367PSXiUAegy8dpJbPU8OepEf8L5ye

Pour obtenir un hash du mot de passe

slappasswd -s password -h SSHA

On peut par la suite ajouter la configuration agrave la base de donneacutees avec la commande

ldapadd -D cn=admindc=domainedc=tld -W -h localhost -f pathtofile

Si les champs proposeacutes ne sont pas suffisants il faudra alors effectuer les modifications dans le fichier autldapschema

proposeacute plus haut et refaire la manipulation de configuration

De plus les standards du Mail deacutecrit par lrsquoIETF (RFC822 63 RFC1123 527 and RFC2821 451) impliquent drsquoavoir une

adresse Postmaster et une Abuse Pour cela nous pourrions creacuteer ces adresses avec la meacutethode vue au-dessus mais

ce nrsquoest pas la meilleure Il est preacutefeacuterable drsquoutiliser un alias comme nous le ferons avec les listes de diffusion Ici nous

proposons de rediriger ces deux adresses vers une adresse administrateur Pour cela la meacutethode est la mecircme sauf

que le fichier ldif nrsquoest pas tout agrave fait identique En voici un exemple

dn cn=postmasterdc=groupsdc=maildc=domainedc=tld

uid postmaster

mail postmasterdomainetld

sn Postmaster

displayName Postmaster

maildrop admindomainetld

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAlias

Pour faire une liste de diffusion la meacutethode est la mecircme Il suffit drsquoajouter toutes les adresses destinataires dans le

champ maildrop seacutepareacutees par des virgules ()

7

Installation de Postfix Installation des packages

apt-get install postfix postfix-ldap

Lors de lrsquoinstallation deux eacutecrans deacutefilent

- Configuration Internet Site

- Valeur par deacutefaut pour le mail name

On creacutee lrsquoutilisateur qui servira agrave exeacutecuter Postfix

groupadd vmail

useradd -g vmail -d homevmail -s binfalse -m vmail

Nous aurons besoin dans la suite des GID et UID creacuteeacutes agrave cet instant Ils peuvent ecirctre afficheacutes avec les commandes

cat etcgroup | grep vmail | cut -d -f3

cat etcpasswd | grep vmail | cut -d -f3

On ajoute les paramegravetres au fichier etcpostfixmaincf (remplacer les valeurs de GID et drsquoUID avec vos valeurs)

smtpd_banner = maildomainetld

virtual_mailbox_base = homevmail

virtual_mailbox_domains = dmainetld

virtual_mailbox_maps = ldapetcpostfixldap_accountscf

virtual_alias_maps = ldapetcpostfixldap_aliasescf

virtual_minimum_uid = 100

virtual_gid_maps = static1001 Remplacez ici par votre valeur de GID

virtual_uid_maps = static1001 Remplacez ici par votre valeur drsquoUID

Il nous faut maintenant constituer nos fichiers de configuration ldap_accountscf

cat gt etcpostfixldap_accountscf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=peopledc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAccount)(mail=s))

result_attribute = mailbox

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

Et pour ldap_aliasescf

cat gt ldap_aliasescf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=groupsdc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAlias)(mail=s))

result_attribute = maildrop

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

8

On peut maintenant veacuterifier la configuration de Postfix avec (cette commande ne doit rien retourner si crsquoest bon)

postfix check

Si crsquoest bon alors on recharge le serveur

postfix reload

On peut alors faire un envoi de mail test via telnet

telnet localhost 25

Si vous souhaitez deacutelivrer les mails agrave votre maniegravere il faut dans le fichier etcpostfixmaincf la ligne

virtual_transport = nomdevotreregle

Et de mecircme dans le fichier etcpostfixmastercf

nomdevotreregle unix - n n - 5 pipe

flags=Rq user=vmail null_sender=

argv=chemindevotreprogramme

Il nous reste maintenant agrave configurer les diffeacuterents enregistrements DNS neacutecessaire au fonctionnement drsquoun serveur

mail Vous pouvez utiliser la solution de votre choix Dans la suite vous trouverez une meacutethode utilisant Bind9

Installation de Bind9 Dans toute cette partie on se situera dans le dossier etcbind Dans la suite notre IP sera abcd

Dans le fichier namedconfoptions on ajoutera dans le champ options

version Not supported

Dans un dossier zones on eacutecrit le fichier dbdomainetld

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122111 Serial

43200 Refresh

3600 Retry

2419200 Expire

86400 ) Negative Cache TTL

IN NS nsdomainetld

IN NS ns11ovhnet

ns IN A abcd

www IN A abcd

IN A abcd

IN MX 10 maildomainetld

mail IN A abcd

Dans le mecircme dossier zones on a cbain-addrarpa

9

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122101 serial

14400 refresh

3600 retry

604800 expire

10800 minimum

)

cbain-addrarpa IN NS nsdomainetld

cbain-addrarpa IN NS ns11ovhnet

d IN PTR maildomainetld

Il faut faire attention agrave bien increacutementer le serial pour chaque modification des fichiers

Dans le fichier namedconflocal

zone domainetld

type master

file etcbindzonesdbdomainetld

allow-transfer 213251128130

notify yes

zone cbain-addrarpa IN

type master

file etcbindzonescbain-addrarpa

allow-transfer 213251128130

Ici 213251128130 est lrsquoadresse IP du serveur ns11ovhnet

Il faut bien sucircr configurer le DNS avec votre fournisseur (Gandi OVH hellip) Pour ccedila amusez-vous bien Vous pouvez

aussi tester votre configuration avec des outils en ligne tels que DNSstuff

En test final si votre configuration est bonne vous devriez pouvoir envoyer un mail depuis un service neutre (Gmail

yahoo hellip) et le voir dans votre arborescence (ici homevmaildomainetld)

Installation du paquet Debian et configuration de lighttpd

Commencez par reacutecupeacuterer le paquet deb agrave lrsquoadresse suivante httpswwwintimailpwintimaildeb

Installez ensuite GDebi Il srsquoagit drsquoun dpkg ameacutelioreacute pour teacuteleacutecharger les deacutependances automatiquement ce que

dpkg ne gegravere pas

apt-get update

apt-get install gdebi-core

10

Vous pouvez alors installer le paquet

gdebi intimaildeb

Vous aurez alors le site web drsquointiMail deacuteployeacute au chemin varwwwwebmail

Il ne vous reste plus qursquoagrave changer la configuration de lighttpd votre serveur web pour mettre en ligne le site

Vous pouvez pour cela copier-coller la configuration suivante mais veillez agrave bien changer lrsquoadresse IP preacutesente au

deacutebut de la partie SSL CONFIG avec votre adresse IP

serv ermodules = ( mod_access

mod_accesslog

mod_alias

mod_compress

mod_redirect

mod_rewrite

)

Hide server version

servertag = Such Headers Very try Now close telnet

serverdocument-root = varwwwwebmail

serverupload-dirs = ( varwwwwebmailuploads )

servererrorlog = varloglighttpderrorlog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

serverport = 80

accesslogformat = V h l u t r gts b Refereri

User-Agenti

accesslogfilename = varloglighttpdaccesslog

index-filenames = ( indexphp indexhtml

indexlighttpdhtml )

urlaccess-deny = ( ~ inc )

static-fileexclude-extensions = ( php pl fcgi )

compresscache-dir = varcachelighttpdcompress

compressfiletype = ( applicationjavascript textcss

texthtml textplain )

default listening port for IPv6 falls back to the IPv4 port

include_shell usrsharelighttpduse-ipv6pl + serverport

include_shell usrsharelighttpdcreate-mimeassignpl

include_shell usrsharelighttpdinclude-conf-enabledpl

SSL CONFIG

$SERVER[socket] == 5234485443

sslengine = enable

11

sslpemfile = etclighttpdsslintimailpwpem

sslca-file = etclighttpdsslintimailpwcrt

servername = intimailpw

votre configuration habituelle pour ce domaine

serverdocument-root = varwwwwebmail

servererrorlog = varloglighttpderror_ssllog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

Rewrite des URL pour masquer php

urlrewrite-once = ( ^()$ =gt $1 )

urlrewrite-if-not-file = ( ^([^])()$ =gt $1php$2 )

servernetwork-backend = writev

Deacutependances Slapd

Ldap-utils

Postfix

Postfix-ldap

Bind9

Lighttpd

12

Sources httpswikigandinetfrhostingusing-linuxtutorialsdebianmail-server-ldap

httpwwwpostfixorgpipe8html

httpwwwpostfixorgFILTER_READMEhtml

httpwwwpostfixorg

httpwwwpostfixorgtransport5html

Page 35: Système d'hébergement domestique...place sur les domaines .pw par Gandi.net, notre fournisseur. Nous n’avons donc pas pu l’implémenter. Nous avons configuré Postfix pour qu’il

2

Apregraves une nouvelle installation de lrsquoOS Exeacutecutez ces commandes pour mettre agrave jour agrave la derniegravere version Ces opeacuterations peuvent prendre un certain

temps Nous avons utiliseacute pour cet exemple Raspbian Jessie Lite sur une Raspberry Pi 2

apt-get update

apt-get upgrade ampamp apt-get dist-upgrade

apt-get install linux-headers-$(uname -r)

reboot

Puis lancer

raspi-config

Etendre au maximum lrsquoespace de stockage en navigant dans les menus

Expand Filesystem

Reacutegler une ip statique avec la box fichier etcnetworkinterfaces

iface eth0 inet static

address 192168131

netmask 2552552550

gateway 19216811

Nous avons aussi supprimeacute wpasupplicant

Seacutecurisation du serveur

Changement de lrsquoutilisateur par deacutefaut Changez le nom drsquoutilisateur par deacutefaut ainsi que son mot de passe

sudo passwd root

Sortie et login en tant que root puis

usermod -l myuname pi

usermod -m -d homemyuname myuname

groupmod ndashn myuname pi

passwd myuname

Voir cette adresse pour lrsquoutilisation de cleacutes priveacuteespubliques

Changement du port SSH sed ndashi sPort 22Port 2222g etcsshsshd_config

Interdire lrsquoauthentification SSH pour root sed -i sPermitRootLogin yesPermitRootLogin nog etcsshsshd_config

3

Installation de LDAP

Configuration de base Installation du package

apt-get install slapd

Choisir un mot de passe administrateur puis lancer la commande

dpkg-reconfigure slapd

Reacutepondre non agrave la question 1

Entrez le nom de domaine utiliseacute agrave la question 2 sous la forme domainetld

Entrez ce que vous voulez au 3egraveme eacutecran le nom de lrsquoorganisation ne sera pas utiliseacute

Entrez un mot de passe

Choisissez HDB

Choisissez si la base de donneacutees est supprimeacutee agrave la deacutesinstallation de slapd

Deacuteplacez lrsquoancienne base de donneacutees

Nrsquoutilisez pas LDAPv2

Installer les outils de conversion pour ldap (slaptest ldapmodify notamment)

apt-get install ldap-utils

On peut maintenant veacuterifier que la configuration est valable

ldapsearch -x -h localhost -b dc=domainedc=tld -LLL dc=domaine dn

Cette commande doit retourner quelque chose comme

dn dc=domainedc=tld

Il faut maintenant seacutecuriser le serveur LDAP en effet on peut y acceacuteder en anonyme avec la commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=config

(amp(objectClass=olcDatabaseConfig)(olcSuffix=dc=domainedc=tld))

Cette commande retourne un certain nombre drsquoinformations notamment agrave propos des champs suivants

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by none

olcAccess 1to dnbase= by read

olcAccess 2to by read

On va modifier ces champs avec la commande ldapmodify Pour cela on va creacuteer un fichier ldif

cat gt changeAccessldif ltlt EOF

dn olcDatabase=1hdbcn=config

changetype modify

delete olcAccess

-

add olcAccess

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by dn=cn=admindc=domainedc=tld write by none

-

add olcAccess

olcAccess 1to dnbase= by read

-

4

add olcAccess

olcAccess 2to by self write by dn=cn=admindc=domainedc=tld write by

none

-

EOF

On peut maintenant appliquer les changements avec ldapmodify

ldapmodify ndashc ndashY EXTERNAL ndashH ldapi -f changeAccessldif

La commande devrait vous confirmer que la modification srsquoest bien effectueacutee

SASLEXTERNAL authentication started

SASL username gidNumber=0+uidNumber=0cn=peercredcn=externalcn=auth

SASL SSF 0

modifying entry olcDatabase=1hdbcn=config

On peut veacuterifier qursquoon ne peut plus acceacuteder aux informations avec la commande

ldapsearch -x -c -h localhost -b dc=domainedc=tld

On peut veacuterifier la configuration en se connectant en tant qursquoadministrateur

ldapsearch -c -h localhost -b dc=domainedc=tld -D

cn=admindc=domainedc=tld ndashW

Configuration des Scheacutemas Nous allons utiliser les scheacutemas de courier-ldap Pour eacuteviter une manipulation compliqueacutee vous trouverez

directement le scheacutema avec le fichier authldapschema On place ce fichier dans le dossier

mv authldapschema etcldapschema

Nous creacuteons un fichier qui incluera tous les scheacutemas de base en plus du nouveau On peut les afficher avec la

commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

Creacuteation du fichier de configuration pour notre exemple cela donne

mkdir tmpldapconf

cat gt tmpldapconfldapconf ltlt EOF

include etcldapschemacoreschema

include etcldapschemacosineschema

include etcldapschemanisschema

include etcldapschemainetorgpersonschema

include etcldapschemaauthldapschema

EOF

On lance ensuite la commande

slaptest -f tmpldapconfldapconf -F tmpldapconf

Elle revoie un message de succegraves Cette commande a creacuteeacute dans le reacutepertoire tmpldapconf une arborescence

correspondant agrave la configuration de notre LDAP

On modifie le chemin de configuration

5

sed ndashi 0dnauthldap sauthldapauthldapcn=schemacn=config

cn=authldapldif

On supprime ensuite les 7 derniegraveres lignes du fichier

head -n -7 cn=authldapldif gt tmpldif

mv tmpldif cn=authldapldif

On peut maintenant importer notre fichier de configuration Pour ce faire

ldapadd -Y EXTERNAL -H ldapi -f

tmpldapconfcn=configcn=schemacn=authldapldif

Si tout va bien lrsquoentreacutee devrait avoir eacuteteacute ajouteacutee On peut veacuterifier avec la commande vue tout agrave lrsquoheure

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

On devrait voir en plus le nouveau scheacutema authldap

Constitution de la base de donneacutees LDAP Le remplissage de la base se fait agrave lrsquoaide de fichiers ldif Nous donnons ici un exemple de structure

Fichier pour la structure de base

dn dc=maildc=domainedc=tld

o intimailpw

description Global mail tree

dc mail

objectClass top

objectClass dcObject

objectClass organization

dn dc=peopledc=maildc=domainedc=tld

description Informations of all users

o people

dc people

objectClass top

objectClass dcObject

objectClass organization

dn dc=groupsdc=maildc=domainedc=tld

description All groups of users

o groups

dc groups

objectClass top

objectClass dcObject

objectClass organization

6

Fichier pour ajouter un utilisateur

dn cn=jbonddc=peopledc=maildc=domainedc=tld

uid jbond

mail jbonddomainetld

sn Moulin

givenName James

displayName James Bond

mailbox domainetldjbond

quota 50M

homeDirectory homevmail

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAccount

userPassword SSHA367PSXiUAegy8dpJbPU8OepEf8L5ye

Pour obtenir un hash du mot de passe

slappasswd -s password -h SSHA

On peut par la suite ajouter la configuration agrave la base de donneacutees avec la commande

ldapadd -D cn=admindc=domainedc=tld -W -h localhost -f pathtofile

Si les champs proposeacutes ne sont pas suffisants il faudra alors effectuer les modifications dans le fichier autldapschema

proposeacute plus haut et refaire la manipulation de configuration

De plus les standards du Mail deacutecrit par lrsquoIETF (RFC822 63 RFC1123 527 and RFC2821 451) impliquent drsquoavoir une

adresse Postmaster et une Abuse Pour cela nous pourrions creacuteer ces adresses avec la meacutethode vue au-dessus mais

ce nrsquoest pas la meilleure Il est preacutefeacuterable drsquoutiliser un alias comme nous le ferons avec les listes de diffusion Ici nous

proposons de rediriger ces deux adresses vers une adresse administrateur Pour cela la meacutethode est la mecircme sauf

que le fichier ldif nrsquoest pas tout agrave fait identique En voici un exemple

dn cn=postmasterdc=groupsdc=maildc=domainedc=tld

uid postmaster

mail postmasterdomainetld

sn Postmaster

displayName Postmaster

maildrop admindomainetld

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAlias

Pour faire une liste de diffusion la meacutethode est la mecircme Il suffit drsquoajouter toutes les adresses destinataires dans le

champ maildrop seacutepareacutees par des virgules ()

7

Installation de Postfix Installation des packages

apt-get install postfix postfix-ldap

Lors de lrsquoinstallation deux eacutecrans deacutefilent

- Configuration Internet Site

- Valeur par deacutefaut pour le mail name

On creacutee lrsquoutilisateur qui servira agrave exeacutecuter Postfix

groupadd vmail

useradd -g vmail -d homevmail -s binfalse -m vmail

Nous aurons besoin dans la suite des GID et UID creacuteeacutes agrave cet instant Ils peuvent ecirctre afficheacutes avec les commandes

cat etcgroup | grep vmail | cut -d -f3

cat etcpasswd | grep vmail | cut -d -f3

On ajoute les paramegravetres au fichier etcpostfixmaincf (remplacer les valeurs de GID et drsquoUID avec vos valeurs)

smtpd_banner = maildomainetld

virtual_mailbox_base = homevmail

virtual_mailbox_domains = dmainetld

virtual_mailbox_maps = ldapetcpostfixldap_accountscf

virtual_alias_maps = ldapetcpostfixldap_aliasescf

virtual_minimum_uid = 100

virtual_gid_maps = static1001 Remplacez ici par votre valeur de GID

virtual_uid_maps = static1001 Remplacez ici par votre valeur drsquoUID

Il nous faut maintenant constituer nos fichiers de configuration ldap_accountscf

cat gt etcpostfixldap_accountscf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=peopledc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAccount)(mail=s))

result_attribute = mailbox

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

Et pour ldap_aliasescf

cat gt ldap_aliasescf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=groupsdc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAlias)(mail=s))

result_attribute = maildrop

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

8

On peut maintenant veacuterifier la configuration de Postfix avec (cette commande ne doit rien retourner si crsquoest bon)

postfix check

Si crsquoest bon alors on recharge le serveur

postfix reload

On peut alors faire un envoi de mail test via telnet

telnet localhost 25

Si vous souhaitez deacutelivrer les mails agrave votre maniegravere il faut dans le fichier etcpostfixmaincf la ligne

virtual_transport = nomdevotreregle

Et de mecircme dans le fichier etcpostfixmastercf

nomdevotreregle unix - n n - 5 pipe

flags=Rq user=vmail null_sender=

argv=chemindevotreprogramme

Il nous reste maintenant agrave configurer les diffeacuterents enregistrements DNS neacutecessaire au fonctionnement drsquoun serveur

mail Vous pouvez utiliser la solution de votre choix Dans la suite vous trouverez une meacutethode utilisant Bind9

Installation de Bind9 Dans toute cette partie on se situera dans le dossier etcbind Dans la suite notre IP sera abcd

Dans le fichier namedconfoptions on ajoutera dans le champ options

version Not supported

Dans un dossier zones on eacutecrit le fichier dbdomainetld

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122111 Serial

43200 Refresh

3600 Retry

2419200 Expire

86400 ) Negative Cache TTL

IN NS nsdomainetld

IN NS ns11ovhnet

ns IN A abcd

www IN A abcd

IN A abcd

IN MX 10 maildomainetld

mail IN A abcd

Dans le mecircme dossier zones on a cbain-addrarpa

9

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122101 serial

14400 refresh

3600 retry

604800 expire

10800 minimum

)

cbain-addrarpa IN NS nsdomainetld

cbain-addrarpa IN NS ns11ovhnet

d IN PTR maildomainetld

Il faut faire attention agrave bien increacutementer le serial pour chaque modification des fichiers

Dans le fichier namedconflocal

zone domainetld

type master

file etcbindzonesdbdomainetld

allow-transfer 213251128130

notify yes

zone cbain-addrarpa IN

type master

file etcbindzonescbain-addrarpa

allow-transfer 213251128130

Ici 213251128130 est lrsquoadresse IP du serveur ns11ovhnet

Il faut bien sucircr configurer le DNS avec votre fournisseur (Gandi OVH hellip) Pour ccedila amusez-vous bien Vous pouvez

aussi tester votre configuration avec des outils en ligne tels que DNSstuff

En test final si votre configuration est bonne vous devriez pouvoir envoyer un mail depuis un service neutre (Gmail

yahoo hellip) et le voir dans votre arborescence (ici homevmaildomainetld)

Installation du paquet Debian et configuration de lighttpd

Commencez par reacutecupeacuterer le paquet deb agrave lrsquoadresse suivante httpswwwintimailpwintimaildeb

Installez ensuite GDebi Il srsquoagit drsquoun dpkg ameacutelioreacute pour teacuteleacutecharger les deacutependances automatiquement ce que

dpkg ne gegravere pas

apt-get update

apt-get install gdebi-core

10

Vous pouvez alors installer le paquet

gdebi intimaildeb

Vous aurez alors le site web drsquointiMail deacuteployeacute au chemin varwwwwebmail

Il ne vous reste plus qursquoagrave changer la configuration de lighttpd votre serveur web pour mettre en ligne le site

Vous pouvez pour cela copier-coller la configuration suivante mais veillez agrave bien changer lrsquoadresse IP preacutesente au

deacutebut de la partie SSL CONFIG avec votre adresse IP

serv ermodules = ( mod_access

mod_accesslog

mod_alias

mod_compress

mod_redirect

mod_rewrite

)

Hide server version

servertag = Such Headers Very try Now close telnet

serverdocument-root = varwwwwebmail

serverupload-dirs = ( varwwwwebmailuploads )

servererrorlog = varloglighttpderrorlog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

serverport = 80

accesslogformat = V h l u t r gts b Refereri

User-Agenti

accesslogfilename = varloglighttpdaccesslog

index-filenames = ( indexphp indexhtml

indexlighttpdhtml )

urlaccess-deny = ( ~ inc )

static-fileexclude-extensions = ( php pl fcgi )

compresscache-dir = varcachelighttpdcompress

compressfiletype = ( applicationjavascript textcss

texthtml textplain )

default listening port for IPv6 falls back to the IPv4 port

include_shell usrsharelighttpduse-ipv6pl + serverport

include_shell usrsharelighttpdcreate-mimeassignpl

include_shell usrsharelighttpdinclude-conf-enabledpl

SSL CONFIG

$SERVER[socket] == 5234485443

sslengine = enable

11

sslpemfile = etclighttpdsslintimailpwpem

sslca-file = etclighttpdsslintimailpwcrt

servername = intimailpw

votre configuration habituelle pour ce domaine

serverdocument-root = varwwwwebmail

servererrorlog = varloglighttpderror_ssllog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

Rewrite des URL pour masquer php

urlrewrite-once = ( ^()$ =gt $1 )

urlrewrite-if-not-file = ( ^([^])()$ =gt $1php$2 )

servernetwork-backend = writev

Deacutependances Slapd

Ldap-utils

Postfix

Postfix-ldap

Bind9

Lighttpd

12

Sources httpswikigandinetfrhostingusing-linuxtutorialsdebianmail-server-ldap

httpwwwpostfixorgpipe8html

httpwwwpostfixorgFILTER_READMEhtml

httpwwwpostfixorg

httpwwwpostfixorgtransport5html

Page 36: Système d'hébergement domestique...place sur les domaines .pw par Gandi.net, notre fournisseur. Nous n’avons donc pas pu l’implémenter. Nous avons configuré Postfix pour qu’il

3

Installation de LDAP

Configuration de base Installation du package

apt-get install slapd

Choisir un mot de passe administrateur puis lancer la commande

dpkg-reconfigure slapd

Reacutepondre non agrave la question 1

Entrez le nom de domaine utiliseacute agrave la question 2 sous la forme domainetld

Entrez ce que vous voulez au 3egraveme eacutecran le nom de lrsquoorganisation ne sera pas utiliseacute

Entrez un mot de passe

Choisissez HDB

Choisissez si la base de donneacutees est supprimeacutee agrave la deacutesinstallation de slapd

Deacuteplacez lrsquoancienne base de donneacutees

Nrsquoutilisez pas LDAPv2

Installer les outils de conversion pour ldap (slaptest ldapmodify notamment)

apt-get install ldap-utils

On peut maintenant veacuterifier que la configuration est valable

ldapsearch -x -h localhost -b dc=domainedc=tld -LLL dc=domaine dn

Cette commande doit retourner quelque chose comme

dn dc=domainedc=tld

Il faut maintenant seacutecuriser le serveur LDAP en effet on peut y acceacuteder en anonyme avec la commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=config

(amp(objectClass=olcDatabaseConfig)(olcSuffix=dc=domainedc=tld))

Cette commande retourne un certain nombre drsquoinformations notamment agrave propos des champs suivants

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by none

olcAccess 1to dnbase= by read

olcAccess 2to by read

On va modifier ces champs avec la commande ldapmodify Pour cela on va creacuteer un fichier ldif

cat gt changeAccessldif ltlt EOF

dn olcDatabase=1hdbcn=config

changetype modify

delete olcAccess

-

add olcAccess

olcAccess 0to attrs=userPasswordshadowLastChange by self write by

anonymous auth by dn=cn=admindc=domainedc=tld write by none

-

add olcAccess

olcAccess 1to dnbase= by read

-

4

add olcAccess

olcAccess 2to by self write by dn=cn=admindc=domainedc=tld write by

none

-

EOF

On peut maintenant appliquer les changements avec ldapmodify

ldapmodify ndashc ndashY EXTERNAL ndashH ldapi -f changeAccessldif

La commande devrait vous confirmer que la modification srsquoest bien effectueacutee

SASLEXTERNAL authentication started

SASL username gidNumber=0+uidNumber=0cn=peercredcn=externalcn=auth

SASL SSF 0

modifying entry olcDatabase=1hdbcn=config

On peut veacuterifier qursquoon ne peut plus acceacuteder aux informations avec la commande

ldapsearch -x -c -h localhost -b dc=domainedc=tld

On peut veacuterifier la configuration en se connectant en tant qursquoadministrateur

ldapsearch -c -h localhost -b dc=domainedc=tld -D

cn=admindc=domainedc=tld ndashW

Configuration des Scheacutemas Nous allons utiliser les scheacutemas de courier-ldap Pour eacuteviter une manipulation compliqueacutee vous trouverez

directement le scheacutema avec le fichier authldapschema On place ce fichier dans le dossier

mv authldapschema etcldapschema

Nous creacuteons un fichier qui incluera tous les scheacutemas de base en plus du nouveau On peut les afficher avec la

commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

Creacuteation du fichier de configuration pour notre exemple cela donne

mkdir tmpldapconf

cat gt tmpldapconfldapconf ltlt EOF

include etcldapschemacoreschema

include etcldapschemacosineschema

include etcldapschemanisschema

include etcldapschemainetorgpersonschema

include etcldapschemaauthldapschema

EOF

On lance ensuite la commande

slaptest -f tmpldapconfldapconf -F tmpldapconf

Elle revoie un message de succegraves Cette commande a creacuteeacute dans le reacutepertoire tmpldapconf une arborescence

correspondant agrave la configuration de notre LDAP

On modifie le chemin de configuration

5

sed ndashi 0dnauthldap sauthldapauthldapcn=schemacn=config

cn=authldapldif

On supprime ensuite les 7 derniegraveres lignes du fichier

head -n -7 cn=authldapldif gt tmpldif

mv tmpldif cn=authldapldif

On peut maintenant importer notre fichier de configuration Pour ce faire

ldapadd -Y EXTERNAL -H ldapi -f

tmpldapconfcn=configcn=schemacn=authldapldif

Si tout va bien lrsquoentreacutee devrait avoir eacuteteacute ajouteacutee On peut veacuterifier avec la commande vue tout agrave lrsquoheure

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

On devrait voir en plus le nouveau scheacutema authldap

Constitution de la base de donneacutees LDAP Le remplissage de la base se fait agrave lrsquoaide de fichiers ldif Nous donnons ici un exemple de structure

Fichier pour la structure de base

dn dc=maildc=domainedc=tld

o intimailpw

description Global mail tree

dc mail

objectClass top

objectClass dcObject

objectClass organization

dn dc=peopledc=maildc=domainedc=tld

description Informations of all users

o people

dc people

objectClass top

objectClass dcObject

objectClass organization

dn dc=groupsdc=maildc=domainedc=tld

description All groups of users

o groups

dc groups

objectClass top

objectClass dcObject

objectClass organization

6

Fichier pour ajouter un utilisateur

dn cn=jbonddc=peopledc=maildc=domainedc=tld

uid jbond

mail jbonddomainetld

sn Moulin

givenName James

displayName James Bond

mailbox domainetldjbond

quota 50M

homeDirectory homevmail

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAccount

userPassword SSHA367PSXiUAegy8dpJbPU8OepEf8L5ye

Pour obtenir un hash du mot de passe

slappasswd -s password -h SSHA

On peut par la suite ajouter la configuration agrave la base de donneacutees avec la commande

ldapadd -D cn=admindc=domainedc=tld -W -h localhost -f pathtofile

Si les champs proposeacutes ne sont pas suffisants il faudra alors effectuer les modifications dans le fichier autldapschema

proposeacute plus haut et refaire la manipulation de configuration

De plus les standards du Mail deacutecrit par lrsquoIETF (RFC822 63 RFC1123 527 and RFC2821 451) impliquent drsquoavoir une

adresse Postmaster et une Abuse Pour cela nous pourrions creacuteer ces adresses avec la meacutethode vue au-dessus mais

ce nrsquoest pas la meilleure Il est preacutefeacuterable drsquoutiliser un alias comme nous le ferons avec les listes de diffusion Ici nous

proposons de rediriger ces deux adresses vers une adresse administrateur Pour cela la meacutethode est la mecircme sauf

que le fichier ldif nrsquoest pas tout agrave fait identique En voici un exemple

dn cn=postmasterdc=groupsdc=maildc=domainedc=tld

uid postmaster

mail postmasterdomainetld

sn Postmaster

displayName Postmaster

maildrop admindomainetld

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAlias

Pour faire une liste de diffusion la meacutethode est la mecircme Il suffit drsquoajouter toutes les adresses destinataires dans le

champ maildrop seacutepareacutees par des virgules ()

7

Installation de Postfix Installation des packages

apt-get install postfix postfix-ldap

Lors de lrsquoinstallation deux eacutecrans deacutefilent

- Configuration Internet Site

- Valeur par deacutefaut pour le mail name

On creacutee lrsquoutilisateur qui servira agrave exeacutecuter Postfix

groupadd vmail

useradd -g vmail -d homevmail -s binfalse -m vmail

Nous aurons besoin dans la suite des GID et UID creacuteeacutes agrave cet instant Ils peuvent ecirctre afficheacutes avec les commandes

cat etcgroup | grep vmail | cut -d -f3

cat etcpasswd | grep vmail | cut -d -f3

On ajoute les paramegravetres au fichier etcpostfixmaincf (remplacer les valeurs de GID et drsquoUID avec vos valeurs)

smtpd_banner = maildomainetld

virtual_mailbox_base = homevmail

virtual_mailbox_domains = dmainetld

virtual_mailbox_maps = ldapetcpostfixldap_accountscf

virtual_alias_maps = ldapetcpostfixldap_aliasescf

virtual_minimum_uid = 100

virtual_gid_maps = static1001 Remplacez ici par votre valeur de GID

virtual_uid_maps = static1001 Remplacez ici par votre valeur drsquoUID

Il nous faut maintenant constituer nos fichiers de configuration ldap_accountscf

cat gt etcpostfixldap_accountscf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=peopledc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAccount)(mail=s))

result_attribute = mailbox

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

Et pour ldap_aliasescf

cat gt ldap_aliasescf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=groupsdc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAlias)(mail=s))

result_attribute = maildrop

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

8

On peut maintenant veacuterifier la configuration de Postfix avec (cette commande ne doit rien retourner si crsquoest bon)

postfix check

Si crsquoest bon alors on recharge le serveur

postfix reload

On peut alors faire un envoi de mail test via telnet

telnet localhost 25

Si vous souhaitez deacutelivrer les mails agrave votre maniegravere il faut dans le fichier etcpostfixmaincf la ligne

virtual_transport = nomdevotreregle

Et de mecircme dans le fichier etcpostfixmastercf

nomdevotreregle unix - n n - 5 pipe

flags=Rq user=vmail null_sender=

argv=chemindevotreprogramme

Il nous reste maintenant agrave configurer les diffeacuterents enregistrements DNS neacutecessaire au fonctionnement drsquoun serveur

mail Vous pouvez utiliser la solution de votre choix Dans la suite vous trouverez une meacutethode utilisant Bind9

Installation de Bind9 Dans toute cette partie on se situera dans le dossier etcbind Dans la suite notre IP sera abcd

Dans le fichier namedconfoptions on ajoutera dans le champ options

version Not supported

Dans un dossier zones on eacutecrit le fichier dbdomainetld

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122111 Serial

43200 Refresh

3600 Retry

2419200 Expire

86400 ) Negative Cache TTL

IN NS nsdomainetld

IN NS ns11ovhnet

ns IN A abcd

www IN A abcd

IN A abcd

IN MX 10 maildomainetld

mail IN A abcd

Dans le mecircme dossier zones on a cbain-addrarpa

9

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122101 serial

14400 refresh

3600 retry

604800 expire

10800 minimum

)

cbain-addrarpa IN NS nsdomainetld

cbain-addrarpa IN NS ns11ovhnet

d IN PTR maildomainetld

Il faut faire attention agrave bien increacutementer le serial pour chaque modification des fichiers

Dans le fichier namedconflocal

zone domainetld

type master

file etcbindzonesdbdomainetld

allow-transfer 213251128130

notify yes

zone cbain-addrarpa IN

type master

file etcbindzonescbain-addrarpa

allow-transfer 213251128130

Ici 213251128130 est lrsquoadresse IP du serveur ns11ovhnet

Il faut bien sucircr configurer le DNS avec votre fournisseur (Gandi OVH hellip) Pour ccedila amusez-vous bien Vous pouvez

aussi tester votre configuration avec des outils en ligne tels que DNSstuff

En test final si votre configuration est bonne vous devriez pouvoir envoyer un mail depuis un service neutre (Gmail

yahoo hellip) et le voir dans votre arborescence (ici homevmaildomainetld)

Installation du paquet Debian et configuration de lighttpd

Commencez par reacutecupeacuterer le paquet deb agrave lrsquoadresse suivante httpswwwintimailpwintimaildeb

Installez ensuite GDebi Il srsquoagit drsquoun dpkg ameacutelioreacute pour teacuteleacutecharger les deacutependances automatiquement ce que

dpkg ne gegravere pas

apt-get update

apt-get install gdebi-core

10

Vous pouvez alors installer le paquet

gdebi intimaildeb

Vous aurez alors le site web drsquointiMail deacuteployeacute au chemin varwwwwebmail

Il ne vous reste plus qursquoagrave changer la configuration de lighttpd votre serveur web pour mettre en ligne le site

Vous pouvez pour cela copier-coller la configuration suivante mais veillez agrave bien changer lrsquoadresse IP preacutesente au

deacutebut de la partie SSL CONFIG avec votre adresse IP

serv ermodules = ( mod_access

mod_accesslog

mod_alias

mod_compress

mod_redirect

mod_rewrite

)

Hide server version

servertag = Such Headers Very try Now close telnet

serverdocument-root = varwwwwebmail

serverupload-dirs = ( varwwwwebmailuploads )

servererrorlog = varloglighttpderrorlog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

serverport = 80

accesslogformat = V h l u t r gts b Refereri

User-Agenti

accesslogfilename = varloglighttpdaccesslog

index-filenames = ( indexphp indexhtml

indexlighttpdhtml )

urlaccess-deny = ( ~ inc )

static-fileexclude-extensions = ( php pl fcgi )

compresscache-dir = varcachelighttpdcompress

compressfiletype = ( applicationjavascript textcss

texthtml textplain )

default listening port for IPv6 falls back to the IPv4 port

include_shell usrsharelighttpduse-ipv6pl + serverport

include_shell usrsharelighttpdcreate-mimeassignpl

include_shell usrsharelighttpdinclude-conf-enabledpl

SSL CONFIG

$SERVER[socket] == 5234485443

sslengine = enable

11

sslpemfile = etclighttpdsslintimailpwpem

sslca-file = etclighttpdsslintimailpwcrt

servername = intimailpw

votre configuration habituelle pour ce domaine

serverdocument-root = varwwwwebmail

servererrorlog = varloglighttpderror_ssllog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

Rewrite des URL pour masquer php

urlrewrite-once = ( ^()$ =gt $1 )

urlrewrite-if-not-file = ( ^([^])()$ =gt $1php$2 )

servernetwork-backend = writev

Deacutependances Slapd

Ldap-utils

Postfix

Postfix-ldap

Bind9

Lighttpd

12

Sources httpswikigandinetfrhostingusing-linuxtutorialsdebianmail-server-ldap

httpwwwpostfixorgpipe8html

httpwwwpostfixorgFILTER_READMEhtml

httpwwwpostfixorg

httpwwwpostfixorgtransport5html

Page 37: Système d'hébergement domestique...place sur les domaines .pw par Gandi.net, notre fournisseur. Nous n’avons donc pas pu l’implémenter. Nous avons configuré Postfix pour qu’il

4

add olcAccess

olcAccess 2to by self write by dn=cn=admindc=domainedc=tld write by

none

-

EOF

On peut maintenant appliquer les changements avec ldapmodify

ldapmodify ndashc ndashY EXTERNAL ndashH ldapi -f changeAccessldif

La commande devrait vous confirmer que la modification srsquoest bien effectueacutee

SASLEXTERNAL authentication started

SASL username gidNumber=0+uidNumber=0cn=peercredcn=externalcn=auth

SASL SSF 0

modifying entry olcDatabase=1hdbcn=config

On peut veacuterifier qursquoon ne peut plus acceacuteder aux informations avec la commande

ldapsearch -x -c -h localhost -b dc=domainedc=tld

On peut veacuterifier la configuration en se connectant en tant qursquoadministrateur

ldapsearch -c -h localhost -b dc=domainedc=tld -D

cn=admindc=domainedc=tld ndashW

Configuration des Scheacutemas Nous allons utiliser les scheacutemas de courier-ldap Pour eacuteviter une manipulation compliqueacutee vous trouverez

directement le scheacutema avec le fichier authldapschema On place ce fichier dans le dossier

mv authldapschema etcldapschema

Nous creacuteons un fichier qui incluera tous les scheacutemas de base en plus du nouveau On peut les afficher avec la

commande

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

Creacuteation du fichier de configuration pour notre exemple cela donne

mkdir tmpldapconf

cat gt tmpldapconfldapconf ltlt EOF

include etcldapschemacoreschema

include etcldapschemacosineschema

include etcldapschemanisschema

include etcldapschemainetorgpersonschema

include etcldapschemaauthldapschema

EOF

On lance ensuite la commande

slaptest -f tmpldapconfldapconf -F tmpldapconf

Elle revoie un message de succegraves Cette commande a creacuteeacute dans le reacutepertoire tmpldapconf une arborescence

correspondant agrave la configuration de notre LDAP

On modifie le chemin de configuration

5

sed ndashi 0dnauthldap sauthldapauthldapcn=schemacn=config

cn=authldapldif

On supprime ensuite les 7 derniegraveres lignes du fichier

head -n -7 cn=authldapldif gt tmpldif

mv tmpldif cn=authldapldif

On peut maintenant importer notre fichier de configuration Pour ce faire

ldapadd -Y EXTERNAL -H ldapi -f

tmpldapconfcn=configcn=schemacn=authldapldif

Si tout va bien lrsquoentreacutee devrait avoir eacuteteacute ajouteacutee On peut veacuterifier avec la commande vue tout agrave lrsquoheure

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

On devrait voir en plus le nouveau scheacutema authldap

Constitution de la base de donneacutees LDAP Le remplissage de la base se fait agrave lrsquoaide de fichiers ldif Nous donnons ici un exemple de structure

Fichier pour la structure de base

dn dc=maildc=domainedc=tld

o intimailpw

description Global mail tree

dc mail

objectClass top

objectClass dcObject

objectClass organization

dn dc=peopledc=maildc=domainedc=tld

description Informations of all users

o people

dc people

objectClass top

objectClass dcObject

objectClass organization

dn dc=groupsdc=maildc=domainedc=tld

description All groups of users

o groups

dc groups

objectClass top

objectClass dcObject

objectClass organization

6

Fichier pour ajouter un utilisateur

dn cn=jbonddc=peopledc=maildc=domainedc=tld

uid jbond

mail jbonddomainetld

sn Moulin

givenName James

displayName James Bond

mailbox domainetldjbond

quota 50M

homeDirectory homevmail

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAccount

userPassword SSHA367PSXiUAegy8dpJbPU8OepEf8L5ye

Pour obtenir un hash du mot de passe

slappasswd -s password -h SSHA

On peut par la suite ajouter la configuration agrave la base de donneacutees avec la commande

ldapadd -D cn=admindc=domainedc=tld -W -h localhost -f pathtofile

Si les champs proposeacutes ne sont pas suffisants il faudra alors effectuer les modifications dans le fichier autldapschema

proposeacute plus haut et refaire la manipulation de configuration

De plus les standards du Mail deacutecrit par lrsquoIETF (RFC822 63 RFC1123 527 and RFC2821 451) impliquent drsquoavoir une

adresse Postmaster et une Abuse Pour cela nous pourrions creacuteer ces adresses avec la meacutethode vue au-dessus mais

ce nrsquoest pas la meilleure Il est preacutefeacuterable drsquoutiliser un alias comme nous le ferons avec les listes de diffusion Ici nous

proposons de rediriger ces deux adresses vers une adresse administrateur Pour cela la meacutethode est la mecircme sauf

que le fichier ldif nrsquoest pas tout agrave fait identique En voici un exemple

dn cn=postmasterdc=groupsdc=maildc=domainedc=tld

uid postmaster

mail postmasterdomainetld

sn Postmaster

displayName Postmaster

maildrop admindomainetld

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAlias

Pour faire une liste de diffusion la meacutethode est la mecircme Il suffit drsquoajouter toutes les adresses destinataires dans le

champ maildrop seacutepareacutees par des virgules ()

7

Installation de Postfix Installation des packages

apt-get install postfix postfix-ldap

Lors de lrsquoinstallation deux eacutecrans deacutefilent

- Configuration Internet Site

- Valeur par deacutefaut pour le mail name

On creacutee lrsquoutilisateur qui servira agrave exeacutecuter Postfix

groupadd vmail

useradd -g vmail -d homevmail -s binfalse -m vmail

Nous aurons besoin dans la suite des GID et UID creacuteeacutes agrave cet instant Ils peuvent ecirctre afficheacutes avec les commandes

cat etcgroup | grep vmail | cut -d -f3

cat etcpasswd | grep vmail | cut -d -f3

On ajoute les paramegravetres au fichier etcpostfixmaincf (remplacer les valeurs de GID et drsquoUID avec vos valeurs)

smtpd_banner = maildomainetld

virtual_mailbox_base = homevmail

virtual_mailbox_domains = dmainetld

virtual_mailbox_maps = ldapetcpostfixldap_accountscf

virtual_alias_maps = ldapetcpostfixldap_aliasescf

virtual_minimum_uid = 100

virtual_gid_maps = static1001 Remplacez ici par votre valeur de GID

virtual_uid_maps = static1001 Remplacez ici par votre valeur drsquoUID

Il nous faut maintenant constituer nos fichiers de configuration ldap_accountscf

cat gt etcpostfixldap_accountscf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=peopledc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAccount)(mail=s))

result_attribute = mailbox

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

Et pour ldap_aliasescf

cat gt ldap_aliasescf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=groupsdc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAlias)(mail=s))

result_attribute = maildrop

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

8

On peut maintenant veacuterifier la configuration de Postfix avec (cette commande ne doit rien retourner si crsquoest bon)

postfix check

Si crsquoest bon alors on recharge le serveur

postfix reload

On peut alors faire un envoi de mail test via telnet

telnet localhost 25

Si vous souhaitez deacutelivrer les mails agrave votre maniegravere il faut dans le fichier etcpostfixmaincf la ligne

virtual_transport = nomdevotreregle

Et de mecircme dans le fichier etcpostfixmastercf

nomdevotreregle unix - n n - 5 pipe

flags=Rq user=vmail null_sender=

argv=chemindevotreprogramme

Il nous reste maintenant agrave configurer les diffeacuterents enregistrements DNS neacutecessaire au fonctionnement drsquoun serveur

mail Vous pouvez utiliser la solution de votre choix Dans la suite vous trouverez une meacutethode utilisant Bind9

Installation de Bind9 Dans toute cette partie on se situera dans le dossier etcbind Dans la suite notre IP sera abcd

Dans le fichier namedconfoptions on ajoutera dans le champ options

version Not supported

Dans un dossier zones on eacutecrit le fichier dbdomainetld

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122111 Serial

43200 Refresh

3600 Retry

2419200 Expire

86400 ) Negative Cache TTL

IN NS nsdomainetld

IN NS ns11ovhnet

ns IN A abcd

www IN A abcd

IN A abcd

IN MX 10 maildomainetld

mail IN A abcd

Dans le mecircme dossier zones on a cbain-addrarpa

9

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122101 serial

14400 refresh

3600 retry

604800 expire

10800 minimum

)

cbain-addrarpa IN NS nsdomainetld

cbain-addrarpa IN NS ns11ovhnet

d IN PTR maildomainetld

Il faut faire attention agrave bien increacutementer le serial pour chaque modification des fichiers

Dans le fichier namedconflocal

zone domainetld

type master

file etcbindzonesdbdomainetld

allow-transfer 213251128130

notify yes

zone cbain-addrarpa IN

type master

file etcbindzonescbain-addrarpa

allow-transfer 213251128130

Ici 213251128130 est lrsquoadresse IP du serveur ns11ovhnet

Il faut bien sucircr configurer le DNS avec votre fournisseur (Gandi OVH hellip) Pour ccedila amusez-vous bien Vous pouvez

aussi tester votre configuration avec des outils en ligne tels que DNSstuff

En test final si votre configuration est bonne vous devriez pouvoir envoyer un mail depuis un service neutre (Gmail

yahoo hellip) et le voir dans votre arborescence (ici homevmaildomainetld)

Installation du paquet Debian et configuration de lighttpd

Commencez par reacutecupeacuterer le paquet deb agrave lrsquoadresse suivante httpswwwintimailpwintimaildeb

Installez ensuite GDebi Il srsquoagit drsquoun dpkg ameacutelioreacute pour teacuteleacutecharger les deacutependances automatiquement ce que

dpkg ne gegravere pas

apt-get update

apt-get install gdebi-core

10

Vous pouvez alors installer le paquet

gdebi intimaildeb

Vous aurez alors le site web drsquointiMail deacuteployeacute au chemin varwwwwebmail

Il ne vous reste plus qursquoagrave changer la configuration de lighttpd votre serveur web pour mettre en ligne le site

Vous pouvez pour cela copier-coller la configuration suivante mais veillez agrave bien changer lrsquoadresse IP preacutesente au

deacutebut de la partie SSL CONFIG avec votre adresse IP

serv ermodules = ( mod_access

mod_accesslog

mod_alias

mod_compress

mod_redirect

mod_rewrite

)

Hide server version

servertag = Such Headers Very try Now close telnet

serverdocument-root = varwwwwebmail

serverupload-dirs = ( varwwwwebmailuploads )

servererrorlog = varloglighttpderrorlog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

serverport = 80

accesslogformat = V h l u t r gts b Refereri

User-Agenti

accesslogfilename = varloglighttpdaccesslog

index-filenames = ( indexphp indexhtml

indexlighttpdhtml )

urlaccess-deny = ( ~ inc )

static-fileexclude-extensions = ( php pl fcgi )

compresscache-dir = varcachelighttpdcompress

compressfiletype = ( applicationjavascript textcss

texthtml textplain )

default listening port for IPv6 falls back to the IPv4 port

include_shell usrsharelighttpduse-ipv6pl + serverport

include_shell usrsharelighttpdcreate-mimeassignpl

include_shell usrsharelighttpdinclude-conf-enabledpl

SSL CONFIG

$SERVER[socket] == 5234485443

sslengine = enable

11

sslpemfile = etclighttpdsslintimailpwpem

sslca-file = etclighttpdsslintimailpwcrt

servername = intimailpw

votre configuration habituelle pour ce domaine

serverdocument-root = varwwwwebmail

servererrorlog = varloglighttpderror_ssllog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

Rewrite des URL pour masquer php

urlrewrite-once = ( ^()$ =gt $1 )

urlrewrite-if-not-file = ( ^([^])()$ =gt $1php$2 )

servernetwork-backend = writev

Deacutependances Slapd

Ldap-utils

Postfix

Postfix-ldap

Bind9

Lighttpd

12

Sources httpswikigandinetfrhostingusing-linuxtutorialsdebianmail-server-ldap

httpwwwpostfixorgpipe8html

httpwwwpostfixorgFILTER_READMEhtml

httpwwwpostfixorg

httpwwwpostfixorgtransport5html

Page 38: Système d'hébergement domestique...place sur les domaines .pw par Gandi.net, notre fournisseur. Nous n’avons donc pas pu l’implémenter. Nous avons configuré Postfix pour qu’il

5

sed ndashi 0dnauthldap sauthldapauthldapcn=schemacn=config

cn=authldapldif

On supprime ensuite les 7 derniegraveres lignes du fichier

head -n -7 cn=authldapldif gt tmpldif

mv tmpldif cn=authldapldif

On peut maintenant importer notre fichier de configuration Pour ce faire

ldapadd -Y EXTERNAL -H ldapi -f

tmpldapconfcn=configcn=schemacn=authldapldif

Si tout va bien lrsquoentreacutee devrait avoir eacuteteacute ajouteacutee On peut veacuterifier avec la commande vue tout agrave lrsquoheure

ldapsearch -Y EXTERNAL -H ldapi -b cn=schemacn=config -LLL

(objectClass=) cn

On devrait voir en plus le nouveau scheacutema authldap

Constitution de la base de donneacutees LDAP Le remplissage de la base se fait agrave lrsquoaide de fichiers ldif Nous donnons ici un exemple de structure

Fichier pour la structure de base

dn dc=maildc=domainedc=tld

o intimailpw

description Global mail tree

dc mail

objectClass top

objectClass dcObject

objectClass organization

dn dc=peopledc=maildc=domainedc=tld

description Informations of all users

o people

dc people

objectClass top

objectClass dcObject

objectClass organization

dn dc=groupsdc=maildc=domainedc=tld

description All groups of users

o groups

dc groups

objectClass top

objectClass dcObject

objectClass organization

6

Fichier pour ajouter un utilisateur

dn cn=jbonddc=peopledc=maildc=domainedc=tld

uid jbond

mail jbonddomainetld

sn Moulin

givenName James

displayName James Bond

mailbox domainetldjbond

quota 50M

homeDirectory homevmail

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAccount

userPassword SSHA367PSXiUAegy8dpJbPU8OepEf8L5ye

Pour obtenir un hash du mot de passe

slappasswd -s password -h SSHA

On peut par la suite ajouter la configuration agrave la base de donneacutees avec la commande

ldapadd -D cn=admindc=domainedc=tld -W -h localhost -f pathtofile

Si les champs proposeacutes ne sont pas suffisants il faudra alors effectuer les modifications dans le fichier autldapschema

proposeacute plus haut et refaire la manipulation de configuration

De plus les standards du Mail deacutecrit par lrsquoIETF (RFC822 63 RFC1123 527 and RFC2821 451) impliquent drsquoavoir une

adresse Postmaster et une Abuse Pour cela nous pourrions creacuteer ces adresses avec la meacutethode vue au-dessus mais

ce nrsquoest pas la meilleure Il est preacutefeacuterable drsquoutiliser un alias comme nous le ferons avec les listes de diffusion Ici nous

proposons de rediriger ces deux adresses vers une adresse administrateur Pour cela la meacutethode est la mecircme sauf

que le fichier ldif nrsquoest pas tout agrave fait identique En voici un exemple

dn cn=postmasterdc=groupsdc=maildc=domainedc=tld

uid postmaster

mail postmasterdomainetld

sn Postmaster

displayName Postmaster

maildrop admindomainetld

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAlias

Pour faire une liste de diffusion la meacutethode est la mecircme Il suffit drsquoajouter toutes les adresses destinataires dans le

champ maildrop seacutepareacutees par des virgules ()

7

Installation de Postfix Installation des packages

apt-get install postfix postfix-ldap

Lors de lrsquoinstallation deux eacutecrans deacutefilent

- Configuration Internet Site

- Valeur par deacutefaut pour le mail name

On creacutee lrsquoutilisateur qui servira agrave exeacutecuter Postfix

groupadd vmail

useradd -g vmail -d homevmail -s binfalse -m vmail

Nous aurons besoin dans la suite des GID et UID creacuteeacutes agrave cet instant Ils peuvent ecirctre afficheacutes avec les commandes

cat etcgroup | grep vmail | cut -d -f3

cat etcpasswd | grep vmail | cut -d -f3

On ajoute les paramegravetres au fichier etcpostfixmaincf (remplacer les valeurs de GID et drsquoUID avec vos valeurs)

smtpd_banner = maildomainetld

virtual_mailbox_base = homevmail

virtual_mailbox_domains = dmainetld

virtual_mailbox_maps = ldapetcpostfixldap_accountscf

virtual_alias_maps = ldapetcpostfixldap_aliasescf

virtual_minimum_uid = 100

virtual_gid_maps = static1001 Remplacez ici par votre valeur de GID

virtual_uid_maps = static1001 Remplacez ici par votre valeur drsquoUID

Il nous faut maintenant constituer nos fichiers de configuration ldap_accountscf

cat gt etcpostfixldap_accountscf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=peopledc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAccount)(mail=s))

result_attribute = mailbox

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

Et pour ldap_aliasescf

cat gt ldap_aliasescf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=groupsdc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAlias)(mail=s))

result_attribute = maildrop

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

8

On peut maintenant veacuterifier la configuration de Postfix avec (cette commande ne doit rien retourner si crsquoest bon)

postfix check

Si crsquoest bon alors on recharge le serveur

postfix reload

On peut alors faire un envoi de mail test via telnet

telnet localhost 25

Si vous souhaitez deacutelivrer les mails agrave votre maniegravere il faut dans le fichier etcpostfixmaincf la ligne

virtual_transport = nomdevotreregle

Et de mecircme dans le fichier etcpostfixmastercf

nomdevotreregle unix - n n - 5 pipe

flags=Rq user=vmail null_sender=

argv=chemindevotreprogramme

Il nous reste maintenant agrave configurer les diffeacuterents enregistrements DNS neacutecessaire au fonctionnement drsquoun serveur

mail Vous pouvez utiliser la solution de votre choix Dans la suite vous trouverez une meacutethode utilisant Bind9

Installation de Bind9 Dans toute cette partie on se situera dans le dossier etcbind Dans la suite notre IP sera abcd

Dans le fichier namedconfoptions on ajoutera dans le champ options

version Not supported

Dans un dossier zones on eacutecrit le fichier dbdomainetld

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122111 Serial

43200 Refresh

3600 Retry

2419200 Expire

86400 ) Negative Cache TTL

IN NS nsdomainetld

IN NS ns11ovhnet

ns IN A abcd

www IN A abcd

IN A abcd

IN MX 10 maildomainetld

mail IN A abcd

Dans le mecircme dossier zones on a cbain-addrarpa

9

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122101 serial

14400 refresh

3600 retry

604800 expire

10800 minimum

)

cbain-addrarpa IN NS nsdomainetld

cbain-addrarpa IN NS ns11ovhnet

d IN PTR maildomainetld

Il faut faire attention agrave bien increacutementer le serial pour chaque modification des fichiers

Dans le fichier namedconflocal

zone domainetld

type master

file etcbindzonesdbdomainetld

allow-transfer 213251128130

notify yes

zone cbain-addrarpa IN

type master

file etcbindzonescbain-addrarpa

allow-transfer 213251128130

Ici 213251128130 est lrsquoadresse IP du serveur ns11ovhnet

Il faut bien sucircr configurer le DNS avec votre fournisseur (Gandi OVH hellip) Pour ccedila amusez-vous bien Vous pouvez

aussi tester votre configuration avec des outils en ligne tels que DNSstuff

En test final si votre configuration est bonne vous devriez pouvoir envoyer un mail depuis un service neutre (Gmail

yahoo hellip) et le voir dans votre arborescence (ici homevmaildomainetld)

Installation du paquet Debian et configuration de lighttpd

Commencez par reacutecupeacuterer le paquet deb agrave lrsquoadresse suivante httpswwwintimailpwintimaildeb

Installez ensuite GDebi Il srsquoagit drsquoun dpkg ameacutelioreacute pour teacuteleacutecharger les deacutependances automatiquement ce que

dpkg ne gegravere pas

apt-get update

apt-get install gdebi-core

10

Vous pouvez alors installer le paquet

gdebi intimaildeb

Vous aurez alors le site web drsquointiMail deacuteployeacute au chemin varwwwwebmail

Il ne vous reste plus qursquoagrave changer la configuration de lighttpd votre serveur web pour mettre en ligne le site

Vous pouvez pour cela copier-coller la configuration suivante mais veillez agrave bien changer lrsquoadresse IP preacutesente au

deacutebut de la partie SSL CONFIG avec votre adresse IP

serv ermodules = ( mod_access

mod_accesslog

mod_alias

mod_compress

mod_redirect

mod_rewrite

)

Hide server version

servertag = Such Headers Very try Now close telnet

serverdocument-root = varwwwwebmail

serverupload-dirs = ( varwwwwebmailuploads )

servererrorlog = varloglighttpderrorlog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

serverport = 80

accesslogformat = V h l u t r gts b Refereri

User-Agenti

accesslogfilename = varloglighttpdaccesslog

index-filenames = ( indexphp indexhtml

indexlighttpdhtml )

urlaccess-deny = ( ~ inc )

static-fileexclude-extensions = ( php pl fcgi )

compresscache-dir = varcachelighttpdcompress

compressfiletype = ( applicationjavascript textcss

texthtml textplain )

default listening port for IPv6 falls back to the IPv4 port

include_shell usrsharelighttpduse-ipv6pl + serverport

include_shell usrsharelighttpdcreate-mimeassignpl

include_shell usrsharelighttpdinclude-conf-enabledpl

SSL CONFIG

$SERVER[socket] == 5234485443

sslengine = enable

11

sslpemfile = etclighttpdsslintimailpwpem

sslca-file = etclighttpdsslintimailpwcrt

servername = intimailpw

votre configuration habituelle pour ce domaine

serverdocument-root = varwwwwebmail

servererrorlog = varloglighttpderror_ssllog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

Rewrite des URL pour masquer php

urlrewrite-once = ( ^()$ =gt $1 )

urlrewrite-if-not-file = ( ^([^])()$ =gt $1php$2 )

servernetwork-backend = writev

Deacutependances Slapd

Ldap-utils

Postfix

Postfix-ldap

Bind9

Lighttpd

12

Sources httpswikigandinetfrhostingusing-linuxtutorialsdebianmail-server-ldap

httpwwwpostfixorgpipe8html

httpwwwpostfixorgFILTER_READMEhtml

httpwwwpostfixorg

httpwwwpostfixorgtransport5html

Page 39: Système d'hébergement domestique...place sur les domaines .pw par Gandi.net, notre fournisseur. Nous n’avons donc pas pu l’implémenter. Nous avons configuré Postfix pour qu’il

6

Fichier pour ajouter un utilisateur

dn cn=jbonddc=peopledc=maildc=domainedc=tld

uid jbond

mail jbonddomainetld

sn Moulin

givenName James

displayName James Bond

mailbox domainetldjbond

quota 50M

homeDirectory homevmail

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAccount

userPassword SSHA367PSXiUAegy8dpJbPU8OepEf8L5ye

Pour obtenir un hash du mot de passe

slappasswd -s password -h SSHA

On peut par la suite ajouter la configuration agrave la base de donneacutees avec la commande

ldapadd -D cn=admindc=domainedc=tld -W -h localhost -f pathtofile

Si les champs proposeacutes ne sont pas suffisants il faudra alors effectuer les modifications dans le fichier autldapschema

proposeacute plus haut et refaire la manipulation de configuration

De plus les standards du Mail deacutecrit par lrsquoIETF (RFC822 63 RFC1123 527 and RFC2821 451) impliquent drsquoavoir une

adresse Postmaster et une Abuse Pour cela nous pourrions creacuteer ces adresses avec la meacutethode vue au-dessus mais

ce nrsquoest pas la meilleure Il est preacutefeacuterable drsquoutiliser un alias comme nous le ferons avec les listes de diffusion Ici nous

proposons de rediriger ces deux adresses vers une adresse administrateur Pour cela la meacutethode est la mecircme sauf

que le fichier ldif nrsquoest pas tout agrave fait identique En voici un exemple

dn cn=postmasterdc=groupsdc=maildc=domainedc=tld

uid postmaster

mail postmasterdomainetld

sn Postmaster

displayName Postmaster

maildrop admindomainetld

objectClass top

objectClass inetOrgPerson

objectClass CourierMailAlias

Pour faire une liste de diffusion la meacutethode est la mecircme Il suffit drsquoajouter toutes les adresses destinataires dans le

champ maildrop seacutepareacutees par des virgules ()

7

Installation de Postfix Installation des packages

apt-get install postfix postfix-ldap

Lors de lrsquoinstallation deux eacutecrans deacutefilent

- Configuration Internet Site

- Valeur par deacutefaut pour le mail name

On creacutee lrsquoutilisateur qui servira agrave exeacutecuter Postfix

groupadd vmail

useradd -g vmail -d homevmail -s binfalse -m vmail

Nous aurons besoin dans la suite des GID et UID creacuteeacutes agrave cet instant Ils peuvent ecirctre afficheacutes avec les commandes

cat etcgroup | grep vmail | cut -d -f3

cat etcpasswd | grep vmail | cut -d -f3

On ajoute les paramegravetres au fichier etcpostfixmaincf (remplacer les valeurs de GID et drsquoUID avec vos valeurs)

smtpd_banner = maildomainetld

virtual_mailbox_base = homevmail

virtual_mailbox_domains = dmainetld

virtual_mailbox_maps = ldapetcpostfixldap_accountscf

virtual_alias_maps = ldapetcpostfixldap_aliasescf

virtual_minimum_uid = 100

virtual_gid_maps = static1001 Remplacez ici par votre valeur de GID

virtual_uid_maps = static1001 Remplacez ici par votre valeur drsquoUID

Il nous faut maintenant constituer nos fichiers de configuration ldap_accountscf

cat gt etcpostfixldap_accountscf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=peopledc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAccount)(mail=s))

result_attribute = mailbox

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

Et pour ldap_aliasescf

cat gt ldap_aliasescf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=groupsdc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAlias)(mail=s))

result_attribute = maildrop

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

8

On peut maintenant veacuterifier la configuration de Postfix avec (cette commande ne doit rien retourner si crsquoest bon)

postfix check

Si crsquoest bon alors on recharge le serveur

postfix reload

On peut alors faire un envoi de mail test via telnet

telnet localhost 25

Si vous souhaitez deacutelivrer les mails agrave votre maniegravere il faut dans le fichier etcpostfixmaincf la ligne

virtual_transport = nomdevotreregle

Et de mecircme dans le fichier etcpostfixmastercf

nomdevotreregle unix - n n - 5 pipe

flags=Rq user=vmail null_sender=

argv=chemindevotreprogramme

Il nous reste maintenant agrave configurer les diffeacuterents enregistrements DNS neacutecessaire au fonctionnement drsquoun serveur

mail Vous pouvez utiliser la solution de votre choix Dans la suite vous trouverez une meacutethode utilisant Bind9

Installation de Bind9 Dans toute cette partie on se situera dans le dossier etcbind Dans la suite notre IP sera abcd

Dans le fichier namedconfoptions on ajoutera dans le champ options

version Not supported

Dans un dossier zones on eacutecrit le fichier dbdomainetld

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122111 Serial

43200 Refresh

3600 Retry

2419200 Expire

86400 ) Negative Cache TTL

IN NS nsdomainetld

IN NS ns11ovhnet

ns IN A abcd

www IN A abcd

IN A abcd

IN MX 10 maildomainetld

mail IN A abcd

Dans le mecircme dossier zones on a cbain-addrarpa

9

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122101 serial

14400 refresh

3600 retry

604800 expire

10800 minimum

)

cbain-addrarpa IN NS nsdomainetld

cbain-addrarpa IN NS ns11ovhnet

d IN PTR maildomainetld

Il faut faire attention agrave bien increacutementer le serial pour chaque modification des fichiers

Dans le fichier namedconflocal

zone domainetld

type master

file etcbindzonesdbdomainetld

allow-transfer 213251128130

notify yes

zone cbain-addrarpa IN

type master

file etcbindzonescbain-addrarpa

allow-transfer 213251128130

Ici 213251128130 est lrsquoadresse IP du serveur ns11ovhnet

Il faut bien sucircr configurer le DNS avec votre fournisseur (Gandi OVH hellip) Pour ccedila amusez-vous bien Vous pouvez

aussi tester votre configuration avec des outils en ligne tels que DNSstuff

En test final si votre configuration est bonne vous devriez pouvoir envoyer un mail depuis un service neutre (Gmail

yahoo hellip) et le voir dans votre arborescence (ici homevmaildomainetld)

Installation du paquet Debian et configuration de lighttpd

Commencez par reacutecupeacuterer le paquet deb agrave lrsquoadresse suivante httpswwwintimailpwintimaildeb

Installez ensuite GDebi Il srsquoagit drsquoun dpkg ameacutelioreacute pour teacuteleacutecharger les deacutependances automatiquement ce que

dpkg ne gegravere pas

apt-get update

apt-get install gdebi-core

10

Vous pouvez alors installer le paquet

gdebi intimaildeb

Vous aurez alors le site web drsquointiMail deacuteployeacute au chemin varwwwwebmail

Il ne vous reste plus qursquoagrave changer la configuration de lighttpd votre serveur web pour mettre en ligne le site

Vous pouvez pour cela copier-coller la configuration suivante mais veillez agrave bien changer lrsquoadresse IP preacutesente au

deacutebut de la partie SSL CONFIG avec votre adresse IP

serv ermodules = ( mod_access

mod_accesslog

mod_alias

mod_compress

mod_redirect

mod_rewrite

)

Hide server version

servertag = Such Headers Very try Now close telnet

serverdocument-root = varwwwwebmail

serverupload-dirs = ( varwwwwebmailuploads )

servererrorlog = varloglighttpderrorlog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

serverport = 80

accesslogformat = V h l u t r gts b Refereri

User-Agenti

accesslogfilename = varloglighttpdaccesslog

index-filenames = ( indexphp indexhtml

indexlighttpdhtml )

urlaccess-deny = ( ~ inc )

static-fileexclude-extensions = ( php pl fcgi )

compresscache-dir = varcachelighttpdcompress

compressfiletype = ( applicationjavascript textcss

texthtml textplain )

default listening port for IPv6 falls back to the IPv4 port

include_shell usrsharelighttpduse-ipv6pl + serverport

include_shell usrsharelighttpdcreate-mimeassignpl

include_shell usrsharelighttpdinclude-conf-enabledpl

SSL CONFIG

$SERVER[socket] == 5234485443

sslengine = enable

11

sslpemfile = etclighttpdsslintimailpwpem

sslca-file = etclighttpdsslintimailpwcrt

servername = intimailpw

votre configuration habituelle pour ce domaine

serverdocument-root = varwwwwebmail

servererrorlog = varloglighttpderror_ssllog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

Rewrite des URL pour masquer php

urlrewrite-once = ( ^()$ =gt $1 )

urlrewrite-if-not-file = ( ^([^])()$ =gt $1php$2 )

servernetwork-backend = writev

Deacutependances Slapd

Ldap-utils

Postfix

Postfix-ldap

Bind9

Lighttpd

12

Sources httpswikigandinetfrhostingusing-linuxtutorialsdebianmail-server-ldap

httpwwwpostfixorgpipe8html

httpwwwpostfixorgFILTER_READMEhtml

httpwwwpostfixorg

httpwwwpostfixorgtransport5html

Page 40: Système d'hébergement domestique...place sur les domaines .pw par Gandi.net, notre fournisseur. Nous n’avons donc pas pu l’implémenter. Nous avons configuré Postfix pour qu’il

7

Installation de Postfix Installation des packages

apt-get install postfix postfix-ldap

Lors de lrsquoinstallation deux eacutecrans deacutefilent

- Configuration Internet Site

- Valeur par deacutefaut pour le mail name

On creacutee lrsquoutilisateur qui servira agrave exeacutecuter Postfix

groupadd vmail

useradd -g vmail -d homevmail -s binfalse -m vmail

Nous aurons besoin dans la suite des GID et UID creacuteeacutes agrave cet instant Ils peuvent ecirctre afficheacutes avec les commandes

cat etcgroup | grep vmail | cut -d -f3

cat etcpasswd | grep vmail | cut -d -f3

On ajoute les paramegravetres au fichier etcpostfixmaincf (remplacer les valeurs de GID et drsquoUID avec vos valeurs)

smtpd_banner = maildomainetld

virtual_mailbox_base = homevmail

virtual_mailbox_domains = dmainetld

virtual_mailbox_maps = ldapetcpostfixldap_accountscf

virtual_alias_maps = ldapetcpostfixldap_aliasescf

virtual_minimum_uid = 100

virtual_gid_maps = static1001 Remplacez ici par votre valeur de GID

virtual_uid_maps = static1001 Remplacez ici par votre valeur drsquoUID

Il nous faut maintenant constituer nos fichiers de configuration ldap_accountscf

cat gt etcpostfixldap_accountscf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=peopledc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAccount)(mail=s))

result_attribute = mailbox

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

Et pour ldap_aliasescf

cat gt ldap_aliasescf ltlt EOF

server_host = localhost

server_port = 389

search_base = dc=groupsdc=maildc=domainedc=tld

query_filter = (amp(objectClass=CourierMailAlias)(mail=s))

result_attribute = maildrop

bind = yes

bind_dn = cn=admindc=domainedc=tld

bind_pw = ltmdp_en_clairgt

version = 3

EOF

8

On peut maintenant veacuterifier la configuration de Postfix avec (cette commande ne doit rien retourner si crsquoest bon)

postfix check

Si crsquoest bon alors on recharge le serveur

postfix reload

On peut alors faire un envoi de mail test via telnet

telnet localhost 25

Si vous souhaitez deacutelivrer les mails agrave votre maniegravere il faut dans le fichier etcpostfixmaincf la ligne

virtual_transport = nomdevotreregle

Et de mecircme dans le fichier etcpostfixmastercf

nomdevotreregle unix - n n - 5 pipe

flags=Rq user=vmail null_sender=

argv=chemindevotreprogramme

Il nous reste maintenant agrave configurer les diffeacuterents enregistrements DNS neacutecessaire au fonctionnement drsquoun serveur

mail Vous pouvez utiliser la solution de votre choix Dans la suite vous trouverez une meacutethode utilisant Bind9

Installation de Bind9 Dans toute cette partie on se situera dans le dossier etcbind Dans la suite notre IP sera abcd

Dans le fichier namedconfoptions on ajoutera dans le champ options

version Not supported

Dans un dossier zones on eacutecrit le fichier dbdomainetld

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122111 Serial

43200 Refresh

3600 Retry

2419200 Expire

86400 ) Negative Cache TTL

IN NS nsdomainetld

IN NS ns11ovhnet

ns IN A abcd

www IN A abcd

IN A abcd

IN MX 10 maildomainetld

mail IN A abcd

Dans le mecircme dossier zones on a cbain-addrarpa

9

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122101 serial

14400 refresh

3600 retry

604800 expire

10800 minimum

)

cbain-addrarpa IN NS nsdomainetld

cbain-addrarpa IN NS ns11ovhnet

d IN PTR maildomainetld

Il faut faire attention agrave bien increacutementer le serial pour chaque modification des fichiers

Dans le fichier namedconflocal

zone domainetld

type master

file etcbindzonesdbdomainetld

allow-transfer 213251128130

notify yes

zone cbain-addrarpa IN

type master

file etcbindzonescbain-addrarpa

allow-transfer 213251128130

Ici 213251128130 est lrsquoadresse IP du serveur ns11ovhnet

Il faut bien sucircr configurer le DNS avec votre fournisseur (Gandi OVH hellip) Pour ccedila amusez-vous bien Vous pouvez

aussi tester votre configuration avec des outils en ligne tels que DNSstuff

En test final si votre configuration est bonne vous devriez pouvoir envoyer un mail depuis un service neutre (Gmail

yahoo hellip) et le voir dans votre arborescence (ici homevmaildomainetld)

Installation du paquet Debian et configuration de lighttpd

Commencez par reacutecupeacuterer le paquet deb agrave lrsquoadresse suivante httpswwwintimailpwintimaildeb

Installez ensuite GDebi Il srsquoagit drsquoun dpkg ameacutelioreacute pour teacuteleacutecharger les deacutependances automatiquement ce que

dpkg ne gegravere pas

apt-get update

apt-get install gdebi-core

10

Vous pouvez alors installer le paquet

gdebi intimaildeb

Vous aurez alors le site web drsquointiMail deacuteployeacute au chemin varwwwwebmail

Il ne vous reste plus qursquoagrave changer la configuration de lighttpd votre serveur web pour mettre en ligne le site

Vous pouvez pour cela copier-coller la configuration suivante mais veillez agrave bien changer lrsquoadresse IP preacutesente au

deacutebut de la partie SSL CONFIG avec votre adresse IP

serv ermodules = ( mod_access

mod_accesslog

mod_alias

mod_compress

mod_redirect

mod_rewrite

)

Hide server version

servertag = Such Headers Very try Now close telnet

serverdocument-root = varwwwwebmail

serverupload-dirs = ( varwwwwebmailuploads )

servererrorlog = varloglighttpderrorlog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

serverport = 80

accesslogformat = V h l u t r gts b Refereri

User-Agenti

accesslogfilename = varloglighttpdaccesslog

index-filenames = ( indexphp indexhtml

indexlighttpdhtml )

urlaccess-deny = ( ~ inc )

static-fileexclude-extensions = ( php pl fcgi )

compresscache-dir = varcachelighttpdcompress

compressfiletype = ( applicationjavascript textcss

texthtml textplain )

default listening port for IPv6 falls back to the IPv4 port

include_shell usrsharelighttpduse-ipv6pl + serverport

include_shell usrsharelighttpdcreate-mimeassignpl

include_shell usrsharelighttpdinclude-conf-enabledpl

SSL CONFIG

$SERVER[socket] == 5234485443

sslengine = enable

11

sslpemfile = etclighttpdsslintimailpwpem

sslca-file = etclighttpdsslintimailpwcrt

servername = intimailpw

votre configuration habituelle pour ce domaine

serverdocument-root = varwwwwebmail

servererrorlog = varloglighttpderror_ssllog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

Rewrite des URL pour masquer php

urlrewrite-once = ( ^()$ =gt $1 )

urlrewrite-if-not-file = ( ^([^])()$ =gt $1php$2 )

servernetwork-backend = writev

Deacutependances Slapd

Ldap-utils

Postfix

Postfix-ldap

Bind9

Lighttpd

12

Sources httpswikigandinetfrhostingusing-linuxtutorialsdebianmail-server-ldap

httpwwwpostfixorgpipe8html

httpwwwpostfixorgFILTER_READMEhtml

httpwwwpostfixorg

httpwwwpostfixorgtransport5html

Page 41: Système d'hébergement domestique...place sur les domaines .pw par Gandi.net, notre fournisseur. Nous n’avons donc pas pu l’implémenter. Nous avons configuré Postfix pour qu’il

8

On peut maintenant veacuterifier la configuration de Postfix avec (cette commande ne doit rien retourner si crsquoest bon)

postfix check

Si crsquoest bon alors on recharge le serveur

postfix reload

On peut alors faire un envoi de mail test via telnet

telnet localhost 25

Si vous souhaitez deacutelivrer les mails agrave votre maniegravere il faut dans le fichier etcpostfixmaincf la ligne

virtual_transport = nomdevotreregle

Et de mecircme dans le fichier etcpostfixmastercf

nomdevotreregle unix - n n - 5 pipe

flags=Rq user=vmail null_sender=

argv=chemindevotreprogramme

Il nous reste maintenant agrave configurer les diffeacuterents enregistrements DNS neacutecessaire au fonctionnement drsquoun serveur

mail Vous pouvez utiliser la solution de votre choix Dans la suite vous trouverez une meacutethode utilisant Bind9

Installation de Bind9 Dans toute cette partie on se situera dans le dossier etcbind Dans la suite notre IP sera abcd

Dans le fichier namedconfoptions on ajoutera dans le champ options

version Not supported

Dans un dossier zones on eacutecrit le fichier dbdomainetld

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122111 Serial

43200 Refresh

3600 Retry

2419200 Expire

86400 ) Negative Cache TTL

IN NS nsdomainetld

IN NS ns11ovhnet

ns IN A abcd

www IN A abcd

IN A abcd

IN MX 10 maildomainetld

mail IN A abcd

Dans le mecircme dossier zones on a cbain-addrarpa

9

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122101 serial

14400 refresh

3600 retry

604800 expire

10800 minimum

)

cbain-addrarpa IN NS nsdomainetld

cbain-addrarpa IN NS ns11ovhnet

d IN PTR maildomainetld

Il faut faire attention agrave bien increacutementer le serial pour chaque modification des fichiers

Dans le fichier namedconflocal

zone domainetld

type master

file etcbindzonesdbdomainetld

allow-transfer 213251128130

notify yes

zone cbain-addrarpa IN

type master

file etcbindzonescbain-addrarpa

allow-transfer 213251128130

Ici 213251128130 est lrsquoadresse IP du serveur ns11ovhnet

Il faut bien sucircr configurer le DNS avec votre fournisseur (Gandi OVH hellip) Pour ccedila amusez-vous bien Vous pouvez

aussi tester votre configuration avec des outils en ligne tels que DNSstuff

En test final si votre configuration est bonne vous devriez pouvoir envoyer un mail depuis un service neutre (Gmail

yahoo hellip) et le voir dans votre arborescence (ici homevmaildomainetld)

Installation du paquet Debian et configuration de lighttpd

Commencez par reacutecupeacuterer le paquet deb agrave lrsquoadresse suivante httpswwwintimailpwintimaildeb

Installez ensuite GDebi Il srsquoagit drsquoun dpkg ameacutelioreacute pour teacuteleacutecharger les deacutependances automatiquement ce que

dpkg ne gegravere pas

apt-get update

apt-get install gdebi-core

10

Vous pouvez alors installer le paquet

gdebi intimaildeb

Vous aurez alors le site web drsquointiMail deacuteployeacute au chemin varwwwwebmail

Il ne vous reste plus qursquoagrave changer la configuration de lighttpd votre serveur web pour mettre en ligne le site

Vous pouvez pour cela copier-coller la configuration suivante mais veillez agrave bien changer lrsquoadresse IP preacutesente au

deacutebut de la partie SSL CONFIG avec votre adresse IP

serv ermodules = ( mod_access

mod_accesslog

mod_alias

mod_compress

mod_redirect

mod_rewrite

)

Hide server version

servertag = Such Headers Very try Now close telnet

serverdocument-root = varwwwwebmail

serverupload-dirs = ( varwwwwebmailuploads )

servererrorlog = varloglighttpderrorlog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

serverport = 80

accesslogformat = V h l u t r gts b Refereri

User-Agenti

accesslogfilename = varloglighttpdaccesslog

index-filenames = ( indexphp indexhtml

indexlighttpdhtml )

urlaccess-deny = ( ~ inc )

static-fileexclude-extensions = ( php pl fcgi )

compresscache-dir = varcachelighttpdcompress

compressfiletype = ( applicationjavascript textcss

texthtml textplain )

default listening port for IPv6 falls back to the IPv4 port

include_shell usrsharelighttpduse-ipv6pl + serverport

include_shell usrsharelighttpdcreate-mimeassignpl

include_shell usrsharelighttpdinclude-conf-enabledpl

SSL CONFIG

$SERVER[socket] == 5234485443

sslengine = enable

11

sslpemfile = etclighttpdsslintimailpwpem

sslca-file = etclighttpdsslintimailpwcrt

servername = intimailpw

votre configuration habituelle pour ce domaine

serverdocument-root = varwwwwebmail

servererrorlog = varloglighttpderror_ssllog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

Rewrite des URL pour masquer php

urlrewrite-once = ( ^()$ =gt $1 )

urlrewrite-if-not-file = ( ^([^])()$ =gt $1php$2 )

servernetwork-backend = writev

Deacutependances Slapd

Ldap-utils

Postfix

Postfix-ldap

Bind9

Lighttpd

12

Sources httpswikigandinetfrhostingusing-linuxtutorialsdebianmail-server-ldap

httpwwwpostfixorgpipe8html

httpwwwpostfixorgFILTER_READMEhtml

httpwwwpostfixorg

httpwwwpostfixorgtransport5html

Page 42: Système d'hébergement domestique...place sur les domaines .pw par Gandi.net, notre fournisseur. Nous n’avons donc pas pu l’implémenter. Nous avons configuré Postfix pour qu’il

9

$TTL 604800

IN SOA nsdomainetld rootdomainetld (

2015122101 serial

14400 refresh

3600 retry

604800 expire

10800 minimum

)

cbain-addrarpa IN NS nsdomainetld

cbain-addrarpa IN NS ns11ovhnet

d IN PTR maildomainetld

Il faut faire attention agrave bien increacutementer le serial pour chaque modification des fichiers

Dans le fichier namedconflocal

zone domainetld

type master

file etcbindzonesdbdomainetld

allow-transfer 213251128130

notify yes

zone cbain-addrarpa IN

type master

file etcbindzonescbain-addrarpa

allow-transfer 213251128130

Ici 213251128130 est lrsquoadresse IP du serveur ns11ovhnet

Il faut bien sucircr configurer le DNS avec votre fournisseur (Gandi OVH hellip) Pour ccedila amusez-vous bien Vous pouvez

aussi tester votre configuration avec des outils en ligne tels que DNSstuff

En test final si votre configuration est bonne vous devriez pouvoir envoyer un mail depuis un service neutre (Gmail

yahoo hellip) et le voir dans votre arborescence (ici homevmaildomainetld)

Installation du paquet Debian et configuration de lighttpd

Commencez par reacutecupeacuterer le paquet deb agrave lrsquoadresse suivante httpswwwintimailpwintimaildeb

Installez ensuite GDebi Il srsquoagit drsquoun dpkg ameacutelioreacute pour teacuteleacutecharger les deacutependances automatiquement ce que

dpkg ne gegravere pas

apt-get update

apt-get install gdebi-core

10

Vous pouvez alors installer le paquet

gdebi intimaildeb

Vous aurez alors le site web drsquointiMail deacuteployeacute au chemin varwwwwebmail

Il ne vous reste plus qursquoagrave changer la configuration de lighttpd votre serveur web pour mettre en ligne le site

Vous pouvez pour cela copier-coller la configuration suivante mais veillez agrave bien changer lrsquoadresse IP preacutesente au

deacutebut de la partie SSL CONFIG avec votre adresse IP

serv ermodules = ( mod_access

mod_accesslog

mod_alias

mod_compress

mod_redirect

mod_rewrite

)

Hide server version

servertag = Such Headers Very try Now close telnet

serverdocument-root = varwwwwebmail

serverupload-dirs = ( varwwwwebmailuploads )

servererrorlog = varloglighttpderrorlog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

serverport = 80

accesslogformat = V h l u t r gts b Refereri

User-Agenti

accesslogfilename = varloglighttpdaccesslog

index-filenames = ( indexphp indexhtml

indexlighttpdhtml )

urlaccess-deny = ( ~ inc )

static-fileexclude-extensions = ( php pl fcgi )

compresscache-dir = varcachelighttpdcompress

compressfiletype = ( applicationjavascript textcss

texthtml textplain )

default listening port for IPv6 falls back to the IPv4 port

include_shell usrsharelighttpduse-ipv6pl + serverport

include_shell usrsharelighttpdcreate-mimeassignpl

include_shell usrsharelighttpdinclude-conf-enabledpl

SSL CONFIG

$SERVER[socket] == 5234485443

sslengine = enable

11

sslpemfile = etclighttpdsslintimailpwpem

sslca-file = etclighttpdsslintimailpwcrt

servername = intimailpw

votre configuration habituelle pour ce domaine

serverdocument-root = varwwwwebmail

servererrorlog = varloglighttpderror_ssllog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

Rewrite des URL pour masquer php

urlrewrite-once = ( ^()$ =gt $1 )

urlrewrite-if-not-file = ( ^([^])()$ =gt $1php$2 )

servernetwork-backend = writev

Deacutependances Slapd

Ldap-utils

Postfix

Postfix-ldap

Bind9

Lighttpd

12

Sources httpswikigandinetfrhostingusing-linuxtutorialsdebianmail-server-ldap

httpwwwpostfixorgpipe8html

httpwwwpostfixorgFILTER_READMEhtml

httpwwwpostfixorg

httpwwwpostfixorgtransport5html

Page 43: Système d'hébergement domestique...place sur les domaines .pw par Gandi.net, notre fournisseur. Nous n’avons donc pas pu l’implémenter. Nous avons configuré Postfix pour qu’il

10

Vous pouvez alors installer le paquet

gdebi intimaildeb

Vous aurez alors le site web drsquointiMail deacuteployeacute au chemin varwwwwebmail

Il ne vous reste plus qursquoagrave changer la configuration de lighttpd votre serveur web pour mettre en ligne le site

Vous pouvez pour cela copier-coller la configuration suivante mais veillez agrave bien changer lrsquoadresse IP preacutesente au

deacutebut de la partie SSL CONFIG avec votre adresse IP

serv ermodules = ( mod_access

mod_accesslog

mod_alias

mod_compress

mod_redirect

mod_rewrite

)

Hide server version

servertag = Such Headers Very try Now close telnet

serverdocument-root = varwwwwebmail

serverupload-dirs = ( varwwwwebmailuploads )

servererrorlog = varloglighttpderrorlog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

serverport = 80

accesslogformat = V h l u t r gts b Refereri

User-Agenti

accesslogfilename = varloglighttpdaccesslog

index-filenames = ( indexphp indexhtml

indexlighttpdhtml )

urlaccess-deny = ( ~ inc )

static-fileexclude-extensions = ( php pl fcgi )

compresscache-dir = varcachelighttpdcompress

compressfiletype = ( applicationjavascript textcss

texthtml textplain )

default listening port for IPv6 falls back to the IPv4 port

include_shell usrsharelighttpduse-ipv6pl + serverport

include_shell usrsharelighttpdcreate-mimeassignpl

include_shell usrsharelighttpdinclude-conf-enabledpl

SSL CONFIG

$SERVER[socket] == 5234485443

sslengine = enable

11

sslpemfile = etclighttpdsslintimailpwpem

sslca-file = etclighttpdsslintimailpwcrt

servername = intimailpw

votre configuration habituelle pour ce domaine

serverdocument-root = varwwwwebmail

servererrorlog = varloglighttpderror_ssllog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

Rewrite des URL pour masquer php

urlrewrite-once = ( ^()$ =gt $1 )

urlrewrite-if-not-file = ( ^([^])()$ =gt $1php$2 )

servernetwork-backend = writev

Deacutependances Slapd

Ldap-utils

Postfix

Postfix-ldap

Bind9

Lighttpd

12

Sources httpswikigandinetfrhostingusing-linuxtutorialsdebianmail-server-ldap

httpwwwpostfixorgpipe8html

httpwwwpostfixorgFILTER_READMEhtml

httpwwwpostfixorg

httpwwwpostfixorgtransport5html

Page 44: Système d'hébergement domestique...place sur les domaines .pw par Gandi.net, notre fournisseur. Nous n’avons donc pas pu l’implémenter. Nous avons configuré Postfix pour qu’il

11

sslpemfile = etclighttpdsslintimailpwpem

sslca-file = etclighttpdsslintimailpwcrt

servername = intimailpw

votre configuration habituelle pour ce domaine

serverdocument-root = varwwwwebmail

servererrorlog = varloglighttpderror_ssllog

serverpid-file = varrunlighttpdpid

serverusername = www-data

servergroupname = www-data

Rewrite des URL pour masquer php

urlrewrite-once = ( ^()$ =gt $1 )

urlrewrite-if-not-file = ( ^([^])()$ =gt $1php$2 )

servernetwork-backend = writev

Deacutependances Slapd

Ldap-utils

Postfix

Postfix-ldap

Bind9

Lighttpd

12

Sources httpswikigandinetfrhostingusing-linuxtutorialsdebianmail-server-ldap

httpwwwpostfixorgpipe8html

httpwwwpostfixorgFILTER_READMEhtml

httpwwwpostfixorg

httpwwwpostfixorgtransport5html

Page 45: Système d'hébergement domestique...place sur les domaines .pw par Gandi.net, notre fournisseur. Nous n’avons donc pas pu l’implémenter. Nous avons configuré Postfix pour qu’il

12

Sources httpswikigandinetfrhostingusing-linuxtutorialsdebianmail-server-ldap

httpwwwpostfixorgpipe8html

httpwwwpostfixorgFILTER_READMEhtml

httpwwwpostfixorg

httpwwwpostfixorgtransport5html