Réponses:
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 logpath
correspond à votre configuration.
Je suis étonné que personne d'autre n'ait donné cette solution / solution de contournement.
Nginx basic-auth et prend en htpasswd
charge 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".
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.
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
bcrypt
mots de passe ed avec l'authentification de base de Nginx, mais apparemment vous ne pouvez pas .