# Практическая работа № 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) Легкое предотвращение Достаточно заблокировать источник кибератаки. С этим может справиться системный администратор или сетевые фильтры. **DDoS -** к термину добавили дополнительную букву «D» (Distributed т.е. распределенная) и появился новый вид атак — DDoS. Суть осталась прежней, но теперь атаки реализуются с нескольких компьютеров на один целевой хост. От количества атакующих устройств и объема отправляемого трафика, зависит мощность нападения. # Разворачиваем сервера nginx. 1) Установим необходимы пакеты: > sudo apt install curl gnupg2 ca-certificates lsb-release debian-archive-keyring ![](https://i.imgur.com/t5Hh7xx.png) 2) Теперь нужно импортировать официальный ключ, используемый 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/BREdnh4.png) 3) Проверьте, верный ли ключ был загружен: >gpg --dry-run --quiet --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg ![](https://i.imgur.com/O53HB60.png) Вывод команды должен содержать полный отпечаток ключа 573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62: ![](https://i.imgur.com/lSrnUlU.png) Если отпечаток отличается от вышеуказанного, удалите файл ключа. 4) Для подключения 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/fwysfw3.png) 5) Для использования пакетов из нашего репозитория вместо распространяемых в дистрибутиве, настройте закрепление: > 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/uglxcHR.png) 6) Установим nginx: > sudo apt update > sudo apt install nginx 7) Потом запустим nginx и проверим статус: > service nginx start > service nginx status ![](https://i.imgur.com/s8hG6fM.png) ![](https://i.imgur.com/T4SpxiG.png) Вводим ip нашей машинки в бразуере, если все сделали правильно, то появится страничка с nginx. Видим, что nginx запущен, все отлично. Если при запуске открывается 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) # Далее переходим к настройке nginx от DDoS атак на наш сервер. 1) Устанавливаем fail2ban и ipset: >apt install fail2ban >apt install ipset - дополнение, чтобы fail2ban мог эффективнее блокировать большое количество запросов 2) Далее переходим: >nano /etc/nginx/sites-enable/default - тут находится стартовая страничка nginx 3) Выставляем следующие параметры: >limit_req zone=ltwo burst=5 nodelay; * limit_req - директива для zone=ltwo * burst=5 - всплеск разрешён максимально 5 * и стоит опция nodelay, чтобы nginx не задерживал запросы ![](https://i.imgur.com/5mDuwHV.png) 4) Далее переходим в конфигурационный файл 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/Y681fEm.png) 5) Нам необходимо перезапустить nginx для вступлления в силу внесённых изменений: > service nginx stop > service nginx start > service nginx status После чего вбиваем ip-адрес сервера в браузере, переходим в режим разработчика и далее делаем многочисленные запросы: >в Chrome это - ctrl+r ![](https://i.imgur.com/OtnkVqh.png) Данные ошибки будут отображаться в log файле, его данные дадут нам нужную информация для настройки фильтрации fail2ban: > cat /var/log/nginx/error.log ![](https://i.imgur.com/homiCNU.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 После чего нам необходимо изменить настройку, что iptables не отсылал reject, а drop, так как для борьбы с ботами - это более эффективно. 4) Далее переходим в файл: > nano /etc/fail2ban/action.d/iptables-common.conf 5) Но как мы уже знаем, настройки конфигурационных файлов поумолчанию могут быть перезаписаны при обновлении, поэтому создаём новый файл: > touch iptables-blocktype.local ![](https://i.imgur.com/m0P5YC4.png) 6) Затем делаем рестарт fail2ban: > service fail2ban restart 7) Теперь нам нужно посмотреть, что iptables отрабатывает и наберём: > iptables -L -v ![](https://i.imgur.com/UPmPIBa.png) 8) Убедимся, что настройки в fail2ban применились и введём: > fail2ban-client status ![](https://i.imgur.com/QFGlr9V.png) Видим, что фильтры работают по nginx-limit-req, sshd. 9) Также проверим, что сейчас нет заблокированных ip-адресов: > fail2ban-client status nginx-limit-req ![](https://i.imgur.com/YHlP9Dd.png) # Проверка работоспособности: 1) Теперь переходим на нашу страничку и вводим ip-адрес сервера в браузере, переходим в режим разработчика и далее делаем многочисленные запросы: в Chrome это - ctrl+r ![](https://i.imgur.com/Pq80n45.png) 2) После того как мы добились блокировки нашего ip-адреса посмотрим, что же нам скажет fail2ban: ![](https://i.imgur.com/SxHoAE5.png) Собственно вот и заблочился айпишник, с которого совершались многочисленные запросы. 3) И iptables: ![](https://i.imgur.com/2io69VH.png) Видим, что добавилось правило.