Fail2Ban – Védelem a brute-force támadások ellen

[Ezt a cikket 9 perc elolvasni.]

Ha a WordPress oldalad VPS-en vagy éppen dedikált szerveren futtatod, akkor elengedhetetlen, hogy extra erőfeszítéseket fordíts a szerver és az azon futó szolgáltatások biztonságára is. Ehhez egy igen hasznos eszköz – a mai cikkünk témája – a Fail2Ban névre hallgató program.

Az itt leírtakat csak root, azaz rendszergazdai jogosultsággal rendelkező felhasználók lesznek képesek végrehajtani, tehát ha osztott tárhelyet bérelsz, akkor sajnos nem fogod tudni követni a lépéseket (ám ilyen esetben jó esetben nincs is szükséged rájuk, mert a tárhelyszolgáltató rendszergazdája valószínűleg már konfigurált hasonló védelmi megoldásokat).

Először is nézzük meg miről is van szó pontosan. A Fail2Ban egy Linux alatt futó alkalmazás, ami a rendszer log fájljait elemzi és az ebben található információk alapján tudja felismerni és blokkolni a leggyakoribb brute-force, azaz “nyers-erő” alapú támadásokat. Ezek a támadások a kipróbálás elve alapján működnek, azaz a támadó addig próbálkozik a felhasználónév vagy jelszó véletlenszerű kombinációival, amíg sikerrel nem jár és meg nem találja a működő variációt. Természetesen ez bonyolult jelszó esetén nagyon sok időbe is telhet, de szótáras módszer és egy hétköznapi jelszó párosítása mellett másodpercek alatt is megtörténhet. A módszer viszont minden esetben sikeres lehet, ha adottak ehhez a feltételek, azaz ha végtelen próbálkozási lehetőség áll rendelkezésünkre és ez idő alatt folyamatosan elérhető marad (és válaszol) a célpont is.

A megoldás tehát egyszerű, limitálni kell a sikertelen próbálkozások számát, majd tűzfal szinten és automatikusan tiltani aki ezt túllépi. Pontosan ezeket a feladatokat hajtja végre a Fail2Ban.

Működése egyszerű. Első körben figyeli a rendszer log fájljait és megkeresi azokat a sorokat, amik a figyelt szolgáltatás sikertelen bejelentkezési kísérleteiről szólnak. Ezután ha ezek a kísérletek túllépik az általunk beállított limitet, akkor a próbálkozó IP címét átadja az operációs rendszer tűzfalának és egyúttal tiltja is, szintén az általunk megadott időre. Lehet ez néhány perc, de akár örökös tiltás is (ezt a konfigurációs fájlokban szabhatjuk testre). Ha szeretnénk még azt is beállíthatjuk, hogy tiltás esetén e-mailben értesítsen minket erről a rendszer, azonban ez nem feltétlenül ajánlott, mert gyorsan megtelhet a postafiókunk.

Vágjunk is bele, első körben telepítsük a Fail2Ban-t! A leggyakoribb Linux disztribúciók alá a következőképpen hajthatjuk ezt végre.

A Fail2Ban telepítése

Debian:

Első körben frissítsük a csomaglistát és telepítsük az esetlegesen elérhető frissítéseket:

apt-get update && apt-get upgrade -y

Majd jöhet a telepítés:

apt-get install fail2ban

CentOS

Itt is frissítünk és telepítjük az EPEL repository-t:

yum update && yum install epel-release

Jöhet a Fail2Ban telepítése:

yum install fail2ban

Indítsuk el és engedélyezzük a szolgáltatást:

systemctl start fail2ban
systemctl enable fail2ban

Fedora

Frissítünk:

dnf update

Telepítünk:

dnf install fail2ban

Engedélyezünk és indítunk:

systemctl start fail2ban
systemctl enable fail2ban

Ubuntu

Frissítés:

apt-get update && apt-get upgrade -y

Telepítés:

apt-get install fail2ban

Engedélyezzük az SSH hozzáférést az UFW tűzfalon át és bekapcsoljuk a tűzfalat:

ufw allow ssh
ufw enable

Az alap beállítások

A telepítés után természetesen nem vagyunk még készen, hiszen létre kell hoznunk egy konfigurációs fájlt ahol megadjuk, hogy mely rendszerszolgáltatások bejelentkezési kísérletei kerüljenek figyelésre, de előtte CentOS vagy Fedora használata esetén módosítanunk kell a “backend” beállítás értékét az alapértelmezett “auto”-ról “systemd”-re, ehhez szerkesszük a jail.conf fájlt (Debian és Ubuntu esetében nincs szükség erre):

nano /etc/fail2ban/jail.conf
backend = systemd

Ha már itt vagyunk érdemes lehet pár fontos alapbeállítást szemügyre venni és esetlegesen módosítani:

ignoreip = itt adhatunk a kivételekhez IP címeket (szóközzel elválasztva) vagy akár teljes tartományokat is. Ezeket nem fogja bannolni a rendszer. Érdemes felvenni ide a saját IP címünket, dinamikus IP esetén pedig a tartományt.

bantime = a tiltási időt adhatjuk itt meg. Alapértelmezetten 600s, azaz 10 perc ez az érték.

maxretry = a megengedett maximum sikertelen bejelentkezési kísérletek száma (alapértelmezetten 3).

Ezután hozzuk létre vagy szerkesszük a szabályainkat tartalmazó jail.local fájlt a következő paranccsal:

nano /etc/fail2ban/jail.local

Egy alapértelmezett web hosting környezet mellett én a következő szolgáltatásokat szoktam rögtön konfigurálni:

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

[pure-ftpd]
enabled = true
port = ftp
filter = pure-ftpd
logpath = /var/log/syslog
maxretry = 3

[dovecot]
enabled = true
filter = dovecot
logpath = /var/log/mail.log
maxretry = 5

[postfix-sasl]
enabled = true
port = smtp
filter = postfix-sasl
logpath = /var/log/mail.log
maxretry = 3

A fentiek alapján a Fail2Ban figyelni fogja az SSH és FTP bejelentkezéseket, valamint a Dovecot és Postfix e-mail küldéssel kapcsolatos naplókat is. Látható még az is, hogy a “maxretry” melletti érték adja meg a megengedett maximum hibás bejelentkezési kísérletek számát, ezt szabályonként egyénileg módosíthatjuk. Szükséges lehet még a “logpath” útvonal módosítása is, ha a te esetedben egyéb útvonalon érhetőek el a szolgáltatás log fájljai.

Természetesen a fenti szabályok csak kiindulópontnak alkalmasak hiszen operációs rendszertől és telepített szolgáltatásoktól függően eltérhetnek. Érdemes tehát ezeket a saját rendszered alkalmazásai alapján egyénileg testreszabni. A felhasználható szűrési szabályokat ki tudod puskázni a jail.conf fájlból is, így könnyedén össze lehet ollózni a saját jail.local fájlodat (csak ne felejtsd el a kimásolt szabály “enabled” értékét “false”-ról “true”-ra állítani).

Tartsd észben, hogy minden jail.local fájlban történt változtatás után újra kell indítani a Fail2Ban service-t a következő paranccsal:

service fail2ban restart (Debian és Ubuntu esetén)
systemctl restart fail2ban (Egyéb disztribúciók esetén)

Ha végeztél a szűrők beállításával, akkor a “fail2ban-client status” paranccsal tudod lekérdezni az aktív filtereket. Ha mind megjelenik a kimeneti listában, akkor nem hibáztál nagy valószínűséggel.

Brute-force védelem WordPress oldalunk számára a Fail2ban segítségével

Természetesen nem csak rendszerszolgáltatások bejelentkezési kísérleteinek monitorozására használható a Fail2Ban, hanem nagyon szépen be tud épülni a WordPress-be is, ezáltal képes szűrni és tiltani az összes brute-force alapú login támadást (beleértve az XML-RPC-n keresztüli próbálkozásokat is).

Ennek az aktiválásához először is telepítsük és aktiváljuk a WPFail2Ban bővítményt. Beállításai nincsenek, elég engedélyezni és már teszi is a dolgát ha a következő lépéseket helyesen hajtjuk végre.

A bővítmény könyvtárában (/wp-content/plugins/wp-fail2ban) találunk egy “filters.d” mappát, ebben pedig két fájlt (“wordpress-hard.conf” valamint “wordpress-soft.conf”). Ezt a két fájlt másoljuk be a “/etc/fail2ban/filter.d” könyvtárba és adjuk hozzá a jail.local fájlunkhoz a következő sorokat:

[wordpress-hard]
enabled = true
filter = wordpress-hard
logpath = /var/log/auth.log
maxretry = 1
port = http,https

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

Ezzel készen is volnánk, a plugin naplózza az esetleges támadási kísérleteket az auth.log fájlba, a hozzáadott szűrők pedig gondoskodnak a tiltásokról. A wordpress-hard.conf fájl tartalmazza a szinte minden esetben kártékony feltörési típusokat, a wordpress-soft.conf pedig az enyhébb eseteket kezeli (például a hibás bejelentkezési kísérletek).

Ha nagyon alapos szeretnél lenni, akkor érdemes átböngészned a wp-config.php-hez hozzáadható egyéb konstansokat is, amik további védelmi szintekkel tudják kiegészíteni a weboldalad biztonságát.

Érdemes tehát hadba fogni a Fail2Ban-t és védeni vele magát a szervert és az azon hosztolt WordPress oldalt/oldalakat is. Azon az elven logikus elindulni, hogy ha bármi olyan külvilág felé is nyitott szolgáltatást használsz, ahol lehetőség van bejelentkezésre, akkor ott korlátozni is kell a sikertelen belépési próbálkozások számát. Ugyanez igaz a publikus és közismert portokra is. Ha a szervereden fut FTP szolgáltatás az alapértelmezett 21-es porton, akkor mindenképpen adj hozzá egy erre vonatkozó szabályt a jail.local fájlodhoz, hogy senki se tudjon vég nélküli brute-force támadásokkal bombázni.

Megjegyzésre érdemes információ még, hogy egy jól és okosan beállított brute-force védelem mellett jelentősen csökkenhet a szerver általános terheltsége is (főleg akkor, ha rád talál például egy botnet), de a legnagyobb előnye mégis a megnövelt biztonság irányába tett újabb sikeres lépés.

Ha tetszik, mutasd meg másoknak is: