Nginx : comment configurer l’authentification HTTP basique ?

I. Présentation

Dans ce tutoriel, nous allons voir comment configurer l'authentification HTTP basique sur un serveur Web Nginx pour protéger l'accès à un site par mot de passe. Cet accès peut s'appliquer seulement à une page ou à un dossier spécifiques, ce qui me semble intéressant pour protéger l'accès à une interface d'administration d'un site, tout en laissant la partie publique accessible sans mot de passe.

Si vous avez besoin de mettre en place le serveur Nginx, suivez ce tutoriel : Installer Nginx

II. Protection par mot de passe avec Nginx

Pour ajouter cette authentification, nous allons reprendre la méthode du fichier ".htpasswd". Cela nécessite d'installer le paquet apache2-utils, bien que l'on soit avec un serveur Nginx. Cela n'installe pas Apache en lui-même, seulement quelques outils dont htpasswd.

Mettez à jour le cache des paquets et installez apache2-utils :

sudo apt-get update
sudo apt-get install apache2-utils

Une fois que c'est fait, nous allons créer un fichier qui va contenir un identifiant et un mot de passe. Ce fichier sera stocké dans "/etc/nginx/", se nomme ".htpasswd" et l'on va ajouter l'utilisateur "florian". Ce qui donne :

sudo htpasswd -c /etc/nginx/.htpasswd florian

Il faudra indiquer, deux fois, le mot de passe de l'utilisateur (ce compte n'a aucun lien avec le compte local de Linux).

Remarque : pour des raisons de sécurité, il est important que le fichier .htpasswd ne soit pas créé au sein du répertoire du site Internet directement. De cette façon, il n'est pas accessible aux clients qui visitent votre site Web, mais le serveur Nginx peut y accéder.

On peut considérer que le fichier .htpasswd est une "petite base de données" de comptes utilisateurs dans un fichier à plat. Si l'on regarde le contenu du fichier, on peut voir que le mot de passe n'est pas en clair.

sudo cat /etc/nginx/.htpasswd

Si l'on se réfère à la documentation, on sait que l'on utilise l'algorithme MD5 pour calculer le hash du mot de passe, car la chaîne commence par "$apr1$". Voici ce qui est précisé dans la documentation : " "$apr1$" + le résultat d'un algorithme spécifique à Apache utilisant un condensé MD5 réitéré (1000 fois) de combinaisons variées du mot de passe et d'une source d'entropie sur 32 bits."

Pour créer des comptes supplémentaires et les ajouter au même fichier sans l'écraser, voici la syntaxe à utiliser (exemple pour créer le compte itconnect) :

sudo htpasswd /etc/nginx/.htpasswd itconnect

Maintenant, nous allons configurer notre site sous Nginx pour qu'il prenne en charge l'authentification et notre fichier .htpasswd.

Commençons par ouvrir le fichier de configuration du site :

sudo nano /etc/nginx/sites-enabled/it-connect.tech

Nous devons insérer deux lignes dans notre fichier au sein d'une section "location" du bloc "server" correspondant à notre site.

auth_basic "Zone securisee - Authentification requise";
auth_basic_user_file /etc/nginx/.htpasswd;

L'option "auth_basic" sert à définir le message qui s'affichera au sein de la fenêtre d'authentification, tandis que l'option "auth_basic_user_file" sert à spécifier le chemin vers le fichier .htpasswd.

Pour appliquer l'authentification sur toutes les pages du site, on doit utiliser un bloc "location / { }" pour matcher avec toutes les URL de notre site. Ce qui donne :

Une fois le fichier édité, il suffit de sauvegarder les modifications et de redémarrer Nginx :

sudo systemctl restart nginx

Dernière étape : tester que notre configuration bien. On se rend tout simplement sur notre site, et là une fenêtre d'authentification apparaît ! On doit se connecter avec un compte présent dans le fichier .htpasswd pour accéder au site, sinon on obtiendra une erreur : 401 Authorization Required.

Enfin, si l'on veut que cette restriction s'applique seulement sur l'interface d'administration du site, il faut adapter la directive "location". Si l'interface d'administration est accessible en indiquant "/admin/" dans l'URL, par exemple "https://www.it-connect.tech/admin/", il faut ajouter ce bloc dans le fichier :

location /admin/ {
    try_files $uri $uri/ =404;
    auth_basic "Zone securisee - Authentification requise";
    auth_basic_user_file /etc/nginx/.htpasswd;
}

Voilà, redémarrez le service Nginx et le tour est joué ! 😉

Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Partager sur Google+ Envoyer par mail

Florian BURNEL

Ingénieur système et réseau, cofondateur d'IT-Connect et Microsoft MVP "Cloud and Datacenter Management". Je souhaite partager mon expérience et mes découvertes au travers de mes articles. Généraliste avec une attirance particulière pour les solutions Microsoft et le scripting. Bonne lecture.

Nombre de posts de cet auteur : 5471.Voir tous les posts

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.