Lab de durcissement d’un serveur web : corriger une configuration nginx faible et la vérifier avec curl
Ce lab donne à chaque élève un petit site servi par nginx, dont la configuration est faible à dessein. Il affiche son numéro de version, liste ses dossiers, n’envoie aucun en-tête de sécurité et laisse accessibles un dossier .git, un fichier de sauvegarde et une zone d’administration ouverte. L’élève l’examine avec curl, corrige la configuration dans le conteneur en marche, recharge nginx et voit chaque contrôle passer de FAIL à PASS.
Il est conçu par nous à partir de la seule image publique de nginx : il n’y a donc aucune application vulnérable à attaquer, seulement un serveur à rendre plus sûr. La copie du lab n’a aucune route vers internet ni vers un autre élève.
Ce que les élèves apprennent
Ce qu’un serveur web révèle à un visiteur sans qu’on le lui demande : sa version exacte, les fichiers d’un dossier, des fichiers que personne ne voulait publier. Ils lisent les en-têtes de réponse avec curl -I, ajoutent les quatre en-têtes de sécurité courants, désactivent le listage des dossiers et l’affichage de la version, refusent un dossier .git et un fichier de sauvegarde, et ferment une zone d’administration aux visiteurs. Ils s’exercent aussi à tester une configuration avec nginx -t, à la charger avec nginx -s reload et à vérifier le résultat avec un outil. Il convient aux unités de configuration sécurisée et d’administration système ; vérifiez la formulation exacte dans l’unité de votre organisme certificateur.
Le lancer dans votre navigateur
Le site est le service nommé web, et le terminal du lab l’atteint par ce nom. Une commande docker dans le terminal peut consulter, ouvrir, redémarrer et lire les journaux du service du lab : elle ne peut rien créer, télécharger ni supprimer. Le dossier de configuration est un volume nommé, donc ce que l’élève enregistre est encore là après l’arrêt et le redémarrage du lab.
- Ouvrir la page Conteneur. Ouvrez « Créer » dans la barre et choisissez « Lancer un conteneur ». Tout le monde peut ouvrir la page, et le lab Git et le lab SQL se lancent sans compte. Tous les autres labs demandent un compte gratuit : créez-en un, connectez-vous, puis appuyez sur « Démarrer ».
- Trouver le lab. La carte « Laboratoires d’exemple » liste tous les exemples. Trouvez Durcir un serveur web (nginx).
- Appuyer sur Démarrer. « Démarrer » le lance tel quel, en un clic. « Modifier le fichier d’abord » ouvre le fichier compose pour que vous puissiez le changer avant de démarrer.
- L’ouvrir. Sur la page du lab, ouvrez le terminal à côté du lab. Lancez curl -I http://web pour voir les en-têtes et docker exec web lab-check pour voir neuf lignes PASS ou FAIL. Ensuite docker exec -it web sh ouvre un shell dans le serveur : modifiez /etc/nginx/conf.d/default.conf, testez-le avec nginx -t et chargez-le avec nginx -s reload. Le lien du lab, The bakery’s website, ouvre le site dans un onglet.
Que demander aux élèves de rendre
La sortie de curl -I http://web avant et après, et celle de docker exec web lab-check à la fin, pour que le changement soit visible dans le terminal de l’élève. Pour chaque correctif, une phrase de leurs mots sur ce que la faille donnait à un attaquant et sur ce que fait le réglage. Le contrôle dit si le serveur se comporte comme il faut ; seule l’explication dit si cela a été compris. Pour un travail plus poussé, demandez le fichier de configuration complet.
Le contrôle est celui du lab : lab-check interroge le serveur en marche, il indique donc ce que fait nginx et non ce que dit un fichier, et il se termine par un succès uniquement si les neuf lignes passent. Le README du dépôt donne aussi un curl d’une ligne pour chaque correctif, pour vérifier de n’importe où. Rien n’est noté automatiquement.
Une leçon de base sur ce lab
Web Server Hardening Basics est une petite leçon qui se fait dans ce lab, chaque étape étant expliquée et accompagnée d’un bouton Exécuter qui tape sa commande dans le terminal de l’élève. Elle examine les en-têtes et un listage de dossier, lance le contrôle, corrige le numéro de version avec une commande, recharge nginx et vérifie de nouveau. Les autres correctifs sont laissés à l’élève.
Un compte personnel gratuit la reçoit dans le module Basics, qui se trouve sur « Accueil », chaque établissement peut la copier depuis le dossier Basics de la Bibliothèque, et un nouvel établissement l’a dans un module appelé Lab Basics (Sample). Elle est volontairement petite : elle montre à un enseignant ce qu’est une leçon qui se fait dans un lab, et le lab fait le reste. Copiez-la dans un module à vous pour la modifier.
Le code sur GitHub
Le fichier compose lance l’image publique de nginx, figée sur une version, comme seul service, et écrit le site et la configuration faible au démarrage. nginx est sous licence BSD-2-Clause et n’est pas distribué par nous. Le test du dépôt fait passer un élève par le lab, correctif après correctif, sous les mêmes limites que celles de la plateforme. Rien de ce que le site désigne en dehors de lui-même ne peut être récupéré, car le lab n’a aucune sortie vers internet.
En faire un travail
Indiquez dans la tâche quels correctifs faire et ce qu’il faut rendre.
- Créer le lab. Dans votre module, ajoutez une tâche et choisissez la carte « Lab de conteneurs », puis « Dans un dépôt GitHub ». Indiquez https://github.com/mitsurutech/lab-harden-nginx avec la branche main. Le fichier compose par défaut est compose.yaml. Faites d’abord un fork du dépôt si vous voulez le modifier.
- Publier et l’essayer. « Publier » fige le commit qui vous a été montré : un changement ultérieur dans le dépôt ne modifie donc pas un lab que vous avez déjà proposé. Démarrez d’abord votre propre copie.
- Le distribuer. Attribuez-le comme n’importe quelle tâche, avec une échéance si vous le souhaitez, et indiquez dans la tâche ce qu’il faut faire et ce qu’il faut rendre.
- Noter ce qui est rendu. Ouvrez la copie d’un élève et le travail rendu, notez-le et renvoyez-le avec un motif s’il demande un complément.
Questions fréquentes
- Que se passe-t-il si un élève enregistre une erreur dans la configuration ?
- Le lab démarre quand même. Une configuration qui ne passe pas nginx -t au démarrage est conservée à côté sous le nom default.conf.broken et la configuration faible est réécrite. Pour repartir volontairement de la configuration faible, supprimez le fichier .seeded dans /etc/nginx/conf.d et redémarrez le service.
- L’élève doit-il installer quelque chose ou atteindre internet ?
- Non. nginx et curl sont dans l’image du lab, le terminal est dans le navigateur, et la copie du lab n’a aucune sortie vers internet.
- Comment les élèves vérifient-ils que leur durcissement de nginx a fonctionné ?
- Ils exécutent docker exec web lab-check dans le terminal du lab, qui affiche neuf lignes PASS ou FAIL et ne se termine avec succès que si les neuf passent. Il interroge le serveur en marche, donc il indique ce que fait nginx et non ce que dit un fichier, et curl -I http://web montre les en-têtes avant et après.