Tartalom
Bevezető
A Fail2Ban egy nagyon hatékony védelmi program, amivel könnyen elháríthatjuk, blokkolhatjuk a rosszindulatú próbálkozásokat szerverünkről.
A rendszer sok szűrőt tartalmaz alapból, de csak néhány kerül bekapcsolásra a program telepítésekor. Engedélyezésükkel például az Apache-on keresztül történő próbálkozásokat is könnyedén kivédhetjük. Ebben a leírásban a már korábban összeállított tökéletes szerver környezetünkben fogjuk engedélyezni a Fail2Ban program Apache szűrőjét.
Jail-ok, szűrők
Alapértelmezett beállítások a jail.conf fájlban
A program a /etc/fail2ban/jail.conf fájlban tárolja az alapértelmezett szűrőit. Itt láthatjuk is az Apache szekciót, ahol bent vannak ugyan a Jail-ok, viszont nincsenek engedélyezve:
A képen láthatunk több Apache Jail-t is (apache, apache-multiport, apache-noscript, stb). Mindegyik beállítás más-más támadási típusra kínál szűrési megoldást.
Szűrők a filter.d könyvtárban
Ha követjük az adott beállítás szűrőfájlját, amik a /etc/fail2ban/filter.d könyvtárban találhatók:
Akkor itt láthatjuk, hogy van benne jelen pillanatban 59 darab szűrőfájl. Ezek tartalmazzák a szűrési mintákat, és még egyéb beállításokat az adott Jail-al kapcsolatban. Ezeken kívül még létrehozhatók egyéni szűrők is, amik a saját igényeknek jobban megfelelnek.
Apache szűrő
Nézzünk bele az Apache Jail beállításnál lévő "apache-auth" szűrőbe:
nano /etc/fail2ban/filter.d/apache-auth.conf
# Fail2Ban apache-auth filter # [INCLUDES] # Read common prefixes. If any customizations available -- read them from # apache-common.local before = apache-common.conf [Definition] failregex = ^%(_apache_error_client)s (AH01797: )?client denied by server configuration: (uri )?\S*(, referer: \S+)?\s*$ ^%(_apache_error_client)s (AH01617: )?user .*? authentication failure for "\S*": Password Mismatch(, referer: \S+)?$ ^%(_apache_error_client)s (AH01618: )?user .*? not found(: )?\S*(, referer: \S+)?\s*$ ^%(_apache_error_client)s (AH01614: )?client used wrong authentication scheme: \S*(, referer: \S+)?\s*$ ^%(_apache_error_client)s (AH\d+: )?Authorization of user \S+ to access \S* failed, reason: .*$ ^%(_apache_error_client)s (AH0179[24]: )?(Digest: )?user .*?: password mismatch: \S*(, referer: \S+)?\s*$ ^%(_apache_error_client)s (AH0179[01]: |Digest: )user `.*?' in realm `.+' (not found|denied by provider): \S*(, referer: \S+)?\s*$ ^%(_apache_error_client)s (AH01631: )?user .*?: authorization failure for "\S*":(, referer: \S+)?\s*$ ^%(_apache_error_client)s (AH01775: )?(Digest: )?invalid nonce .* received - length is not \S+(, referer: \S+)?\s*$ ^%(_apache_error_client)s (AH01788: )?(Digest: )?realm mismatch - got `.*?' but expected `.+'(, referer: \S+)?\s*$ ^%(_apache_error_client)s (AH01789: )?(Digest: )?unknown algorithm `.*?' received: \S*(, referer: \S+)?\s*$ ^%(_apache_error_client)s (AH01793: )?invalid qop `.*?' received: \S*(, referer: \S+)?\s*$ ^%(_apache_error_client)s (AH01777: )?(Digest: )?invalid nonce .*? received - user attempted time travel(, referer: \S+)?\s*$ ignoreregex = [...]
Itt láthatjuk a reguláris kifejezéseket, amiket ez a szűrő keres. Az első három szűrősor kapásból hasznos dolgokat figyel: Az első például a .htaccess-ekben vagy virtualhostokban letiltott könyvtárakba lépési kísérleteteket figyeli, az utána következő kettő sor pedig az alap HTTP hitelesítést kérő könyvtárakba lépési kísérleteket figyeli, amikor rossz felhasználónevet/jelszót adnak meg. Ezek a gyakoribb esetek, de az alatta lévő szűrések is jól jönnek ritkább esetekben.
Ezekben a szűrőfájlokban tehát meg tudjuk nézni hogy milyen hibaüzeneteket keres az adott szűrő, és igény szerint alkalmazhatjuk őket, ha a log fájljainkban sok ilyen hibaüzenetet látunk.
Akkor hasznosak igazán ezek a szűrések, amikor például ismertebb, nyílt forráskódú CMS rendszerre épülő weboldalt üzemeltetünk, ahol a támadók/próbálkozók már rutinosabban érkeznek, és próbálgatják az ismertebb hiányosságokat, gyengébb pontokat.
Én most ezt az Apache szűrőt választom ki ebben a mai példában, mert a saját gyakorlatból kiindulva ezen a Drupal rendszerű oldalon is több jellegzetes hibaüzenettel találkoztam a fentiek közül, amíg be nem kapcsoltam ezt a Jail-t.
Egyéni szűrő létrehozása és konfigurálása a jail.local fájlban
A feladat tehát egyszerű, kapcsoljuk be ezt a szűrőt. Ezt megtehetnénk a fent megtekintett jail.conf fájlban is, de a program készítői gondoskodtak arról, hogy ne kelljen belepiszkálni a gyári beállításokba, hanem helyette az erre a célra szolgáló helyi felülírófájlban (jail.local) végezhetjük el az egyéni beállításainkat.
Ennek megfelelően root-ként lépjünk be és nyissuk meg a /etc/fail2ban/jail.local fájlt:
nano /etc/fail2ban/jail.local
A fájlban találunk három szűrő beállítást, pontosan azokat, amiket a tökéletes szerver összeállításakor beletettünk: pureftpd, dovecot-pop3imap és postfix-sasl. Ezeket egészítjük most ki az Apache szűrőnkkel.
A jail.conf fájlból is kimásolhatjuk az apache beállításait mintának, amit aztán átalakítunk, hogy az ISPConfig rendszere alatt tudjon működni. Az eredeti beállítások tehát ezek:
[apache] enabled = false port = http,https filter = apache-auth logpath = /var/log/apache*/*error.log maxretry = 6
És a módosítások után pedig így néz ki:
[apache] enabled = true port = http,https filter = apache-auth # logpath = /var/log/apache*/*error.log logpath = /var/log/ispconfig/httpd/*/error.log findtime = 3600 maxretry = 3 bantime = 86400
A következők kerültek tehát változtatásra:
- enabled: true: Ezzel engedélyezzük a szűrőt
- logpath: Itt átváltoztattuk az Apache log fájl elérési útvonalát, mivel az ISPConfig a /var/log/ispconfig/httpd/<domainnév>/error.log útvonalain tárolja a weboldalak Apache hibanapló fájljait.
Ezzel tehát a szerveren lévő összes weboldal hibanaplóját szűri egyszerre.
(Az eredetit én csak kikommenteztem, de ki is vehető.) - findtime: Itt beállítjuk, hogy 3600 másodperces időszeletet figyeljen
- maxretry: Itt pedig én szigorúbbra állítottam, maximum 3 újrapróbálkozást enged meg tiltás előtt (így összesen 4x lehet próbálkozni)
- bantime: Ezt is szigorúbbra állítottam. Az alap 600 másodpercet én ebben a szűrőben feljebbtoltam egy napra, pihenjen csak az IP cím egy napig, amelyik próbálkozik.
A módosított változatot adjuk a jail.local fájl végéhez:
És mentsük le.
Fail2Ban újraindítása
indítsuk újra a Fail2Ban daemonját az alábbi paranccsal:
service fail2ban restart
A jail.local fájlban a logpath-nál megadott útvonalon léteznie kell a fájlnak, különben a fail2ban nem fog újraindulni! Hibát ugyan nem jelez ilyenkor, de nem indul újra. Csak a lenti állapot lekérésnél vehető észre hogy nem fut a daemonja.
Így tehát ha egy üres szerveren kísérletezünk, amin még nincs létrehozva egyetlen webfiók sem, akkor gondoskodni kell róla, hogy a megfelelő helyen legyen egy error.log fájl.
Üres ISPConfig-os környezetben ezt úgy tudjuk orvosolni, hogy a következő paranccsal létrehozunk egy üres fájlt:
touch /var/log/ispconfig/httpd/<szervernév>/error.log
A /var/log/ispconfig/httpd/ könyvátrban alapállapotban van egy könyvtár, ami a szerver nevét viseli. Majd itt jönnek létre a további alkönyvtárak is a létrehozott weboldalak domain neveivel, amikben már lesznek error.log fájlok.
Ezzel készen is vagyunk, a rendszer mostantól figyeli, szűri, tiltja a fenti szűrőben megadott hibákat.
Ellenőrzés, tesztelés
A következő paranccsal pedig figyelni tudjuk, hogy éppen mit fogott a Fail2Ban:
fail2ban-client status apache
És a kimenete, amikor még nem volt tiltás:
Status for the jail: apache |- filter | |- File list: /var/log/ispconfig/httpd/szerver1.linuxportal.info/error.log | |- Currently failed: 0 | `- Total failed: 0 `- action |- Currently banned: 0 | `- IP list: `- Total banned: 0
Valamint a Fail2Ban teljes szűrőtesztjét ezzel a paranccsal tekinthetjük meg (hibakeresésekhez, stb):
fail2ban-client -d
A Fail2Ban naplója itt tekinthető meg: /var/log/fail2ban.log, amiben részletesen látható a rendszer leállása/elindulása, valamint a blokkolt és feloldott IP címek is itt kerülnek rögzítésre.
Konklúzió
Ezzel a Fail2Ban beállítással fel tudjuk venni a versenyt a támadókkal, akik az Apache-on keresztül próbálkoznak, így hatékonyabban tudjuk védeni szerverünket. Ezenkívül a program a szerver sok más területén is tud védelmet nyújtani ahol az adott hálózati szolgáltatás naplófájl alapon rögzíti az eseményeket.
- Enciklopédia - Fail2Ban
- Fail2Ban (manual oldal)
- Hogyan oldjuk fel blokkolt IP címünket, ha kitiltottuk magunkat szerverünk valamelyik szolgáltatásából
- SSH védelem erősítése további Fail2Ban szűrőmintával a Debian 8 (Jessie) rendszeren
- Hogyan tartsuk távol szerverünk weboldalaitól a nem kívánatos robotokat
- Hogyan védekezzünk az "Access denied for user root@ip-cím (using password: YES/NO)" típusú adatbázis kiszolgálónkat érő támadásokkal szemben a Fail2Ban segítségével
- Mit tegyünk, ha a Matomo webanalitikai rendszerünk "AH01630: client denied by server configuration" típusú Apache hibákat generál, ami miatt a Fail2Ban letiltja az IP-címünket?
- Hogyan védekezzünk a nagy mennyiségben érkező 404 vagy egyéb 4xx HTTP hibakódokat eredményező támadásokkal szemben Fail2Ban segítségével
- Tökéletes szerver: Debian 8 (Jessie) V1.0
- Tökéletes szerver: Debian 9 (Stretch) V1.0
- Tökéletes szerver: Debian 10 (Buster) V1.0
- A hozzászóláshoz regisztráció és bejelentkezés szükséges
- 703 megtekintés