Mise en place d'un serveur HTTP


Généralités

Un serveur HTTP (ou serveur Web) est un logiciel qui répond à des requêtes du World Wide Web sur un réseau public (Internet) ou privé (intranet), en utilisant principalement les protocole HTTP et HTTPS et leur extensions (WebDAV, etc.).

Lorsqu'il démarre, le serveur HTTP charge les fichiers de configuration et se met en attente de requêtes sur les interfaces réseaux.

Lorsqu'on utilise un navigateur web, on effectue une requête HTTP :
  • • Le navigateur résout le nom de domaine et obtient l'adresse IP du serveur HTTP.
  • • Il envoie une requête HTTP avec la méthode GET à l'IP du serveur sur le port 80 (ou sur le port 443) pour lui demander de retourner un contenu particulier.
  • • Le serveur HTTP reçoit la requête, et en fonction de divers paramètres, va chercher un contenu dans un fichier ou lance un script (en PHP par exemple) qui va générer un contenu.
  • • Le serveur renvoie ce contenu à l'IP du navigateur depuis le même port (80 ou 443).
  • • Le navigateur traite le contenu et le rend accessible à l'internaute (en l'affichant à l'écran par exemple).
Parmi les serveurs HTTP en service sur le Web, 3 acteurs se partagent le marché : Apache, Nginx et Microsoft-IIS, les deux premiers étant en libres. Nous détaillerons ci-dessous en parallèle les procédures d'installation et de configuration des deux premiers.

Installation du serveur Web

Le serveur Apache (resp. Nginx) s'installe avec le paquet éponyme
apt install apache2 (resp. apt install nginx)
Le serveur est automatiquement actif, ce que l'on peut contrôler en l'interrogeant
curl locahlost
ou en contrôlant l'état du service
service apache2 status (resp. service nginx status)
Un certain nombre d'informations liées au serveur HTTP sont accessibles, qu'il faut cacher pour des raisons de sécurité en éditant /etc/apache2/conf-available/security.conf
ServerSignature Off
ServerTokens Prod
pour Apache et /etc/nginx/nginx.conf pour Nginx

Les Headers de sécurité
- Nginx
apt install nginx
curl localhost

Régler le pare-feu (écoute uniquement sur les ports 80 et 443)

Cacher les en-têtes liées au serveur
Infos serveurs
sed -i 's/\# server_tokens/server_tokens/' /etc/nginx/nginx.conf

Headers (https://scotthelme.co.uk/hardening-your-http-response-headers/#server, observatory.mozilla.org)
Apache : Header always set Header_name 'Header_value'
Nginx : add_header Header_name 'Header_value' always;
- Content Security Policy "default-src https: data: 'unsafe-inline' 'unsafe-eval'"
- Strict-Transport-Security "max-age=31536000; includeSubdomains" (à définir dans backend)
- X-Frame-Options "SAMEORIGIN"
- X-Xss-Protection "1; mode=block"
- X-Content-Type-Options "nosniff"




Lorsque vous hébergez vous même votre propre serveur, il est vivement recommandé de mettre en place un pare-feu. En effet, ce sytème de sécurité permet de rendre votre service accessible qu'aux utilisateurs agréés, tout en vous protégeant de l'execution de commandes indésirables.
Nous utiliserons ici ufw, un outil de configuration simplifié du pare-feu Netfliter :

sudo apt-get install ufw

Afin de rendre votre service accesible depuis l'exterieur de votre structure, nous allons procéder à une ouverture de ports. Un port est comparable à une porte permettant au monde exterieur d'accèder à votre serveur via votre routeur ou box internet. Par sécurité, ces ports sont fermés par défaut, il faut donc les ouvrir depuis l'interface d'aministration de votre box ou routeur. Malheureusement, la méthode d'ouverture de ces ports diffère en fonction de chaque forunisseur d'accès internet (SFR, Orange, Free...)...
Cependant, une recherche internet du type "ouverture ports box" suvit du nom de votre fournisseur internet devrait vous permettre de trouver la marche à suivre 😉.

Il vous faudra donc préalablement ouvrir le port 80 sur votre box ou routeur via les protocole TCP et UDP, pour rediriger les utilisateurs externes vers l'adesse IP de votre serveur, adresse qui est en quelque sorte son numéro d'identification internet. Cette adresse IP peut-être récupérée en lançant la commande suivante :

sudo ip a

Ce qui nous donne quelque chose ressemblant à ceci:

1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0@if152:  mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 8e:fb:71:1f:fa:61 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 192.168.1.228/24 brd 192.168.1.255 scope global dynamic eth0
       valid_lft 72407sec preferred_lft 72407sec
    inet6 fe80::8cfb:71ff:fe1f:fa61/64 scope link 
       valid_lft forever preferred_lft forever            

L'adresse IP est ci dessus surlignée en jaune. Nous pouvons faire en sorte que le parre feux accepte les requètes des utilisateurs passant par le port 80 ainsi que les requètes provenant du protocole HTTP :

sudo apt install ufw
sudo ufw allow 80/tcp
sudo ufw allow 80/udp
sudo ufw allow 'Nginx HTTP'


On active ufw au démarage du serveur :

sudo systemctl enable ufw
sudo ufw enable


Vous pouvez vérifier les changements en exécutant :

sudo ufw status

Le résultat de cette commande vous montrera via ces quelques lignes lignes que les trafics exterieurs passant par le port 80 et via le protocole de communication HTTP est désormais autorisé :

To                         Action      From
--                         ------      ----
80/tcp                     ALLOW       Anywhere                  
80/udp                     ALLOW       Anywhere                  
Nginx HTTP                 ALLOW       Anywhere                  
80/tcp (v6)                ALLOW       Anywhere (v6)             
80/udp (v6)                ALLOW       Anywhere (v6)             
Nginx HTTP (v6)            ALLOW       Anywhere (v6)             

Vous pouvez maintenant vérifier que votre serveur est opérationnel en tapant dans la bare d'URL de votre moteur de recherche l'adresse IP que vous avez précédement récupéré, ce qui devrait nous donner :


Si c'est le cas, félicitation ! Votre serveur Ngnix est désormais opérationnel 😁.