Nginx: O limite de taxa falhou nas tentativas de autenticação básica

Nginx: O limite de taxa falhou nas tentativas de autenticação básica

Dada uma configuração simples de HTTP Basic Auth no Nginx (1.14.1 no momento da escrita) como esta:

server {
  ...
  location / {
    auth basic "HTTP Auth Required";
    auth basic user file "/path/to/htpasswd";
  }
}

... como aplicar a limitação de taxa a tentativas de login malsucedidas? Por exemplo, se houver 10 tentativas de login malsucedidas em 30 anos, gostaria de impedir que o IP de origem acesse o site por uma hora. Eu esperaria fazer uso de limit_req_zonediretivas relacionadas, mas não consegui encontrar uma maneira de conectar-se ao estado de autenticação da solicitação.

Isso é bastante simples no HAproxy com tabelas fixas e ACLs usando algo como o exemplo de trabalho a seguir.

userlist users
  user me password s3cr3t

frontend https.local
  ...

  # Set up the stick table to track our source IPs, both IPv4 & IPv6
  stick-table  type ipv6  size 100k  expire 1h  store http_req_rate(30s)

  # Check if the user has authenticated
  acl  auth_ok  http_auth(users)

  # Track the client IP
  http-request track-sc0 src

  # Deny the connection if it exceeds 10 requests within the defined
  # stick-table period AND if the client isn't authenticated already
  http-request deny deny_status 429 if { sc_http_req_rate(0) gt 10 } !auth_ok

  # Define the auth realm if the users isn't authenticated and made it this far
  http-request auth realm Authorization\ Required unless auth_ok

Isso é possível com o Nginx sem ter que usar a auth_requestabordagem e aplicar a solicitação limitando a um locationbloco um mecanismo de autenticação externo?

Responder1

Você também pode usar o fail2ban e depois uma prisão para o nginx.

Responder2


  limit_req_status     429;
  auth_basic           "-";
  auth_basic_user_file "...";
  error_page           401 = @nein;
  proxy_intercept_errors on; # not needed if not proxying

  location / {
    # note you cannot use a short circuiting `return`  here.
    try_files /dev/null =204;
  }

  location @nein {
    internal  ;
    limit_req zone=<zone>;
    # this is the magic trick, `try_files` takes place AFTER `limit_req`.
    try_files /dev/null =401;
  }


Nota: isso só entra em vigor APÓS falha na autenticação, então você tem que brincar com o limite de burst para atrasar as próximas solicitações. Nem tenho certeza se é possível proteger as coisas dessa maneira contra ataques de força bruta.

informação relacionada