===== Защита сервера OpenSSH с помощью fail2ban и nftables на Debian GNU/Linux ===== {{:unix-linux:debian:pasted:20171124-194401.png }} **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: [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: [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 unbanip Например, удалим из блокировки 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 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
\\ ---- Дополнительные источники информации: * [[https://www.server-world.info/en/note?os=Debian_12&p=fail2ban|Server World - Fail2Ban : Intrusion Prevention System]] * [[https://pieterbakker.com/secure-debian-12-with-fail2ban-and-nftables/|Pieter Bakker - Secure Debian 12 with Fail2ban and nftables]] * [[unix-linux:ubuntu:ubuntu-14-04-lts-trusty-tahr:how-to-install-lemp-web-server-on-ubuntu-14-04:setup-open-ssh-and-fail2ban|Настройка OpenSSH и Fail2ban на Ubuntu Server 14.04 LTS]] ---- Проверено на следующих конфигурациях: ^ Версия ОС ^ Версия 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 | ---- {{:user:blogroot.png?50&nolink |}} Автор первичной редакции:\\ [[user:blogroot|Алексей Максимов]] \\ Время публикации: 14.08.2025 12:26 {{tag>Linux Debian "Debian 12" "Debian Bookworm" "Debian 13" "Debian Trixie" Firewall fail2ban nftables SSH OpenSSH sshd}} ~~DISCUSSION~~