177 lines
7.2 KiB
Markdown
177 lines
7.2 KiB
Markdown
|
|
# 🔒 Безопасность и защита от 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
|
|||
|
|
```
|