У меня есть много статей про настройку почтового сервера, где я постоянно пропускаю важную тему защиты почтового сервера от перебора паролей. Пришло время это исправить и рассказать, как защитить postfix и dovecot с помощью fail2ban от подбора паролей к почтовым ящикам. Метод традиционный, простой и надежный - будем банить по ip тех, кто будет пытаться пройти авторизацию с неверными учетными данными.
Научиться настраивать 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
В 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, я слегка растерялся :) Он просто огромен. И самое главное, что в таком виде он не заработал на моем лог файле.
Мне стало лень ковыряться в этих правилах. Для защиты 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
Команда успешно отработала и вывела результат.
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.
Смотрим правила iptables.
# iptables -L -v -n
У вас должна появиться отдельная цепочка правил 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
Сработок очень много. Судя по всему, фильтр работает. Добавляем в конфиг 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, я некоторое время наблюдаю за сервером, чтобы проверить правильность работы. Для этого делаю вот такое окно в отдельном мониторе и наблюдаю некоторое время.
Здесь открыт лог 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 с нуля или систематизировать уже имеющиеся знания можно на углубленном онлайн-курcе по администрированию MikroTik. Автор курcа – сертифицированный тренер MikroTik Дмитрий Скоромнов. Более 40 лабораторных работ по которым дается обратная связь. В три раза больше информации, чем в MTCNA.
Приветствую.
Очередное СПАСИБО за статью.
Настроил все по статье "Настройка postfix + dovecot + postfixadmin + roundcube + dkim на Debian"
Не могли бы Вы подсказать, как настроить fail2ban для UFW?
Пока в [DEFAULT] добавил только banaction = utf. А вот что записать в секцию "action" - "завис"....
Спасибо
Сорри. banaction = ufw
Я с ufw не работаю, поэтому не подскажу.
Настроил 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 заработал как надо.
Добрый день! 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*$
Удалилось из сообщения слово HOST взятое в скобки в виде знаков меньше
Доброго времени суток Владимир!
Нуждаюсь в Вашей помощи, а точней совета куда рыть , где искать проблему.
Выполнил настройку согласно Вашему руководству по статье -> Настройка 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 на мой взгляд начала работать ощутимо быстрее.
Может быть кому то поможет.
Тут перебирают пароли но с разных ип адресов, но с одного диапазона. Как то можно вот с таким бороться:
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 после попытки авторизоваться как-то категорично. Могут и юзеры попадать на баны.
Я так понял что автор fail2ban обновляет фильтры, обновив dovecot.conf проблема ушла, прекрасно фильтрует "auth-worker".
https://github.com/fail2ban/fail2ban/blob/master/config/filter.d/dovecot.conf
И вообще fail2ban недавно обновился https://github.com/fail2ban/fail2ban/releases
В конфиге ошибка, нашел в аналог онлайн с ним работает нормально
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 отсутсвует
failregex = ^%(__prefix_line)swarning: [-._\w]+\[\]: SASL (?:LOGIN|PLAIN|(?:CRAM|DIGEST)-MD5) authentication failed(: [ A-Za-z0-9+/]*={0,2})?\s*$
Интересно, не дает вставить HOST на ваш сайт...
Здравствуйте!
А почему не делаете защиту входа в postfixadmin? Или у него есть штатные средства защиты?
Я его никогда не открываю для публичного доступа.
Здравствуйте. Успел сделать только первую часть - Защита postfix с помощью fail2ban и сервер вообще отказался принимать входящие и исходящие соединения. Письма не принимаются и не отправляются. Удалил fail2ban, вернул изменения (вроде все), которые были сделаны. Теперь - почта отправляется, принимается, но только через WebMail. С компа ThunderBird'ом подключиться не могу. Куда ещё посмотреть можно, чтобы вернуть рабочее состояние (и сделать бекап :) ) перед повторной пробой устанавки fail2ban? Спасибо.
В итоге удалил учетку из ThunderBird, создал заново и всё заработало. Чудеса....
Это вы там что-то у себя чудите. fail2ban только анализирует лог файл и добавляет правила в iptables. Саму почту он вообще не трогает. Соответственно, чтобы все откатить, достаточно остановить fail2ban. Он свои правила убирает из iptables. Но даже если он этого не сделает по какой-то причине, можно руками удалить. На саму почту это не должно влиять.
подскажите как фильтр написать для 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 под себя не могу ((( . в сети ничего. мало того , дефолтный не сохранял, даже код не могу обратно вернуть и нигде про это не могу найти
Насчёт ipset/iptables: "зря испугался. Никаких проблем не будет и дальше я покажу почему". Я не нашёл пояснений по этому поводу.
Так вот же ж:
"Таким образом, список забаненных ip адресов будет не очень большой, так как большая часть адресов будет повторяться."
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
Добрый день!
Похоже, ошибка в конфиге /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 в треугольных скобках ДО слэша.
как ты это оттраблшутил?
Спасибо, мне помогло!
Спасибо за статью. Обнаружил, что в 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), а юзеров куча))).
После настройки по этой статье столкнулся с тем, что 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 настраиваю под сайт и почту.
Добрый день, подскажите пожалуйста, происходит такая история, 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
Добрый день,
Спасибо за статью!
У Вас регулярка в примере конфига для postfix отличается от регулярки, приведенной выше.
В конфиге указано
a в изначальном выражении -
Соответственно выражение в конфиге выдает ошибку.
Хм, из комментария нужную часть вырезало :)
[-._\w]+\[<HOST>\]: SASL
Движок съедает некоторые спецсимволы. В комментах из-за этого регулярки не получается писать.
Подтверждаю ошибку с пропущенным HOST в /etc/fail2ban/filter.d/postfix-sasl.conf. Её так и не исправили.
Спасибо за статью.
У себя настроил связку postfix + dovecot + sogo + solr + tika (+ tesseract для распознавания текста во вложениях) . Postfix и dovecot слушают только localhost - все общение через веб. Случай частный, конечно, но тем самым исключил атаки на них извне. А sogo сама умеет блочить при неверных попытках аутен-ции (настраивается в .conf -файле).
Было бы здорово использовать только веб доступ, но если он не уровня gmail или яндекс, то все не очень удобно. Я вижу, что чаще всего пользователи, знакомые с Outlook из пакета офиса, предпочитают его. Особенно если с почтой идет плотная и интенсивная работа.
Спасибо за статью, подскажите почему так получается?
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 подключался через правило с установленным соединением. А после сбора правил его отключило и больше подключиться не смог.