Сервис предназначен для борьбы с подбором паролей при авторизации в какой-либо системе. Сервис вызывается перед авторизацией пользователя и может либо разрешить, либо заблокировать попытку. Предполагается, что сервис используется только для 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.
- login
- ip Должен очистить bucket-ы соответствующие переданным login и ip
- subnet (ip + mask)
- subnet (ip + mask)
- subnet (ip + mask)
- subnet (ip + mask)
Основные параметры конфигурации: N, M, K - лимиты по достижению которых, сервис считает попытку брутфорсом.
Необходимо так же разработать command-line интерфейс для ручного администрирования сервиса. Через CLI должна быть возможность вызвать сброс бакета и управлять whitelist/blacklist-ом. CLI работает через GRPC интерфейс.
Развертывание микросервиса осуществляться командой docker-compose up
в директории с проектом.
Рекомендуется выделить модуль обработки одного bucket и протестировать его с помощью unit-тестов. Так же необходимо написать интеграционные тесты, которые поднимаю сервис и все необходимые базы в docker-compose и проверяют все вызовы API.