G|Translate: English EN Français FR Deutsch DE Italiano IT Русский RU Español ES

Установка fail2ban на Linux

Устанавливаем и запускаем fail2ban на Linux

Установка fail2ban на Linux

Сначала разберемся с названиями. Всё это – “детальки” сервера на Linux

Название Описание
netfilter Межсетевой экран (брандмауэр), встроен в ядро Linux с версии 2.4.

iptables (IP4)

ip6tables (IP6)

Название пользовательской утилиты (запускаемой из командной строки), предназначенной для управления системой netfilter.
ipset Позволяет использовать большие таблицы IP и MAC адресов, подсетей, номеров портов совместно с iptables (подключение производится через одно правило, в таблице используется хэширование)
fail2ban Сканирует файлы журналов (например, / var / log / apache / error_log) и добавляет запись с IP-адресом хакера в таблицу правил безопасности iptables и блокирует его либо временно, либо навсегда.

Теперь подробнее.

iptables – это вовсе не таблицы IP, как может показаться из названия :)

Это название утилиты (их две – одна для IP4, другая для IP6 соединений), которая управляет пятью таблицами файлволла netfilter Linux , в которых хранятся:

  • правила
  • цепочки
  • действия

Вся эта красота находится в таблицах

  • filter – таблица, выполняющая функции фильтрации пакетов по определённым параметрам. Содержит следующие встроенные цепочки: FORWARDINPUTOUTPUT;
  • raw – с помощью raw таблицы настраиваются исключения, которые будут рассматривать пакет как отдельную, ни к чему не привязанную сущность. Содержит следующие встроенные цепочки: INPUTOUTPUT;
  • nat – таблица, предназначенная целиком по функции трансляции сетевых адресов. Содержит следующие встроенные цепочки: PREROUTINGOUTPUTPOSTROUTING;
  • mangle – таблица, предназначенная для изменения различных заголовков пакета. Можно, например, изменить TTL, количество hop’ов и другое. Содержит следующие встроенные цепочки: PREROUTINGINPUTFORWARDOUTPUTPOSTROUTING>;
  • security – используется для назначения пакетам или соединениям неких меток, которые в дальнейшем может интерпретировать SElinux.

В картинках обычно показывают 4 таблицы из 5-ти

Установка fail2ban на Linux

Вот тут подробнее про ipset

Повышение производительности netfilter, использование ipset

Установка fail2ban

Самое главное, что умеет делать  fail2ban = сканировать логи (файлы журналов – мы ему укажем нужные) и добавляет IP-адреса в таблицу filter правил безопасности netfilterи делает с этими адресами нужные нам действия.

ВАЖНО

Если у Вас VPS OpenVZ, а не VDS KVM – порядок установки лучше уточнить у саппорта! VPS – это контейнер с общим ядром Linux, а не выделенный сервер

При подключении через SSH в заголовке есть предупреждение

Please do not edit configuration files manually.
You may do that in your control panel.

Для систем на базе пакетов Debian или Red Hat команды будут немного отличаться.

CentOS / Red Hat:

yum install fail2ban

Ubuntu / Debian:

apt-get install fail2ban

CentOS 6:

Добавляем репозиторий:

rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

Устанавливаем пакет:

yum install fail2ban

Возможно потребуется указать команду в формате sudo – например для Ubuntu / Debian

sudo apt-get install fail2ban

sudo (англ. substitute user and do, дословно «подменить пользователя и выполнить») – предоставляет возможность пользователям выполнять команды от имени суперпользователя root либо других пользователей.

Для запуска службы на сервере вводим следующие команды:

systemctl enable fail2ban
systemctl start fail2ban

У хороших хостеров пакет fail2ban устанавливается мышкой из панели управления :)

Установка fail2ban на Linux

И запускается тоже мышкой.

Узнать установленную версию fail2ban можно командой

apt policy fail2ban

Версии (на осень 2020):

  • 0.9 – текущая версия во многих репозитариях
  • 0.10 – поддержка IP v6
  • 0.11 – поддержка bantime.increment (автоматическое увеличение времени блокировки)

Читаем тут

Fail2ban [incremental]: Лучше, быстрее, надежнее

ВАЖНО

Поддержка IPv6 адресов появилась у fail2ban только начиная с версии 0.10
https://github.com/fail2ban/fail2ban/blob/master/ChangeLog

Также номер версии можно увидеть в заголовке файла jail.conf

После установки папку с утилитой можно будет увидеть в /etc/fail2ban

Установка fail2ban на Linux

В fail2ban вся настройка распределена по 3-м модулям (эти папки видно на скрине):

  • action (папка action.d) – действие которое можно применить – занести IP-адрес в черный список (заблокировать его в iptables) и пр. Здесь прописаны стандартные варианты обработки.
  • filter (папка filter.d) – фильтр для поиска регулярного выражения в каком-либо логе, куда записываются ip ботов
  • jail (папка jail.d) – «тюрьма» – собственно связывает фильтр и действие определенными параметрами (задается время бана, число попыток и пр.).  Если стандартный вариант не подходит – то можно прямо в jail прописать нужные действия

Файл fail2ban.conf – основной файл конфигурации (лог и прочее) – настройки показаны выборочно

# Fail2Ban main configuration file
# Comments: use '#' for comment lines and ';' (following a space) for inline comments
# Changes: in most of the cases you should not modify this file,
# but provide customizations in fail2ban.local file, e.g.:
[Definition]
loglevel = INFO
logtarget = /var/log/fail2ban.log
syslogsocket = auto
socket = /var/run/fail2ban/fail2ban.sock
pidfile = /var/run/fail2ban/fail2ban.pid
dbpurgeage = 86400

dbpurgeage – время хранения заблокированного IP  в базе в сек (24 часа). Логично, что время хранения блокированного IP в базе должно быть больше времени бана (bantime)  этого IP.

Файл jail.conf – основной файл блокировок, версия 0.9.0 – настройки показаны выборочно

# WARNING: heavily refactored in 0.9.0 release. Please review and
# customize settings for your setup.
# Changes: in most of the cases you should not modify this file,
# but provide customizations in jail.local file,
# or separate .conf files under jail.d/ directory:
bantime = 600
findtime = 600
maxretry = 5

bantime / findtime – соответственно время блокировки и обнаружения в секундах. В последних версиях fail2ban (с ver 0.10.0) поддерживаются:

  • 1h – один час
  • 1d – один день
  • 1m – один месяц
  • 1y – один год

maxretry – число попыток для блокировки

Оба файла (fail2ban.conf и jail.conf) не рекомендуется изменять, т.к. они будут перезаписаны при установке обновлений (это явно написано на английском языке в комментариях начале каждого файла)

Установка fail2ban на Linux

  • создать и использовать файл jail.local (он нам потребуется точно один раз для внесения адресов IP самого сервера для предотвращения самоблокировок  – см. ниже)
  • все остальные правила будем делать в отдельных файлах в папке jail.d/
  • стандартное время блокировки – период 600 сек
  • стандартное время обнаружения – период 600 сек
  • число попыток – 5 за период

ВАЖНО

После запуска fail2ban сервер иногда выдаёт 502 Bad Gateway  (Fail2Ban causes 502 Bad Gateway)

Это давно известная особенность fail2ban.

После старта fail2ban, веб-сервер может выдавать вместо сайта сообщение «502 Bad Gateway». Причина в том, что сервер обращается сам к себе (особенно при наличии nginx проксирующий запросы) и fail2ban воспринимает это как вредоносную активность.

Решением является добавление в ignoreip всех адресов сервера, как локальных (включая 127.0.0.1) так и внешних IP сервера (в самом простом случае их будет два – IP4 и IP6)

секция {DEFAULT} файла jail.local

Установка fail2ban на Linux

Читаем тут https://www.fail2ban.org/wiki/index.php/Whitelist

Все адреса сервера можно увидеть командой

ip addr

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

Для тех, что понимает, что такое маска  -> 127.0.0.1/32 === 127.0.0.1 (т.е. 32 единички в маске подсети)

:)

ВАЖНО

Если у Вас установлен fail2ban версии ниже 0.10 – не вносите IP6 в ignoreip = будет генерироваться ошибка!

После внесения изменений сервис fail2ban необходимо перезапустить

systemctl restart fail2ban

или

sudo service fail2ban restart

или мышкой в панели управления хостера (если есть такая возможность).

Стандартная настройка fail2ban

Процесс настройки fail2ban не зависит от дистрибутива Linux.

ВАЖНО: по умолчанию (сразу после установки), настройка Fail2ban  работает только для SSH.

Примерная конфигурация файла для защиты SSH:

[sshd]
enabled  = true 
# 1 hour 
findtime = 3600 
# 24 hours 
bantime = 86400
maxretry = 5
По умолчанию настройки:
 
  • bantime = 600
  • findtime = 600
  • maxretry = 10
При стандартной установке время обнаружение и время бана 10 мин при 10 попытках. Боты это легко определяют и внутри 10 мин делают 9 попыток. Своими настройками мы их будем банить на 24 часа с временем определения 1 час на 5 попыток.
 
Почему 1 час периода обнаружения вместо 10 мин? Это же целый ботнет обычно работает. И он тоже знает про 10 мин (стандартная установка). Поэтому с одного IP-адреса в течении минуты проходит 2-3 попытки и IP меняется. И больше внутри 10 мин его fail2ban не обнаружит.

И вот результат для bantime = 3600 (т.е. IP был 5 раз зафиксирован в течении последнего часа)

Установка fail2ban на Linux
Небольшой кусочек крупного ботнета.
 
Да и логи в итоге поменьше будут – т.к. часть “вредителей” будет отсечена еще на входе на 24 часа (вместо 10 мин).
 

ВАЖНО

Реально снизить интенсивность атак на порт 22 SSH только с помощью fail2ban сложно. Этих атак слишком много и слишком много IP от ботнетов.

Читаем статью

Порты вебсервера и их основная защита

 
В файле jail.conf (и соответственно jail.local) сделаны основные настройки для SSH и Apache (и фильтры соответствующие тоже есть конечно)
[sshd]
port = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s

[sshd-ddos]
# This jail corresponds to the standard configuration in Fail2ban.
# The mail-whois action send a notification e-mail with a whois request
# in the body.
port = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s

[apache-auth]
port = http,https
logpath = %(apache_error_log)s

[apache-fakegooglebot]
port = http,https
logpath = %(apache_access_log)s
maxretry = 1
ignorecommand = %(ignorecommands_dir)s/apache-fakegooglebot <ip>

[sshd-ddos] – это дополнительный модуль (и фильтр), который обрабатывает строки лога вида “Did not receive identification string from…” – т.е. запрашивающий разорвал соединение до ввода логина/пароля (чистая DDos атака)

Осталось их только включить (в отдельном файле в папке jail.d/), sshd – включено по умолчанию сразу после установки на сервер.

[sshd]
enabled = true

[sshd-ddos]
enabled = false

[apache-auth]
enabled = false

[apache-fakegooglebot]
enabled = false

Лог можно посмотреть по адресу /var/log/fail2ban.log

tail -f /var/log/fail2ban.log

Что у нас там в логе?

Установка fail2ban на Linux

Ага – в логе у нас любители подбирать доступ SSH:

  • пять попыток с IP 218.92.0.172 (1 раз в секунду!)
  • и бан

 

Для защиты веб-сервера Apache можно использовать свои отдельные настройки:

[apache] 
enabled = true 
port = http,https 
filter = apache-auth 
logpath = /var/log/apache2/error.log 
maxretry = 3 

[apache-multiport] 
enabled = true 
port = http,https 
filter = apache-auth 
logpath = /var/log/apache2/error.log 
maxretry = 3 

[apache-noscript] 
enabled = true 
port= http,https 
filter = apache-noscript 
logpath = /var/log/apache2/error.log 
maxretry = 3 

[apache-overflows] 
enabled = true 
port= http,https 
filter = apache-overflows 
logpath = /var/log/apache2/error.log 
maxretry = 2

Статусы fail2ban

Статус можно посмотреть следующими командами

Список активных клеток (которые jail – тюрьма)

fail2ban-client status

Установка fail2ban на Linux

Итого две активные клетки

Посмотреть статистику по конкретной клетке

fail2ban-client -v status sshd

Установка fail2ban на Linux

Нет вредителей. В системе изменен адрес порта 22 SSH и бедные роботы не знают, куда ломиться.

fail2ban-client -v status validform

Во второй клетке набралось нечисти – 71 адрес IP

  Установка fail2ban на Linux

 

Как в fail2ban удалить заблокированный IP-адрес

Вопрос по смыслу не совсем правильный :)

Сам по себе fail2ban ничего не блокирует.

Он отправляет IP-адрес и инструкции, что с ним делать, в адрес netfilter (брандмауэра ядра Linux).

Соответственно, мы можем через командную строку Linux (в случае веб-сервера через SSH) делать следующее:

Получаем список заблокированных адресов

sudo iptables -L -n

да, через серверную утилиту iptables

Удаляем IP через список правил

Получаем список правил iptables с указанием номеров строк у каждой таблицы

sudo iptables -L -n --line-numbers

Находим адрес, имя таблицы и номер, под которым идёт заблокированный адрес (ниже список IP заблокированных ботов по подбору пароля SSH).

Chain f2b-sshd (1 references)
num target prot opt source 
1 REJECT all -- 52.56.106.171 
2 REJECT all -- 103.214.52.6 
3 REJECT all -- 191.234.168.151 
4 REJECT all -- 122.154.251.22 
5 REJECT all -- 64.227.81.135 
6 REJECT all -- 54.37.66.7 
7 REJECT all -- 203.170.58.241 
8 REJECT all -- 137.220.178.25 
9 REJECT all -- 51.77.213.136

Например таблица  f2b-sshd и номер 9

sudo iptables -D f2b-sshd 9

Удаляем IP из конкретного правила

Узнаем список правил командой

sudo fail2ban-client status

Например, бан IP по ssh. Удалить из таблицы sshd заблокированный ip можно с помощью команды:

sudo iptables -D sshd -s 192.168.1.1 -j DROP

192.168.1.1 – адрес для удаления из таблицы

 


Вы можете сохранить ссылку на эту страницу себе на компьютер в виде htm файла