====== Fail2Ban: ударим банхаммером по брутефорсу! ======
----
===== Введение =====
Bruteforce ( перебор паролей) - это плохо и с ним надо бороться. Для решение этой задачи был разработан набор скриптов fail2ban. Из коробки он у меня отказался работать с pf, и не смог удовлетворить все мои потребности: в частности не хватало скриптов для блокировки подбора паролей в sendmail.
===== Установка =====
Для установки нам надо знать какая версия python, и выбрать подходящий пакет с fail2ban. В моем случает это py37-fail2ban. Устанавливаем его и включаем в rc.conf:
pkg install py37-fail2ban
service fail2ban enable
===== Настройка =====
==== PF ====
В дистрибутиве идет очень мудреный конфиг для pf. Да и на FreeBSD 12.1 он у меня не запустился (вылетал с ошибкой при запуске fail2ban). Поэтому я написал свой простенький набор действий.
Создаем файл /usr/local/etc/fail2ban/action.d/my-pf.local со следующим содержанием:
[Definition]
actionstart =
actionstop =
actioncheck =
actionban = /sbin/pfctl -t -T add /32
actionunban = /sbin/pfctl -t -T delete /32
[Init]
tablename = fail2ban
Где:
* **actionban** команда для блокировки ip адреса;
* **actionunban** команда для разблокировки;
* **tablename** имя таблицы в конфиге pf.
Осталось только настроиться сам pf. В файл /etc/pf.conf добавляем:
table persist
block return in quick from
==== Sendmail ====
Так же в состав fail2ban не входят скрипты для блокировки буртефорса паролей в sendmail-е. Но это можно легко исправить. =) По умолчанию в лог /var/log/auth.log не записывается ip злоумышленника, а только сам факт ошибки авторизации. Но нужный нам адрес можно получить другим способом. Для этого необходимо добавить следующую директиву в конфиг sendmail-а:
define(`confLOG_LEVEL', `10')dnl
И пересобрать его:
cd /etc/mail
make install
service sendmail restart
Теперь в файле /var/log/maillog будут записываться примерно такие строчки:
Jun 17 17:58:14 gw3 sm-mta[37333]: 05HEve20037333: AUTH failure (LOGIN): authentication failure (-13) SASL(-13): authentication failure: checkpass failed, relay=[46.38.145.247]
Вот их мы и будем отслеживать. Для чего напишем наш собственный фильтр. Создаем файл /usr/local/etc/fail2ban/filter.d/sendmail-sasl.conf со слудующим содержанием:
# Fail2Ban filter for sendmail authentication failures
#
[INCLUDES]
before = common.conf
[Definition]
_daemon = sendmail
failregex = ^%(__prefix_line)s\w{12,14}: AUTH failure \(LOGIN\): authentication failure \(-13\) SASL\(-13\): authentication failure: checkpass failed, relay=(\S+ )?\[\]( \(may be forged\))?$
ignoreregex =
==== Jail ====
Переходим к настройки самого fail2ban. Создаем файл /usr/local/etc/fail2ban/jail.local:
[DEFAULT]
banaction = my-pf
ignoreip = 127.0.0.1 10.1.1.0/24
bantime = 2h
findtime = 1h
maxretry = 3
[ssh]
enabled = true
filter = bsd-sshd
logpath = /var/log/auth.log
[dovecot]
enabled = true
filter = dovecot
[sendmail]
enabled = true
filter = bsd-sendmail
[sendmail-auth]
enabled = true
[sendmail-reject]
enabled = true
[sendmail-sasl]
enabled = true
bantime = 24h
filter = sendmail-sasl
logpath = /var/log/maillog
Где:
* **banaction** подключение нашего конфиги для работы с pf;
* **ignoreip** список адресов, которые не надо блокировать;
* **bantime** на какое время блокировать ip;
* **findtime** промежуток времени в который учитываются повторения.
Поумолчанию я блокирую ip на 2 часа, но для нашего правила sendmail-sasl я делал исключение - в таблицу они попадают на сутки.
===== Запуск и отладка =====
Запускаем:
service fail2ban start
Проверить работу можно изучая лог файл /var/log/fail2ban.log. А так же припомощи специальной команды:
fail2ban-client status
fail2ban-client status ssh