# Практическая работа №7 (“Fail2Ban и Dos/DDoS attack” на примере nginx.) ## Цель работы: 1. Научиться разворачивать сервер nginx; 2. Научиться защищать сервер nginx; 3. Провести тестовую атаку DOS на сервер nginx. ## Задача: 1. Организовать простую-тестовую атаку DoS; 2. Защитить сервер от DoS/DDoS атак через встроенные возможности nginx; 3. Защитить сервер от DoS/DDoS атак с помощью fail2ban при помощи iptables в автоматическом режиме; 4. Защитить сервер от DoS/DDoS атак с помощью fail2ban при помощи ipset в автоматическом режиме; 5. Составить собственную инфструкцию о проделанной работе по данной практике. ## Основные понятия 1. ***DoS*** (англ. Denial of Service «отказ в обслуживании») — кибератака на систему с целью вывести ее из строя. Искусственно создаются условия, при которых польз ***Особенности DoS-атак***: DoS-атака напрямую не опасна для сервера. Но важно помнить о потере потенциальной прибыли из-за простоев во время нападения. Далее рассмотрим три отличительных особенности DoS-атак: 1. Требуется один компьютер > Атака ведется с одного хоста и направлена на отдельные сети или системы. 2. Простое обнаружение > Легко зафиксировать, посмотрев системные журналы сервера. Они покажут все записи, связанные с подозрительным IP-адресом. 3. Легкое предотвращение > Достаточно заблокировать источник кибератаки. С этим может справиться системный администратор или сетевые фильтры. 2. ***DDoS*** - к термину добавили дополнительную букву «D» (Distributed т.е. распределенная) и появился новый вид атак — DDoS. Суть осталась прежней, но теперь атаки реализуются с нескольких компьютеров на один целевой хост. От количества атакующих устройств и объема отправляемого трафика, зависит мощность нападения. ![](https://i.imgur.com/WM54Ubs.png) ## Разворачивание сервера nginx на базе дистрибутивов Debian. Установим пакеты, необходимые для подключения apt-репозитория: > sudo apt install curl gnupg2 ca-certificates lsb-release debian-archive-keyring ![](https://i.imgur.com/vzx1kYA.png) Теперь нужно импортировать официальный ключ, используемый apt для проверки подлинности пакетов. Скачаем ключ: > curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null ![](https://i.imgur.com/jkYeax1.png) Проверим, верный ли ключ был загружен: > gpg --dry-run --quiet --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg ![](https://i.imgur.com/6jKFVjg.png) Вывод команды должен содержать полный отпечаток ключа, как указано на скриншоте выше. Для подключения apt-репозитория для стабильной версии nginx, выполним следующую команду: > echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/debian `lsb_release -cs` nginx" | sudo tee /etc/apt/sources.list.d/nginx.list ![](https://i.imgur.com/SubyfK3.png) Для использования пакетов из нашего репозитория вместо распространяемых в дистрибутиве, настроим закрепление: > echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" | sudo tee /etc/apt/preferences.d/99nginx ![](https://i.imgur.com/jGCb0bs.png) Чтобы установить nginx, выполним следующие команды: > sudo apt update > sudo apt install nginx Необходимо запустить nginx и проверить его состояние: > service nginx start > service nginx status ![](https://i.imgur.com/psA4s1n.png) Если при запуске открывается Apache2: ![](https://i.imgur.com/Pshsc7x.png) То необходимо сделать следующее: 1. Перейти в директорию `cd /var/www/html`. 2. Создать в этой директории папку folder1 `mkdir folder1`. 3. Скопировать index.nginx-debian.html в папку folder1 `cp index.html folder1/`. 4. Заходим в конфигурацию `/etc/nginx/sites-enabled/default` и заменяем путь на `/var/www/html/folder1`. 5. Перезапускаем nginx командой `service nginx restart`. 6. Переходим в поисковик, вводим свой ip адрес и должны увидеть: ![](https://i.imgur.com/WWcE4yY.png) ## Установка Fail2Ban Необходимо установить следующее: > apt install fail2ban Дополнение, чтобы fail2ban мог эффективнее блокировать большое количество запросов: > apt install ipset После установки перейдём в директорию: > /etc/nginx/sites-enabled/default Выставляем следующие параметры: > limit_req zone=ltwo burst=5 nodelay; ![](https://i.imgur.com/qcJ9nUE.png) Где: 1. limit_req - директива для zone=ltwo. 2. burst=5 - всплеск разрешён максимально 5. 3. nodelay - чтобы nginx не задерживал запросы. Далее переходим в конфигурационный файл nginx.conf, в данном файле нам надо внести следующие изменения: > nano /etc/nginx/nginx.conf Вводим: > limit_conn_zone $binary_remote_addr zone=lone:10m; > limit_req_zone $binary_remote_addr zone=ltwo:10m rate=3r/s; > limit_req_zone $binary_remote_addr zone=highspeed:10m rate=10r/s; `ltwo` - зона ограничения частоты запросов `10m` - размер зоны в мегабайтах `3r/s` - количество запосов в секунду ![](https://i.imgur.com/fK6kk49.png) Нам необходимо перезапустить nginx для вступлления в силу внесённых изменений: 1. service nginx stop 2. service nginx start 3. service nginx status После чего вбиваем ip-адрес сервера в браузере, переходим в режим разработчика и далее делаем многочисленные запросы: ![](https://i.imgur.com/BT4rjGv.png) Данные ошибки будут отображаться в log файле, его данные дадут нам нужную информация для настройки фильтрации fail2ban: > cat /var/log/nginx/error.log ![](https://i.imgur.com/uGBRkRM.png) ## Настройка Fail2Ban от DDoS атак 1. Перейдём в директорию в fail2ban > cd /etc/fail2ban 2. Затем создадим файл с именем jail.local: > touch jail.local 3. Внесём в этот файл следующие параметры: > nano jail.local ``` [nginx-limit-req] port = http, https enabled = true filter = nginx-limit-req action = iptables-multiport[name=ReqLimit, port="http,https", protocol=tcp] logpath = /var/log/nginx/*error.log findtime = 600 bantime = 3600 maxretry = 4 ``` ![](https://i.imgur.com/N6MlNZQ.png) После чего нам необходимо изменить настройку, что iptables ***не отсылал reject, а drop***, так как для борьбы с ботами - это более ***эффективно***. Далее переходим в файл: > nano /etc/fail2ban/action.d/iptables-common.conf Но как мы уже знаем, настройки конфигурационных файлов поумолчанию могут быть перезаписаны при обновлении, поэтому создаём новый файл: > touch iptables-blocktype.local ``` [Init] blocktype = DROP ``` ![](https://i.imgur.com/WglFAyH.png) Затем делаем рестарт fail2ban: > service fail2ban restart ![](https://i.imgur.com/QDLiJu8.png) Теперь нам нужно посмотреть, что iptables отрабатывает и наберём: > iptables -L -v ![](https://i.imgur.com/PwlJr7M.png) Убедимся, что настройки в fail2ban применились и введём: > fail2ban-client status ![](https://i.imgur.com/pQHNOHC.png) Видим, что фильтры работают по **nginx-limit-req**, **sshd**: ![](https://i.imgur.com/LhGBav1.png) Также проверим, что сейчас нет заблокированных ip-адресов: > fail2ban-client status nginx-limit-req ![](https://i.imgur.com/hzgc18D.png) ## Проверка работоспособности Теперь переходим на нашу страничку и вводим ip-адрес сервера в браузере, переходим в режим разработчика и далее вновь делаем многочисленные запросы. Примеры выводов: ![](https://i.imgur.com/wG5QspD.png) ![](https://i.imgur.com/1osIOri.png) После того как мы добились блокировки нашего ip-адреса посмотрим, что же нам скажет fail2ban: ![](https://i.imgur.com/UIMtUhJ.png) И iptables: ![](https://i.imgur.com/oRMxVCw.png)