Вики IT-KB

Пошаговые руководства, шпаргалки, полезные ссылки...

Инструменты пользователя

Инструменты сайта


unix-linux:nftables:securing-openssh-server-sshd-with-fail2ban-and-nftables-on-debian-gnu-linux

Защита сервера OpenSSH с помощью fail2ban и nftables на Debian GNU/Linux

fail2ban это популярное ПО для предотвращения вторжений, которое отслеживает файлы журналов на предмет подозрительной активности и динамически обновляет правила брандмауэра, блокируя подозрительные IP-адреса. В рассмотренной ниже конфигурации мы будем использовать fail2ban с журналом systemd в качестве бэкенда (вместо традиционного syslog) и nftables в качестве бэкенда брандмауэра.


Базовая настройка fail2ban

Установим fail2ban и модуль python для systemd:

# apt install fail2ban python3-systemd

Основные настройки fail2ban расположены в файле fail2ban.conf (/etc/fail2ban/fail2ban.conf) и в большинстве случаев можно оставить его параметры в значениях по умолчанию. В нашем примере в этом файле изменяется только значение dbpurgeage с 1d на 10d и отключается поддержка IPv6.

Приведу пример базовой конфигурации fail2ban.conf без учёта комментариев:

# egrep -v "^[[:space:]]*#|^$" /etc/fail2ban/fail2ban.conf
[DEFAULT] loglevel = INFO logtarget = /var/log/fail2ban.log syslogsocket = auto socket = /var/run/fail2ban/fail2ban.sock pidfile = /var/run/fail2ban/fail2ban.pid allowipv6 = off dbfile = /var/lib/fail2ban/fail2ban.sqlite3 dbpurgeage = 10d dbmaxmatches = 10 [Definition] [Thread]

Основные настройки блокировок для разных приложений можно найти в файле jail.conf (/etc/fail2ban/jail.conf).

Скопируем файл jail.conf в jail.local и будем править именно него, чтобы можно было обновлять в дальнейшем пакет без дополнительных предупреждений о переписывании основного конфига jail.conf:

# cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
# nano /etc/fail2ban/jail.local

Файл разделён на секции. Секция [DEFAULT] содержит основные настройки для блокировок любых приложений. Далее идут секции, описывающие параметры блокировок для конкретных приложений.

Пример изменённых параметров в секции [DEFAULT] в конфигурационном файле jail.local:

jail.local
[DEFAULT]
 
# Время блокировки в секундах, 
# по истечении которого IP–адрес удаляется из пула заблокированных
bantime  = 1d
 
# Время, в течение которого суммируются подозрительные попытки в количестве maxretry
findtime = 30m
 
# Количество подозрительных попыток, после которых применяется правило. 
# Применительно к sshd — это число неудачных попыток входа, 
# после которых происходит блокировка.
maxretry = 3
 
# Используем библиотеку python systemd для доступа к журналу systemd
backend = systemd
 
# Файлы с правилами реагирования - в каталоге /etc/fail2ban/action.d/.
# По умолчанию используются файлы iptables-multiport.conf и iptables-allports.conf
# Заменим на файлы, связанные с nftables. 
# Заглянув в эти файлы можно понять как fail2ban работает с правилами iptables/nftables. 
banaction = nftables-multiport
banaction_allports = nftables-allports

Пример изменённых параметров в секции [sshd] в конфигурационном файле jail.local.

Здесь мы переключаем режим работы по умолчанию с normal на aggressive, явно меняем backend на systemd и при необходимости корректируем номер порта, который используется sshd:

jail.local
[sshd]
#mode   = normal
#port    = ssh
#logpath = %(sshd_log)s
#backend = %(sshd_backend)s
mode      = aggressive
enabled   = true
backend   = systemd
port      = 758
maxretry  = 3

Перезапустим службу fail2ban и проверим ее статус:

# systemctl restart fail2ban
# systemctl status fail2ban

Проверим состояние fail2ban и посмотрим какие Jail активны:

# fail2ban-client status
Status |- Number of jail: 1 `- Jail list: sshd

Убедимся в том, что активен Jail для службы sshd и посмотрим его текущий статус:

# fail2ban-client status sshd
Status for the jail: sshd |- Filter | |- Currently failed: 0 | |- Total failed: 0 | `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd `- Actions |- Currently banned: 0 |- Total banned: 0 `- Banned IP list:

Проверка блокировки

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

$ ssh -p 758 fakeuser@your-server-ip

После третьей попытки ввода неверных учётных данных SSH-сервер должен начать отвергать запросы клиента на соединение.

Проверим статус fail2ban и убедимся в том, что для зловредного клиента появилось правило блокировки:

# fail2ban-client status sshd
Status for the jail: sshd |- Filter | |- Currently failed: 0 | |- Total failed: 3 | `- Journal matches: _SYSTEMD_UNIT=ssh.service + _COMM=sshd `- Actions |- Currently banned: 1 |- Total banned: 1 `- Banned IP list: 77.88.44.242

Проверим состояние текущей конфигурации nftables. Здесь должна появится отдельная таблица f2b-table с цепочкой правил f2b-chain:

# nft list ruleset
... table inet f2b-table { set addr-set-sshd { type ipv4_addr elements = { 77.88.44.242 } } chain f2b-chain { type filter hook input priority filter - 1; policy accept; tcp dport 758 ip saddr @addr-set-sshd reject with icmp port-unreachable } }

Как видим, механизм защиты сработал. Добавленное в nftables правило должно будет автоматически удалиться через 24 часа, согласно заданным нами настройкам. Это предотвратит разрастание соответствующих цепочек и не окажет отрицательного влияния на производительность nftables.


Разблокировка IP-адреса

Чтобы вручную разблокировать определённый IP-адрес, который был заблокирован fail2ban, можно выполнить команду в формате:

fail2ban-client set <JAIL> unbanip <IP>

Например, удалим из блокировки IP-адрес 77.88.44.242, который был заблокирован в соответствии с правилами секции [sshd] :

# fail2ban-client set sshd unbanip 77.88.44.242

Усиление защиты с помощью Jail "recidive"

Мы можем усилить уровень защиты, активировав дополнительный Jail «recidive» для анализа рецидивов. Этот джейл будет отслеживать файл журнала fail2ban и банить IP-адреса, которые были забанены несколько раз. Чтобы активировать Jail «recidive», отредактируйте в файле /etc/fail2ban/jail.local соответствующую секцию:

jail.local
# Jail for more extended banning of persistent abusers
# !!! WARNINGS !!!
# 1. Make sure that your loglevel specified in fail2ban.conf/.local
#    is not at DEBUG level -- which might then cause fail2ban to fall into
#    an infinite loop constantly feeding itself with non-informative lines
# 2. Increase dbpurgeage defined in fail2ban.conf to e.g. 648000 (7.5 days)
#    to maintain entries for failed logins for sufficient amount of time
 
[recidive]
backend = auto
logpath  = /var/log/fail2ban.log
banaction = %(banaction_allports)s
bantime  = 1w
findtime = 3d
enabled = true

Эта конфигурация сообщает fail2ban, что для отслеживания повторных нарушителей нужно использовать файл журнала fail2ban.log и блокировать для нарушителей все порты, используя для этого действие nftables-allports (берётся из переменной banaction_allports, значение которой мы указали ранее в конфигурации jail.local).

После внесения этих изменений перезапускаем fail2ban еще раз и проверяем, что теперь работают Jail «sshd» и «recidive»:

# systemctl restart fail2ban
# fail2ban-client status
Status |- Number of jail: 2 `- Jail list: recidive, sshd

Диагностика

Для процедур диагностики и отладки fail2ban и работающий в нём Jail, помимо выше обозначенной утилиты fail2ban-client, наглядным инструментом будет основной лог, где фиксируются практически все активности fail2ban:

# less /var/log/fail2ban.log



Дополнительные источники информации:


Проверено на следующих конфигурациях:

Версия ОС Версия fail2ban Версия nftables
Debian GNU/Linux 12.0 (Bookworm) 1.0.2-2 1.0.6-2+deb12u2
Debian GNU/Linux 13.0 (Trixie) 1.1.0-8 1.1.3-1

Автор первичной редакции:
Алексей Максимов
Время публикации: 14.08.2025 12:26

Обсуждение

Ваш комментарий:
 
unix-linux/nftables/securing-openssh-server-sshd-with-fail2ban-and-nftables-on-debian-gnu-linux.txt · Последнее изменение: Алексей Максимов

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki