système d'hébergement domestique...place sur les domaines .pw par gandi.net, notre...
TRANSCRIPT
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
12
Sources httpswikigandinetfrhostingusing-linuxtutorialsdebianmail-server-ldap
httpwwwpostfixorgpipe8html
httpwwwpostfixorgFILTER_READMEhtml
httpwwwpostfixorg
httpwwwpostfixorgtransport5html