Como limitar as re-tentativas do Nginx Auth_Basic?

13

Eu protegi uma pasta da Web com o módulo Auth_Basic do Nginx. O problema é que podemos tentar várias senhas até que ele funcione (ataques de força bruta). Existe uma maneira de limitar o número de tentativas repetidas?

    
por THpubs 25.08.2012 / 04:57

3 respostas

28

Até onde 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 belows 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 do 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 arquivos de log para banir, verifique se logpath corresponde à sua configuração.

    
por 25.08.2012 / 05:21
5

Estou surpreso que ninguém mais tenha dado essa solução / solução alternativa.

Nginx basic-auth e htpasswd suportam criptografia de senha criptografada com uma variável de custo opcional. O Bcrypt foi projetado para ser lento, fornecendo assim 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 conseguirá usar senhas mais do que algumas vezes por segundo, aumente isso para dizer 14 e você provavelmente estará olhando em torno de 1s por tentativa de senha.

Com isso configurado, qualquer senha razoável estará imune ao ataque de força bruta, mesmo que o invasor tenha tentado senhas continuamente por anos.

Por exemplo a 10 tentativas de senha por segundo de ataque de força bruta em 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 o limite de solicitações "inteligentes".

    
por 09.06.2017 / 17:12
1

Eu não acredito que o nginx tenha alguma 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 tenham repetidas tentativas de login com falha.

O wiki do Fail2Ban tem alguns padrões específicos do nginx .

O Fail2Ban deve estar disponível como um pacote na maioria das grandes distribuições.

    
por 25.08.2012 / 05:12