Files
Baradb/docs/ru/security.md
T

210 lines
6.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Руководство по безопасности
## TLS/SSL шифрование
BaraDB поддерживает TLS 1.3 для всех протоколов (бинарный, HTTP, WebSocket). Если сертификат не предоставлен, сервер автоматически генерирует самоподписанный сертификат при запуске для шифрования без конфигурации.
### Использование пользовательских сертификатов
```bash
# Предоставьте существующие сертификаты
BARADB_TLS_ENABLED=true \
BARADB_CERT_FILE=/etc/baradb/server.crt \
BARADB_KEY_FILE=/etc/baradb/server.key \
./build/baradadb
```
### Генерация самоподписанных сертификатов
```bash
openssl req -x509 -newkey rsa:4096 -keyout server.key -out server.crt \
-days 365 -nodes -subj "/CN=localhost"
```
### Let's Encrypt (Производство)
Используйте certbot и укажите BaraDB на сгенерированные файлы:
```bash
sudo certbot certonly --standalone -d db.example.com
BARADB_CERT_FILE=/etc/letsencrypt/live/db.example.com/fullchain.pem \
BARADB_KEY_FILE=/etc/letsencrypt/live/db.example.com/privkey.pem \
./build/baradadb
```
### TLS на стороне клиента
```python
from baradb import Client
client = Client("localhost", 9472, tls=True, tls_verify=True)
client.connect()
```
## Аутентификация
### JWT-аутентификация
BaraDB использует JWT (JSON Web Tokens) с подписью HMAC-SHA256.
#### Включение аутентификации
```bash
BARADB_AUTH_ENABLED=true \
BARADB_JWT_SECRET="$(openssl rand -hex 32)" \
./build/baradadb
```
#### Создание токенов
```nim
import barabadb/protocol/auth
var am = newAuthManager("your-secret-key")
let token = am.createToken(JWTClaims(
sub: "user1",
role: "admin",
exp: getTime() + 24.hours
))
```
#### Контроль доступа на основе ролей
| Роль | Разрешения |
|------|------------|
| `admin` | Полный доступ |
| `write` | Чтение + запись |
| `read` | Только чтение |
| `monitor` | Только метрики и здоровье |
#### Использование токенов
```bash
curl -H "Authorization: Bearer $TOKEN" \
http://localhost:9470/api/query \
-d '{"query": "SELECT * FROM users"}'
```
```python
from baradb import Client
client = Client("localhost", 9472)
client.connect()
client.authenticate("eyJhbGciOiJIUzI1NiIs...")
```
### Многофакторная аутентификация (MFA)
```nim
import barabadb/protocol/auth
var am = newAuthManager("secret-key")
# MFA на основе TOTP
let mfaCode = am.generateTOTP("user1")
let valid = am.validateTOTP("user1", mfaCode)
```
## Ограничение скорости
Token-bucket ограничение скорости предотвращает злоупотребления:
```nim
import barabadb/protocol/ratelimit
var rl = newRateLimiter(
rlaTokenBucket,
globalRate = 10000, # 10K req/s глобально
perClientRate = 1000, # 1K req/s на клиент
burstSize = 100 # Позволить burst 100 req
)
if not rl.allowRequest("client-ip"):
return error("Rate limit exceeded")
```
## Сетевая безопасность
### Адрес привязки
По умолчанию BaraDB привязывается к `127.0.0.1` (только localhost). Для производства:
```bash
# Привязать ко всем интерфейсам (за файрволом или обратным прокси)
BARADB_ADDRESS=0.0.0.0 ./build/baradadb
# Привязать к конкретному внутреннему интерфейсу
BARADB_ADDRESS=10.0.0.5 ./build/baradadb
```
### Правила файрвола
```bash
# Разрешить только серверам приложений
sudo ufw allow from 10.0.0.0/8 to any port 9472
sudo ufw allow from 10.0.0.0/8 to any port 9470
# Заблокировать внешний доступ к портам управления
sudo ufw deny 9471 # WebSocket (только внутреннее использование)
```
## Шифрование данных в покое
### Шифрование на уровне ОС
Используйте LUKS для полнодискового шифрования:
```bash
cryptsetup luksFormat /dev/nvme0n1p2
cryptsetup open /dev/nvme0n1p2 baradb-crypt
mkfs.ext4 /dev/mapper/baradb-crypt
mount /dev/mapper/baradb-crypt /var/lib/baradb
```
### Шифрование на уровне приложения
BaraDB поддерживает прозрачное шифрование SSTable файлов:
```bash
BARADB_STORAGE_ENCRYPTION_KEY="$(openssl rand -hex 32)" \
./build/baradadb
```
## Аудитлог
Все запросы и административные действия логируются:
```json
{
"timestamp": "2025-01-15T10:30:00Z",
"level": "info",
"event": "query_executed",
"client_ip": "10.0.0.15",
"user": "app_user",
"query": "SELECT * FROM users WHERE id = ?",
"duration_ms": 12,
"rows_returned": 1
}
```
Включите аудитлог:
```bash
BARADB_LOG_LEVEL=info \
BARADB_LOG_FORMAT=json \
BARADB_LOG_FILE=/var/log/baradb/audit.log \
./build/baradadb
```
## Чеклист безопасности
- [ ] Изменить секрет JWT по умолчанию
- [ ] Включить TLS с валидными сертификатами
- [ ] Привязать к конкретным интерфейсам
- [ ] Включить аутентификацию в производстве
- [ ] Настроить ограничение скорости
- [ ] Включить аудитлог
- [ ] Шифровать данные в покое (LUKS или на уровне приложения)
- [ ] Запускать BaraDB от не-root пользователя
- [ ] Поддерживать файрвол в строгом режиме
- [ ] Регулярно менять секреты JWT