Como limitar as novas tentativas do Nginx Auth_Basic?


14

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

Respostas:


29

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 logpathcorresponde à sua configuração.


5

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

O Nginx basic-auth e htpasswdsuporta 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".


2
Isso seria útil se você pudesse usar bcryptsenhas ed com a autenticação básica do Nginx, mas aparentemente não pode .
Keune

Eu tentei, funciona absolutamente bem para mim. Utilizando-o na produção agora.
SColvin

Não trabalhando em baunilha ngix no ubuntu como @keune disse
Fabian Thommen

3
Vale ressaltar que isso limitará as tentativas de senha, mas apenas porque o servidor será sobrecarregado com a computação de hashes caros. Em um ambiente de produção, provavelmente não é isso que você deseja.
Tomasz P. Szynalski 02/02/19

1

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.


0

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.