fail2ban érdekesség vagy bug?

Fórumok

Fail2ban véd egy email szervert. Mivel vannak, akik ritkán, de kitartóan próbálkoznak, a findtime = 86400 (egy nap), a maxretry = 5. Ez általában jól is működik, de most egy új támadó 5 órája szinte percenként próbálkozik, ám az IP címe mégsem került tiltásra.
Csak nem fogja kivárni az 1 napot a fail2ban, hogy tiltsa? A fail2ban szerint a findtime értékét csak a tiltás feloldásához használja, a tiltáshoz nem.
Van valakinek ötlete, hogy miért nem kerül blokkolásra az új IP?
Nem akarom a findtime értékét lejjebb venni, így holnapra kiderül, hogy tényleg kivárja-e az egy napot, de addig is érdekelnek az ötletek, vagy az, hogy mit rontottam/ronthattam el.

Hozzászólások

Egészen pontosan mivel próbálkozik a "támadó"?
Ha olyannal,amire nincs beállítva filter akkor nem fogja BANnolni!

Valami konkrétumot tudnál mutatni?
Mi a jail konfigja, milyen filterek vannak erre a jailre beállítva, és mi(k) az a logsor(ok), ami(k)re úgy véled, hogy illeszkedő, de mégsem tesz semmit a fail2ban? A fail2ban-regex mond valamit rá?


fail2ban-client status <jail>
fail2ban-client get <jail> failregex
fail2ban-client get <jail> ignoreregex
stb.

A szabvány 535-ös hibás jelszóval való próbálkozás.
A minta jó, a többit meg is fogja. Ugyanilyen típusú log bejegyzéseket tiltólistára tett már vagy tízet.
A mintára illeszkednek is a bejegyzések. Ezt egy külön kis perl scripttel ellenőriztem.
A felismerendő logsorok:


2018-02-14 05:15:59 [25405] login_server authenticator failed for (ylmf-pc) [87.98.226.111]:50824 I=[*******]:25: 535 Incorrect authentication data (set_id=****)

Egyébként a fail2ban alapbeállítással fut. Csak néhány fix IP van fehérlistán, de nem a támadóé. A findtime és a bantime van még egyedire állítva.


# fail2ban-client status exim
Status for the jail: exim
|- Filter
|  |- Currently failed: 9
|  |- Total failed:     18
|  `- File list:        ... /var/log/exim4/main.20180124
`- Actions
   |- Currently banned: 13
   |- Total banned:     13
   `- Banned IP list:   123.206.198.138 177.221.108.196 183.144.202.166 185.156.173.137 191.96.249.183 218.90.34.190 46.37.105.170 49.83.24.93 80.82.70.210 91.200.12.214 93.174.93.46 94.177.244.119 185.81.157.119

Látszik, hogy bár a bejegyzés hajnali 5-kor történt, még most sincs a tiltólistán. Egyre inkább az a gyanúm, hogy holnap kerül fel rá.


# fail2ban-client get exim failregex
The following regular expression are defined:
|- [0]: ^(?: \[\d+\])? (?:H=([\w.-]+ )?(?:\(\S+\) )?)?\[(?:::f{4,6}:)?(?P<host>[\w\-.^_]*\w)\](?::\d+)? (?:I=\[\S+\](:\d+)? )?(?:U=\S+ )?(?:P=e?smtp )?sender verify fail for <\S+>: (?:Unknown user|Unrouteable address|all relevant MX records point to non-existent hosts)\s*$
|- [1]: ^(?: \[\d+\])? \w+ authenticator failed for (\S+ )?\(\S+\) \[(?:::f{4,6}:)?(?P<host>[\w\-.^_]*\w)\](?::\d+)?(?: I=\[\S+\](:\d+)?)?: 535 Incorrect authentication data( \(set_id=.*\)|: \d+ Time\(s\))?\s*$
|- [2]: ^(?: \[\d+\])? (?:H=([\w.-]+ )?(?:\(\S+\) )?)?\[(?:::f{4,6}:)?(?P<host>[\w\-.^_]*\w)\](?::\d+)? (?:I=\[\S+\](:\d+)? )?(?:U=\S+ )?(?:P=e?smtp )?F=(?:<>|[^@]+@\S+) rejected RCPT [^@]+@\S+: (?:relay not permitted|Sender verify failed|Unknown user)\s*$
|- [3]: ^(?: \[\d+\])? SMTP protocol synchronization error \([^)]*\): rejected (?:connection from|"\S+") (?:H=([\w.-]+ )?(?:\(\S+\) )?)?\[(?:::f{4,6}:)?(?P<host>[\w\-.^_]*\w)\](?::\d+)? (?:I=\[\S+\](:\d+)? )?(?:U=\S+ )?(?:P=e?smtp )?(?:next )?input=".*"\s*$
|- [4]: ^(?: \[\d+\])? SMTP call from \S+ (?:H=([\w.-]+ )?(?:\(\S+\) )?)?\[(?:::f{4,6}:)?(?P<host>[\w\-.^_]*\w)\](?::\d+)? (?:I=\[\S+\](:\d+)? )?(?:U=\S+ )?(?:P=e?smtp )?dropped: too many nonmail commands \(last was "\S+"\)\s*$                                                                                                                                                                                                   
|- [5]: ^(?: \[\d+\])? SMTP protocol error in "AUTH \S*(?: \S*)?" (?:H=([\w.-]+ )?(?:\(\S+\) )?)?\[(?:::f{4,6}:)?(?P<host>[\w\-.^_]*\w)\](?::\d+)? (?:I=\[\S+\](:\d+)? )?(?:U=\S+ )?(?:P=e?smtp )?AUTH command used when not advertised\s*$                                                                                                                                                                                           
|- [6]: ^(?: \[\d+\])? no MAIL in SMTP connection from (?:\S* )?(?:\(\S*\) )?(?:H=([\w.-]+ )?(?:\(\S+\) )?)?\[(?:::f{4,6}:)?(?P<host>[\w\-.^_]*\w)\](?::\d+)? (?:I=\[\S+\](:\d+)? )?(?:U=\S+ )?(?:P=e?smtp )?D=\d+s(?: C=\S*)?\s*$                                                                                                                                                                                                    
`- [7]: ^(?: \[\d+\])? \S+ SMTP connection from (?:\S* )?(?:\(\S*\) )?(?:H=([\w.-]+ )?(?:\(\S+\) )?)?\[(?:::f{4,6}:)?(?P<host>[\w\-.^_]*\w)\](?::\d+)? (?:I=\[\S+\](:\d+)? )?(?:U=\S+ )?(?:P=e?smtp )?closed by DROP in ACL\s*$         

# fail2ban-client get exim ignoreregex                                                                                                                                                            
No regular expression is defined 

A mai nap sem blokkolta az IP címet, így a teóriám megdőlt.

Néztem én is a fail2ban logjában, de nincs semmi erről az IP címről.

A második grep rendben visszaadja a próbálkozásokat: 16 sort.

Annyit elnéztem, hogy nem reggel 5 óta folyamatosan jövő támadás volt, hanem reggel 5-kor pár másodpercig tartó folyamatos támadás. Összesen 16 próbálkozással.
Mivel az egész 4 másodpercen belül lezajlott, lehet, hogy a maxretry nem a logsorok darabszámában értendő, hanem másodpercekben?
Ez logikus is lenne, ha a logsor időbélyegéhez rögzíti a támadás tényét, mert így tényleg csak 4 mintája lenne, bár összesen 16 valódi kísérlet volt.

Nem lehet,hogy mindig más felhasználó névvel próbálkozik?
Egyszer én is láttam hasonlót, de nem emlékszem pontosan.
Pedig akkor hibajegyet is terveztem feladni.

fail2ban jo otlet, de onmagaban IMHO nem elegendo.

Kiegeszitok:

- throttling a SYN csomagokra, per-ip. esetleg fail2ban-nal hazasitani. keyword: traffic shaping. Ha tenylegesen percenkent 1x tud probalkozni, maris nem erdekel senkit, hogy probalkozik. egeszsegere.

- knockd. nem feltetlen applikalhato, de pl. ssh -nal kivalo random scan-ek ellen. van olyan verzioja is, ahol specialisan formazott udp/icmp csomagban van signed/encrypted es timestamp-elt uzenet, szoval kvazi egy elo-auth.

- 2FA! manapsag mar egyre egyszerubb. persze rengeteg megoldas van ra, keresgelj. nemileg maceras usereknek, de lehet vele takarozni, hogy "industry standard" es "mindenki csinalja" meg "haladunk a korral".

Hányas fail2ban?

Be tudnál másolni egy olyan sort a logból, amit megfogott?

Ez érdekes...

# cat /etc/debian_version 
9.3
# dpkg -l "fail2ban"
...
||/ Name                                                        Version        
+++-===========================================================-===============
ii  fail2ban                                                    0.10.2-1~nd90+1
# fail2ban-server -V    
Fail2Ban v0.10.2
# cat /etc/apt/sources.list
deb http://ftp.hu.debian.org/debian/ stretch main non-free contrib
deb-src http://ftp.hu.debian.org/debian/ stretch main non-free contrib

deb http://security.debian.org/debian-security stretch/updates main contrib non-free
deb-src http://security.debian.org/debian-security stretch/updates main contrib non-free

deb http://ftp.hu.debian.org/debian/ stretch-updates main
deb-src http://ftp.hu.debian.org/debian/ stretch-updates main

deb http://neuro.debian.net/debian-devel stretch main contrib non-free
deb-src http://neuro.debian.net/debian-devel stretch main contrib non-free

Semmi trüki.

Bizonyára Te jobban otthon vagy ezekben a dolgokban, de én nem hiszem, hogy a debian-devel helyett állhatna kiscica. Az egy mappa neve a neuro.debian.net szerveren, amit Te nem nevezhetsz át tetszésed szerint, és a neve arra utal, hogy fejlesztői csomagokat tartalma.
Szerintem.

Nem tudom, Neked hogyan lett debian-devel a forrásod, én a neuro oldalon kikattintgattam, hogy hogy tudom használni a tárolót, és ott nem kínált ilyen lehetőséget.

A 9.4 pedig a fail2ban saját wiki oldaláról jön:
stable: fail2ban-0.9.4
very-stable: fail2ban-0.8.14
A debianban mégis 9.6 van, nem a 9.4. Ezt sem értem.

Hello, bocs, úgy értettem, hogy a repository karbantartója dönti el, hogy mi a könyvtár neve (pontosabban az URI része), ez lehet kiscica is. Yaroslav (ő a maintainer, és ezt a backport repot is ő viszi) így döntött.

Úgy lett debian-devel tárolóm, hogy felvettem. Te is fel tudod venni a /etc/apt/sources.list fájlba, ennek a tartalmát direkt bemásoltam.

Az általad írt 9.4 helyesen 0.9.4 - csak azért pontosítok, mert nem tudtam, hogy most f2b verzióról beszélsz, vagy a Debianról (ami amúgy 9.3 még csak), vagy miről... :).

Ha jól megnézed az általd linkelt oldal alján az utolsó frissítés dátumát: 3 July 2013, at 15:28. - ez azért már picit régen volt, szerintem ezt ne vegyük alapul. :)

A Debianban (9.3) azért van 0.9.6, mert mikor a 9-es Debiant kiadták, akkor ez volt az aktuális stable kiadás fail2ban-ból, ez Debian policy. Azóta jött ki fail2ban-ból a 0.10, ez már bent van a SID-ben, lehet, hogy a testing-ben is. Ha a testing átmegy stable-be, akkor ami épp abban az időpontban stabil verzióként szerepel csomagként, az lesz a release végéig, ahhoz csak security fixek jöhetnek (kivéve a kivételek :)). A 0.9.4 pedig dezinformáció volt.

Így ok?

Igen, pár dolog tisztább.
Azt felfogtam, hogy közvetlenül is beírhatnám a sources fájlba a debian-devel tárolót, de ezt direkt nem akartam, mivel fejlesztői csomagokat nem szeretnék használni, csak stabil csomagokat.
A neuro oldalán továbbra sem ezt a forrást ajánlják, tehát azt továbbra sem értem, hogy honnan került hozzád a tároló címe, ha a hivatalos neuro oldalon nem ezt kínálják.
Persze, lehet, itt is benéztem valami dátumot?
Bár a fail2ban oldalán lehet, hogy elavult az az oldal, amit belinkeltem, de mégiscsak az az oldal van kint hivatalosan. Ez akkor azt jelenti, hogy a fail2ban a saját wikijében sem jelenít meg valós információt? Vagyis már annyira nincs mögötte fejlesztő, hogy az oldalukon megjelenő információk valósak legyenek?
Ha beírom egyszerűen csak a https://www.fail2ban.org/ címet a böngészőbe, akkor átugrik a https://www.fail2ban.org/wiki/index.php/Main_Page oldalra, ahol szintén azt mondja, kiemelt zöld alapon, hogy
stable : fail2ban-0.9.4
És ez az oldal már 2016-os, nem 2013-as.
Akkor?
Nekem úgy tűnik, hogy a stabil verzió továbbra is a 0.9.4.
Milyen url mutatja Neked, hogy a 0.9.6 vagy azóta még magasabb verzió a stabil?

azt továbbra sem értem, hogy honnan került hozzád a tároló címe
leveleztem párszor a fail2ban Debian maintainerével, Yaroslavval (a 0.8-hoz, ami már elég régóta nem támogatott, de ez volt a 8-as Debianban, írtam IPv6 támogatást), és ő maga írta, hogy ez a backports. De ez nem DEVEL!, ez backports. Az, hogy ő így hívja, hát.... ez van :).

mégiscsak az az oldal van kint hivatalosan
ezt szerintem felejtsd el... :)

azt jelenti, hogy a fail2ban a saját wikijében sem jelenít meg valós információt?
igen, kb ezt jelenti.

Vagyis már annyira nincs mögötte fejlesztő, hogy az oldalukon megjelenő információk valósak legyenek?
lehet, ha gondolod, jelentkezz, szívesen fogadnak minden segítséget...

Milyen url mutatja Neked, hogy a 0.9.6 vagy azóta még magasabb verzió a stabil?
https://github.com/fail2ban/fail2ban/releases

Mondjuk ez alapján, és az issue-k, patch-ek alapján nem úgy tűnik, mint ami mögött nincs ember. Egy dolog, hogy a Wikivel senki nem foglalkozik. Ha ez zavar, tényleg megteheted, hgy jelentkezel doksi írásra, hidd el, örülni fognak.

Van még egy olyan verzió is, hogy csinálsz saját Debian tárolót, és fordító/devel környezetet, oda mindig felteszed az aktuális forrás stable kiadását, és onnan szeded le magadnak a csomagokat. Ellenőrzött, friss... mi kell még? :)

Ok, megértettem, hogy van ugyan oldaluk, de minek.
Elfogadom a tényt, hogy a github a hivatalos forrásuk.
Ha jó lennék fejlesztőnek, akkor ki tudnám javítani a hibájukat, de a pythonhoz lövésem sincs. Próbáltam megkeresni a bugot a forrásukban, de a hideg ráz ettől a szintaxistól ... meg kellene vele barátkoznom, de annyi erővel megírom magamnak ugyanezt a szűrést.
Összességében csak ámulva figyelek, hogy ennyien használják, gyakorlatilag alternatív szoftvere sincs, mindenki ezt nyomja, mégis ennyire bugos.
Eddig tapasztalataim alapján ez olyankor szokott előfordulni, amikor én rontok el valamit, de nagyon. Most azonban hiába keresem, nem találok hibát a konfigurációmban.
Már írtam egy külön scriptet, ami ezeket az 535-ös hibákat kigyűjti, és manuálisan hozzá bannolja a többi felismerthez, de ha az exim logokat rosszul olvassa, akkor a többi logban sem bízhatok benne.
Tehát emésztek.
Köszönöm az információkat.

Csak még egy kérdés, hogy az eredeti problémát megoldjuk: sikerült feltenni a legfrissebb verziót abból a repóból, amit írtam?

Ha igen, megoldódott a probléma?

Ha nem (oldódott meg a hiba), érdemes tenni egy próbát a legfrissebb stabil verzióval, leszedni a Githubról (nem kell csomagot csinálni, csak installáld fel).

Ha az sem segít, küldj bugreportot (a Github-on), lehet, hogy pár nap, de foglalkozni fognak vele...

Hát, beállítottam az általad megadott forrást, amit úgy aposztrofáltál, hogy ebben tárolódik a friss stabil fail2ban.
Upgradel-tem volna, de a git-et is frissíteni akarta. Nem engedtem.
Feltelepítettem csak a fail2ban-t ebből a tárolóból, de már telepítés közben azt írta ki: unstable 0.10.2-1
Erős fenntartásaim vannak azzal, hogy ez stabil csomag lenne ...
Na, de majd meglátjuk, hogyan teljesít.

Így fél nap után az új verzióval a tapasztalat:
19 IP cím helyett jelenleg 4 IP cím van blokkolás alatt.
Továbbra is csak az IP-k egy részét blokkolja.
Ma reggel 4:36-kor 30 darab próbálkozás a 75.149.71.77 IP címről.
Nem került blokkolásra, de még csak felismerésre sem. A fail2ban logja említést sem tesz róla.
A fail2-regex kimentet a 30 kísérletre:


Lines: 30 lines, 0 ignored, 30 matched, 0 missed

Vagyis mindet felismerte.

Na, ki varr erre gombot?

Akkor még egyet nézz meg. A logolást állítsd debugra (set loglevel DEBUG), és ilyen sorokat fogsz látni:


/var/log/... has been modified
Matched time template
Got time
Processing line with time
Total # of detected failures

Nézd az talált sorok időpontjait, a sorszám folytonosságát stb.

"Sorszám alatt nem tudom, mit értesz, olyan adatot nem találtam."
A "Total # of detected failures:" után következő darabszámot, annak ugye elvileg folytonosnak kell lennie.

Ilyet:


2018-02-22 12:59:19,042 fail2ban.failmanager    [2014]: DEBUG   Total # of detected failures: 3542. Current failures from 1 IPs (IP:count): 5.188.10.179:1
2018-02-22 12:59:19,066 fail2ban.failmanager    [2014]: DEBUG   Total # of detected failures: 3543. Current failures from 1 IPs (IP:count): 5.188.10.179:2
2018-02-22 12:59:20,085 fail2ban.failmanager    [2014]: DEBUG   Total # of detected failures: 3544. Current failures from 1 IPs (IP:count): 5.188.10.179:3

Nem nagyon van több tippem.

A findtime értéke által definiált időszeletben nézi a f2b hogy megvolt-e maxretry darab sikertelen login próbálkozás. Ha megvolt blokkolja a bantime-ban megadott időre az IP-t.

Ha pontosan egy nap a findtime és 4 a maxretry akkor egy napon belül 4 próbálkozás bannoláshoz kéne hogy vezessen.

Findtime növelés kéne, pld 4 napra. Mennyi a bantime?
Illetve maxretry le 3-ra.

Amit feljebb írsz hogy 16 próbálkozás 4 darab egyezést eredményezetz akkor a válasz az hogy nem érte el a nálad beállított 5 maxretry határt.

A fail2ban wikije alapján a findtime:
The counter is set to zero if no match is found within "findtime" seconds.
Vagyis nem a próbálkozások számolásához, hanem a nullázáshoz használja.
Ma például 10:14-től 10:20-ig 234 próbálkozás volt, 2-3 másodpercenként, azonos usernévvel a 180.118.242.127 IP címről.
Egy logsor ebből:


2018-02-16 10:20:29 [5077] login_server authenticator failed for (ylmf-pc) [180.118.242.127]:51152 I=[***]:25: 535 Incorrect authentication data (set_id=***)

A fail2ban logjában 0 bejegyzés tartozik ehhez az IP címhez. Nem is blokkolta.
A bantime 604800 ( 1 hét ).
A findtime értékét lecsökkentettem 21600-ra ( 6 óra ).
Eközben pedig sorban fogja meg az új próbálkozásokat is, mint amilyen a következő logsor:


2018-02-15 10:30:48 [19323] login_server authenticator failed for (vtVI8Gf362) [37.49.226.106]:59777 I=[***]:25: 535 Incorrect authentication data (set_id=***)

Az eredeti 87.98.226.111 IP címet pedig 14-e óta nem tiltotta le, és nem is került be a fail2ban logjába, pedig arról összesen 378 próbálkozás történt azonos felhasználónévvel.

Csak egy tipp. Ilyenbe még nem futottam bele.

(ylmf-pc) vs. (vtVI8Gf362)
Nem lehet, hogy az elsőben lévő - jellel van problémája?

Nekem eleve úgy van megcsinálva a dolog, hogy a log tartalmát átviszem egy másik fájlba, ahol csak az idő, az ip és a hibaüzenet van feltüntetve, azt olvasgatja a f2b.

--
openSUSE 42.2 x86_64

Ilyenkor fail2ban-regex-szel tesztelem, hogy illik-e rá a szűrő:
https://linux.die.net/man/1/fail2ban-regex
fail2ban-regex OPTIONS LOG REGEX
- rendszerint alkalmazom a még a print-all-missed és a print-all-matched opciót, ha sok a log, akkor pipe-olva a uniq-ba.

--print-all-missed
Print all missed lines
--print-all-ignored
Print all ignored lines
--print-all-matched
Print all matched lines

Érdemes még megnézni, hogy nincs-e véletlenül benne a whitelist-ban? És hogy a fail2ban mit log-ol? Mert ha azt logolja, hogy ban-olná, de már szerinte ban-olva is van és mégis tud jönni, akkor lehet, hogy az action nem jó és mégsem adja hozzá a megfelelő szabályt. És akkor ránéznék az iptables szabályokra. Illetve ipset-tel oldom meg, ezért a megfelelő ipset-et megnézem. Meg hogy a fail2ban log alapján egyáltalán felismeri-e, mint nem kívánatos tevékenység?

Üdv:
Dw.

"Jegyezze fel a vádhoz - utasította Metcalf őrnagy a tizedest, aki tudott gyorsírni. - Tiszteletlenül beszélt a feljebbvalójával, amikor nem pofázott közbe."

Na, ez egyre izgalmasabb!
A következő parancs kimente ugyanis gyakorlatilag üres volt:


fail2ban-regex --print-all-missed /var/log/exim4/main.20180216 /etc/fail2ban/filter.d/exim.conf | grep "Incorrect"

A kimenetben pedig: "Ignoreregex: 0 total" szerepel.
Vagyis a saját mintája alapján minden "Incorrect authentication data" logbejegyzést megtalált.

Egyébként sem fehérlistán nincsenek a keresett IP-k, sem a fail2ban saját logjában nem tesz róluk említést, azaz fel sem ismeri.

Én is elkezdtem gondolkozni egy saját változat elkészítésén.
[off]
Milyen érdekes, hogy még a legjobbindulatú szoftvereknek is ez a fejlődéstörténete. Kezdődik egy hasznos, jó kis funkcióval, fejlődik, egyre többet tud, és a végén már az alap funkcióit sem biztosítja stabilan ...
[/off]

Nemrég hasonlóan jártam, és már az összes létező debug módszerrel próbálkoztam sikertelenül.
A megoldás nálam az volt, hogy a fail2ban saját sqlite3 adatbázis fileját töröltem, és fail2ban restart.

Ez jó ötlet!
Kipróbáltam, és meglepve látom, hogy az újraindítás után nem olvassa újra az össze meglévő logot. Legalábbis előtte már 19 IP-t blokkolt az exim logjai alapján, utána meg csak 3-at.
Az azért a javára írható, hogy ez az új 3 IP cím nem szerepelt az előzőleg blokkolt 19 régiben.

Lehet, az egész problémának köze van a dbpurgeage paraméterhez, ami nálam szintén 1 nap volt?
Felemeltem két hétre, töröltem az adatbázist, de így sem talál meg több IP címet. Marad az új 3, a régi 19 meg feledve.
Így legalább egyre valószínűbb, hogy ez egy bug.

Én azt gondolom, hogy ha törlöd a fail2ban saját DB-jét, akkor utána amikor a logfilet újraolvassa, akkor csak az adott jailhez megadott "findtime+bantime" ideig fog visszaolvasni. Miért is olvasná vissza az egész logot restartnál, hiszen pont azért építi a saját DB-jét, hogy ezt ne kelljen megtennie. Tehát, ha a korábban talált IP-ket továbbra is bannolni szeretnéd, akkor azokat ki kell parseolni a logból, és manuálisan bannolni.