Содержание

Защита сервера с помощью 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 и/или глубже разобраться в фильтрах, то добро пожаловать:

Два способа установки

Во-первых, выполните стандартное обновление репозиториев и пакетов с помощью:

1
sudo apt update && sudo apt upgrade -y

Затем у вас есть два способа установки программного обеспечения.

Простой со стабильным релизом

Если вы предпочитаете более быстрый способ, обновляемый системой пакет и стабильный релиз, то просто используйте эту команду:

1
sudo apt install fail2ban -y

Хайтек с последним релизом

Если вы предпочитаете последнее и самое лучшее, то установите с GitHub. Имейте в виду, что это потребует немного больше танцев. Во-первых, убедитесь, что в вашей системе установлен Python или Python 3. Я буду использовать Python 3, поэтому давайте проверим, установлен ли у вас Python 3:

1
python3 --version

Если в результате выполнения этой команды вы получили сообщение: “Команда ‘python3’ не найдена, но может быть установлена с помощью… “, то:

1
2
sudo apt install python3
sudo apt install python3-setuptools

И, на всякий случай:

1
sudo apt install git

Затем загрузите релиз из официального репозитория F2B:

1
2
3
4
cd ~
git clone https://github.com/fail2ban/fail2ban.git
cd fail2ban
sudo python3 setup.py install

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

Следующая команда позволит вам работать более комфортно и автоматически дополнять команды, связанные с F2B, такие как fail2ban-client, fail2ban-server, fail2ban-regex, нажимая tab в консоли:

1
sudo cp files/bash-completion /etc/bash_completion.d/fail2ban

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

1
sudo wget -O /etc/logrotate.d/fail2ban https://raw.githubusercontent.com/fail2ban/fail2ban/debian/debian/fail2ban.logrotate

Теперь вам нужно включить F2B в качестве сервиса:

1
2
3
sudo cp ~/fail2ban/build/fail2ban.service /lib/systemd/system/
cd /etc/systemd/system/
sudo ln /lib/systemd/system/fail2ban.service fail2ban.service

В результате вы получите это сообщение:

Created symlink /etc/systemd/system/multi-user.target.wants/fail2ban.service → /etc/systemd/system/fail2ban.service.

Теперь давайте запустим F2B:

1
sudo systemctl start fail2ban

И проверьте статус сервиса:

1
sudo systemctl status fail2ban

Проверьте версию:

1
sudo fail2ban-client version

В ноябре 2021 года последняя и стабильная версия была v0.11.2. Проверьте наличие более новых версий здесь.

Включите службу fail2ban, чтобы она запускалась после перезагрузки:

1
sudo systemctl enable fail2ban.service

Также перезапустите службу rsyslog:

1
sudo service rsyslog restart

Готово.

Базовая конфигурация

Вы настраиваете Fail2Ban с помощью файлов в /etc/fail2ban.

Наиболее важным файлом является jail.conf, который я не рекомендую редактировать напрямую, так как он будет переписываться после каждого обновления F2B. Общепринятой практикой является создание всех ваших настроек в файле jail.local. При запуске F2B сначала читает файлы *.conf, а затем *.local, если они существуют. Настройки в последней версии становятся приоритетными.

Во всех следующих командах вы можете заменить vim на ваш любимый редактор, например, nano. Теперь давайте создадим новый файл jail.local:

1
sudo vim /etc/fail2ban/jail.local

В этом новом файле, чтобы установить параметры для всех ловушек, вы определяете их в секции DEFAULT:

1
2
3
4
5
[DEFAULT]

bantime  = 3h
findtime = 10m
maxretry = 5

Эти настройки запретят любой IP-адрес на три часа {bantime = 3h}, если в течение 10 минут {findtime = 10m} интервала будет обнаружено 5 {maxretry = 5} неудачных попыток подключения с данного IP.

Параметры, заданные для каждого отдельного джейла, будут иметь приоритет над общими настройками, что позволит вам тонко настроить параметры для каждого джейла отдельно.

Если вы постоянно подключаетесь к вашему серверу со статических IP, то хорошей идеей будет внести их в белый список, чтобы они никогда не были забанены. Вы можете внести в белый список несколько IP-адресов, разделяя их пробелами. По умолчанию в белый список включен Localhost.

1
ignoreip = 127.0.0.1 x.x.x.x y.y.y.y

Теперь давайте скажем F2B включить sshd jail:

1
2
[sshd]
enabled = true

Полная версия очень базового файла jail.local теперь выглядит следующим образом:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# Fail2Ban LOCAL configuration file.

[DEFAULT]

bantime  = 3h
findtime = 10m
maxretry = 5

ignoreip = 127.0.0.1

# JAILS

[sshd]
enabled = true

Форматы сокращений времени

Записи времени в конфигурации F2B (например, findtime или bantime) могут быть представлены как целое число в секундах или как строка с использованием специального формата сокращений, например, 600 - это то же самое, что 10m (10 минут).

Допустимые маркеры сокращений:

1
2
3
4
5
6
7
years?, yea?, yy?
months?, mon?
weeks?, wee?, ww?
days?, da, dd?
hours?, hou?, hh?
minutes?, min?, mm?
seconds?, sec?, ss?

Вопросительный знак (?) следует за дополнительным символом, поэтому для задания времени в днях можно использовать days или day, da, dd или d. Вы можете объединить несколько маркеров в формате, разделенных пробелом или без разделителя, например: 1y 6mo или 1d12h30m.

Обратите внимание, что токены m, а также mm означают минуты, для месяца используйте сокращение mo или mon.

Вы можете преобразовать формат сокращения времени в секунды, используя fail2ban-client с опцией --str2sec:

1
2
> fail2ban-client --str2sec 1d12h
129600

Также можно настроить сервер с помощью команд, передаваемых через fail2ban-client. Доступные команды описаны в fail2ban-client(1) manpage.

Следует помнить, что fail2ban-client set обновляет значения только для работающего сервера F2B, поэтому не забудьте обновить конфигурационный файл соответствующим образом, если они должны быть постоянными!

Также смотрите fail2ban(1) и jail.conf(5) man-страницы для дальнейших рекомендаций:

Расширенная конфигурация

Очень простой способ повысить безопасность - добавить recidive jail. Стандартная тюрьма банит, а затем, через заданное время, разбанивает IP, так что ничто не мешает этому IP повторить свои попытки подключения снова. Давайте добавим специальную тюрьму для таких рецидивистов. Скопируйте и вставьте это в ваш файл jail.local:

1
2
3
4
[recidive]
enabled   = true
bantime   = 9w
findtime  = 3d

Разница в том, что джейл [recidive] указывает на сам лог F2B в /var/log/fail2ban.log. Если тот же IP появляется там в течение findtime времени (здесь 3 дня), то он будет забанен на bantime, указанное в этом джейле, 9 недель в данном случае.

Теперь давайте установим более сложную систему запретов, которая будет увеличивать время запрета с каждой попыткой на случайное количество времени, чтобы усложнить жизнь “умным” ботнетам. Добавьте эту информацию в ваш jail.local:

1
2
3
4
5
6
7
8
[DEFAULT]

bantime.increment    = true
bantime.rndtime      = 30m
bantime.maxtime      = 60d
bantime.factor       = 2
bantime.formula      = ban.Time * math.exp(float ban.Count+1)*banFactor)/math.exp(1*banFactor)
bantime.overalljails = true

Рассмотрим каждый параметр по очереди.

  • 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…

Пример формулы по умолчанию:

1
bantime.formula = ban.Time * (1<<(ban.Count if ban.Count<20 else 20)) * banFactor

Более агрессивный пример формулы, имеет те же значения, только с коэффициентом “2.0 / 2.885385”:

1
bantime.formula = ban.Time * math.exp(float(ban.Count+1)*banFactor)/math.exp(1*banFactor)

Итак, учитывая наши предыдущие настройки плюс эти более продвинутые, F2B теперь будет делать следующее:

  • Запретить любой IP-адрес на 3 часа, если он совершил 5 неудачных попыток подключения в течение 10 минут.
  • Сохранять этот IP в своей внутренней базе данных
  • Разблокировать его через 3 часа
  • Если этот IP сделает еще одну неудачную попытку соединения, F2B рассчитает новое время запрета по формуле
  • Запретить этот IP на это новое, увеличенное и случайное время.
  • Время bantime будет увеличиваться случайным образом и экспоненциально с каждой новой попыткой, но не более 60 дней.
  • Если этот IP будет заблокирован 5 раз в течение 3 дней, то он будет забанен на 9 недель (помещен в рецидивную тюрьму).

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

Защита других сервисов

По умолчанию все ловушки отключены. Вам необходимо включить ловушки, соответствующие вашей установке, в файле jail.local, добавив enabled = true под именем ловушки. Например, если у вас установлен веб-сервер Apache, вы можете добавить это в файл jail.local:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
[apache-auth]
# Запрет хостов с отказами аутентификации через пароль
enabled  = true
port     = http,https
logpath  = %(apache_error_log)s

[apache-badbots]
# Запрет роботов-спамеров
port     = http,https
logpath  = %(apache_access_log)s
bantime  = 172800
maxretry = 1

[apache-noscript]
# Запрет хостов, ищущих на сайте скрипты для выполнения и взлома
enabled  = true
port     = http,https
logpath  = %(apache_error_log)s
maxretry = 6

[apache-overflows]
# Запрет хостов, пытающиеся запрашивать необычно длинные и подозрительные URL-адреса
enabled  = true
port     = http,https
logpath  = %(apache_error_log)s
maxretry = 2

[apache-nohome]
# Если вы не предоставляете доступ к веб-контенту в домашних каталогах пользователей
enabled  = true
port     = http,https
logpath  = %(apache_error_log)s
maxretry = 2

Для exim добавьте

1
2
[exim]
enabled = true

и, как вариант

1
2
[exim-spam]
enabled = true

Для postfix добавьте

1
2
[postfix]
enabled = true

и так далее. Полный список всех предварительно сконфигурированных джейлов вы найдете в файле /etc/fail2ban/jail.conf.

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

1
sudo cp /var/www/html/wp-content/plugins/wp-fail2ban/filters.d/wordpress-hard.conf /etc/fail2ban/filter.d/

И включите эту ловушку в файле jail.local:

1
2
3
4
5
6
7
[wordpress-hard]
enabled  = true
port     = http,https
filter   = wordpress-hard
logpath  = /var/log/auth.log
bantime  = 1h
maxretry = 1

В общем, если у вас нет фильтра для вашего приложения / сервиса, и вы не можете найти его в интернете, вы можете написать свой собственный, добавив список regexes в /etc/fail2ban/filter.d/non-standard.conf. Затем вы можете включить вашу нестандартную ловушку, добавив ее в jail.local:

1
2
3
4
[non-standard]
enabled = true
port    = port your app/service uses
logpath = where its log file is located

Теперь, когда вы знаете общие принципы F2B, вы можете найти, настроить и отрегулировать любые параметры для любого сервиса.

Добавление пользовательских регулярных выражений

Как вы уже знаете, F2B просматривает журнал(ы), который вы указали ему просматривать, и ищет в нем записи с помощью регулярных выражений. Например, regexes в /etc/fail2ban/filter.d/postfix.conf для журнала Postfix выглядят следующим образом:

1
2
3
4
failregex = ^%(__prefix_line)sNOQUEUE: reject: RCPT from \S+\[<HOST>\]: 554 5\.7\.1 .*$
            ^%(__prefix_line)sNOQUEUE: reject: RCPT from \S+\[<HOST>\]: 450 4\.7\.1 : Helo command rejected: Host not found; from=<> to=<> proto=ESMTP helo= *$
            ^%(__prefix_line)sNOQUEUE: reject: VRFY from \S+\[<HOST>\]: 550 5\.1\.1 .*$
            ^%(__prefix_line)simproper command pipelining after \S+ from [^[]*\[<HOST>\]:?$

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

В F2B есть специальная утилита для этого, называемая fail2ban-regex, которая проверяет регулярные выражения. Общее использование выглядит следующим образом:

fail2ban-regex [OPTIONS] LOG FILTER [IGNOREREGEX].

  • [OPTIONS] - проверьте полный список опций по команде fail2ban-regex -h.
  • LOG - это строка записи журнала или путь к файлу журнала.
  • REGEX - строка (фактический регекс) или путь к файлу фильтра, т.е. список регексов.
  • [IGNOREREGEX] - то же самое, строка или путь к файлу.

Сначала определите, какой журнал и какой сервис вы хотите проверить, например, auth.log и shd.conf. Другими словами, вы хотите увидеть, какой стандартный набор фильтров в sshd.conf пропускает auth.log. Затем введите эту команду в консоль:

1
fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf --print-all-missed > /home/user_name/missed.txt

Ключевым моментом здесь является использование опции --print-all-missed. По умолчанию она выводит все в stdout, то есть в консоль, но вы можете захотеть перенаправить вывод в текстовый файл (например, missed.txt) для дальнейшего изучения и обработки. Давайте рассмотрим результат:

Скриншот с пропущенными регулярными выражениями
Скриншот с пропущенными регулярными выражениями

Это фактический результат вышеприведенной команды для auth.log, обработанного стандартным sshd.conf И пользовательским набором regexes в sshd.local (слегка отредактирован для удаления конфиденциальной информации). Даже в этом случае фильтры пропустили, как вы можете видеть, некоторые записи в лог-файле. Давайте посмотрим на важные моменты, отмеченные красными стрелками:

  1. В auth.log есть 812 записей, которые соответствовали failregexes. Число в квадратных скобках в начале каждого регекса показывает, сколько раз он сработал.
  2. Есть 2959 записей, которые соответствовали ignoreregex, т.е. записи, которые я сказал системе игнорировать.
  3. И, наконец, как вы можете видеть, 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:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# Fail2Ban filter for openssh - local additions

[Definition]

cmnfailre = ^Bad protocol version identification .* from <HOST>%(__on_port_opt)s$
            ^Connection closed by ((authenticating|invalid)? user \S+ )?<HOST>%(__on_port_opt)s%(__suff)s$
            ^Connection reset by <HOST>%(__on_port_opt)s%(__suff)s$
            ^Did not receive identification string from <HOST>%(__on_port_opt)s$
            ^Disconnected from ((?:authenticating|invalid) user \S+ )?<HOST>%(__on_port_opt)s%(__suff)s$
            ^Invalid user \S* from <HOST>%(__on_port_opt)s$
            ^message repeated \d+ times: \[ Failed password for root from <HOST>%(__on_port_opt)s ssh2\]$
            ^pam_unix\(sshd:auth\):\s+authentication failure;\s*logname=\S*\s*uid=\d*\s*euid=\d*\s*tty=\S*\s*ruser=<F-USER>\S*</F-USER>\
            ^PAM \d more authentication failure(s)?; logname= uid=0 euid=0 tty=ssh ruser= rhost=<HOST>(  user=root)?$
            ^Received disconnect from <HOST>%(__on_port_opt)s:.*\s%(__suff)s$
            ^Unable to negotiate with <HOST>%(__on_port_opt)s:\s.*\s%(__suff)s$
            ^User \S+ from <HOST> not allowed because not listed in AllowUsers$
            ^Disconnecting invalid user \S* <HOST>%(__on_port_opt)s:
            ^(error: )?maximum authentication attempts exceeded for .* from <HOST>(?: port \d*)?(?: ssh\d*)? \[preauth\]$

ignoreregex = pam_unix\((cron|sshd|sudo|systemd-user):session\): session (open|clos)ed for user (root|USER_NAME)( by \(uid=0\))?$
              pam_unix\(sudo:session\): session opened for user root by USER_NAME\(uid=0\)$
              pam_unix\(sshd:auth\): check pass\; user unknown$
              New session \d+ of user USER_NAME\.$
              Removed session \d+\.$
              User child is on pid \d+$
              Timeout, client not responding\.$
              \s+USER_NAME \: TTY=pts\/\d \; PWD=\/home\/USER_NAME(\/.*)? \; USER=root \; COMMAND=.*$
              Disconnected from user USER_NAME <HOST>%(__on_port_opt)s$

Если вы хотите скопировать его на свой сервер, замените USER_NAME в тексте выше на ваше настоящее имя пользователя.

Я также добавил задание crontab, которое запускается каждый день в 08:00 с:

1
/usr/local/bin/fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf --print-all-missed > /home/USER_NAME/missed.txt

а затем просто cat missed.txt, чтобы проверить, было ли пропущено что-нибудь выдающееся фильтрами F2B sshd.

Вы также можете проверить таким образом другие журналы и другие фильтры и добавить свои regexes.

Уведомления по почте

Вы можете включить уведомления по электронной почте, если хотите получать сообщения по электронной почте всякий раз, когда происходит запрет. Для этого вам необходимо сначала настроить MTA (Mail Transfer Agent) на вашем сервере, чтобы он мог отправлять электронные письма. Чтобы узнать, как использовать Postfix для этой задачи, следуйте этому руководству. Вы можете использовать любой другой MTA и соответствующим образом изменить приведенные ниже настройки.

После того, как вы установили MTA, вам нужно изменить настройки в разделе DEFAULT файла jail.local. Начните с установки директивы mta. Если вы установили Postfix, как показано в приведенном выше руководстве, установите это значение:

1
2
[DEFAULT]
mta = postfix

Теперь вам нужно добавить электронную почту и некоторые другие поля:

  • destemail: Адрес электронной почты, на который вы хотите получать письма.
  • отправитель: Адрес электронной почты, с которого F2B будет отправлять электронные письма (см. руководство выше).
  • имя отправителя: Текст в поле “Отправитель” в письмах-уведомлениях.
1
2
3
4
5
[DEFAULT]
mta        = postfix
destemail  = [email protected]
sender     = [email protected]
sendername = Fail2BanAlert

Действия

Теперь вам нужно настроить параметры действия. Напомню, что на языке F2B “действие” - это процедура, выполняемая, когда клиент совершает неудачные попытки слишком много раз.

  • По умолчанию %(action_)s только банит хост.
  • %(action_mw)s забанит и отправит письмо с отчетом WHOIS по IP-адресу нарушителя.
  • %(action_mwl)s забанит, отправит письмо с отчетом WHOIS и всеми соответствующими строками в лог-файле.

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

1
2
[DEFAULT]
action = %(action_mwl)s

Это также может быть изменено в зависимости от конкретной тюрьмы (под именем тюрьмы), так что вы будете получать разные детали для разных тюрем.

В заключение этой главы, вот поучительная история Кена Тоссела, связанная с уведомлениями по электронной почте.

“…до июля 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-адресах, чтобы другие могли воспользоваться этой информацией, существует несколько сервисов, позволяющих это сделать. Давайте рассмотрим один из них более подробно, а другие будут упомянуты в конце этого раздела.

AbuseIPDB

Чтобы заставить F2B сообщать об IP-адресах, добавьте команды ниже в файл jail.local. Добавьте эти действия в ваши джейлы по отдельности, чтобы вы могли настроить категории отчетов AbuseIPDB и сделать ваши отчеты более конкретными. Например, чтобы сообщать об IP-адресах для перебора sshd, добавьте это в джейл [sshd]:

1
2
3
4
[sshd]
action_abuseipdb = abuseipdb
action = %(action_)s
         %(action_abuseipdb)s[abuseipdb_apikey="YOUR.API.KEY", abuseipdb_category="18,22"

Наиболее популярные категории отчетов AbuseIPDB:

Название#
FTP Brute-Force5
Port Scan14
Hacking15
Brute-Force18
Bad Web Bot19
SSH22
Web App Attack21

Полный список всех категорий находится здесь: https://www.abuseipdb.com/categories.

По желанию, вы можете настроить сообщение, отредактировав /etc/fail2ban/action.d/abuseipdb.conf:

1
2
3
4
5
6
actionban = curl --tlsv1.0 --fail 'https://api.abuseipdb.com/api/v2/report' \
    -H 'Accept: application/json' \
    -H 'Key: <abuseipdb_apikey>' \
    --data-urlencode 'ip=<ip>' \
    --data-urlencode 'comment=F2B blocked SSH BF' \
    --data 'categories=<abuseipdb_category>'

Тогда ваши отчеты на сайте AbuseIPDB будут выглядеть следующим образом: /images/f2b-screen-abuseipdb.jpg

Вы можете заменить комментарий F2B blocked SSH BF на свой собственный.

Более подробная информация и способы устранения неполадок находятся на официальном сайте: https://www.abuseipdb.com/fail2ban.html.

Другие онлайн-сервисы для сообщения об IP

Разбан заблокированных IP-адресов вручную

Это очень простая команда:

1
sudo fail2ban-client set JAIL_NAME unbanip IP_ADDRESS

Если IP_ADDRESS не заблокирован данным конкретным джейлом, вы увидите 0 в качестве вывода, в противном случае 1.

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

Сброс журналов F2B и базы данных

Все запрещенные IP-адреса сохраняются в этом файле: /var/lib/fail2ban/fail2ban.sqlite3.

Даже если вы очистите все журналы, F2B будет заново создавать все запрещенные IP из базы данных после каждого перезапуска устройства, пока не закончится время действия IP. Чтобы очистить весь журнал F2B и каждый запрещенный IP из базы данных, выполните следующие действия. Это хороший метод сброса F2B на нулевую точку, сбрасывая все запрещенные IP.

1
2
3
4
sudo fail2ban-client stop
sudo truncate -s 0 /var/log/fail2ban.log
sudo rm /var/lib/fail2ban/fail2ban.sqlite3
sudo fail2ban-client restart

Не волнуйтесь - F2B воссоздает файл fail2ban.sqlite3 после перезапуска службы.

Вы также можете вручную удалить IP из базы данных без потери всех остальных запрещенных IP и если вы не хотите использовать белый список:

  1. Скачайте DB Browser для SQLite с сайта http://sqlitebrowser.org/.
  2. Установите DB Browser на свой локальный компьютер.
  3. Скачайте файл fail2ban.sqlite3 из папки /var/lib/fail2ban/fail2ban.sqlite3.
  4. Запустите DB Browser и откройте файл fail2ban.sqlite3.
  5. Выполните поиск запрещенного IP-адреса в базе данных
  6. Выберите его и нажмите на “удалить строку”.
  7. Сохраните файл fail2ban.sqlite3 и закройте программу
  8. Подключитесь к вашему серверу с помощью ssh и введите команду сервис fail2ban stop.
  9. Введите truncate -s 0 /var/log/fail2ban.log.
  10. Загрузите отредактированный файл fail2ban.sqlite3 обратно в /var/lib/fail2ban/fail2ban.sqlite3.
  11. Вернитесь к своему ssh-соединению и введите service fail2ban restart.

Еще один вариант - редактировать эту базу данных непосредственно на сервере с помощью утилиты командной строки sqlite3. https://manpages.ubuntu.com/manpages/bionic/en/man1/sqlite3.1.html

Как удалить Fail2ban

Чтобы удалить только пакет F2B, остановите службу и удалите пакет:

1
2
sudo fail2ban-client stop
sudo apt remove fail2ban

Чтобы удалить пакет F2B и любые другие зависимые пакеты:

1
sudo apt remove --auto-remove fail2ban

Если вы также хотите удалить файлы конфигурации и/или данных F2B:

1
sudo apt purge fail2ban

Удаление файлов конфигурации и/или данных F2B и его зависимостей:

1
sudo apt purge --auto-remove fail2ban

Заключение

Настройка F2B для защиты вашего сервера довольно проста в самых простых случаях. Однако F2B предоставляет большую гибкость для построения политик, которые будут соответствовать вашим конкретным потребностям в безопасности. Вы можете найти множество элементов, которые можно подстраивать и изменять по мере развития ваших потребностей. Изучение основ защиты вашего сервера с помощью F2B может обеспечить вам большую безопасность при минимальных усилиях.

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