Académique Documents
Professionnel Documents
Culture Documents
Introduction
Un serveur web est un logiciel permettant à des client d'accéder à des pages web, c'est-à-dire en réalité
des fichiers au format html et autre à partir d'un navigateur (aussi appelé browser) installé sur leur
ordinateur distant.
Un serveur web est donc un « simple » logiciel capable d'interpréter les requêtes http arrivant sur le port
associé au protocole HTTP (par défaut le port 80), et de fournir une réponse avec ce même protocole.
Apache
Apache est le serveur le plus répandu sur Internet. Il s'agit d'une application fonctionnant à la base sur les systèmes de type Unix , mais
il a désormais été porté sur de nombreux système dont Microsoft Windows .
Installation d’Apache :
Démarrer le serveur :
cd /etc/init.d/apache start
Centre Espagnol de Formation et d’Actions Intégrées de Développement
I. Paramètres fondamentaux
o ServerType standalone
Le serveur s'exécutera seul, sans recourir au super-serveur xinetd.
o ServerRoot /srv/www
Il s'agit du répertoire où le serveur trouvera son répertoire de configuration
/etc/httpd/httpd.conf
Un lien vers /var/log/httpd/access_log, le fichier-journal des accès aux ressources, réussis
ou non (le consulter)
o PidFile /var/run/httpd.pid
C'est le fichier où le serveur en exécution stocke son premier numéro de processus (PID)
o DocumentRoot /srv/www/htdocs
fixe la racine du serveur Web, c'est-à-dire le répertoire de base où sont cherchées par
défaut les pages html, lorsque l'URL ne comporte pas de chemin de répertoire
o Port 80
Apache écoute sur le port tcp usuel
o User apache (dans commonhttpd.conf)
Group apache
Apache doit etre démarré par root, mais par sécurité ses processus auront pour
propriétaire l'utilisateur apache, sans privilège.
o ServerAdmin root@localhost (dans commonhttpd.conf)
S'il a un problème, le serveur écrit un message à cette adresse
o UserDir public_html
Ce paramètre signifie que l'utilisateur toto peut publier ses pages WEB personnelles dans
un sous-répertoire de son répertoire perso, qui doit être nommé public_html, c'est-à-dire
dans /home/toto/ public_html.
Sa page d'accueil sera alors accessible par l'URL : http://serveur/~toto , où serveur est le
nom du serveur ou son adresse IP.
o DirectoryIndex index.html index.php index.htm ...
Il est courant d'omettre le nom du fichier de la page d'accueil d'un site ou de l'un de ses
sous-répertoires. Pour ne pas retourner systématiquement une erreur 404 signalant une
adresse erronnée, le serveur posséde une liste standard de noms de fichiers qu'il s'efforce
de trouver dans le répertoire.
Cette liste ordonnée est indiquée par la clause DirectoryIndex
o AccessFileName .htaccess
Cette clause fixe le nom du fichier à trouver dans un répertoire pour que son accès soit
protégé, en imposant à l'utilisateur une authentification par nom et mot de passe. Ces
comptes sont spécifiques à Apache et n'interfèrent pas avec les comptes Linux.
Voir une annexe pour explication de sa mise en oeuvre.
o nom de la machine hébergeant Apache. Si ce nom symbolique n'est pas interprété dans
les URL, faute de DNS local, ou de résolution par /etc/hosts, utilisez à la place une
adresse IP du genre http://192.168.0.(200+x), où x=1..9 (ou conformément au plan
d'adressage de la salle)
Tous les étudiants veulent publier leur page personnelle, voire gérer eux-mêmes un site ne désirez pas
les renvoyer aux hébergeurs privés; mais comme "administrateur " du "site officiel" de votre
établissement, vous ne voulez pas les gérer vous-mêmes ...
1. Vérifier bien la présence de la clause UserDir public_html et UserDir disabled root dans le
fichier de configuration httpd.conf.
2. Vérifier la présence ou modifier éventuellement pour avoir une directive (voir la fenêtre en
dessous) .
o Timeout 300
Paramètre important qui fixe le temps (en ms) d'attente maximum du serveur d'une
réponse à une requete envoyée à un programme extérieur (comme un gestionnaire de base
de données)
o KeepAliveon
MaxKeepAliverequests
KeepAliveTimeout
Autorise les connexions persistantes d'un client, afin de lui permettre l'envoi de plusieurs
requetes sans déconnexion, avec un plafond fixé pour un client, pour servir aussi
d'éventuels autres clients ! et un temps d'attente maxi de la requete suivante provenant du
meme client.
o ServerName www
Fixe un nouveau nom public pour le serveur, auquel on pourra s'adresser par les URL
http://www/
Bien entendu le nom symbolique www doit être connu du DNS ou du fichier hosts local
(sous GNU/Linux ou MS/Windows)
o MinSpareServers
MaxSpareServers
Nombres maximum et minimum de processus serveurs devant etre en permannence
disponibles, en attente de nouvelles connexion clientes
o StartServers
Nombre de processus serveurs démarrés à l'initialisation, en plus du processus père. Ceci
explique pourquoi la requete ps aux|grep httpd renvoie 5 PID.
o MaxClients
Nombre maximum de processus qu'Apache peut lancer et gérer simultanément. Ce
nombre ne peut pas excéder 254
o MaxRequestsPerChild
Nombre maximum de requetes HTTP traitées par un processus enfant avant qu'il ne soit
éliminé.
Centre Espagnol de Formation et d’Actions Intégrées de Développement
Installation webmin :
cd /etc/init.d/webmin start
-Entrer le chemin de répertoire qui contient le site du client dans la zone Répertoire racine des
documents
-Entrer le nom de domaine du client dans la zone Nom du serveur exp : www.client.be
-Pour tester taper dans l’URL l’adresse ip introduite dans la zone Adresse
Centre Espagnol de Formation et d’Actions Intégrées de Développement
Protéger un répertoire
DocumentRoot /var/client1
<Directory "/var/client1">
Options Indexes
</Directory>
<Directory "/var/client1/admin">
AllowOverride AuthConfig
Options Indexes
AuthType Basic
require user
Satisfy all
AuthUserFile /var/client1/admin/.htpasswd
</Directory>
Fichier .htaccess
Il peut arriver que les caractères accentués s'affichent mal. Dans ce cas, l'encodage est
mis en cause. Si le fichier est écrit dans un certain encodage mais que le navigateur
s'attend à en recevoir un autre, les caractères accentués apparaissent mal. Dans ce cas,
plusieurs solutions sont possibles.
Si l'on force l'encodage utilisé par le système, les pages crées sur cette machine seront écrites
dans cet encodage. Il est dès lors inutile de le préciser au travers d'une balise meta.
Les fichiers créés sur cette machine seront écrits l'encodage utilisé par défaut sur la machine. Il
sera inutile de le préciser dans ce cas également.
nano /etc/apache2/conf.d/charset
2.# In general, it is only a good idea if you know that all your files
3.# have this encoding. It will override any encoding given in the files
5.
6.AddDefaultCharset UTF-8
nano /etc/apache2/envvars
Encore une fois, cela consiste simplement à décommenter la ligne ". /etc/default/locale" :
02.
04.unset HOME
05.
08.SUFFIX="-${APACHE_CONFDIR##/etc/apache2-}"
09.else
Centre Espagnol de Formation et d’Actions Intégrées de Développement
10.SUFFIX=
11.fi
12.
13.# Since there is no sane way to get the parsed apache2 config in scripts, some
14.# settings are defined via environment variables and then used in apache2ctl,
16.export APACHE_RUN_USER=www-data
17.export APACHE_RUN_GROUP=www-data
18.export APACHE_PID_FILE=/var/run/apache2$SUFFIX.pid
19.export APACHE_RUN_DIR=/var/run/apache2$SUFFIX
20.export APACHE_LOCK_DIR=/var/lock/apache2$SUFFIX
22.export APACHE_LOG_DIR=/var/log/apache2$SUFFIX
23.
25.export LANG=C
26.## Uncomment the following line to use the system default locale instead:
27.. /etc/default/locale
28.
29.export LANG
30.
Comme à chaque fois que l'on modifie ses fichiers de configuration, il faut relancer apache2 pour
que les modifications soient prises en compte :
Centre Espagnol de Formation et d’Actions Intégrées de Développement
Il ne reste plus qu'à rafraîchir la page au niveau du navigateur pour que tout s'affiche correctement.
Remarque : si les caractères accentués s'affichent toujours mal, essayez de vider le cache de votre
navigateur. Par exemple, si vous utilisez firefox (iceweasel), cliquez sur "Outils > Supprimer
l'historique récent".
Les droits
Droits UNIX/POSIX
Pour qu'un site soit sécurisé, il faut notamment attribuer aux fichiers mis à disposition des droits
aussi restreints que possible.
A priori le fichier /srv/www/htdocs/index.html, au même titre que n'importe quelle page web
accessible depuis un navigateur web, devrait avoir les droits suivants :
Comme mentionné dans le fichier /etc/apache2/envvars, un client aura au niveau du système linux
les droits de l'utilisateur www (voir la distribution utilisée)et du groupe www-data.
Pour des raisons évidentes de sécurité, il faut que ce groupe ait des droits aussi restreints que
possible tout en autorisant l'accès au fichier auxquels un client web peut avoir légitimement accès :
L'utilisateur propriétaire ne doit pas être www-data. On utilise les droits suivants :
o droits en lecture (r) écriture (w) sur les fichiers réguliers,
o droits en lecture (r) écriture (w) exécution (x) sur les répertoires.
Le groupe propriétaire doit être www (voir la distribution utilisée):
o les droits en lecture (r) sur les fichiers réguliers et répertoires auxquels il est sensé
pouvoir accéder,
o aucun droit pour le reste.
Les autres utilisateurs ne sont pas censés avoir de droits sur ces fichiers.
Remarques :
Afin qu'un client ne puisse par modifier ces droits, on attribue les fichiers de /srv/www/htdocs
au groupe www (voir la distribution utilisée)et non à l'utilisateur www-data. C'est la raison pour
laquelle les fichiers présents dans /srv/www/htdocs appartiennent en général à l'utilisateur root.
Il est important que le groupe www (voir la distribution utilisée)ait les droits en lecture sur les
fichiers que les internautes doivent pouvoir consulter, sans quoi ils verront s'afficher une page
d'erreur 403 (permission denied). Dans ce cas, l'erreur d'accès sera répercutée par défaut dans
Centre Espagnol de Formation et d’Actions Intégrées de Développement
Exemple :
Droits ACL
Si plusieurs personnes sont susceptibles de développer le site, il peut être intéressant d'utiliser des
droits ACL via les commandes getfacl et setfacl. Rappelons que les droits ACL sont symbolisés par
un "+" à droite des droits habituels.
Droits SELinux
On peut durcir ou relâcher la politique d'accès aux fichiers partagés par apache grâce aux
commandes chcon et restorecon fournies par SELinux (Security Enhanced Linux). SELinux permet
par exemple de n'autoriser l'accès à ce fichier que pendant l'exécution d'apache2. Si une erreur
d'accès liée à SELinux survient, celle-ci sera retranscrite dans /var/log/messages.
Corriger l'erreur " Could not reliably determine the server's fully qualified domain name, using
127.0.1.1 for ServerName".
1.ServerName localhost
Sécurisation
Introduction
Cette section n'est pas exhaustive mais référence quelques précautions à prendre.
Limiter les droits : il est primordial d'attribuer des droits aussi restreints que possible sur les
fichiers mis à disposition sur une machine. Cet aspect a déjà été abordé dans ce tutoriel.
Diffuser un minimum d'informations sensibles : un pirate informatique utilise souvent des
exploits qui consistent souvent à tirer parti d'une faille de sécurité dans l'implémentation d'un
logiciel. Souvent ces bugs sont corrigés dans les mises à jours qui suivent et sont donc
Centre Espagnol de Formation et d’Actions Intégrées de Développement
spécifique à une version de ce logiciel. C'est pourquoi il est souhaitable de masquer autant que
possible ce genre d'informations lorsque le serveur est accessible sur Internet. Apache2 propose
au niveau de ses fichiers de configuration ce genre de personnalisations.
Limiter la portée des fichiers : auxquel peut accéder un client : un internaute ne devrait jamais
être en mesure de sortir de l'arborescence associé au site (/srv/www/htdocs dans notre exemple).
Si par exemple, il est en mesure d'accéder en dehors de cette arborescence, il est susceptible
d'accéder à des fichiers sensibles comme /etc/passwd et avoir une idée des logins à attaquer.
Limiter les accès réseaux : On peut également restreindre les machines autorisées à accéder à
apache2, soit directement dans la configuration du serveur apache, soit à l'aide d'un pare-feu
(voire des deux). On pourra utiliser par exemple des outils comme Iptables
Chiffrer les communications grâce à SSL :
Effectuer un audit de sécurité. En complément, on pourra utiliser des outils comme
nikto, wapiti, w3af...
01.#
02.# Disable access to the entire file system except for the directories that
04.#
05.# This currently breaks the configurations that come with some web application
07.#
08.#<Directory />
12.#</Directory>
13.
14.
15.# Changing the following options will not really affect the security of the
16.# server, but might make attacks slightly more difficult in some cases.
17.
Centre Espagnol de Formation et d’Actions Intégrées de Développement
18.#
19.# ServerTokens
20.# This directive configures what you return as the Server HTTP response
21.# Header. The default is 'Full' which sends information about the OS-Type
24.# where Full conveys the most information, and Prod the least.
25.#
26.#ServerTokens Minimal
27.#ServerTokens OS
28.#ServerTokens Full
29.ServerTokens Prod
30.
31.#
32.# Optionally add a line containing the server version and virtual host
34.# listings, mod_status and mod_info output etc., but not CGI generated
38.#
39.ServerSignature Off
40.#ServerSignature On
41.
42.#
44.#
45.# Set to "extended" to also reflect the request body (only for testing and
47.#
49.#
50.TraceEnable Off
51.#TraceEnable On
Pour chaque site, apache2 parcourt un certain nombre de règles évaluées séquentiellement. Chaque
règle a une portée (indiquant à quelle arborescence elle s'applique). Certaines relâchent des
possibilités, d'autres les contraignent.
1. La première règle évaluée par apache2 devrait consister à limiter l'accès à toute l'arborescence
du système Linux (/).
2. Ensuite, on relâche un minimum de possibilités en fonction des besoins du site.
1.#<Directory />
5.#</Directory>
Cependant, comme mentionné dans ce fichier, décommenter cette section peut provoquer un
dysfonctionnement de certaines applications fournies par les paquets Debian. C'est la raison pour
laquelle on va plutôt définir chacune de ces règles en intervenant dans la configuration spécifique à
Centre Espagnol de Formation et d’Actions Intégrées de Développement
nano /etc/apache2/sites-available/mon_site
01.<VirtualHost *:80>;
02.ServerAdmin webmaster@localhost
03.
04.DocumentRoot /srv/www/htdocs
05.<Directory />
08.Order Deny,Allow
09.
12.
14.Options None
15.
16.AllowOverride None
17.<Directory>;
18.<Directory /srv/www/htdocs/>;
19.AllowOverride None
20.
23.Order Allow,Deny
Centre Espagnol de Formation et d’Actions Intégrées de Développement
25.
27.Options -Indexes
28.
31.Options -FollowSymLinks
32.
35.Options -Includes
36.
39.Options -ExecCGI
40.
41.Options MultiViews
42.</Directory>;
43.
46.AccessFileName .httpdoverride
47.<Files ~ "^\.ht">;
48.Order allow,deny
50.Satisfy All
51.</Files>;
52.
53.ErrorLog ${APACHE_LOG_DIR}/error.log
54.
55.# Possible values include: debug, info, notice, warn, error, crit,
57.LogLevel warn
58.
60.</VirtualHost>;
Il ne reste plus qu'à désactiver le site "default" au profit du site "mon_site" et relancer apache2. En
root :
a2dissite default
a2ensite mon_site
Ceci se règle encore une fois dans le fichier relatif à la configuration du site. Si ce site n'est sensé
être accessible que par la machine sur laquelle le serveur est déployé ou juste par les machines
faisant partie de son réseau locale, une règle devrait le stipuler. De la même manière on peut
blacklister une IP.
Centre Espagnol de Formation et d’Actions Intégrées de Développement
nano /etc/apache2/sites-available/mon_site
01.<VirtualHost *:80>;
02....
03.<Directory /srv/www/htdocs/>;
04....
05.Order Allow,Deny
07....
08.</Directory>;
09.</VirtualHost>;
Rendre le site uniquement accessible depuis la machine faisant office de serveur apache :
1.Order Deny,Allow
1.Order Deny,Allow
1.Order Allow,Deny
Comme d'habitude, pensez à relancer le site une fois ces modifications apportées :
Vous devriez consulter ce lien pour découvrir quelques attaques classiques et ainsi vous en prémunir :
http://www.haypocalc.com/wiki/Injection_de_code
Certaines failles sont liées à l'administration du serveur en lui-même, et d'autres sont liées au code écrit
par le développeur web.
Principe
1. installation du module
2. activation du module
3. relancer apache2.
Au niveau des commandes, nous allons illustrer chacune de ces étapes par celle que l'on taperait sur un
système Debian ou dérivé de Debian, respectivement :
Pour retrouver les noms de modules disponibles dans le gestionnaire de paquets, il est recommandé
d'avoir installé l'autocomplétion bash. On peut également utiliser la commande apt-cache pour les
distributions basées sur Debian.
Exemple :
Centre Espagnol de Formation et d’Actions Intégrées de Développement
Nous allons maintenant détailler ces différentes étapes au travers d'un exemple : PHP5. Nous en
profiterons pour aborder quelques spécificités liées à PHP5.
Comme d'habitude on passe par le gestionnaire de paquets. Sous Debian on tapera en root la commande
:
aptitude install libapache2-mod-php5
Ce paquet casse le MPM worker et engendre l'installation du MPM prefork. Rappelons que le MPM
prefork est moins performant que le MPM worker. Une fois l'installation effectuée on peut vérifier que
php5 est apparu dans /etc/apache2/mod-available. Par contre dans /etc/apache2/mod-enabled, les liens
symboliques qui activent ce module n'est pas forcément présent :
ls -l /etc/apache2/mods-available/php5*
ls -l /etc/apache2/mods-enabled/php5*
En root, on utilise la commande a2enmod qui crée le couple de lien symbolique php5.conf et php.load
dans /etc/mods-enabled et qui pointent vers les fichiers correspondants dans /etc/mods-available. On
aurait pu créer ces liens avec la commande "ln -s ....".
a2enmod php5
En tant que fichiers de configuration, il faut garder à l'esprit que corriger ces liens symboliques sont vus
comme des fichiers de configuration. Ainsi ils ne sont pris en compte qu'au lancement d'apache2, et il
faut donc le relancer. En root :
Nous allons repartir du fichier index.html que nous avons créé auparavant. En root :
mv /srv/www/htdocs/index.html /srv/www/htdocs/index.php
nano /srv/www/htdocs/index.php
Note : il est important que l'extension soit .php (ou .php5). Sinon apache2 ne cherchera pas à interpréter
le php.
Centre Espagnol de Formation et d’Actions Intégrées de Développement
01.<html>
02.<body>
05.<?php
07.?>
08.</body>
09.</html>
Si au lieu de voir la page s'afficher, le navigateur propose de télécharger index.php, il faut corriger
/etc/apache2/httpd.conf en root :
nano /etc/apache2/httpd.conf
On met dedans :
01.<IfModule mod_mime.c>
02.AddType application/x-compress .Z
07.
Centre Espagnol de Formation et d’Actions Intégrées de Développement
08.AddLanguage ca .ca
10.AddLanguage da .dk
11.AddLanguage de .de
12.AddLanguage el .el
13.AddLanguage en .en
14.AddLanguage eo .eo
15.AddLanguage es .es
16.AddLanguage et .et
17.AddLanguage fr .fr
18.AddLanguage he .he
19.AddLanguage hr .hr
20.AddLanguage it .it
21.AddLanguage ja .ja
22.AddLanguage ko .ko
24.AddLanguage nl .nl
25.AddLanguage nn .nn
26.AddLanguage no .no
27.AddLanguage pl .po
28.AddLanguage pt .pt
30.AddLanguage ru .ru
31.AddLanguage sv .sv
34.</IfModule>
Introduction
Si l'on utilise du PHP, il est recommandé d'installer xcache, eaccelerator ou APC (Alternative PHP
cache). Ces outils permettent de compiler au préalable le code PHP et d'augmenter sensiblement les
performances. On peut retrouver un comparatif des performances des différents accélérateur PHP ici.
Nous allons parler ici de xcache qui est disponible sous forme d'un paquet debian, simple à mettre en
place et très performant. Selon le benchmark évoqué ci-dessus, ses performances sont meilleures que
celle proposées par APC et comparable à celle de eaccelerator qui n'est pas disponible sous forme de
paquet debian.
xcache
Installation
Configuration
Centre Espagnol de Formation et d’Actions Intégrées de Développement
nano /etc/php5/apache2/conf.d/xcache.ini
On peut notamment :
corriger la valeur la valeur xcache.count (nombre de microprocesseurs + 1), comme suggéré ici,
augmenter la taille du cache xcache.size,
et régler de nombreux autres paramètres (voir ici).
Test
01.<html>
02.<body>
05.<?php
06.phpinfo();
07.?>
08.</body>
09.</html>
Il ne reste plus qu'à rafraîchir la page dans le navigateur. Si xcache est actif, alors "xcache.ini" devrait
apparaître dans le tableau d'information fourni par apache2.
Sur un serveur servant de plateforme de développement, il est pratique d'afficher les erreurs PHP afin de
détecter les erreurs de syntaxe etc... Pour ce faire, il faut corriger la configuration du module PHP. En
root :
nano /etc/apache2/mods-available/php5.conf
01.<IfModule mod_php5.c>
02.php_value display_errors on
03.<FilesMatch "\.ph(p3?|tml)$">
04.SetHandler application/x-httpd-php
05.</FilesMatch>
06.<FilesMatch "\.phps$">
07.SetHandler application/x-httpd-php-source
08.</FilesMatch>
Centre Espagnol de Formation et d’Actions Intégrées de Développement
12.<IfModule mod_userdir.c>
13.<Directory /home/*/public_html>
15.</Directory>
16.</IfModule>
17.</IfModule>
Enfin, on n'oublie pas de relancer le serveur apache pour que cette modification des fichiers de
configuration soit prise en compte :
Installer MySQL
Ici nous allons nous en tenir à une installation "basique" de MySQL (pas de réplication et pas de proxy
MySQL). L'installation de base est suffisante si la base n'est pas très importante.
Pour aller plus loin dans la configuration d'apache, on pourra se référer à ce site :
http://www.system-linux.eu/index.php?category/Apache2