🔒 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:
176
docs/security.md
Normal file
176
docs/security.md
Normal 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
|
||||
```
|
||||
Reference in New Issue
Block a user