Files
quoter/docs/security.md
Untone 82668768d0 🔒 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.
2025-09-02 11:40:43 +03:00

7.2 KiB
Raw Blame History

🔒 Безопасность и защита от DDoS

Обзор

Система quoter включает многоуровневую защиту от различных типов атак, включая DDoS, брутфорс и эксплуатацию уязвимостей.

🛡️ Уровни защиты

1. Сетевой уровень (HTTP Server)

Ограничения размера запросов

  • Максимальный размер payload: 500 МБ
  • Максимальный размер JSON: 1 МБ
  • Таймаут соединения: настраивается через Actix-web

Заголовки безопасности

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

Детекция атак

// Подозрительные паттерны
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

# Redis (для rate limiting)
REDIS_URL=redis://localhost:6379

# Security настройки
MAX_PAYLOAD_SIZE=524288000  # 500MB
MAX_PATH_LENGTH=1000
MAX_HEADERS_COUNT=50

Настройка Rate Limits

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

Логирование

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. Мониторинг: Система алертов для подозрительной активности

Настройка мониторинга

# Проверка заблокированных 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. Документирование: запись деталей для улучшения защиты

Команды для экстренного реагирования

# Блокировка 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