🔒 Implement comprehensive security and DDoS protection

### Security Features:
- **Rate Limiting**: Redis-based IP tracking with configurable limits
  - General: 100 requests/minute (5min block)
  - Upload: 10 requests/5min (10min block)
  - Auth: 20 requests/15min (30min block)
- **Request Validation**: Path length, header count, suspicious patterns
- **Attack Detection**: Admin paths, script injections, bot patterns
- **Enhanced JWT**: Format validation, length checks, character filtering
- **IP Tracking**: X-Forwarded-For and X-Real-IP support

### Security Headers:
- X-Content-Type-Options: nosniff
- X-Frame-Options: DENY
- X-XSS-Protection: 1; mode=block
- Content-Security-Policy with strict rules
- Strict-Transport-Security with includeSubDomains

### CORS Hardening:
- Limited to specific domains: discours.io, new.discours.io
- Restricted methods: GET, POST, OPTIONS only
- Essential headers only

### Infrastructure:
- Security middleware for all requests
- Local cache + Redis for performance
- Comprehensive logging and monitoring
- Progressive blocking for repeat offenders

### Documentation:
- Complete security guide (docs/security.md)
- Configuration examples
- Incident response procedures
- Monitoring recommendations

Version bump to 0.6.0 for major security enhancement.
This commit is contained in:
2025-09-02 11:40:43 +03:00
parent d3bee5144f
commit 82668768d0
14 changed files with 803 additions and 124 deletions

176
docs/security.md Normal file
View File

@@ -0,0 +1,176 @@
# 🔒 Безопасность и защита от DDoS
## Обзор
Система quoter включает многоуровневую защиту от различных типов атак, включая DDoS, брутфорс и эксплуатацию уязвимостей.
## 🛡️ Уровни защиты
### 1. Сетевой уровень (HTTP Server)
#### Ограничения размера запросов
- **Максимальный размер payload**: 500 МБ
- **Максимальный размер JSON**: 1 МБ
- **Таймаут соединения**: настраивается через Actix-web
#### Заголовки безопасности
```http
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block
Referrer-Policy: strict-origin-when-cross-origin
Content-Security-Policy: default-src 'self'; img-src 'self' data: https:; object-src 'none';
Strict-Transport-Security: max-age=31536000; includeSubDomains
```
#### CORS Policy
- **Разрешенные домены**: `discours.io`, `new.discours.io`, `localhost:3000`
- **Разрешенные методы**: GET, POST, OPTIONS
- **Ограниченные заголовки**: Content-Type, Authorization, If-None-Match, Cache-Control
### 2. Rate Limiting (Лимиты запросов)
#### Конфигурация по умолчанию
| Тип endpoint | Макс. запросов | Окно времени | Блокировка |
|--------------|----------------|--------------|------------|
| Общие запросы | 100 | 60 сек | 5 мин |
| Загрузка файлов | 10 | 300 сек | 10 мин |
| Аутентификация | 20 | 900 сек | 30 мин |
#### Механизм работы
1. **IP-based tracking**: Отслеживание по IP (учитывает X-Forwarded-For, X-Real-IP)
2. **Redis storage**: Хранение счетчиков в Redis с TTL
3. **Local cache**: Быстрый локальный кэш для частых проверок
4. **Progressive blocking**: Увеличение времени блокировки при повторных нарушениях
### 3. Валидация запросов
#### Проверки безопасности
- **Длина пути**: максимум 1000 символов
- **Количество заголовков**: максимум 50
- **Длина значений заголовков**: максимум 8192 символа
- **Подозрительные символы**: фильтрация `..`, `\0`, `\r`, `\n`
#### Детекция атак
```rust
// Подозрительные паттерны
let suspicious_patterns = [
"/admin", "/wp-admin", "/phpmyadmin", "/.env", "/config",
"/.git", "/backup", "/db", "/sql",
"script>", "<iframe", "javascript:", "data:",
];
```
### 4. Аутентификация и авторизация
#### JWT Token Validation
- **Формат**: 3 части разделенные точками
- **Символы**: только alphanumeric, `.`, `-`, `_`
- **Длина**: 100-2048 символов
- **Валидация**: проверка подписи и времени жизни
#### Защита от брутфорса
- Задержки при неудачных попытках аутентификации
- Временная блокировка IP после множественных неудач
- Логирование подозрительной активности
## 🚀 Производительность
### Оптимизации
- **Локальный кэш**: быстрые проверки без обращения к Redis
- **Асинхронная обработка**: неблокирующие операции
- **ETag caching**: сокращение нагрузки на статические файлы
- **HTTP/2 support**: через reverse proxy
### Мониторинг
- Детальное логирование атак и блокировок
- Метрики производительности Redis
- Статистика rate limiting по IP и endpoint
## 🔧 Конфигурация
### Environment Variables
```bash
# Redis (для rate limiting)
REDIS_URL=redis://localhost:6379
# Security настройки
MAX_PAYLOAD_SIZE=524288000 # 500MB
MAX_PATH_LENGTH=1000
MAX_HEADERS_COUNT=50
```
### Настройка Rate Limits
```rust
let security_config = SecurityConfig {
general_rate_limit: RateLimitConfig {
max_requests: 100,
window_seconds: 60,
block_duration_seconds: 300,
},
upload_rate_limit: RateLimitConfig {
max_requests: 5, // Более строгие лимиты
window_seconds: 300,
block_duration_seconds: 1800,
},
// ...
};
```
## 🔍 Обнаружение угроз
### Автоматическая блокировка
- **Bot detection**: по User-Agent заголовкам
- **Массовые запросы**: временная блокировка агрессивных IP
- **Подозрительные пути**: немедленная блокировка известных attack vectors
### Логирование
```log
WARN Rate limit exceeded for IP 192.168.1.100: 101/100 requests
WARN Suspicious pattern detected from IP 192.168.1.100: /wp-admin
WARN Token validation failed for IP 192.168.1.100
```
## 💡 Рекомендации
### Развертывание в продакшене
1. **Reverse Proxy**: Nginx/CloudFlare для дополнительной фильтрации
2. **Firewall**: iptables/ufw для блокировки на сетевом уровне
3. **SSL/TLS**: Обязательное использование HTTPS
4. **Мониторинг**: Система алертов для подозрительной активности
### Настройка мониторинга
```bash
# Проверка заблокированных IP
redis-cli KEYS "rate_limit:*" | wc -l
# Логи безопасности
tail -f /var/log/quoter/security.log | grep "WARN\|ERROR"
```
### Регулярное обслуживание
- Очистка старых записей из Redis
- Анализ логов на предмет новых угроз
- Обновление списков подозрительных паттернов
- Тестирование защиты от DDoS
## 🚨 Реагирование на инциденты
### При обнаружении атаки
1. **Анализ логов**: определение источника и типа атаки
2. **Блокировка IP**: добавление в firewall rules
3. **Масштабирование**: увеличение ресурсов при необходимости
4. **Документирование**: запись деталей для улучшения защиты
### Команды для экстренного реагирования
```bash
# Блокировка IP через Redis
redis-cli SET "rate_limit:general:192.168.1.100" '{"blocked_until":9999999999}'
# Проверка активных атак
grep "Rate limit exceeded" /var/log/quoter.log | tail -20
# Очистка всех rate limits (экстренная мера)
redis-cli FLUSHDB
```