Respostas:
Tanto quanto eu sei, o módulo Auth Basic não suporta esse recurso, mas você pode fazer isso usando Fail2ban .
Testando com um usuário inexistente, você verá algo como abaixo no log de erros:
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"
Em seguida, crie o filtro necessário:
/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
Testando regras 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: Como o Fail2ban busca os arquivos de log para banir, verifique se logpath
corresponde à sua configuração.
Estou surpreso que mais ninguém tenha dado essa solução / solução alternativa.
O Nginx basic-auth e htpasswd
suporta a criptografia de senha bcrypt com uma variável de custo opcional. O Bcrypt foi projetado para ser lento, fornecendo um limite rígido para a rapidez com que você pode tentar senhas diferentes.
Ao criar seu nome de usuário / senha de autenticação básica, use
htpasswd -B -C 12 path/to/users.db <username>
Com um custo de 12, seu servidor provavelmente não será capaz de tentar senhas mais do que algumas vezes por segundo, aumente para 14 e você provavelmente verá cerca de 1s por tentativa de senha.
Com isso configurado, qualquer senha razoável ficará imune a ataques de força bruta, mesmo que o invasor tente senhas continuamente por anos.
Por exemplo, em 10 tentativas de senha por segundo ataque de força bruta sobre uma senha alfanumérica de 8 caracteres levaria 692,351 anos: 62**8 / (10*3600*24*365)
.
Isso é muito mais fácil de configurar e mais infalível do que configurar a limitação de pedidos "inteligente".
Não acredito que o nginx tenha nenhuma facilidade interna para fazer isso. A página de documentação não sugere que seja possível.
Você pode usar o Fail2Ban para bloquear endereços IP que repetiram tentativas com falha de login.
O wiki do Fail2Ban possui alguns padrões específicos para o nginx .
O Fail2Ban deve estar disponível como um pacote na maioria das grandes distribuições.
O módulo Nginx-HTTP-Auth-Digest pode substituir o módulo de autenticação básico por muitos recursos adicionais, como repetição e tempo limite. Documentação adicional está disponível aqui
A única desvantagem é que isso provavelmente requer a reconstrução do nginx
bcrypt
senhas ed com a autenticação básica do Nginx, mas aparentemente não pode .