Система защиты от DoS/DDoS атак

Комплексное решение для защиты веб-сайта от различных типов атак, включая DoS, DDoS, брутфорс и другие виды подозрительной активности. Система разработана с учетом производительности и отказоустойчивости, обеспечивая многоуровневую защиту с возможностью гибкой настройки.

Основные компоненты системы

1. Модуль мониторинга и блокировки (security_monitor.php)

Ядро системы, которое анализирует все входящие запросы и принимает решения о блокировке на основе различных критериев.

Основной принцип работы:

  1. Инициализация: При каждом запросе создается экземпляр класса LightSecurityMonitor, который определяет IP-адрес клиента, проверяет настройки и устанавливает соединения с хранилищами данных (Redis и/или MariaDB).
  2. Проверка белого списка: Система сначала проверяет, находится ли IP-адрес в белом списке. IP из белого списка пропускаются без дальнейших проверок.
  3. Проверка блокировки: Система проверяет, заблокирован ли уже данный IP-адрес. Проверка выполняется максимально быстро сначала через Redis (O(1) операция), затем через файловый кеш.
  4. Мониторинг запросов: Если IP не заблокирован, система регистрирует запрос и анализирует частоту запросов:
    • Проверка частоты запросов в секунду
    • Проверка общего количества запросов в заданном временном окне
    • Проверка подозрительности запроса на основе URL и User-Agent
  5. Принятие решения: На основе анализа система может:
    • Пропустить запрос (нормальная активность)
    • Применить троттлинг (замедление обработки запросов)
    • Заблокировать IP (при превышении лимитов)
  6. Механизмы блокировки: При принятии решения о блокировке система может использовать несколько уровней:
    • Блокировка на уровне приложения (через Redis/MariaDB)
    • Блокировка через .htaccess (Apache)
    • Блокировка через ip.conf (Nginx)
    • Блокировка через iptables/ip6tables (брандмауэр ОС)
    • Блокировка через внешний API
  7. Жесткая блокировка: При обнаружении особо агрессивной активности или при повторных нарушениях система может применить "жесткую блокировку", используя все доступные механизмы одновременно.

Ключевые особенности:

Отказоустойчивость: Система имеет несколько уровней резервирования:
  • Redis → MariaDB → Файловый кеш
  • Автоматическое переключение между хранилищами при недоступности основного
Производительность: Использование Redis для кэширования и быстрого доступа к данным о блокировках.
Прогрессивная блокировка: Увеличение времени блокировки при повторных нарушениях:
  • Первая блокировка: 1 час
  • Вторая блокировка: 3 часа
  • Третья блокировка: 6 часов
  • ...и т.д. до 7 дней
Троттлинг: Система может не блокировать IP полностью, а постепенно увеличивать задержку обработки запросов при приближении к лимитам.
Автоматическая защита от массовых атак: Система отслеживает общее количество заблокированных IP-адресов и может активировать режим жесткой защиты при превышении порога.

2. Модуль разблокировки (recaptcha_unlock.php)

Этот компонент предоставляет интерфейс для разблокировки IP-адресов с помощью reCAPTCHA:

3. Административный интерфейс (admin.php)

Панель управления для администраторов с функциями:

4. Модуль эскалации блокировок (block_escalation.php)

Отвечает за повышение уровня блокировки при повторных запросах от заблокированных IP-адресов:

5. Модуль очистки (cleanup.php)

Выполняет периодическое обслуживание системы:

Варианты настроек в settings.php

1. Слабый режим (минимальное воздействие)

Этот режим минимально влияет на пользователей, используя преимущественно временные блокировки на уровне приложения и троттлинг. Жесткие блокировки отключены, а пороги обнаружения атак установлены достаточно высоко.

// Настройки механизмов блокировки
define('ENABLE_HTACCESS_BLOCKING', false);  // Отключаем блокировку через .htaccess
define('ENABLE_NGINX_BLOCKING', false);     // Отключаем блокировку через Nginx
define('ENABLE_FIREWALL_BLOCKING', false);  // Отключаем блокировку через брандмауэр
define('ENABLE_API_BLOCKING', false);       // Отключаем блокировку через API

// Настройка принудительной жесткой блокировки
define('HARD_BLOCK_ON_FIRST_VIOLATION', false);  // Не применяем жесткую блокировку при первом нарушении

// Настройки прогрессивной блокировки
define('BLOCK_TIME_FIRST', 900);            // Первая блокировка (15 минут)
define('BLOCK_TIME_SECOND', 1800);          // Вторая блокировка (30 минут)
define('BLOCK_TIME_THIRD', 3600);           // Третья блокировка (1 час)
define('BLOCK_TIME_FOURTH', 7200);          // Четвертая блокировка (2 часа)
define('BLOCK_TIME_FIFTH', 14400);          // Пятая блокировка (4 часа)
define('BLOCK_TIME_SIXTH', 28800);          // Шестая блокировка (8 часов)
define('BLOCK_TIME_SEVENTH_PLUS', 86400);   // Седьмая и последующие блокировки (1 день)

// Лимиты для обнаружения атак (увеличенные пороги)
define('MAX_REQUESTS_PER_SECOND', 8);       // Максимальное количество запросов в секунду
define('MAX_REQUESTS_PER_MINUTE', 60);      // Максимальное количество запросов в минуту
define('MAX_REQUESTS_PER_IP', 150);         // Максимум запросов с одного IP
define('RATE_CHECK_WINDOW', 10);            // Окно проверки частоты запросов (секунды)
define('RATE_THRESHOLD', 60);               // Порог запросов в окне для блокировки

// Настройки для автоматической жесткой блокировки
define('AUTO_HARD_BLOCK_ENABLED', false);   // Отключаем автоматическую жесткую блокировку

// Настройки троттлинга
define('THROTTLING_ENABLED', true);         // Включаем троттлинг вместо блокировки
define('THROTTLING_APPLY_DELAY', true);     // Применять задержку при превышении лимитов
define('THROTTLING_BLOCK_ON_HARD_LIMIT', false); // Не блокировать при жестком превышении лимита

// Настройки проверки Cookie
define('DISABLE_COOKIE_SECURITY_CHECK', true); // Отключаем проверку Cookie

2. Средний режим (сбалансированный)

Этот режим обеспечивает сбалансированную защиту, используя комбинацию механизмов блокировки. Жесткая блокировка активируется автоматически при массовых атаках, а пороги обнаружения установлены на среднем уровне.

// Настройки механизмов блокировки
define('ENABLE_HTACCESS_BLOCKING', true);   // Включаем блокировку через .htaccess
define('ENABLE_NGINX_BLOCKING', false);     // Отключаем блокировку через Nginx
define('ENABLE_FIREWALL_BLOCKING', true);   // Включаем блокировку через брандмауэр
define('ENABLE_API_BLOCKING', false);       // Отключаем блокировку через API

// Настройка принудительной жесткой блокировки
define('HARD_BLOCK_ON_FIRST_VIOLATION', false); // Не применяем жесткую блокировку при первом нарушении

// Настройки прогрессивной блокировки
define('BLOCK_TIME_FIRST', 3600);           // Первая блокировка (1 час)
define('BLOCK_TIME_SECOND', 10800);         // Вторая блокировка (3 часа)
define('BLOCK_TIME_THIRD', 21600);          // Третья блокировка (6 часов)
define('BLOCK_TIME_FOURTH', 43200);         // Четвертая блокировка (12 часов)
define('BLOCK_TIME_FIFTH', 86400);          // Пятая блокировка (24 часа)
define('BLOCK_TIME_SIXTH', 259200);         // Шестая блокировка (3 дня)
define('BLOCK_TIME_SEVENTH_PLUS', 604800);  // Седьмая и последующие блокировки (7 дней)

// Лимиты для обнаружения атак (сбалансированные пороги)
define('MAX_REQUESTS_PER_SECOND', 5);       // Максимальное количество запросов в секунду
define('MAX_REQUESTS_PER_MINUTE', 40);      // Максимальное количество запросов в минуту
define('MAX_REQUESTS_PER_IP', 100);         // Максимум запросов с одного IP
define('RATE_CHECK_WINDOW', 10);            // Окно проверки частоты запросов (секунды)
define('RATE_THRESHOLD', 40);               // Порог запросов в окне для блокировки

// Настройки для автоматической жесткой блокировки
define('AUTO_HARD_BLOCK_ENABLED', true);    // Включаем автоматическую жесткую блокировку
define('AUTO_HARD_BLOCK_THRESHOLD', 100);   // Порог блокировки - 100 IP
define('AUTO_HARD_BLOCK_ACTION', 'iptables'); // Метод жесткой блокировки через iptables

// Настройки троттлинга
define('THROTTLING_ENABLED', true);         // Включаем троттлинг
define('THROTTLING_APPLY_DELAY', true);     // Применять задержку при превышении лимитов
define('THROTTLING_BLOCK_ON_HARD_LIMIT', true); // Блокировать при жестком превышении лимита

// Настройки проверки Cookie
define('DISABLE_COOKIE_SECURITY_CHECK', false); // Включаем проверку Cookie
define('DISABLE_COOKIE_SECURITY_BLOCKING', false); // Включаем блокировку при проблемах с Cookie

3. Жесткий режим (максимальная защита)

Этот режим обеспечивает максимальную защиту от атак, используя все доступные механизмы блокировки с низкими порогами обнаружения атак. Жесткая блокировка применяется с первого нарушения, а времена блокировки значительно увеличены.

// Настройки механизмов блокировки
define('ENABLE_HTACCESS_BLOCKING', true);   // Включаем блокировку через .htaccess
define('ENABLE_NGINX_BLOCKING', true);      // Включаем блокировку через Nginx
define('ENABLE_FIREWALL_BLOCKING', true);   // Включаем блокировку через брандмауэр
define('ENABLE_API_BLOCKING', true);        // Включаем блокировку через API

// Настройка принудительной жесткой блокировки
define('HARD_BLOCK_ON_FIRST_VIOLATION', true); // Применяем жесткую блокировку при первом нарушении

// Настройки прогрессивной блокировки (увеличенное время блокировки)
define('BLOCK_TIME_FIRST', 10800);          // Первая блокировка (3 часа)
define('BLOCK_TIME_SECOND', 21600);         // Вторая блокировка (6 часов)
define('BLOCK_TIME_THIRD', 43200);          // Третья блокировка (12 часов)
define('BLOCK_TIME_FOURTH', 86400);         // Четвертая блокировка (24 часа)
define('BLOCK_TIME_FIFTH', 259200);         // Пятая блокировка (3 дня)
define('BLOCK_TIME_SIXTH', 604800);         // Шестая блокировка (7 дней)
define('BLOCK_TIME_SEVENTH_PLUS', 2592000); // Седьмая и последующие блокировки (30 дней)

// Лимиты для обнаружения атак (низкие пороги)
define('MAX_REQUESTS_PER_SECOND', 3);       // Максимальное количество запросов в секунду
define('MAX_REQUESTS_PER_MINUTE', 20);      // Максимальное количество запросов в минуту
define('MAX_REQUESTS_PER_IP', 60);          // Максимум запросов с одного IP
define('RATE_CHECK_WINDOW', 10);            // Окно проверки частоты запросов (секунды)
define('RATE_THRESHOLD', 20);               // Порог запросов в окне для блокировки

// Настройки для автоматической жесткой блокировки
define('AUTO_HARD_BLOCK_ENABLED', true);    // Включаем автоматическую жесткую блокировку
define('AUTO_HARD_BLOCK_THRESHOLD', 50);    // Порог блокировки - 50 IP
define('AUTO_HARD_BLOCK_ACTION', 'all');    // Метод жесткой блокировки - все доступные средства

// Настройки уведомлений о жесткой блокировке
define('AUTO_HARD_BLOCK_NOTIFY_ADMIN', true); // Включаем уведомления администратору
define('AUTO_HARD_BLOCK_NOTIFY_INTERVAL', 1); // Интервал уведомлений - 1 час

// Настройки троттлинга
define('THROTTLING_ENABLED', true);         // Включаем троттлинг
define('THROTTLING_APPLY_DELAY', true);     // Применять задержку при превышении лимитов
define('THROTTLING_BLOCK_ON_HARD_LIMIT', true); // Блокировать при жестком превышении лимита

// Настройки проверки Cookie
define('DISABLE_COOKIE_SECURITY_CHECK', false); // Включаем проверку Cookie
define('DISABLE_COOKIE_SECURITY_BLOCKING', false); // Включаем блокировку при проблемах с Cookie

// Дополнительные настройки
define('FORCE_BLOCKING_ON_FAILURE', true);  // Принудительная блокировка при отказе систем
define('ESCALATE_BLOCK_ON_REPEAT_ATTEMPTS', true); // Повышать уровень блокировки при повторных попытках
define('ATTEMPTS_BEFORE_ESCALATION', 1);    // Количество попыток до повышения уровня - 1

Детальный обзор security_monitor.php

Основные методы и их функциональность

Метод Описание
Конструктор (__construct)
  • Инициализирует основные переменные
  • Настраивает обработку ошибок
  • Определяет IP-адрес клиента
  • Загружает белый список и проверяет его
  • Устанавливает соединение с Redis и/или базой данных
  • Проверяет, заблокирован ли текущий IP-адрес
monitorRequest
  • Основной метод мониторинга, который вызывается для каждого запроса
  • Проверяет белый список
  • Применяет троттлинг при необходимости
  • Проверяет и повышает уровень блокировки
  • Регистрирует и анализирует подозрительную активность
checkIPRateLimitRedis / checkIPRateLimitInDatabase
  • Отслеживает частоту запросов от конкретного IP
  • Сравнивает с пороговыми значениями
  • Возвращает true, если лимит превышен
checkPageRateLimitRedis / checkPageRateLimit
  • Отслеживает частоту запросов страниц в секунду
  • Использует сессию для отслеживания запросов от одного пользователя
  • Возвращает true, если лимит превышен
isRequestSuspicious
  • Анализирует запрос на подозрительность
  • Проверяет User-Agent, URL и другие параметры
  • Определяет, является ли запрос от легитимного поискового бота
blockIPRedis / blockIP
  • Блокирует IP-адрес на определенное время
  • Применяет прогрессивную логику блокировки
  • Обновляет счетчик блокировок
  • Логирует информацию о блокировке
applyExternalBlockings
  • Применяет внешние механизмы блокировки (htaccess, nginx, iptables, API)
  • Вызывается при жестких блокировках или повторных нарушениях
applyThrottling
  • Применяет механизм троттлинга для плавного ограничения доступа
  • Рассчитывает задержку на основе превышения лимита
  • Добавляет соответствующие HTTP-заголовки
  • Применяет задержку, если настройки это позволяют
checkAndApplyAutoHardBlock
  • Проверяет количество заблокированных IP-адресов
  • Если превышен порог, активирует жесткую блокировку
  • Уведомляет администратора при необходимости

Механизмы защиты от сбоев

1. Резервное хранение данных

2. Обработка ошибок

3. Режим аварийной блокировки

4. Проверка связности

Особенности и оптимизации

1. Многоуровневый кэш

2. Оптимизация памяти

3. Оптимизация запросов

4. Совместимость

5. Производительность

Типы атак, от которых защищает система

DoS и DDoS атаки

Защита от атак, направленных на перегрузку сервера большим количеством запросов:

Брутфорс и перебор

Защита от попыток подбора паролей и других данных:

Scraping и парсинг

Защита от автоматического сбора данных с сайта:

Атаки на уязвимости

Защита от попыток эксплуатации уязвимостей через множественные запросы:

Рекомендации по установке и использованию

Требования к системе

Инструкция по установке

  1. Скопируйте все файлы в директорию /dos/ на вашем веб-сервере
  2. Настройте параметры подключения к базе данных и другие настройки в settings.php
  3. Создайте таблицы в базе данных, используя команду php /path/to/dos/cleanup.php
  4. Добавьте следующий код в начало основного файла вашего сайта (например, index.php):
    require_once '/path/to/dos/security_monitor.php';
    $monitor = new LightSecurityMonitor();
    $monitor->monitorRequest();
  5. Настройте CRON-задачу для периодической очистки и обслуживания:
    0 * * * * php /path/to/dos/cleanup.php > /dev/null 2>&1
  6. Убедитесь, что страница разблокировки доступна по адресу /dos/recaptcha_unlock.php
  7. Убедитесь, что административная панель доступна по адресу /dos/admin.php

Рекомендации по выбору режима

Тип сайта Рекомендуемый режим Комментарии
Личный блог или небольшой сайт Слабый Минимальное воздействие на пользователей при базовой защите
Корпоративный сайт или интернет-магазин Средний Сбалансированная защита с автоматической активацией жесткого режима при атаках
Высоконагруженный проект или сайт с повышенными требованиями к безопасности Жесткий Максимальная защита с повышенным риском ложных срабатываний

Советы по обслуживанию

Заключение

Данная система защиты представляет собой многоуровневое решение с гибкими настройками и высокой отказоустойчивостью. Она эффективно противодействует различным типам атак, минимизируя воздействие на легитимных пользователей.

Ключевыми особенностями системы являются:

В зависимости от требований к безопасности и доступности, можно выбрать один из трех предложенных режимов настройки: слабый, средний или жесткий. Эти режимы обеспечивают баланс между защитой от атак и удобством использования сайта для легитимных пользователей.