Ceci est une ancienne révision du document !


Installation et configuration d'Apache

Retour à la liste des tutoriels

Apache est le logiciel qui va envoyer les pages de votre site web à vos visiteurs.
Prérequis
  • Aucun prérequis pour ce tutoriel.


Installation d'Apache

apt-get install apache2

Une fois Apache correctement installé, une page web par défaut (It work's) s'affiche dans le navigateur lorsque l'on tape l'url @HTTPIP@ .

grand2

++But : [Sécurisation|tag:Sécurisation] basique d'[Apache|tag:Apache].++ %''(mis à jour pour Ubuntu 10.04 + groupe user-web - 02/07/2010)'' % !!!! I) Propriétaire des fichiers !!! 1) Création d'un utilisateur propriétaire du site Nous allons ajouter un utilisateur système qui sera le propriétaire des fichiers du site. %Maj : Nous attribuons le groupe www-data à cet utilisateur (simplifiera la mise en ligne de nouveaux fichiers) ///[bash] adduser user-web --ingroup www-data /// !!! 2) Attribution des fichiers à l'utilisateur user-web ///[bash] chown -R user-web:www-data /var/www/ /// !!! 3) Droits sur le contenu du site En résumé, le système de droits de linux peut s'exprimer en 3 chiffres : les droits du propriétaire du fichier (moi), les droits des membres du groupe du propriétaire du fichier (ma famille), et les autres. % Chacun de ces chiffres est compris entre 0 et 7, décomposable ainsi : * Droit de lecture sur le fichier : 4 points * Droit d'écriture sur le fichier : 2 points * Droits d'exécution du fichier : 1 point * Aucun droit : 0 point Le chiffre correspond à la somme des valeurs assignées aux droits. %[Doc. Ubuntu|http://doc.ubuntu-fr.org/droits|fr] % % !! A) Dossiers L'utilisateur user-web à tous les droits, et le groupe à le droit de lecture & exécution (requis pour pouvoir entrer dans le dossier) ///[bash] find /var/www/ -type d -exec chmod 750 {} \; /// Pour éditer les fichiers du site, il faudra donc se connecter avec cet utilisateur en sftp (ftp over ssh) -> sftp://dedi.anael.eu :-) !! B) Fichiers L'utilisateur user-web peut lire & écrire les fichiers du site, le groupe à seulement un droit de lecture. ///[bash] find /var/www/ -type f -exec chmod 640 {} \; /// !! C) Ecriture par le biais d'un script du site Les configurations proposées ci dessus ont un avantage important : si un pirate réussi à prendre le contrôle de votre site par une quelconque faille, il sera bloqué dans ses écritures et / ou modifications de fichiers ! % Toutefois, nous avons parfois besoin d'envoyer un fichier sur notre site par un formulaire d'upload, ou de modifier un fichier à la volée. % Si vous devez écrire dans un dossier au travers du site, donnez un chmod 770 uniquement au __dossier__ concerné. % Si vous devez écrire dans un fichier au travers du site, donnez un chmod 660 uniquement au fichier concerné. %[Doc. chmod|http://fr.wikipedia.org/wiki/Permissions_Unix|fr] % !!!! II) [Modules|tag:Modules] (extensions) Apache !!! 1) Les modules Par défaut, Apache charge plusieurs dizaines de modules. Tous ne sont pas utiles en fonction du site web que vous souhaitez héberger. % Dans mon cas, à terme je souhaite héberger l'ensemble de mes sites, utilisant du html, css, PHP, MySQL. % Pour connaître tous les modules Apache chargés : /[bash] apache2ctl -t -D DUMP_MODULES / Voila les modules chargés par défaut sur mon installation : %La valeur entre parenthèses signifie : * static : le module est intégré à Apache (et ne peut donc pas être désactivé, sauf compilation des sources :)) * shared : le module est rajouté à Apache, et peut donc être désactivé (voir plus loin la méthode) ///[apache] Loaded Modules: core_module (static) log_config_module (static) logio_module (static) mpm_prefork_module (static) http_module (static) so_module (static) alias_module (shared) auth_basic_module (shared) authn_file_module (shared) authz_default_module (shared) authz_groupfile_module (shared) authz_host_module (shared) authz_user_module (shared) autoindex_module (shared) cgi_module (shared) deflate_module (shared) dir_module (shared) env_module (shared) mime_module (shared) negotiation_module (shared) reqtimeout_module (shared) setenvif_module (shared) status_module (shared) Syntax OK /// [Explications des rôles des modules.|http://httpd.apache.org/docs/2.2/mod/|en] !!! 2) Détails des rôles des modules On va faire un tour un peu plus détaillé du rôle de chaque module chargé : !! A) core_module (static) Module de base (coeur), toujours disponible (coeur d'Apache). %[Doc. Apache|http://httpd.apache.org/docs/2.2/mod/core.html|en] !! B) log_config_module (static) Permet le log des actions effectuées sur le serveur. (error.log, access.log) %[Doc. Apache|http://httpd.apache.org/docs/2.2/mod/mod_log_config.html|en] !! C) logio_module (static) Requiert le module log_config. %Permet de quantifier les données reçues / transmises pour chaque requête du serveur (1 page du site est plusieurs requêtes : le html; le css, une image…). %Cette valeur prend en compte les entêtes échangées (communication uniquement entre le serveur et votre navigateur, ces informations ne sont pas affichées). %A noter que par défaut les logs (access.log) contiennent déjà la taille des données envoyées par le serveur au navigateur. (suffisant pour utiliser un script tel [webalizer|http://www.webalizer.org/|en] %[Doc. Apache|http://httpd.apache.org/docs/2.2/mod/mod_logio.html|en]) !! D) mpm_prefork_module (static) Composant de base qui s'occupe d'écouter et répondre aux requêtes. %[Forums ApacheFrance - prefork ou worker|http://forums.apachefrance.com/viewtopic.php?p=38598#p38598|fr] %[Doc.wikitwist|http://fr.wikitwist.com/apache2-mpm-worker-mpm-prefork/|fr] %[Doc. Apache|http://httpd.apache.org/docs/2.2/mod/worker.html|en] !! E) http_module (static) Permet la gestion du protocole http, donc le bon fonctionnement du serveur ! %[Doc. Apache|http://httpd.apache.org/docs/2.2/programs/configure.html|en] !! F) so_module (static) Autorise le chargement de modules au lancement d'apache (les fameux shared). %Ces modules sont des fichiers de type .so %[Doc. Apache|http://httpd.apache.org/docs/2.2/mod/mod_so.html|en] !! G) alias_module (shared) * Création de répertoires virtuels : le répertoire /stats n'existe pas sur le site. En saisissant cette url, nous serrons redirigé vers /var/www/stats/ * Redirection vers une autre page du site, voir un autre site %[Doc. Apache|http://httpd.apache.org/docs/2.2/mod/mod_alias.html|en] !! H) auth_basic_module (shared) Permet de définir des utilisateurs spécifiques autorisés à accéder à un répertoire, un fichier, … (le plus souvent par le biais des fichiers htaccess) %En lui seul ce module ne gère pas les listes d'utilisateurs autorisés ! %[Doc. Apache|http://httpd.apache.org/docs/2.2/mod/mod_auth_basic.html|en] !! I) authn_file_module (shared) Permet l'utilisation de fichiers (.htpasswd) pour authentifier les utilisateurs (cf auth_basic_module). %[Doc. Apache|http://httpd.apache.org/docs/2.2/mod/mod_authn_file.html|en] !! J) authz_default_module (shared) Module de secours pour les autorisations d'accès : rejette systématiquement toutes les demandes. %Utile en cas de non configuration d'un module de gestion des autorisations d'accès (sécurité) ! %[Doc. Apache|http://httpd.apache.org/docs/2.2/mod/mod_authz_default.html|en] !! K) authz_groupfile_module (shared) Permet la gestion de groupes d'utilisateurs et de droits associés. %[Doc. Apache|http://httpd.apache.org/docs/2.2/mod/mod_authz_groupfile.html|en] !! L) authz_host_module (shared) Permet la gestion de droits associés à une @ IP ou nom (de domaine). %[Doc. Apache|http://httpd.apache.org/docs/2.2/mod/mod_authz_host.html|en] !! M) authz_user_module (shared) Permet la gestion de droits associés à un utilisateur. %[Doc. Apache|http://httpd.apache.org/docs/2.2/mod/mod_authz_user.html|en] !! N) autoindex_module (shared) Gère le listing des fichiers / répertoires présents en cas d'absence de fichier index.* %[Doc. Apache|http://httpd.apache.org/docs/2.2/mod/mod_autoindex.html|en] !! O) cgi_module (shared) Autorise l'exécution de scripts CGI, et retourne le résultat. %[CGI sur Wikipedia|http://fr.wikipedia.org/wiki/Common_Gateway_Interface|fr] %[Doc. Apache|http://httpd.apache.org/docs/2.2/mod/mod_cgi.html|en] !! P) deflate_module (shared) Permet la compression gzip sur le contenu avant de l'envoyer au client. Gain de bande passante / perte de processeur. %S'active au cas par cas en fonction du type mime des fichiers. %[Doc. Apache|http://httpd.apache.org/docs/2.2/mod/mod_deflate.html|en] !! Q) dir_module (shared) Ajoute automatiquement le / à la fin de l'url demandée par le visiteur s'il s'agit d'un répertoire. (sécurité) %[Doc. Apache|http://httpd.apache.org/docs/2.2/mod/mod_dir.html|en] !! R) env_module (shared) Modifie la configuration fournie aux scripts CGI (cf mod_cgi) et aux pages SSI (en vulgarisant des fichiers de templates spécifiques) %[SSI - Wikipedia|http://fr.wikipedia.org/wiki/Server_Side_Includes|fr] %[Doc. Apache|http://httpd.apache.org/docs/2.2/mod/mod_env.html|en] !! S) mime_module (shared) Gestion des types mime et des informations délivrées au navigateur du visiteur des fichiers en fonction de leur extension. %[Doc. Apache|http://httpd.apache.org/docs/2.2/mod/mod_mime.html|en] !! T) negotiation_module (shared) Permet de délivrer le contenu le plus opportun à un utilisateur; par exemple dans le cas d'un site comprenant plusieurs langues. %[Doc. Apache|http://httpd.apache.org/docs/2.2/mod/mod_negotiation.html|en] !! U) reqtimeout_module (shared) Définit la durée au bout de laquelle une connexion est considérée comme perdue. %Installé par défaut sous ubuntu 10.04 %[Doc. Apache|http://httpd.apache.org/docs/2.2/mod/mod_reqtimeout.html|en] !! V) setenvif_module (shared) Permet de définir des variables d'environnement liées à l'User-Agent du visiteur. %[User-Agent - Wikipedia|http://fr.wikipedia.org/wiki/User-Agent|fr] %[Doc. Apache|http://httpd.apache.org/docs/2.2/mod/mod_setenvif.html|en] !! W) status_module (shared) Donne des informations sur l'état du serveur Apache. %[Doc. Apache|http://httpd.apache.org/docs/2.2/mod/mod_status.html|en] !!! 3) Désactiver les modules Moins de modules seront chargés, moins de failles potentielles seront ouvertes sur notre serveur Apache, plus la sécurité sera renforcée ! %Attention toutefois à ne pas désactiver un maximum de modules, ce qui pourrait compromettre la bonne exécution de vos sites ! %Il convient de ne conserver que les modules qui seront __utiles__ pour le site internet ! %J'ai choisi de désactiver cgi_module, “env_module” et “setenvif_module” qui ne me servaient pas. %Pour ce faire, une commande simple existe : ///[bash] a2dismod cgi a2dismod env a2dismod setenvif /// Si vous ne réussissez pas à trouver le nom du module pour le désactiver, regardez son nom dans le répertoire __/etc/apache2/mods-enabled__. %La commande pour réactiver un module est : /[bash] a2enmod mon_module / Il faut relancer apache pour activer notre nouvelle configuration : /[bash] service apache2 restart /

% !!!! III) Configuration d'Apache Nous allons maintenant modifier la configuration d'Apache afin de le rendre moins verbeux, et plus adapté à notre site :) %Pour ce faire, il faut éditer le fichier /etc/apache2/apache2.conf %Pensez à faire un back-up du fichier avant de le modifier ! !!! 1) Timeout Le time-out est le temps maximal qu'attends Apache lorsque le dialogue avec le navigateur du visiteur est interrompu, ou lorsqu'il reçoit une requête. %Par défaut, le time-out est configuré à 300 secondes, ce qui est très élevé ! Nous allons le réduire à 15 secondes. /[apache] # # Timeout: The number of seconds before receives and sends time out. # Timeout 15 / Sur un très gros serveur cette valeur peut-être encore réduite à 10, voir 5 secondes. De plus cela permet d'éviter certaines formes d'attaques. %[Doc. Apache|http://httpd.apache.org/docs/2.2/mod/core.html#timeout|en] !!! 2) KeepAlive Le KeepAlive permet de ne pas fermer la connexion entre le serveur Apache et le navigateur du client, afin de gagner du temps si le visiteur envoi une seconde requête (page web, image, css, ...). %On parle alors de connexion persistante. !! A) MaxKeepAliveRequests Il s'agit du nombre maximal de requêtes que peut effectuer un client durant sa connexion persistante. %Par défaut le nombre maximal est de 100. Ayant une machine aux capacités très réduites (128Mo de RAM, 256Mhz), je le réduit à 5. %Si vous avez beaucoup de visiteurs, n'hésitez pas à augmenter cette valeur (en faisant attention à la mémoire utilisée par process apache lancé !) [Doc. Apache|http://httpd.apache.org/docs/2.0/mod/core.html#maxkeepaliverequests|en] !! B) KeepAliveTimeout Le KeepAliveTimeout définit le temps qu'attends Apache avant de fermer la connexion persistante. %Par défaut le délai est de 15 secondes, je le diminue à 10. %Si vous avez beaucoup de visiteurs, n'hésitez pas à réduire cette valeur jusqu'à 5, voire 1 : cela évitera de monopoliser des ressources pour rien ! [Doc. Apache|http://httpd.apache.org/docs/2.0/mod/core.html#keepalivetimeout|en] /[apache] # # MaxKeepAliveRequests: The maximum number of requests to allow # during a persistent connection. Set to 0 to allow an unlimited amount. # We recommend you leave this number high, for maximum performance. # MaxKeepAliveRequests 5 # # KeepAliveTimeout: Number of seconds to wait for the next request from the # same client on the same connection. # KeepAliveTimeout 10 / !!! 3) prefork MPM J'ai définit le module prefork précédemment : “Composant de base qui s'occupe d'écouter et répondre aux requêtes.”. %Il s'agit du composant qui s'occupe d'écouter et de délivrer le contenu aux visiteurs. %Il est primordial de bien le configurer :-) %Concrètement, Apache lance des processus (appelés fils). Chacun des fils écoutera et délivrera du contenu à 1 seul client simultanément. !! A) StartServers Il s'agit du nombre de processus fils qui sont créés au lancement du serveur Apache. %Par défaut, la valeur est de 5. %[Doc. Apache|http://httpd.apache.org/docs/2.2/mod/mpm_common.html#startservers|en] !! B) MinSpareServers Il s'agit du nombre minimal de processus fils disponibles pour de nouvelles requêtes. %Si le nombre de processus disponibles est inférieur à cette valeur, Apache créera de nouveaux processus fils, au plus 1 par seconde. %Par défaut la valeur est de 5. %Pour être cohérent, cette valeur doit-être égale à celle de StartServers . %[Doc. Apache|http://httpd.apache.org/docs/2.2/mod/prefork.html#minspareservers|en] !! C) MaxSpareServers Il s'agit du nombre maximal de processus fils disponibles pour de nouvelles requêtes. %La valeur par défaut est de 10. %Cette valeur n'a pas à être modifiée, sauf pour les très gros sites (configurer à 50, voire 100) %Apache assure automatiquement une cohérence entre cette MinSpareServers et MaxSpareServers. [Doc. Apache|http://httpd.apache.org/docs/2.2/mod/prefork.html#maxspareservers|en] !! D) MaxClients Nombre maximum de requêtes à traiter simultanément. Les requêtes supplémentaires sont mise en attente jusqu'à ce qu'un process se libère. %Par défaut cette valeur est de 150. %Cette valeur dépend du succès de vos sites, on peut monter cette valeur à 250 voire 300 (attention à la consommation de mémoire !) %Si on souhaite augmenter cette valeur à plus de 256, il faudra définir également [ServerLimit|http://httpd.apache.org/docs/2.2/mod/mpm_common.html#serverlimit|en]. %[Doc. Apache|http://httpd.apache.org/docs/2.2/mod/mpm_common.html#maxclients|en] !! E) MaxRequestsPerChild Nombre maximal de requêtes traitées par un processus avant qu'il ne s'arrête. %Le principal intérêt de ce paramètre est en cas de fuite de mémoire sur les modules : on évite d'utiliser tout la mémoire du serveur en recyclant régulièrement le process. %La valeur par défaut est 0 (aucune limite de requêtes), je vais la configurer à 60 afin de ne pas tuer mes process trop fréquemment :) %[Doc. Apache|http://httpd.apache.org/docs/2.2/mod/mpm_common.html#maxrequestsperchild|en] ///[apache] <IfModule mpm_prefork_module> StartServers 5 MinSpareServers 5 MaxSpareServers 10 MaxClients 150 MaxRequestsPerChild 60 </IfModule> /// !!! 4) HostnameLookups Cette option permet de faire une résolution DNS des @ IP de nos visiteurs. %C'est à dire qu'au lieu de voire apparaitre 88.191.122.115 dans mon access.log je verrais dedi.anael.eu . %Attention ce paramétrage est lourd pour le serveurs (une requête nslookup par requête Apache !) %Laissons le à Off (valeur par défaut) %Si besoin, nous pourrons toujours utiliser l'outil [logresolve|http://httpd.apache.org/docs/2.2/programs/logresolve.html|en] ultérieurement (par tâche cron dans la nuit par exemple :)) %[Doc. Apache|http://httpd.apache.org/docs/2.2/mod/core.html#hostnamelookups|en]

% !!!! IV) Configuration de la sécurité basique Actuellement notre serveur Apache envoi beaucoup trop d'informations sur sa version aux clients. %Pour résoudre cela, éditons le fichier /etc/apache2/conf.d/security !!! 1) Directory / L'option permet une autorisation d'accès aux dossiers du système par un principe de liste blanche uniquement : On interdit tout par défaut, sauf ce qui est autorisé. %Cette option n'est pas encore activée par défaut, toutefois je l'active afin de me protéger au maximum contre les conséquences d'une intrusion web réussie :) !!! 2) ServerTokens Configure les informations délivrées par Apache sur sa configuration au client. %Cette option est bien évidement à mettre sur une valeur Prod, renvoyant uniquement “Apache” et aucune autre indication de version ! %[Doc. Apache|http://httpd.apache.org/docs/2.2/mod/core.html#servertokens|en] !!! 3) ServerSignature Configure l'apparition d'une ligne d'information sur le type de serveur web (Apache) et le nom de domaine lors de l'affichage de messages générés par le serveur (page d'erreur, listing de fichiers, ...). %Je trouve visuellement plus propre de ne pas afficher cette information, et met donc la valeur de l'option à “Off”. %Les informations délivrées sur Apache sont contrôlées par l'option ServerTokens, pas de risque de fuite subtile par là :=) % %Ce qui donne : ///[apache] # commentaires.... <Directory /> AllowOverride None Order Deny,Allow Deny from all </Directory> # commentaires.... ServerTokens Prod # commentaires.... ServerSignature Off /// % !!!! V) Relancer Apache Voila, notre serveur web est un minima adapté à nos besoins en performance & en sécurité. %Afin que notre nouvelle conf soit prise en considération, on relance Apache en douceur : ///[bash] service apache2 reload /// Le reload permet de faire relire le fichier de configuration à Apache une fois que chaque process fils à finit son travail. %Le restart stoppe immédiatement le process fils pour relancer le serveur (interruption du service pour le client)


Liens