fail2ban - 'permanens' tiltás

 ( PtY | 2014. február 18., kedd - 12:37 )

A napokban felmerült, és ennek kapcsán utánanéztem, hogy lehet-e permanens tiltást csinálni.
A probléma a fail2ban alapvető viselkedéséből ered:
Leállításkor eldobja az iptables szabályokat, induláskor pedig a meglévő naplóbejegyzések alapján inicializálja magát, és építi újra a szabályokat. Ez főleg akkor probléma, ha a szükséges logok már kipörögtek, és több napos tiltásokhoz már nincs meg a szükséges bejegyzés, ami feldolgozható lenne.
A fail2ban egyébként alapból megengedi a végleges tiltást (bantime = -1), de ez mit sem ér akkor, ha a szolgáltatás újraindul. Tehát valamilyen módon el kell tárolnunk a ban-olt IP-ket, és induláskor fel kell olvasnunk, inicializáltatnunk őket.
Ezt én a következő módon oldottam meg (ssh és ssh-ddos szabályokra vonatkozóan).

Az /etc/fail2ban könyvtárba csináltam 2 fájlt:
- permanent_ssh_ban.conf
- permanent_ssh-ddos_ban.conf

Ezekbe beletettem azokat az IP-ket, amiket az 'iptables -L -n' kimenetéről az adott szabályokban kiszedtem - egy sor egy IP cím alapon, de ha szóközzel válasszuk el őket, úgy is működni fog a megoldás.

Ezt követően létrehoztam egy új action-t a /etc/fail2ban/action.d könyvtárban az iptables-multiport.conf alapján iptables-multiport-permanent.conf néven:

[Definition]

actionstart = iptables -N fail2ban-<name>
              iptables -A fail2ban-<name> -j RETURN
              iptables -I <chain> -p <protocol> -m multiport --dports <port> -j fail2ban-<name>
              for IP in $(cat /etc/fail2ban/permanent_<name>_ban.conf); do iptables -I fail2ban-<name> 1 -s $IP -j DROP; done

actionstop = iptables -D <chain> -p <protocol> -m multiport --dports <port> -j fail2ban-<name>
             iptables -F fail2ban-<name>
             iptables -X fail2ban-<name>

actioncheck = iptables -n -L <chain> | grep -q 'fail2ban-<name>[ \t]'

actionban = iptables -I fail2ban-<name> 1 -s <ip> -j DROP
            echo "<ip>" >>/etc/fail2ban/permanent_<name>_ban.conf

actionunban = iptables -D fail2ban-<name> -s <ip> -j DROP
              UNB=$(egrep -v '^<ip>$' /etc/fail2ban/permanent_<name>_ban.conf); echo "$UNB" >/etc/fail2ban/permanent_<name>_ban.conf

[Init]

name = default

port = ssh

protocol = tcp

chain = INPUT

Ezt követően az ssh és ssh-ddos jail-eket az alábbi módon konfiguráltam át:

[ssh]
enabled   = true
port      = ssh
filter    = sshd
logpath   = /var/log/auth.log
maxretry  = 3
banaction = iptables-multiport-permanent
bantime   = -1

[ssh-ddos]
enabled   = true
port      = ssh
filter    = sshd-ddos
logpath   = /var/log/auth.log
maxretry  = 3
banaction = iptables-multiport-permanent
bantime   = -1

Ezt követően, ha a fail2ban újraindul, az IP listákban szereplő címek akkor is tiltva lesznek, ha a logokból már kipörögtek. Fontos azonban tudni, hogy a bantime ilyenkor újraindul, tehát, ha a tiltás nem végleges, hanem pl. 5 napos, akkor az utolsó indítástól számított 5. nap eltelte után fog kipörögni a tiltólistáról.
Ez lehet hátrány is, ezért ezzel számolni kell!
Ami viszont pozitívum, hogy az IP listák kézzel is szerkeszthetőek, így bármikor kivehetjük róla az adott címet, és újraindíthatjuk a szolgáltatást - de arra is figyelnünk kell, hogy egy kézzel kitörölt cím visszakerülhet a listára, ha a logokból még nem pörgött ki, és a bantime még nem járt le.
Fontos még, hogy a permanent_jailnév_ban.conf fájlokat hozzuk létre előre, még ha üres is, mielőtt egy adott jail esetén használni akarjuk az iptables-multiport-permanent beállítást banaction-ként.

Használja egészséggel, aki szeretné.

Szerk: az actionban-ban volt egy hiba egy korábbi próbálkozás maradványaként...

--
PtY - www.onlinedemo.hu

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Nem ismerem az adott szoftvert, de a nevéből ítélve a permanens tiltás nem az ő feladata. Vagy leállításkor minden szabályt töröl, nem csak a sajátjait?

Csak a sajátjait.
Ellenben, ha van egy olyan szabályod, ami 1 hónapra tilt ki valamit, és újraindítod a fail2ban-t egy nap múlva, akkor a tiltás nem kerül vissza azon IP-k esetén, amelyek a logból kipörögtek.
Amúgy jó kis cucc ez, olvass utána, ha érdekel.
--
PtY - www.onlinedemo.hu

hasznos! kösz!

Tudom, en meg a shorewall-maniam, de en pont ezert szoktam shorewall-ra kotni a fail2ban -t, mert abba a f2b-tol fuggetlenul is tudok permbant rakni.
--
Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant.

+1

duplikált

Sziasztok,

tesztelem a leírást de valamiért nem gyűjti az IP-ket valamit elszúrok. Közben kapom a jelzéseket, hogy IP-ket fel kellene függeszteni.

File létrehozva: permanent_postfix_auth.conf
----

[postfix-auth]

enabled = true
filter = postfix.auth
banaction = iptables-multiport-permanent
action = sendmail-whois[name=Postfix-auth, sender=fail2ban@server.info, dest=cim@gmail.com]
logpath = /var/log/mail.log
maxretry = 3
bantime = -1

---

/etc/fail2ban/action.d/iptables-multiport-permanent.conf
---

[Definition]

actionstart = iptables -N fail2ban-
iptables -A fail2ban- -j RETURN
iptables -I -p -m multiport --dports -j fail2ban-
for IP in $(cat /etc/fail2ban/permanent__ban.conf); do iptables -I fail2ban- 1 -s $IP -j DROP; done

actionstop = iptables -D -p -m multiport --dports -j fail2ban-
iptables -F fail2ban-
iptables -X fail2ban-

actioncheck = iptables -n -L | grep -q 'fail2ban-[ \t]'

actionban = iptables -I fail2ban- 1 -s -j DROP
echo "" >>/etc/fail2ban/permanent__ban.conf

actionunban = iptables -D fail2ban- -s -j DROP
UNB=$(egrep -v '^$' /etc/fail2ban/permanent__ban.conf); echo "$UNB" >/etc/fail2ban/permanent__ban.conf

[Init]

name = default

port = ssh

protocol = tcp

chain = INPUT

---

/etc/fail2ban/filter.d/postfix-auth.conf
---

[Definition]
failregex = lost connection after AUTH from (.*)\[\]
ignoreregex =

---

Konkrétabban: mit szeretnél szűrni, és milyen irányból?
--
PtY - www.onlinedemo.hu, www.westeros.hu

Lehet nem 100%-osan értem a dolgot :) Viszont a "szűrésnél" lévő kérdésre kezdem érteni a választ.

Először is amit most látok, hogy a két .conf [ssh] és [ssh-ddos] miatt létrehozott (permanent_) fileok még üresek. Ez lehet azért is, mert nem volt ilyen támadás, vagy nem jó valami (lehet-e pl tesztelni?).

A fő problémám pedig, hogy postfix oldalról túl sok próbálkozás jön, sokszor egy-egy címről. Így arra gondoltam, hogy érdemes volna kiíratni az IP-ket illetve véglegesíteni kellene a blokkolásukat.

Ahogy nézem viszont az eredeti configot:


[Init]

name = default

port = ssh

protocol = tcp

chain = INPUT

Itt portnak az ssh van megadva. Én pedig postfixet szeretnék szűrni, azaz a támadás nem lesz azonos a portal. Akkor a kérdésem, hogy hogy lehet az általad leírt módszert univerzálisabbá tenni különböző portokra, szolgáltatásokra tenni? pl: postfix, smtp, pop3, webmin, ftp.... stb., hogy bármilyen szolgáltatásra jó legyen?

Egyrészt miért az SSH-val foglalkozol, amikor nem azon keresztül törték meg az oldalad.
Másrészt a postfixes példára próbáltam reagálni, hogy avval konkrétan mit szeretnél?
Van a gépen publikus smtp, vagy csak küldeni kell róla leveleket kifelé.
Ha nincs publikus smtp, akkor ne is legyen nyitva a 25/465/587-es port, mert minek - és akkor fail2ban sem kell.
Ha csak küldeni kell, az kimenő forgalom, amin nem tudom, mit kéne szűrni IP szinten.
Ha meg se küldeni, se fogadni nem kell semmit, akkor végképp nem értem.

Ha meg az SSH zavar, hogy nincs benne semmi, hát teszteld. Imitálj egy bahatolást, és nézd meg, mi történik.
--
PtY - www.onlinedemo.hu, www.westeros.hu