# Макаров Дмитрий Владиславович - Linux Basic. Практическая работа №4. Безопасность Linux серверов
[toc]
## Практическая работа №4.1 Настройка файлового сервера в корпоративной инфраструктуре
Прежде всего, необходимо определиться, на сервере с какой операционной системой будет находиться общий каталог.
### 1. Разворачиваем три виртуальные машины
1. **Ubuntu - сервер**
2. **Ubuntu - клиент**
3. **Windows – клиент**
4. Делаем **snapshot** каждой из системы после базовых настроек.
Для развертывания файлового сервера на системах Linux используется инструмент SAMBA. Ниже перечислены действия по его установке и настройке.
- Прежде всего следует обновить локальную базу пакетов:
`apt-get update`

- Далее установите пакеты из главного репозитория:
`apt-get install -y samba samba-client`

- Создайте резервную копию файла конфигурации Samba:
`cp /etc/samba/smb.conf /etc/samba/smb.conf.bak`

- Создайте или выберете директорию, к которой все пользователи будут иметь общий доступ:
`mkdir -p /samba/public`

- Перейдите к этому каталогу и измените режим доступа и владельца:
`cd /sambachmod -R 0755 public`

- Создайте или выберете каталог, к которому иметь доступ будут ограниченное число пользователей:
`mkdir /samba/private`

- Создайте группу пользователей, которые будут иметь доступ к приватным данным:
`groupadd smbgr`

- Создайте нужных пользователей с помощью команды *useradd*:
`useradd user1`

- Добавьте созданных пользователей в группу:
`usermod -aG smbgr user1`

- Измените группу, которой принадлежит приватная директория:
`chgrp smbgr /samba/private`

- Задайте пароль, с помощью которого пользователь будет подключаться к каталогу:
`smbpasswd -a user1`

:::info
:information_source: На этом моменте я установил графическу среду xfce для удобства

:::
- Откройте файл конфигурации на редактирование с помощью текстового редактора, например nano:

Настроили конфиг samba.
Создали samba ресурс с названием share.
Права на запись:
группа admins, пользователь pt;
права на чтение:
группа users.

Проверяем

**Создадим новых указанных пользователей и дадим им соответствующие права**


**Чтобы изменения вступили в силу, перезапустите сервис:**
`service smbd restart`

**Добавим сервис в автозагрузку Linux**
`service smbd enable`

Подключимся к шаре через Windows 10


Имеем доступ к папке private

и папке public

пользователем user1 имеем доступ к папке share только на чтение

Подключились с Ubuntu клиента
`sudo smbclient //192.168.71.144/private -U user1`

### 2. Настройка firewall iptables, открыв порты, которые использует SAMBA
С помощью откроем iptables порты, которые испоользует samba.
**Проверить актуальные правила iptables можно командой:**
`iptables -L`

*В выводе команды вы должны увидеть ранее добавленные разрешающие политики (Accept).*
*Теперь необходимо сделать так, чтобы указанные выше правила фаервола iptables были сохранены после перезагрузки машины.
Необходимо установить дополнительный пакет для iptables, ни скрипт, ни запуск вручную не подходит. Есть пакет, который работает штатно.*
Установим iptables-persistent

Правила прописались в конфиге

После перезагрузки правила соханилсь

## Практическая работа №4.2 Fail2Ban-SSH и Brute-force attack
**Fail2ban** — простой в использовании локальный сервис, который отслеживает log–файлы запущенных программ, и на основании различных условий блокирует по IP найденных нарушителей.
**Для начала давайте обновим ОС:**
`sudo apt-get update`

**Далее давайте установим Fail2Ban:**
`sudo apt-get install fail2ban`

**Так как Fail2Ban запускается после перезагрузке или старте ОС сделаем следующее:**
`service fail2ban start`

Теперь посмотрим файлы конфигурации
**Ознакомимся со всеми файлами в директории Fail2Ban:**
`ls -al /etc/Fail2Ban`

самый важный файл - это **jail.conf** (данный файл содержит фильтры по умолчанию для определенных служб)
**Теперь давайте перейдём в нужную директорию и откроем файл конфигурации:**
```
cd /etc/fail2ban
nano jail.conf
```

И первое, что мы видим - это то, что нам рекомендуют создать дополнительный файл с .local расширением так как при обновлении Fail2Ban файл jail.conf может тоже обновиться и настройки будут возвращены поумолчанию. (если нужно настраивать фильтры для многих сервисов, то можно использовать jail.conf (но следить за обновлениями) или скопировать его с разрешением .local)
Давайте приступим к этому
`sudo nano jail.local`
**Нам надо создать фильтр для ssh:**
```
[sshd] - указывает, что это сервис ssh
enable = true - указывает на то, что данные фильтр включен, истина или ложь true
укаем порт и log файл
port = ssh
```
**В итоге мы получаем текст файла следующий:**
```
[sshd]
enable = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600
ignoreip = 127.0.0.1
```

После сохраняем и выходим.
**Вводим:**
`service fail2ban restart`

для того, что применилcя новый конфигурационный файл.
**Проверим, что fail2ban работает:**
`service fail2ban status`

- Теперь давайте попробуем подключиться по ssh и ввести три раза неправильно пароль

- После того как попробуем, можно убедиться ещё одним способом Hydra
`sudo hydra -l root -P /usr/share/hydra/dpl4hydra_local.csv ssh://192.168.71.144 -I -v`
**где:**
- l – использовать логин;
- p – использовать пароль;
- v – подробный вывод;
**если hydra не установленна, то вводим:**
`sudo apt-get install hydra`

**вводим ещё раз**

**и ещё раз**

**Чтобы посмотреть журналы банов в fail2ban вводим:**
`fail2ban-client status`

**и получить более подробно статистику:**
`fail2ban-client status sshd`

Если в конфигурационном файле поменять на false, то ssh начнёт работать корректно и будет давать возможность подключаться.
```
[sshd]
enable = false
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600
ignoreip = 127.0.0.1
```

**Соответственно, если сбросить блокировку fail2ban, необходимо сделать следующее:**
`service fail2ban restart`
**и проверим, что никто в данный момент не блокируется:**
`fail2ban-client status sshd`

далее запускаем hydra ещё раз:
`sudo hydra -l root -P /usr/share/hydra/dpl4hydra_local.csv ssh://192.168.71.144 -I -v`

и проверим ещё раз список блокированных ip-адресов
`fail2ban-client status sshd`
**увидим что fail2ban отработал корректно и заблокировал ip-адрес:**

**Проверим, что будет, если отключить fail2ban и запустить hydra:**
`service fail2ban stop`

`sudo hydra -l root -P /usr/share/hydra/dpl4hydra_local.csv ssh://192.168.71.144 -I -v`

видим что происходит подбор

**Вывод: в этой практической работе мы научились настраивать фильтр fail2ban для ssh от Brute-force attack.**
## Практическая работа №4.3 Fail2Ban и Dos/DDoS attack" на примере nginx.
### 1. Разворачивание сервера 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 выглядит так:**

**если установлен nginx и apache2, то есть вероятность, что при запуске nginx будет появляться стартовая страничка apache2, в этом случае можно сделать следующее:**
`cd /var/www/html`
создать директорию, куда затем переместить или скопировать файл index.html
`cp index.html folder1/`
После этих манипуляций при запуске nginx будет появляться стартовая страничка nginx.

### 2.Далее переходим к настройке nginx от DDoS атак на наш сервер.
**Устанавливаем fail2ban и ipset:**
```
apt install fail2ban
apt install ipset - дополнение, чтобы fail2ban мог эффективнее блокировать большое количество запросов
```


далее переходим:
nano /etc/nginx/sites-enable/default - тут находится стартовая страничка nginx

**выставляем следующие параметры:**
`limit_req zone=ltwo burst=5 nodelay;`

**далее переходим в конфигурационный файл nginx.conf:**
`nano /etc/nginx/nginx.conf` - **в данном файле нам надо внести следующие изменения:**
```
limit_req_zone $binary_remote_addr zone=ltwo:10m rate=3r/s;
```

после чего вбиваем ip-адрес сервера в браузере, переходим в режим разработчика и далее делаем многочисленные запросы

после зажатия ctrl+r - выйдет ошибка 503

**данные ошибки будут отображаться в log файле:**
`cat /var/log/nginx/error.log`

данные log файл даст нам нужную информация для настройки фильтрации fail2ban.
### 2. Настройке fail2ban от DDoS атак на наш сервер.
**Давайте найдём параметр бан в jail.conf или во вновь созданном файле 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-адрес сервера в браузере, переходим в режим разработчика и далее делаем многочисленные запросы: в Chrome это - ctrl+r*
**и видим вот такое сообщение после многочисленных запросов:**

**переходим на сервер и смотрим что у нас показывает iptables и fail2ban:**
`iptables -L -v`

*Видим, что добавилось правило*
**Далее переходим и смотрим, что показывает fail2ban:**

*Тут как раз показывает ip-адрес компьютера, который делал многочисленные запросы.*
**Разблокировать нужный ip-адрес возможно с помощью слудующей команды:**
`fail2ban-client unban [ip-адресс]`

**Доступ разблокирован**

**В этой практической работе мы научились:**
1. Организовали простую-тестовую атаку DOS.
2. Защитили сервер от DoS/DDoS атак через встроенные возможности nginx.
3. Защитили сервер от DoS/DDoS атак с помощью fail2ban при помощи iptables в автоматическом режиме.