Задача: Разобрать защиту своего почтового сервера посредством fail2ban
Итак, наверное я уже давно столкнулся, что мой почтовый сервер на базе заметки "iRedmail 1.6.2 на Ubuntu 22.04 через Wireguard туннель"
не обладает защитой (хоть в минимальном исполнении). В интернете домен входа — это система с WireGuard
-сервером и правилами на проброс порта до виртуальной машины (WireGuard Client)
внутри домашней сети. И это не хорошо, то что трафик, прилетающий на 25/tcp,80/tcp,993/tcp,465/tcp,443/tcp
просто идет до почтового сервера. Нужно чтобы записи неавторизованного подключения в логах на почтовой системе перестали иметь место
ekzorchik@mail:~$ sudo tail -f /var/log/syslog Mar 20 16:07:52 mail postfix/smtps/smtpd[2557]: warning: unknown[46.148.40.136]: SASL LOGIN authentication failed: UGFzc3dvcmQ6 Mar 20 16:07:52 mail postfix/smtps/smtpd[2557]: lost connection after AUTH from unknown[46.148.40.136] Mar 20 16:07:54 mail postfix/smtps/smtpd[2063]: Anonymous TLS connection established from unknown[46.148.40.33]: TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits) Mar 20 16:08:02 mail postfix/smtps/smtpd[2558]: warning: unknown[46.148.40.121]: SASL LOGIN authentication failed: UGFzc3dvcmQ6
В этом случае нужно уже на системе Ubuntu 22.04 + iRedMail 1.6.2
установить надстройку над правилами iptables
— у меня это firewalld
и за анализ логов установить сервис fail2ban
где посредством регулярных выражений будет идти анализ и предприниматься ответное действие на блокировку
Будет вот такая схема:
Шаг №1:
Устанавливаю в систему Ubuntu 22.04 Server
надстройку над правилами iptables
, а именно firewalld
и произвожу базовую защиту системы и сервисов на взаимодействие:
sudo ufw disable sudo apt-get install -y firewalld mc sudo systemctl enable firewalld sudo systemctl start firewalld sudo firewall-cmd --state ip r | awk '{print $5}' | head -n1 ens18 sudo firewall-cmd --zone public --change-interface=ens18 --permanent ekzorchik@mail:~$ sudo firewall-cmd --add-port=25/tcp --permanent success ekzorchik@mail:~$ sudo firewall-cmd --add-port=80/tcp --permanent success ekzorchik@mail:~$ sudo firewall-cmd --add-port=993/tcp --permanent success ekzorchik@mail:~$ sudo firewall-cmd --add-port=465/tcp --permanent success ekzorchik@mail:~$ sudo firewall-cmd --add-port=443/tcp --permanent success ekzorchik@mail:~$ sudo firewall-cmd --reload ekzorchik@mail:~$ sudo firewall-cmd --zone=public --list-all public (active) target: default icmp-block-inversion: no interfaces: ens18 sources: services: dhcpv6-client ssh ports: 25/tcp 80/tcp 993/tcp 465/tcp 443/tcp protocols: forward: yes masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: ekzorchik@mail:~$
Шаг №2:
Устанавливаю утилиту fail2ban
через которую будет производится анализ журналов системы на предмет шаблонов упоминания тех или иных строк и дальше уже приниматься решение что с часто повторяемым делать дальше:
ekzorchik@mail:~$ dpkg -l | grep fail2ban ekzorchik@mail:~$ sudo apt-get install -y fail2ban ekzorchik@mail:~$ sudo systemctl enable fail2ban Synchronizing state of fail2ban.service with SysV service script with /lib/systemd/systemd-sysv-install. Executing: /lib/systemd/systemd-sysv-install enable fail2ban Created symlink /etc/systemd/system/multi-user.target.wants/fail2ban.service → /lib/systemd/system/fail2ban.service. ekzorchik@mail:~$
папка action.d — содержит файлы действий
папка filter.d — файлы фильтров
файл fail2ban.conf — основной файл конфигурации
файл jail.conf — файл настройки защиты конкретных сервисов
Шаг №3:
За основу написания правил возьму примеры из каталога ~/iRedMail-1.6.2/samples/fail2ban
Шаг №4:
Копирую шаблоны обработки логов:
ekzorchik@mail:~$ sudo cp ~/iRedMail-1.6.2/samples/fail2ban/filter.d/dovecot.iredmail.conf /etc/fail2ban/filter.d/ ekzorchik@mail:~$ sudo cp ~/iRedMail-1.6.2/samples/fail2ban/filter.d/postfix.iredmail.conf /etc/fail2ban/filter.d/ ekzorchik@mail:~$ sudo cp ~/iRedMail-1.6.2/samples/fail2ban/filter.d/roundcube.iredmail.conf /etc/fail2ban/filter.d/
Шаг №5:
Создаю действие через что будет осуществляться блокировка:
ekzorchik@mail:~$ sudo nano /etc/fail2ban/action.d/firewallcmd.conf [Definition] actionstart = actionstop = actioncheck = actionban = firewall-cmd --change-source=<ip> --zone=drop && firewall-cmd --runtime-to-permanent actionunban = firewall-cmd --remove-source=<ip> --zone=drop && firewall-cmd --runtime-to-permanent
На заметку: в зону drop
добавляю все входящие сетевые пакеты сбрасываются. Возможны только исходящие сетевые соединения.
Шаг №6:
Создаю свой собственный jail.local
ekzorchik@mail:~$ sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local ekzorchik@mail:~$ sudo nano /etc/fail2ban/jail.local [DEFAULT] findtime = 3600 bantime = 3600 maxretry = 5 ignoreip = 127.0.0.0/8 10.0.0.0/24 172.33.2.0/24 192.168.0.0/16 [dovecot] enabled = true filter = dovecot.iredmail action = firewallcmd logpath = /var/log/maillog maxretry = 5 bantime = 3600 [postfix] enabled = true filter = postfix.iredmail action = firewallcmd logpath = /var/log/maillog maxretry = 5 bantime = 3600 [roundcube] enabled = true filter = roundcube.iredmail action = firewallcmd logpath = /var/log/maillog maxretry = 5 bantime = 3600 [ssh-firewalld] enabled = true filter = sshd action = firewallcmd logpath = /var/log/auth.log maxretry = 3 bantime = 3600 ekzorchik@mail:~$ sudo nano /etc/fail2ban/jail.d/defaults-debian.conf [sshd] enabled = false
Шаг №7:
Проверяем составленный jail.local
на ошибки:
ekzorchik@mail:~$ sudo fail2ban-server 2023-03-21 08:22:00,840 fail2ban [23198]: ERROR Failed during configuration: While reading from '/etc/fail2ban/jail.local' [line 980]: section 'dovecot' already exists 2023-03-21 08:22:00,841 fail2ban [23198]: ERROR Async configuration of server failed ekzorchik@mail:~$
видим ошибку и возвращаемся к предыдущему шагу и смотрим что в собственном конфигурационном файле jail.local
сделано не так, когда ошибок нет будет так:
ekzorchik@mail:~$ sudo fail2ban-server Server ready ekzorchik@mail:~$
Шаг №8:
Перезапускаю сервис fail2ban:
ekzorchik@mail:~$ sudo systemctl restart fail2ban && sudo systemctl status fail2ban | head -n5 ● fail2ban.service - Fail2Ban Service Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; vendor preset: enabled) Active: active (running) since Tue 2023-03-21 08:18:44 MSK; 26ms ago Docs: man:fail2ban(1) Main PID: 23060 (fail2ban-server) ekzorchik@mail:~$
Шаг №9:
Проверяю какие правила сейчас действуют:
ekzorchik@mail:~$ sudo fail2ban-client status Status |- Number of jail: 4 `- Jail list: dovecot, postfix, roundcube, sshd ekzorchik@mail:~$
вот они мои правила, их четыре штуки.
Шаг №10:
Проверяю правила на предмет как они работают, т.е. если ли первые нарушители, к примеру, правило с именем postfix:
ekzorchik@mail:~$ sudo fail2ban-client status postfix Status for the jail: postfix |- Filter | |- Currently failed: 54 | |- Total failed: 508 | `- File list: /var/log/maillog `- Actions |- Currently banned: 60 |- Total banned: 60 `- Banned IP list: 46.148.40.58 46.148.40.18 46.148.40.19 46.148.40.153 46.148.40.25 46.148.40.107 46.148.40.151 46.148.40.130 46.148.40.124 46.148.40.32 45.12.253.138 46.148.40.135 46.148.40.14 46.148.40.12 46.148.40.21 46.148.40.28 46.148.40.121 46.148.40.38 46.148.40.37 46.148.40.36 46.148.40.123 46.148.40.199 46.148.40.29 46.148.40.10 46.148.40.125 46.148.40.31 46.148.40.22 46.148.40.33 46.148.40.34 46.148.40.23 46.148.40.39 46.148.40.143 46.148.40.114 46.148.40.145 46.148.40.17 46.148.40.16 46.148.40.190 46.148.40.49 46.148.40.11 46.148.40.9 46.148.40.198 46.148.40.140 46.148.40.185 46.148.40.8 46.148.40.192 46.148.40.149 46.148.40.148 46.148.40.147 46.148.40.183 46.148.40.191 46.148.40.136 46.148.40.35 46.148.40.144 46.148.40.13 46.148.40.141 46.148.40.197 46.148.40.193 46.148.40.196 46.148.40.7 46.148.40.146 ekzorchik@mail:~$
На заметку: Если в выводе выше видно, что как бы взаимодействие с моим почтовым сервером идет исключительно из целой подсети, то можно модернизировать правила /etc/fail2ban/action.d/firewallcmd.conf
сделать чтобы не явно адрес блокировался, а целая подсеть с маской /24:
actionban = firewall-cmd --change-source=<ip>/24 --zone=drop && firewall-cmd --runtime-to-permanent
или же в ручном режиме после анализа правил внести в блок лист целую подсеть:
ekzorchik@mail:~$ sudo fail2ban-client set postfix banip 46.148.40.0/24
Ответ да, есть, значит можно увеличить период блокировки с 1 часа на неделю. (24 * 3600 = 86400) и перезапустить fail2ban:
ekzorchik@mail:~$ sudo systemctl restart fail2ban && sudo systemctl status fail2ban | head -n5 ● fail2ban.service - Fail2Ban Service Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; vendor preset: enabled) Active: active (running) since Tue 2023-03-21 08:35:43 MSK; 21ms ago Docs: man:fail2ban(1) Main PID: 24133 (fail2ban-server) ekzorchik@mail:~$
Шаг №11:
Чтобы вытащить из блокировки адрес, который в момент тестирования настроек попал в блок лист:
sudo fail2ban-client set postfix unbanip 172.35.35.8 или sudo firewall-cmd --zone=drop --remove-source="172.35.35.8/24" --permanent sudo firewall-cmd --reload
Подведем итог, не обязательно при развертывании почтового сервиса на базе iRedMail
отмечать галочкой включение компонента Fail2ban
, лучше это сделать по-другому. Установив пакет в систему, выполнив настройку, как Вам нужно под все Ваши сервисы на сервере и задействовать шаблоны из инсталляционного пакета. Почему было сделано так, а так проще и не нужно заниматься анализом статей, форумов и т.д. Раз автор(ы) iRedMail
предусмотрели это, так почему бы и не воспользоваться.
На заметку: Заметка будет дописываться если будут новые доработки защиты своего почтового сервера.
На этом заметка завершена, с уважением автор блога Олло Александр aka ekzorchik.