TP n°1 HTTP et SSL

Le but de ce TP est d'installer et de configurer un serveur Apache.

Rapport à rendre au secrétariat pour le vendredi 5 novembre 2004.

Installation

Commencez par effacer le contenu du répertoire /home/httpd pour supprimer les éventuelles installations antérieures.
Récupérez les sources du serveur HTTP sous http://www-igm.univ-mlv.fr/~roussel/DOWNLOAD/ et les décompresser :

 tar jxf httpd-2.0.52.tar.bz2 

Comme les machines de tp sont très lentes, l'archive contient déjà tous les fichiers compilés. Il vous reste donc uniquement à vous placer dans le répertoire décompréssé et à installer le serveur sous /home/http en tapant make install.

Démarrage du serveur

Placez vous dans le répertoire d'installation et démarrez le serveur en tapant :

./bin/apachectl start
Vérifiez avec votre navigateur préféré que votre serveur est lancé en accédant à l'adresse http://localhost:8080/index.html.

Afficher les différentes options de la commande apachectl en la lançant sans arguments. Faites en sorte que le serveur soit démarré et arrété automatiquement au démarrage et à l'arrêt de la machine.

Configuration de base

La configuration du serveur se trouve dans le fichier conf/httpd.conf de votre installation. Retrouvez la directive qui précise la racine de l'arborescence de fichiers qui est exposée et celle qui précise le port d'attachement du serveur.

Requêtes diverses

Testez les requêtes HEAD et TRACE. Pour TRACE vous pourrez également passer pas le proxy de l'université proxyweb.univ-mlv.fr:3128 et envoyez la requête suivante:

TRACE http://www.univ-mlv.fr HTTP/1.1
Host: test
Connection: close


Testez également les requêtes conditionnels : If-modified-since pour la date et If-none-match pour l'en-tête ETag.

Les connexions persistantes

Testez au moyen de la commande netcat si votre serveur supporte les connexions persistantes et le pipeline de requêtes. Modifiez le fichier de configuration du serveur afin que celui-ci ferme les connexions après chaque requête. Testez cette nouvelle configuration.
Vérifiez que la version 1.0 de HTTP ne supporte pas par défaut les connexions persistantes. Testez l'en-tête Connection: keep-alive

Arborescence de documents

Modifiez l'arborescence des fichiers exposés par le serveur pour que la racine pointe sur le manuel (répertoire manual).
Ajoutez sous cette nouvelle racine une page index.html.fr ayant :

  1. un fond blanc ;
  2. un titre ;
  3. un lien vers la documentation d'apache ;
  4. une image (la plume de apache) lien vers le site http://www.apache.org/
Testez l'accès à cette nouvelle page.

Langage préféré

Pour que votre page soit préférée plutôt que celle par défaut, le serveur utilise un gestionnaire de négociation type-map. Retrouvez dans le fichier de configuration la directive qui met en place ce gestionnaire pour le manuel. L'association se fait ensuite via un fichier d'associations qui dans la configuration par défaut est le fichier sans extension de langue (index.html) ou le fichier avec l'extension .var (index.html.var). Retrouvez dans le fichier de configuration la directive qui précise cette extension.
Modifier la configuration de votre navigateur et le fichier d'association index.html pour que votre page soit choisie plutôt que celle par défaut.
Suivez avec ethereal le flux TCP pour voir comment se fait la négociation.

Redirection

Retrouvez dans le fichier configuration par défaut l'exemple de redirection. Le décommenter et le modifier pour que l'URL http://localhost:8080/i2000 pointe sur le serveur d'ingénieurs 2000 http://www.ingenieurs2000.com/.
Suivez avec ethereal le flux TCP pour voir comment se fait la redirection

Virtual Host

Ajoutez une directive VirtualHost afin que les pages retournées lorsque l'on accède à votre serveur avec l'URL http://localhost:8080/ soient différentes de celles qui sont retournées lorsque l'on utilise le nom de la machine (pensez à enlever la configuration du proxy).

Concurrence

Pour pouvoir répondre en parallèle à plusieurs requêtes HTTP le serveur utilise par défaut plusieurs processus. Repérez au moyen de la commande ps -C httpd le nombre de processus qui, par défaut, sont en attente de connexion. En fait, ces processus sont gérés par une piscine (pool) de processus qui fait varier le nombre de processus en fonction des demandes. Retrouvez dans le fichier de configuration les directives correspondant à la piscine de processus et modifiez le nombre de processus disponibles au démarrage du serveur.

Limiter l'accès aux ressources

Dans le fichier de configuration, retirez les commentaires des directives server-status et ExtendedStatus, relatives au module mod_status (apachectl -l pour voir la liste des modules) qui permet d'avoir accès à l'état du serveur. Modifiez les directives de restriction d'accès pour que seuls les clients sur la machine locale aient accès à cette page.

On souhaite maintenant restreindre l'accès à la page à un groupe particulier d'utilisateurs. Pour cela, précisez :

  1. le type d'authentification demandé avec la directive AuthType. Vous lui affecterez la valeur Basic ;
  2. le texte d'invite à afficher au moyen de la directive AuthName, à laquelle vous affecterez une chaîne de caractères entre guillemets ("") ;
  3. le chemin d'accès relatif à la racine du serveur (ServerRoot) du fichier contenant les mots de passe (AuthUserFile) et de celui contenant les groupes (AuthGroupFile). Attention à ne pas donner accès à ces fichiers depuis le Web.
  4. les personnes qui ont accès à la sous-arborescence au moyen de la directive Require. Les valeurs possibles pour cette directive sont :

Pour créer le fichier de mot de passe, il faut utiliser la commande htpasswd livrée avec Apache httpd. Par exemple, la commande suivante crée un nouveau fichier avec l'utilisateur user1 et user2 :

htpasswd -c file user1
htpasswd file user2
Le fichier des groupes contient sur chaque ligne un nom de groupe suivi d'un deux-points (:) suivi d'une listes d'utilisateurs séparés par des espaces.

Au moyen de l'analyseur de flux TCP ethereal, suivre la suite de requêtes/réponses entre le client et le serveur (filtre tcp.port eq 8080). Retrouvez la portion qui contient le mot de passe. Récupérez sous http://igm.univ-mlv.fr/~roussel/DOWNLOAD/ les sources du programme base64 et compilez le (./configure, make et make intall). Utilisez le pour décoder le nom de l'utilisateur et le mot de passe trouvé dans l'en-tête.

SSL

On souhaite maintenant installer une connexion sécurisée vers le serveur via SSL. Pour cela, il faut commencer par créer les clefs et le certificat pour le serveur. Nous allons commencer par nous contenter d'un certificat auto-certifié. Pour cela lancez :

  1. openssl genrsa -des3 -out server.key 1024 ;
  2. openssl req -new -x509 -days 365 -key server.key -out server.crt pour créer le certificat.

Modifiez maintenant le fichier de configuration ssl.conf pour :

Inclure maintenant le module partagé mod_ssl au démarrage de Apache httpd. Pour cela, il faut relancer le serveur avec la commande apachectl -D SSL -k start (directive IfDefine).

Testez la connexion à votre serveur avec la commande suivante :

openssl s_client -connect localhost:3443 -state
Accédez à la ressource https://localhost:3443/server-status avec votre navigateur et vérifiez avec ethereal que vous n'avez plus accès au mot de passe. Vérifiez que votre serveur ne permet pas un accès aux ressources sans chiffrement comme suit :
openssl s_client -connect localhost:3443 -cipher NULL-SHA:NULL-MD5 -quiet

Modifiez la configuration du serveur pour forcer le non chiffrement comme suit :

 SSLCipherSuite NULL-SHA:NULL-MD5 
Vérifiez que votre configuration avec openssl et que votre client n'autorisent pas de telles connexions.

Autorité de certification

On souhaite maintenant jouer le rôle d'autorité de certification. Pour cela créer les clefs et un certificat, comme vous l'avez fait pour le serveur, pour une nouvelle entité que vous nommerez CA (fichiers ca.key, ca.crt). Pour que cette autorité de certification signe le certificat de votre serveur, créez une Certification Signing Request comme suit :

openssl req -new -key server.key -out server.csr
Récupérez ensuite le script sign.sh fournit par le mod_ssl sous http://igm.univ-mlv.fr/~roussel/DOWNLOAD/ pour signer cette CSR.
./sign.sh server.csr
Vous obtenez alors un nouveau certificat que vous devez fournir à votre serveur.

Ajoutez maintenant dans votre navigateur le certificat pour l'autorité de certification que vous venez de créer et testez à nouveau l'accès à l'arborescence sécurisée.