Учитывая простую настройку 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
блокировать