Назад | Перейти на главную страницу

Nginx: ограничение скорости не удалось выполнить базовые попытки аутентификации

Учитывая простую настройку HTTP Basic Auth в Nginx (1.14.1 на момент написания), например:

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

... как применить ограничение скорости к неудачным попыткам входа в систему? Например, если было 10 неудачных попыток входа в систему за 30 секунд, я бы хотел запретить этому исходному IP доступ к сайту в течение часа. Я ожидал бы использовать limit_req_zone и связанные директивы, но не смог найти способ подключиться к состоянию аутентификации запроса.

Это довольно просто в HAproxy с таблицами стикеров и ACL, используя что-то вроде следующего рабочего примера.

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

Возможно ли это с Nginx без использования в auth_request подход и необходимость применения запроса, ограничивающего location блокировать внешний механизм аутентификации?