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).
Installation du serveur Web
Le serveur Apache (resp. Nginx) s'installe avec le paquet éponymeapt 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 😁.