# Linux. Практическая работа №4 ## Практическая работа №4.1 ### Цель работы: - Научиться настраивать сервер Samba - Понимать как составляется конфигурационный файл Samba и его параметры - Понять как работает Iptables ### Настройка samba Для работы будем использовать машины Kali, Debian и Win7 из топологии на скрине ![](https://i.imgur.com/Vh2EEnL.jpg) Порядок действий установки samba на сервер: `apt-get update` - обновить локальную базу пакетов `apt-get install -y samba samba-client` - установить пакеты из главного репозитория `cp /etc/samba/smb.conf /etc/samba/smb.conf.bak` - cоздать резервную копию файла конфигурации `mkdir -p /samba/public` - создать или выбрать директорию, к которой все пользователи будут иметь общий доступ ``` cd /samba chmod -R 0755 public ``` Перейти в этот каталог и изменить режим доступа и владельца `mkdir /samba/private` - создать каталог, к которому иметь доступ будут ограниченное число пользователей `groupadd smbgr` - создать группу пользователей, которые будут иметь доступ к приватным данным `useradd user1` - cоздать пользователей `usermod -aG smbgr user1` - добавить созданных пользователей в группу `chgrp smbgr /samba/private` - изменить группу, которой принадлежит приватная директория `smbpasswd -a user1` - задайте пароль, с помощью которого пользователь будет подключаться к каталогу ![](https://i.imgur.com/yGFVWx6.jpg) Изменим конфигурацию `nano /etc/samba/smb.conf` Пропишем следующие значения: ``` [global] workgroup = WORKGROUP security = user map to guest = bad user wins support = no dns proxy = no [public] path = /samba/public guest ok = yes force user = nobody browsable = yes writable = yes [private] path = /samba/private valid users = @smbgrp guest ok = no browsable = yes writable = yes ``` в которых мы задали значения для самбы -общие: рабочая группа по умолчанию (WORKGROUP), аутентификация по логину-паролю и как поступить если пароль введен не верно, выключить поддержку wins и запросы к DNS -для общего каталога: путь, авторизация без пароля, кто пользователь по умолчанию, видимость папки, права на запись в папку. -для приватной папки: также - путь, проверка пользователя на принадлежность к разрешенной группе (@ указывается unix-группа пользователей), вход с паролем, видимость папки и права на запись. Не забываем перезапустить сервис `service smbd restart` ![](https://i.imgur.com/mG6RMVj.jpg) Также проверим, работает ли доступ к сетевой папке ![](https://i.imgur.com/ychbCQ7.jpg) ### 2. Добавление сервиса Samba в автозагрузку Добавление в автозагрузку делается быстро. Одной командой `sudo systemctl enable smbd` ![](https://i.imgur.com/eHxYnrV.jpg) ### 3. Настроить Samba ресурс с названием share. Дать права на чтение группе пользователей users2, но предоставить возможность записи для группы с именем admins. Аналогично, как было описано выше, создаем новый ресурс share. `cp /etc/samba/smb.conf /etc/samba/smb.conf.bak` - сохраним текущие настройки `mkdir -p /samba/share`- создадим каталог `groupadd users2` `groupadd admins`- создадим требуемые группы пользователей Сами пользователи у нас уже есть (user, user1). Поэтому просто добавим их в разные группы `usermod -aG users2 user1` `usermod -aG admins user` добавим только пользователя РТ. и сделаем его владельцем папки `useradd PT` `chown PT /samba/share` `chgrp admins /samba/share` - группа которой принадлежит папка Чтобы реализовать права на папку share в соответствии с заданием, необходимо дать группе admins права на запись, а остальным - только чтение. `sudo chmod 775 /samba/share` ![](https://i.imgur.com/JXXb0qG.jpg) Далее, отредактируем файл `nano /etc/samba/smb.conf` ![](https://i.imgur.com/t8Iszvq.jpg) и перегрузим сервис. ### 4. Настройка firewall iptables для SAMBA. Необходимо открыть порты, которые использует samba, а также разрешить по ним подключения только из локального диапазона IP-адресов или виртуальной частной сети. Вот таблица правил (вывод командой `iptables -L`): ![](https://i.imgur.com/d2jY64h.jpg) Теперь проверяем. Для Win7 сетевая папка доступна ![](https://i.imgur.com/L5xuGRI.jpg) Для Кали сетевая папка доступна ![](https://i.imgur.com/VqDWp8W.jpg) А для win16 - нет. Его ip-адрес находится вне диапазона разрешенных адресов. ![](https://i.imgur.com/Yw8V8yF.jpg) ### 3. Сохранение и автозагрузка iptables Теперь необходимо сделать так, чтобы указанные выше правила фаервола iptables были сохранены после перезагрузки машины. Для этих целей мы будем использвать пакет iptables-persistent. Данный вариант реализации автозапуска конфигурации возможен в операционных системах Debian, Ubuntu. Для установки пакета требуется выполнить команду: `sudo apt-get install iptables-persistent` Используемые этим пакетом правила iptables хранятся в следующих директориях: /etc/iptables/rules.v4 для набора правил протокола IPv4; /etc/iptables/rules.v6 для набора правил протокола IPv6. Но они должны быть сохранены в понятном утилите iptables-persistent виде. Эти сохранения делаются на стадии установки пакета. ![](https://i.imgur.com/zdsZyvs.jpg) Перезагрузим машину и проверим, сохранились ли настройки ![](https://i.imgur.com/3dvGqRP.jpg) Настройки сохранились! ## Практическая работа №4.2 ### Цель работы: научиться конфигурировать Fail2Ban для отражения атак brute-force attack на SSH. #### 4.2.1 Установка и настройка Fail2Ban ``` sudo apt-get update sudo apt-get install fail2ban service fail2ban start ``` Последняя команда выполняется потому, что сервис будет запущен только после перезагрузки. ![](https://i.imgur.com/MDA5zKp.jpg) Теперь посмотрим файлы конфигурации `ls -al /etc/fail2ban` ![](https://i.imgur.com/DFE6GkI.jpg) Нам нужен файл jail.conf. Он содержит фильтры по умолчанию для определенных служб. Откроем его ![](https://i.imgur.com/kgNvArI.jpg) Нам предлагают создать файл с расширением .local, чтобы при обновлении программы не потерять настройки, которые также обновляются в файле jail.conf Делаем `sudo nano jail.local` Создаем фильтр для ssh ``` [sshd] enable = true port = ssh filter = sshd logpath = /var/log/auth.log maxtery = 3 bantime = 3600 ignoreip = 127.0.0.1 ``` В нем разрешаем ssh, указываем порт. В фильтре указываем путь до лога, максимальное число попыток ввода пароля (3), время блокировки ip-адреса (3600 сек) и белый список ip-адресов (127.0.0.1). ![](https://i.imgur.com/hw1YZkK.jpg) Сохраняем, выходим, делаем рестарт сервиса. #### 4.2.2 Тестирование fail2ban Проверим, что наш сервис запущен ![](https://i.imgur.com/Vuus9AG.jpg) Делаем три неправильных ввода пароля ![](https://i.imgur.com/T6Rri8X.jpg) И видим, что наш ip попал в бан ![](https://i.imgur.com/aJ9Gzx4.jpg) Разблокируем наш ip адрес и попробуем теперь атаковать сервер Гидрой. ![](https://i.imgur.com/QkV950i.jpg) На атакующей машине вводим команду: `sudo hydra -l root -P /usr/share/hydra/dpl4hydra_local.csv ssh://192.168.1.10 -I -v` Это значит, что мы будем проводить атаку, подбирая пароль из списка (указан) с логином root. И делаем подробный вывод в консоль. Но увы, мы были забанены. ![](https://i.imgur.com/ZU9Rfsb.jpg) Проверим наш бан-лист. Нас снова забанили. ![](https://i.imgur.com/AE9Hdfy.jpg) А если выключить fail2ban и снова запустить Гидру? Пробуем. `service fail2ban stop` Тогда мы увидим, что атака идет бесконечно ![](https://i.imgur.com/1JkQgRo.jpg) Факт атаки подтверждает лог /var/log/auth.log ![](https://i.imgur.com/WPmEw9b.jpg) Таким образом мы научились настраивать фильтр fail2ban для ssh от Bruteforce атак. ## Практическая работа №4.3 ### Цель работы: Научиться конфигурировать Fail2Ban для отражения атак Dos/DDoS на 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` ![](https://i.imgur.com/GFSVCFA.jpg) Для подключения 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 ``` После чего идет обычная установка: ``` sudo apt update sudo apt install nginx ``` В итоге на клиентской машине мы получили стартовую страницу nginx. ![](https://i.imgur.com/n9kRArG.jpg) #### 2.Настройка nginx от DDoS атак на наш сервер. Суть защиты состоит в следующем. Мы настраиваем Nginx таким образом, чтобы он при привышении указанного количества запросов "сообщал" в лог об ошибке, а fail2ban уже на основе этих сообщений в логе инициализировал блокировку по ip-адресу. Итак. Для начала на сервере должны быть установлены fail2ban и ipset. Они у меня уже есть. далее переходим к редактированию параметров nginx: `sudo nano /etc/nginx/sites-enable/default` - тут находится стартовая страничка nginx. Выставляем следующие параметры: `limit_req zone=ltwo burst=5 nodelay;` ![](https://i.imgur.com/l67nSju.jpg) Переходим в конфигурационный файл `nano /etc/nginx/nginx.conf` и дописываем строку `limit_req_zone $binary_remote_addr zone=ltwo:10m rate=3r/s;` ![](https://i.imgur.com/WNoUyOZ.jpg) Тестируем конфиг и перезапускаем nginx ``` nginx -t service nginx restart ``` после этого в браузере клиентской машины, переходим в режим разработчика и далее делаем многочисленные запросы: в Chrome это - ctrl+r ![](https://i.imgur.com/F54Cged.jpg) Видим что сервис некоторое время заблокировался. Эти ошибки будут отражаться в логе `cat /var/log/nginx/error.log` ![](https://i.imgur.com/pixNM4K.jpg) #### 3. Настройка fail2ban от DDoS атак на наш сервер. Добавим новые параметры в файл 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 ``` ![](https://i.imgur.com/Eod3bRi.jpg) После этого необходимо изменить настройку, что iptables не отсылал reject а отсылал drop, так как для борьбы с ботами - это более эффективно. Переходим в файл: `nano /etc/fail2ban/action.d/iptables-common.conf` НО! Эти настройки также могут быть перезаписаны при обновлении. Поэтому создадим новый файл `touch iptables-blocktype.local` и прописываем в нем следующую настройку ![](https://i.imgur.com/naoCxR4.jpg) Перезапускаем сервис fail2ban Проверяем, что iptables отрабатывает `iptables -L -v` Убедимся, что настройки в fail2ban применились `fail2ban-client status` (Видим ноый фильтр) Также проверим, что сейчас нет заблокированных ip-адресов `fail2ban-client status nginx-limit-req` ![](https://i.imgur.com/Z5nbLVi.jpg) Теперь повторим нашу DoS-атаку и посмотрим на сервере что у нас показывает iptables и fail2ban: ![](https://i.imgur.com/fn2sHhI.jpg) А они показывают, что добавилось новое правило (1) и что заблокирован один компьютер (2). Разблокировка ip-адреса делается командой `fail2ban-client unban 192.168.1.50` ![](https://i.imgur.com/PfhcHyq.jpg) #### 4. Итоги. В этой практической работе выполять следующие действия: 1. Организовывать простую тестовую атаку DOS. 2. Защитили сервер от DoS/DDoS атак через встроенные возможности nginx. 3. Защитили сервер от DoS/DDoS атак с помощью fail2ban при помощи iptables в автоматическом режиме.