Зачем нужен Fail2ban

Что бы изменять правила брандмауэра для временной блокировки айпи-адресов с которых происходят многократные неудачные попытки ввода пароля. А так же попытки сканировать на уязвимости, назойливых ботов. Из коробки Fail2Ban поставляется с фильтрами для различных сервисов (apache, courier, ssh и т.д.). Приложение работает на основе анализа логов сервисов установленных на сервере и использует правила заданные пользователем или по умолчанию, для блокировки подозрительной активности идущей с ip адресов. Это очень нужный и обязательный сервис для сервера.

Установка Fail2ban в Debian

Перед установкой обновляем пакеты и устанавливаем само приложение, оно доступно из репозитория Дебиан:

sudo apt update
sudo apt upgrade -y
sudo apt install fail2ban -y

Настройка Fail2ban в Debian

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

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

Откроем файл настроек и разберем некоторые настройки:

sudo nano /etc/fail2ban/jail.local

Некоторые настройки закомментированы. Найдем и включим их убрав символ решетки.

ignoreip - по умолчанию ignoreip = 127.0.0.1/8 ::1 здесь указываем список ip адресов, которые нужно исключить из алгоритмов Fail2ban. К ним не будут применяться ограничения. Диапазоны и IP адресов стоит разделить пробелом. Сюда можно добавить локальный ip, а также свою домашнюю подсеть, чтобы у вас не возникло проблем при входе. Например ignoreip = 127.0.0.1/8 192.168.0.0/24, но надо быть осторожным с этим разрешением и не включать его, мало ли злоумышленники будут иметь доступ в вашу локальную сеть. Главное не забаниться самому, поэтому для доступа по ssh обязательно настроить вход по ключу и для еще более большей надежности сделать двухфакторную аутентификацию.

bantime - по умолчанию bantime = 10m указывает время, на которое клиенту буде закрыт доступ к серверу, если он не сможет авторизоваться, принимает значение в секундах, можно указать h - час , m - минут

findtime - по умолчанию findtime = 10m время в секундах, на протяжении которого рассчитывается maxretry

maxretry - по умолчанию maxretry = 5 указывает количество попыток перед тем, как доступ будет заблокирован

С такими настройками по умолчанию блокировка произойдет,на 10 минут (bantime), если в течении 10 минут (findtime) 5 раз (maxretry) будут неудачные попытки ввода данных, например логин/пароль.

Для активации защиты определенного сервиса необходимо включить соответствующий jail это можно сделать несколькими способами непосредственно в файле /etc/fail2ban/jail.local или создать в папке /etc/fail2ban/jail.d/ свой файл с настройками jail, например my-jail.conf

Активация JAIL

Все названия jail заключены в квадратные скобки. По умолчанию только sshd причем включён в файле defaults-debian.conf . Команда на включения jail - enabled = true. Открыть и закомментировать включение jail ssh потому что включим его в jail.local.

sudo nano /etc/fail2ban/jail.d/defaults-debian.conf

Сохранить файл Ctrl+O Enter, закрыть Ctrl+X

Для примера включим jail для ssh и настроим. Находим в файле sudo nano /etc/fail2ban/jail.local запись [sshd] это название jail и после него дописываем следующие строки:

Включение jail

enabled = true

Следующие настройки можно не вводить, если вас устраивает, то что установлено по умолчанию. filter -применяется по умолчанию одноименный правилу (jail), можно написать собственный фильтр на основе логов, но это отдельная тема. Сделаем персональные настройки для ssh отличные от параметров по умолчанию.

Правило парсинга лога для выявления атаки. Все правила парсинга для различных jail находятся в каталоге /etc/fail2ban/filter.d вдаваться в подробности их создания это уже другая тема.

filter = sshd

Максимальное число ошибок 3 перед баном

maxretry = 3

Время 5 минут в течении которого должен ввестись правильный пароль исходя из числа попыток maxretry

findtime = 5m

Время бана айпи адреса - сутки

bantime = 24h

Временные интервалы можно указывать не только в секундах:

  • секунды - seconds, sec, ss, s
  • минуты - minutes, min, mm, m
  • часы - hours, hou, hh, h
  • дни - days, da, dd, d
  • недели - weeks, wee, ww, w
  • месяцы - months, mon
  • годы -years, yea, yy, y
  • без ограничения по времени -1 (минус один)

Должна получится такая запись. Можно просто скопировать и вставить примерно 280 строка.

[sshd]

# To use more aggressive sshd modes set filter parameter "mode" in jail.local:
# normal (default), ddos, extra or aggressive (combines all).
# See "tests/files/logs/sshd" or "filter.d/sshd.conf" for usage example and details.
#mode   = normal
enabled = true
filter = sshd
maxretry = 3
findtime = 5m
bantime = 24h
port    = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s

Если изменялся порт доступа к ssh, то обязательно нужно его указать

logpath - путь к файлу логов оставляем по умолчанию. Если что логи авторизации по ssh записываются в /var/log/auth.log. Если путь менялся его нужно указать, ибо по ним анализируются возможные атаки.

banaction = iptables-multiport - действие по бану дописывать не стал, он и так по умолчанию прописан. Все действия по бану находятся в каталоге /etc/fail2ban/action.d и это то же отдельная тема для ее раскрытия.

Активация JAIL в пользовательском файле

ВНИМАНИЕ - если сервис не установлен, а к нему активируется jail, ошибки при проверки конфигурации не будет. А Fail2ban работать не будет в статусе будет ошибка.

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

По умолчанию jail для апач разделены на несколько частей, находятся под общим закомментированым названием HTTP servers, сделаем файл в каталоге sudo nano /etc/fail2ban/jail.d/apache.conf и включим некоторые из jail для сервера апач.

# выявляем неудачные попытки ввода пароля
[apache-auth]
enabled = true
port     = http,https
logpath  = %(apache_error_log)s
maxretry = 3
bantime = 12h
# выявляем потенциальные сканирования для применения эксплойтов и php уязвимостей
[apache-noscript]
enabled = true
port     = http,https
logpath  = %(apache_error_log)s
maxretry = 3
bantime = 12h
# выявляем попытки переполнения Апача
[apache-overflows]
enabled = true
port     = http,https
logpath  = %(apache_error_log)s
maxretry = 2
bantime = 12h
# выявляем неудачные попытки в поиске домашней директории на сервере
[apache-nohome]
enabled = true
port     = http,https
logpath  = %(apache_error_log)s
maxretry = 2
bantime = 12h

Сохранить файл Ctrl+O Enter, закрыть Ctrl+X

Закомментировал правило [apache-auth] потому что оно меня блокирует, когда редактирую страницы в вордпресс. Причины выясняю. Можно не комментировать, а добавить строчку в этом jail ignoreip = мой_айпи. Но это не вариант, потому что у меня динамический айпи, каждый раз сюда бегать и править не вариант.

В плагине WP-Security- Файрвол убрал галку Полностью блокировать доступ к XMLRPC и все заработало, точнее меня файл2бан перестал банить.

Это не все jail , будет время напишу про остальные.

Запуск и включить автозагрузку Fail2ban

sudo systemctl start fail2ban
sudo systemctl enable fail2ban

Проверка конфигурации и перезапуск Fail2ban

После любых изменений в конфигурации необходимо ее проверить командой:

sudo fail2ban-client -d

Перезапустить Fail2ban , что бы изменения вступили в силу.

sudo systemctl restart fail2ban

Проверка работы Fail2ban

sudo systemctl status fail2ban

Просмотр логов Fail2ban

sudo journalctl -b -u fail2ban

Или открыть файл:

sudo nano /var/log/fail2ban.log

Просмотр активных jail и статистика

sudo fail2ban-client status

Вывод будет примерно таким

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

Статистику по активному jail можно узнать командой

sudo fail2ban-client status sshd

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

Разбанить / забанить вручную

Снять блокировку с айпи-адреса можно командой

sudo fail2ban-client set sshd unbanip IPADDRESS

Забанить ip

sudo fail2ban-client set sshd banip IPADDRESS

Прокомментировать можно

без регистрации здесь