Fail2ban для защиты SSH-соединений в Debian

- Опубликовано в Linux - Permalink

Любой сервер, доступный извне, с удаленным управлением по 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] указываются настройки, действующие на все описанные ниже службы.
  1. Настройка firewall. По умолчанию в Debian 13 используется nftables, однако, если на сервере установлен ufw, можно использовать его в качестве средства фильтрации. В опции banaction необходимо указать ufw.
  2. Настройка источника логов. Для Debian 12 и Debian 13 использование systemd дает преимущества в скорости и надежности перед традиционным чтением логов какого-либо сервиса. В опции backend необходимо указать systemd.
  3. Белый список IP-адресов. Рекомендуется указать IP-адреса, которые fail2ban будет игнорировать при поиске. Это исключит ситуацию, когда утилита заблокирует доступ к серверу от доверенного IP-адреса при жестких настройках фильтрации, например, при нескольких неудачных попытках ввода пароля. В опции ignoreip необходимо перечислить IP-адреса или диапазоны адресов, разделенные пробелом или запятой.
  4. Общие настройки анализа и фильтрации. Рекомендуется задать общие для всех сервисов настройки findtime, maxretry и bantime. При необходимости эти настройки можно переопределить индивидуально для каждого сервиса ниже.
  • Индивидуальная настройка служб. В квадратных скобках указывается название службы, к которой будет применяться следующий ниже набор правил. В случае данной статьи - это [sshd].
  1. Включение правила. Опция enabled отвечает за включение или выключение текущего блока правил.Необходимо установить параметр в состояние true, чтобы текущий блок был активен.
  2. Правило фильтрации сервиса. Fail2ban использует отдельные фильтры для различных сервисов, которые содержат шаблоны (регулярные выражения) для анализа логов сервиса. В данном случае, опция filter с значением sshd указывает на использование шаблонов поиска неудачных попыток входа для сервиса SSH.
  3. Порт сервиса. В случае, когда сервис работает на нестандартном порту, необходимо в опции port указать номер порта. В случае SSH, когда служба работает на стандартном порту, можно указать значение ssh.
  4. Настройки анализа и фильтрации. Как было сказано выше, в каждом блоке правил можно переопределить значения 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 часа, ждать оставшееся время и пробовать подключиться заново. Поэтому рекомендуется устанавливать собственные значения для всех условий.

Метки: