# Практическая работа № 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

2) Теперь нужно импортировать официальный ключ, используемый apt для проверки подлинности пакетов. Скачайте ключ:
>curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

3) Проверьте, верный ли ключ был загружен:
>gpg --dry-run --quiet --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg

Вывод команды должен содержать полный отпечаток ключа
573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62:

Если отпечаток отличается от вышеуказанного, удалите файл ключа.
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

5) Для использования пакетов из нашего репозитория вместо распространяемых в дистрибутиве, настройте закрепление:
> echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n"
| sudo tee /etc/apt/preferences.d/99nginx

6) Установим nginx:
> sudo apt update
> sudo apt install nginx
7) Потом запустим nginx и проверим статус:
> service nginx start
> service nginx status


Вводим ip нашей машинки в бразуере, если все сделали правильно, то появится страничка с nginx.
Видим, что nginx запущен, все отлично.
Если при запуске открывается Apache2:

То необходимо сделать следующее:
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 адрес и должны увидеть:

# Далее переходим к настройке 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 не задерживал запросы

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 - количество запосов в секунду

5) Нам необходимо перезапустить nginx для вступлления в силу внесённых изменений:
> service nginx stop
> service nginx start
> service nginx status
После чего вбиваем ip-адрес сервера в браузере, переходим в режим разработчика и далее делаем многочисленные запросы:
>в Chrome это - ctrl+r

Данные ошибки будут отображаться в log файле, его данные дадут нам нужную информация для настройки фильтрации fail2ban:
> cat /var/log/nginx/error.log

# Настройка 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

6) Затем делаем рестарт fail2ban:
> service fail2ban restart
7) Теперь нам нужно посмотреть, что iptables отрабатывает и наберём:
> iptables -L -v

8) Убедимся, что настройки в fail2ban применились и введём:
> fail2ban-client status

Видим, что фильтры работают по nginx-limit-req, sshd.
9) Также проверим, что сейчас нет заблокированных ip-адресов:
> fail2ban-client status nginx-limit-req

# Проверка работоспособности:
1) Теперь переходим на нашу страничку и вводим ip-адрес сервера в браузере, переходим в режим разработчика и далее делаем многочисленные запросы: в Chrome это - ctrl+r

2) После того как мы добились блокировки нашего ip-адреса посмотрим, что же нам скажет fail2ban:

Собственно вот и заблочился айпишник, с которого совершались многочисленные запросы.
3) И iptables:

Видим, что добавилось правило.