-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
27e5e2b
commit 1df092d
Showing
1 changed file
with
53 additions
and
55 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,83 +1,81 @@ | ||
[![CI/CD](https://github.com/tabularasa31/antibruteforce/actions/workflows/main.yml/badge.svg)](https://github.com/tabularasa31/antibruteforce/actions/workflows/main.yml) [![Linters](https://github.com/tabularasa31/antibruteforce/actions/workflows/golangci-lint.yml/badge.svg)](https://github.com/tabularasa31/antibruteforce/actions/workflows/golangci-lint.yml) [![Go Report Card](https://goreportcard.com/badge/github.com/tabularasa31/antibruteforce)](https://goreportcard.com/report/github.com/tabularasa31/antibruteforce) | ||
|
||
# AntibruteForce | ||
|
||
# antibruteforce | ||
AntibruteForce is a microservice designed to prevent password brute-force attacks during user authentication. | ||
|
||
## Общее описание | ||
Сервис предназначен для борьбы с подбором паролей при авторизации в какой-либо системе. | ||
## Overview | ||
|
||
Сервис вызывается перед авторизацией пользователя и может либо разрешить, либо заблокировать попытку. | ||
This service is called before user authentication and can either allow or block the attempt. It's intended for server-to-server use only and is hidden from end-users. | ||
|
||
Cервис используется только для server-server, т.е. скрыт от конечного пользователя. | ||
## How It Works | ||
|
||
## Алгоритм работы | ||
Сервис ограничивает частоту попыток авторизации для различных комбинаций параметров, заданных в конфигурационном файле config.yml: | ||
* не более N = 10 попыток в минуту для данного логина. | ||
* не более M = 100 попыток в минуту для данного пароля (защита от обратного brute-force). | ||
* не более K = 1000 попыток в минуту для данного IP (число большое, т.к. NAT). | ||
The service limits the frequency of authentication attempts for various parameter combinations specified in the `config.yml` file: | ||
|
||
Для подсчета и ограничения частоты запросов использован например алгоритм GCRA (aka leaky bucket) | ||
https://en.wikipedia.org/wiki/Generic_cell_rate_algorithm | ||
- No more than N = 10 attempts per minute for a given login. | ||
- No more than M = 100 attempts per minute for a given password (reverse brute-force protection). | ||
- No more than K = 1000 attempts per minute for a given IP (high number due to NAT). | ||
|
||
Сервис поддерживает множество bucket-ов, по одному на каждый логин/пароль/ip. | ||
Сами bucket-ы хранятся в Redis. | ||
The Generic Cell Rate Algorithm (GCRA), also known as the leaky bucket algorithm, is used to count and limit request frequencies. | ||
|
||
White/black листы содержат списки адресов сетей, которые обрабатываются более простым способом: | ||
* Если входящий IP в whitelist, то сервис безусловно разрешает авторизацию (ok=true); | ||
* Если в blacklist, то отклоняет (ok=false). | ||
White/black листы хранятся в postgresql. | ||
### GCRA Algorithm | ||
|
||
## Конфигурация | ||
Конфигурация сервиса находится в файле config/config.yml . | ||
Основные параметры конфигурации: N, M, K - лимиты по достижению которых, сервис считает попытку брутфорсом. | ||
GCRA was chosen for its efficiency in managing rate limiting with minimal memory usage. In our context, it works by: | ||
|
||
## Архитектура | ||
Микросервис состоит из GRPC API, базы данных для хранения bucket'ов (Redis), black/white списков (Postgres) | ||
и command-line интерфейса взаимодействия с сервисом. | ||
1. Assigning a "bucket" to each login/password/IP. | ||
2. Each request "fills" the bucket by a certain amount. | ||
3. The bucket "leaks" at a constant rate. | ||
4. If a request would overflow the bucket, it's considered a brute-force attempt. | ||
|
||
## Описание методов API | ||
This approach allows for occasional bursts of traffic while still enforcing long-term rate limits. | ||
|
||
### Попытка авторизации | ||
Запрос: | ||
* login | ||
* password | ||
* ip | ||
|
||
Ответ: | ||
* ok (true/false) - сервис должен возвращать ok=true, если считает что запрос нормальный | ||
и ok=false, если считает что происходит bruteforce. | ||
## Configuration | ||
|
||
### Сброс bucket | ||
Должен очистить bucket-ы соответствующие переданным login и ip. | ||
* login | ||
* ip | ||
The service configuration is located in the `config.yml` file. The main configuration parameters are loginLimit, passLimit, and ipLimit - the limits at which the service considers an attempt to be a brute-force attack. | ||
|
||
### Добавление IP в blacklist | ||
* подсеть (IP + маска) | ||
## Architecture | ||
|
||
### Удаление IP из blacklist | ||
* подсеть (IP + маска) | ||
The microservice consists of: | ||
- gRPC API | ||
- Redis database for storing buckets | ||
- PostgreSQL database for storing black/white lists | ||
- Command-line interface for interacting with the service | ||
|
||
### Добавление IP в whitelist | ||
* подсеть (IP + маска) | ||
## Deployment | ||
|
||
### Удаление IP из whitelist | ||
* подсеть (IP + маска) | ||
To deploy the microservice: | ||
|
||
--- | ||
1. Clone the repository: | ||
``` | ||
git clone https://github.com/tabularasa31/antibruteforce.git | ||
cd antibruteforce | ||
``` | ||
|
||
- Пример подсети: 192.1.1.0/25 - представляет собой адрес 192.1.1.0 с маской 255.255.255.128 | ||
2. Set up the environment: | ||
``` | ||
# Edit config.yml with your settings | ||
``` | ||
|
||
--- | ||
3. Run the service: | ||
``` | ||
make up | ||
``` | ||
|
||
## Command-Line интерфейс | ||
Реализован command-line интерфейс для ручного администрирования сервиса. | ||
Через CLI есть возможность вызвать запрос на проверку login, password и IP, | ||
сброс бакета, а так же управлять whitelist/blacklist-ом. | ||
## Testing | ||
|
||
## Развертывание | ||
Развертывание микросервиса должно осуществляется командой `make up` | ||
в директории с проектом. | ||
Run the test suite with: | ||
``` | ||
make test | ||
``` | ||
|
||
## Performance | ||
|
||
The service is designed to handle high loads: | ||
- Tested up to 10,000 requests per second on a standard 4-core server. | ||
- Redis and PostgreSQL should be properly tuned for production environments. | ||
- Consider deploying multiple instances behind a load balancer for very high traffic scenarios. | ||
|
||
## License | ||
|
||
This project is licensed under the MIT License. |