logo-netfolio

Mise en place du service web Apache2

Ce tutoriel détaille la mise en place d'un serveur web Apache2 avec VirtualHost ainsi que le chiffrement des communications web via HTTPS.

1. Pré-requis :

Ce tutoriel détaille donc la mise en place d’un serveur web Apache2 sur lequel trois sites web seront hébergés via des VirtualHost, chacun de ces sites seront identifiés par une couleur pour plus de lisibilité.

Au-delà des configurations sur le serveur web il faudra également intervenir sur le serveur DNS.

Ensuite j’aborderai la mise en place d’un mot de passe pour le site « Web1 », ainsi que l’activation de la version sécurisée du protocole HTTP, c’est à dire HTTPS qui chiffre les communications avec SSL/TLS qui sera actif pour le site « Web2 ».

Pour les systèmes d’exploitation utilisés, les serveurs DNS et Web seront sous Debian, en ce qui concerne les tests ils seront effectués via une machine Windows 7 afin d’avoir accès à un client web graphique.

A noter que pour les tests des clients web en ligne de commande tel que « elinks » ou encore « lynx » peuvent êtres utilisés.

Le fonctionnement du service DNS « Bind9 » utilisé ne sera pas détaillé dans ce tutoriel car j’ai déjà redirigé un tutoriel pour ce service.

Le logiciel Wireshark utilisé pour les tests ne sera également pas détaillé plus que nécessaire, car cela n’est pas l’objet de ce tutoriel.

2. Serveur Web - VirtualHost :

Je passe sur l’installation du service web, il suffit seulement d’installer le paquet « apache2 ».

On peut vérifier son bon fonctionnement en tapant l’adresse IP du serveur web dans le navigateur web d’un client graphique, la page ci-dessous doit s’afficher :
Test-Installation-Apache2

2.1. Arborescence :

En premier lieu j’ai créé trois répertoires contenant chacun un site web dans le répertoire de publication « /var/www/ ».

Via la commande « ls -lR » on peut lister la structure créée :
Commande-ls-Repertoire-Publication

La commande ci-dessus liste donc de manière récursive tout le contenu du répertoire de publication dans lequel je me suis déplacé au préalable. Comme on peut le voir trois répertoires(en bleu) on été créés, un pour chaque site, contenant chacun un fichier « index.html »(en rouge).

2.2. VirtualHost :

Maintenant que les trois sites web sont créés, il faut les déclarer dans le fichier « /etc/apache2/sites-enabled/000-default.conf ».

La déclaration d’un VirtualHost se fait de la manière suivante. J’ai donc répété en l’adaptant, la partie ci-dessous autant de fois qu’il y a de VirtualHost, donc trois fois au total :
Configuration-Fichier-Virtualhost

Pour chaque site on ouvre une balise « VirtualHost » indiquant l’adresse et le port d’écoute, ensuite à l’intérieur de cette balise les paramètres du site y seront définis.

Premièrement on indique le nom pleinement qualifié dit FQDN correspondant au site web en question(en vert) et qui, dans ce tutoriel sera abordé un peu plus loin lorsque je parlerai du service DNS(Partie 2.3).

Puis on indique l’adresse mail correspondant au contact de l’administrateur, ce point n’est pas vraiment important ainsi celle-ci peut ne pas corresponde à une adresse existante sans que cela influence le fonctionnement du service web.

Ensuite on indique le dossier créé précédemment contenant le site en question.(en rouge) Enfin on trouve deux directives concernant les logs du service web.(en bleu)

A savoir que nommer la page d’accueil « index.html » permet d’accéder à celle-ci sans prendre la peine de le spécifier dans l'URL, il s’agit en quelque sorte d’une page par défaut.

Les noms par défaut se trouve dans le fichier « /etc/apache2/mods-available/dir.conf »:(en vert)
Configuration-Fichier-dirconf

2.3. Service DNS :

Maintenant il va valoir indiquer sur le serveur DNS les noms pleinement qualifiés correspondant aux sites web présents sur le serveur web, ces noms seront tapés dans le navigateur web afin d’accéder à ces sites.

Pour cela il faut éditer le fichier cache « /var/cache/bind/db.folio.fr » afin d’ajouter un enregistrement de type A correspondant au serveur web :
Fichier-DNS-RR-A

Donc ci-dessus on indique le FQDN du serveur web « Sweb » ainsi que son adresse IP.

Ensuite toujours dans le même fichier il faut maintenant indiquer le nom des sites web via les noms canoniques(CNAME) :
Fichier-DNS-RR-CNAME

Plusieurs choses sont à noter, en premier lieu les noms canoniques permettent la redirection de plusieurs noms vers un seul FQDN, ce que l’on souhaite étant donné que les différents sites web sont sur un seul serveur web.

Donc ici on déclare les trois sites correspondants à « Web1 », « Web2 » et « Web3 » renvoyant à la déclaration précédente du serveur web.

Pour finir on peut, dans le cas ou cela a été fait sur le serveur DNS, compléter le fichier d’enregistrement inverse « /var/cache/bind/rev.folio.fr » afin d’indiquer le serveur web :
Fichier-DNS-RR-PTR

A noter que les noms canoniques ne sont pas à indiquer dans ce fichier.

Les VirtualHost sont maintenant opérationnels, les tests seront abordés dans la dernière partie de ce tutoriel.

3. Htaccess :

Apache2 offre la possibilité d’une protection via « login/password » d’un répertoire permettant ainsi de pouvoir mettre en place une authentification sur une partie ou un site, dans le cas d’un espace administrateur par exemple.

La génération du fichier se fait via une commande et il est conseillé d’éviter de stocker ces fichiers dans le répertoire de publication pour des raisons évidentes de sécurité

Dans un premier temps j’ai donc créé un répertoire ayant pour but de stocker ces fichiers « .htaccess » contenant les utilisateurs autorisés :
Commande-Mkdir-Htaccess
Une fois créé je m’y suis déplacé puis à l’aide de la commande ci-dessous(en rouge) j’ai ajouté un nouveau « login/password » :
Commande-Htaccess-Login-Mdp

L’argument « -c » de la commande « htpasswd » permet de créer le fichier contenant les informations d’authentifications ici « authWeb1 », dans le cas contraire un fichier existent doit être indiqué. Ensuite l’utilisateur créé s’appelle « admin » et mot de passe est demandé une fois la commande entré.

Pour finir, via la commande « ls » on vérifie que le fichier a bien été créé.

Ensuite il faut créer un fichier caché dans le répertoire à protéger :
Fichier-Htaccess

Dans ce fichier plusieurs choses sont indiquées, la directive « AuthName » permet d’afficher un message lors de la demande d’authentification.

Puis on indique que l’authentification se fait via un fichier(en bleu) puis ensuite on précise lequel via la directive « AuthUserFile ».

Enfin la dernière ligne permet d’autoriser uniquement les utilisateurs valides.

Pour finir il faut de nouveau éditer le fichier « /etc/apache2/sites-enabled/000-default.conf » :
Fichier-Apache2-000-Default

Il faut ajouter dans le VirtualHost concerné par l’authentification Htaccess la partie ci-contre permettant d’utiliser ce système d’authentification.

Les directives permettant cela(en vert) permettent respectivement la recherche systématique d’un fichier « .htaccess » puis l’obligation pour les utilisateurs de s’authentifier.

4. HTTPS :

Lors de cette dernière partie j’aborderai l’activation du protocole HTTPS de plus, le but va être de faire en sorte que toute requête HTTP soit obligatoirement redirigé vers sa version sécurisé si cela est possible.

Le site « Web2 » sera sécurisé via HTTPS.

Il va falloir commencer par générer un certificat qui, dans ce tutoriel sera auto-signé. C’est à dire qu’il ne sera pas validé par une autorité de certification(AC), ce qui au passage est payant.

C’est pour cela que les navigateurs utilisés pour les tests ne reconnaîtrons pas la connexion comme sécurisé, cependant je vais démontrer à l’aide du logiciel Wireshark que les communications sont bien chiffrées.

Donc pour commencer il va falloir générer le certificat auto-signé via la commande ci-dessous, si celle-ci n’est pas disponible il suffit d’installer le paquet « openssl » :
Commande-Openssl-Création

Cette commande mérite quelques explications, « req -x509 » indique la norme utilisée pour le format du certificat généré.

Ensuite « -nodes » qu’il faut lire comme « no DES » indique que l’algorithme de chiffrement utilisé pour la clé privée ne sera pas le DES.

« -days 365 » définit la durée de validation du certificat.

Puis « -newkey rsa:2048 -sha256 » indique la génération d’une nouvelle clé avec l’algorithme de chiffrement RSA d’une longueur de 2048 bits, couplée à l’algorithme de hachage SHA256 permettant d’obtenir un condensat d’une longueur de 256 bits.

Pour finir « -out /etc/apache2/server.crt » et « -keyout /etc/apache2/server.key » précisent respectivement les emplacements des fichiers générés contenants le certificat et celui contenant la clé privée.

Une fois la commande entrée plusieurs questions sont posées afin de définir les informations du certificat.

Il suffit donc d’y répondent, elles sont relativement clairs :
Commande-Openssl-Création-Questions

La partie en rouge représente les questions posées, à noter que l’utilisation du point permet de laisser le champ vide.

Ensuite on peut vérifier la génération des deux fichiers à l’aide de la commande « ls » :
Commande-ls-Certificat

Il faut maintenant savoir que la configuration des sites hébergés sont présent dans deux répertoires:

Par défaut deux configurations sont présentent, la première est une configuration HTTP qui est également activée et qui a été configurée au début de ce tutoriel, la seconde correspond donc aux sites HTTPS mais celle-ci n’est pas activée par défaut.

C’est pourquoi il faut maintenant modifier le fichier « /etc/apache2/sites-available/default-ssl.conf » :
Fichier-Apache2-000-Default-SSL

Dans le fichier ci-dessus on déclare donc le VirtualHost qui fonctionnera en HTTPS(port 443), ici « Web2 ». Je ne reviendrais donc pas sur ce qui a déjà été expliqué dans la partie 2.2 de ce tutoriel.

Premiérement on indique l’utilisation du protocole SSL/TLS.(en bleu) Ensuite on indique l’emplacement ou se trouve le fichier contenant le certificat ainsi que celui contenant la clé privée.(en rouge) Puis sont indiquées des directives de sécurités permettant de restreindre certaines failles notamment découvertes lors des révélations Snowden.(en vert)

Pour finir avec les fichiers de configuration il faut penser à modifier ce qui a été fait lors de la partie 2.2 de ce tutoriel dans le fichier « /etc/apache2/sites-enabled/000-default.conf » :
Fichier-Apache2-000-Default-Redirect

On conserve donc uniquement la directive précisant le FQDN puis on ajoute la directive « Redirect » afin de rediriger les requêtes HTTP vers HTTPS.

Enfin il ne reste plus qu’à utiliser les commande Apache2 ci-dessous(en rouge) :
Commande-Apache2-A2enmod

Ci-contre le module Apache2 « ssl » est activé.

Ensuite on active les VirtualHost HTTPS, la commande ci-dessous à pour effet la création d’un lien symbolique du fichier « /etc/apache2/sites-available/default-ssl.conf » vers « /etc/apache2/sites-enabled/default-ssl.conf »(en bleu) :
Commande-Apache2-A2ensite

A noté que j’avais déjà entré ces commandes c’est pour cela que j’obtiens ces message.

Pour prendre en compte tous les changements effectués il suffit de redémarrer le service Apache2 :
Commande-Apache2-restart

5. Tests :

Les tests seront donc effectués à partir d’une machine Windows 7 via le client web Mozilla Firefox.

On commence par la connexion au site « Web1 » :
Test-Site-Htaccess-Login

Ci-dessus on remarque plusieurs choses, déjà les noms canoniques indiqués sur le service DNS fonctionnent et me renvoient bien vers le serveur web, cela sera encore testé par la suite en accédant aux deux autres sites.

Ensuite l’authentification Htaccess est elle aussi fonctionnelle comme le montre la fenêtre ci-dessus, et une fois authentifié j’accède bien au site « Web1 » :
Test-Site-Htaccess-Web1
Puis on test la connexion au site « Web3 » :
Test-Site-Htaccess-Web3

Rien de spécial à dire sur ce test hormis le constat du fonctionnement des VirtualHost et noms canoniques.

Enfin on test le site « Web2 » en HTTPS :
Test-Site-Web2-HTTPS

Voici le résultat d’un certificat auto-signé, l’autorité de certification n’étant pas répertoriée dans le navigateur, celui-ci ne peut donc valider le certificat ce qui nous oblige à ajouter une exception en cliquant sur « Avancé »(en rouge), puis « Ajouter une exception... »(en violet) et enfin « Confirmer l’exception de sécurité »(en orange).

Comme on peut le voir, une fois l’exception ajoutée on accède bien au site « Web2 » en HTTPS :
Test-Site-Web2-HTTPS-Certificat

La présence du cadenas fermé à gauche de l’URL le confirme, afin d’être sur on peut afficher le certificat. Pour cela il suffit de cliquer sur le cadenas puis « Plus d’informations », ensuite une fenêtre apparaît(en rouge), il faut alors cliquer sur « Afficher le certificat »(en vert).

Suite à cela le certificat s’affiche(en jaune) et on constate effectivement la présence des informations indiquées lors de sa génération.

Pour prouver la redirection je vais utiliser le logiciel d’analyse de paquet Wireshark, comme précisé au début de ce tutoriel je n’entrerais pas dans le détail de son utilisation, ni des informations qu’il affiche hormis celles utiles :
Test-Site-Web2-HTTPS-Wireshark

Donc pour obtenir le résultat ci-dessus j’ai commencé par indiquer un filtre(en rouge) servant à capturer uniquement les paquets ayant comme adresse IP source ou de destination celle du serveur Web « Sweb ».

Puis pour lancer la capture, il suffit de cliquer sur l’icône ressemblant à un aileron de requin mis en évidence(en bleu).

Après avoir lancé la capture j’ai tapé dans le navigateur web l’adresse « http://Web2.folio.fr », et comme on peut le voir un paquet HTTP de redirection(en violet) m’a bien renvoyé vers la page HTTPS et la suite des paquets sont bien chiffrés via TLS. Le détail du paquet de redirection est mis en évidence dans la partie inférieure de la fenêtre(en orange).

Pour clôturer ce tutoriel je vais mettre en évidence l’importance d’avoir recours au protocole HTTPS au lieu d’HTTP en affichant en clair les identifiants Htaccess du site « Web1 » :
Test-Htacces-Wireshark

Ci-dessus un extrait d’un paquet HTTP, donc non chiffré, intercepté lors de l’authentification Htaccess et on peut remarquer le couple « Login :password » affiché en clair(en rouge).