# Linux. Практическая работа № 4
## 4.1 Настройка файлового сервера в корпоративной инфраструктуре
Создадим три машины
Linux server
Linux client
Windows client
Установим операционные системы, процесс установки тривиален, и описываться в данной работе не будет.
---
Создадим снапшот для сервера

---
Создадим снапшот для Win7

---
Создадим снапшот для Linux клиента

Файловый сервер развернем на Linux server на базе samba.
Последовательность развертывания
```bash=
# обновим базу пакетов
sudo apt update
# установим клиент и сервер
sudo apt install samba samba-client
# сделаем резервную копию конфигурации
sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.back
# создадим публичный каталог
sudo mkdir -p /samba/public
# настроим права
cd /samba
sudo chmod -R 0755 public
# создадим приватный каталог
mkdir /samba/private
# создадим группу, которая будет иметь доступ к приватному каталогу
sudo groupadd smbgroup -p 123qweASD
# создадим пользователя
sudo useradd usersmb -p 123qweASD
# добавим пользователя в группу
sudo usermod -aG smbgroup usersmb
# изменим группу, которой принадлежит приватный каталог
sudo chgrp smbgroup /samba/private
# зададим пароль
smbpasswd -a usersmb
# далее опишем конфигурацию
sudo nano /etc/samba/smb.conf
```
Результат







---
Файл конфигурации
```bash=
общие насройки
[global]
рабочая группа
workgroup = WORKGROUP
аутентификация по логину паролю
security = user
неудачные аутентификационные запросы будут отклонены
map to guest = bad user
поддержка wins выключена
wins support = no
dns proxy выключено
dns proxy = no
[public]
путь до каталога
path = /samba/public
авторизация без пароля
guest ok = yes
пользователь по умолчанию
force user = nobody
каталог отображается в сетевом окружении
browsable = yes
включаем возможность записи
writable = yes
[private]
путь до каталога
path = /samba/private
пользователи у который есть доступ к каталогу
valid users = @smbgroup
требуем пароль
guest ok = no
отображаем в сетевом окружении
browsable = yes
включаем запись
writable = yes
```
Результат

---
Перезапустим сервис samba
```bash=
sudo service smbd restart
```
Результат

---
Добавим сервис в автозагрузку
```bash=
sudo systemctl smbd enable
```
Рузультат

---
Настроим firewall iptables.
Проверим версию iptables
```bash=
sudo sudo iptables -V
```

---
Схема работы iptables

Взаимосвязь таблиц, цепочек и правил

Установим пакет обеспечивающий сохранение настроек
```bash=
sudo apt install iptables-persistent
sudo service netfilter-persistent save
```
Результат


---
Необходимо добавить доступ по следующим порта:
- 445 tcp, udp - SMB(Microsoft DS)
- 137 tcp, udp - NetBIOS NS
- 138 tcp, udp - NetBIOS DS
- 139 tcp, udp - NetBIOS SS
Проверим правила
```bash=
iptables -L
```
Результат

---
Установим правила
```bash=
# очищаем
sudo iptables -F
# создаем специальную цепочку
sudo iptables -N smb_access
# добавляем правила
sudo iptables -A smb_access -p tcp -m multiport --dports 137,138,139,445 -j ACCEPT
sudo iptables -A smb_access -p udp -m multiport --dports 137,138,139,445 -j ACCEPT
# разрешаем уже установленные соединения
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# трафик из нашей сети посылаем на нашу цепочку
# если будем испоьзовать сеть 192.168.10.0/24 то 192.168.0.0/24
sudo iptables -A INPUT -s 10.0.0.0/16 -j smb_access
# действия по умолчанию блокировать
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
# разрешить исходящий трафик
sudo iptables -P OUTPUT ACCEPT
```
Результат

---
Получим доступ с Linux клиента

---
Аналогично получим доступ с Win клиента

---
Сервис smb работает
---
## 4.2 Fail2Ban-SSH и Brute-force attack
Fail2ban — сервис, который отслеживает log–файлы запущенных программ, и на основании различных условий блокирует по IP найденных нарушителей. Борется с различными атаками на популярные NIX–сервисы, такие как Apache, Nginx, ProFTPD, vsftpd, Exim, Postfix, named, и т.д. Также защищает SSH–серверы от атак типа «bruteforce», то есть от перебора паролей.
Установим и настроим Fail2Ban на Linux машине
```bash=
#
sudo apt update
#
sudo apt install fail2ban
#
sudo service fail2ban start
```
Результат



---
Откроем файл конфигурации
```bash=
#
ls -al /etc/fail2ban
#
cd /etc/fail2ban
#
nano fail2ban.conf
```
Результат


---
Посмотрим на лог аутентификации
```bash=
cat /var/log/auth.log
```
Видим что для того чтобы отфильтровать события по ssh надо использовать фильтр sshd

---
Создадим отдельный файл jail.local
```bash=
cd /etc/fail2ban
sudo nano jail.local
```
Результат

---
Наполним следующим
```bash=
# сервис ssh
[sshd]
# данный фильтр включен
enable = true
# порт
port = ssh
# фильтр
filter = sshd
# путь до лога
logpath = /var/log/auth.log
# количество неверных попыток логина
maxretry = 3
# время бана в секундах
bantime = 3600
# белые ip адреса, тут петля
ignoreip = 127.0.0.1
```
Результат

---
Перезапускаем и проверяем статус
```bash=
sudo service fail2ban restart
sudo service fail2ban status
```
Результат

---
Проведем атаку брутфорсом с помошью hydra
```bash=
sudo apt install hydra
sudo hydra -l root -P /usr/share/hydra/dpl4hydra_local.csv ssh://10.0.20.225 -I -v
```
Результат



---
Посмотрим баны
```bash=
sudo fail2ban-client status
sudo fail2ban-client status sshd
```
Результат

---
Отключим fail2ban для ssh установив в файле jail.local
```bash=
enable = false
```
Результат

---
Проверим еще раз баны
```bash=
sudo service fail2ban restart
sudo fail2ban-client status sshd
sudo hydra -l root -P /usr/share/hydra/dpl4hydra_local.csv ssh://10.0.20.225 -I -v
sudo fail2ban-client status sshd
```
Результат

---
Отключим fail2ban и проверим что идет подбор
```bash=
sudo service fail2ban stop
cat /var/log/auth.log
```
Результат


---
## 4.3 Fail2Ban и DoS/DDoS на примере nginx
Следующими командами установим nginx
```bash=
# проверим обновления
sudo apt update
# установим необходимые пакеты
sudo apt install curl gnupg2 ca-certificates lsb-release debian-archive-keyring
# добавим ключи репозиторич
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
# 573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62
# подключим стабильную версию
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
# снова проверим обновленич
sudo apt update
# установим nginx
sudo install nginx
```
Результат






---
Посмотрим на страничку nginx

---
Установим и настроим fail2ban
```bash=
# установим fail2ban
sudo apt install fail2ban
# дополнение для более эффективной блокировки
sudo apt install ipset
```
Результат


---
Установим limit_req zone=ltwo burst=5 nodelay в файле /etc/nginx/sites-enable/default


---
Установим limit_req_zone $binary_remote_addr zone=ltwo:10m rate=3r/s в файле /etc/nginx/nginx.conf. Перезапустим nginx.



---
Далее через браузер делаем многочисленные запросы
Результат

---
Ошибки в лог файле
```bash=
sudo cat /var/log/nginx/error.log
```
Результат

---
Настроим fail2ban. jail.local
```bash=
[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
```
Результат


---
Изменим reject на drop. nano /etc/fail2ban/action.d/iptables-common.conf
Создадим файл iptables-blocktype.local. nano /etc/fail2ban/action.d/iptables-blocktype.local
```bash=
[Init]
blocktype = DROP
```
Результат



---
Перезапустим fail2ban
```bash=
sudo service fail2ban restart
```
Результат

---
Проверим iptables
```bash=
sudo iptables -L -v
```

---
Проверим fail2ban
```bash=
sudo fail2ban-client status
sudo fail2ban-client status nginx-limit-req
```
Результат

---
Создадим множественные запросы


---
Проверим
```bash=
sudo iptables -L -v
sudo fail2ban-client status nginx-limit-req
```

---
```bash=
sudo fail2ban-client unban 10.0.1.225
```


На этом данная работа завершена