====== Apache2 ====== __Serveur Web Apache v.2__ Ce document a pour but d'expliquer succintement comment configurer un serveur apache2 pour heberger un ou plusieurs sites web. Ce document traite des serveurs virtuels (virtual host), du protocole https (web sécurisé SSL) ainsi que de la sécurisation avec les htaccess. Installation de apache2 Le serveur Il est possible d'utiliser plusieurs types de gestion du serveur : * apache2-mpm-perchild - modèle expérimental rapide utlisant les threads (à ne pas utiliser pour un serveur de production) * apache2-mpm-prefork - modèle utilisé traditionnellement par Apache utilisant la duplication de processus (fork) * apache2-mpm-worker - modèle rapide utilisant les threads (modèle conseillé) Pour installer apache2 sous Debian : apt-get install apache2 apache2.2-common apache2-mpm-worker apache2-utils libapr0 openssl ssl-cert PHP Pour heberger des pages dynamique écrites en php : apt-get install libapache2-mod-php5 php5-cli php5-common php5-gd php5-imap php5-mysql libzzip-0-13 Perl (CGI) Pour utiliser les script Perl (cgi) avec apache2 : apt-get install libapache2-mod-perl2 libdevel-symdump-perl libwww-perl Structure du repertoire de configuration (/etc/apache2) En général, le repertoire de configuration se situe dans /etc/apache2. Il contient les fichiers et repertoires suivant : * apache2.conf : fichier de configuration principal * httpd.conf : fichier permettant la compatibilité avec l'installation d'application prévue pour apache (v1) * mods-available : repertoire contenant les modules à charger (*.load) et leur configuration (*.conf) * mods-enabled : repertoire contenant les liens symboliques vers les fichiers de configurations (et de chargement) du repertoire mods-available devant etre utilisé (chargé) par le serveur. * sites-available : repertoire contenant les configurations des serveurs web (virtual hosts) disponibles * sites-enabled : repertoire contenant les liens symboliques vers les configurations virtual hosts du repertoire sites-available devant etre utilisé (chargé) par le serveur. * conf.d : repertoire contenant les fichiers de configuration supplémentaire (anciennement concaténés au fichier httpd.conf) * magic : fichier contenant des informations sur les types MIME gérés par le module mod_mime_magic * ports.conf : fichier contenant la liste des ports sur lesquels pache2 doit ecouter pour fournir son service. * envvars : fichier permettant de modifier les variables d'envirronement d'apache2 * ssl : repertoire contenant la clé et le certificat d'authentification du serveur web ssl (protocole https port 443) Limitations des connexions contre les DoS Pour éviter les Dénis de Services (DoS), il est important de régler quelques paramètres dans /etc/apache2/apache2.conf selon votre connexion : # KeepAlive: Autoriser les connexions permanentes KeepAlive On # MaxKeepAliveRequests: Nombres de connexion permanentes (il est conseillé de # laisser une valeur élevée sauf si vous utilisez une machine peu performante) MaxKeepAliveRequests 50 # KeepAliveTimeout: TimeOut d'une connexion permanente (laisser tel quel) KeepAliveTimeout 15 ## ## Server-Pool Size Regulation (MPM specific) ## # prefork MPM !!!PAS UTILISE : apache2-mpm-prefork!!! StartServers 3 MinSpareServers 3 MaxSpareServers 10 MaxClients 15 MaxRequestsPerChild 0 # pthread MPM !!! apache2-mpm-worker !!! # StartServers ......... Nombre de processus serveur lancé au démarrage # MaxClients ........... Nb de maximum processus serveur autorisé (nb de clients) # MinSpareThreads ...... Nombre minimum de threads disponibles # MaxSpareThreads ...... Nombre maximum de threads disponibles # ThreadsPerChild ...... Nombre constant de threads par serveur # MaxRequestsPerChild .. Nombre Maximum de requetes acceptées par serveur # # Ces paramètres sont à configurer selon la puissance de votre machine # et le débit de votre connexion internet. Si vous souhaitez utiliser # apache avec un petite connexion (128kb/s d'upload), divisez par 2 voire 3 # les paramètres MaxClients, MinSpareThreads, MaxSpareThreads et ThreadsPerChild # StartServers 2 MaxClients 100 MinSpareThreads 20 MaxSpareThreads 65 ThreadsPerChild 20 MaxRequestsPerChild 0 # perchild MPM !!!PAS UTILISE : apache2-mpm-perchild!!! NumServers 3 StartThreads 3 MinSpareThreads 3 MaxSpareThreads 10 MaxThreadsPerChild 20 MaxRequestsPerChild 0 AcceptMutex fcntl Gestion des erreurs Lorsqu'une requetes ou une de vos pages génére une erreur, apache affiche une page d'erreur. La fameuse erreur 404 pour une page inexistante. Vous pouvez utilisez les pages par défault de apache ou créer une page personnalisée. Cette dernière est toujours plus conviviale et montre que vous soigner votre site. Vous pouvez aussi créer un script qui envoye par exemple un email avec des informations (page référente...). Il y a plusieurs manières de configurer ces pages. Directe Remplacer, par exemple, la ligne de apache2.conf : ErrorDocument 404 /error/HTTP_NOT_FOUND.html.var par celle-ci en écrivant entre guillemets ce que vous voulez afficher : ErrorDocument 404 "Page inconnue par le serveur. Contactez l'admin Alias /error/ "/usr/share/apache2/error/" par Alias /error/ "/var/www/error/" Pour ne pas avoir de problème, copier dans un premier temps les pages d'erreurs par défault dans ce répertoire : cp /usr/share/apache2/error/* /var/www/error/ puis affecter l'utilisateur apache (www-data) comme propriétaire du repertoire et de ses fichiers : chown -R www-data:www-data /var/www/error Le nom des pages est du type HTTP_NomErreur.html.var . Vous pouvez personnaliser ces pages : * en les editant. Si vous souhaitez gérer plusieurs langues mettez le bloc : Content-language: fr Content-type: text/html; charset=ISO-8859-1 Body:----------fr-- devant le corps de votre page de la langue choisie (ici fr : français). Pour mettre une autre langue, ajoutez un autre bloc du meme type et le corps correspondant à la suite ... * en créant une nouvelle page dans ce repertoire et en, en commentant la ligne correspondant à l'erreur (en mettant le caractère # devant celle-ci) : #ErrorDocument 404 /error/HTTP_NOT_FOUND.html.var * et en ajoutant la ligne correspondante: ErrorDocument 404 /error/mapage_404.php Redirection extérieur Meme principe que la redirection locale sauf que le serveur va chercher les pages d'erreur sur un autre serveur. Exemple : ErrorDocument 503 http://autre.serveur.com/ausecours.html Gestion des logs Je traiterai de cette partie, au moment ou je ferai la doc sur la génération de statitisques (webalizer ou awstats). Virtual Hosts Supposons que votre serveur héberge plusieurs sites. Dans le cas général, pour accéder à vos différents sites vous tapez une adresse tel que http://mondomaine.com/site1, http://mondomaine.com/site2 ... Grace aux hotes virtuels d'apache2 vous pouvez par exemple acceder à ces sites avec les adresse http://site1.mondomain.com, http://site2.mondomain.com, ... Je vous conseille de stocker vos sites dans /var/www/ (i.e. : /var/www/site1/, /var/www/site2/). Comme expliqué plus haut, les fichiers de config des virtual hosts ce trouvent dans /etc/apache2/sites-available/. Allez dans ce repertoire. Pour commencer la configuration le plus simple est de copier la configuration par default puis la modifier : cd /etc/apache2/site-available cp default site1 Editez site1 : # Nom du Virtualhost : port ( ici site1:80 (port http) ) ServerAdmin webmaster@mondomain.com # Nom du serveur ServerName site1 # Définition du répertoire racine du site toto DocumentRoot /var/www/site1/ Options FollowSymLinks AllowOverride None # Définition du répertoire racine du site1 Options Indexes FollowSymLinks MultiViews AllowOverride None Order allow,deny Allow from all # Pour inserer un repertoire de script (cgi) # Enlever cette section si vous n'utilisez pas de tel script ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ AllowOverride None Options ExecCGI -MultiViews +SymLinksIfOwnerMatch Order allow,deny Allow from all # Si on veut un fichier de logs d'erreur propre à site1 ErrorLog /var/log/apache2/error_site1.log LogLevel warn # Si on veut un fichier de logs d'accès propre à site1 CustomLog /var/log/apache2/access_site1.log combined ServerSignature On # Insere le repertoire contenant les icones correspondant # aux type MIME Alias /icons/ "/usr/share/apache2/icons/" Options Indexes MultiViews AllowOverride None Order allow,deny Allow from all # Insere le repertoire contenant la documentation apache # ce repertoire n'est accessible qu'en local # Section à enlever sur un serveur de production Alias /doc/ "/usr/share/doc/" Options Indexes MultiViews FollowSymLinks AllowOverride None Order deny,allow Deny from all Allow from 127.0.0.0/255.0.0.0 ::1/128 Pour activer ce site, il vous faire le lien symbloqiue vers ce fichier dans /etc/apache/sites-enabled et relancez apache : ln -s /etc/apache2/sites-available/site1 /etc/apache2/sites-enabled/ /etc/init.d/apache2 reload Pour tester, il suffit de tapez http://site1.mondomain.com. Et là, çà marche pas !! C'est normal, car votre ordinateur ne sait pas résoudre site1.mondomain.com (obtenir l'adresse ip). Pour resoudre ce problème, soit vous installez un serveur DNS (cf howto Bind) si vous souhaitez que votre serveur virtuel soit accessible depuis l'extérieur, soit pour tester modifiez votre /etc/hosts (ajoutez site1.mondomain.com à la fin de la ligne de l'ip du serveur ): 127.0.0.1 localhost site1.mondomain.com #par exemple Relancez Apache et cela devrait marcher cette fois-ci. Vous pouvez faire çà autant de fois que vous voulez avoir d'hôtes virtuels. Support SSL sur Apache 2 Création des certificats Sous Debian, pour générer les certificats de votre site, utiliser la commande : apache2-ssl-certificate Je vous laisse le soin si vous le souhaiter de générer vos certificats vous-memes. Par contre, il est conseillé de mettre ces certificats dans le repertoire /etc/apache2/ssl/. Configuration de Apache Apache 2 est installé avec le module ssl sous Sarge. Il ne s'agit pas d'un paquet supplémentaire. Il suffit de le charger (il existe 2 manières): * soit en créant à la main deux liens symboliques entre /etc/apache2/mods-enabled/ et ssl.conf et ssl.load (qui se trouvent dans le répertoire /etc/apache2/mods-available/ ) : ln -s /etc/apache2/mods-available/ssl.* /etc/apache2/mods-enabled/ * soit en utilisant a2enmod ssl qui fait la même chose. Il vous faut ensuite éditer le fichier ssl.conf. Ajouter simplement une ligne à la fin du fichier (avant le ): SSLCertificateFile /etc/apache2/ssl/apache.pem Ensuite, ajoutez au fichier ports.conf la ligne suivante : Listen 443 Configuration de votre VirtualHost Deux possibilités : * a2ensite ssl.conf : crée un VirtualHost "SSL aware" * créez un VirtualHost contenant la directive SSLEngine on, par exemple en ajoutant un nouveau fichier /etc/apache2/sites-available/ssl-default : NameVirtualHost *:443 ServerAdmin yourmail@mail.com SSLEngine on DocumentRoot /var/www/ Options FollowSymLinks AllowOverride None Options Indexes FollowSymLinks MultiViews AllowOverride None Order allow,deny allow from all RedirectMatch ^/$ /apache2-default/ HTAccess et autres ... Les fichiers “.htaccess” permettent de donner des directives au serveur apache. Je vais aborder seulement le côté limitation d'accès aux fichiers. Ces fichiers sont mis dans le répertoire ou un sous repertoire des sources du site. Les directives définies dans ce fichier sont applicables au répertoire dans lequel il se trouve et dans ses sous-répertoires. Rmq : Sous unix, le fichier .htaccess est un fichier caché. (vous pouvez le lister dans un repertoire avec la commande “ls -a”). Restriction d'accès Directive Order Cette directive permet de définir l'ordre d'évaluation des directives Deny et Allow * Deny,Allow : les directives Deny sont évaluées avant les directives Allow. L'accès est autorisé par défault pour les clients qui ne sont pas définis dans les directives Deny. * Allow,Deny : les directives Allow sont évaluées avant les directives Deny. L'accès est interdit par défault pour les clients qui ne sont pas définis dans les directives Allow. Par default, l'ordre est Deny,Allow. Attention il ne faut aucun espace entre Allow et Deny, seulement une virgule. Directive Allow Cette directive définie les clients autorisés à accéder au serveur. Le client peut être un nom de machine, une adresse ou une plage d'IP. Le premier argument de cette directive est toujours from : Allow from ... Les arguments suivants peuvent être de 3 formats différents. Si “Allow from all” est spécifié, tous les clients ont le droit d'accès. Pour autoriser l'accès seulement à certaines machines ou groupes de machines, celles-ci doivent être définies comme suit : * Un nom de domaine (partiel) Exemple : “Allow from espace.fr.to” Les machines qui correspondent à ce nom de domaine et ses sous-domaines (ex. lan.espace.fr.to) sont autorisés. Ceci necessite que le serveur apache puisse faire des requêtes de reverse DNS. * Une adresse IP complète Exemple : “Allow from 192.168.1.1” L'adresse ip correspondant à une machine est autorisée. * Une adresse IP partiel Exemple : “Allow from 192.168.1” Permet d'autoriser un sous-réseau. * Un couple adresse de réseau/masque Exemple : “Allow from 192.168.1.0/255.255.255.0” ou "Allow from 192.168.1.0/24" Un réseau (a.b.c.d) et un masque (w.x.y.z ou nnn). Pour gérer finement les sous-réseaux. Directive Deny Cette directive définie les clients interdit d'accès au serveur. Le client peut être un nom de machine, une adresse ou une plage d'IP. Les arguments sont identiques à la directive Allow. Autorisations à certains utilisateurs ou groupes d'utilisateurs On peut limiter l'accès au serveur aux utilisateurs ayant un mot de passe. Pour cela, il faut un fichier .htpasswd et rajouter quelques directives dans le fichier .htaccess correspondant au répertoire devant être protégé. Il est possible de filtrer aussi par groupe d'utilisateur avec le fichier .htgroup. .htpasswd Ce fichier contient le nom des utilisateurs et leur mot de passe associé (au format CRYPT). Pour ajouter un utilisateur à ce fichier, il faut utiliser la commande htpasswd2 (pour apache2) comme ceci : htpasswd2 -c .htpasswd utilisateur #une première fois (lorque le fichier n'existe pas) htpasswd2 .htpasswd utilisateur ===== Vérifier la syntax de apache2.conf ===== Taper dans un terminal. # apache2ctl -t Cette commande doit vous retourner **Syntax OK**. ===== Sécuriser un peu Apache2 ===== Par défaut, Apache affiche la version que vous utilisez, votre système d'exploitation, et d'autres informations. Une personne malveillante peut utiliser ces informations pour mieux cibler son attaque sur votre serveur, nous allons donc les cacher. Éditez le fichier /etc/apache2/apache2.conf Recherchez la ligne contenant ** ServerSignature** et mettez **ServerSignature Off** Recherchez la ligne contenant ** ServerTokens** et mettez **ServerTokens Prod**