Fail2ban для защиты SSH-соединений в Debian
Любой сервер, доступный извне, с удаленным управлением по SSH рано и поздно сталкивается с угрозой взлома удаленного управления. Зачастую злоумышленники не пытаются атаковать конкретный сервер - почти всегда эти атаки случайны и реализуются автоматическими скриптами, которые перебирают имена и пароли в надежде на случайное успешное подключения к SSH. Для защиты от подобных атак можно использовать fail2ban - легкую утилиту, которая отслеживает логи подключения к серверу и блокирует IP-адреса, с которых поступают частые и неудачные попытки подключения. В этой статье показано как установить и настроить эту утилиту.
Установка
Для начала необходимо обновить список пакетов и установить все доступные обновления:
$ sudo apt-get update
$ sudo apt-get upgrade
После обновления необходимо установить пакет с утилитой:
$ sudo apt-get install fail2ban
После установки необходимо включить и запустить сервис утилиты для работы и автозагрузки:
$ sudo systemctl enable fail2ban
$ sudo systemctl start fail2ban
Настройка
По умолчанию fail2ban использует правила блокировки, указанные в файле /etc/fail2ban/jail.conf. Это системный файл, который поставляется вместе с программой, поэтому использовать его в качестве основного файла с параметрами блокировки не рекомендуется. Необходимо создать собственный конфигурационный файл /etc/fail2ban/jail.local. Система приоритетов в Fail2ban построена таким образом, что в качестве основных применяются правила, указанные в этом файле.
Структура файла конфигурации
Файл конфигурации fail2ban состоит из блока [DEFAULT] и блоков правил для отдельных служб, которые называются jail. Структура блоков описана ниже:
- Общие настройки анализа, фильтрации и действий. В блоке [DEFAULT] указываются настройки, действующие на все описанные ниже службы.
- Настройка firewall. По умолчанию в Debian 13 используется nftables, однако, если на сервере установлен
ufw, можно использовать его в качестве средства фильтрации. В опции banaction необходимо указать ufw. - Настройка источника логов. Для Debian 12 и Debian 13 использование systemd дает преимущества в скорости и надежности перед традиционным чтением логов какого-либо сервиса. В опции backend необходимо указать systemd.
- Белый список IP-адресов. Рекомендуется указать IP-адреса, которые fail2ban будет игнорировать при поиске. Это исключит ситуацию, когда утилита заблокирует доступ к серверу от доверенного IP-адреса при жестких настройках фильтрации, например, при нескольких неудачных попытках ввода пароля. В опции ignoreip необходимо перечислить IP-адреса или диапазоны адресов, разделенные пробелом или запятой.
- Общие настройки анализа и фильтрации. Рекомендуется задать общие для всех сервисов настройки findtime, maxretry и bantime. При необходимости эти настройки можно переопределить индивидуально для каждого сервиса ниже.
- Индивидуальная настройка служб. В квадратных скобках указывается название службы, к которой будет применяться следующий ниже набор правил. В случае данной статьи - это [sshd].
- Включение правила. Опция enabled отвечает за включение или выключение текущего блока правил.Необходимо установить параметр в состояние true, чтобы текущий блок был активен.
- Правило фильтрации сервиса. Fail2ban использует отдельные фильтры для различных сервисов, которые содержат шаблоны (регулярные выражения) для анализа логов сервиса. В данном случае, опция filter с значением sshd указывает на использование шаблонов поиска неудачных попыток входа для сервиса SSH.
- Порт сервиса. В случае, когда сервис работает на нестандартном порту, необходимо в опции port указать номер порта. В случае SSH, когда служба работает на стандартном порту, можно указать значение ssh.
- Настройки анализа и фильтрации. Как было сказано выше, в каждом блоке правил можно переопределить значения findtime, maxretry и bantime для конкретного блока правил, если это необходимо.
Необходимо создать файл конфигурации:
$ sudo nano /etc/fail2ban/jail.local
Содержимое файла примерно следующее:
[DEFAULT]
banaction = ufw
backend = systemd
ignoreip = YOUR_IP
findtime = 1h
maxretry = 5
bantime = 1d
[sshd]
enabled = true
filter = sshd
port = 2222
findtime = 1h
maxretry = 5
bantime = 1d
Этот набор условий означает, что IP-адрес, с которого было произведено 5 неудачных попыток SSH-подключения на порт 2222 за последний час, будет заблокирован на одни сутки. В общих настройках прописано указание не блокировать IP-адрес YOUR_IP. Время для параметров findtime и bantime можно указывать не только в секундах, но и в минутах, часах, днях и даже неделях. Для этого необходимо сразу после численного значения параметра указать соответствующую букву (m, h, d, w).
Увеличение периода блокировки
В настройках fail2ban предусмотрена возможность увеличения периода блокировки для повторных попыток подбора учетных данных. Период блокировки можно прогрессивно увеличивать для особо настойчивых попыток взлома. Для этого можно указать значение следующих опций:
bantime.increment = true
bantime.factor = 2
bantime.maxtime = 30d
bantime.rndtime = 1h
Опция bantime.increment в значении true включает использование прогрессивной шкалы увеличения периода блокировки. Опция bantime.factor указывает множитель шкалы периода блокировки, например, в 2 раза при каждом срабатывании блокировки. Опция bantime.maxtime устанавливает максимальное значение периода блокировки, в данном случае, 30 дней. Опция bantime.rndtime добавляет случайное время к периоду блокировки, что должно затруднить автоматическим скриптам предсказание времени их блокировки на атакуемом сервере. Эти опции также можно указывать как в общем блоке [DEFAULT], так и тонко настраивать их для каждого блока jail отдельно.
Получение уведомлений
В блоке [DEFAULT] также можно добавить опцию destemail, включающую отправку на e-mail уведомлений о заблокированных IP-адресах. Строка настройки выглядит так:
destemail=admin@your.domain
С этой настройкой на указанный e-mail будут приходить уведомления о каждом заблокированном IP-адресе. Можно получать более детальную информацию о заблокированных адресах с помощью утилиты whois. В Debian 12 и Debian 13 этот пакет устанавливается в качестве зависимости для fail2ban, но если нет, установить пакет можно командой:
$ sudo apt-get install whois
Внимание! Fail2ban отправляет отдельные уведомления о каждом заблокированном адресе. В случае массированной атаки на сервер, количество IP-адресов может быть значительным, как и количество уведомлений об их блокировке.
Проверка конфигурации
Перед запуском и применением новых правил фильтрации можно проверить корректность настроек командой:
$ sudo fail2ban-client -t
Если в конфигурации не найдено ошибок, команда вернет примерно следующий текст:
OK: configuration test is successful
При наличии ошибок, команда вернет описание ошибки и номер строки файла конфигурации:
Failed during configuration: Have not found any log file for sshd jail
ERROR: test configuration failed
Начало работы
После создания файла конфигурации необходимо перечитать файл конфигурации для применения новых правил фильтрации без перезагрузки сервиса fail2ban:
$ sudo fail2ban-client reload
После чего можно проверить статус работы, в том числе, для определенного сервиса, например:
$ sudo fail2ban-client status sshd
В выводе команды приведены сведения о попытках подключения к серверу и о заблокированных IP-адресах. После каждого изменения в правилах фильтрации необходимо выполнять команду reload или перезапускать сервис fail2ban.
Внимание! Некоторые современные программы для брутфорса могут обманывать заданные по умолчанию значения fail2ban. Например, делать 4 попытки подключения в течение 1 часа, ждать оставшееся время и пробовать подключиться заново. Поэтому рекомендуется устанавливать собственные значения для всех условий.