Comment limiter les réessais Nginx Auth_Basic?

14

J'ai protégé un dossier Web avec le module Auth_Basic de Nginx. Le problème est que nous pouvons essayer plusieurs mots de passe jusqu'à ce que cela fonctionne (attaques par force brute). Existe-t-il un moyen de limiter le nombre de nouvelles tentatives infructueuses?

THpubs
la source

Réponses:

29

Pour autant que je sache, le module Auth Basic ne prend pas en charge cette fonctionnalité, mais vous pouvez le faire en utilisant Fail2ban .

En testant avec un utilisateur inexistant, vous verrez quelque chose comme des belows dans le journal des erreurs:

2012/08/25 10:07:01 [error] 5866#0: *1 no user/password was provided for basic authentication, client: 127.0.0.1, server: localhost, request: "GET /pma HTTP/1.1", host: "localhost:81" 2012/08/25 10:07:04 [error] 5866#0: *1 user "ajfkla" was not found in "/etc/nginx/htpasswd", client: 127.0.0.1, server: localhost, request: "GET /pma HTTP/1.1", host: "localhost:81"

Créez ensuite le filtre nécessaire:

/etc/fail2ban/filter.d/nginx-auth.conf

[Definition]
failregex = no user/password was provided for basic authentication.*client: <HOST>
              user .* was not found in.*client: <HOST>
              user .* password mismatch.*client: <HOST>
ignoreregex = </host></host></host> 

/etc/fail2ban/jail.conf

[nginx-auth]
enabled = true
filter = nginx-auth
action = iptables[name=NoAuthFailures, port=80, protocol=tcp]
logpath = /var/log/nginx*/*error*.log
bantime = 3600 # 1 hour
maxretry = 3

Test des règles Fail2Ban:

fail2ban-regex /var/log/nginx/localhost.error_log /etc/fail2ban/filter.d/nginx-auth.conf

Failregex
|- Regular expressions:
|  [1] no user/password was provided for basic authentication.*client: <HOST>
|  [2] user .* was not found in.*client: <HOST>
|  [3] user .* password mismatch.*client: <HOST>
|
`- Number of matches:
   [1] 1 match(es)
   [2] 2 match(es)
   [3] 0 match(es)

Ignoreregex
|- Regular expressions:
|
`- Number of matches:

Summary
=======

Addresses found:
[1]
    127.0.0.1 (Sat Aug 25 10:07:01 2012)
[2]
    127.0.0.1 (Sat Aug 25 10:07:04 2012)
    127.0.0.1 (Sat Aug 25 10:07:07 2012)
[3]

PS: Étant donné que Fail2ban récupère les fichiers journaux à bannir, assurez-vous que cela logpathcorrespond à votre configuration.

quanta
la source
5

Je suis étonné que personne d'autre n'ait donné cette solution / solution de contournement.

Nginx basic-auth et prend en htpasswdcharge le cryptage des mots de passe bcrypt avec une variable de coût facultative. Bcrypt est conçu pour être lent, fournissant ainsi une limite stricte sur la vitesse à laquelle vous pouvez essayer différents mots de passe.

Lors de la création de votre nom d'utilisateur / mot de passe d'authentification de base, utilisez

htpasswd -B -C 12 path/to/users.db <username>

Avec un coût de 12, votre serveur ne sera probablement pas en mesure d'essayer les mots de passe plus de quelques fois par seconde, augmentez cela pour dire 14 et vous examinerez probablement environ 1s par tentative de mot de passe.

Avec cela configuré, tout mot de passe raisonnable sera immunisé contre les attaques par force brute même si l'attaquant a essayé les mots de passe en continu pendant des années.

Par exemple , à 10 tentatives de mot de passe par seconde attaque de force brute sur un mot de passe alphanumérique à 8 caractères prendrait 692,351 ans: 62**8 / (10*3600*24*365).

Ceci est beaucoup plus facile à configurer et à toute épreuve que la mise en place de la limitation des requêtes "intelligente".

SColvin
la source
2
Cela serait utile si vous pouviez utiliser des bcryptmots de passe ed avec l'authentification de base de Nginx, mais apparemment vous ne pouvez pas .
keune
Je l'ai essayé, cela fonctionne très bien pour moi. L'utiliser en production maintenant.
SColvin
Ne travaille pas sur vanilla ngix sur ubuntu comme @keune l'a dit
Fabian Thommen
4
Il convient de mentionner que cela limitera les tentatives de mot de passe, mais uniquement parce que votre serveur sera surchargé par le calcul de hachages coûteux. Dans un environnement de production, ce n'est probablement pas ce que vous voulez.
Tomasz P. Szynalski
Robuste et facile, oui. Permet des attaques DoS contre l'utilisation du processeur.
Rainer Rillke
1

Je ne pense pas que nginx ait une installation interne pour le faire. La page de documentation ne suggère pas que c'est possible.

Vous pouvez utiliser Fail2Ban pour bloquer les adresses IP dont les tentatives de connexion ont échoué à plusieurs reprises.

Le wiki Fail2Ban a des modèles spécifiques à nginx .

Fail2Ban devrait être disponible sous forme de package sur la plupart des grandes distributions.

cjc
la source
0

Le module Nginx-HTTP-Auth-Digest peut remplacer le module d'authentification de base par de nombreuses fonctionnalités supplémentaires telles que la nouvelle tentative et le délai d'expiration. Une documentation supplémentaire est disponible ici

Le seul inconvénient est que cela nécessite probablement la reconstruction de nginx

intika
la source