# Катенин Владимир - OS Linux Basic. Занятие 4. Безопасность Linux серверов [toc] ## Практическая работа №4.1 Настройка файлового сервера в корпоративной инфраструктуре **Разворачиваем три виртуальные машины:** 1. Ubuntu - сервер 2. Ubuntu - клиент 3. Windows – клиент 4. Делаем **snapshot** каждой из системы после базовых настроек. Для развертывания файлового сервера на системах Linux используется инструмент SAMBA. Ниже перечислены действия по его установке и настройке. - Прежде всего следует обновить локальную базу пакетов: `apt-get update` ![](https://i.imgur.com/qgDk0qW.jpg) - Далее установите пакеты из главного репозитория: `apt-get install -y samba samba-client` ![](https://i.imgur.com/harfIPK.jpg) - Создайте резервную копию файла конфигурации Samba: `cp /etc/samba/smb.conf /etc/samba/smb.conf.bak` ![](https://i.imgur.com/ycxVZr3.jpg) - Создайте или выберете директорию, к которой все пользователи будут иметь общий доступ: `mkdir -p /samba/public` ![](https://i.imgur.com/RLKNDv0.jpg) - Перейдите к этому каталогу и измените режим доступа и владельца: `cd /samba` `chmod -R 0755 public` ![](https://i.imgur.com/svqzU1s.jpg) - Создайте или выберите каталог, к которому иметь доступ будут ограниченное число пользователей: `mkdir /samba/private` ![](https://i.imgur.com/2GpniQ3.jpg) - Создайте группу пользователей, которые будут иметь доступ к приватным данным: `groupadd smbgrp` ![](https://i.imgur.com/orHJ8KL.jpg) - Создайте нужных пользователей с помощью команды *useradd*: `useradd user1` ![](https://i.imgur.com/pnSzF7O.jpg) - Добавьте созданных пользователей в группу: `usermod -aG smbgrp user1` ![](https://i.imgur.com/z2DhCRG.jpg) - Измените группу, которой принадлежит приватная директория: `chgrp smbgrp /samba/private` ![](https://i.imgur.com/ySgHlhb.jpg) - Задайте пароль, с помощью которого пользователь будет подключаться к каталогу: `smbpasswd -a user1` ![](https://i.imgur.com/F8YQowQ.jpg) - Откройте файл конфигурации на редактирование с помощью текстового редактора, например nano: `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 ![](https://i.imgur.com/MLiCpxO.jpg) Настроим Samba ресурс с названием share и дадим права на чтение группе пользователей users, предоставим возможность записи для группы с именем admins, а также пользователю PT ![](https://i.imgur.com/9MV2tTT.jpg) Проверим конфигурацию: `testparm -s` ![](https://i.imgur.com/THHvftk.jpg) Добавим сервис в автозагрузку Linux `sudo update-rc.d smbd defaults` `sudo update-rc.d smbd enable` ![](https://i.imgur.com/slbDYLX.jpg) Создадим новых пользователей и добавим группы ![](https://i.imgur.com/YI0KcF0.jpg) Чтобы изменения вступили в силу, перезапустим сервис: `service smbd restart` ![](https://i.imgur.com/3AB1ZQt.jpg) Получим доступ к папкам и файлам, находящимся на файловом сервере Linux, клиентом Linux ![](https://i.imgur.com/kgT7DPg.jpg) Получим доступ к папкам и файлам, находящимся на файловом сервере Linux, клиентом Windows ![](https://i.imgur.com/eC6N4TH.jpg) Зайдем под логином user1, проверим возможность создания в папке share ![](https://i.imgur.com/JSfUAD2.jpg) ![](https://i.imgur.com/ty2uTbC.jpg) Всё правильно, мы прописали ограничение на создание `write list = @admins pt` **Далее нужно настроить firewall iptables, открыв порты, которые использует SAMBA:** ![](https://i.imgur.com/hkxyThx.jpg) Теперь необходимо сделать так, чтобы указанные выше правила фаервола iptables были сохранены после перезагрузки машины. Необходимо установить дополнительный пакет для iptables, ни скрипт, ни запуск вручную не подходит. Есть пакет, который работает штатно. Установим `apt-get install iptables-persistent` ![](https://i.imgur.com/d10mZAv.jpg) ![](https://i.imgur.com/qgTvlqz.jpg) Прописанные правила: ![](https://i.imgur.com/Xj0oZxk.jpg) Перезапустим сервер, чтобы проверить сохраненные правила: ![](https://i.imgur.com/shOpLii.jpg) --- ## Практическая работа №4.2 Fail2Ban-SSH и Brute-force attack Fail2ban — простой в использовании локальный сервис, который отслеживает log–файлы запущенных программ, и на основании различных условий блокирует по IP найденных нарушителей. **Для начала давайте обновим ОС:** `sudo apt-get update` ![](https://i.imgur.com/3QgDTT2.jpg) **Далее давайте установим Fail2Ban:** `sudo apt-get install fail2ban` ![](https://i.imgur.com/T0sFyAw.jpg) **Так как Fail2Ban запускается после перезагрузки или старта ОС, сделаем следующее:** `service fail2ban start` ![](https://i.imgur.com/MsNWMQV.jpg) Теперь посмотрим файлы конфигурации **Ознакомимся со всеми файлами в директории Fail2Ban:** `ls -al /etc/fail2ban` ![](https://i.imgur.com/oQWkops.jpg) Самый важный файл - это `jail.conf` (данный файл содержит фильтры по умолчанию для определенных служб) Теперь давайте перейдём в нужную директорию и откроем файл конфигурации: `cd /etc/fail2ban` `nano jail.conf` ![](https://i.imgur.com/azf9bUM.jpg) И первое, что мы видим - это то, что нам рекомендуют создать дополнительный файл с .local расширением так как при обновлении Fail2Ban файл jail.conf может тоже обновиться и настройки будут возвращены поумолчанию. (если нужно настраивать фильтры для многих сервисов, то можно использовать jail.conf (но следить за обновлениями) или скопировать его с разрешением .local) Давайте приступим к этому `sudo nano jail.local` **Нам надо создать фильтр для ssh:** >[sshd] - указывает, что это сервис ssh enabled = true - указывает на то, что данные фильтр включен указываем порт и log файл port = ssh В итоге мы получаем текст файла следующий: >[sshd] enabled = true port = ssh filter = sshd logpath = /var/log/auth.log maxretry = 3 bantime = 3600 ignoreip = 127.0.0.1 ![](https://i.imgur.com/Lf0Xx0T.jpg) После сохраняем и выходим. **Вводим:** `service fail2ban restart` **И проверим, что fail2ban работает:** `service fail2ban status` ![](https://i.imgur.com/uzOCD1R.jpg) Теперь давайте попробуем подключиться по ssh и ввести три раза неправильно пароль: ![](https://i.imgur.com/nPk5rQI.jpg) После того как попробуем, можно убедиться ещё одним способом Hydra `sudo hydra -l ubuntu -P /usr/share/hydra/dpl4hydra_local.csv ssh://192.168.10.54 -I -v` Если hydra не установленна, то вводим: `sudo apt-get install hydra` ![](https://i.imgur.com/nd38NRe.jpg) Вводим еще раз ![](https://i.imgur.com/mfrWISw.jpg) Вводим еще раз ![](https://i.imgur.com/0btV2PD.jpg) **Чтобы посмотреть журналы банов в fail2ban вводим:** `fail2ban-client status` ![](https://i.imgur.com/kJwE8Vx.jpg) **И получить более подробно статистику:** `fail2ban-client status sshd` ![](https://i.imgur.com/x0rl72r.jpg) Если в конфигурационном файле поменять на false, то ssh начнёт работать корректно и будет давать возможность подключаться `enabled = false` ![](https://i.imgur.com/Uk6kjRM.jpg) **Соответственно, если сбросить блокировку fail2ban, необходимо сделать следующее:** `service fail2ban restart` **и проверим, что никто в данный момент не блокируется:** `fail2ban-client status sshd` ![](https://i.imgur.com/1DziFyk.jpg) Далее запускаем hydra ещё раз: `sudo hydra -l ubuntu -P /usr/share/hydra/dpl4hydra_local.csv ssh://192.168.10.54 -I -v` ![](https://i.imgur.com/Z3WlSl0.jpg) И проверим ещё раз список блокированных ip-адресов `fail2ban-client status sshd` **Увидим что fail2ban отработал корректно и заблокировал ip-адрес:** ![](https://i.imgur.com/JyXLtoK.jpg) Проверим, что будет, если отключить fail2ban и запустить hydra: `service fail2ban stop` ![](https://i.imgur.com/8NujKvc.jpg) Видим, что происходит подбор ![](https://i.imgur.com/L6Z5H1m.jpg) ![](https://i.imgur.com/vdU86gX.jpg) **Вывод: в этой практической работе я научился настраивать фильтр 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` ![](https://i.imgur.com/j9JP0p2.jpg) Теперь нужно импортировать официальный ключ, используемый apt для проверки подлинности пакетов. Скачайте ключ: `curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null` ![](https://i.imgur.com/Vk0fHom.jpg) **Проверим, верный ли ключ был загружен:** `gpg --dry-run --quiet --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg` ![](https://i.imgur.com/rmQn9ZY.jpg) Вывод команды должен содержать полный отпечаток ключа **573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62:** ``` pub rsa2048 2011-08-19 [SC] [expires: 2024-06-14] 573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62 uid nginx signing key <signing-key@nginx.com> ``` ***Если отпечаток отличается от вышеуказанного, удалите файл ключа.*** **Для подключения 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 ``` ![](https://i.imgur.com/kqjHbLD.jpg) Для использования пакетов из нашего репозитория вместо распространяемых в дистрибутиве, настройте закрепление: ``` echo -e "Package: *\\nPin: origin nginx.org\\nPin: release o=nginx\\nPin-Priority: 900\\n" \\ | sudo tee /etc/apt/preferences.d/99nginx ``` ![](https://i.imgur.com/XyOH1PG.jpg) **Чтобы установить nginx, выполните следующие команды:** `sudo apt update` ![](https://i.imgur.com/0flrqM8.jpg) `sudo apt install nginx` ![](https://i.imgur.com/Pe0Gu2W.jpg) *Если всё сделали правильно, то появится стартовая страница.* **Стартовая страница nginx выглядит так:** ![](https://i.imgur.com/VPk6ptG.jpg) **Если установлен nginx и apache2, то есть вероятность, что при запуске nginx будет появляться стартовая страничка apache2, в этом случае можно сделать следующее:** `cd /var/www/html` Создать директорию, куда затем переместить или скопировать файл index.html `cp index.html folder1/` ![](https://i.imgur.com/hviaeK4.jpg) После этих манипуляций при запуске nginx будет появляться стартовая страничка nginx. ### 2. Настройка nginx от DDoS атак на наш сервер Устанавливаем fail2ban и ipset: `apt install fail2ban` `apt install ipset` ![](https://i.imgur.com/dUG2vfW.jpg) Далее переходим: `nano /etc/nginx/sites-enabled/default` - тут находится стартовая страничка nginx **Выставляем следующие параметры:** `limit_req zone=ltwo burst=5 nodelay;` ![](https://i.imgur.com/VMpbwxc.jpg) **Далее переходим в конфигурационный файл nginx.conf:** `nano /etc/nginx/nginx.conf` - **в данном файле нам надо внести следующие изменения:** `limit_req_zone $binary_remote_addr zone=ltwo:10m rate=3r/s;` ![](https://i.imgur.com/zQlYMDc.jpg) После чего вбиваем ip-адрес сервера в браузере, переходим в режим разработчика и далее делаем многочисленные запросы: в Chrome это - `Ctrl+R` ![](https://i.imgur.com/KHeAECW.jpg) ![](https://i.imgur.com/zr3U7Sq.jpg) **Данные ошибки будут отображаться в log файле:** `cat /var/log/nginx/error.log` ![](https://i.imgur.com/Unf7Hgh.jpg) Данные log файл дадут нам нужную информация для настройки фильтрации fail2ban. ### 3. Настройка 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 ``` ![](https://i.imgur.com/LYV7X5s.jpg) После чего нам необходимо изменить настройку, что iptables не отсылал reject а отсылал drop, так как для борьбы с ботами - это более эффективно. **Далее переходим в файл:** `nano /etc/fail2ban/action.d/iptables-common.conf` ![](https://i.imgur.com/7hOCwlp.jpg) **Но как мы уже знаем, настройки конфигурационных файлов поумолчанию могут быть перезаписаны при обновлении, поэтому создаём новый файл:** `touch iptables-blocktype.local` где нам нужно внести следующую настройку: >[Init] blocktype = DROP ![](https://i.imgur.com/EtZqE8t.jpg) **Затем делаем рестарт fail2ban:** `service fail2ban restart` Нужно посмотреть, что iptables отрабатывает, наберём: `iptables -L -v` ![](https://i.imgur.com/yjthjl5.jpg) **Убедимся. что настройки в fail2ban применились и введём:** `fail2ban-client status` *Видим, что фильтры работают по nginx-limit-req, sshd* ![](https://i.imgur.com/tiCRwIc.jpg) **Также проверим, что сейчас нет заблокированных ip-адресов:** `fail2ban-client status nginx-limit-req` ![](https://i.imgur.com/vjNhtuy.jpg) *Теперь переходим на нашу страничку и вводим ip-адрес сервера в браузере, переходим в режим разработчика и далее делаем многочисленные запросы: в Chrome это - ctrl+r* **И видим вот такое сообщение после многочисленных запросов:** ![](https://i.imgur.com/SRGf4yq.jpg) **Переходим на сервер и смотрим что у нас показывает iptables и fail2ban:** `iptables -L -v` ![](https://i.imgur.com/uJLBQnI.jpg) *Видим, что добавилось правило* **Далее переходим и смотрим, что показывает fail2ban:** ![](https://i.imgur.com/jUCWr0t.jpg) *Тут как раз показывает ip-адрес компьютера, который делал многочисленные запросы.* **Разблокировать нужный ip-адрес возможно с помощью слудующей команды:** `fail2ban-client unban [ip-адрес]` ![](https://i.imgur.com/VKk8fgF.jpg) В этой практической работе мы научились: 1. Организовывать простую-тестовую атаку DOS. 2. Защищать сервер от DoS/DDoS атак через встроенные возможности nginx. 3. Защищать сервер от DoS/DDoS атак с помощью fail2ban при помощи iptables в автоматическом режиме.