Любой ресурс, доступный в интернете, может рано или поздно подвергнуться различным сетевым атакам. В этой статье мы рассмотрим, как противостоять этим угрозам с акцентом на DDoS.
Что такое DDoS атака?
DDoS атака — это попытка перегрузить сервер или сайт, отправляя множество запросов от разных источников, чтобы сделать его недоступным для пользователей.
Рис. 1 Как работает DDoS атака
Защита сайта
Для защиты мы будем использовать модуль NGINX для лимитирования запросов (ngx_http_limit_req_module) и систему обнаружения и предотвращения вторжений (IDS/IPS) Fail2Ban.
Принцип работы:
Модуль лимитирования запросов ограничивает количество запросов от пользователей и записывает события в error.log.
Fail2Ban парсит данные из лог-файла с использованием фильтров и блокирует IP-адреса, производящие подозрительные запросы.
Предполагается, что у вас уже установлен:
- NGINX в качестве веб-сервера или обратного прокси;
- Сервис Fail2Ban.
Итак, приступим.
Подключаем модуль лимитера запросов в NGINX
В основном конфигурационном файле /etc/nginx/nginx.conf добавьте следующее:
http {
limit_req_zone $binary_remote_addr zone=example:100m rate=30r/m;
...
}
Команда limit_req_zone $binary_remote_addr zone=example:100m rate=30r/m; создает зону лимитирования, которая:
- Использует IP-адрес клиента для идентификации;
- Хранит данные в зоне example размером 100 МБ;
- Ограничивает 30 запросов в минуту от одного IP-адреса.
Далее необходимо применить зону для одного из location:
location = /admin {
limit_req zone=example burst=1 nodelay;
...
}
nodelay гарантирует, что, как только лимит запросов будет превышен, будет возвращен код статуса HTTP 503 (Service Unavailable).
Подключаем фильтр nginx-limit-req в Fail2Ban
Создадим новый jail.local командой:
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
Отредактируем /etc/fail2ban/jail.local и приведем содержимое фильтра nginx-limit-req к следующему виду:
[nginx-limit-req]
enabled = true
port = http,https
logpath = %(nginx_error_log)s
По умолчанию в Fail2Ban при срабатывании определенного условия (например, обнаружении 5 совпадений) активируется правило, которое блокирует IP-адрес злоумышленника на 10 минут. Эти значения можно изменить в конфигурации jail.local, подправив параметры maxretry (максимальное количество попыток) и bantime (время блокировки).