fix(tradein/auth): лимит попыток входа 5 → 20 на адрес — офис за одним NAT запирал сам себя #3132

Merged
lekss361 merged 1 commit from fix/login-rate-limit-office-nat into main 2026-08-27 10:51:11 +00:00
Owner

Инцидент 27.08 с пилотом «Практика».

Что было

После починки доступа к базе auth сотрудники начали получать «Слишком много попыток. Попробуйте через несколько минут» — при том, что многие ещё вообще не пробовали войти.

Причина в форме лимита, а не в его величине. Пилот — офис: все выходят из-под одного NAT, и пять попыток за пять минут делились на всю компанию сразу. Одного человека, перепутавшего пароль, хватало, чтобы запереть остальных.

Усугубилось тем, что в тот момент вход падал с 500 у всех (упало право CONNECT на базу): люди пробовали снова и снова, исчерпывая общий на всех лимит, — и когда база починилась, войти всё равно было нельзя.

Что меняется

login_rate_limit 5 → 20 за то же окно 300 секунд.

Защита от перебора не ослабевает. Настоящий предохранитель — счёт по логину (login_username_fail_threshold, 20 попыток за час), он не тронут. Лимит по адресу существует против всплеска с одной машины, а не против офиса, и двадцать попыток за пять минут эту роль выполняют.

Немедленное действие на проде

Текущая блокировка снята сразу перезапуском бэкенда — счётчик живёт в памяти процесса. Вход проверен после: praktika получает 200.

Refs #2552

Инцидент 27.08 с пилотом «Практика». ## Что было После починки доступа к базе `auth` сотрудники начали получать «Слишком много попыток. Попробуйте через несколько минут» — при том, что многие ещё **вообще не пробовали войти**. Причина в форме лимита, а не в его величине. Пилот — **офис**: все выходят из-под одного NAT, и пять попыток за пять минут делились на всю компанию сразу. Одного человека, перепутавшего пароль, хватало, чтобы запереть остальных. Усугубилось тем, что в тот момент вход падал с 500 у всех (упало право `CONNECT` на базу): люди пробовали снова и снова, исчерпывая общий на всех лимит, — и когда база починилась, войти всё равно было нельзя. ## Что меняется `login_rate_limit` 5 → 20 за то же окно 300 секунд. **Защита от перебора не ослабевает.** Настоящий предохранитель — счёт по **логину** (`login_username_fail_threshold`, 20 попыток за час), он не тронут. Лимит по адресу существует против всплеска с одной машины, а не против офиса, и двадцать попыток за пять минут эту роль выполняют. ## Немедленное действие на проде Текущая блокировка снята сразу перезапуском бэкенда — счётчик живёт в памяти процесса. Вход проверен после: `praktika` получает 200. Refs #2552
lekss361 added 1 commit 2026-08-27 10:44:38 +00:00
fix(tradein/auth): лимит попыток входа 5 → 20 на адрес — офис за одним NAT запирал сам себя
All checks were successful
CI Trade-In / changes (pull_request) Successful in 11s
CI / changes (pull_request) Successful in 14s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Successful in 4m55s
b9654d01c0
27.08, инцидент с пилотом «Практика». После починки доступа к базе auth
сотрудники начали получать «Слишком много попыток» — при том, что многие
ещё вообще не пробовали войти.

Причина в форме лимита, а не в его величине. Пилот — ОФИС: все выходят
из-под одного NAT, и пять попыток за пять минут делились на всю компанию
сразу. Одного человека, перепутавшего пароль, хватало, чтобы запереть
остальных.

Защита от перебора не ослабевает. Настоящий предохранитель — счёт по
ЛОГИНУ (login_username_fail_threshold, 20 за час), он не тронут. Лимит по
адресу существует против всплеска с одной машины, а не против офиса, и
двадцать попыток за пять минут эту роль выполняют.
lekss361 merged commit 88e23c12a5 into main 2026-08-27 10:51:11 +00:00
lekss361 deleted branch fix/login-rate-limit-office-nat 2026-08-27 10:51:11 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#3132
No description provided.