Настройка fail2ban для защиты asterisk

Introduction

Fail2ban is a brute-force detection system that analyzes the log files on your system to figure out failed login attempts to various services and block them. By default, it uses to block attacking IP addresses.

When trying to set up Fail2ban with Asterisk, the Asterisk jail file that comes with your installed Fail2ban version may not always be compatible with your Asterisk version and you may face issues such as attacks not getting blocked or error messages like:

2018-04-08 15:53:26,494 fail2ban.filter         : ERROR   No 'host' group in 'SECURITY.* SecurityEvent="FailedACL".*RemoteAddress=".+?/.+?//.+?".*'2018-04-08 15:53:26,494 fail2ban.transmitter    : WARNING Command ['set', 'asterisk', 'addfailregex', 'SECURITY.* SecurityEvent="FailedACL".*RemoteAddress=".+?/.+?//.+?".*'] has failed. Received RegexException('No \'host\' group in \'SECURITY.* SecurityEvent="FailedACL".*RemoteAddress=".+?/.+?//.+?".*\'',)2018-04-08 15:53:26,496 fail2ban.filter         : ERROR   No 'host' group in 'SECURITY.* SecurityEvent="InvalidAccountID".*RemoteAddress=".+?/.+?//.+?".*'2018-04-08 15:53:26,497 fail2ban.transmitter    : WARNING Command ['set', 'asterisk', 'addfailregex', 'SECURITY.* SecurityEvent="InvalidAccountID".*RemoteAddress=".+?/.+?//.+?".*'] has failed. Received RegexException('No \'host\' group in \'SECURITY.* SecurityEvent="InvalidAccountID".*RemoteAddress=".+?/.+?//.+?".*\'',)2018-04-08 15:53:26,497 fail2ban.filter         : ERROR   No 'host' group in 'SECURITY.* SecurityEvent="ChallengeResponseFailed".*RemoteAddress=".+?/.+?//.+?".*'2018-04-08 15:53:26,498 fail2ban.transmitter    : WARNING Command ['set', 'asterisk', 'addfailregex', 'SECURITY.* SecurityEvent="ChallengeResponseFailed".*RemoteAddress=".+?/.+?//.+?".*'] has failed. Received RegexException('No \'host\' group in \'SECURITY.* SecurityEvent="ChallengeResponseFailed".*RemoteAddress=".+?/.+?//.+?".*\'',)2018-04-08 15:53:26,499 fail2ban.filter         : ERROR   No 'host' group in 'SECURITY.* SecurityEvent="InvalidPassword".*RemoteAddress=".+?/.+?//.+?".*'2018-04-08 15:53:26,499 fail2ban.transmitter    : WARNING Command ['set', 'asterisk', 'addfailregex', 'SECURITY.* SecurityEvent="InvalidPassword".*RemoteAddress=".+?/.+?//.+?".*'] has failed. Received RegexException('No \'host\' group in \'SECURITY.* SecurityEvent="InvalidPassword".*RemoteAddress=".+?/.+?//.+?".*\'',)

I will share a working configuration tested with:

  • Ubuntu 16.04
  • Asterisk 13.19.0
  • Fail2Ban 0.9.3

Советы и рекомендации

Пользовательская «клетка» SSH

Важно: Зная ваш IP-адрес, злоумышленник может послать пакеты с подменёнными заголовками отправителя, тем самым лишив вас доступа к серверу. Ключи SSH предоставляют отличное решение проблемы брутфорса без подобных последствий.. Отредактируйте файл , добавив эту секцию и обновив список доверенных IP-адресов в :

Отредактируйте файл , добавив эту секцию и обновив список доверенных IP-адресов в :

/etc/fail2ban/jail.d/sshd.local
enabled   = true
filter    = sshd
banaction = iptables
backend   = systemd
maxretry  = 5
findtime  = 1d
bantime   = 2w
ignoreip  = 127.0.0.1/8

Примечание:

  • Может понадобиться задать в файле , чтобы разрешить Fail2ban полноценный мониторинг. В противном случае, ошибки ввода пароля могут быть неправильно зарегистрированы.
  • Fail2ban поддерживает IPv6 с версии 0.10. Настройте межсетевой экран соответственно, например, запустите и включите службу .
  • Fail2ban поддерживает работу с пространствами имён журнала (которые задаются с помощью в файлах юнитов). Задайте параметру , к примеру, значение , чтобы активировать эту возможность.

Совет:

  • При использовании фронтендов iptables, например, ufw (англ.), можно использовать вместо iptables.
  • При использовании Shorewall (англ.) можно прописать и также задать значение параметру в файле . В противном случае, правила, добавленные для блокировки IP-адреса, будут влиять только на новые соединения.

Защита службы

Поскольку Fail2ban следует запускать от имени суперпользователя, можно дополнительно защитить службу с помощью systemd.

Создайте конфигурационный drop-in файл для службы :

/etc/systemd/system/fail2ban.service.d/override.conf
PrivateDevices=yes
PrivateTmp=yes
ProtectHome=read-only
ProtectSystem=strict
NoNewPrivileges=yes
ReadWritePaths=-/var/run/fail2ban
ReadWritePaths=-/var/lib/fail2ban
ReadWritePaths=-/var/log/fail2ban
ReadWritePaths=-/var/spool/postfix/maildrop
ReadWritePaths=-/run/xtables.lock
CapabilityBoundingSet=CAP_AUDIT_READ CAP_DAC_READ_SEARCH CAP_NET_ADMIN CAP_NET_RAW

Параметр (в строке ) позволяет Fail2ban читать любые файлы и каталоги, а и позволяют Fail2ban управлять любым межсетевым экраном c командной оболочкой. См. для получения более подробной информации.

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

От имени суперпользователя создайте каталог и пропишите в файл корректный путь :

/etc/fail2ban/fail2ban.local
logtarget = /var/log/fail2ban/fail2ban.log

Для применения изменений в файлах юнитов и перезапустите службу .

Изоляторы (jails)

Несмотря на то, что файл fail2ban.conf определяет основную конфигурацию всей подсистемы, всё-таки наиболее важным для функционирования, пожалуй, следует считать файл jail.conf, который содержит описания так называемых «изоляторов» (jails).

Текущую конфигурацию каждого изолятора описывает набор следующих параметров:

  • ignoreip — список IP-адресов, которые не должны быть заблокированы, причём можно задавать диапазон адресов с помощью маски подсети или список IP-адресов, отделённых друг от друга пробелом.
  • bantime — продолжительность интервала блокирования (в секундах) для IP-адреса.
  • findtime — длительность интервала обнаружения «подозрительных совпадений» (в журналах). Если за этот интервал времени ничего подозрительного не обнаружено, то счётчику (counter) присваивается значение 0.
  • maxretry — количество «подозрительных совпадений» (т.е., значение счётчика counter), при котором срабатывает определённая операция по отношению к отслеживаемому IP-адресу.
  • action — операция, которая должна быть выполнена, если значение счётчика стало равным значению параметра maxretry. По умолчанию сервис (порт) блокируется для отслеживаемого IP-адреса.
  • port — наименование сервиса или номер соответствующего этому сервису порта, за которым ведётся наблюдение.
  • filter — имя фильтра, который должен использовать данный изолятор, чтобы выявлять «подозрительные совпадения» в журналах (фильтры хранятся в подкаталоге /etc/fail2ban/filter.d).
  • logpath — путь к файлу журнала, который должен обрабатываться с помощью заданного фильтра.

Содержимое файла jail.conf разделяется на секции, соответствующие различным сервисам. Самая первая секция называется и предназначается для определения общих параметров, значения которых имеют силу во всех последующих секциях данного файла. Один из вариантов содержимого секции показан в листинге 1.

Листинг 1. Параметры, определяемые в секции
ignoreip = 127.0.0.1
bantime = 600
findtime = 600
maxretry = 3

Набор параметров, приведённых в листинге 1, означает, что после трёх неудачных попыток (значение параметра ) получить доступ в систему с одного и того же IP-адреса в течение 10 минут (600 секунд, значение параметра ) этот адрес будет автоматически заблокирован на 10 минут (600 секунд, параметр ).

Для параметра задан только один адрес 127.0.0.1 (localhost), поскольку блокировать «самого себя» нет никакого смысла.

Пример простой конфигурации изолятора для сервиса ssh приведён в листинге 2.

Листинг 2. Конфигурация изолятора для сервиса ssh

enabled = true
port = ssh
filter = sshd
logpath = /var/log/secure
maxretry = 5

Здесь определена типовая конфигурация для наблюдения за сервисом ssh, которая предписывает сканирование журнала /var/log/secure с использованием фильтра sshd (файл sshd.conf). Если в журнале будет обнаружено 5 попыток атаки на порт сервиса ssh, то IP-адрес, с которого производились эти попытки, будет заблокирован (действие по умолчанию).

При необходимости к описанной в листинге 3 конфигурации можно добавить определение параметра .

action = iptables

Этот параметр определяет, какие операции (действия) необходимо выполнить в том случае, когда обнаружены «подозрительные совпадения» с помощью заданного фильтра. Значением является имя файла, расположенного в подкаталоге /etc/fail2ban/action.d/, но без указания его расширения .conf. Таким образом, в данном случае параметр ссылается на файл /etc/fail2ban/action.d/iptables.conf, и блокирование «агрессивного» IP-адреса будет выполнено посредством изменения правил сетевого экрана iptables.

Для Web-сервера Apache изолятор конфигурируется почти аналогичным образом с небольшими различиями, как показано в листинге 3.

Листинг 3. Конфигурация изолятора для Web-сервера Apache

enabled = true
port = http,https
filter = apache-auth
logpath = /var/log/httpd/*error_log
bantime = 1800
maxretry = 3

Различия заключаются в следующем: блокироваться будут сразу два порта (http и https), сканирование будет выполняться в нескольких файлах журналов, а условия блокирования заданы более жёсткие — уже после трёх неудачных попыток аутентификации IP-адрес будет заблокирован на полчаса.

Зачем fail2ban нужен для asterisk?

Как Вам известно, asterisk является приложением (сервером) для IP-телефонии. То есть позволяет подключившимся к нему клиентам звонить друг другу и во внешний мир, используя (помимо всего прочего) линии телефонной связи. При этом возникают следующие риски:

  1. клиенты идентифицируются по логину/паролю, а также (как правило) по IP адресу. При этом существует возможность подобрать пароль (раньше или позже, в зависимости от его сложности, но в любом случае это возможно), причем крайне часто ограничения по IP адресам далеко не такие жесткие, как хотелось бы (в идеале для каждого клиента должен быть свой уникальный IP адрес)
  2. входящие звонки из интернета (например, с других серверов asterisk). С этими подключениями все сложнее, поскольку asterisk (в базовой конфигурации) не предусматривает отображение IP адресов, с которых производится подключение.

Программа fail2ban в связке с брандмауэром (например, iptables) и правильно настроенным asterisk (отображающим в логах полную информацию, в том числе IP адреса клиентов и других серверов) позволяет эффективно заблокировать попытки подключения и подбора пароля.

Перед началом настройки Вам необходимо установить iptables и fail2ban. Кроме того, iptables должен быть уже настроен (и разрешать подключения к asterisk) до начала настройки fail2ban! Прочитать, как настроить iptables можно здесь: настройка iptables для работы asterisk. Вы также можете установить fail2ban до установки самого asterisk, и в этом случае (по крайней мере, теоретически) в процессе установки последние версии asterisk обнаруживают установленный fail2ban и настраивают его автоматически. Однако:

  1. Не всегда вопрос безопасности IP-телефонии рассматривается до установки asterisk. То есть скорее всего, Вы захотите установить fail2ban на систему с уже установленным (и настроенным) астериском.
  2. Не во всех случаях автоматическое конфигурирование срабатывает вообще, не говоря уже о том, чтобы оно сработало правильно (и начало блокировать все атаки на asterisk).

Запуск fail2ban

Теперь необходимо запустить (или перезапустить) fail2ban и (если это необходимо, например iptables еще не был запущен) iptables.

Для запуска iptables (его нужно запустить первым) выполните следующую команду:

Для перезапуска fail2ban выполните следующую команду:

Для проверки, что fail2ban запущен успешно и правило загружено, выполните следующую команду:
и (если есть второе правило)

Для отображения списка правил iptables выполните следующую команду:

В случае, если Вы только что установили fail2ban / iptables, не забудьте убедиться, что они настроены у Вас стартовать автоматически при загрузке системы!

Примеры правил

В данных примерах блокировка IP-адреса будет происходить на 12 минут после 4-х попыток ввода пароля в течение 8 минут. Эти параметры берутся из настроек . Если их нужно переопределить, просто добавляем их при описании правила.

SSH

CentOS

vi /etc/fail2ban/jail.d/ssh.conf

enabled = true
port = ssh
filter = sshd
action = firewallcmd-new
logpath = /var/log/secure

Ubuntu

vi /etc/fail2ban/jail.d/ssh.conf

enabled = true
port = ssh
filter = sshd
action = iptables
logpath = /var/log/auth.log

Asterisk

vi /etc/fail2ban/jail.d/asterisk.conf

enabled = true
filter = asterisk
action = iptables-allports
logpath = /var/log/asterisk/messages

NGINX

vi /etc/fail2ban/jail.d/nginx.conf

enabled = true
port = http,https
filter = nginx-http-auth
action = iptables-multiport
logpath = /var/log/nginx/error.log

NGINX DDoS (req limit)

Данное правило поможет защитить веб-сервер nginx от DDoS-атак. В некоторых сборках, для данного правило может не оказаться готового фильтра, поэтому в данном примере, мы его создадим вручную.

Создаем фильтр:

vi /etc/fail2ban/filter.d/nginx-limit-req.conf

ngx_limit_req_zones = +

failregex = ^\s*\ \d+#\d+: \*\d+ limiting requests, excess: + by zone «(?:%(ngx_limit_req_zones)s)», client: <HOST>

ignoreregex =

Создаем правило в Fail2ban:

vi /etc/fail2ban/jail.d/nginx-ddos.conf

enabled = true
port = http,https
filter = nginx-limit-req
action = iptables-multiport
logpath = /var/log/nginx/error.log

После настройки не забываем перезапустить fail2ban:

systemctl restart fail2ban

Базовая настройка

Процесс настройки fail2ban не зависит от дистрибутива Linux. Основной конфигурационный файл находится по пути /etc/fail2ban/jail.conf. Однако, его не рекомендуется менять и для настройки используют подключаемые файлы из каталога /etc/fail2ban/jail.d.

Для начала создаем первый файл, в котором будут храниться настройки по умолчанию:

vi /etc/fail2ban/jail.d/default.conf

Приведем его к виду:

maxretry = 4
findtime = 480
bantime = 720
action = firewallcmd-ipset
ignoreip = 127.0.0.1/8

* где:

  • maxretry — количество действий, которые разрешено совершить до бана.
  • findtime — время в секундах, в течение которого учитывается maxretry;
  • bantime — время, на которое будет блокироваться IP-адрес;
  • action — действия, которое будет выполняться, если Fail2ban обнаружит активность, соответствующую критериям поиска;
  • ignoreip — игнорировать защиту, если запросы приходят с перечисленных адресов.

* В данном примере, если в течение 8 минут (480) будет найдено 5 строк (maxretry = 4), содержащих критерий фильтра, Fail2ban заблокирует IP-адрес, с которого идет подключение на 12 минут (720);
* В секции хранятся общие настройки для всех правил. Каждую из настроек можно переопределить при конфигурировании самого правила.

Настройка Fail2Ban

Однако, не рекомендуется редактировать напрямую.

Вместо него мы будем работать с его локальной копией —

Создайте локальную копию конфига :

$ sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

Откройте :

$ sudo vi /etc/fail2ban/jail.local

Обратите внимание на глобальные опции в секции

В ней прописываются базовые правила, которым по умолчанию будет следовать :

Опция Описание
ignoreip Не блокировать IP адреса из этого списка. Если IP адресов несколько, то они разделяются пробелами.
bantime Время бана в секундах. По умолчанию — 10 минут. Для постоянного бана используйте любое отрицательное число.
findtime Длительность интервала времени в секундах, в течении которого отслеживает подозрительную активность. По умолчанию — 10 минут.
maxretry Количество подозрительных совпадений, после которых IP адрес получает бан. По умолчанию — 3 попытки.

Для более тонкой настройки, каждый (секция с правилами для конкретного приложения) можно настраивать индивидуально.

Настройка

Рекомендуется создать файл , так как может быть перезаписан во время обновления системы. К примеру, задать время блокировки в 1 день можно следующим образом:

/etc/fail2ban/jail.local
bantime = 1d

Также можно создавать отдельные файлы name.local в каталоге , например, .

Перезапустите службу для применения изменений.

Включение «клеток»

По умолчанию все «клетки» отключены. Добавьте строку к конфигурации той «клетки», которую необходимо включить. Например, включение «клетки» OpenSSH выглядит следующим образом:

/etc/fail2ban/jail.local
enabled = true

См. .

Почтовые уведомления

Для получения электронных писем при блокировке IP-адресов следует настроить SMTP-клиент (например, msmtp (англ.)) и изменить действие по умолчанию:

/etc/fail2ban/jail.local
destemail = вашеимя@example.com
sender = вашеимя@example.com

# для блокировки и отправки электронного письма на destemail с whois-отчётом
action = %(action_mw)s

# то же, что и action_mw, но включает в себя ещё и связанные строки из лога
#action = %(action_mwl)s

Межсетевой экран и службы

По умолчанию Fail2ban использует iptables. Однако, настройка большинства и служб не представляет трудности. Пример использования nftables:

/etc/fail2ban/jail.local
banaction = nftables

Использование Fail2Ban для защиты SSH от перебора паролей

Создадим файл и внесем настройки:

И добавим в него содержимое:

# Ban hosts for one hour:
bantime = 3600
# Override /etc/fail2ban/jail.d/00-firewalld.conf:
banaction = iptables-multiport

enabled = true

Данная конфигурация устанавливает новое время для блокировки IP адресовм для всех служб, устанавливает использование iptables для блокировок и включается защиту для sshd.

Чтобы использовать для фильтрации firewalld, укажите:

banaction = firewallcmd-ipset

После изменения настроек перезапустите сервис:

Чтобы посмотреть статус fail2ban, и проверить список защищаемых службы, выполните команду:

Status
|- Number of jail: 1
`- Jail list: sshd

Вы можете запросить текущий статус блокировок fail2ban для конкретной службы:

В файле jail.conf можно описать общие параметры, которые не будут переопределяться в jail.local.

Разблокируйте строку:

ignoreip = 127.0.0.1/8

Измените следующие значения: — время на которое будет заблокирован IP — время, в течение которого будут подсчитываться неудачные попытки авторизации. — количество попыток до блокировки

Чтобы настроить блокировку для отдельных сервисов, в файле /etc/fail2ban/jail.local после блока создается блок для нужного сервиса, например, как с sshd. Добавим в него некоторые настройки:

enabled = true
port = ssh
logpath = %(sshd_log)s

Мы указали какой порт блокировать и куда писать логи блокировки

Обратите внимание на директорию /etc/fail2ban/filter.d, там описываются фильтры с помощью которых будут анализироваться записи в журнале и проверять, указывает ли та или иная запись на неудачную аутентификацию. Если вывести список файлов в каталоге, можно обнаружить правила fail2ban для большинство популярных сервисов:

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

Логи Fail2Ban

Чтобы проверить журнал fail2ban, выполните команду:

Так же можно проверить логи в реальном времени:

Вывод из лога:

2019-12-05 12:13:26,914 fail2ban.actions : NOTICE  Restore Ban 222.186.180.17
2019-12-05 12:13:26,930 fail2ban.actions : NOTICE  Restore Ban 222.186.180.223
2019-12-05 12:13:26,944 fail2ban.actions : NOTICE  Restore Ban 36.72.82.10
2019-12-05 12:13:26,958 fail2ban.actions : NOTICE  Restore Ban 40.117.135.57
2019-12-05 12:13:26,973 fail2ban.actions : NOTICE  Restore Ban 45.55.155.224
2019-12-05 12:13:26,988 fail2ban.actions : NOTICE  Restore Ban 67.205.135.127
2019-12-05 12:13:27,003 fail2ban.actions : NOTICE  Restore Ban 83.171.107.216
2019-12-05 12:13:43,362 fail2ban.filter : INFO  Found 183.87.134.98 - 2019-12-05 12:13:42
2019-12-05 12:13:45,571 fail2ban.filter : INFO  Found 183.87.134.98 - 2019-12-05 12:13:45
2019-12-05 12:15:46,109 fail2ban.filter : INFO  Found 112.64.170.178 - 2019-12-05 12:15:45
2019-12-05 12:17:05,317 fail2ban.actions : NOTICE  Unban 222.186.175.216

Как видите, fail2ban работает и периодически блокирует или убирает блокировку для IP адресов.

Чтобы проверить, какие IP адреса заблокированы в iptables службой fail2ban, выполните:

Как видите, с открытым наружу ssh, время от времени кто-то пытается подобрать пароль и авторизоваться. Если проверить статистику через какое-то время, видно, что количество заблокированных IP растет.

Настройка общих правил.

Создадим новые правила

# iptables -P INPUT ACCEPT

1 # iptables -P INPUT ACCEPT

Эта команда разрешит все входящие подключения что позволит нам избежать блокировки нашего соединения, если конфигурирование производится через ssh.

# iptables -F

1 # iptables -F

Данная команда сбросит все текущие правила по умолчанию и применит только созданное нами правило.

# iptables -A INPUT -i lo -j ACCEPT

1 # iptables -A INPUT -i lo -j ACCEPT

Это простое правило разрешает все подключения на адаптер loopback. Интерфейс loopback определяется системой как lo и по умолчанию имеет адрес 127.0.0.1 Команда -А добавляет новое правило в конец заданной цепочки INPUT. Опция -i вместе именем интерфейса lo разрешает все виды трафика через заданный интерфейс. Опция -j указывает на цель данного правила ACCEPT, принять все подключения.

iptables -A INPUT -m state —state ESTABLISHED,RELATED -j ACCEPT

1 iptables-AINPUT-mstate—state ESTABLISHED,RELATED-jACCEPT

Некоторые части этого правила уже вам знакомы. Далее присутствует опция -m которая используется для загрузки модуля state. Модуль state проверяет состояние пакета и определяет является ли он новым-NEW, уже созданным-ESTABLISHED или новым, но связанным-RELATED с уже установленным соединением. Состояние ESTABLISHED указывает на то, что пакет принадлежит уже установленному соединению через которое пакеты идут в обоих направлениях. Признак NEW подразумевает, что пакет открывает новое соединение или пакет принадлежит однонаправленному потоку. Признак RELATED указывает на то что пакет принадлежит уже существующему соединению, но при этом он открывает новое соединение.

iptables -A INPUT -p tcp —dport 22 -j ACCEPT

1 iptables-AINPUT-ptcp—dport22-jACCEPT

Это правило добавляется к цепочке INPUT и говорит, что все пакеты, приходящие по протоколу TCP (-p tcp), на порт 22 (–dport 22), должны быть приняты(-j ACCEPT). Используется для подключения по ssh c портом по умолчанию.Если вам требуется открыть доступ к веб серверу цепочка будет выглядеть также, за исключением номера порта.

iptables -A INPUT -p tcp —dport 80 -j ACCEPT

1 iptables-AINPUT-ptcp—dport80-jACCEPT

Хочу заметить, что php приложения являются очень уязвимым местом часто используемым для взлома Asterisk.

iptables -P INPUT DROP

1 iptables-PINPUT DROP

Помните, первое правило? Когда мы устанавливаем политику по умолчанию для входных цепей принять? Это правило меняет политику по умолчанию для входных цепочек обратно в DROP, что и требуется, если вы хотите на самом деле блокировать трафик поступающий на ваш сервер.

iptables -P FORWARD DROP

1 iptables-PFORWARD DROP

Запретим маршрутизацию трафика

iptables -P OUTPUT ACCEPT

1 iptables-POUTPUT ACCEPT

Разрешим весь исходящий трафик.

service iptables save

1 service iptables save

Сохраним созданные правила.

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

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

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

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

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

^%(__prefix_line)swarning: +\: SASL (?:LOGIN|PLAIN|(?:CRAM|DIGEST)-MD5) authentication failed(: *={0,2})?\s*$

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

before = common.conf

_daemon = postfix/smtpd
failregex = ^%(__prefix_line)swarning: +\: SASL (?:LOGIN|PLAIN|(?:CRAM|DIGEST)-MD5) authentication failed(: *={0,2})?\s*$
ignoreregex =

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

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

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

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

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

enabled	= true
filter	= postfix-sasl
port	= smtp,465,submission,imap,imaps,pop3,pop3s
action	= iptables
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.

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

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