# Практическая работа №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. Суть осталась прежней, но теперь атаки реализуются с нескольких компьютеров на один целевой хост. От количества атакующих устройств и объема отправляемого трафика, зависит мощность нападения.

## Разворачивание сервера nginx на базе дистрибутивов Debian.
Установим пакеты, необходимые для подключения apt-репозитория:
> sudo apt install curl gnupg2 ca-certificates lsb-release debian-archive-keyring

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

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

Вывод команды должен содержать полный отпечаток ключа, как указано на скриншоте выше.
Для подключения 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

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

Чтобы установить nginx, выполним следующие команды:
> sudo apt update
> sudo apt install nginx
Необходимо запустить nginx и проверить его состояние:
> service nginx start
> service nginx status

Если при запуске открывается 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 адрес и должны увидеть:

## Установка Fail2Ban
Необходимо установить следующее:
> apt install fail2ban
Дополнение, чтобы fail2ban мог эффективнее блокировать большое количество запросов:
> apt install ipset
После установки перейдём в директорию:
> /etc/nginx/sites-enabled/default
Выставляем следующие параметры:
> limit_req zone=ltwo burst=5 nodelay;

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

Нам необходимо перезапустить nginx для вступлления в силу внесённых изменений:
1. service nginx stop
2. service nginx start
3. service nginx status
После чего вбиваем ip-адрес сервера в браузере, переходим в режим разработчика и далее делаем многочисленные запросы:

Данные ошибки будут отображаться в 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***, так как для борьбы с ботами - это более ***эффективно***.
Далее переходим в файл:
> nano /etc/fail2ban/action.d/iptables-common.conf
Но как мы уже знаем, настройки конфигурационных файлов поумолчанию могут быть перезаписаны при обновлении, поэтому создаём новый файл:
> touch iptables-blocktype.local
```
[Init]
blocktype = DROP
```

Затем делаем рестарт fail2ban:
> service fail2ban restart

Теперь нам нужно посмотреть, что iptables отрабатывает и наберём:
> iptables -L -v

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

Видим, что фильтры работают по **nginx-limit-req**, **sshd**:

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

## Проверка работоспособности
Теперь переходим на нашу страничку и вводим ip-адрес сервера в браузере, переходим в режим разработчика и далее вновь делаем многочисленные запросы.
Примеры выводов:


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

И iptables:
