Защита сервера с помощью Fail2Ban: Полное руководство
Узнайте, как повысить безопасность Вашего сервера с помощью Fail2Ban, мощного программного обеспечения для предотвращения вторжений. Узнайте, как установить и настроить его для защиты Вашего сервера от попыток несанкционированного доступа.

Как только вы запускаете свой сервер, он тут же попадает в океан ботнетов, пытающихся войти в систему с помощью обычных учетных данных. И если на вашем сервере есть что-то полезное, рано или поздно он может стать мишенью для скрипт-кидди или даже более продвинутых людей с мощными компьютерами и новейшими технологиями, включая искусственный интеллект.
Вы можете защитить свой сервер от ботнетов и несколько усложнить жизнь хакерам, используя Fail2ban.
Что такое Fail2ban (F2B)
Fail2Ban - это IPF - Intrusion Prevention Framework, который защищает серверы от внешних атак. Он был создан Сирилом Жакье (Швейцария) в 2004 году и с тех пор активно развивается растущим сообществом.
F2B работает путем мониторинга журнальных файлов, например, auth.log, журналов доступа apache или nginx, и принятия мер в отношении IP-адресов со слишком большим количеством нежелательных действий в течение заданного периода времени.
Возможные действия включают:
- обновление правил брандмауэра,
- отправка уведомлений по электронной почте,
- сообщение о нежелательных IP-адресах специальным службам,
- любые другие действия, которые могут быть выполнены с помощью скрипта Python.
Стандартная конфигурация уже включает фильтры для различных служб, например, sshd, postfix и многих других. Каждый фильтр предназначен для выявления сбоев для конкретной службы с помощью сложных регулярных выражений. Он определяет эти регулярные выражения в переменной failregex
. Комбинация фильтра и предопределенных действий известна как “тюрьма”.
Говоря о слабых сторонах F2B, вы должны знать, что он не очень хорошо работает против распределенных атак методом перебора. Причина в том, что мониторинг лог-файлов происходит примерно раз в секунду. Этого должно быть достаточно в большинстве случаев, однако можно получить больше отказов входа, чем указано в параметре “maxretry”.
Здесь я должен упомянуть необязательное, но рекомендуемое программное обеспечение - Gamin, монитор изменения файлов от Daniel Veillard. (Обновление от 2022: ссылка на библиотеку умерла, поэтому я даю ссылку на домашнюю страницу автора, и можно попробовать поискать модуль самостоятельно, если это необходимо). Если установлен Gamin и бэкенд в jail.conf
установлен в auto
или gamin
, то активный опрос лог-файлов больше не требуется. Действия будут выполняться, как только файлы журнала будут изменены.
F2B системные требования довольно низкие. При конфигурации только с sshd
и recidive
джейлами, F2B требует около 500 Мб памяти и загружает 1 ядро CPU в среднем менее чем на 0,2%.
Ссылки:
Если вы хотите помочь в развитии F2B и/или глубже разобраться в фильтрах, то добро пожаловать:
Видео на YouTube
Если предпочитаешь смотреть, то вот подробное видео с инструкциями:
Два способа установки
Во-первых, выполните стандартное обновление репозиториев и пакетов с помощью:
|
|
Затем у вас есть два способа установки программного обеспечения.
Простой со стабильным релизом
Если вы предпочитаете более быстрый способ, обновляемый системой пакет и стабильный релиз, то просто используйте эту команду:
|
|
Хайтек с последним релизом
Если вы предпочитаете последнее и самое лучшее, то установите с GitHub. Имейте в виду, что это потребует немного больше танцев. Во-первых, убедитесь, что в вашей системе установлен Python или Python 3. Я буду использовать Python 3, поэтому давайте проверим, установлен ли у вас Python 3:
|
|
Если в результате выполнения этой команды вы получили сообщение: “Команда ‘python3’ не найдена, но может быть установлена с помощью… “, то:
|
|
И, на всякий случай:
|
|
Затем загрузите релиз из официального репозитория F2B:
|
|
Надеюсь, вы не получили никаких ошибок, но если получили, пожалуйста, поищите решение в гугле, так как оно выходит за рамки данного поста.
Следующая команда позволит вам работать более комфортно и автоматически дополнять команды, связанные с F2B, такие как fail2ban-client
, fail2ban-server
, fail2ban-regex
, нажимая tab в консоли:
|
|
Если на вашем сервере происходит много событий, то хорошей идеей будет настроить ротацию логов. После того, как журнал достигнет определенного размера, он будет заархивирован, а F2B начнет писать в свежий файл. Чтобы настроить ротацию журналов F2B, выполните следующие действия:
|
|
Теперь вам нужно включить F2B в качестве сервиса:
|
|
В результате вы получите это сообщение:
Created symlink /etc/systemd/system/multi-user.target.wants/fail2ban.service → /etc/systemd/system/fail2ban.service.
Теперь давайте запустим F2B:
|
|
И проверьте статус сервиса:
|
|
Проверьте версию:
|
|
В ноябре 2021 года последняя и стабильная версия была v0.11.2. Проверьте наличие более новых версий здесь.
Включите службу fail2ban, чтобы она запускалась после перезагрузки:
|
|
Также перезапустите службу rsyslog
:
|
|
Готово.
Базовая конфигурация
Вы настраиваете Fail2Ban с помощью файлов в /etc/fail2ban
.
Наиболее важным файлом является jail.conf
, который я не рекомендую редактировать напрямую, так как он будет переписываться после каждого обновления F2B. Общепринятой практикой является создание всех ваших настроек в файле jail.local
. При запуске F2B сначала читает файлы *.conf
, а затем *.local
, если они существуют. Настройки в последней версии становятся приоритетными.
Во всех следующих командах вы можете заменить vim
на ваш любимый редактор, например, nano
. Теперь давайте создадим новый файл jail.local
:
|
|
В этом новом файле, чтобы установить параметры для всех ловушек, вы определяете их в секции DEFAULT
:
|
|
Эти настройки запретят любой IP-адрес на три часа {bantime = 3h}, если в течение 10 минут {findtime = 10m} интервала будет обнаружено 5 {maxretry = 5} неудачных попыток подключения с данного IP.
Параметры, заданные для каждого отдельного джейла, будут иметь приоритет над общими настройками, что позволит вам тонко настроить параметры для каждого джейла отдельно.
Если вы постоянно подключаетесь к вашему серверу со статических IP, то хорошей идеей будет внести их в белый список, чтобы они никогда не были забанены. Вы можете внести в белый список несколько IP-адресов, разделяя их пробелами. По умолчанию в белый список включен Localhost.
|
|
Теперь давайте скажем F2B включить sshd
jail:
|
|
Полная версия очень базового файла jail.local
теперь выглядит следующим образом:
|
|
Форматы сокращений времени
Записи времени в конфигурации F2B (например, findtime
или bantime
) могут быть представлены как целое число в секундах или как строка с использованием специального формата сокращений, например, 600 - это то же самое, что 10m (10 минут).
Допустимые маркеры сокращений:
|
|
Вопросительный знак (?) следует за дополнительным символом, поэтому для задания времени в днях можно использовать days или day, da, dd или d. Вы можете объединить несколько маркеров в формате, разделенных пробелом или без разделителя, например: 1y 6mo или 1d12h30m.
Обратите внимание, что токены m, а также mm означают минуты, для месяца используйте сокращение mo или mon.
Вы можете преобразовать формат сокращения времени в секунды, используя fail2ban-client
с опцией --str2sec
:
|
|
Также можно настроить сервер с помощью команд, передаваемых через fail2ban-client
. Доступные команды описаны в fail2ban-client(1) manpage.
Следует помнить, что fail2ban-client set
обновляет значения только для работающего сервера F2B, поэтому не забудьте обновить конфигурационный файл соответствующим образом, если они должны быть постоянными!
Также смотрите fail2ban(1) и jail.conf(5) man-страницы для дальнейших рекомендаций:
- https://manpages.ubuntu.com/manpages/bionic/man1/fail2ban.1.html
- https://manpages.ubuntu.com/manpages/bionic/en/man5/jail.conf.5.html
Расширенная конфигурация
Очень простой способ повысить безопасность - добавить recidive
jail. Стандартная тюрьма банит, а затем, через заданное время, разбанивает IP, так что ничто не мешает этому IP повторить свои попытки подключения снова. Давайте добавим специальную тюрьму для таких рецидивистов. Скопируйте и вставьте это в ваш файл jail.local
:
|
|
Разница в том, что джейл [recidive]
указывает на сам лог F2B в /var/log/fail2ban.log
. Если тот же IP появляется там в течение findtime
времени (здесь 3 дня), то он будет забанен на bantime
, указанное в этом джейле, 9 недель в данном случае.
Теперь давайте установим более сложную систему запретов, которая будет увеличивать время запрета с каждой попыткой на случайное количество времени, чтобы усложнить жизнь “умным” ботнетам. Добавьте эту информацию в ваш jail.local
:
|
|
Рассмотрим каждый параметр по очереди.
- bantime.increment позволяет использовать базу данных для поиска ранее забаненных IP для увеличения времени бана по умолчанию по специальной формуле, которая по умолчанию равна banTime 1, 2, 4, 8, 16, 32…*.
- bantime.rndtime - максимальное количество секунд, используемое для смешивания со случайным временем, чтобы предотвратить вычисление “умными” ботнетами точного времени, после которого IP может быть снова разбанен.
- bantime.maxtime - это максимальное количество секунд, которое может достигать время бана (дальше не растет).
- bantime.factor - коэффициент для формулы расчета экспоненциального роста или общий множитель. Значение по умолчанию равно 1, и с ним время бана увеличивается на 1, 2, 4, 8, 16…
- bantime.formula используется по умолчанию для вычисления следующего значения времени бана, значение по умолчанию показано ниже. Такое же увеличение времени бана будет достигнуто при множителях 1, 2, 4, 8, 16, 32…
Пример формулы по умолчанию:
|
|
Более агрессивный пример формулы, имеет те же значения, только с коэффициентом “2.0 / 2.885385”:
|
|
Итак, учитывая наши предыдущие настройки плюс эти более продвинутые, F2B теперь будет делать следующее:
- Запретить любой IP-адрес на 3 часа, если он совершил 5 неудачных попыток подключения в течение 10 минут.
- Сохранять этот IP в своей внутренней базе данных
- Разблокировать его через 3 часа
- Если этот IP сделает еще одну неудачную попытку соединения, F2B рассчитает новое
время запрета
по формуле - Запретить этот IP на это новое, увеличенное и случайное время.
- Время
bantime
будет увеличиваться случайным образом и экспоненциально с каждой новой попыткой, но не более 60 дней. - Если этот IP будет заблокирован 5 раз в течение 3 дней, то он будет забанен на 9 недель (помещен в
рецидивную
тюрьму).
Существует большой простор для настройки этих параметров в соответствии с вашей конкретной ситуацией, что может включать в себя просмотр и анализ журналов. Как говорится, безопасность - это процесс, а не одноразовая процедура.
Защита других сервисов
По умолчанию все ловушки отключены. Вам необходимо включить ловушки, соответствующие вашей установке, в файле jail.local
, добавив enabled = true
под именем ловушки. Например, если у вас установлен веб-сервер Apache, вы можете добавить это в файл jail.local
:
|
|
Для exim добавьте
|
|
и, как вариант
|
|
Для postfix добавьте
|
|
и так далее. Полный список всех предварительно сконфигурированных джейлов вы найдете в файле /etc/fail2ban/jail.conf
.
Для многих других сервисов существуют различные решения. Например, для WordPress есть специальный плагин. После установки этого плагина из панели администратора необходимо скопировать фильтр:
|
|
И включите эту ловушку в файле jail.local
:
|
|
В общем, если у вас нет фильтра для вашего приложения / сервиса, и вы не можете найти его в интернете, вы можете написать свой собственный, добавив список regexes в /etc/fail2ban/filter.d/non-standard.conf
. Затем вы можете включить вашу нестандартную ловушку, добавив ее в jail.local
:
|
|
Теперь, когда вы знаете общие принципы F2B, вы можете найти, настроить и отрегулировать любые параметры для любого сервиса.
Добавление пользовательских регулярных выражений
Как вы уже знаете, F2B просматривает журнал(ы), который вы указали ему просматривать, и ищет в нем записи с помощью регулярных выражений. Например, regexes в /etc/fail2ban/filter.d/postfix.conf
для журнала Postfix выглядят следующим образом:
|
|
Однако бывает, что стандартные фильтры могут пропустить некоторые записи в журналах, потому что они необычны. Поэтому вы можете время от времени проверять эту ситуацию и добавлять пользовательские регексы для повышения безопасности. Как это сделать?
В F2B есть специальная утилита для этого, называемая fail2ban-regex
, которая проверяет регулярные выражения. Общее использование выглядит следующим образом:
fail2ban-regex [OPTIONS] LOG FILTER [IGNOREREGEX]
.
- [OPTIONS] - проверьте полный список опций по команде
fail2ban-regex -h
. - LOG - это строка записи журнала или путь к файлу журнала.
- REGEX - строка (фактический регекс) или путь к файлу фильтра, т.е. список регексов.
- [IGNOREREGEX] - то же самое, строка или путь к файлу.
Сначала определите, какой журнал и какой сервис вы хотите проверить, например, auth.log
и shd.conf
. Другими словами, вы хотите увидеть, какой стандартный набор фильтров в sshd.conf
пропускает auth.log
. Затем введите эту команду в консоль:
|
|
Ключевым моментом здесь является использование опции --print-all-missed
. По умолчанию она выводит все в stdout
, то есть в консоль, но вы можете захотеть перенаправить вывод в текстовый файл (например, missed.txt
) для дальнейшего изучения и обработки. Давайте рассмотрим результат:

Это фактический результат вышеприведенной команды для auth.log
, обработанного стандартным sshd.conf
И пользовательским набором regexes в sshd.local
(слегка отредактирован для удаления конфиденциальной информации). Даже в этом случае фильтры пропустили, как вы можете видеть, некоторые записи в лог-файле. Давайте посмотрим на важные моменты, отмеченные красными стрелками:
- В
auth.log
есть 812 записей, которые соответствовалиfailregexes
. Число в квадратных скобках в начале каждого регекса показывает, сколько раз он сработал. - Есть 2959 записей, которые соответствовали
ignoreregex
, т.е. записи, которые я сказал системе игнорировать. - И, наконец, как вы можете видеть, 35 строк были пропущены. Это означает, что IP-адреса 146.52.214.41 и 37.135.222.203 пропустили дальнейшую обработку F2B.
Почему? Ну, пропущенные строки появляются из-за отсутствия regex или плохо написанного regex. Поэтому вам нужно сделать / test свой собственный regex, который будет ловить пропущенные строки, а затем добавить его в /etc/fail2ban/filter.d/sshd.local
. Для более подробной информации я рекомендую изучить соответствующий раздел документации разработчиков.
Это обрезанная версия моего файла /etc/fail2ban/filter.d/sshd.local
:
|
|
Если вы хотите скопировать его на свой сервер, замените USER_NAME
в тексте выше на ваше настоящее имя пользователя.
Я также добавил задание crontab, которое запускается каждый день в 08:00 с:
|
|
а затем просто cat missed.txt
, чтобы проверить, было ли пропущено что-нибудь выдающееся фильтрами F2B sshd.
Вы также можете проверить таким образом другие журналы и другие фильтры и добавить свои regexes.
Уведомления по почте
Вы можете включить уведомления по электронной почте, если хотите получать сообщения по электронной почте всякий раз, когда происходит запрет. Для этого вам необходимо сначала настроить MTA (Mail Transfer Agent) на вашем сервере, чтобы он мог отправлять электронные письма. Чтобы узнать, как использовать Postfix для этой задачи, следуйте этому руководству. Вы можете использовать любой другой MTA и соответствующим образом изменить приведенные ниже настройки.
После того, как вы установили MTA, вам нужно изменить настройки в разделе DEFAULT
файла jail.local
. Начните с установки директивы mta
. Если вы установили Postfix, как показано в приведенном выше руководстве, установите это значение:
|
|
Теперь вам нужно добавить электронную почту и некоторые другие поля:
- destemail: Адрес электронной почты, на который вы хотите получать письма.
- отправитель: Адрес электронной почты, с которого F2B будет отправлять электронные письма (см. руководство выше).
- имя отправителя: Текст в поле “Отправитель” в письмах-уведомлениях.
|
|
Действия
Теперь вам нужно настроить параметры действия. Напомню, что на языке F2B “действие” - это процедура, выполняемая, когда клиент совершает неудачные попытки слишком много раз.
- По умолчанию
%(action_)s
только банит хост. %(action_mw)s
забанит и отправит письмо с отчетом WHOIS по IP-адресу нарушителя.%(action_mwl)s
забанит, отправит письмо с отчетом WHOIS и всеми соответствующими строками в лог-файле.
Выберите уровень детализации, который вам больше подходит, и настройте его:
|
|
Это также может быть изменено в зависимости от конкретной тюрьмы (под именем тюрьмы), так что вы будете получать разные детали для разных тюрем.
В заключение этой главы, вот поучительная история Кена Тоссела, связанная с уведомлениями по электронной почте.
“…до июля 2011 года в файле конфигурации Fail2Ban по умолчанию был указан адрес From: [email protected] и адрес To: [email protected], которые оба находятся на хостинге провайдера бесплатной почты Mail.com. Полагаю, человек, который настраивал эти адреса, предполагал, что mail.com недействителен. [email protected] либо зарезервирован, либо заполнен до предела, поэтому, когда Fail2Ban обнаруживает атаку на неправильно настроенный сервер, его отчет возвращается обратно отправителю [email protected]. Я зарегистрировал этот адрес еще в 2010 году…”.
В июле 2014 года Кен разобрал все 500 000 отчетов и составил графики, которые вы можете увидеть на его сайте: https://ken.tossell.net/ftb/.
Сообщение о плохих IP-адресах
Если вы хотите поддержать сообщество, сообщая об оскорбительных IP-адресах, чтобы другие могли воспользоваться этой информацией, существует несколько сервисов, позволяющих это сделать. Давайте рассмотрим один из них более подробно, а другие будут упомянуты в конце этого раздела.
- Шаг 1 - Создайте учетную запись AbuseIPDB.
- Шаг 2 - Создайте API ключ AbuseIPDB.
Чтобы заставить F2B сообщать об IP-адресах, добавьте команды ниже в файл jail.local
. Добавьте эти действия в ваши джейлы по отдельности, чтобы вы могли настроить категории отчетов AbuseIPDB и сделать ваши отчеты более конкретными. Например, чтобы сообщать об IP-адресах для перебора sshd
, добавьте это в джейл [sshd]
:
|
|
Наиболее популярные категории отчетов AbuseIPDB:
Название | # |
---|---|
FTP Brute-Force | 5 |
Port Scan | 14 |
Hacking | 15 |
Brute-Force | 18 |
Bad Web Bot | 19 |
SSH | 22 |
Web App Attack | 21 |
Полный список всех категорий находится здесь: https://www.abuseipdb.com/categories.
По желанию, вы можете настроить сообщение, отредактировав /etc/fail2ban/action.d/abuseipdb.conf
:
|
|
Тогда ваши отчеты на сайте AbuseIPDB будут выглядеть следующим образом:
Вы можете заменить комментарий F2B blocked SSH BF
на свой собственный.
Более подробная информация и способы устранения неполадок находятся на официальном сайте: https://www.abuseipdb.com/fail2ban.html.
Другие онлайн-сервисы для сообщения об IP
BadIPs. Установите F2B, следуя их официальной документации.
Разбан заблокированных IP-адресов вручную
Это очень простая команда:
|
|
Если IP_ADDRESS не заблокирован данным конкретным джейлом, вы увидите 0
в качестве вывода, в противном случае 1
.
Пару раз мне удавалось заблокировать свой собственный IP :), работая из разных географических точек. В этом случае просто переподключитесь к вашему серверу через любой прокси и разблокируйте ваш текущий IP с помощью команды выше.
Сброс журналов F2B и базы данных
Все запрещенные IP-адреса сохраняются в этом файле:
/var/lib/fail2ban/fail2ban.sqlite3
.
Даже если вы очистите все журналы, F2B будет заново создавать все запрещенные IP из базы данных после каждого перезапуска устройства, пока не закончится время действия IP. Чтобы очистить весь журнал F2B и каждый запрещенный IP из базы данных, выполните следующие действия. Это хороший метод сброса F2B на нулевую точку, сбрасывая все запрещенные IP.
|
|
Не волнуйтесь - F2B воссоздает файл fail2ban.sqlite3 после перезапуска службы.
Вы также можете вручную удалить IP из базы данных без потери всех остальных запрещенных IP и если вы не хотите использовать белый список:
- Скачайте DB Browser для SQLite с сайта http://sqlitebrowser.org/.
- Установите DB Browser на свой локальный компьютер.
- Скачайте файл
fail2ban.sqlite3
из папки/var/lib/fail2ban/fail2ban.sqlite3
. - Запустите DB Browser и откройте файл fail2ban.sqlite3.
- Выполните поиск запрещенного IP-адреса в базе данных
- Выберите его и нажмите на “удалить строку”.
- Сохраните файл
fail2ban.sqlite3
и закройте программу - Подключитесь к вашему серверу с помощью ssh и введите команду
сервис fail2ban stop
. - Введите
truncate -s 0 /var/log/fail2ban.log
. - Загрузите отредактированный файл fail2ban.sqlite3 обратно в
/var/lib/fail2ban/fail2ban.sqlite3
. - Вернитесь к своему ssh-соединению и введите
service fail2ban restart
.
Еще один вариант - редактировать эту базу данных непосредственно на сервере с помощью утилиты командной строки sqlite3. https://manpages.ubuntu.com/manpages/bionic/en/man1/sqlite3.1.html
Как удалить Fail2ban
Чтобы удалить только пакет F2B, остановите службу и удалите пакет:
|
|
Чтобы удалить пакет F2B и любые другие зависимые пакеты:
|
|
Если вы также хотите удалить файлы конфигурации и/или данных F2B:
|
|
Удаление файлов конфигурации и/или данных F2B и его зависимостей:
|
|
Заключение
Настройка F2B для защиты вашего сервера довольно проста в самых простых случаях. Однако F2B предоставляет большую гибкость для построения политик, которые будут соответствовать вашим конкретным потребностям в безопасности. Вы можете найти множество элементов, которые можно подстраивать и изменять по мере развития ваших потребностей. Изучение основ защиты вашего сервера с помощью F2B может обеспечить вам большую безопасность при минимальных усилиях.
Я надеюсь, что эта информация, основанная на моих заметках, тщательно собранных и проверенных на практике в течение многих лет, поможет вам начать/настроить защиту вашего сервера.