Fail2ban sleduje soubory s logy, a když se stejná adresa příliš mnohokrát za sebou nepodaří autentizovat, přidá pravidlo firewallu, které ji na nějakou dobu zahazuje. To je celý produkt. Dvacet minut nastavování odstraní většinu šumu z tvého logu autentizace a měřitelnou část zátěže malého serveru a patří mezi čtyři nebo pět věcí, které stojí za to udělat první den na novém VDS.
Také se pravidelně přeceňuje. Fail2ban nezastaví distribuovaný útok, kde každý pokus přichází z jiné adresy, nezastaví objemovou záplavu, a pokud jsi už na SSH vypnul ověřování heslem, brute force pokusy, které blokuje, by stejně nikdy neuspěly. Nainstaluj ho proto, že udržuje logy čitelné a CPU volné, ne proto, že dělá z boxu bezpečný stroj. SSH zabezpečí vypnutí hesel, což je jiný článek: klíče SSH a zabezpečení.
Jak to doopravdy funguje#
Tři části a pochopení jejich rozdělení usnadní diagnostiku každého problému.
Filtr je sada regulárních výrazů, které poznají selhání v konkrétním formátu logu. Žijí v /etc/fail2ban/filter.d/, jeden soubor na službu, a distribuce jich dodává desítky: sshd.conf, nginx-http-auth.conf, postfix.conf a tak dále.
Jail spojuje filtr se zdrojem logu a sadou čísel: kolik selhání, v jakém okně a jak dlouho ban trvá. Jaily se definují v /etc/fail2ban/jail.conf a - důležité - přepisují se jinde, tebou.
Akce je to, co se stane, když jail zareaguje. Výchozí zapíše pravidlo iptables nebo nftables, které adresu odmítne na portech, jež jail pokrývá. Akce žijí v /etc/fail2ban/action.d/ a existují alternativy, které volají ufw, posílají e-mail nebo volají API.
Z toho diagramu plynou dva důsledky. Fail2ban je reaktivní: čte řádek až poté, co byl zapsán, takže neúspěšné pokusy vždy proběhnou první a ban se projeví o vteřinu či dvě později. A ban je vždy jen pravidlo firewallu, takže cokoli, co obejde tvůj firewall, obejde i fail2ban. Tenhle poslední bod má velmi častou podobu, popsanou blízko konce článku.
Instalace a jediný soubor, který máš upravovat#
$ apt update && apt install fail2ban$ systemctl enable --now fail2ban$ fail2ban-client statusNeupravuj jail.conf. Je to balíčkový soubor, při každém upgradu se nahradí a tvoje změny tiše zmizí. Vytvoř místo toho /etc/fail2ban/jail.local, který se čte později a vyhrává. Cokoli v jail.local vynecháš, vrací se k dodaným výchozím hodnotám, takže soubor musí obsahovat jen to, co měníš.
[DEFAULT]bantime = 1hfindtime = 10mmaxretry = 5ignoreip = 127.0.0.1/8 ::1 203.0.113.42# Ban for longer each time the same address comes back.bantime.increment = truebantime.maxtime = 5w[sshd]enabled = truemode = aggressivemaxretry = 4bantime = 2hDodané výchozí hodnoty jsou bantime = 10m, findtime = 10m a maxretry = 5. Deset minut je tak málo, že proti trpělivému skeneru je to skoro dekorace, a proto první, co většina lidí mění, je bantime.
bantime.increment je nastavení, které stojí za to znát, a to, které lidé míjejí. Když je zapnuté, adresa, která se nechá zabanovat znovu po vypršení prvního banu, dostane ban dvakrát delší, pak čtyřikrát, až do bantime.maxtime. Jeden zvědavý návštěvník je pryč na hodinu; něco, co se vrací celý týden, skončí pryč na pět. Nestojí to nic a odvede to téměř všechnu užitečnou práci.
ignoreip je tvůj bezpečnostní pás. Pokud máš statickou adresu, dej do něj svou domácí nebo kancelářskou. Pokud ne, vynech ho a nehádej, a přečti si raději část o odbanování níže.
Jail sshd a log, který nemůže najít#
Jail sshd je v výchozím nastavení většiny distribucí zapnutý a na čerstvém boxu je jediný, na kterém záleží. Moderní selhání není konfigurace, ale zdroj logu.
Fail2ban tradičně čte /var/log/auth.log, který zapisuje rsyslog. Nedávné minimální image Debianu a Ubuntu rsyslog neinstalují vůbec a všechno jde místo toho do žurnálu systemd. Na těchto systémech se jail sshd nespustí a chyba v journalctl -u fail2ban mluví o chybějící cestě k logu, ne o ničem, co jsi udělal. Oprava je jeden řádek:
[sshd]enabled = truebackend = systemdNež něco předpokládáš, zjisti, ve které situaci jsi: ls -l /var/log/auth.log. Pokud soubor existuje a roste, výchozí backend se souborem je v pořádku. Pokud ne, nastav backend = systemd a jail bude číst žurnál přímo.
Parametr mode filtru sshd stojí za nastavení. normal zachytí přímočará selhání autentizace. aggressive přidá řádky o uzavření spojení před autentizací a šum malformovaných paketů, který skenery generují, a tím chytí boty, které sondují, aniž by kdy odeslaly heslo. Na serveru s už vypnutou autentizací heslem je aggressive režim, který skutečně cokoli zabanuje, protože bot zkoušející hesla na démona jen pro klíče nikdy nevyrobí klasický řádek o selhání.
Doby banu, doby hledání a co ta čísla znamenají#
O chování rozhodují tři čísla a vzájemně působí způsobem, který se snadno obrátí naopak.
| Nastavení | Výchozí | Co znamená |
|---|---|---|
maxretry | 5 | Počet selhání potřebných k banu |
findtime | 10m | Okno, do kterého musí selhání spadnout |
bantime | 10m | Jak dlouho pravidlo firewallu zůstává |
bantime.increment | off | Vynásobí ban při každém opakovaném přestupku |
bantime.maxtime | none | Strop pro navyšovaný ban |
findtime je klouzavé okno, ne kbelík, který se resetuje podle hodin. Čtyři selhání rozložená přes jedenáct minut s desetiminutovým findtime nespustí nikdy nic, protože v žádném okamžiku nebyla čtyři v rozpětí deseti minut. Pomalý skener, který zkusí jedno heslo každé tři minuty, je pro výchozí hodnoty neviditelný, což je skutečná technika a jeden z důvodů rozšířit findtime místo snižování maxretry.
Rozumná výchozí čísla pro server, na který se přihlašuješ jen ty: maxretry = 4, findtime = 30m, bantime = 1h, se zapnutým bantime.increment. Pokud box používají i jiní lidé, buď k prvnímu přestupku mírnější a nech navyšování potrestat vytrvalost, protože jediný člověk, který zaručeně spustí přísný jail, je kolega se starým klíčem pořád v agentovi.
S fail2ban se dodává jail druhého řádu, který stojí za zapnutí, jakmile funguje zbytek, a je to ten, který nezapíná skoro nikdo:
[recidive]enabled = truebantime = 1wfindtime = 1dmaxretry = 5Jail recidive čte vlastní log fail2banu a banuje adresy, které se během dne nechaly zabanovat pětkrát jakýmkoli jiným jailem. Je to univerzální záchyt pro cokoli, co se vrací po vypršení banu, a pokrývá hosty, kteří se pomalu střídají mezi tvými službami. Potřebuje existující /var/log/fail2ban.log; pokud tvoje instalace loguje do žurnálu, nastav backend = systemd i na tomto jailu.
Jaily pro webový server#
Pokud na VDS běží nginx, tři dodané jaily si své místo zaslouží. Přidej je do jail.local a uprav cesty k logům podle svého nastavení.
[nginx-http-auth]enabled = truelogpath = /var/log/nginx/error.log[nginx-botsearch]enabled = truelogpath = /var/log/nginx/access.log[nginx-limit-req]enabled = truelogpath = /var/log/nginx/error.logmaxretry = 10findtime = 1mnginx-http-auth chytá brute force proti základní autentizaci HTTP. nginx-botsearch odpovídá požadavkům na cesty, na které se skenery ptají vždycky, což je na webu s WordPressem stálé kapání celý den. nginx-limit-req je zajímavý: nedělá nic, pokud nemáš nakonfigurované vlastní zóny limit_req v nginxu, a pak povýší klienta, který pořád naráží na limit rychlosti, z „zpomaleného“ na „zabanovaného na firewallu“, což je mnohem levnější na obsluhu.
Toto pořadí je obecný princip. Fail2ban je tupý nástroj na konci. Aplikace by měla omezovat rychlost jako první, protože umí odlišit skutečného uživatele od bota způsoby, které řádek logu nedokáže, a jen klienti, kteří ignorují zpomalení, si zaslouží pravidlo firewallu. Limity rychlosti a zneužití projde, kam která vrstva patří.
Pokud pro firewall používáš ufw, nasměruj fail2ban na něj, aby oba nástroje nezapisovaly konkurující si pravidla:
[DEFAULT]banaction = ufwJinak fail2ban vkládá vlastní řetězce před řetězce ufw, což funguje, ale zanechá tě se dvěma místy, kam se dívat, když je adresa nečekaně blokovaná. Zbytek příběhu o firewallu je v návodu na firewall ufw.
Důkaz, že to funguje#
Neotestovaná instalace fail2ban je předmět útěchy. Čtyři kontroly, v tomto pořadí, a každá odpovídá na jinou otázku.
$ fail2ban-client status # which jails are running$ fail2ban-client status sshd # counters and current bans$ fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf$ iptables -S | grep f2b # the rules that exist right now$ nft list ruleset | grep -i f2b # on nftables systemsfail2ban-client status sshd vypíše aktuálně neúspěšné, celkem neúspěšné, aktuálně zabanované, celkem zabanované a seznam zabanovaných adres. Pokud celkový počet selhání roste, ale celkový počet banů zůstává na nule, filtr odpovídá a čísla jsou příliš volná. Pokud celkový počet selhání stojí na nule, zatímco journalctl -u ssh jasně ukazuje pokusy, filtr log vůbec neodpovídá, což je téměř vždy špatný backend nebo špatný logpath.
fail2ban-regex je nástroj, který to rozhodne. Ukaž ho na skutečný log a soubor filtru a řekne ti, kolik řádků odpovídalo, kolik bylo ignorováno a kolik nedokázal zpracovat. Přidej --print-all-missed, abys viděl řádky, které přeskočil, takhle zjistíš, že tvůj formát logu má časové razítko, které nepozná.
Pro test od začátku do konce se nech selhat schválně z druhého stroje nebo z telefonu připojeného přes mobilní data - ne z adresy, ze které jsi právě připojen. Zadej pětkrát špatné heslo a pak zkontroluj výstup stavu ze své stávající relace. Potom se odbanuj.
$ fail2ban-client set sshd unbanip 203.0.113.9$ fail2ban-client unban 203.0.113.9 # every jail at once$ fail2ban-client unban --all # clear everythingCo fail2ban neudělá#
Řekněme nepříjemné části nahlas, protože mnoho návodů to nedělá.
- Distribuované pokusy projdou. Botnet s deseti tisíci adresami, které udělají po třech pokusech, nikdy nedosáhne
maxretryna žádné jedné adrese. Fail2ban je stavěný na jednoho vytrvalého skenera, což je většina provozu, ale není to obrana proti trpělivému útočníkovi. - S objemovými záplavami nic nenadělá. Pakety stále přicházejí, stále spotřebovávají tvůj uplink a stále stojí jádro práci. Filtrování musí proběhnout před tvým strojem a vysvětlení DDoS útoků na herní servery popisuje, co jde a nejde s tím udělat.
- Docker publikuje porty mimo něj. Tohle je to velké. Kontejner spuštěný s
-p 5432:5432je dostupný přes řetězceDOCKER-USERaFORWARD, zatímco výchozí pravidla fail2banu žijí vINPUT, takže ban nemá na nic v kontejneru žádný efekt. Buď naváž kontejner na localhost přes-p 127.0.0.1:5432:5432, nebo akci řekni, aby zapisovala do správného řetězce, pomocíbanaction = iptables-allports[chain=DOCKER-USER]. Zbytek té výhrady najdeš v Docker na VDS. - Slabé heslo nespraví. Pět pokusů je spousta, pokud je heslo
admin123. Fail2ban zvyšuje cenu hádání; nezvyšuje ji dost na to, aby to proti skutečně špatnému tajemství mělo smysl. - Není náhradou za vypnutí hesel. S
PasswordAuthentication noa přístupem jen pomocí klíčů brute force, který blokuje, už selhával. Pořád se to vyplatí kvůli šumu v logu a CPU, ale buď upřímný k pořadí kroků.
Pokud se už něco pokazilo místo aby se tomu předešlo, fail2ban není nástroj, který potřebuješ - tím je co dělat, když je tvůj server napaden.
Každodenní provoz#
Po jakékoli změně jail.local načti konfiguraci znovu místo restartu, aby stávající bany přežily:
$ fail2ban-client reload # all jails$ fail2ban-client reload sshd # one jail$ fail2ban-client get sshd bantime$ fail2ban-client set sshd banip 198.51.100.7$ journalctl -u fail2ban -n 50 --no-pagerBany se ukládají v malé databázi SQLite v /var/lib/fail2ban/fail2ban.sqlite3, takže přežijí restart služby i reboot stroje. Je tam také historie navyšování, a proto si recidivista udrží svůj eskalující ban i napříč rebooty.
Jednou za měsíc se podívej na fail2ban-client status sshd a na velikost svého logu autentizace. Náhlá změna jakýmkoli směrem je informace: log, který ztichl, obvykle znamená, že se zastavil rsyslog nebo se rozbil jail, ne že by se internet stal zdvořilým. Širší návyk rozhodovat, které logy držet a jak dlouho, je v článku logy, které stojí za uchování a příkazy pro jejich rychlé čtení jsou v příkazech Linuxu pro správce serverů.
Na spravovaném tarifu RE:NODE fail2ban neinstaluješ, protože neexistuje shell hostitele, do kterého by se dal nainstalovat. Odpovídající ochrany jsou zabudované: panel dává na přihlášení captchu a limity rychlosti, ukládá hashe hesel pomocí bcrypt, nabízí dvoufaktorové ověření s kódy z autentizační aplikace a jednorázovými záložními kódy, vede seznam relací, ze kterých se můžeš odhlásit, a umožňuje omezit klíče API podle adresy. Filtrování před nodem zahazuje zjevné objemové záplavy dřív, než se k němu dostanou. Na VDS je to všechno na tobě a fail2ban je jedna cihla z toho celku.
FAQ#
Zpomaluje fail2ban server?
Znatelně ne. Je to proces v Pythonu čtoucí řádky logu, typicky se spotřebou několika desítek megabajtů paměti a téměř žádným CPU. Samotné bany jsou pravidla firewallu, která jádro vyhodnocuje v mikrosekundách. Jediný případ, kdy se vůbec projeví, je jail s obrovským seznamem banů a velmi krátkým findtime na rušném webovém logu.
Proč můj jail sshd hlásí nula selhání?
Skoro vždy za to může zdroj logu. Zkontroluj, jestli existuje /var/log/auth.log; na image bez rsyslogu neexistuje a v jailu potřebuješ backend = systemd. Potvrď to pomocí fail2ban-regex na skutečném logu, který ti řekne přesně, kolik řádků odpovídalo.
Zabanuje mě, když se překlepnu v hesle?
Ano, a má. Proto existuje ignoreip pro statickou adresu, proto si při jakékoli změně necháváš otevřenou druhou relaci a proto kontroluješ, že konzole od poskytovatele funguje, dřív než ji potřebuješ. Používej klíče a otázka přestane vznikat.
Stačí fail2ban samotný?
Ne. Je to jedna vrstva nad SSH jen pro klíče, firewallem s výchozím zákazem, aktuálními balíčky a neprivilegovanými uživateli služeb. Odstraňuje šum a zastavuje líné útoky. Každá vážná kontrola je jinde a první hodina na novém VDS je vyjmenovává v pořadí.
Může chránit port herního serveru?
Jen pokud hra zapisuje čitelný log neúspěšných pokusů, což většina nedělá, a jen proti zneužití založenému na spojeních, ne proti záplavám. Banování podle adresy je také špatná volba pro hráče, kteří sdílejí adresy a mění je. Pro hráče použij vlastní seznam banů hry a RCON a fail2ban si nech pro administrativní rozhraní.
Jak uvidím všechny aktuálně zabanované adresy?
fail2ban-client status <jail> vypíše seznam pro jeden jail. Novější verze mají také fail2ban-client banned, který vypíše seznamy všech jailů najednou. Abys viděl, co jádro skutečně vynucuje, použij iptables -S | grep f2b nebo nft list ruleset.




Komentáře
Zcela anonymně: žádný účet, žádný e-mail, žádné cookie. Ukládáme jen jméno, které napíšeš, text a čas - nic dalšího. Počet odkazů je omezený a značkování se nevykresluje.