Comment configurer l'authentification HTTP de base dans NGINX

0
180

L'authentification de base par nom d'utilisateur et mot de passe est un moyen facile et simple de sécuriser les panneaux d'administration et les services principaux. Nginx peut être configuré pour protéger certaines zones de votre site Web, ou même utilisé comme proxy inverse pour sécuriser d'autres services.

Comment fonctionne l'authentification HTTP ?< /h2>

Dans l'authentification HTTP de base, certaines routes sur le serveur sont verrouillées et nécessitent un nom d'utilisateur et un mot de passe pour y accéder. Par exemple, les panneaux d'administration de la plupart des routeurs domestiques sont sécurisés de cette façon ; lorsque vous essayez d'y accéder, le navigateur ouvre une boîte de dialogue demandant des informations d'identification.

Lorsqu'un utilisateur tente d'accéder à une ressource protégée, le serveur lui envoie un en-tête WWW-Authenticate ainsi qu'une réponse 401 Unauthorized. Le client renvoie le nom d'utilisateur et le mot de passe appropriés, stockés dans l'en-tête d'autorisation, et s'il correspond à un fichier de clé, il est autorisé à se connecter.

Étant donné que l'authentification HTTP de base nécessite l'envoi de mots de passe sur le fil, vous devez configurer HTTPS/TLS sur votre serveur, sinon n'importe qui au milieu pourrait renifler le mot de passe en clair. HTTPS chiffrera la connexion, la rendant sûre à transmettre. Vous pouvez configurer un certificat gratuit avec LetsEncrypt, ou si vous cherchez à sécuriser un serveur privé, créez et signez-en un vous-même.

L'authentification de base par nom d'utilisateur/mot de passe n'est qu'un des nombreux schémas d'authentification ; un autre schéma courant est celui des jetons de support, utilisés pour les flux OAuth 2.0. Vous pouvez utiliser ce schéma avec Nginx à l'aide du module JSON Web Tokens, mais la configuration complète est beaucoup plus complexe que l'authentification par nom d'utilisateur/mot de passe.

Générer un fichier de mot de passe

Vous pouvez utiliser htpasswd pour générer des fichiers de mot de passe. Il est probablement déjà installé sur votre système, mais si ce n'est pas le cas, vous pouvez l'installer à partir du package apache2-utils. (Nginx utilise le même format de mot de passe qu'Apache) :

sudo apt-get install apache2-utils Publicité

Générez un nouveau fichier de mot de passe en exécutant htpasswd avec l'indicateur -c , dans ce cas, pour l'utilisateur “admin” :

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

Il vous sera demandé de saisir un mot de passe, qui sera haché et stocké dans /etc/nginx/.htpasswd. Si vous souhaitez ajouter plusieurs utilisateurs, omettez l'indicateur -c pour ajouter de nouvelles entrées.

Activer l'authentification HTTP de base

Vous pouvez protéger n'importe quel itinéraire dans nginx en utilisant la directive auth_basic à l'intérieur d'un emplacement. Par exemple, pour protéger par mot de passe /admin, vous placeriez ce bloc d'emplacement à l'intérieur du bloc serveur dans votre fichier de configuration nginx principal (généralement situé dans /etc/nginx/nginx.conf) :

location /admin { try_files $uri $uri/=404 ; auth_basic “Contenu restreint” ; auth_basic_user_file /etc/nginx/.htpasswd; }

La directive auth_basic_user_file doit pointer vers le fichier de mot de passe que vous avez créé à la première étape. Cela n'a pas besoin d'être nommé quelque chose de spécial, vous pouvez donc créer différents fichiers de mots de passe pour différentes routes.

Nginx devrait gérer le reste pour vous. Redémarrez pour appliquer les modifications :

sudo service nginx restart Publicité

Et, vérifiez l'itinéraire protégé dans votre navigateur. Un mot de passe devrait vous être demandé et l'accès vous sera refusé si vous ne pouvez pas le fournir.

Utilisation de l'authentification proxy

Un cas d'utilisation courant de l'authentification de base consiste à sécuriser une ressource externe avec un proxy inverse nginx. Cela fonctionne parfaitement avec auth_basic, et c'est aussi simple que d'utiliser les deux ensemble :

location/{ #//activer l'authentification pour cet emplacement auth_basic “Contenu restreint” ; auth_basic_user_file /etc/nginx/.htpasswd; #//configuration proxy normale proxy_http_version 1.1 ; proxy_pass_request_headers activé ; proxy_set_header Hôte $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for ; proxy_set_header Accept-Encoding “” ; proxy_pass https://<adresse-ip>; proxy_redirect par défaut ; }

Cela fonctionne en refusant toute entrée au proxy avant qu'un utilisateur ne s'authentifie. Une fois authentifiés, nginx fonctionne normalement.

Cependant, si vous souhaitez effectuer l'authentification sur le serveur derrière le proxy inverse, la configuration est plus compliquée. Vous souhaiterez plutôt que nginx transmette votre entrée au serveur Web, ce qui pourrait, par exemple, interroger une base de données ou effectuer une vérification plus complexe qu'un simple fichier de mot de passe.

Vous en aurez besoin pour utiliser le module headers-more pour pouvoir modifier les en-têtes plus directement :

emplacement/{ proxy_http_version 1.1; proxy_pass_request_headers activé ; proxy_set_header Hôte $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for ; proxy_set_header Accept-Encoding “” ; proxy_pass https://<adresse-ip>; proxy_redirect par défaut ; more_set_input_headers 'Autorisation : $http_authorization' ; more_set_headers -s 401 'WWW-Authenticate: Basic realm=”your_server.com”'; }

La configuration du proxy est la même, sauf qu'il manque auth_basic car nous ne voulons pas faire l'authentification avec nginx. La directive more_set_input_headers fait la magie ici et définit l'en-tête lorsqu'il communique avec le serveur Web pour inclure la variable $http_authorization qu'il a reçue du client. De cette façon, le nom d'utilisateur et le mot de passe sont transmis via nginx au backend.

Publicité

La ligne suivante est plus compliquée ; la manière habituelle de définir les en-têtes écrasera la variable de domaine lorsqu'elle est proxy via nginx, ce qui n'est pas idéal. L'utilisation de more_set_headers préserve ces informations et affiche les informations correctes au client.