Задача: Разобрать защиту своего почтового сервера посредством 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 где посредством регулярных выражений будет идти анализ и предприниматься ответное действие на блокировку

Будет вот такая схема:

Схема защиты почтового сервера iRedMail 1.6.2

Шаг №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

За основу написания правил возьму примеры из каталога ~/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.