Restriction d'accès et amélioration de la sécurité avec un mot de passe dans NGINX
Introduction : Dans ce tutoriel, vous apprendrez comment améliorer la sécurité de votre site web en configurant des blocs serveur et des directives de localisation dans NGINX. Vous découvrirez comment bloquer des adresses IP client spécifiques, restreindre l'accès en fonction de localisations géographiques (restriction géo-basée) et implémenter une authentification basée sur un mot de passe en utilisant l'authentification HTTP Basic. Ces mesures peuvent fournir une protection supplémentaire pour votre serveur web tout en vous permettant de contrôler l'accès à des pages web spécifiques.
Prérequis :
- Un serveur Ubuntu avec des privilèges sudo
- NGINX installé sur votre serveur
- Une compréhension basique de NGINX et de sa configuration
Remarque : Pour la restriction basée sur un mot de passe, il est recommandé d'avoir HTTPS activé pour votre serveur. Vous pouvez suivre ce tutoriel pour configurer HTTPS.
Conventions de formatage :
- Dans certains exemples de configuration, des points de suspension (...) peuvent être utilisés pour indiquer des parties omises.
- Le terme "serveur" fait référence à votre serveur Ubuntu avec NGINX installé, tandis que "bloc serveur" fait référence au bloc de configuration NGINX qui ressemble à ceci :
server {
...
}
Emplacements de configuration : Vous devriez savoir où NGINX stocke ses fichiers de configuration :
/etc/nginxest le répertoire de configuration NGINX où tous les fichiers de configuration sont placés./etc/nginx/nginx.confest le fichier de configuration principal de NGINX, où NGINX commence à lire sa configuration./etc/nginx/sites-enabledest l'endroit où vous pouvez placer vos fichiers de configuration de serveur HTTP(S). Après que NGINX est démarré ou rechargé, tous les fichiers de ce répertoire sont chargés par NGINX./etc/nginx/sites-availableest l'endroit où vous pouvez placer vos fichiers de configuration de serveur HTTP(S), mais ils ne seront pas chargés par NGINX à moins que vous ne créiez un lien symbolique dans le répertoire/etc/nginx/sites-enabled.
Fichiers de journalisation : NGINX génère deux fichiers de journalisation par défaut :
/var/log/nginx/access.log: Journalise toutes les requêtes./var/log/nginx/error.log: Journalise les conditions d'erreur et les informations d'état.
Erreur lors du rechargement : Si vous rencontrez une erreur lors du rechargement de votre configuration NGINX avec sudo systemctl reload nginx, vous pouvez voir l'erreur spécifique en exécutant sudo nginx -t.
Étape 1 - Localisation du fichier de bloc serveur
Pour configurer des restrictions, vous devez trouver le fichier de bloc serveur qui correspond à votre domaine. Utilisez la commande suivante pour lister les fichiers de bloc serveur :
ls -al /etc/nginx/sites-available/
En supposant que vous souhaitiez ajouter des restrictions à un bloc serveur qui répond à example.com, localisez le bloc serveur avec la ligne server_name example.com;. Par exemple :
server {
...
server_name example.com;
...
}
Assurez-vous que la directive listen correspond au port que vous souhaitez restreindre (par exemple, listen 80; pour HTTP).
Étape 2 - Utilisation des adresses IP pour autoriser ou refuser l'accès
NGINX fournit les directives allow et deny pour contrôler l'accès en fonction des adresses IP client. Vous pouvez bloquer l'accès à des adresses IP spécifiques, y compris la vôtre pour les tests.
Étape 2.1 - Trouver votre adresse IP publique Pour bloquer votre propre adresse IP, vous devez d'abord déterminer votre adresse IP publique. Exécutez la commande suivante :
curl -4 https://2ip.io
Vous recevrez votre adresse IP publique en sortie (par exemple, 15.1.1.1). Si la commande échoue, vous pouvez trouver votre adresse IP via une recherche Google.
Étape 2.2 - Blocage de l'accès Pour bloquer votre adresse IP, ajoutez la ligne suivante au contexte de localisation approprié dans votre bloc serveur, en remplaçant 15.1.1.1) par votre adresse IP publique :
deny 15.1.1.1); Voici un exemple d'extrait de configuration :
server {
listen 80;
server_name example.com;
location / {
deny 15.1.1.1) } } Après avoir effectué cette modification, rechargez NGINX pour appliquer la configuration :
sudo systemctl reload nginx
Maintenant, si vous exécutez la même commande pour accéder à votre site web depuis votre IP :
curl -4 --head http://example.com
Vous devriez recevoir une erreur HTTP 403 Forbidden, indiquant que l'accès a été refusé.
Remarque : Vous pouvez spécifier plusieurs directives allow et deny. La première directive qui correspond sera appliquée. Par exemple :
allow 15.1.1.1; allow 15.1.1.2; deny all; Dans cet exemple, l'accès est autorisé pour 15.1.1.1 et 15.1.1.2, tandis que toutes les autres adresses IP sont refusées.
Étape 3 - Utilisation du module Geo pour autoriser ou refuser l'accès
Le module geo de NGINX offre une manière flexible de contrôler l'accès en fonction des localisations géographiques en utilisant des bases de données IP. Pour activer cette fonctionnalité :
- Installez le paquet
libnginx-mod-http-geoip2:
sudo apt update && sudo apt install libnginx-mod-http-geoip2
- Assurez-vous que
/etc/nginx/nginx.confcontient la ligne suivante :
include /etc/nginx/modules-enabled/*.conf;
- Téléchargez une base de données IP compatible GeoIP2. Vous pouvez utiliser la commande fournie ou créer un compte sur le site web de MaxMind et télécharger la base de données GeoLite2 Country :
cd /etc/nginx && sudo curl --fail -LO https://github.com/P3TERX/GeoLite.mmdb/releases/latest/download/GeoLite2-Country.mmdb
- Modifiez votre configuration NGINX pour inclure les directives GeoIP2 :
geoip2 /etc/nginx/GeoLite2-Country.mmdb {
$user_country country iso_code;
}
map $user_country $not_allowed {
CA 1; # Canada
US 1; # États-Unis
default 0; # Autoriser tous les autres pays
}
server {
listen 80;
server_name example.com;
location / {
if ($not_allowed) {
return 403 "Vous n'êtes pas autorisé à accéder.";
}
}
}
Dans cet exemple, l'accès est refusé pour les utilisateurs du Canada (CA) et des États-Unis (US), tandis que tous les autres pays sont autorisés.
Rechargez NGINX pour appliquer les modifications :
sudo systemctl reload nginx
Étape 4 - Authentification basée sur un mot de passe (Authentification HTTP Basic)
Pour restreindre l'accès en fonction d'un nom d'utilisateur et d'un mot de passe, vous pouvez utiliser l'authentification HTTP Basic. Assurez-vous d'avoir HTTPS activé pour votre serveur.
- Créez un fichier pour stocker les noms d'utilisateur et les mots de passe hachés :
sudo touch /etc/nginx/users
- Ajoutez des utilisateurs en utilisant la commande suivante (remplacez
useretpasswordpar votre nom d'utilisateur et mot de passe souhaités) :
python3 -c 'from subprocess import *; import sys; print("Username: ", end="", file=sys.stderr); user = input();
passwd = run(["openssl", "passwd", "-6"], encoding="utf-8", stdout=PIPE).stdout.strip();
print("Username or password is empty. Try again!", file=sys.stderr) if user == "" or passwd == "" else print(user + ":" + passwd)' | sudo tee -a /etc/nginx/users
Cette commande ajoute un utilisateur au fichier /etc/nginx/users et affiche le nom d'utilisateur et le mot de passe haché sous forme de paires user:password. Le mot de passe n'est pas stocké en clair sur le serveur.
- Modifiez la configuration de votre bloc serveur pour inclure l'authentification HTTP Basic :
server {
server_name example.com;
location / {
}
auth_basic "Zone protégée !";
auth_basic_user_file /etc/nginx/users;
listen 443 ssl; # Géré par Certbot
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # Géré par Certbot
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # Géré par Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # Géré par Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # Géré par Certbot
}
Assurez-vous de remplacer example.com par votre domaine réel.
- Rechargez NGINX pour appliquer la configuration :
sudo systemctl reload nginx
Vous pouvez tester la nouvelle configuration avec curl. Accéder au site sans nom d'utilisateur et mot de passe devrait entraîner une erreur HTTP 401 Unauthorized, tandis que fournir des identifiants valides devrait accorder l'accès.
Restriction de l'accès à une seule URL
Pour restreindre l'accès à une URL spécifique, ajoutez les directives auth_basic et auth_basic_user_file directement à un contexte de localisation dans votre bloc serveur. Par exemple :
server {
server_name example.com;
location / {
}
location /admin {
auth_basic "Zone protégée !";
auth_basic_user_file /etc/nginx/users;
}
listen 443 ssl; # Géré par Certbot
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # Géré par Certbot
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # Géré par Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # Géré par Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # Géré par Certbot
}
Dans cet exemple, l'URL /admin est protégée par l'authentification HTTP Basic.
Journalisation des mauvais détails d'accès
NGINX journalise les tentatives d'accès incorrectes dans le fichier /var/log/nginx/error.log. Cela inclut les mots de passe incorrects et les noms d'utilisateur inexistants, fournissant une visibilité supplémentaire sur les tentatives d'accès non autorisées.
Exemples d'entrées de journal :
- Mot de passe incorrect :
2023/03/28 12:06:49 [error] 1865#1865: *14 user "root": password mismatch, client: 15.1.1.1, server: example.com, request: "GET / HTTP/1.1", host: "example.com" - Nom d'utilisateur inexistant :
2023/03/28/12:08:21 [error] 1865#1865: *16 user "root" was not found in "/etc/nginx/users", client: 15.1.1.1, server: example.com, request: "GET / HTTP/1.1", host: "example.com" Conclusion : Ce tutoriel vous a équipé des connaissances nécessaires pour améliorer la sécurité de votre site web en utilisant NGINX. En configurant des blocs serveur, en contrôlant l'accès en fonction des adresses IP, en implémentant des restrictions géographiques et en mettant en place une authentification basée sur un mot de passe, vous pouvez mieux protéger votre serveur web et contrôler l'accès à des ressources spécifiques. La flexibilité et les fonctionnalités puissantes de NGINX en font un outil précieux pour sécuriser vos applications web. Pour des conseils supplémentaires, référez-vous à la documentation officielle de NGINX et aux archives de la liste de diffusion.
Rechercher