Модул 5 · 5.3
fail2ban срещу опити за отгатване на пароли
Модул 5: Защита на мрежата · Време за четене: 10 минути
Цел на урока: След този урок ще можете да настроите fail2ban за SSH, да четете статуса и лога му, да отблокирате отново даден адрес и да обясните какво fail2ban защитава и какво не.
Основни понятия: brute force, jail, филтър, действие (banaction), maxretry, findtime, bantime, bantime.increment, ignoreip, backend systemd, jail.conf, jail.local и jail.d, fail2ban-client, recidive
Хората, които натискат дръжката на всяка врата в интернет
Погледнете лога на SSH един ден след инсталацията и ще го видите: стотици опити за влизане с имена като root, admin, test, ubuntu и oracle, от адреси от целия свят.
anna@web1:~$ sudo journalctl -u ssh --since today | grep -c "Invalid user"
412
anna@web1:~$ sudo journalctl -u ssh --since today | grep "Invalid user" | tail -n 3
nov 09 14:02:11 web1 sshd-session[20311]: Invalid user admin from 203.0.113.77 port 51522
nov 09 14:02:13 web1 sshd-session[20313]: Invalid user oracle from 203.0.113.77 port 51544
nov 09 14:02:16 web1 sshd-session[20315]: Invalid user test from 203.0.113.77 port 51560(В Ubuntu услугата се казва ssh, в AlmaLinux и Rocky sshd. Името на процеса може да бъде sshd или sshd-session в зависимост от версията на OpenSSH.) Това е brute-force атака: ботове, които просто изпробват всички разпространени имена и пароли. Когато влизате с ключове и влизането с парола е изключено (урок 2.2), те никога няма да влязат, колкото и пъти да опитват. Но те пълнят Вашия лог, отнемат известна изчислителна мощ, а при услуги, при които все пак е нужна парола (уебпоща, административен панел), могат да бъдат наистина опасни.
fail2ban чете логове, разпознава неуспешните опити и заключва за известно време във firewall адрес, който се проваля твърде често.
Как мисли fail2ban: jails
fail2ban работи с jails (килии). Един jail съчетава три неща:
- филтър: регулярни изрази, които разпознават неуспешни опити в даден лог (например реда "Invalid user ... from <adres>");
- действие: какво става при твърде много опити, обикновено правило във firewall, което блокира адреса (
banaction, в Debian 13 по подразбиране чрез nftables); - прагове: колко неуспешни опита (
maxretry) за какво време (findtime) водят до блокиране за колко време (bantime).
Стойностите по подразбиране от jail.conf са: maxretry = 5, findtime = 10m, bantime = 10m. Тоест: пет неуспешни опита в рамките на десет минути водят до блокиране за десет минути.
Инсталиране и капанът на Debian 12
anna@web1:~$ sudo apt install fail2ban
anna@web1:~$ sudo systemctl status fail2banВ Debian и Ubuntu jail за SSH ([sshd]) е включен веднага след инсталирането чрез файла /etc/fail2ban/jail.d/defaults-debian.conf.
Има един известен капан. fail2ban трябва да знае къде се намира логът. Преди това беше текстовият файл /var/log/auth.log. От Debian 12 rsyslog вече не се инсталира по подразбиране и съобщенията се записват само в journal на systemd (урок 6.2). Пакетът fail2ban на Debian 12 все още търсеше /var/log/auth.log, не го намираше и не стартираше. Debian 13 реши проблема, като в defaults-debian.conf за SSH задава backend = systemd. В Debian 12 решавате проблема сами (вижте по-долу), като направите същото. Ubuntu все още има rsyslog по подразбиране, но backend = systemd работи и там.
Вашите собствени настройки: jail.local
Никога не променяйте jail.conf: този файл се заменя при актуализация. Поставете собствените си настройки в /etc/fail2ban/jail.local или във файл в /etc/fail2ban/jail.d/ с разширение .local:
# /etc/fail2ban/jail.d/eigen.local
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
bantime.increment = true
ignoreip = 127.0.0.1/8 ::1 198.51.100.20
[sshd]
enabled = true
backend = systemdКакво правят редовете:
bantime = 1h: блокиране за един час вместо за десет минути.bantime.increment = true: който се върне след блокиране, получава всеки път по-дълго блокиране.ignoreip: адреси, които никога не се блокират. Въведете тук фиксирания IP адрес на Вашия офис, ако имате такъв. Не въвеждайте тук големи диапазони "за всеки случай".backend = systemd: чете journal вместо текстов файл (необходимо в Debian 12, препоръчително навсякъде). За целта трябва да е инсталиран пакетътpython3-systemd; обикновено той вече е инсталиран като зависимост.
Презареждане и проверка:
anna@web1:~$ sudo fail2ban-client -t # тест на конфигурацията
OK: configuration test is successful
anna@web1:~$ sudo systemctl reload fail2ban
anna@web1:~$ sudo fail2ban-client status
Status
|- Number of jail: 1
`- Jail list: sshdЧетене на статуса, блокиране и отблокиране
anna@web1:~$ sudo fail2ban-client status sshd
Status for the jail: sshd
|- Filter
| |- Currently failed: 3
| |- Total failed: 1288
| `- Journal matches: _SYSTEMD_UNIT=ssh.service + _COMM=sshd
`- Actions
|- Currently banned: 2
|- Total banned: 117
`- Banned IP list: 203.0.113.77 198.51.100.140"Currently failed" са адресите, които вече са правили опити, но все още не са надхвърлили прага. "Currently banned" са адресите, които в момента са блокирани.
Ако сте блокирали сами себе си (например като сте опитали няколко пъти с грешен ключ или потребителско име), влезте през друга мрежа или през конзолата и отблокирайте адреса си:
anna@web1:~$ sudo fail2ban-client set sshd unbanip 198.51.100.20Логът на самия fail2ban се намира в /var/log/fail2ban.log и показва кога кой адрес е бил блокиран и отблокиран:
2026-11-09 14:02:16,903 fail2ban.actions [811]: NOTICE [sshd] Ban 203.0.113.77
2026-11-09 15:02:17,120 fail2ban.actions [811]: NOTICE [sshd] Unban 203.0.113.77Повторни нарушители: recidive
Някои ботове просто се връщат след всяко блокиране. За тях има две средства. bantime.increment (по-горе) прави блокирането всеки път по-дълго. Освен това има jail recidive: той чете лога на самия fail2ban и блокира за една седмица на всички портове адрес, който е бил блокиран често в рамките на един ден. Включва се във Вашия .local файл:
[recidive]
enabled = trueКакво fail2ban прави и какво не прави
fail2ban е полезен, но не е ключалката на вратата. Ключалката е влизането с ключ при изключени пароли (урок 2.2). Затова трябва да знаете и какво fail2ban не може:
- Разпределена атака от хиляди адреси, всеки с един или два опита, никога не надхвърля
maxretry. - Слабата парола си остава слаба. fail2ban забавя отгатването, нищо повече.
- Само това, което е в лога: услуга, която не записва неуспешните опити, или лог, който fail2ban не чете, остават невидими за него.
- Docker: блокиранията в обикновената верига на firewall не важат за публикуваните портове на контейнери (урок 9.3). За услуги в контейнери е нужна отделна настройка (действие върху веригата
DOCKER-USER).
Какво fail2ban прави добре: поддържа лога спокоен, намалява натоварването от ботове и защитава услуги, при които (все още) използвате пароли, например уебпоща или административен панел. За такива услуги има филтри за nginx, Postfix, Dovecot и много други.
В AlmaLinux и Rocky Linux
Там fail2ban идва от EPEL: dnf install epel-release и след това dnf install fail2ban. Пакетът fail2ban инсталира и връзката с firewalld. SSH услугата се казва sshd. Включете самия jail в .local файл; за разлика от Debian, той не е включен автоматично.
Обобщение
- Ботовете опитват да влязат по цял ден; при ключове и изключено влизане с парола те не влизат, а fail2ban освен това ги държи на разстояние.
- Един jail е филтър + действие + прагове (
maxretry,findtime,bantime); по подразбиране 5 опита за 10 минути, блокиране за 10 минути. - Собствените настройки са в
jail.localилиjail.d/*.local, никога вjail.conf; използвайтеbackend = systemd(необходимо в Debian 12). fail2ban-client status sshdпоказва блокираните адреси,set sshd unbanipотблокира; recidive иbantime.incrementсе справят с повторните нарушители.- fail2ban не спира разпределени атаки или слаби пароли и не вижда портовете на Docker сам по себе си.
Тест (quiz)
Задача
Задача Z5.3: Четене на лог от проникване. В примерния файл ssh-journal-1.txt има част от journal на SSH сървър с fail2ban, както и изхода на fail2ban-client status sshd. Отговорете: кой адрес е опитал най-много потребителски имена, кой адрес е успял да влезе с ключ и като кой потребител, кой адрес е блокиран и в колко часа, и дали този адрес би бил блокиран и при настройките по подразбиране (maxretry = 5, findtime = 10m)? Програмата сравнява отговорите с фиксирания ключ. Ако имате собствен сървър с fail2ban, разгледайте и там fail2ban-client status sshd.
Още за четене
- Защита на Вашия VPS: първите пет минути
- Блокиран ли съм? Вашият IP адрес и нашата firewall
- fail2ban, конфигурация по подразбиране
jail.conf: https://github.com/fail2ban/fail2ban/blob/master/config/jail.conf - Ръководство
jail.conf(5): https://manpages.debian.org/trixie/fail2ban/jail.conf.5.en.html - VPS: от първото влизане до сигурен сървър 3.5: fail2ban срещу опити за отгатване на пароли
