Настройка Fail2Ban для Zimbra на примере Centos Stream

В данной статье мы разберем настройку Fail2Ban для Zimbra, чтобы усилить безопасность почтового сервера. В этом руководстве я использую CentOS. Измените версию python-pip при использовании другой ОС.

Настройка Fail2Ban для Zimbra

Fail2ban можно установить используя репозиторий EPEL:

yum install epel-release -y
yum install fail2ban -y

Или установим его ручками, используя следующие шаги:

1) Сначала установим pip

yum install python3-pip

2) Теперь установим зависимости, необходимые для работы Fail2Ban

pip3 install pyinotify
pip3 install dnspython

3) Загрузим и распакуем архив с Fail2Ban

cd /home
wget -c https://github.com/fail2ban/fail2ban/archive/0.9.4.tar.gz

4) Установим наш скрипт с Fail2Ban

tar -xvf 0.9.4.tar.gz
cd fail2ban-0.9.4
python3 setup.py install

5) Скопируем файл для установки службы

cp files/fail2ban.service /usr/lib/systemd/system/

6) Отредактируем службу

nano /usr/lib/systemd/system/fail2ban.service

Измените следующие строки в конфигурации

ExecStart=/usr/local/bin/fail2ban-client -x start
ExecStop=/usr/local/bin/fail2ban-client stop
ExecReload=/usr/local/bin/fail2ban-client reload

Создадим каталог для fail2ban

mkdir /var/run/fail2ban

Добавим строку в конец файла var.conf

nano /usr/lib/tmpfiles.d/var.conf
d /var/run/fail2ban 0755 - - -

Перезапустим systemd

systemctl daemon-reload

Теперь настроим сам fail2ban:

1) Создайте файл «/etc/fail2ban/jail.local», и он переопределит файл конфигурации по умолчанию «/etc/fail2ban/jail.conf».
Обязательно добавьте локальный IP-адрес сервера Zimbra в секцию «ignoreip=». Также можно добавить другие ip адреса, которые fail2ban должен игнорировать.

nano  /etc/fail2ban/jail.local
[DEFAULT] 
# "ignoreip" can be a list of IP addresses, CIDR masks or DNS hosts. Fail2ban will not ban a host which matches an address in this list. 
# Several addresses can be defined using space (and/or comma) separator.
#ignoreip = 127.0.0.1/8 ::1 10.137.26.29/32
ignoreip = 127.0.0.1/8 IP-ADDRESS-OF-ZIMBRA-SERVER/32 

banaction = route

# A host is banned if it has generated "maxretry" during the last "findtime" seconds.
# 10 minute (in seconds)
#findtime  = 600

# "bantime" is the number of seconds that a host is banned.
# 10 hour (in seconds)
#bantime  = 3600

# "maxretry" is the number of failures before a host get banned.
#maxretry = 5

2) Создадим правила zimbra.jail со следующими настройками:

nano /etc/fail2ban/jail.d/zimbra.local
[zimbra-smtp]
enabled = true
filter = zimbra-smtp
port = 25,465,587
logpath = /var/log/zimbra.log
maxretry = 3
findtime = 600
bantime = 3600

[zimbra-webmail]
enabled = true
filter = zimbra-webmail
port = 80,443
logpath = /opt/zimbra/log/mailbox.log
maxretry = 3
findtime = 600
bantime = 3600

[zimbra-admin]
enabled = true
filter = zimbra-admin
port = 7071,9071
logpath = /opt/zimbra/log/mailbox.log
maxretry = 3
findtime = 600
bantime = 3600

3) Теперь создадим фильтры для служб Zimbra:

Код ниже нужно просто скопировать и вставить в консоль.

Для Webmail

tee /etc/fail2ban/filter.d/zimbra-webmail.conf > /dev/null <<EOF
[Definition]
#
failregex = \[oip=<HOST>;.* SoapEngine - handler exception: authentication failed for .*, account not found$
            INFO .*;oip=<HOST>;.* SoapEngine - handler exception: authentication failed for .*, invalid password$

ignoreregex =
EOF

Для Zimbra SMTP/SMTPS/Submission

tee /etc/fail2ban/filter.d/zimbra-smtp.conf > /dev/null <<EOF
[Definition]
#
failregex = postfix\/submission\/smtpd\[\d+\]: warning: .*\[<HOST>\]: SASL \w+ authentication failed: authentication failure$
            postfix\/smtps\/smtpd\[\d+\]: warning: .*\[<HOST>\]: SASL \w+ authentication failed: authentication failure$

ignoreregex =
EOF

Для панели управления Webadmin

tee /etc/fail2ban/filter.d/zimbra-admin.conf > /dev/null <<EOF
[Definition]
#
failregex = INFO .*;ip=<HOST>;.* SoapEngine - handler exception: authentication failed for .*, invalid password$
            INFO .*ip=<HOST>;.* SoapEngine - handler exception: authentication failed for .*, account not found$

ignoreregex =
EOF

4) Если вы запускаете прокси nginx на том же узле, что и почтовый сервер, вам нужно будет добавить 127.0.0.1 и реальный IP-адрес этого узла:

su - zimbra 
zmprov mcf +zimbraMailTrustedIP 127.0.0.1 +zimbraMailTrustedIP {IP of Server} 
zmcontrol restart 

Перезапустим службу fail2ban и добавим его в автозагрузку:

systemctl restart fail2ban 
systemctl enable fail2ban 

Проверим, что служба работает:

systemctl status fail2ban 

ПРИМЕРЫ ИСПОЛЬЗОВАНИЯ FAIL2BAN

Посмотреть список активированных фильтров:

fail2ban-client status

Посмотреть заблокированные ip адреса?

ip r или команда route -n

Как заблокировать ip в fail2ban?

fail2ban-client set <имя фильтра> banip <IP-адрес>

Например: fail2ban-client set zimbra-smtp banip 10.18.20.77

Как разблокировать ip в fail2ban?

fail2ban-client set <имя фильтра> unbanip <IP-адрес>

За основу была использована статья с вики зимбры.

2 комментария к “Настройка Fail2Ban для Zimbra на примере Centos Stream”

  1. У вас не хватает самого главного это action
    curl -k https://raw.githubusercontent.com/imanudin11/zimbra-fail2ban/master/zimbra-admin.conf > /etc/fail2ban/filter.d/zimbra-admin.conf

    – Zimbra Webmail

    curl -k https://raw.githubusercontent.com/imanudin11/zimbra-fail2ban/master/zimbra-webmail.conf > /etc/fail2ban/filter.d/zimbra-webmail.conf

    – Zimbra SMTP/SMTPS/Submission

    curl -k https://raw.githubusercontent.com/imanudin11/zimbra-fail2ban/master/zimbra-submission.conf
    Без них сервис будет видеть логи но ничего не будет делать

    Ответить
    • Немного поздно отвечаю, но то что вы скинули указано в этом пункте:
      3) Теперь создадим фильтры для служб Zimbra:

      Ответить

Оставьте комментарий