Skip to content

Commit

Permalink
Update README.md
Browse files Browse the repository at this point in the history
  • Loading branch information
tabularasa31 authored Sep 9, 2024
1 parent 27e5e2b commit 1df092d
Showing 1 changed file with 53 additions and 55 deletions.
108 changes: 53 additions & 55 deletions README.md
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.

0 comments on commit 1df092d

Please sign in to comment.