====== 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