Hogyan engedélyezzük a Fail2Ban program szűrőit az ISPConfig-os szerverkörnyezetben

botond küldte be 2018. 07. 16., h - 01:41 időpontban

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:

Fail2Ban beállítása - jail.conf fájl megtekintése

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:

Fail2Ban beállítása - filter.d szűrőkönyvtár tartalma

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

Fail2Ban beállítása - /etc/fail2ban/jail.local fájl szerkesztése az egyéni beállításokhoz

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:

Fail2Ban beállítása - /etc/fail2ban/jail.local fájl kiegészítése az Apache szűrővel

És mentsük le.

 

 

Fail2Ban újraindítása

indítsuk újra a Fail2Ban daemonját az alábbi paranccsal:

service fail2ban restart

 

Figyelem!
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.