Home » Linux » CentOS » Защита почтового сервера postfix + dovecot с помощью fail2ban

Защита почтового сервера postfix + dovecot с помощью fail2ban

У меня есть много статей про настройку почтового сервера, где я постоянно пропускаю важную тему защиты почтового сервера от перебора паролей. Пришло время это исправить и рассказать, как защитить postfix и dovecot с помощью fail2ban от подбора паролей к почтовым ящикам. Метод традиционный, простой и надежный - будем банить по ip тех, кто будет пытаться пройти авторизацию с неверными учетными данными.

Углубленный онлайн-курс по MikroTik

Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном онлайн-курcе по администрированию MikroTik. Автор курcа – сертифицированный тренер MikroTik Дмитрий Скоромнов. Более 40 лабораторных работ по которым дается обратная связь. В три раза больше информации, чем в MTCNA.

Введение

Данная статья написана на примере настройки почтового сервера по моей статье - Настройка postfix + dovecot на CentOS 8. Но в контексте описываемого материала это не принципиально, так как fail2ban, postfix и dovecot имеют одинаковые конфиги и логи на всех дистрибутивах linux. Так что представленная в статье информация будет актуальна для любого сервера, где используется этот софт.

Второй важный момент. Я в своей работе везде использую нативные iptables. Для блокировки ip адресов с помощью fail2ban я буду использовать именно этот firewall. Если у вас его нет и вы хотите настроить, то добро пожаловать в мою статью по этой теме - настройка iptables. Далее я не буду останавливаться на этом.

Установка и настройка fail2ban

Установка fail2ban на любом дистрибутиве не представляет никаких сложностей, так как продукт популярный и присутствует почти во всех репозиториях. Ставим через пакетный менеджер в Centos 7,8. У вас должен быть подключен репозиторий epel.

# yum install fail2ban
# dnf install fail2ban

Установка fail2ban

В Ubuntu / Debian fail2ban ставится из базовых репозиториев.

# apt install fail2ban

В Centos по умолчанию используется firewalld для управления правилами фаервола. Чтобы изменить это и перейти на iptables, достаточно удалить файл 00-firewalld.conf.

# rm /etc/fail2ban/jail.d/00-firewalld.conf

Дальше нас будет интересовать конфигурационный файл jail.conf. По умолчанию в нем очень много параметров и комментариев. Мне не удобно работать с таким огромным файлом. Большая часть информации оттуда мне не нужна. Я привел его к такому виду.

[INCLUDES]
before = paths-fedora.conf

[DEFAULT]
ignoreip = 127.0.0.1/8  10.1.3.29/32
bantime  = 30m
findtime  = 30m
maxretry = 5
backend = auto
usedns = warn
logencoding = auto
enabled = false
mode = normal

Я выделил ip адрес zabbix сервера, на котором настроен мониторинг работы почтового сервера и мониторинг tls сертификатов. Если его не добавить в исключения, то он будет забанен, так как регулярно подключается к почтовому серверу, но не проходит авторизацию. Ему это не нужно для работы.

Когда будете редактировать, не забудьте на всякий случай сохранить оригинал конфига. Базовая настройка fail2ban закончена. Все остальное я оставил дефолтное. Переходим к настройке правил блокировки.

Защита postfix с помощью fail2ban

Изначально fail2ban идет с комплектом готовых настроек и фильтров для защиты большинства популярных сервисов. К ним относится и postfix. Но когда я посмотрел в готовый набор с regexp для postfix, я слегка растерялся :) Он просто огромен. И самое главное, что в таком виде он не заработал на моем лог файле.

fail2ban regexp postfix

Мне стало лень ковыряться в этих правилах. Для защиты postfix от перебора паролей почтовых ящиков, достаточно банить ip адреса из следующих строк лога.

Jun 17 03:14:07 mail postfix/smtpd[175371]: warning: unknown[46.38.145.252]: SASL LOGIN authentication failed: UGFzc3dvcmQ6

Для этого достаточно относительно простого regexp.

^%(__prefix_line)swarning: [-._\w]+\[<HOST>\]: SASL (?:LOGIN|PLAIN|(?:CRAM|DIGEST)-MD5) authentication failed(: [ A-Za-z0-9+/]*={0,2})?\s*$

Его придумал не я. Честно подсмотрел на просторах интернета. Примеров масса и у нас, и в англоязычном гугле. Далее создаем конфигурационный файл с фильтром из этого regexp - /etc/fail2ban/filter.d/postfix-sasl.conf.

[INCLUDES]
before = common.conf
[Definition]
_daemon = postfix/smtpd
failregex = ^%(__prefix_line)swarning: [-._\w]+\[\]: SASL (?:LOGIN|PLAIN|(?:CRAM|DIGEST)-MD5) authentication failed(: [ A-Za-z0-9+/]*={0,2})?\s*$
ignoreregex =

Можно сразу же проверить работу этого фильтра с помощью fail2ban-regex. Эта утилита никого не банит, а просто выводит информацию о работе фильтра.

# fail2ban-regex /var/log/maillog /etc/fail2ban/filter.d/postfix-sasl.conf

Команда успешно отработала и вывела результат.

Защита postfix с помощью fail2ban

24327 раз данный фильтр распознал строки, попадающие под работу фильтра. Изначально я напрягся, когда прикинул, что именно такое количество ip адресов поедет в бан с помощью iptables. Это еще не критично большое количество, но все равно достаточно много. По одному добавлять такое количество адресов не стоит. Нужно использовать списки, например, ipset.

На деле зря испугался. Никаких проблем не будет и дальше я покажу почему. Правило обработки лога мы проверили и убедились, что оно работает. Дальше добавляем в jail.conf новую секцию.

[postfix-sasl]
enabled	= true
filter	= postfix-sasl
port	= smtp,465,submission,imap,imaps,pop3,pop3s
action	= iptables[name=Postfix-sals, port=smtp, protocol=tcp]
logpath	= /var/log/maillog
bantime	= 60m
maxretry = 3
findtime = 60m

Пояснять тут особо нечего и так все понятно. Настройка блокировки будет проверять лог файл и записи в нем за последние 60 минут. Если будут 3 совпадения с regexp из фильтра postfix-sasl, ip адрес будет забанен на 60 минут. Таким образом, список забаненных ip адресов будет не очень большой, так как большая часть адресов будет повторяться.

Запускаем fail2ban и добавляем в автозагрузку.

# systemctl enable --now fail2ban

Проверяем лог файл /var/log/fail2ban.

log fail2ban

Смотрим правила iptables.

# iptables -L -v -n

Блокировка в iptables с помощью fail2ban

У вас должна появиться отдельная цепочка правил f2b-Postfix-sals с заблокированными ip адресами, которые добавил fail2ban. С защитой postfix с помощью fail2ban все. Переходим к Dovecot.

Защита dovecot с помощью fail2ban

Для защиты от перебора логинов в dovecot мы будем действовать аналогично. Единственное отличие, я буду использовать дефолтный фильтр для dovecot, который шел из коробки. Я его попробовал и он сразу заработал. Вот его содержимое.

# cat /etc/fail2ban/filter.d/dovecot.conf
[INCLUDES]

before = common.conf

[Definition]

_auth_worker = (?:dovecot: )?auth(?:-worker)?
_daemon = (?:dovecot(?:-auth)?|auth)

prefregex = ^%(__prefix_line)s(?:%(_auth_worker)s(?:\([^\)]+\))?: )?(?:%(__pam_auth)s(?:\(dovecot:auth\))?: |(?:pop3|imap)-login: )?(?:Info: )?.+$

failregex = ^authentication failure; logname=\S* uid=\S* euid=\S* tty=dovecot ruser=\S* rhost=(?:\s+user=\S*)?\s*$
            ^(?:Aborted login|Disconnected)(?::(?: [^ \(]+)+)? \((?:auth failed, \d+ attempts(?: in \d+ secs)?|tried to use (?:disabled|disallowed) \S+ auth|proxy dest auth failed)\):(?: user=<[^>]*>,)?(?: method=\S+,)? rip=(?:[^>]*(?:, session=<\S+>)?)\s*$
            ^pam\(\S+,(?:,\S*)?\): pam_authenticate\(\) failed: (?:User not known to the underlying authentication module: \d+ Time\(s\)|Authentication failure \(password mismatch\?\)|Permission denied)\s*$
            ^[a-z\-]{3,15}\(\S*,(?:,\S*)?\): (?:unknown user|invalid credentials|Password mismatch)\s*$
            <mdre->

mdre-aggressive = ^(?:Aborted login|Disconnected)(?::(?: [^ \(]+)+)? \((?:no auth attempts|disconnected before auth was ready,|client didn't finish \S+ auth,)(?: (?:in|waited) \d+ secs)?\):(?: user=<[^>]*>,)?(?: method=\S+,)? rip=(?:[^>]*(?:, session=<\S+>)?)\s*$

mdre-normal = 

mode = normal

ignoreregex = 

journalmatch = _SYSTEMD_UNIT=dovecot.service

datepattern = {^LN-BEG}TAI64N
              {^LN-BEG}

Полный лог dovecot у меня располагается в файле /var/log/dovecot/info.log. В параметрах dovecot у меня добавлено:

auth_verbose = yes

С этим параметром у вас дополнительно в логе будут следующие строки:

Jun 17 04:14:11 auth-worker(175697): Info: sql(mcm@mail.ru,87.246.7.66): unknown user

По дефолту их нет, а они помогут в нашей задаче по защите от перебора паролей учетных записей dovecot. Проверим работу фильтра.

# fail2ban-regex /var/log/dovecot/info.log /etc/fail2ban/filter.d/dovecot.conf

Защита dovecot с помощью fail2ban

Сработок очень много. Судя по всему, фильтр работает. Добавляем в конфиг jail.conf.

[dovecot]
enabled	= true
filter	= dovecot
port	= imap,imaps,pop3,pop3s
action	= iptables[name=Dovecot, port=imap, protocol=tcp]
logpath	= /var/log/dovecot/info.log
bantime	= 60m
maxretry = 3
findtime = 60m

Здесь ничего нового. Все то же самое, что мы сделали выше. Перезапускайте fail2ban и проверяйте его работу. В логе должна появиться информация по работе данного jail'а. А в правилах iptables новая цепочка Dovecot.

Отладка работы fail2ban

После добавления правил блокировки ip адресов с помощью fail2ban, я некоторое время наблюдаю за сервером, чтобы проверить правильность работы. Для этого делаю вот такое окно в отдельном мониторе и наблюдаю некоторое время.

Отладка работы fail2ban

Здесь открыт лог postfix, dovecot и fail2ban. Если вижу, что правила отрабатываются корректно, завершаю настройку. На этом этапе могут быть заблокированы валидные ip адреса пользователей, у которых одна из учеток указана с неверным паролем. В итоге он банится по ip и у него вообще перестает работать вся почта. Если это локальные пользователи, то можно всю их подсеть добавить в доверенные, но я бы не рекомендовал так делать. В этом случае вы не узнаете, что кто-то вас перебирает из локальной сети. А это случается не редко.

Удалить ip адрес из заблокированных fail2ban

Вам может понадобиться вручную удалить какой-то ip адрес из списка заблокированных fail2ban. Часто в блок попадают ip адреса при настройке учетной записи у пользователя. Пароль может быть перепутан или копироваться с лишними символами. Всякое бывает.

Можно напрямую удалить правило через iptables. Но это будет не очень правильно. Лучше воспользоваться готовым инструментом от fail2ban для удаления ip адресов из блокировки.

Смотрим список активных jail'ов.

# fail2ban-client status
Status
|- Number of jail:	2
`- Jail list:	dovecot, postfix-sasl

Смотрим список заблокированный ip адресов в jail.

# fail2ban-client status postfix-sasl
Status for the jail: postfix-sasl
|- Filter
|  |- Currently failed:	1
|  |- Total failed:	169
|  `- File list:	/var/log/maillog
`- Actions
   |- Currently banned:	27
   |- Total banned:	86
   `- Banned IP list:	46.38.150.193 87.246.7.66 212.70.149.2 141.98.80.150 46.38.150.203 185.143.75.153 212.70.149.18 46.38.150.191 87.246.7.70 185.143.75.81 185.143.72.34 46.38.150.142 46.38.150.190 185.143.72.27 185.143.72.25 185.143.72.23 46.38.145.6 46.38.145.252 46.38.150.188 46.38.145.249 46.38.145.5 46.38.145.250 46.38.145.248 46.38.145.254 46.38.145.253 185.143.72.16 46.38.145.251

Теперь разбаним один из адресов в fail2ban:

# fail2ban-client set postfix-sasl unbanip 46.38.150.193
1

Если получите одну из этих ошибок:

2020-06-17 20:15:14,809 fail2ban [77578]: ERROR NOK: ('Invalid command (no get action or not yet implemented)',)
2020-06-17 20:13:02,078 fail2ban [77464]: ERROR NOK: ("Invalid command '46.38.150.193' (no set action or not yet implemented)",)
2020-06-17 20:11:48,132 fail2ban [77382]: ERROR   NOK: ('list index out of range',)

Значит у вас более старая версия fail2ban. Тогда нужно использовать другую команду для разбана ip адреса:

# fail2ban-client get postfix-sasl actionunban 46.38.150.193

Для проверки можете посмотреть на цепочки правил iptables, чтобы убедиться, в том, что адреса реально удалены из блокировки.

Заключение

Не понравилась статья и хочешь научить меня администрировать? Пожалуйста, я люблю учиться. Комментарии в твоем распоряжении. Расскажи, как сделать правильно!

На практике правила в fail2ban для dovecot особо не нужны. Пробивкой учетных записей занимаются боты, которые сразу пробивают smtp и imap порты. Все эти боты первым делом попадают в блокировку postfix и до правил dovecot просто не доходят. Но для полноты картины можно оставить и их, хотя бы для того, чтобы выявлять сотрудников с настроенными неактивными учетками.

С помощью fail2ban можно так же банить различные почтовые серверы, которые не проходят встроенные проверки postfix на спам. Но я обычно этого не делаю, так как бывают ложные срабатывания. Потом приходится лишнее время тратить на разбор полетов, так как он усложняется. Так стоит делать, если левые коннекты реально замедляют работу почтового сервера. Обычно это не добавляет каких-то серьезных проблем, в отличие от перебора паролей.

Углубленный онлайн-курс по MikroTik.

Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном онлайн-курcе по администрированию MikroTik. Автор курcа – сертифицированный тренер MikroTik Дмитрий Скоромнов. Более 40 лабораторных работ по которым дается обратная связь. В три раза больше информации, чем в MTCNA.

Помогла статья? Подписывайся на telegram канал автора

Анонсы всех статей, плюс много другой полезной и интересной информации, которая не попадает на сайт.

Автор Zerox

Владимир, системный администратор, автор сайта. Люблю настраивать сервера, изучать что-то новое, делиться знаниями, писать интересные и полезные статьи. Открыт к диалогу и сотрудничеству. Если вам интересно узнать обо мне побольше, то можете послушать интервью. Запись на моем канале - https://t.me/srv_admin/425 или на сайте в контактах.

63 комментария

  1. Андрей

    Настроил fail2ban на блокировку попыток подбора учетных данных. строка в логах - SASL LOGIN authentication failed: UGFzc3dvcmQ6
    iptables быстро наполнился ИП адресами, но в логах /var/log/mail.log по прежнему продолжаются попытки подбора паролей с этих ИП.

    В статье на скрине iptables -L -v -n слева pkts и bytes с данными, а у меня почему то все по нулям.

    • Андрей

      Нашел решение данной проблемы. Если вам надоели постоянные подключения SASL LOGIN authentication failed то ваша конфигурация postfix-sasl должна выглядеть так:

      [postfix-sasl]

      enabled = true
      filter = postfix-sasl
      action = iptables-multiport[name=Postfix-sasl, port="smtp,ssmtp,465,submission,imap,imaps,pop3,pop3s"]
      logpath = /var/log/mail.log
      findtime = 60m
      maxretry = 3
      bantime = 24h

      После этого, постоянные коннекты прекратились, fail2ban заработал как надо.

  2. Добрый день! RegExp взят отсюда
    Строки логов с ошибкой аунтификации такие
    Aug 30 16:16:48 mail postfix/smtp/mail.domain.ru/smtpd[19689]: warning: unknown[5.34.207.56]: SASL LOGIN authentication failed: UGFzc3dvcmQ6

    (mydomain.ru - домен - тк на сервере хостится неск доменов на разных ip и интерфейсах пришлось в конвиге постфикса подкрутить)

    Не работает - нужно выражение править - где бы прочитать про это в подробностях и с примерами???

    • Под ваш лог подойдет такая регулярка:

      [Definition]
      failregex = unknown\[]: SASL ((?i)LOGIN|PLAIN(?:CRAM|DIGEST)-MD5) authentication failed: [A-Za-z0-9]*={0,2}?\s*$

      На самом деле можно проще. Копируешь часть строки, которая не меняется, но с IP адресом хоста и меняешь 5.34.207.56 на и [A-Za-z0-9]*={0,2}?\s*$ вместо UGFzc3dvcmQ6, каждый символ в строке имеет значение и пробел тоже.
      И получаешь свой фильтр: warning: unknown[]: SASL LOGIN authentication failed: [A-Za-z0-9]*={0,2}?\s*$

  3. Доброго времени суток Владимир!
    Нуждаюсь в Вашей помощи, а точней совета куда рыть , где искать проблему.
    Выполнил настройку согласно Вашему руководству по статье -> Настройка postfix + dovecot + mysql база + postfixadmin + roundcube + dkim на CentOS 7
    На удивление всё в порядке и работает, конечно не обошлось без проблем в настройке , и ошибок , но удалось добиться уверенного результата в итоге, по тесту набираю 10 баллов из 10.
    Обратился к следующим статьям уже по защите почтового сервера, выполнил инструкцию по настройке iptables, и повторил все проверки, что все работает и ничего не сломалось. Результат ОК.
    Продолжил настройку прикрутив fail2ban и вот тут началось странное, или может ошибка была ранее но я её не замечал, или она себя не проявляла:
    Суть проблемы в том что dovecot отправляет в бан мой локальный IP и ругается на ошибку авторизации.
    Временно решил через ignoreip =
    Но понимаю, что это какая то чертовшина, и проблему нужно решать.
    Ошибка имеет вид:
    pam_unix(dovecot:auth): check pass; user unknown
    pam_unix(dovecot:auth): authentication failure; logname= uid=0 euid=0 tty=dovecot ruser=myname@mydomen.ru rhost=my_local_ip

    Подскажите в какую сторону следует копать , чтобы найти корень зла?

    P.S Файл фильтров dovecot.conf использовал типовой, который шел в установочном пакете, но он при сравнении с представленным у Вас отличается.
    Может быть дело в этом ?

    Еще странность , что после добавления своего IP в ignoreip = , все заработало, а при удалении и перезагрузке сервера продолжает работать и уже в бан не попадает (хотя в игноре стоит только локалный 127.0.0.1), что еще более странно.

    • В логе dovecot чётко указано, что с вашего ip идёт неудачная попытка авторизации. Копайте в эту сторону. Может какой-то неактивный аккаунт подключен, который стучится к серверу.

      • P.S Спасибо за Ваш ответ!

        Собственно данную ошибку удалось победить.
        Проблема оказалась в том что записав всю информацию в dovecot.conf(при изначальной настройке) нужно закоментить все профили авторизации в файлах которые лежат в /etc/dovecot/conf.d/auth-****.ext
        Те которые установились вместе с dovecot. Почему то dovecot одновременно использовал и данные И из основного файла конфигурации И из "файлов по-умолчанию".
        Команда grep ^passdb /etc/dovecot/conf.d/* покажет где именно нужно коментить.
        Я всё сделал и ошибка исчезла, и к слову теперь проверка папок в Thunerdird на мой взгляд начала работать ощутимо быстрее.
        Может быть кому то поможет.

  4. Тут перебирают пароли но с разных ип адресов, но с одного диапазона. Как то можно вот с таким бороться:

    Dec 27 10:01:42 auth-worker(24758): Info: conn unix:auth-worker (pid=24757,uid=110): auth-worker: sql(xerox@example.com,141.98.10.220): unknown user
    Dec 27 10:05:30 auth-worker(24762): Info: conn unix:auth-worker (pid=24757,uid=110): auth-worker: sql(guest@example.com,2.56.57.142): unknown user
    Dec 27 10:06:15 auth-worker(24762): Info: conn unix:auth-worker (pid=24757,uid=110): auth-worker: sql(guest@example.com,212.192.246.120): unknown user
    Dec 27 10:06:19 auth-worker(24762): Info: conn unix:auth-worker (pid=24757,uid=110): auth-worker: sql(guest@example.com,212.192.246.133): unknown user
    Dec 27 10:06:36 auth-worker(24762): Info: conn unix:auth-worker (pid=24757,uid=110): auth-worker: sql(guest@example.com,212.192.246.145): unknown user
    Dec 27 10:06:56 auth-worker(24762): Info: conn unix:auth-worker (pid=24757,uid=110): auth-worker: sql(guest@example.com,212.192.246.17): unknown user
    Dec 27 10:06:58 auth-worker(24762): Info: conn unix:auth-worker (pid=24757,uid=110): auth-worker: sql(guest@example.com,212.192.241.55): unknown user
    Dec 27 10:07:09 auth-worker(24762): Info: conn unix:auth-worker (pid=24757,uid=110): auth-worker: sql(guest@example.com,212.192.246.82): unknown user
    Dec 27 10:07:10 auth-worker(24762): Info: conn unix:auth-worker (pid=24757,uid=110): auth-worker: sql(demo@example.com,141.98.10.220): unknown user
    Dec 27 10:07:11 auth-worker(24762): Info: conn unix:auth-worker (pid=24757,uid=110): auth-worker: sql(guest@example.com,212.192.246.11): unknown user
    Dec 27 10:08:52 auth-worker(24768): Info: conn unix:auth-worker (pid=24757,uid=110): auth-worker: sql(guest@example.com,212.192.246.81): unknown user
    Dec 27 10:09:00 auth-worker(24768): Info: conn unix:auth-worker (pid=24757,uid=110): auth-worker: sql(guest@example.com,212.192.246.237): unknown user
    Dec 27 10:09:22 auth-worker(24768): Info: conn unix:auth-worker (pid=24757,uid=110): auth-worker: sql(guest@example.com,212.192.246.64): unknown user
    Dec 27 10:09:37 auth-worker(24768): Info: conn unix:auth-worker (pid=24757,uid=110): auth-worker: sql(guest@example.com,212.192.246.43): unknown user
    Dec 27 10:09:50 auth-worker(24768): Info: conn unix:auth-worker (pid=24757,uid=110): auth-worker: sql(guest@example.com,212.192.246.191): unknown user
    Dec 27 10:09:55 auth-worker(24768): Info: conn unix:auth-worker (pid=24757,uid=110): auth-worker: sql(guest@example.com,212.192.246.36): unknown user
    Dec 27 10:10:41 auth-worker(24768): Info: conn unix:auth-worker (pid=24757,uid=110): auth-worker: sql(guest@example.com,212.192.246.167): unknown user
    Dec 27 10:12:17 auth-worker(24818): Info: conn unix:auth-worker (pid=24757,uid=110): auth-worker: sql(guest@example.com,212.192.246.226): unknown user
    Dec 27 10:12:19 auth-worker(24818): Info: conn unix:auth-worker (pid=24757,uid=110): auth-worker: sql(guest@example.com,212.192.246.28): unknown user
    Dec 27 10:12:38 auth-worker(24818): Info: conn unix:auth-worker (pid=24757,uid=110): auth-worker: sql(guest@example.com,141.98.10.220): unknown user
    Dec 27 10:13:13 auth-worker(24818): Info: conn unix:auth-worker (pid=24757,uid=110): auth-worker: sql(guest@example.com,212.192.246.9): unknown user
    Dec 27 10:16:15 auth-worker(24826): Info: conn unix:auth-worker (pid=24825,uid=110): auth-worker: sql(guest@example.com,212.192.246.73): unknown user
    Dec 27 10:18:06 auth-worker(24835): Info: conn unix:auth-worker (pid=24825,uid=110): auth-worker: sql(admin@example.com,141.98.10.220): unknown user
    Dec 27 10:23:45 auth-worker(24842): Info: conn unix:auth-worker (pid=24841,uid=110): auth-worker: sql(sysadmin@example.com,37.0.10.185): unknown user
    Dec 27 10:23:47 auth-worker(24842): Info: conn unix:auth-worker (pid=24841,uid=110): auth-worker: sql(test@example.com,141.98.10.220): unknown user

    • еще один момент. Не могу разобраться как включить фильтр на значение sql.
      В логи явный перебор паролей даже с одного айпи, но они не определяются.
      Вот что написано в /etc/fail2ban/filter.d/dovecot.conf

      # DEV Notes:
      # * the first regex is essentially a copy of pam-generic.conf
      # * Probably doesn't do dovecot sql/ldap backends properly (resolved in edit 21/03/2016)

      Например

      Dec 27 14:35:12 auth-worker(27381): Info: conn unix:auth-worker (pid=27373,uid=110): auth-worker: sql(student@example.com,37.0.10.185): unknown user
      Dec 27 14:35:19 auth-worker(27381): Info: conn unix:auth-worker (pid=27373,uid=110): auth-worker: sql(student@example.com,37.0.10.185): unknown user
      Dec 27 14:35:29 auth-worker(27381): Info: conn unix:auth-worker (pid=27373,uid=110): auth-worker: sql(student@example.com,37.0.10.185): unknown user

      Если прогнать фильтр, он их не найдет
      fail2ban-regex /var/log/dovecot/info.log /etc/fail2ban/filter.d/dovecot.conf --print-all-matched

      Lines: 29304 lines, 0 ignored, 2 matched, 29302 missed
      [processed in 3.32 sec]

      |- Matched line(s):
      | Dec 16 04:29:37 imap-login: Info: Disconnected (auth failed, 1 attempts in 2 secs): user=, method=PLAIN, rip=47.243.232.221, lip=1.0.0.0, TLS, session=
      | Dec 25 11:34:04 imap-login: Info: Disconnected (auth failed, 1 attempts in 2 secs): user=, method=PLAIN, rip=47.89.188.211, lip=1.0.0.0, TLS, session=

    • Я обычно просто забиваю. Если пароли сложные, то подобный перебор никогда не приведёт к успеху. А банить каждый ip после попытки авторизоваться как-то категорично. Могут и юзеры попадать на баны.

  5. В конфиге ошибка, нашел в аналог онлайн с ним работает нормально

    failregex = ^%(__prefix_line)swarning: [-._\w]+\[\]: SASL (?:LOGIN|PLAIN|(?:CRAM|DIGEST)-MD5) authentication failed(: [ A-Za-z0-9+/]*={0,2})?\s*$

    • Изваеняюсь,

      верный вот этот:

      failregex = ^%(__prefix_line)swarning: [-._\w]+\[\]: SASL (?:LOGIN|PLAIN|(?:CRAM|DIGEST)-MD5) authentication failed(: [ A-Za-z0-9+/]*={0,2})?\s*$

      В вашем HOST отсутсвует

  6. Здравствуйте!
    А почему не делаете защиту входа в postfixadmin? Или у него есть штатные средства защиты?

  7. Здравствуйте. Успел сделать только первую часть - Защита postfix с помощью fail2ban и сервер вообще отказался принимать входящие и исходящие соединения. Письма не принимаются и не отправляются. Удалил fail2ban, вернул изменения (вроде все), которые были сделаны. Теперь - почта отправляется, принимается, но только через WebMail. С компа ThunderBird'ом подключиться не могу. Куда ещё посмотреть можно, чтобы вернуть рабочее состояние (и сделать бекап :) ) перед повторной пробой устанавки fail2ban? Спасибо.

    • В итоге удалил учетку из ThunderBird, создал заново и всё заработало. Чудеса....

      • Это вы там что-то у себя чудите. fail2ban только анализирует лог файл и добавляет правила в iptables. Саму почту он вообще не трогает. Соответственно, чтобы все откатить, достаточно остановить fail2ban. Он свои правила убирает из iptables. Но даже если он этого не сделает по какой-то причине, можно руками удалить. На саму почту это не должно влиять.

  8. подскажите как фильтр написать для fail2ban если лог заваливает таким
    2020-12-24 00:00:03 dovecot_login authenticator failed for (User) [212.70.149.54]: 535 Incorrect authentication data (set_id=pamir@in.ua): 1 Time(s)

    • Я так сходу не придумаю рабочее правило, надо тестировать. По дефолту у fail2ban есть готовое правило для dovecot - /etc/fail2ban/filter.d/dovecot.conf Его надо немного подредактировать. Там уже есть фильтр ^authentication failure, можно добавить еще один ^authenticator failure

      • Аноним

        по дефолту мимо всё, пробовал поправить ^authentication failure под себя не могу ((( . в сети ничего. мало того , дефолтный не сохранял, даже код не могу обратно вернуть и нигде про это не могу найти

  9. Александр

    Насчёт ipset/iptables: "зря испугался. Никаких проблем не будет и дальше я покажу почему". Я не нашёл пояснений по этому поводу.

    • Мехмет

      Так вот же ж:
      "Таким образом, список забаненных ip адресов будет не очень большой, так как большая часть адресов будет повторяться."

  10. Александр

    jail.d и jail.local религия не позволила использовать? Ну зачем людей плохому-то учить? Белым по черному же написано, как следует поступать.

    • Почему плохому? Каждый настраивает так, как ему нравится. Иногда, мне удобнее держать все в общем конфиге, а не в разрозненных. Тот же конфиг dovecot я делаю единый. А конфиги вирт. хостов в nginx отдельными. Я делюсь своим практическим опытом. Если кому-то он не подходит, это не моя вина.

    • Александр

      Александр, а вы покажите в двух словах, как в соответствии с правилами хорошего тона надо использовать jail.d и jail.local.

      • Это не правила хорошего тона, а личные предпочтения. Вы можете то правило для dovecot, которое я добавил в общий конфиг jail.conf добавить в отдельный файл, например, dovecot.conf и поместить его в директорию jail.d.

        • Александр

          Спасибо. В моём случае (Fail2Ban v0.8.11) все необходимые правила уже написаны в общем jail.conf, я их только включил (enabled=true). Просто хотелось узнать, где это написано, как следует поступать. Ну и кроме личных предпочтений (а они у читателей подобных статей могут быть и не сформированы) есть понятие "best practices", и есть удобство в стандартизации решений (мне лично удобнее делать так, как это делают чаще всего, чтобы в большинстве случаев видеть знакомую и привычную структуру).

          • Так в том то и дело, что даже по умолчанию, все джейлы описаны в едином конфиге. Так что претензии про хороший тон были необоснованные. Делают и так, и так, кому как больше нравится.

          • Смысл в том, что при обновлении измененные дистрибутивные конфиги будут ругаться, поэтому выделяют jail.local в котором можно переопределить любой параметр не трогая основной конфиг.. т.е. все то, что предлагается изменить в jail.conf вы просто пишите в jail.local.
            Плюс это довольно удобно тем, что сразу же видно, чем ваш конфиг отличается от настроек по-умолчанию.

            • Александр

              Вот это логично, спасибо!

              • в вашем случае, если настройки по-умолчанию годятся jail.local будет вида:
                [sshd]
                enabled=true
                [dovecot]
                enabled=true
                и так далее. Формат такой же как у jail.conf

  11. Алексей

    Добрый день!
    Похоже, ошибка в конфиге /etc/fail2ban/filter.d/postfix-sasl.conf:
    Строка failregex = ^%(__prefix_line)swarning: [-._\w]+\[\]: SASL (?:LOGIN|PLAIN|(?:CRAM|DIGEST)-MD5) authentication failed(: [ A-Za-z0-9+/]*={0,2})?\s*$
    выдает ошибку при проверке "ERROR: No failure-id group in '^mail.neovo.ru(?:\[\])?\s*(?:\s+)?(?:\S+\s+)?(?:kernel:\s?\[ *\d+\.\d+\]:?\s+)?(?:@vserver_\S+\s+)?(?:(?:(?:\[\d+\])?:\s+[\[\(]?\S*(?:\(\S+\))?[\]\)]?:?|[\[\(]?\S*(?:\(\S+\))?[\]\)]?:?(?:\[\d+\])?:?)\s+)?(?:\[ID \d+ \S+\]\s+)?warning: [-._\w]+\[\]: SASL (?:LOGIN|PLAIN|(?:CRAM|DIGEST)-MD5) authentication failed(: [ A-Za-z0-9+/]*={0,2})?\s*$'

    Исправил. Вместо [-._\w]+\[\] дописал [-._\w]+\[\] и проверка прошла.

    • Алексей

      Прошу прощения, треугольные скобки не добавились в мой пост. В последнем блоке квадратных скобок надо было прописать слово HOST в треугольных скобках ДО слэша.

  12. Спасибо за статью. Обнаружил, что в iptables создается правило, которое "слушает" только порт 25:

    Chain INPUT (policy DROP 0 packets, 0 bytes)
    pkts bytes target prot opt in out source destination
    7764 8303K fail2ban-postfix-sasl tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:25

    А попытки подбора пароля к почте идут на порт 465, т.к. из интернета нашей почтой можно пользоваться только через SSL.

    Изменил в файле /etc/fail2ban/jail.conf следущее:

    [postfix-sasl]

    enabled = true
    filter = postfix-sasl
    backend = polling
    action = iptables-multiport[name=postfix-sasl, port="smtp,465,submission,imap,imaps,pop3,pop3s", protocol=tcp]
    logpath = /var/log/maillog
    bantime = 3600
    maxretry = 3
    findtime = 3600

    ...и заработало, стали блокироваться айпишники реально, а не так как раньше в fail2ban.log пишется IP-такой-то - Already Banned, при этом в maillog всё равно записывались попытки подбора пароля (хоть и в iptables эти IP были забанены). Да, я добавил может и лишние порты, но главное что там есть 465-й))).

    Может кому-то будет полезно. Если что у меня Centos 5 и Fail2ban v0.8.14.

    • Забыл написать, правило в iptables стало выглядеть так:

      7764 8303K fail2ban-postfix-sasl tcp -- * * 0.0.0.0/0 0.0.0.0/0 multiport dports 25,465,587,143,993,110,995

    • Centos 5 - сурово :) Она не поддерживается уже лет 5 наверно.

      • Да знаю))) Вот сделал по Вашему мануалу новый почтовик на Centos 8, надеюсь скоро переведу всех на него))) Так что спасибо большое за Ваш сайт))).

        • Проблем быть не должно. Я переносил как раз с Centos 5 на 8. Формат базы данных для postfixadmin не сильно поменялся. Можно поставить старую версию, накатить бэкап со старого сервера и обновить postfixadmin штатно через его обновление. А письма просто как файлы переносятся.

          • Postfixadmin мы не использовали, у нас самописные база и веб морда для управления ящиками, но я её данные уже перевел в базу postfixadmin, осталось перенастроить DNS-записи, перенести файлы ящиков и самое страшное всем юзерам перенастроить почтовые клиенты (включить авторизацию и указать логин не короткий, а с @domain.com), а юзеров куча))).

  13. После настройки по этой статье столкнулся с тем, что fail2ban банит меня даже при верном логине/пароле от почтового ящика.
    Я так понимаю, это из-за того, что в логах есть записи:
    auth-worker(557102): Info: pam(info@site.ru,0.0.0.0,): pam_authenticate() failed: Authentication failure (Password mismatch?) (given password: blablabla)
    auth-worker(557102): Info: passwd(info@site.ru,0.0.0.0,): unknown user

    Избавился от бана так - в файле /etc/dovecot/conf.d/auth-system.conf.ext закомментировал эти строки полностью:
    passdb {
    driver = pam
    # [session=yes] [setcred=yes] [failure_show_msg=yes] [max_requests=]
    # [cache_key=] []
    #args = dovecot
    }
    userdb {
    #
    driver = passwd
    # [blocking=no]
    #args =

    # Override fields from passwd
    #override_fields = home=/home/virtual/%u
    }

    • Не понял, почему при верном пароле, появляются эта запись:

      pam_authenticate() failed: Authentication failure (Password mismatch?)

      • Наверное, потому, что PAM не настроен. Я не специалист, первый раз выделенный сервер на Linux настраиваю под сайт и почту.

  14. Александр

    Добрый день, подскажите пожалуйста, происходит такая история, IP банит а потоп сразу же разбанивает.
    конфиг

    [postfix-my]
    enabled> = true
    filter = postfix-my
    port = smtp,465,submission,imap,imaps,pop3,pop3s
    action = iptables[name=Postfix-my, port=smtp, protocol=tcp]
    logpath> = /var/log/maillog
    bantime> = 10800
    maxretry = 3
    findtime = 86400

    лог

    2020-07-15 18:21:42,991 fail2ban.filter [31775]: INFO [postfix-my] Found 212.43.88.198 - 2020-07-14 18:33:15
    2020-07-15 18:21:42,992 fail2ban.filter [31775]: INFO [postfix-my] Found 212.43.88.198 - 2020-07-14 18:33:15
    2020-07-15 18:21:42,992 fail2ban.filter [31775]: INFO [postfix-my] Found 212.43.88.198 - 2020-07-14 18:33:15
    2020-07-15 18:21:42,992 fail2ban.filter [31775]: INFO [postfix-my] Found 212.43.88.198 - 2020-07-14 18:33:15
    2020-07-15 18:21:42,992 fail2ban.filter [31775]: INFO [postfix-my] Found 212.43.88.198 - 2020-07-14 18:33:15
    2020-07-15 18:21:42,992 fail2ban.filter [31775]: INFO [postfix-my] Found 212.43.88.198 - 2020-07-14 18:33:15
    2020-07-15 18:21:43,324 fail2ban.actions [31775]: NOTICE [postfix-my] Ban 212.43.88.198
    2020-07-15 18:21:45,417 fail2ban.actions [31775]: NOTICE [postfix-my] Unban 212.43.88.198
    2020-07-15 18:56:46,653 fail2ban.filter [31775]: INFO [postfix-my] Found 37.49.230.175 - 2020-07-15 18:56:46

    • Тут судя по всему ошибка:

      bantime> = 10800

      Символ > тут откуда?

      • Александр

        > в конфиге этого символа нет, это табуляция в mcedit

      • Александр

        [postfix-my]
        enabled = true
        filter = postfix-my
        port = smtp,465,submission,imap,imaps,pop3,pop3s
        action = iptables[name=Postfix-my, port=smtp, protocol=tcp]
        logpath = /var/log/maillog
        bantime = 10800
        maxretry = 3
        findtime = 86400

  15. Михаил

    Добрый день,

    Спасибо за статью!

    У Вас регулярка в примере конфига для postfix отличается от регулярки, приведенной выше.
    В конфиге указано

    [-._\w]+\[\]: SASL

    a в изначальном выражении -

    [-._\w]+\[\]: SASL 

    Соответственно выражение в конфиге выдает ошибку.

    • Михаил

      Хм, из комментария нужную часть вырезало :)

      [-._\w]+\[<HOST>\]: SASL

      • Движок съедает некоторые спецсимволы. В комментах из-за этого регулярки не получается писать.

        • Подтверждаю ошибку с пропущенным HOST в /etc/fail2ban/filter.d/postfix-sasl.conf. Её так и не исправили.

  16. Спасибо за статью.

    У себя настроил связку postfix + dovecot + sogo + solr + tika (+ tesseract для распознавания текста во вложениях) . Postfix и dovecot слушают только localhost - все общение через веб. Случай частный, конечно, но тем самым исключил атаки на них извне. А sogo сама умеет блочить при неверных попытках аутен-ции (настраивается в .conf -файле).

    • Было бы здорово использовать только веб доступ, но если он не уровня gmail или яндекс, то все не очень удобно. Я вижу, что чаще всего пользователи, знакомые с Outlook из пакета офиса, предпочитают его. Особенно если с почтой идет плотная и интенсивная работа.

  17. Спасибо за статью, подскажите почему так получается?
    Debian 10
    Iptables
    Chain f2b-Postfix-sasl (1 references)
    pkts bytes target prot opt in out source destination
    8 320 REJECT all -- * * 178.33.107.212 0.0.0.0/0 reject-with icmp-port-unreachable
    0 0 REJECT all -- * * 87.246.7.74 0.0.0.0/0 reject-with icmp-port-unreachable
    20 1200 REJECT all -- * * 87.246.7.70 0.0.0.0/0 reject-with icmp-port-unreachable
    .....
    Chain f2b-dovecot-pop3imap (1 references)
    pkts bytes target prot opt in out source destination
    0 0 REJECT all -- * * 87.246.7.74 0.0.0.0/0 reject-with icmp-port-unreachable
    484 43462 RETURN all -- * * 0.0.0.0/0 0.0.0.0/0

    Но при этом в логе fail2ban:
    2020-06-18 14:04:50,126 fail2ban.actions [175128]: WARNING [dovecot] 87.246.7.74 already banned
    2020-06-18 14:04:51,142 fail2ban.filter [175128]: INFO [postfix-sasl] Found 87.246.7.74 - 2020-06-18 14:04:51
    2020-06-18 14:06:42,690 fail2ban.filter [175128]: INFO [dovecot] Found 87.246.7.74 - 2020-06-18 14:06:42
    2020-06-18 14:06:44,266 fail2ban.filter [175128]: INFO [postfix-sasl] Found 87.246.7.74 - 2020-06-18 14:06:44
    2020-06-18 14:06:44,279 fail2ban.actions [175128]: WARNING [postfix-sasl] 87.246.7.74 already banned
    2020-06-18 14:07:19,175 fail2ban.filter [175128]: INFO [dovecot] Found 87.246.7.74 - 2020-06-18 14:07:19
    2020-06-18 14:07:21,179 fail2ban.filter [175128]: INFO [postfix-sasl] Found 87.246.7.74 - 2020-06-18 14:07:21
    2020-06-18 14:09:08,988 fail2ban.filter [175128]: INFO [dovecot] Found 87.246.7.74 - 2020-06-18 14:09:08
    2020-06-18 14:09:09,241 fail2ban.actions [175128]: WARNING [dovecot] 87.246.7.74 already banned
    2020-06-18 14:09:10,491 fail2ban.filter [175128]: INFO [postfix-sasl] Found 87.246.7.74 - 2020-06-18 14:09:10

    Конфигурация:
    [postfix-sasl]
    enabled = true
    filter = postfix[mode=auth]
    port = smtp,465,submission,imap,imaps,pop3,pop3s
    action = iptables[name=Postfix-smtp, port=smtp, protocol=tcp]
    logpath = /var/log/mail.log
    bantime = 180m
    maxretry = 3
    findtime = 60m

    [dovecot]
    enabled = true
    port = pop3,pop3s,imap,imaps,submission,465,sieve
    filter = dovecot
    action = iptables-multiport[name=dovecot-pop3imap,port="pop3,pop3s,imap,imaps", protocol=tcp]
    logpath = /var/log/dovecot/info.log
    maxretry = 3
    findtime = 60m
    bantime = 180m

    Ip попадает в бан на iptables но не банится по факту. Iptables настраивал так же по Вашей статье, добавил только проброс портов для почтовых сервисов.

    • Не понял, в чем вопрос и проблема? Какой ip не банится?

      • Вот этот IP 87.246.7.74 уже добавлен в цепочку Chain f2b-Postfix-sasl и в Chain f2b-dovecot-pop3imap, но при этом в логе fail2ban он продолжает мелькать:
        WARNING [postfix-sasl] 87.246.7.74 already banned
        WARNING [dovecot] 87.246.7.74 already banned
        несмотря на то, что в iptables он уже вписан

        • 2020-06-18 13:59:26,468 fail2ban.filter [175128]: INFO [postfix-sasl] Found 87.246.7.74 - 2020-06-18 13:59:26
          2020-06-18 13:59:26,930 fail2ban.actions [175128]: WARNING [postfix-sasl] 87.246.7.74 already banned
          2020-06-18 14:00:01,213 fail2ban.filter [175128]: INFO [dovecot] Found 87.246.7.74 - 2020-06-18 14:00:01
          2020-06-18 14:00:03,126 fail2ban.filter [175128]: INFO [postfix-sasl] Found 87.246.7.74 - 2020-06-18 14:00:03
          2020-06-18 14:01:48,181 fail2ban.filter [175128]: INFO [dovecot] Found 87.246.7.74 - 2020-06-18 14:01:48
          2020-06-18 14:01:48,656 fail2ban.actions [175128]: NOTICE [dovecot] Ban 87.246.7.74
          2020-06-18 14:01:50,251 fail2ban.filter [175128]: INFO [postfix-sasl] Found 87.246.7.74 - 2020-06-18 14:01:50
          2020-06-18 14:02:23,874 fail2ban.filter [175128]: INFO [dovecot] Found 87.246.7.74 - 2020-06-18 14:02:23
          2020-06-18 14:02:25,377 fail2ban.filter [175128]: INFO [postfix-sasl] Found 87.246.7.74 - 2020-06-18 14:02:25
          2020-06-18 14:02:25,955 fail2ban.actions [175128]: WARNING [postfix-sasl] 87.246.7.74 already banned
          2020-06-18 14:04:20,704 fail2ban.filter [175128]: INFO [dovecot] Found 87.246.7.74 - 2020-06-18 14:04:20
          2020-06-18 14:04:22,206 fail2ban.filter [175128]: INFO [postfix-sasl] Found 87.246.7.74 - 2020-06-18 14:04:22
          2020-06-18 14:04:49,608 fail2ban.filter [175128]: INFO [dovecot] Found 87.246.7.74 - 2020-06-18 14:04:49
          2020-06-18 14:04:50,126 fail2ban.actions [175128]: WARNING [dovecot] 87.246.7.74 already banned
          2020-06-18 14:04:51,142 fail2ban.filter [175128]: INFO [postfix-sasl] Found 87.246.7.74 - 2020-06-18 14:04:51
          2020-06-18 14:06:42,690 fail2ban.filter [175128]: INFO [dovecot] Found 87.246.7.74 - 2020-06-18 14:06:42
          2020-06-18 14:06:44,266 fail2ban.filter [175128]: INFO [postfix-sasl] Found 87.246.7.74 - 2020-06-18 14:06:44
          2020-06-18 14:06:44,279 fail2ban.actions [175128]: WARNING [postfix-sasl] 87.246.7.74 already banned
          2020-06-18 14:07:19,175 fail2ban.filter [175128]: INFO [dovecot] Found 87.246.7.74 - 2020-06-18 14:07:19
          2020-06-18 14:07:21,179 fail2ban.filter [175128]: INFO [postfix-sasl] Found 87.246.7.74 - 2020-06-18 14:07:21
          2020-06-18 14:09:08,988 fail2ban.filter [175128]: INFO [dovecot] Found 87.246.7.74 - 2020-06-18 14:09:08
          2020-06-18 14:09:09,241 fail2ban.actions [175128]: WARNING [dovecot] 87.246.7.74 already banned
          2020-06-18 14:09:10,491 fail2ban.filter [175128]: INFO [postfix-sasl] Found 87.246.7.74 - 2020-06-18 14:09:10

        • А у вас выше нигде нет правила в iptables, по которому может проходить разрешение для этого IP? Подозрительны нулевые счетчики на правилах блокировки для этого адреса. Запросы до правил блокировки вообще не доходят, попадая в резрешенные где-то выше по списку.

          • Проверил, в правилах ничего необычного, даже сравнил с вашими построчно. Сделал сброс всех цепочек, применил скрипт и рестартнул f2b ip в логах больше не появлялся и на ipt счетчик побежал.

            • Возможно этот ip подключался через правило с установленным соединением. А после сбора правил его отключило и больше подключиться не смог.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Нажимая кнопку "Отправить комментарий" Я даю согласие на обработку персональных данных.
Используешь Telegram? Подпишись на канал автора →
This is default text for notification bar