Сервис для борьбы с подбором паролей при авторизации в какой-либо системе.
Сервис предназначен для борьбы с подбором паролей при авторизации в какой-либо системе.
Сервис вызывается перед авторизацией пользователя и может либо разрешить, либо заблокировать попытку.
Предполагается, что сервис используется только для server-server, т.е. скрыт от конечного пользователя.
Сервис ограничивает частоту попыток авторизации для различных комбинаций параметров, например:
- не более N = 10 попыток в минуту для данного логина.
- не более M = 100 попыток в минуту для данного пароля (защита от обратного brute-force).
- не более K = 1000 попыток в минуту для данного IP (число большое, т.к. NAT).
Для подсчета и ограничения частоты запросов, используется алгоритм leaky bucket. https://en.wikipedia.org/wiki/Leaky_bucket
Сервис поддерживает множество bucket-ов, по одному на каждый логин/пароль/ip.
White/black листы содержат списки адресов сетей, которые обрабатываются более простым способом:
- Если входящий IP в whitelist, то сервис безусловно разрешает авторизацию (ok=true);
- Если - в blacklist, то отклоняет (ok=false).
В сервисе присутствует возможность сброса bucket-а для конкретной пары логин/ip
Микросервис построен с использованием принципов Clean architecture и предоставляет GRPC API и HTTP API (задается через переменную среды), cli для администрирования через консоль, база данных для black/white списков построена на основе PostgresSQL.
Проверяет возможность авторизации с использованием заданных значений запроса.
POST "/auth/check"
{
"login": "mylogin",
"password": "mypass",
"ip": "192.168.1.1"
}
200 OK
ok=true
ok (true/false) - сервис возвращает ok=true, если считает что запрос нормальный и ok=false, если считает что происходит bruteforce.
Очищает bucket-ы, соответствующие переданным login и ip.
DELETE "/auth/bucket"
{
"login": "mylogin",
"ip": "192.168.1.1"
}
200 OK
resetLogin=true
resetIp=true
POST "/auth/blacklist"
{
"ip": "192.1.1.0",
"mask": "255.255.255.128"
}
204 No Content
DELETE "/auth/blacklist"
{
"ip": "192.1.1.0",
"mask": "255.255.255.128"
}
204 No Content
GET "/auth/blacklist"
200 OK
[
{
"ip": "192.1.2.0",
"mask": "255.255.255.128"
},
{
"ip": "192.1.4.0",
"mask": "255.255.255.128"
}
]
POST "/auth/whitelist"
{
"ip": "192.1.1.0",
"mask": "255.255.255.128"
}
204 No Content
DELETE "/auth/whitelist"
{
"ip": "192.1.1.0",
"mask": "255.255.255.128"
}
204 No Content
GET "/auth/whitelist"
200 OK
[
{
"ip": "192.1.2.0",
"mask": "255.255.255.128"
},
{
"ip": "192.1.4.0",
"mask": "255.255.255.128"
}
]
Развертывание микросервиса осуществляется командой:
make run (внутри docker compose up) в директории с проектом.
На основную логику работы микросервиса написаны интеграционные и unit тесты. Запуск осуществляется коммандой:
make test