Hlavní navigace

Fail2ban: konec hádání hesel na serveru

24. 6. 2013
Doba čtení: 7 minut

Sdílet

Nejčastějším způsobem útoku na servery je dnes hádání hesel. Roboti procházejí celý internet, hledají otevřené porty a zkoušejí do nich sypat různá hesla v naději, že některé z nich bude fungovat. Stačí tak mít slabší heslo a je jen otázkou času, kdy budete mít zaděláno na problém. Řešení naštěstí existuje.

Internetové servery jsou častým cílem různých druhů útoků. Samozřejmostí je pravidelná aktualizace všech balíčků, sledování logů a bezpečná hesla. I přesto ale bude váš server pod velkým útokem různých botů, které budou hledat slabé místo a hádat různé oblíbené kombinace jméno:heslo.

Poznámka: Velmi rozumné je na SSH vypnout přihlašování pomocí hesla a dovolit jen přihlašování pomocí klíčů.

Seriál vznikl za přispění Národního CSIRT týmu České republiky CSIRT.CZ, který provozuje sdružení CZ.NIC, správce české národní domény. CSIRT.CZ je bezpečnostní tým pro koordinaci řešení bezpečnostních incidentů v počítačových sítích provozovaných v České republice. Cílem jeho členů je pomáhat provozovatelům internetových sítí v České republice zřizovat jejich vlastní bezpečnostní týmy a bezpečnostní infrastrukturu, řešit bezpečnostní incidenty a tím zlepšovat bezpečnost jejich sítí i globálního Internetu.

Pokud máte někde otevřené SSH a někdy jste už četli logy (a to byste měli), určitě jste viděli hodně neúspěšných pokusů o uhádnutí hesel k nejrůznějším účtům. Schválně jsem prošel vlastní logy, abych vybral ty nejčastější kombinace. Celkem jsem nasbíral přes 3800 různých pokusů zhruba za 14 dní. Nejčetnějších bylo těchto deset uživatelů:

  • root
  • test
  • admin
  • oracle
  • nagios
  • user
  • guest
  • postgres
  • alex
  • teste

Jak vidíte, jedná se skutečně o střelbu od boku. Zajímavé přitom je, že i když je na serveru zakázané přihlašování heslem, boti jsou tak hloupí, že to stejně zkouší a nabíhají stále dokola proti zdi, i když jim server neustále vrací hlášku: Permission denied (publickey).

Rozhodl jsem se podobnému řádění učinit rázně přítrž a začít podobné pokusy blokovat. I proto, že zbytečně způsobují zátěž na serveru a dělají nepořádek v lozích. Nainstaloval jsem Fail2ban.

Co je to?

Fail2ban je démon, který pročítá autentizační log a hledá v něm neúspěšné pokusy o přihlášení. Podle nastavených metrik pak pomocí IPtables blokuje přístupy z příslušné IP adresy na stanovenou dobu. Výhodou je, že takové blokování proběhne už na síťové úrovni a agresivní boti přestanou server zatěžovat.

Démon je velmi dobře zdokumentovaný a silně konfigurovatelný. Vůbec se neomezuje jen na SSH, ale naopak je napsán zcela univerzálně, takže je možné mu snadno doplnit sledování dalších logů a provádění nových akcí. Ve výchozím stavu přichází s filtry pro SSH, Apache, Courier, Dovecot, Exim, PHP a další služby.

Poznámka: Podobným projektem je DenyHosts, který se ale zaměřuje jen na SSH a neblokuje pomocí IPtables.

Instalujeme a konfigurujeme

Instalaci jsem prováděl v Debianu Wheezy, ale pravděpodobně bude velmi podobná ve všech běžných distribucích. Začneme samozřejmě instalací, která je snadná:

# aptitude install fail2ban

Tím máme nainstalováno a spuštěno. Veškerá konfigurace se nachází v adresáři /etc/fail2ban, kde mimo jiné najdeme adresář s filtry filter.d, adresář s akcemi action.d a konfigurační soubory fail2ban.conf a jail.conf. Ten první slouží k obecnému nastavení démona, ten druhý pak k nastavení samotného banování. Zajímat nás proto bude víc.

Hned na začátku najdeme sekci [Default], ve které je rozumné si nastavit adresy, které nebudou nikdy banovány, dále pak dobu zákazu v sekundách (já mám jeden den), počet pokusů, po kterých zákaz nastane a časové okno, ve kterém se musí tyto pokusy objevit (ve výchozím stavu 10 minut).

ignoreip = 127.0.0.1/8 91.213.160.118
bantime  = 86400
maxretry = 3
findtime = 600

Dále pak následuje definice výchozích akcí (na kterou nemusíme sahat) a nakonec už samotné nastavení pro jednotlivé služby. Příklad pro SSH:

[ssh]

enabled  = true
port     = ssh
filter   = sshd
logpath  = /var/log/auth.log
maxretry = 3

Vidíte, že pravidlo je zapnuté, hlídáme port ssh, použijeme filtr sshd a aplikujeme ho na správný autorizační log, kde se budou objevovat hlášení o neúspěšných přihlášeních. Nakonec je přidána volba o maximálním počtu pokusů, po kterých dojde k blokaci. Tady odpovídá výchozí hodnotě, je možné ale počty měnit pro každou službu zvlášť, stejně jako třeba dobu blokace.

Po provedených změnách pak už stačí jen démona restartovat:

# /etc/init.d/fail2ban restart

Provoz

Informace z provozu je možné sledovat v logu, který je ve výchozím stavu umístěn v /var/log/fail2ban.log. Tam se dočtete, kdo dostal proč zákaz a nebo že mu byl zrušen.

V pravidlech pro IPtables si Fail2ban vytvoří vlastní řetězce (chain), do kterých posílá odpovídající pakety. V řetězcích pak provádí samotnou filtraci, přidávání zákazů a jejich odebírání. Aktuální stav si můžete prohlédnout:

# iptables -L

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
fail2ban-ssh  tcp  --  anywhere             anywhere             multiport dports ssh

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain fail2ban-ssh (1 references)
target     prot opt source               destination
DROP       all  --  s48.szerverem.hu     anywhere
DROP       all  --  web.ospk.ru          anywhere
RETURN     all  --  anywhere             anywhere

Vidíte, že v současné době mají u mě na serveru ban dvě adresy, ze kterých probíhaly pokusy o hádání hesel na SSH.

Přidání další služby

Zabýval jsem se také tím, jak je možné do Fail2ban přidat další službu, konkrétně redakční systém WordPress. Ten je také velmi častým zdrojem útoků a bylo by příjemné mít ho hlídaný stejným způsobem, jako SSH.

Nejprve je potřeba zařídit, aby WordPress zapisoval neúspěšné pokusy o přihlášení do textového souboru. Existuje pěkné rozšíření WP fail2ban, které nechává zápisy provádět přímo do systémového logu. To stačí nainstalovat a aktivovat, konfigurovat na něm není co.

Součástí balíčku s rozšířením je i příslušný filtr a příklad konfigurace. Filtr stačí zkopírovat do správného adresáře v /etc/fail2ban/filter.d/. Prakticky nic v něm není, jen regulární výraz pro filtraci dat ze záznamů v logu:

failregex = ^%(__prefix_line)sAuthentication failure for .* from $

Nakonec je potřeba do jail.conf přidat příslušnou pasáž:

[wordpress]

enabled = true
filter  = wordpress
logpath = /var/log/auth.log
port    = http,https
maxretry = 3

Po restartu nám začne Fail2ban hlídat další službu. Testování je snadné, ale pozor na dlouhý ban. Doporučuji mít vždycky v záloze nějakou IP adresu, která je na whitelistu a nikdy nebude zablokována.

Nevýhody jsou dvě

Na závěr se ještě zmíním o dvou nevýhodách, které jsou s Fail2ban spojené. Zaprvé démon naprosto ignoruje IPv6, takže pokusy přicházející po šestce projdou bez omezení. Podle mých zkušeností (a logů) ovšem u takových pokusů zatím jde spíš o jednotky kusů. Je pravděpodobné, že jich bude časem přibývat, ale na podpora ve Fail2ban už se testuje, takže vše je na dobré cestě.

Druhý problém spočívá v tom, že Fail2ban nijak nezabrání distribuovaným pokusům, které už jsem také viděl. Z každé IP adresy z různých rozsahů přijde vždy jen jeden či dva požadavky. Vypadá to asi takto:

root_podpora

wordpress(www.debian-linux.cz): Authentication failure for admin from 106.51.172.16: 2 Time(s)
wordpress(www.debian-linux.cz): Authentication failure for admin from 109.87.109.101: 2 Time(s)
wordpress(www.debian-linux.cz): Authentication failure for admin from 110.171.129.251: 2 Time(s)
wordpress(www.debian-linux.cz): Authentication failure for admin from 110.171.137.4: 2 Time(s)
wordpress(www.debian-linux.cz): Authentication failure for admin from 110.49.235.11: 1 Time(s)
wordpress(www.debian-linux.cz): Authentication failure for admin from 112.199.86.2: 2 Time(s)
wordpress(www.debian-linux.cz): Authentication failure for admin from 112.203.239.84: 1 Time(s)
wordpress(www.debian-linux.cz): Authentication failure for admin from 113.53.165.218: 2 Time(s)
wordpress(www.debian-linux.cz): Authentication failure for admin from 113.53.76.19: 2 Time(s)
wordpress(www.debian-linux.cz): Authentication failure for admin from 120.28.125.195: 1 Time(s)
wordpress(www.debian-linux.cz): Authentication failure for admin from 120.28.125.37: 1 Time(s)
wordpress(www.debian-linux.cz): Authentication failure for admin from 120.28.249.151: 1 Time(s)
wordpress(www.debian-linux.cz): Authentication failure for admin from 121.54.44.168: 2 Time(s)
wordpress(www.debian-linux.cz): Authentication failure for admin from 121.54.71.170: 2 Time(s)
wordpress(www.debian-linux.cz): Authentication failure for admin from 122.178.126.133: 1 Time(s)
wordpress(www.debian-linux.cz): Authentication failure for admin from 124.6.181.104: 1 Time(s)
...

V jednom dni přišlo takových pokusů například 215. Vypadá to, že si někdo oťukal maximální možný počet pokusů na tomto konkrétním serveru a nastavil botnet tak, aby tento počet nikdy nepřekračoval. Proti tomu se není možné jednoduše bránit, pokud nezakážete přístup z celého internetu a nepovolíte ho jen konkrétním IP adresám.

Na většinu běžných hrubých pokusů ale Fail2ban zabírá dobře, denně mi blokuje několik jednotek až desítek různých IP adres a sám se stará o jejich odblokování. Jak je ale vidět z distribuovaných pokusů, silné heslo je stále základ.

Byl pro vás článek přínosný?

Autor článku

Petr Krčmář pracuje jako šéfredaktor serveru Root.cz. Studoval počítače a média, takže je rozpolcen mezi dva obory. Snaží se dělat obojí, jak nejlépe umí.