====== apache2 ======
Quelques infos sur la mise en place d'un serveur [[deb>apache2]] sur une DEBIAN « [[http://www.debian.org/releases/lenny/|Lenny]] ».
===== installation =====
''aptitude'' installera apache en quelques secondes et vous aurez ainsi un serveur web qui répondra en HTTP sur le port 80.
$ sudo aptitude install apache2
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances
Lecture des informations d'état... Fait
Lecture de l'information d'état étendu
Initialisation de l'état des paquets... Fait
Lecture des descriptions de tâches... Fait
Les NOUVEAUX paquets suivants vont être installés :
apache2 apache2-mpm-worker{a} apache2-utils{a} apache2.2-common{a}
0 paquets mis à jour, 4 nouvellement installés, 0 à enlever et 0 non mis à jour.
Il est nécessaire de télécharger 241ko/1211ko d'archives. Après dépaquetage, 4452ko seront utilisés.
Voulez-vous continuer ? [Y/n/?]
Pour vérifier qu'apache2 fonctionne, lancer votre navigateur et dans la barre d'adresse, entrez votre adresse IP. Normalement, vous devriez voir une page web qui indique quelque chose comme « It works ! »
Par défaut, apache2 fournit par DEBIAN sert les pages du répertoire ''/var/www'' qui contient le fichier ''index.html''.
$ cat /var/www/index.html
It works!
Les fichiers de configuration sont stockés dans le répertoire ''/etc/apache2''.
===== configuration sécurité =====
Depuis Lenny DEBIAN fournit un fichier de configuration pour améliorer la sécurité du serveur. Voilà le contenu de ce fichier expurgé de quelques commentaires et quelques lignes vides.
$ egrep -B 1 -v '^#|^$' /etc/apache2/conf.d/security
#ServerTokens Minimal
ServerTokens Full
--
#ServerSignature Off
ServerSignature On
--
#TraceEnable Off
TraceEnable On
Par défaut, le fichier n'apporte rien. Il faudrait au minimum inverser les lignes commentées et celles décommentées. Plus de détails ci-après.
==== ServerTokens ====
La directive [[http://httpd.apache.org/docs/2.2/mod/core.html#servertokens|ServerTokens]] contrôle la chaîne de caractères retournée dans le champs ''Server'' de l'entête HTTP. En spécifiant ''Full'', apache donne son nom, sa version et également le système d'exploitation sur lequel il est installé et les modules ajoutés.
Il est possible de voir ce que retourne un serveur avec ''wget''.
$ wget -S http://localhost
--2009-05-31 22:54:04-- http://localhost/
Résolution de localhost... 127.0.0.1, ::1
Connexion vers localhost|127.0.0.1|:80...connecté.
requête HTTP transmise, en attente de la réponse...
HTTP/1.1 200 OK
Date: Sun, 31 May 2009 20:54:04 GMT
Server: Apache/2.2.9 (Debian)
Last-Modified: Sun, 31 May 2009 20:12:05 GMT
ETag: "120e2e-2d-46b3aec646f28"
Accept-Ranges: bytes
Content-Length: 45
Vary: Accept-Encoding
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: text/html
Longueur: 45 [text/html]
Voilà ce qu'on obtient avec un serveur apache2 installé dans sa configuration par défaut sur DEBIAN « Lenny ». Si on installe des modules complémentaires, apache les indique. Exemple en activant plusieurs modules :
Server: Apache/2.2.9 (Debian) PHP/5.2.6-1+lenny2 with Suhosin-Patch mod_python/3.3.1 Python/2.5.2 mod_ruby/1.2.6 Ruby/1.8.7(2008-08-11) mod_ssl/2.2.9 OpenSSL/0.9.8g mod_perl/2.0.4 Perl/v5.10.0
Si un jour le serveur est sujet à une faille de sécurité, le vilain pirate aura de nombreuses informations sur la version de chacun des modules. Pour rendre le serveur moins éloquant, on pourrait choisir la valeur ''Minimal'' mais ce n'est pas la moins verbeuse, apache indiquera encore sa version complète. Pour obtenir le minimum, il faudra choisir la valeur ''Prod''.
Avec cette valeur, le champ ''Server'' contiendra maintenant :
Server: Apache
On serait tenter de donner de fausses informations en remplaçant ''Apache'' par tout autre chose mais ce n'est pas possible par configuration, il faudra recompiler le serveur ou installer [[mod_security]].
Le but ici est de donner le moins d'information possible à un attaquant éventuel. Le jour où une faille dite « 0 day » touche apache, il est préférable de ne pas être identifié trop vite comme une cible de choix. Ça laisse un peu de temps pour appliquer les mises à jour de sécurité.
==== ServerSignature ====
La directive [[http://httpd.apache.org/docs/2.2/mod/core.html#serversignature|ServerSignature]]. Si la valeur est ''on'' les pages d'erreur affichées par apache contiendront la signature définie dans le paragraphe précédent. En positonnant ''ServerTokens Prod'', seule la ligne suivante sera affichée en bas de chaque page d'erreur.
Apache Server at localhost Port 80
Pour supprimer complétement cette ligne : ''ServerSignature Off''.
==== TRACE et TRACK ====
TRACE et TRACK sont deux types de requête HTTP comme POST ou GET. Le principe est d'envoyer au serveur des données et celui-ci les renvoie. Ces requêtes sont inutiles sur un serveur opérationnel.
La directive [[http://httpd.apache.org/docs/2.2/mod/core.html#traceenable|TraceEnable]] permet d'activer ou désactiver la fonctionnalité TRACE qui devrait être réservée au déverminage.
TraceEnable Off
Par contre, TRACK, qui est une implémentation de TRACE, reste utilisable. Pour désactiver ce type de requête, il faudra utiliser un « rewrite ».
RewriteEngine on
RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK)
RewriteRule .* - [F]
Ces 3 lignes active le moteur de ré-écriture de apache. La deuxième ligne précise que la règle ne s'applique aux requêtes TRACE ou TRACK. Ce type de requête par à la poubelle.
==== bilan de la configuration apache ====
Le fichier ''/etc/apache2/conf.d/security'' final ressemble à
$ cat /etc/apache2/conf.d/security
ServerTokens Prod
ServerSignature Off
TraceEnable Off
RewriteEngine on
RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK)
RewriteRule .* - [F]
==== php ====
Pour rendre PHP moins bavard, il faut positionner la directive ''expose_php = Off'' dans le fichier ''/etc/php5/apache2/php.ini''. Par défaut sous DEBIAN, la valeur est à ''On''.
Avant la modification, voici la réponse à un ''wget -S'' :
HTTP/1.1 200 OK
Date: Thu, 09 Jul 2009 20:45:54 GMT
Server: Apache
X-Powered-By: PHP/5.2.6-1+lenny3
Après la modification :
HTTP/1.1 200 OK
Date: Thu, 09 Jul 2009 20:51:26 GMT
Server: Apache
Le champ ''X-Powered-By'', l'entête HTTP ne donne donc plus d'information sur PHP ni même sur sa présence.
===== configuration SSL =====
Pour utiliser HTTPS, il faut d'abord charger le module ''ssl'' via la commande ''a2enmod''.
$ sudo a2enmod ssl
$ sudo apache2ctl restart
Lors de l'installation, DEBIAN génère un certificat auto-signé. Il permettra d'authentifier le serveur et de chiffrer la connexion mais le navigateur alertera l'utilisateur car il ne connaît pas l'autorité qui a signé le certificat.
==== clé et certificat serveur ====
Pour utiliser la clé et le certificat générés, par exemple, avec la doc [[xca]], il est nécessaire de modifier deux lignes de configuration dans le fichier ''/etc/apache2/site-available/default-ssl''. Dans les lignes :
SSLCertificateFile /etc/ssl/certs/moncertificat.pem
SSLCertificateKeyFile /etc/ssl/private/macle.key
Ces deux lignes désigne l'emplacement du certificat et de la clef privée du serveur, tous deux au format PEM.
==== authentification client ====
La configuration ci-dessous a été extraite du [[http://httpd.apache.org/docs/2.3/fr/ssl/ssl_howto.html|SSL howto apache]] (en français et sous licence Apache License Version 2.0).
Le but est d'authentifier les clients qui disposent d'un certificat SSL par ce mécanisme. Les autres seront authentifiés via une [[http://httpd.apache.org/docs/2.3/fr/mod/mod_auth_basic.html|authentification basique]] simple (:!: en HTTP (sans « s »), le mot de passe de l'authentification basique passe en clair sur le réseau).
=== autorité de certification ===
Pour que le serveur puisse vérifier les certificats présentés par les clients, il doit pouvoir accéder au certificat de l'autoritié de certification. Pour cela, ajouter la directive ''SSLCACertificateFile'' au fichier ''/etc/apache2/site-available/default-ssl''. Apache ne reconnait que les certificats au format PEM.
SSLCACertificateFile /etc/ssl/certs/MaCa.pem
La directive est présente mais commentée dans le fichier fournit par DEBIAN. Il est possible de charger plusieurs certificats de diverses autorités de certification en utilisant la directive ''SSLCACertificatePath'' qui pointera vers un répertoire qui contiendra les certificats (par défaut, ''/etc/ssl/certs/'' contient plus de 200 fichiers, il est préférable de choisir un autre répertoire pour ne les charger tous).
=== définition de l'authentification ===
Dans cet exemple, l'accès au répertoire ''/usr/lib/cgi-bin'' est protégé par une authentification.
$ cat /etc/apache2/conf.d/cgi
# source http://httpd.apache.org/docs/2.3/fr/ssl/ssl_howto.html
# Si HTTPS est utilisé, on s'assure que le niveau de chiffrement est fort.
# Autorise en plus les certificats clients comme une alternative à
# l'authentification basique.
SSLVerifyClient optional
SSLVerifyDepth 1
SSLOptions +FakeBasicAuth +StrictRequire
AuthType Basic
AuthName "Zone privée"
AuthBasicProvider file
AuthUserFile /etc/apache2/htpasswd
Require valid-user
* ''SSLVerifyClient'' : ''optional'' pour permettre au client sans certificat de s'authentifier.
* ''SSLVerifyDepth'' : 1 si vous utiliser votre propre et unique autorité de certification
* ''SSLOptions'' : ''+FakeBasicAuth'' permet de simuler une authentification basique, le DN du certificat devra être déclaré dans le fichier ''htpasswd'' avec ou sans mot de passe chiffré (il ne sert à rien). ''+StrictRequire'' : si le module SSL échoue dans l'authentification, elle s'arrête sans passer à la suite.
Le reste correspond à une configuration [[http://httpd.apache.org/docs/2.3/fr/mod/mod_auth_basic.html|d'authentification basique]] très classique.
Le fichier ''/etc/apache2/htpasswd'' contiendra les utilisateurs authentifier sans SSL et le DN des utilisateurs qui s'authentifie par certificat.
$ cat /etc/apache2/htpasswd
martin:n88yx.lhyNwK2
/C=FR/ST=Labas/L=Chezlui/O=Famille Martin/CN=David/emailAddress=David@famillemartin.net
La première ligne contient le compte de Martin et son mot de passe (vous pouvez essayer de le craquer, c'est bidon ;-) ).
La seconde ligne contient le DN (Distinguished Name) du certificat. Le mot de passe n'est pas utilisé par apache, il n'est pas obligatoire. Si vous ne connaissez pas le DN, charger une page authentifiée avec le navigateur et son certificat, le DN apparaît dans les logs apache ( ''tail -f /var/log/apache2/ssl_access.log'', par exemple).
===== optimiser la bande passante =====
Il existe de nombreux mécanismes pour diminuer les besoins en bande passante d'un site. Au moins deux sont implémentables sur un serveur apache.
=== compression des données ===
La plupart des navigateurs modernes et des serveurs supportent la [[wp>compression de données]]. Pour cela, on utilisera une compression dite [[wp>gzip]] qui utilise l'algorithme de compression [[wp>deflate]]. Certes la compression utilisera plus de ressources côté serveur et client mais ce sera relativement faible à côté des gains en temps de transfert, surtout avec les machines que nous (sous-)utilisons actuellement.
Il faut commencer par activer le module de compression :
# a2enmod deflate
Ensuite, il faut configurer le niveau de compression et surtout le type de fichier compressé. En efet, il est inutile de perdre du temps à compresser des fichiers qui le sont déjà (par exemple des images au format [[wp>jpeg]]).
$ cat /etc/apache2/mods-enabled/deflate.conf
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css image/svg+xml application/xhtml+xml application/xml application/rss+xml application/atom_xml application/x-javascript application/x-httpd-php application/x-httpd-fastphp
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary
SetEnvIfNoCase Request_URI \.(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary
SetEnvIfNoCase Request_URI \.pdf$ no-gzip dont-vary
SetEnvIfNoCase Request_URI \.avi$ no-gzip dont-vary
SetEnvIfNoCase Request_URI \.mov$ no-gzip dont-vary
SetEnvIfNoCase Request_URI \.mp3$ no-gzip dont-vary
SetEnvIfNoCase Request_URI \.mp4$ no-gzip dont-vary
SetEnvIfNoCase Request_URI \.rm$ no-gzip dont-vary
Pour résumer, apache compressera le contenu de type ''text'' mais pas les binaires.
[[http://code.google.com/intl/fr/speed/page-speed/docs/payload.html#GzipCompression|google]] conseille de ne pas compresser les fichiers de moins de 150 octets car cela augmente leur taille mai je n'ai pas trouvé comment faire.
=== utilisation du cache du navigateur ===
Les navigateurs savent utiliser un cache qui leur permet de ne pas télécharger un contenu qui est déjà présente dans le cache. Pour que le cache fonctionne, encore faut-il que le serveur le demande gentillement.
Pour cela, il faut activer le module apache ''expires''.
# a2enmod expires
Comme pour la compression, il est possible de préciser ce qui peut être mis dans le cache et surtout pendant combien de temps.
$ cat /etc/apache2/conf.d/expires.conf
ExpiresActive On
ExpiresByType image/gif "access plus 45 days"
ExpiresByType image/jpg "access plus 45 days"
ExpiresByType image/jpeg "access plus 45 days"
ExpiresByType image/png "access plus 45 days"
ExpiresByType image/x-icon "access plus 45 days"
ExpiresByType text/css "access plus 45 days"
ExpiresByType application/x-javascript "access plus 45 days"
Les images, les feuilles de style et le javascript seront gardés pendant 45 jours depuis le premier accè par le navigateur avant de télécharger de nouveau le contenu. C'est autant d'octets qui ne seront pas transférés et donc du temps de gagner au chargement des pages.
===== extension webdav =====
[[wp>webdav]] est une extension de HTTP qui permet notamment de publier des fichiers sur un serveur web. Apache2 dispose de cette extension.
Commençons par activer les modules apache nécessaire :
$ sudo a2enmod dav dav_fs
Il est également nécessaire d'ajouter quelques directives dans la configuration apache. J'ai choisi de créer un fichier ''webdav'' dans le répertoire ''/etc/apache2/conf.d''.
$ sudoedit /etc/apache2/conf.d/webdav
alias /webdav /repertoire/webdav
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
DAV On
AuthType Basic
AuthName "Zone privée"
AuthBasicProvider file
AuthUserFile /etc/apache2/fichierdemotdepasses
Require valid-user
L'alias indique à apache que l'url ''/webdav'' pointe vers le répertoire ''/repertoire/webdav''. Ce répertoire contiendra les fichiers transférer en webdav. Ce répertoire n'est pas situé dans le répertoire racine du serveur web, les fichiers ne seront donc par accessible par la partie web « classique » (mon explication n'est pas bien claire ...)
Les 3 premières lignes redirige les utilisateurs qui arrivent en HTTP vers HTTPS (pour ce qu'on fait, je préfère).
La directive ''DAV On'' active webdav dans ce répertoire (cette « location » pour être précis).
Les 4 directives suivantes permettent de mettre en place une authentification. La liste des utilisateurs est contenue dans le fichier ''/etc/apache2/fichierdemotdepasses''.
Pour finir, on indique à apache qu'un utilisateur dûment authentifié (''valid-user'') est nécessaire pour utiliser les commandes HTTP : ''GET PUT DELETE PROPPATCH MKCOL COPY MOVE LOCK UNLOCK'', ce sont les commandes utilisées par webdav.
===== plusieurs domaines sur un même serveur =====
bientôt sur vos écrans ;-)
--- //Le 25/11/2009 -- Sylvain Collilieux -- Ce texte est sous licence [[http://artlibre.org/licence/lal/|Art Libre]]//