Принцип работы Fail2ban
Fail2ban получает информацию из таких файлов, как /var/log/apache2/error.log (для веб-сервера Apache), /var/log/auth.log (для SSH) и других, при этом блокируя IP-адреса, по которым регистрируется подозрительная активность. Это может быть большое количество неудачных попыток входа на сервер, использование различных имен пользователей или портов с одного IP-адреса при входе. При обнаружении таких действий Fail2ban обращается к брандмауэру, чтобы создать цепочки правил для блокировки подозрительных IP-адресов. Продолжительность блокировки зависит от значений, которые заранее указаны в конфигурационных файлах. Также в этих файлах можно использовать регулярные выражения.
«Из коробки» Fail2ban поддерживает работу с Apache, Lighttpd, Nginx, sshd, vsftpd, Postfix, Asterisk и другими программами.
Установка Fail2ban
Устанавливать Fail2ban для защиты SSH будем на сервер с ОС Ubuntu 22.04.03 LTS. Все действия нужно выполнять от имени root-пользователя. Также можно задействовать обычного пользователя с правами sudo.
Обновляем индексы репозиториев и устанавливаем пакет fail2ban:
apt update && apt -y install fail2ban
На этом установка закончена 🙂 Далее мы рассмотрим структуру конфигурационных файлов Fail2ban и настроим программу для протокола SSH.
Структура файлов Fail2ban
Все конфигурационные файлы Fail2ban хранятся в директории /etc/fail2ban. Структура файлов всегда одинаковая:
- action.d — директория, в которой содержатся файлы для настройки исполняемых действий (actions);
- fail2ban.conf — файл с настройками сервиса fail2ban;
- fail2ban.d — директория, в которой хранятся файлы с пользовательскими настройками fail2ban, по умолчанию пустая;
- filter.d — директория с шаблонами, которые предназначены для анализа лог-файлов;
- jail.conf — файл с настройками по умолчанию для защиты сервисов (Apache, Nginx, SSH и т. д.);
- jail.d — директория для файлов с пользовательскими настройками для защиты сервисов (Apache, Nginx, SSH и т. д.);
- paths-arch.conf, paths-debian.conf, paths-opensuse.conf, paths-common.conf — файлы для различных операционных систем (Arch Linux, Debian, openSUSE и других), содержащие настройки путей для операционной системы, например пути расположения лог-файлов.
Настройка Fail2ban для защиты SSH
Переходим к настройке Fail2ban для защиты SSH.
1. Для начала создадим резервную копию файла jail.conf. Я не советую править исходный файл, потому что он может быть перезаписан или изменен при обновлении программы. Сделаем новую копию файла jail.conf с именем jail.local:
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
2. Открываем файл на редактирование при помощи любого текстового редактора:
nano /etc/fail2ban/jail.local
Нам необходимо отредактировать следующие параметры:
[DEFAULT]
ignoreip = 127.0.0.1
[sshd]
enabled = true
findtime = 180
maxretry = 2
bantime = 50400
filter = sshd
logpath = /var/log/auth.log
Значение и смысл параметров:
- [DEFAULT] — секция по умолчанию. Параметры из нее применяются ко всем остальным секциям, если не будут переопределены заранее;
- ignoreip — список IP-адресов, подсетей или DNS-имен, для которых не будут действовать правила Fail2ban. Эти адреса не будут блокироваться даже при неудачных попытках подключения. Список адресов указывается через пробел;
- [sshd] — указывается секция с наименованием сервиса, для которого будут созданы параметры блокировки адресов. Для каждого сервиса необходимо создавать свою секцию. В этом примере мы настраиваем параметры для демона sshd;
- enabled — параметр, предназначенный для включения или отключения секции с сервисом. Для включения секции необходимо задать значение true, для отключения — false;
- findtime — время в секундах, в течение которого определенное действие (неудачная попытка подключения) должно повториться определенное количество раз (параметр maxretry), после чего адрес будет заблокирован;
- maxretry — количество неудачных попыток в течение периода findtime, после которых адреса нужно заблокировать;
- bantime — продолжительность блокировки хоста в секундах;
- filter — название фильтра, содержащее регулярные выражения для поиска подозрительных действий в лог-файлах сервиса. Фильтры для различных сервисов хранятся в директории /etc/fail2ban/filter.d/;
- logpath — полный путь до лог-файла, который Fail2ban будет использовать для поиска сетевых адресов. По умолчанию SSH записывает все попытки входа в файл /var/log/auth.log.
Теперь сохраняем изменения в файле и выходим из редактора.
3. Перезапускаем сервис fail2ban и добавляем его в автозагрузку:
systemctl restart fail2ban && systemctl enable fail2ban
4. Проверяем статус Fail2ban:
systemctl status fail2ban
Если в статусе отображено active (running), значит, Fail2ban запущен и работает.
Проверка работоспособности Fail2ban
После того как программа запустится, она сразу начнет выявлять подозрительные хосты и блокировать их.
Для начала проверим, какие зоны присутствуют в нашей системе. Для этого выполняем команду:
fail2ban-client status
Как можно увидеть на скриншоте, у нас есть одна зона для сервиса sshd.
Чтобы получить более подробную информацию о конкретной зоне, а также отобразить количество заблокированных IP-адресов, необходимо выполнить команду:
fail2ban-client status sshd
В разделе Filter отображено общее количество срабатываний фильтра: каждая неудачная попытка подключения увеличивает параметр Total failed на один. В примере фильтр сработал три раза и после этого был заблокирован (Currently banned) один IP-адрес 192.168.126.1 (Banned IP list).
Fail2ban ведет свой лог-файл — fail2ban.log, в котором также записывается информация о заблокированных IP-адресах. Посмотреть ход работы Fail2ban можно, воспользовавшись командой:
tail -f /var/log/fail2ban.log
IP-адрес будет заблокирован столько времени, сколько было указано в параметре bantime конфигурационного файла jail.local, но адрес можно разбанить раньше срока вручную. Для этого надо выполнить команду:
fail2ban-client set sshd unbanip 192.168.126.1
Sshd — это имя зоны, которая заблокировала адрес, а 192.168.126.1 — это IP-адрес, который необходимо разблокировать.
Чтобы узнать, какая зона заблокировала необходимый IP-адрес, надо выполнить команду:
iptables -L -n
В выводе команды необходимо найти цепочку. В имени цепочки указана ранее созданная зона, например sshd. В этом примере цепочка называется f2b-sshd, в ней есть адрес 192.168.126.1.
Заблокировать IP-адрес тоже можно в ручном режиме. Для этого надо задать зону и IP-адрес. Команда для блокировки IP-адреса 192.168.126.1 для зоны sshd будет выглядеть следующим образом:
fail2ban-client set sshd banip 192.168.126.1
В этой статье я показал принцип работы Fail2ban на примере протокола sshd на ОС Ubuntu. Похожим образом можно настроить программу для защиты прочих протоколов или других ОС от брутфорса.