📃 Labo nginx 3 – Logs, référents et limites

Dans ce labo, vous continuerez à appliquer les meilleures pratiques pour sécuriser un serveur web nginx sur serveurprof.com. Commencez par vous familiariser avec nginx en lisant ce court tutoriel.

Vous êtes prêts? Allons-y! Pour ce labo, vous n’aurez pas besoin de machine virtuelle. Le serveur nginx est déjà installé sur serveurprof.com et vous ferez toutes les manipulations directement sur le serveur. Vous pouvez ouvrir un terminal avec la combinaison des touches CTRL+ALT+T. Attention, il y aura des manipulations semblables à effectuer pour l’examen pratique de la semaine 14 et vous n'aurez pas droit à Internet. Notez toutes vos manipulations et commandes et faites la remise sur Moodle. Assurez-vous de bien comprendre ce que vous faites.

Connectez-vous maintenant en SSH à serveurprof.com avec vos identifiants.

Tip

Pour faciliter votre travail, gardez trois onglets SSH ouverts. Un premier pour le processus actif du serveur, un deuxième pour l'édition du fichier de config et finalement un troisième pour les commandes du terminal.

Voici aussi un rappel des commandes disponibles pour contrôler nginx dans le conteneur Podman :

Commande Usage
nginx_start -p <no de port> Démarre ou redémarre le serveur nginx sur le port de votre choix. Utilisez le même port que dans votre configuration nginx, soit un port entre 1025 et 49151. Vous pouvez arrêter le serveur avec les touches CTRL+C.
nginx_reload Recharge le serveur nginx après une modification de la configuration.

Étape 0 - Préparation des fichiers

Dans votre répertoire utilisateur, vous trouverez le fichiers erreur.php et ref.php. Copiez ces deux fichiers dans le répertoire public_html.

Si vous obtenez un message d’erreur 403 Forbidden lorsque vous ouvrez une url, c’est que vous devez modifier les permissions du répertoire public_html pour permettre la lecture et l’exécution du répertoire et ses fichiers pour tout le monde.

Étape 1 – Loggez les accès et les erreurs

Une bonne pratique en sécurité informatique consiste à conserver la trace de tout ce qui se passe sur le serveur. Dans le cadre de ce labo, nous voulons logger tous les accès au répertoire protégé rapports (voir labo nginx 1) et logger les erreurs partout sur le site.

Créez d'abord un répertoire log dans le répertoire nginx. Modifier les droits d’accès du répertoire log pour que tout le monde (autres) puisse écrire dans le répertoire.

Modifiez ensuite votre configuration nginx pour que tous les accès au répertoire rapports soient loggés dans un fichier nommé access.log dans le répertoire log.

Après avoir modifié la configuration, rechargez le serveur puis testez qu’une entrée de log est ajoutée pour chaque visite à la page suivante:

https://serveurprof.com:<no de port>/rapports/bilan.html

Vous n’avez pas besoin de créer le fichier de log, il sera créé automatiquement.

Modifiez maintenant la configuration nginx pour garder la trace de toutes les erreurs dans le fichier error.log. Le niveau de criticité doit être réglé à warn.

Ouvrez ensuite le fichier erreur.php dans votre navigateur. Une erreur se produit. Vous devriez retrouver la trace de l’erreur dans le fichier de log.

Allez ensuite corriger l’erreur directement dans le fichier PHP. Rechargez la page. Vous devriez maintenant voir une image de bébé avec un pouce en l’air.

Faites une saisie d’écran de l’écran au complet montrant le navigateur et la photo. Nommez la photo etape1.jpg. Téléversez la photo dans un nouveau répertoire nommé screenshots sur le serveur à la racine de votre répertoire utilisateur.

Étape 2 – Désactiver les référents

Dans le bas de la page erreur.php, vous trouverez un lien nommé Continuez ici. Ce lien vous mène à la page ref.php. Par défaut, lorsque vous naviguez d’une page à une autre en utilisant des liens, le navigateur communique votre provenance dans un en-tête nommé HTTP Referer.

Cela peut nuire à la vie privée de vos utilisateurs. Trouvez la bonne configuration nginx afin que le navigateur ne divulgue aucune information sur la provenance des requêtes.

Une fois la configuration modifiée et le serveur rechargé, vous ne devriez plus partager l’information sur votre provenance lorsque vous cliquez le lien dans le fichier erreur.php.

Warning

Vous aurez peut-être besoin de faire un rafraîchissement forcé de la page erreur.php avec les touches CTRL+MAJ+R pour que le référent ne s'affiche plus.

Étape 3 - Limiter le nombre de requêtes par adresse IP

Il peut parfois être utile de limiter le nombre de requêtes par seconde qui peuvent être effectuées à partir d'une même adresse IP. Cela permet de protéger le serveur contre les abus et à améliorer la stabilité et la sécurité de l’application. Voici les raisons principales :

La directive suivante a été ajouté au fichier nginx principal du serveur (auquel vous n'avez pas accès) :

limit_req_zone $binary_remote_addr zone=per_ip_limit:10m rate=2r/s;

Cette directive crée une zone partagée utilisée pour stocker les données de limitation de débit. Voici comment cela fonctionne:

Vous devez maintenant créer une règle dans votre configuration nginx à l'aide de la directive limit_req afin d'appliquer la directive nommée per_limit_ip pour tous les urls dont le chemin d'accès commence par /api/.

Ajustez votre règle pour que le serveur autorise temporairement jusqu’à 5 requêtes supplémentaires en rafale, au-delà de la limite normale (rate), avant de commencer à les refuser. Pour refuser les requêtes au-delà de la limite permise, assurez-vous d'ajouter nodelay à la fin de votre directive.

Pour tester votre configuration, vous pouvez utiliser le script à la racine de votre répertoire utilisateur nommé test_limit.sh. Ce script permet d'effectuer l'envoi de requêtes en rafale vers une URL et d'obtenir le code de réponse pour chaque requête. Lisez le code source du script pour vous familiariser avec son fonctionnement.

Vous devez ensuite modifier les permissions du fichier pour que seul vous puissiez exécuter le script.

Bien! Maintenant créez un nouveau répertoire api dans public_html. Ajoutez-y un fichier vide (avec la commande touch) nommé test.html.

Assurez-vous de régler les permissions du répertoire et du fichier pour que tout le monde puisse les lire et les exécuter.

Une fois cela fait, vous pouvez tester que vous obtenez bien une page blanche (et non un message d'erreur) lorsque vous accédez à l'URL suivant:

https://serveurprof.com:<no de port>/api/test.html

Vous êtes maintenant prêt à exécuter le script test_limit.sh avec votre URL.

Tip

Il faut préfixer l’exécution d’un script par ./ (par exemple ./mon_script.sh) pour indiquer explicitement au shell que le script se trouve dans le répertoire courant.

Quel est le résultat de l'exécution du script? Quels sont les en-têtes HTTP retournées? Cela confirme-t-il que votre règle fonctionne ?

Enlevez maintenant la règle nodelay de votre directive et rechargez la configuration. Exécutez à nouveau le script.

Cela change-t-il le résultat? Pourquoi?

Bravo! Vous avez terminé le labo!