projet m1
Transcription
projet m1
Année 2005-2006 PROJET M1 Service d’hébergement Web mutualisé Réalisé par : BERTHELEMY Mathieu GUILLOT Fabien QUIGNON Alexandre Encadrant : Abdenour MOKRANE Sommaire 1 INTRODUCTION................................................................................................................................................... 4 2 CONCEPTION........................................................................................................................................................ 5 2.1 ARCHITECTURE GENERALE DE L'APPLICATION ................................................................................................. 5 2.1.1 Description du projet .................................................................................................................................. 5 2.1.2 Diagramme de cas d'utilisation .................................................................................................................. 6 2.1.3 Contraintes pour le choix d'une architecture.............................................................................................. 6 2.1.4 Architecture choisie .................................................................................................................................... 8 2.1.4.1 Architecture physique........................................................................................................................................ 8 2.1.4.2 Architecture logicielle ....................................................................................................................................... 9 2.2 STRUCTURE DES DONNEES................................................................................................................................ 9 2.2.1 Explication et description des données....................................................................................................... 9 2.2.2 Mettre la base de données sous une forme normale ................................................................................. 10 2.3 ORGANISATION DES TESTS.............................................................................................................................. 11 2.3.1 Les tests manuels ...................................................................................................................................... 11 2.3.2 Les tests automatisés................................................................................................................................. 11 2.4 LE PORTAIL WEB............................................................................................................................................. 12 2.4.1 2.4.1.1 Le module php-Mysql...................................................................................................................................... 12 2.4.1.2 Organisation d’une page web .......................................................................................................................... 12 2.4.1.3 Configuration de Apache ................................................................................................................................. 12 2.4.2 Description de l'architecture du module Web........................................................................................... 13 2.4.2.1 Le diagramme de paquetages........................................................................................................................... 13 2.4.2.2 Description des paquetages.............................................................................................................................. 13 2.5 LA BASE DE DONNEES ET SES REQUETES ......................................................................................................... 15 2.5.1 Enregistrement des informations .............................................................................................................. 15 2.5.2 Sélection et altération d’informations....................................................................................................... 16 2.5.2.1 La requête de sélection .................................................................................................................................... 16 2.5.2.2 La requête de modification .............................................................................................................................. 16 2.6 3 Choix d'implantation................................................................................................................................. 12 AUTHENTIFICATION........................................................................................................................................ 16 2.6.1 Confidentialité des données ...................................................................................................................... 16 2.6.2 Authentification des utilisateurs................................................................................................................ 17 2.6.3 Contrôle des droits.................................................................................................................................... 17 MISE EN PLACE DES SERVICES ET DE LA MACHINE ............................................................................ 18 3.1 PREAMBULE ................................................................................................................................................... 18 3.2 INSTALLATION DU SERVEUR ........................................................................................................................... 18 3.2.1 Serveur Web – Apache .............................................................................................................................. 19 3.2.2 Base de données et son outil d’administration ......................................................................................... 20 2/44 3.2.3 Serveur FTP.............................................................................................................................................. 21 3.2.4 Serveurs de messagerie............................................................................................................................. 22 3.2.4.1 Schéma général................................................................................................................................................ 22 3.2.4.2 Serveur SMTP ................................................................................................................................................. 23 3.2.4.3 Serveur POP3 / IMAP ..................................................................................................................................... 24 3.2.4.4 Anti-Spam........................................................................................................................................................ 24 3.2.4.5 Anti-virus......................................................................................................................................................... 24 3.2.4.6 Amavis............................................................................................................................................................. 24 3.2.4.7 Webmail .......................................................................................................................................................... 24 3.2.4.8 Recettes unitaires............................................................................................................................................. 25 3.2.5 Statistiques Web par sous-domaine via Awstats ....................................................................................... 25 3.2.6 Organisation des pages et gestion des mots de passes ............................................................................. 26 3.2.7 Automatisation des tâches d’administration ............................................................................................. 26 3.2.8 Sécurité du système ................................................................................................................................... 27 3.2.8.1 Préambule ........................................................................................................................................................ 27 3.2.8.2 SuPHP ............................................................................................................................................................. 27 3.2.8.3 Sudo................................................................................................................................................................. 27 3.2.8.4 Disponibilité des données des utilisateurs........................................................................................................ 28 4 CONCLUSION...................................................................................................................................................... 29 5 ANNEXES.............................................................................................................................................................. 30 6 SITOGRAPHIE............................................................................................... ERREUR ! SIGNET NON DEFINI. 7 BIBLIOGRAPHIE .......................................................................................... ERREUR ! SIGNET NON DEFINI. 3/44 1 Introduction Le but de ce projet est la conception d’un service d’hébergement web mutualisé gratuit pour particuliers et professionnels. Ce projet n’a été conçu qu’à partir d’outils du monde des logiciels libres. Nous avons choisi ce sujet pour plusieurs raisons : C’est un sujet concret et au goût du jour (l’Internet est en pleine expansion) Il pourra être mis en production à la fin du projet Il reprend des concepts et des connaissances acquises durant l’année L’acheminement d’un projet dans son intégralité Il nous a permit de développer de nouvelles compétences et connaissances De plus en plus d’Internautes possèdent leurs propres pages personnelles, pas seulement à travers les blogs dont les fonctionnalités restent encore limitées mais surtout à travers des sites personnels. Ces sites peuvent intégrer de nombreuses possibilités (forum, portail php…) si l’hébergeur possède et offre à ces usagers le support de langage PHP, une base de donnée… Toutes ces fonctionnalités sont donc à intégrer à notre projet pour pouvoir offrir l’ensemble de ces services à nos usagers. Ainsi que des comptes e-mails, un sous-domaine personnalisé, des statistiques personnelles. 4/44 2 Conception 2.1 Architecture générale de l'application Le but de cette partie est de décrire l'architecture générale du projet « Service d’hébergement mutualisé » et de préciser les matériels et logiciels requis pour sa mise en place. 2.1.1 Description du projet Ce projet consiste à concevoir un service d'hébergement mutualisé pour particuliers ou bien pour des professionnels. Ce projet consiste à héberger plusieurs sites Internet sur un seul et même serveur et ainsi partager les ressources de celui-ci entre différents utilisateurs. Ce type de formule est donc proposé aux personnes pour qu'elles puissent obtenir une configuration donnée ce qui correspond à une offre logicielle comprenant : un serveur web, un sous-domaine, un accès à sa base de données, des comptes de messagerie, un accès ftp avec un espace de stockage bien défini en fonction de l’offre choisie ainsi que des statistiques Web par sous-domaine. La personne pourra à tout moment changer d'offre logicielle afin que ses besoins restent en accord avec ses attentes. Ce projet inclus donc la création d'un portail web muni d’une base de données, une description des offres, une charte, l'inscription en ligne et l'administration de son compte (voire la possibilité d’incorporer un système de payement par Internet pour les offres payantes). 5/44 2.1.2 Diagramme de cas d'utilisation 2.1.3 Contraintes pour le choix d'une architecture Le choix d'une architecture pour ce projet est conditionné par un certain nombre de critères et de contraintes qui doivent être respectés. 6/44 Les contraintes initiales de l'hébergeur de sites web mutualisé sont : • Type d'application Application web sur réseau local, à terme, puis sur internet. • Stockage des documents Après avoir étudié différentes possibilités, l'étude nous a révélés que la meilleure solution pour stocker les différentes données était une base MySQL avec un module php. En effet Mysql a pour avantages d'être libre, gratuite, performante et dont le développement est très actif. • Testabilité Afin de garantir la conformité et de simplifier la maintenance de ce projet, son architecture doit permettre de mettre en place des procédures de tests automatisées afin de pouvoir facilement et rapidement vérifier des propriétés de correction des algorithmes de non-régression des fonctionnalités, etc. • Évolutivité L'hébergeur de sites web mutualisé doit pouvoir être facilement adaptable aux évolutions des données et des logiciels avec lesquels il devra interagir (base de données, serveur ftp...). Il doit aussi être adaptable afin de supporter un accroissement de la charge en terme de requêtes (ouverture sur internet). • Configurabilité Ce projet doit pouvoir être facilement configurable (modifications mineures du fonctionnement) pour s'adapter à son contexte et à son évolution (notamment l'intégration dans un site web). • Coût Pour sa mise en oeuvre, le projet ne doit pas nécessiter de matériels ou de logiciels trop coûteux. 7/44 2.1.4 2.1.4.1 Architecture choisie Architecture physique L'architecture physique idéale serait de dédier une machine pour chaque service, de manière à répartir au maximum les charges et de gagner en performance globale. Le schéma serait : Cependant, nous n’avons pas le matériel nécessaire pour mettre un tel système en place nous n’avons pas d’autre choix que de placer l’ensemble des services sur une seule machine. Nous ne pouvons pas mettre en place un serveur de backup mais nous assurerons tout de même la sauvegarde des données des utilisateurs par un autre biais, car c’est une fonction indispensable pour un serveur Web de garantir l’intégrité de ces données. Client Le client est un navigateur web récent. Il doit disposer d'une connexion réseau s'il est en réseau local ou d'une connexion Internet (le plus souvent utilisée) si nécessaire. Base de données La base de données utilisée est une base de données MySQL gérée avec PhpMyAdmin. Elle peut tourner sur une machine dédiée ou sur un serveur d'applications. Dans notre cas, sur la même machine. 8/44 Serveur d'applications Le serveur d'applications doit être accessible depuis Internet (Transfert de ports sur le routeur vers notre (nos) machine(s)). Un serveur Apache (ou autre serveur http) doit être installé sur ce serveur ainsi que l'application développée. Un serveur FTP doit également être installé ainsi qu'un serveur mail (POP, IMAP et SMTP) afin que chaque utilisateur puisse consulter ses e-mails. 2.1.4.2 Architecture logicielle L'application est composée : D’un ensemble de pages web (formulaires) qui en sont les points d'entrées. D'un ensemble de scripts qui permettent d’automatiser les tâches telles que la création, la suppression, la modification de comptes locaux à la machine (pour accès FTP) ; ou encore la mise à jour des statistiques web, la sauvegarde et l’archivage des données des utilisateurs et enfin l’automatisation de tâches comme le redémarrage de services… 2.2 Structure des données Le but de ce document est de décrire la structure des informations telles qu'elles seront stockées dans la base de données, et telles qu'elles seront retournées par les requêtes de la base de données. 2.2.1 Explication et description des données Tout d'abord, il faudra séparer la base de données afin que seul un utilisateur puisse accéder à sa propre base. Le principe est de pouvoir établir un nombre de tables suffisamment explicite afin de stocker les éléments essentiels. L’identifiant d'un compte est unique et sera donc considéré comme clé primaire pour chaque table. Les tables qui ne seront utiles d'établir de cette façon : • Une table « inscription » comprenant le login (clé primaire), prénom, nom, adresse, société, code postal, ville, e-mail, offre, nom du domaine, message. • Une table « authentification » comprenant le login et le mot de passe (password) permettant ainsi de renforcer un peu la sécurité. • Et les tables « users, domains, forwarding » dans une base db_postfix permettant de gérer ses comptes mails. 9/44 Quelques contraintes sur les attributs : Le mot de passe devra être crypté en md5 et devra être confirmé lors de la saisie du formulaire et non vide (voir imposer 6 caractères au minimum). Le login devra être non vide et unique. Mot de passe sur machine UNIX (accès FTP) en cryptage DES. Nom du sous-domaine unique. 2.2.2 Mettre la base de données sous une forme normale Voici les tables décrites précédemment dans une forme décomposée : Base de donnée : « projet » : Pour la table « inscription » Login → login, prénom, nom, adresse,société,postal, ville, email,nom_domaine,message Pour la table « authentification » Login → login, password Base de donnée « db_postfix » : Pour la table « users » Login → email, mot de passe Pour la table « forwardings » email_source → email_destination Pour la table « domains » nom_domain Ainsi on prouve que : login → login, password, nom, adresse,société,postal, ville, email, nom_domaine, message, email1, motDePasse1, email2, motDePasse2, mail3, motDePasse3 mail4, motDePasse4, mail5, motDePasse5 ► Donc la base de données que nous allons établir respect la 3ème forme normale. 10/44 2.3 Organisation des tests Le but de cette partie est de décrire les mécanismes qui permettront de faire des tests de non régression suite aux modifications faites durant la phase de développement, et de valider l'application à la fin de la phase de développement. Notre ambition est d'automatiser au maximum les tests qui permettront de valider l'application. Cette technique sera utile tant durant la phase de développement que durant la phase de recettes. 2.3.1 Les tests manuels Les tests manuels seront surtout pour la vérification finale notamment pour les pages web contenant des interactions avec la base de données : Inscription à une offre (conformité de l’inscription → tous les champs sont renseignés). Gestion de son compte. Ajout et suppression de pages web au serveur. Création ou suppression de comptes mails. Possibilité de faire du transfert de mail vers une autre adresse. La gestion de son profil. La gestion de sa base de données (et la sienne uniquement). 2.3.2 Les tests automatisés Les tests automatiques s'effectueront à l'aide de nos scripts shell (en BASH). En effet, ceux-ci permettent lors de la création d’un nouvel utilisateur sur le système de contrôler certains éléments (utilisateur déjà existant, répertoire personnel déjà existant, « virtual-host » déjà existant…). De cette manière, on vérifie certaines contraintes avant chaque création, suppression ou modification d’utilisateur. Tous les résultats de ces tests sont enregistrés dans un fichier log. Celui-ci nous permet de garder des traces des opérations effectuées sur la machine mais également de repérer les éventuelles erreurs et de les corriger. 11/44 2.4 Le portail web Le but de cette partie est de décrire les mécanismes liés au site web et aux choix qui ont été faits. 2.4.1 2.4.1.1 Choix d'implantation Le module php-Mysql PHP est un langage de programmation interprété. Correctement interfacé avec Apache il permet au serveur de fournir des pages dynamiques gérées en fonction des demandes du client. En clair, la page n'est plus un document statique mais peut évoluer, afficher des informations différentes selon les souhaits de l'utilisateur. Pour des raisons de compatibilité, sur notre serveur, les pages pourront soit être interprétées par PHP4 ou par PHP5 selon la volonté de l’utilisateur. MySQL est un gestionnaire de bases de données assez puissant et rapide. Il peut très bien fonctionner en utilisant son propre client en mode texte sans l'utilisation d'une quelconque interface graphique. Le langage SQL est utilisé par MySQL (proche de la norme ANSI) et utilise des lignes de commande pour adresser des requêtes au serveur. 2.4.1.2 Organisation d’une page web Les pages PHP sont organisées généralement en deux parties, une partie proprement PHP ou s’effectueront les traitements dynamiques de la page (en fonction de nos attentes) et une partie HTML, contenant la structure de la page (tout ce qui est visible par l’utilisateur). C’est dans la partie PHP que s’effectue l’ensemble des requêtes avec la base de données (consultation, ajout, modification ou bien surpression de données). 2.4.1.3 Configuration de Apache La configuration peut être prise en charge par le système de gestion de paquetages. Sinon, il faut récupérer les sources du serveur Apache (http://www.apache.org). Il faut également récupérer le module apache-php afin de permettre au serveur apache d'interpréter le langage php. Pour notre projet nous aurons également besoin du module mod_ssl pour passer en données sécurisé. Nous créons aussi des « VirtualHosts » afin que chaque utilisateur ait son propre sous-serveur Web pointant vers le sous-domaine qu’il aura préalablement choisi. Ensuite, l’utilisateur pourra ajouter/supprimer des pages à son espace web. Il aura uniquement accès à son dossier personnel. Pour info, les VirtualHosts permettent d'établir plusieurs sites web (en fonction du sous-domaine choisi) sur un seul serveur apache. Le serveur SSH servira à l'administrateur de pouvoir prendre le contrôle du serveur à distance avec un shell sécurisé. 12/44 2.4.2 2.4.2.1 Description de l'architecture du module Web Le diagramme de paquetages Voici le diagramme de classe (par module): 2.4.2.2 Description des paquetages Le paquetage « authentification » Ce paquetage va permettre à l'utilisateur déjà inscrit de pouvoir accéder à sa session. La fonction verif_authentification.php renverra le menu ou un message d’erreur si l'authentification est correcte ou non. 13/44 Le paquetage « inscription » Ce paquetage a pour but d'inscrire une personne dans la base de donnée. On lui présentera un formulaire et devra s'inscrire. On vérifiera si le login est déjà utilisé, si le mot de passe ne respecte pas les critères souhaités, etc. Si tous les critères sont respectés alors l'utilisateur sera enregistré dans la base de données. Puis, après contrôle de la validité des informations entrées par l’utilisateur par l’administrateur, celui-ci valide son compte. Le système envoi ensuite automatiquement un email à l’utilisateur, pour qu’il confirme son inscription. Suite à cela, le système lui créera son accès au serveur ftp, l’accès à la gestion de son compte, la gestion de ses mails, ses statistiques et sa base de données personnelle. Le paquetage « mails » Ce paquetage est chargé de gérer les e-mails de l’utilisateur. Tout est géré par l’intermédiaire de la base de données « db_postfix » : ajout, suppression, changement de mot de passe et transfert de mails. En effet, le serveur de messagerie Postfix, est interfacé avec la base de donnée MySQL, ce qui facilite grandement l’administration des e-mails. Le paquetage « changement » Ce paquetage permet à l'utilisateur de visualiser son profil et de le modifier à tout moment. Il peut également changer de mot de passe (portail web, phpMyAdmin, FTP). Le paquetage « ftp » Ce paquetage permet d'ouvrir une connexion ftp avec le serveur. L'utilisateur aura le droit de stocker qu'une certaine capacité de données (en fonction de l’offre choisie). L’utilisateur aura le choix d’utiliser le client FTP de son choix ou d’utiliser un outil intégré à son interface d’administration : « net2ftp » Le paquetage « webmail » Nous utiliserons le Webmail « SquirrelMail » pour l’accès à ses e-mails via l’explorateur Web. Le paquetage « administrateur » Ce paquetage n’est accessible que par l'administrateur. De sa console d’administration, il est capable de voir tous les utilisateurs inscrits ou en demande d’inscription et consulter leurs informations respectives. Il peut également les supprimer définitivement du système. 14/44 2.5 La base de données et ses requêtes Le but de cette partie est de décrire le fonctionnement des requêtes avec la base de données MySQL. La première partie décrit les classes qui permettent d'enregistrer les informations. La seconde décrit les opérations de sélection, de modification et de suppression. 2.5.1 Enregistrement des informations Après s'être inscrit, les informations sur l’utilisateur sont directement enregistrées dans la base de données. En effet chaque champ rempli du formulaire sera directement incorporé dans la base de données. Les tables choisies sont les suivantes : « authentification » avec le login et le mot de passe crypté en md5 et en DES. « inscription » avec toutes les données de l'utilisateur « users, domain et forwardings » de la base « db_postfix »avec les mails de l’utilisateur (5 maximum). Tous ces comportements sont décrits plus en détail dans la partie 2 (Structure des données) La base de données MySql s'appuie sur le langage SQL. Il faudra d'abord écrire la requête SQL classique, puis l'exécuter à l'aide d'une fonction spécifique à MySQL dans une page PHP. Voici le déroulement des requêtes : 1. Il faut se connecter à la base de données avant d'effectuer toutes les opérations sur la base: $my=mysql_connect($serveraddr,$login,$password); mysql_select_db($base_de_donnee,$my); 2. Les requêtes d'insertion seront du type (exemple): Requête permettant d’insérer les informations relatives à un utilisateur : $sql = "INSERT INTO inscritVALUES ('$login', '$nom', '$prenom', '$societe', '$adresse', '$codepostal', '$ville', '$offre', '$nomdedomaine', '$referencement', '$email','$message')"; mysql_query($sql) or die('Erreur SQL!'.$sql.'<br>'.mysql_error()); Requête permettant d’insérer l’identifiant et le mot de passe (crypté) d’un utilisateur : $sql1= "INSERT INTO authentification VALUES ('$login',md5('$password'))"; mysql_query($sql1) or die('Erreur SQL!'.$sql1.'<br>'.mysql_error()); 15/44 2.5.2 Sélection et altération d’informations On peut également consulter des données ou les modifier. Pour cela le langage SQL utilise deux requêtes différentes. 2.5.2.1 La requête de sélection La requête de sélection a pour but d'afficher et de présenter de façon correcte le résultat à l'utilisateur. Comme précédemment la requête vers la base de données MySQL vient du langage SQL ; le résultat de cette requête est traité pour être affiché sous forme de tableau (mise en forme par les balises HTML). Voici la description d'une requête de sélection avec mise en forme : $sql = "SELECT nom FROM inscrit WHERE login='$login1' "; $req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); if ($data = mysql_fetch_assoc($req)) { echo $data['nom'];} 2.5.2.2 La requête de modification Cette requête sert à supprimer des données (modification d'un attribut en un champ vide) ou bien à modifier la valeur d'un attribut. De même que précédemment le langage SQL sera le langage utilisé pour cette requête. Voici la description d'une requête pour une modification de son profil: $sql="UPDATE inscrit SET email='$adressemail1', nom='$nom1',prenom='$prenom1', codepostal='$adressepostal1' WHERE login='$login1'"; mysql_query($sql) ; 2.6 Authentification Cette partie traite de l'authentification des utilisateurs et des problèmes de sécurité en terme de confidentialité. 2.6.1 Confidentialité des données L'authentification des utilisateurs est nécessaire parce que les données relatives à lui sont confidentielles (Nom, adresse…). Pour assurer que ces données ne puissent être lues par des personnes étrangères, il est impératif que ces données soient protégées et que les mots de passes soient chiffrés. En effet, imaginons que ce ne soit pas le cas, les équipements réseaux pourraient voir passer en clair ces données tant au niveau : des serveurs, des routeurs, des routeurs du fournisseur d'accès, des routeurs Internet, ainsi que des hubs ou des switches. Quel que soit le point de passage, on ne peut pas exclure que quelqu'un soit équipé d'un logiciel d'administration réseau (sniffer) qui permette de récupérer des mots de passes non crypté et ainsi d’accéder aux informations personnelles de nos utilisateurs. 16/44 Les mots de passes des utilisateurs sont cryptés au format MD5 dans la base de donnée et en DES sur la machine UNIX. Les mots de passe sous Linux ou UNIX sont généralement contenus dans le fichier /etc/password ainsi que toutes les infos systèmes des comptes utilisateurs. Ce fichier est en lecture seule pour tout le monde pour le besoin de différents programmes, et juste en écriture pour l'administration (ROOT). Le problème est que si on peut le lire, on peut donc le récupérer et tenter un décryptage de force dessus. Alors on a inventé le shadowing. Les mots de passe ne sont plus stockés dans le fichier /etc/password mais dans un fichier généralement (pas toujours) appelé /etc/shadow. Ce fichier est par contre illisible par tout le monde sauf le root bien sur. Ce qui permet déjà à tous les utilisateurs non root de ne pas pouvoir récupérer ce fichier et de tenter une attaque du type « brute force » dessus. Il faut ajouter à cela une règle permettant de renforcer la politique des mots de passe (longueur minimale, caractères spéciaux…). Ainsi, on s’assure qu’aucun mot de passe ne pourra être corrompu (à condition quand même que nos utilisateurs ne mettent leurs mots de passe sur un postit collé sur l’écran ;-) 2.6.2 Authentification des utilisateurs Un système de login et mot de passe (pour l’accès à son compte) est suffisant pour nos besoins de sécurité. La stratégie de conservation des mots de passe étant décrite précédemment. 2.6.3 Contrôle des droits Le contrôle des droits d'accès sera renforcé au niveau du dossier de chaque utilisateur (la « home directory » de son espace web). En effet à chaque création d’un nouvel utilisateur, on lui affecte les droits appropriés (et seulement à lui). C'est à dire qu’il aura les droits en lecture, en écriture et en exécution sur son dossier personnel. De même pour sa base de données, on crée une base de données personnelle pour chaque utilisateur avec son mot de passe et son login. Ainsi lui seul pourra y accéder et l’administrer (avec phpMyAdmin). Son sous-domaine (défini sur le serveur apache) sera en lecture pour tout le monde (ce qui est le but du projet, permettre le partage d’information avec des millions d’autres personnes par Internet ;-). Le compte administrateur en revanche aura accès à toutes les données et devra respecter la charte de la CNIL. L'administrateur aura la responsabilité des données qui se situent sur son serveur. Il aura le devoir de contrôler le contenu des sites web qu’ils hébergent et dans le cas de non-respect de la charte (warez, racisme…) de les supprimer. C’est pourquoi, il a le privilège de suppression des utilisateurs et de leur espace web dans l’interface d’administration. 17/44 3 Mise en place des services et de la machine 3.1 Préambule Cette partie du rapport décrit les opérations que l’on a effectué pour mettre en œuvre l’intégralité des services disponibles sur notre plate-forme d’hébergement Web mutualisé. Comme décrit dans le cahier des charges et la phase de conception, nous avons installé et configuré principalement les services suivants : Serveur Web (apache) Base de donnée (Myqld) Administration Base de donnée par utilisateur (phpMyAdmin) Serveur FTP (vsftpd) Serveur de messagerie Serveur POP (courier) Serveur IMAP (courier-imap) Serveur SMTP (postfix) Accès Webmail (SquirrelMail) Anti-virus (ClamAV) Anti-Spam (SpamAssassin) Statistique de chaque sous-domaine (Awstats) Tous ces services ont été installés en prêtant particulièrement attention aux aspects sécurités qu’ils imposent. Les Services disponibles doivent être récents et ne comporter aucune faille de sécurité connue. Il est nécessaire également de retoucher aux fichiers de configuration, pour éviter des lacunes dans les installations par défaut. 3.2 Installation du serveur La première phase consistait à trouver une machine susceptible d’héberger notre service d’hébergement mutualisé et puis de choisir l’OS le mieux adapté à nos besoins. Pour ce qui est de la machine, nous avons récupéré un serveur DELL PowerEdge 1400 (PIII 800 et 512 de RAM avec 9 Go en SCSI) sur lequel nous avons choisi d’installer une Debian. Debian est toujours disponible en 3 versions (trois branches) qui sont : • stable : version figée où les seules mises à jour sont des correctifs de sécurité ; • testing : future stable où seuls les paquets suffisamment matures peuvent rentrer ; • unstable : version active, constamment nourrie de nouveaux paquets ou de mises à jour de paquets déjà existants (surnommée Sid). 18/44 La version stable comporte des packages assez anciens par rapport aux distributions courantes (par rapport à une mandrake 10.0 par exemple), mais ces packets ont été testés pendant un minimum de 6 mois par des spécialistes afin d'en corriger toutes les failles. La "stable" est donc bien plus sécurisée et stable qu'une autre distribution (les "xBsd" n'étant pas des distributions linux), et convient de ce fait parfaitement à une installation sur des serveurs de production. La testing comporte des packets assez récents mais considérés comme suffisamment stables, datant de 10 jours environ à 6 mois. Cela constitue donc une version intermédiaire, avec des packets plutôt récents donnant ainsi accès à des logiciels en version récente. Enfin, la "Sid" est à réserver aux connaisseurs, car parfois dangereuse. Lorsqu'un développeur soumet un packet, celui-ci est directement mis en "Sid" pour être testé. La distribution stable de Debian (Sarge) est celle qui convient le mieux à nos attentes, elle est très sûre (et assez ancienne, encore au noyau 2.4), mais très sécurisé et stable, exactement ce qu’il convient pour un serveur. Pour ce qui est de l’installation, nous avons fait une installation minimale, c’est-à-dire, juste avec le système de base, sans serveur X ni window manager. Seul le serveur SSH a été installé pour que le serveur puisse être administrer et configurer à distance. 3.2.1 Serveur Web – Apache Le logiciel Apache HTTP Server, souvent appelé Apache, est un serveur HTTP produit par la Apache Software Foundation. C'est le serveur HTTP le plus populaire du World Wide Web. C'est un logiciel libre avec un type spécifique de licence, nommée licence Apache. Nous avons installé ce serveur Apache dans sa version 2.0.55. Ce serveur devait être capable d’interpréter le PHP (php5, php4) et dialoguer avec une base de donnée (mysql). Toutes les dépendances lors de l’installation de ces packages étaient gérées par le gestionnaire de packages de Debian (APT), ce qui facilite bien la tâche. Nous avons ensuite édité son fichier de configuration pour qu’il colle à nos spécifications. Il faut que pour chaque utilisateur, notre service fournisse un sous-domaine. Pour cela, il faut spécifier au fichier de configuration de Apache « /etc/apache2/httpd.conf », d’inclure un dossier contenant un fichier par sous domaine existant (cela permet de faciliter l’administration des sous domaines : ajout, suppression). Pour chaque sous-domaine nous avons un fichier contenant : (exemple toto) : <VirtualHost 192.168.0.3> <Directory /var/ftp/toto> Allowoverride all </Directory> ServerName toto.homeonline.ath.cx //nom du sous-domaine DocumentRoot /var/ftp/toto //Répertoire source – accès ftp CustomLog /var/log/apache2/toto.homeonline.ath.cx-access.log common //log personalise par ss-domaine ErrorLog /var/log/apache2/toto.homeonline.ath.cx-error.log </VirtualHost> Pour chaque nouvel utilisateur inscrit, il peut choisir son sous-domaine. Une fois ce nom récupéré, on génère le fichier contenant son sous-domaine qui sera incluse dans la configuration de Apache. On choisit de redémarrer que toute les 24 heures le serveur apache pour ne pas perdre en disponibilité (on en peut pas se permettre de redémarrer le serveur à chaque fois qu’un utilisateur 19/44 s’inscrit). Le temps d’activation sera de 24 heures maximum pour un nouveau compte. On utilise l’utilitaire crontab pour planifier cette tâche. Note importante : Au préalable, il a fallut cocher l’option « wildcard » pour notre nom DNS. Cette option est très importante, c’est elle qui permet de faire fonctionner les sous-domaines. En effet, elle permet que toutes les adresses de la forme : « *.homeonline.ath.cx » soit redirigées sur le nom de domaine en question : « homeonline.ath.cx ». Ce n‘est pas une option qui est activé par défaut mais elle doit absolument être activé, sinon un ping vers une adresse du type « test.homeonline.ath.cx », ne pourrait fonctionner. (V. annexe 1) 3.2.2 Base de données et son outil d’administration MySQL (SQL est acronyme de Structured Query Language en anglais) est un serveur de bases de données relationnelles SQL très rapide, multi-thread, robuste et multi-utilisateurs. MySQL est un logiciel libre développé sous double licence GPL et licence commerciale. Nous avons installé le serveur « mysqld » sur notre serveur : mysqld Ver 4.1.15-Debian_1-log for pc-linux-gnu on i486 (Source distribution) Suite à l’installation de ce serveur, nous avons installé un outil d’administration de base de données : « PhpMyAdmin » dans sa version 2.7.0. Il permet deux choses : L’administration de la globalité des bases de données par l’administrateur. La possibilité aux utilisateurs d’administrer directement leurs propres bases de données. On utilise une authentification http et cookie qui convient parfaitement dans un environnement multi-utilisateurs. Ainsi on donne l’accès qu’a la base de donnée de l’utilisateur qui en est propriétaire. PhpMyAdmin a besoin d'un utilisateur de contrôle - «controluser» - ayant seulement le privilège SELECT sur les tables mysql.user (toutes les colonnes sauf «Password»), mysql.db (toutes les colonnes), mysql.host (toutes les colonnes) et mysql.tables_priv (toutes les colonnes sauf «Grantor» et «Timestamp»). On doit spécifier les détails pour le controluser dans le fichier config.inc.php dans la section paramètre $cfg[Servers][$i]['controluser']& $cfg[Servers][$i]['controlpass']. On donne certains droits à cet utilisateur spécial, et enfin on accorde un ensemble de privilège sur un utilisateur réel sur sa propre base. (V. annexe 2) 20/44 3.2.3 Serveur FTP Nous avons choisi d’utiliser le serveur « vsftpd » (Very Secure FTPD). C’est un serveur FTP, léger, rapide, conçu avec une volonté d'en faire un logiciel "sécurisé". Ce service FTP permet aux utilisateurs de pouvoir uploader leurs fichiers sur leur espace Web. A chaque fois qu’un nouvel utilisateur s’enregistre, un compte local est crée sur la machine avec un répertoire d’accueil correspondant à l’endroit ou il enverra les fichiers qu’il veut rendre disponible sur sa page web. Cet utilisateur appartiendra au groupe « chrvsftp » propre au serveur FTP. De plus, pour une plus grande sécurité, tous les utilisateurs seront « chrooté » (c’est-à-dire enfermé) dans leur home directory. On adapte le fichier de configuration de vsftpd : « /etc/vsftpd.cond » en fonction de nos attentes. Notamment le « umask » qui par défaut est à 077 alors que dans notre cas, il doit être positionné à 022 pour que le serveur Apache puisse interprété les fichiers dans la « home directory » des utilisateurs (droit en lecture de l’utilisateur www-data – Apache). Pour chaque nouvel utilisateur, on exécute la commande suivante dans le script de création d’un nouvel utilisateur (exemple pour « toto ») : #useradd -m --home /var/ftp/toto --password "pass_crypté_DES" --gid chrvsftp -shell /bin/false toto Avec les droits suivants: heracles:/var/ftp# ls -al total 12 drwxr-xr-x 3 chrvsftp chrvsftp 4096 2006-02-27 20:42 . […] drwxr-xr-x 2 toto chrvsftp 4096 2006-03-09 15:05 toto 21/44 3.2.4 3.2.4.1 Serveurs de messagerie Schéma général Voici le schéma général de la configuration d’un serveur de messagerie dont les éléments sont : • Postfix : C’est un serveur de messagerie électronique et un logiciel libre. Il se charge de la livraison de messages électroniques (SMTP : Simple Mail Transfert Protocol). Il a été conçu comme une alternative plus rapide, plus facile à administrer et plus sécurisée que l'historique Sendmail. • MySQL : C’est la base de données qui contrôle le comportement de Postfix. Il contient des tables pour les utilisateurs, les domaines et éventuellement les transferts d’e-mail. • Courier : C’est un serveur mail comme Postfix, seulement dans notre configuration, nous allons juste l’utiliser comme serveur POP3 et IMAP. Ces deux protocoles permettent aux utilisateurs d’accéder à leurs boites mails depuis l’extérieur. 22/44 • SASL (La librairie Cyrius) : Pour « Simple Authentication and Security Layer » signifiant « authentication simple et couche de sécurité » est un « framework » d'authentication et d'autorisation normalisé par l'IETF. • AMaViS : C’est un élément qui permet de contrôler le contenu des e-mails qui passent par Postfix. Il scanne les mails arrivant pour détecter les virus et les spams. Pour cela, ils utilisent deux outils : o Spamassassin : Le but de ce logiciel est de filtrer le trafic des courriels pour éradiquer les courriels reconnus comme pourriel ou courriel non sollicité. o ClamAV : C’est un logiciel antivirus très utilisé sous Unix. Il est utilisé avec les serveurs de courriels pour filtrer les courriers comportant des virus. ClamAV est un logiciel libre distribué sous licence GPL. • PhpMyadmin : Cet utilitaire permet de gérer sa base de donnée depuis une interface web. Le serveur SMTP Postfix permet de gérer deux types de domaines : les domaines locaux et les domaines virtuels. Les domaines locaux sont ceux définis dans le champs « mydestination » du fichier de configuration de Postfix : « main.cf ». Ce type de domaine oblige de déclarer des utilisateurs locaux aux systèmes (C’est-à-dire dans « /etc/passwd »). Les autres types de domaines sont les domaines virtuels, ce sont des domaines très flexibles et ne nécessitent pas de compte système pour chaque compte mail. On peut donc facilement gérer de multiples comptes mails sans problème avec une base de données. On crée différents fichiers spécifiques qui vont permettre à Postfix de connaître où chercher les informations pour router les messages vers les bons utilisateurs (virtuels). 3.2.4.2 Serveur SMTP On installe Postfix comme serveur SMTP avec le support de mysql. On a préalablement installé le serveur de base de données « mysqld ». On a crée aussi la base « db_postfix » contenant les tables des domaines, des utilisateurs ainsi que la table pour les transferts de mails (forwarding). Ensuite on configure les fichiers permettant de faire le routage des mails vers la boite de l’utilisateur (virtuel) concerné (v. Annexe 6). De plus, tous les mails sont ordonnés dans le répertoire « /home/vmail », celui-ci appartient à l’utilisateur ‘vmail’ qui possède les UID/GID 5000 (renseigné dans le fichier de configuration de Postfix). Le fichier de configuration de Postfix « main.cf » se trouve en annexe 5. Un autre point important concerne l’authentification des utilisateurs à utiliser le serveur SMTP afin d’éviter de faire de notre serveur un « open relay » profitable aux spammeurs. Pour cela, on demandera à Postfix d’utiliser SASL/MySQL, cela va permettre à Postfix de connaître un certain nombre de méthodes d'authentification sécurisée. La dernière étape consistera à utiliser TLS pour encrypter les sessionx SMTP de telle manière qu’aucun mot de passe ne puisse circuler en clair. TLS utilise les librairies SSL pour encrypter les communications entre le client et le serveur de messagerie. TLS utilisera un certificat X509 (vu en cours de sécurité cette année) pour communiquer au client la clé publique de notre serveur de messagerie. 23/44 3.2.4.3 Serveur POP3 / IMAP Maintenant que nous avons notre serveur SMTP, il serait utile d’avoir un serveur POP3 et IMAP afin de pouvoir récupérer nos e-mails. Nous allons donc mettre en place un serveur POP3 et IMAP avec courier. Il faut indiquer à cet outil d’utiliser mysql pour l’authentification des utilisateurs, pour cela on modifie « authdaemonrc » et « authmysqlrc » (dans « /etc/courier/ ») pour lui indiquer la méthode à suivre. Ensuite on spécifie pour chaque services (POP3 et IMAP) leurs spécificités (notamment type d’authentification, port…) dans les fichiers de configuration suivants : « pop3d » et « imapd ». Les services sont maintenant configurés et actifs, il reste plus qu’à ouvrir les ports sur le routeur pour qu’ils puissent être accessibles de l’extérieur. 3.2.4.4 Anti-Spam L’autre outil important est bien sur un Anti-Spam. Spamassassin est un filtre anti-spam qui effectue des tests heuristiques sur chaque mail afin de détecter les envois non sollicites. 3.2.4.5 Anti-virus L’anti-virus est un outil important pour l’élaboration d’un service de messagerie. On utilise Clam Antivirus, qui est un logiciel libre capable de reconnaître la plupart des virus connus. 3.2.4.6 Amavis Pour luter contre ce fléau de virus, nous allons utiliser amavisd. Il a pour but de faire scanner les e-mails par les antivirus enregistrés auprès de lui. Il permet de scanner les pièces attachées, et au moyen de décompresseur de traiter tout type de pièces attachées. Pour cela, il faut indiquer à Postfix, dans son fichier de configuration de renvoyer les e-mails qui lui arrivent vers Amavis de telle manière qu’ils puissent les faire analyser (anti-virus et anti-spam). 3.2.4.7 Webmail On a choisi d’installer SquirrelMail, C’est un webmail (c'est-à-dire une interface web pour consulter son courrier électronique), écrit en PHP4. Il supporte les protocoles IMAP et SMTP. Toutes les pages générées sont en HTML pur (sans aucun Javascript), ceci afin d'être compatible avec le maximum de navigateurs. Squirrelmail inclut de base toutes les options que nous attendions d'un logiciel de messagerie, y compris le support MIME, un carnet d'adresses, et la création de dossiers pour trier les e-mails. Ce système permet de pouvoir consulter ces e-mails n’importe où et sur n’importe quelles machines dans le monde. 24/44 Notre Webmail fonctionne à l’adresse (via un sous-domaine « webmail ») : http://webmail.homeonline.ath.cx (V. Annexe 4) 3.2.4.8 Recettes unitaires Il est évident qu’en installant un système aussi complet, il faut faire fréquemment des tests. Il faut notamment tester que l’authentification SMTP, POP3 et IMAP fonctionnent, ainsi que l’anti-virus et le Webmail. Pour cela, on dispose de fichiers de log complet : « /var/log/mail.log » qui nous indique toutes les informations nécessaire sur l’activité de notre serveur de messagerie (erreur d’authentification, arrivée d’un e-mail, traitement par l’anti-virus, etc.). Nous avons utilisé un outil disponible sur http://www.webmail.us/testvirus pour tester l’efficacité de notre passerelle anti-virus. On constate aisément dans les logs les e-mails qui ont été bloqué ou non. Voici un exemple de rejet d’un e-mail car il contenait un virus : May 11 15:50:58 heracles postfix/qmgr[1388]: 79923E3A93: from=<[email protected]>, size=1599, nrcpt=1 (queue active) May 11 15:50:58 heracles amavis[9738]: (09738-04-5) Blocked BANNED (multipart/mixed,application/x-unparseable-multipart,.asc | .zip,eicar.zip | .asc,EICAR.COM), [204.119.252.7] [204.119.252.7] <[email protected]> -> <[email protected]>, quarantine: banned0VGhhi9jX3I5, Message-ID: <[email protected]>, mail_id: 0VGhhi9jX3I5, Hits: -, 226 ms May 11 15:50:58 heracles postfix/smtpd[25991]: disconnect from bmdc7.emailsrvr.com[204.119.252.7] May 11 15:50:58 heracles postfix/smtp[25917]: 1C269E3A6B: to=<[email protected]>, relay=127.0.0.1[127.0.0.1], delay=3, status=bounced (host 127.0.0.1[127.0.0.1] said: 550 5.7.1 Message content rejected, id=09738-04-5 - BANNED: multipart/mixed,application/xunparseable-multipart,.asc | .zip,eicar.zip | .asc,EICAR.COM (in reply to end of DATA command)) May 11 15:50:58 heracles postfix/cleanup[25916]: 29FF2E3A78: message-id=<[email protected]> May 11 15:50:58 heracles postfix/qmgr[1388]: 29FF2E3A78: from=<>, size=3682, nrcpt=1 (queue active) May 11 15:50:58 heracles postfix/qmgr[1388]: 1C269E3A6B: removed May 11 15:50:58 heracles postfix/cleanup[25960]: 06D37E3A6A: [email protected] 3.2.5 Statistiques Web par sous-domaine via Awstats AWStats est un outil d’analyse statistique d’un site Web. Programmé en perl, il suffit de placer le script dans le répertoire cgi de notre serveur, changer le chemin, et le tour est joué. Voici quelques unes de ses fonctionnalités : le nombre de visites, de visiteurs uniques, de pages, de hits, de transfert, par domaine/pays, hôte, heure, navigateur, OS, etc. Le tout apparaissant dans de jolis graphiques simple à comprendre. Chaque fois qu’un hôte virtuel est crée sur la machine (lors de l’ajout d’un utilisateur), on lui attribue des logs personnalisés pour son sous-domaine. Ensuite on crée un fichier de configuration awstats propre à son sous-domaine (pour une meilleure administration) de la forme suivante (sousdomaine test): LogFile=/var/log/apache2/test.homeonline.ath.cx-access.log LogType=W LogFormat=4 DirIcons=/awstats-icon 25/44 SiteDomain=test.homeonline.ath.cx On a ensuite crée un script en BASH qui va pour chacun de ses fichiers configuration (dans /etc/awstats/) mettre à jour les statistiques du site (sous-domaine en fait). Ce script est mis en annexe 9. Il ne reste plus qu’à lancer ce script toutes les deux heures par exemple grâce à la crontab (v. annexe 8). On y accède ensuite à l’adresse (exemple sous-domaine test) : http://homeonline.ath.cx/cgi-bin/awstats.pl?config=test.homeonline.ath.cx 3.2.6 Organisation des pages et gestion des mots de passes Structure des pages : Nous avons été obligés de suivre une structure bien particulière pour les pages php, à savoir pour les variables de session et les header. Ce sont des fonctions qui permettent d’appeler une autre page php. Elles doivent se faire tout au début du fichier php et avant tout affichage. Si cette règle n’est pas respectée, l’en tête ne peut être envoyée avec les bonnes informations. La structure des fichiers php sont toutes les mêmes. Elles sont constituées d’un en-tête (« top.php ») et d’un pied de page (« bottom.php ») pour une meilleure maintenance des pages. L’organisation complète de notre application Web est située en annexe 10 sous la forme d’un organigramme. Interopérabilité des mots de passes A chaque inscription d’un utilisateur, il a accès à 3 outils différents (portail PHP pour gestion de son compte, PhpMyAdmin et le serveur FTP). Pour chacun de ces outils, le mot de passe est stocké à un endroit diffèrent et est souvent chiffré différemment. Lorsqu’il s’inscrit il faut donc le déclarer au niveau de notre portail web mais aussi au niveau de PhpMyAdmin et de la machine UNIX pour l’accès au serveur FTP. Il en est de même lors de la modification du mot de passe de l’utilisateur, nous devons lancer des requêtes SQL pour la modification des deux premiers puis un script BASH capable de modifier directement le fichier « /etc/shadow » pour celui su système. Au niveau de PHP maintenant, les mots de passe se situant sur la base de données sont codés par la fonction « md5() », pour celui sur le système, par la fonction « crypt() » (correspond au codage DES). 3.2.7 Automatisation des tâches d’administration Pour automatiser les tâches d’administration, nous avons créé des scripts shell (en BASH) lancés depuis une page PHP ou depuis la « crontab ». Outre le script pour « awstats », nous avons créé des scripts permettant d’automatiser la création d’un compte sur la machine (pour l’accès FTP), la suppression des comptes mais aussi la modification du mot de passe. Ces 3 scripts sont lancés à partir des pages PHP en prenant bien soins d’utiliser l’utilitaire « sudo » pour des raisons de sécurité. (Annexe 11). 26/44 3.2.8 3.2.8.1 Sécurité du système Préambule La sécurité occupe une place importante dans un tel projet. Garantir la disponibilité des services, l’intégrité et la confidentialité des données du système ainsi que celle de nos utilisateurs est un facteur important de fiabilité pour un service d’hébergement Web. C’est pourquoi l’aspect de la sécurité ne peut être négligé dans un tel projet. D’autant plus que le Web est un endroit peu sur, les infractions sont de plus en plus nombreuses chaque jour, et les services d’hébergement Web sont des cibles de choix aux attaques malveillantes. Notre machine se doit d’être sécurisé. Au niveau du système en lui-même mais aussi de tous les services accessibles depuis le Web. L’infrastructure réseau ne doit pas être négligée (Firewall, IDS, DMZ…) mais ce n’est pas ici notre sujet. Nous nous occuperons donc seulement de la sécurité de notre machine. 3.2.8.2 SuPHP Sur un serveur accueillant de nombreux utilisateurs, tous n'étant pas de confiance, il est très pratique que les scripts PHP s'exécutent avec les droits de leur propriétaire ! C'est possible grâce à suPHP ! De plus grâce à ce module nous pourrons exécuter des scripts PHP4 et des scripts PHP5. C'est très pratique car la plupart des applications PHP disponibles utilisent encore PHP4 (phpBB, DotClear...) mais PHP5 c'est l'avenir. Ainsi sur notre serveur, les fichiers se terminant par .php ou .php4 seront exécutés par PHP4 et ceux qui terminent par .php5 s’exécuteront avec PHP5. Et chaque page PHP sera exécuté avec les droits de son propriétaire, c’est une sécurité indispensable pour le service que nous fournissions. 3.2.8.3 Sudo Nous avons eu l’occasion d’étudier cette année en administration l’utilité de cette commande, elle permet d’autoriser certains utilisateurs à exécuter des commandes avec les droits du super utilisateur (ROOT). Dans notre cas il fallait que l’utilisateur système qui lance le daemon apache (www-data) ai le droit d’exécuter certains scripts pour la création, suppression d’utilisateur ou encore création de fichiers de configuration apache et awstats. Le fichier de configuration sudoers se trouve en annexe 7. 27/44 3.2.8.4 Disponibilité des données des utilisateurs Un service d’hébergement Web se doit de garantir la disponibilité et l’intégrité des données de ses utilisateurs. Pour cela, le mieux serait de disposer d’un autre serveur dit de secours qui serait capable de prendre le relais au moindre problème, comme nous l’avons stipulé dans la phase de conception. Cependant à moindre échelle et dans notre cas (pour notre projet), nous n’avons pas les moyens techniques pour mettre en place une telle infrastructure mais nous devons tout de même prendre soin de sauvegarder les données de nos utilisateurs. L’idéal serait de disposer d’un système de disques en RAID 1 de manière à conserver une image du disque à tout moment. Cependant comme nous ne disposons pas d’un second disque, nous avons décidé de créer un petit script (en BASH) qui aura pour tâche de compresser et d’archiver les pages personnelles de tous les utilisateurs (« tar.gz ») puis ensuite de l‘envoyer sur un serveur distant via FTP (annexe 11). De cette manière, en effectuant cette sauvegarde tous les jours (à 5 heures du matin via la crontab de root), nous disposons d’un point de sauvegarde récent pour reprendre notre activité si jamais un problème se déclare sur notre disque. Il en est de même pour la base de donnée, de manière à conserver les informations ainsi que les comptes de nos utilisateurs (e-mail compris). 28/44 4 Conclusion Ce projet qui s'est déroulé sur un peu plus de 7 mois, nous a permit d'approfondir nos connaissances dans plusieurs domaines: Appréhender et piloter un projet sur plusieurs mois en équilibrant et planifiant correctement les différentes phases de travail. Réaliser un document de conception sur un projet concret (comme nous l'avons appris cette année en « Gestion de Projet ») Installer et administrer une machine Linux sous Debian 3.0 ainsi que mettre en place et configurer les différents services utiles à notre projet (apache, Postfix, MySQL, vsftpd…) Concevoir des scripts shell (BASH) sous Linux permettant d’automatiser les tâches d’administration sur le serveur. Apprendre le langage PHP utile à la conception de notre portail Web dynamique. Réaliser des tests d’intégrations et effectuer des recettes. Sécuriser une machine ainsi que les applications en place dessus. C’est un projet qui fut intéressant et complet. Il aurait pu l’être encore plus, en mettant en place plus de moyens, notamment aux niveaux de la disponibilité des données et des services (en séparant les services sur différentes machines ainsi que les données). Mais aussi au niveau de l’architecture du réseau en place dans une solution d’hébergement. Cependant, au final, avec les moyens que nous possédions, nous avons tout de même réussi à produire quelques choses de fiable et stable capable d’accueillir des dizaines voir des centaines d’utilisateurs. Nous pourrions même dans le futur, élargir nos offres et pourquoi pas, proposer une offre payante fournissant autant de services et d’avantages que tout autres hébergeurs. L’avenir nous le dira… 29/44 5 Annexes Annexe 1 30/44 Annexe 2 Configuration phpMyadmin pour authentification http par cookie Pour debian: /etc/phpmyadmin/config.inc.php $cfg['Servers'][$i]['controluser'] = 'crtluser'; // MySQL control user settings $cfg['Servers'][$i]['controlpass'] = 'crtlpass'; // access to the "mysql/user" //Droits à appliquer GRANT USAGE ON mysql.* TO 'crtluser'@'localhost' IDENTIFIED BY 'projpodium'; GRANT SELECT ( Host, User, Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv, Reload_priv, Shutdown_priv, Process_priv, File_priv, Grant_priv, References_priv, Index_priv, Alter_priv, Show_db_priv, Super_priv, Create_tmp_table_priv, Lock_tables_priv, Execute_priv, Repl_slave_priv, Repl_client_priv ) ON mysql.user TO 'crtluser'@'localhost'; GRANT SELECT ON mysql.db TO 'crtluser'@'localhost'; GRANT SELECT ON mysql.host TO 'crtluser'@'localhost'; GRANT SELECT (Host, Db, User, Table_name, Table_priv, Column_priv) ON mysql.tables_priv TO 'crtluser'@'localhost'; //création user et droits CREATE DATABASE `db_user1` ; GRANT ALL PRIVILEGES ON db_user1.* TO 'user1'@localhost IDENTIFIED BY 'passuser1'; 31/44 Annexe 3 32/44 Annexe 4 (Ecran login) (Ecran Webmail) 33/44 Annexe 5 Configuration Postfix (main.cf): # Debian specific: Specifying a file name will cause the first # line of that file to be used as the name. The Debian default # is /etc/mailname. myorigin = /etc/mailname smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU) biff = no # appending .domain is the MUA's job. append_dot_mydomain = no delay_warning_time = 4h myhostname = homeonline.ath.cx alias_maps = hash:/etc/aliases alias_database = hash:/etc/aliases myorigin = /etc/mailname mydestination = localhost relayhost = smtp.free.fr mynetworks = 127.0.0.0/8,192.168.0.0/24 mailbox_command = procmail -a "$EXTENSION" mailbox_size_limit = 0 recipient_delimiter = + inet_interfaces = all //routage des mails virtual_alias_maps = mysql:/etc/postfix/mysql-virtual_forwardings.cf mysql:/etc/postfix/mysql-virtual_email2email.cf virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual_domains.cf virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual_mailboxes.cf virtual_mailbox_base = /home/vmail virtual_uid_maps = static:5000 virtual_gid_maps = static:5000 //authentification smtpd_sasl_auth_enable = yes broken_sasl_auth_clients = yes smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination smtpd_use_tls = yes smtpd_tls_cert_file = /etc/postfix/smtpd.cert smtpd_tls_key_file = /etc/postfix/smtpd.key //envoi mail vers Amavis pour contrôle content_filter = amavis:[127.0.0.1]:10024 receive_override_options = no_address_mappings Configuration SASL avec SMTP (smtpd.conf): pwcheck_method: auxprop auxprop_plugin: sql mech_list: plain login cram-md5 digest-md5 sql_engine: mysql sql_hostnames: 127.0.0.1 sql_user: postfix sql_passwd: passpostfix sql_database: db_postfix sql_select: select password from users where email='%u@%r' Annexe 6 34/44 Fichiers pour le routage des mails par Postfix dans le système (via la base de donnée MySQL). mysql-virtual_email2email.cf : user = postfix password = … dbname = db_postfix table = users select_field = email where_field = email hosts = 127.0.0.1 mysql-virtual_forwardings.cf : user = postfix password = … dbname = db_postfix table = forwardings select_field = destination where_field = source hosts = 127.0.0.1 mysql-virtual_mailboxes.cf : user = postfix password = … dbname = db_postfix table = users select_field = CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/') where_field = email hosts = 127.0.0.1 mysql-virtual_domains.cf : user = postfix password = … dbname = db_postfix table = domains select_field = 'virtual' where_field = domain hosts = 127.0.0.1 35/44 Annexe 7 # /etc/sudoers # # This file MUST be edited with the 'visudo' command as root. # # See the man page for details on how to write a sudoers file. # Defaults env_reset # Host alias specification # User alias specification # Cmnd alias specification Cmnd_Alias PHP=/var/www/scripts/add_account.sh,/var/www/scripts/del_account.sh,/var/www/scripts/maj_account.sh # User privilege specification root ALL=(ALL) ALL dany ALL=(ALL) ALL www-data ALL=(ALL) NOPASSWD:PHP Annexe 8 Tâches planifiées dans la « crontab » : heracles:/etc/awstats# crontab -l # m h dom mon dow command #restart serveur web pour ajour des nouveau vhost ts les jous a 01h00 0 1 * * * /etc/init.d/apache2 restart 2>&1 #Mise a jour de awstats pour tous toues les deux heures * */2 * * * /root/update_awstats.sh #Sauvegarde des données personnels de nos utilisateurs tous les jours à 5 heures du matin 0 5 * * * /root/save_all_users.sht 2>&1 36/44 Annexe 9 Script de mise à jour des statistiques d’accès aux pages web des utilisateurs (par sous-domaine) #!/bin/bash # # Auto update for all domains # #awstats directory cd /etc/awstats/ #date today=`date +%d-%m-%Y` #sous-domaine sousdomaine=homeonline.ath.cx #pour tous les fichiers for i in `ls *.conf` do #recupere le nom nom=`echo $i | cut -f2 -d.` #For mail statistic /usr/lib/cgi-bin/awstats.pl -config=mail -update >/dev/null status=$? echo "[ $today ] Mise a jour pour serveur mail effectue - $status" >> /var/log/scripts/awstats.log #si ce n'est pas un sous-domaine if [ "$nom" == "homeonline" ]; then /usr/lib/cgi-bin/awstats.pl -config=$nom.ath.cx -update >/dev/null status=$? echo "[ $today ] Mise a jour du domaine $nom.ath.cx effectue - $status" >> /var/log/scripts/awstats.log else #Upadte $nom /usr/lib/cgi-bin/awstats.pl -config=$nom.$sousdomaine -update >/dev/null #Log It status=$? echo "[ $today ] Mise a jour du domaine $nom effectue - $status" >> /var/log/scripts/awstats.log fi done 37/44 Annexe 9 Script pour l’ajout d’un compte utilisateur sur la machine (accès FTP) #!/bin/bash # # $1 : login (nom sous domaine) # $2 : nom du sous domaine # $3 : hash mdp (crypt) # #if [ "$n" != "2" ]; then #echo "ERREUR: Nombre d'argument inccorrect : $n" >> /var/log/scripts/error.log #exit #fi #variable #sous_domaine=homeonline.ath.cx test_home_user=`cat /etc/passwd | grep $1 | cut -f6 -d:` #new user doent exist if [ "$test_home_user" == "" ]; then echo "AJOUT USER $1 - home : /var/ftp/$1 - domain : $2" >> /var/log/scripts/info.log fi #test user exist if [ "$test_home_user" == "/var/ftp/$1" ]; then echo "ERREUR: Utilisateur $1 deja existant" >> /var/log/scripts/error.log exit fi #Ajout Utilisateur test=`useradd -m --home /var/ftp/$1 --password "$3" --gid chrvsftp --shell /bin/false $1` #test vhost doesnt exist if [ -f /etc/apache2/sites-enabled/$2 ]; then echo "ERREUR: Virtual host deja existant" >> /var/log/scripts/error.log exit fi #Ajout sous-domaine touch /etc/apache2/sites-enabled/$2 echo "<VirtualHost 192.168.0.3>" echo " <Directory /var/ftp/$1>" > /etc/apache2/sites-enabled/$2 >> /etc/apache2/sites-enabled/$2 echo " Allowoverride all" >> /etc/apache2/sites-enabled/$2 echo " </Directory>" >> /etc/apache2/sites-enabled/$2 echo "ServerName $2" >> /etc/apache2/sites-enabled/$2 echo "DocumentRoot /var/ftp/$1" >> /etc/apache2/sites-enabled/$2 echo "CustomLog /var/log/apache2/$2-access.log common" >> /etc/apache2/sites-enabled/$2 echo "CustomLog /var/log/apache2/access.log combined" >> /etc/apache2/sites-enabled/$2 echo "ErrorLog /var/log/apache2/$2-error.log" echo "</VirtualHost>" >> /etc/apache2/sites-enabled/$2 >> /etc/apache2/sites-enabled/$2 38/44 #Partie awstats #test vhost doesnt exist if [ -f /etc/awstats/awstats.$2.$sous_domaine.conf ]; then echo "ERREUR: Fichier configuration awstats deja existant" >> /var/log/scripts/error.log exit fi #Creation touch /etc/awstats/awstats.$2.conf echo "LogFile="/var/log/apache2/$2-access.log"" > /etc/awstats/awstats.$2.conf echo "LogType=W" >> /etc/awstats/awstats.$2.conf echo "LogFormat=4" >> /etc/awstats/awstats.$2.conf echo "DirIcons="/awstats-icon"" >> /etc/awstats/awstats.$2.conf echo "SiteDomain="$2"" >> /etc/awstats/awstats.$2.conf Script pour la suppression de ce compte #!/bin/bash # # $1 : nom (login) # $2 : nom sous domaine #variable #sous_domaine=homeonline.ath.cx #home_user=`cat /etc/passwd | grep $1 |cat -d: -f6` #Supprime user meme s'il ets logue et supprime sa HD userdel -f -r $1 #Erase vhost rm -f /etc/apache2/sites-enabled/$2 #erase apache user log rm -f /var/log/apache2/$2-* #erase awstats profil rm -f /etc/awstats/awstats.$2.conf echo "INFO: sous domaine $2 supprime" >> /var/log/scripts/info.log echo "INFO: Utilisateur $1 supprime" >> /var/log/scripts/info.log 39/44 Script pour la modification du mot de passe #!/bin/bash # # Modification mot de passe dans fichier shadow # # $1 : login utilisateur # $2 : nouveau mot de passe deja crypte # echo "[ $today ] login : $1 - MDP : $2 " >> /var/log/scripts/info.log #date today=`date +%d-%m-%Y` oldpass=`cat /etc/shadow | grep ^$1 | cut -d: -f2` if [ -e /etc/shadow.sed ] then echo "[ $today ] Cannot migrate user account $1" >> /var/log/scripts/error.log exit 1 fi if grep "^$1:" /etc/shadow > /dev/null then echo "[ $today ] Upgrating /etc/shadow..." >> /var/log/scripts/info.log touch /etc/shadow.sed chmod 600 /etc/shadow.sed cat /etc/shadow | sed -e "s|$oldpass:|$2:|" >> /etc/shadow.sed mv -f /etc/shadow.sed /etc/shadow echo "[ $today ] Mot de passe pour $1 modifie" >> /var/log/scripts/info.log fi 40/44 Annexe 10 Organigramme de notre application Web Index Inscription Verif_inscription Identification FAQ Verifier_identification Webmail Chg_pass_mail Verif_chg_pass_mail private admin admin User Déconnexion Edit profil 41/44 Développement des parties « admin » et édition de profil 42/44 Annexe 11 Script pour la sauvegarde des données des utilisateurs et envoi par FTP sur site distant #!/bin/bash doc_name=`date +%d-%m-%Y`-backup.tar.gz cd /var/ftp tar -czf /tmp/$doc_name . cd /tmp/ #ouvre une session FTP jusqu'à ce que soit marqué FIN_FTP ftp -n 192.168.0.2 <<FIN_FTP user fab cartman binary bell put /tmp/$doc_name $doc_name quit FIN_FTP # ferme la session FTP rm /tmp/*.tar.gz # supprime les archives .tgz dans le dossier /tmp/ 43/44 6 Références Luke Welling & Laura Thomson « PHP & MySQL » (CampusPress) 2003 Jean-Michel Lévy « UNIX & Linux, Utilisation et administration » (PEARSON) 2004 Anonyme « Sécurité maximale des systèmes et réseaux » (CampusPress) 2003 Ressources internet : Debian : http://www.debian.org/index.fr.html Généralité Linux : http://lea-linux.org/cached/index/Accueil.html Serveur apache 2 : http://www.cri.univ-rennes1.fr/documentations/cours_adminweb/supports/httpd.conf.html http://www.debian-administration.org/articles/161 Serveur de messagerie : http://workaround.org/articles/ispmail-sarge/ http://postfixwiki.org/index.php?title=Virtual_Users_and_Domains_with_CourierIMAP_and_MySQL#mysql_setup Webmail: http://maply.univ-lyon1.fr/~tdumont/Webmail/webmail.html Serveur FTP: http://worldserver3.oleane.com/bouynot/gabuzomeu/alex/doc/vsftpd/index.html Statistique via « Awstats » : http://ghaint.no-ip.org:8942/~k2/debian/awstats-debian.html http://www.debian-administration.org/articles/85 SuPHP : http://placelibre.ath.cx/keyes/index.php/2005/08/04/7-suphp-php4-php5-meme-serveur-executionscripts-php-droits-proprietaire 44/44