Сервис предназначен для борьбы с подбором паролей при авторизации в какой-либо системе.
Сервис вызывается перед авторизацией пользователя и может либо разрешить, либо заблокировать попытку.
Предполагается, что сервис используется только для server-server, т.е. скрыт от конечного пользователя.
Сервис ограничивает частоту попыток авторизации для различных комбинаций параметров, например:
- не более N = 10 попыток в минуту для данного логина.
- не более M = 100 попыток в минуту для данного пароля (защита от обратного brute-force).
- не более K = 1000 попыток в минуту для данного IP (число большое, т.к. NAT).
Для подсчета и ограничения частоты запросов, можно использовать например алгоритм leaky bucket. Или иные аналогичные: https://en.wikipedia.org/wiki/Rate_limiting
Причем сервис будет поддерживать множество bucket-ов, по одному на каждый логин/пароль/ip.
Bucket-ы можно хранить:
- в памяти (в таком случае нужно продумать удаление неактивных bucket-ов, чтобы избежать утечек памяти).
- во внешнем хранилище (например redis или СУБД, в таком случае нужно продумать производительность).
White/black листы содержат списки адресов сетей, которые обрабатываются более простым способом:
- Если входящий IP в whitelist, то сервис безусловно разрешает авторизацию (ok=true);
- Если - в blacklist, то отклоняет (ok=false).
Микросервис состоит из API, базы данных для хранения настроек и black/white списков. Опционально - хранилище для bucket'ов. Сервис должен предоставлять GRPC или REST API.
Запрос:
- login
- password
- ip
Ответ:
- ok (true/false) - сервис должен возвращать ok=true, если считает что запрос нормальный и ok=false, если считает что происходит bruteforce.
Должен очистить bucket-ы соответствующие переданным login и ip.
- login
- ip
- подсеть (IP + маска)
- подсеть (IP + маска)
- подсеть (IP + маска)
- подсеть (IP + маска)
- Достаточно IPv4
- Пример подсети: 192.1.1.0/25 - представляет собой адрес 192.1.1.0 с маской 255.255.255.128
- Во время работы сервиса при поступлении очередного IP мы проходимся по подсетям в черных и белых списках и вычисляем, принадлежит ли IP одной из них.
Основные параметры конфигурации: N, M, K - лимиты по достижению которых, сервис считает попытку брутфорсом.
Необходимо так же разработать command-line интерфейс для ручного администрирования сервиса. Через CLI должна быть возможность вызвать сброс бакета и управлять whitelist/blacklist-ом. CLI может работать через GRPC/HTTP интерфейс.
Развертывание микросервиса должно осуществляться командой make run
(внутри docker compose up
)
в директории с проектом.
Рекомендуется выделить модуль обработки одного bucket и протестировать его с помощью unit-тестов.
Так же необходимо написать интеграционные тесты, проверяющие все вызовы API.
Максимум - 15 баллов (при условии выполнения обязательных требований):
- Реализован алгоритм rate limit - 2 балла.
- Реализованы фичи whitelist/blacklist - 2 балла.
- Реализовано API сервиса - 2 балла.
- Реализован CLI-интерфейс - 1 балла.
- Написаны юнит-тесты - 1 балл.
- Написаны интеграционные тесты - 2 балла.
- Тесты адекватны и полностью покрывают функциональность - 1 балл.
- Проект возможно собрать через
make build
, запустить черезmake run
и протестировать черезmake test
- 1 балл. - Понятность и чистота кода - до 3 баллов.