UFW tűzfal telepítése, alapvető beállítása és használata Debian / Ubuntu rendszereken

botond küldte be 2022. 06. 27., h – 12:54 időpontban

Tartalom

 

Bevezető

Az UFW (Uncomplicated Firewall) egy könnyen használható netfilter tűzfal kezelésére szolgáló program. Parancssori felületet használ, amely kevés egyszerű parancsból áll, és az iptables-t használja a konfigurációhoz, tehát az iptables frontend-je. Az UFW tűzfal az Ubuntu rendszerekben a 8.04 LTS kiadás óta alapértelmezetten elérhető, a Debian rendszerekben telepíteni kell.

Ebben a leírásban megnézzük az UFW tűzfal telepítését és alapvető használatát, beállításait, aminek a lépéseit én egy Debian 11 minimális szerveren fogom elvégezni.

 

 

Telepítés

Az UFW tűzfal az Ubuntu rendszereken a 8.04 LTS kiadás óta alapértelmezetten telepítve van, Debian rendszereken telepítsük az ufw csomagot root-ként:

apt-get install ufw

 

Használat

Az UFW tűzfalat az ufw parancs segítségével kezelhetjük amihez root jogosultság szükséges, így tehát a továbbiakban root-ként folytassuk.

Állapot kezelese

A tűzfal alapértelmezetten inaktív állapotban van, állapotát az alábbi paranccsal kérdezhetjük le:

ufw status

UFW tűzfal állapot lekérdezése

Inaktív állapotában nem jelenít meg több információt az állapotáról, ehhez be kell kapcsolni. Bekapcsolását az enable opcióval végezhetjük:

ufw enable

UFW tűzfal bekapcsolása - illetve mégsem

Mivel még nincs beállítva egyetlen tűzfal szabály sem, ezért ilyenkor jelzi hogy az engedélyezés megszakíthatja a jelenlegi SSH kapcsolatot, és megkérdi, hogy ennek ellenére folytatjuk-e. Itt egyelőre válasszuk az "n" opciót, tehát még ne kapcsoljuk be, előbb még beállítjuk.

A tűzfalat bekapcsolt állapotában disable opcióval bármikor kikapcsolhatjuk:

ufw disable

Alkalmazásprofilok

Az UFW tűzfal lehetőséget biztosít az úgynevezett alkalmazásprofilok vagy alkalmazásszűrők használatára, amelyek lényegében előre tárolt profilok, amik tartalmazzák a szolgáltatás nevét, rövid leírását, valamint a megnyitandó portokat és protokollokat. Ezeknek az alkalmazásprofiloknak egy része alapértelmezetten a programcsomaggal érkezik, más része pedig akkor jön létre, amikor egy UFW által védendő program telepítésre kerül, ekkor az adott program telepítője hozza létre a saját alkalmazásprofilját az UFW-ben.

Az alkalmazásprofilokat az alábbi paranccsal kérdezhetjük le:

ufw app list

UFW tűzfal - Alkalmazásszűrők listázása

Itt tehát láthatunk jónéhány előre beállított alkalmazásprofilt a különböző szolgáltatásokhoz. Ez Linux disztribúciónként eltérhet, hogy a szoftvercsomagban mely szolgáltatásokhoz készítenek előre beállításokat.

A profilok fizikailag a /etc/ufw/applications.d/ könyvtárban foglalnak helyet. Ha belenézünk néhányba, akkor láthatjuk a felépítésüket:

UFW tűzfal - Alkalmazásszűrő fájlok megtekintése

Itt van több fájl, amik jelenleg egy kivételével mind "ufw-" vel kezdődnek. A fájlok dátumaiból is jól látszik, hogy ezek nagyjából egy időben jöttek létre. Ezek a szűrőprofilok tehát az UFW szoftvercsomag alap részeiként kerültek ide. Az egy darab kivétel, az openssh-server nevű fájl pedig a minimális szerverre telepített openssh-server csomagból került ide, mivel a csomag tartalmazta az UFW profilt is. Ha olyan csomagokat telepítünk a későbbiekben, amik szintén tartalmaznak UFW alkalmazás profilokat, akkor azok ide fognak kerülni. Például az Apache webkiszolgáló telepítése esetén is létrejön itt egy fájl az Apache számára.

Ezek egyszerű szövegfájlok, amelyekben egy vagy több szűrő kaphat helyet, így tematikusan lehet őket csoportosítani funkcionalitásaik alapján. A szűrő a szögletes zárójelben lévő címkével kezdődik - ami a listázás során megjelenik -, valamint tartalmazza a megnevezését, leírását, majd alatta a portok számát, illetve a portok típusát (tcp vagy udp).

Az UFW alkalmazásprofilok információit lekérhetjük anélkül is, hogy meg kellene nyitnunk a hozzá tartozó fájlt. Például az OpenSSH alkalmazás információit lekérhetjük az alábbi módon:

ufw app info OpenSSH

UFW tűzfal - Alkalmazás információk lekérdezése

Profile: OpenSSH
Title: Secure shell server, an rshd replacement
Description: OpenSSH is a free implementation of the Secure Shell protocol.

Port:
  22/tcp

Itt láthatjuk, hogy az "OpenSSH" alkalmazás profilja a 22-es TCP portot tartalmazza, ami alapértelmezetten az SSH kiszolgáló portja.

Az alkalmazásszűrők, vagy alkalmazásprofilok tehát kényelmi célokat szolgálnak, melyeknek segítségével egyszerűen tudjuk alakítani a tűzfal szabályainkat anélkül, hogy fejből ismernünk kellene a levédeni kívánt szolgáltatások portszámát.

Ezen a minimális szerveren a fentiek közül csak az SSH kiszolgáló van telepítve, ezért ebben a leírásban csak ezzel mutatok be példákat, de természetesen bármilyen más szolgáltatás is levédhető, ami elérhető a gépen.

 

 

Tűzfalszabályok

Mint más tűzfalaknál is, így az UFW esetében is a tűzfalszabályok "keltik életre" a biztonságot. A tűzfalszabályok tartalmazzák, hogy mit tegyen a tűzfal a szabályban meghatározott porttal: engedélyezze-e a rajta keresztül érkező csomagokat, vagy letiltsa.

Az UFW tűzfal alapértelmezetten úgy van beállítva, hogy ha szabályok kézi beállítása nélkül kerül aktiválásra, akkor minden bejövő kapcsolatot letilt, és minden kimenő kapcsolatot engedélyez.

Szabálykészletek és kiértékelési sorrendjük

Az UFW háromszintű szabálykészletet használ, amelyet kétszer három konfigurációs fájl tárol a /etc/ufw/ könyvtárban (a fájlduplikáció csak az IPv4 és IPv6 hálózatok kezelésének megkülönböztetése miatt van). Ezek az alábbi sorrendben kerülnek beolvasásra és kiértékelésre:

  1. before.rules és before6.rules: az első az IPv4, míg a második fájl az IPv6 hálózatokra illeszkedik. Ezek kerülnek kiértékelésre először.
  2. user.rules és user6.rules: Itt is IPv4 és IPv6 hálózatokra illesztett szabálykészletek kerülnek tárolásra. Ezekbe a fájlokba kerülnek bele a felhasználó által létrehozott (pl a parancssorból) tűzfalszabályok. Tehát ez a szabálykészlet értékelődik ki másodjára.
  3. after.rules és after6.rules: végül pedig ezek a fájlok kerülnek kiértékelésre szintén IPv4 vagy IPv6 hálózatnak megfelelően.

Ha belenézünk ezekbe a fájlokba, akkor az iptables parancs számára előkészített paramétereket fogunk benne látni, mivel az UFW a háttérben az iptables tűzfalat kezeli. Mindezek közül majd a felhasználói szabálykészletet tartalmazó fájlokat fogjuk megnézni, mindössze csak érdekességképpen.

Irányelvek / házirendek

Az UFW négyféle irányelvet / házirendet különböztet meg:

  • allow: ilyenkor az UFW átengedi a megadott porton a csomagokat
  • deny: "tiltás", ilyenkor letiltja a csomagokat, és úgy tesz, mintha nem venne róluk tudomást, azaz a küldő nem fog választ kapni, így nem fogja tudni, hogy a csomagja egyáltalán célba ért-e, vagy el sem jutott a kiszolgálóig. Biztonsági szempontból ez előnyösebb, mivel ha nem érkezik válasz a feladónak, akkor az időtúllépésre kényszeríti annak a kapcsolatát, így egy potenciális támadó esetén lelassítja a támadás folyamatát (pl. brute force támadások), vagy szimplán elhiheti a támadó, hogy nem is létezik a támadott szolgáltatás, így hamarabb felhagy a támadással. Valamint ez az opció egy kis sávszélességet is megtakarít, mivel nem küld vissza hibacsomagot a feladónak. Ez fontos lehet az aszimmetrikus hálózati kapcsolatoknál, ahol a DDoS támadás egyszerűen telítheti a felfelé irányuló kapcsolatot a hibacsomagokkal.
  • reject: "visszautasítás", Ilyenkor is letiltja a csomagokat, annyi különbséggel, hogy ebben az esetben a tűzfal visszaküld egy hibacsomagot, ami tartalmazza, hogy a korábban küldött csomag vissza lett utasítva, tehát hogy le van tiltva az adott port (vagy akár a küldő IP-címe). Ez akkor lehet hasznos, ha szükséges tudatni a küldővel, hogy nem átmeneti hálózati vagy egyéb hiba következtében nem érnek célba a csomagok, hanem tudatos döntésről van szó.
  • limit: A limit esetén a tűzfal csak korlátozottan engedi a csomagforgalmat a szabályban meghatározott portokon. Ez azt jelenti, hogy megadható olyan tiltás is, ami egy adott IP-címről 30 másodpercen belül 6-nál több kapcsolatot próbál megnyitni egy adott alkalmazáshoz. Ez az opció nagyon hasznos az olyan alkalmazásoknál, mint például az sshd, mivel ezek a szolgáltatások botoknak és más rosszindulatú felhasználók támadásainak vannak kitéve. A limit  beállítással tehát "brute-force" típusú támadások ellen védekezhetünk hatékonyan.

 

Szabályok létrehozása és a tűzfal engedélyezése

A tűzfalszabályok az alábbi szintaktikával hozhatók létre:

ufw [--dry-run] [delete]  [insert  NUM]  [prepend]  allow|deny|reject|limit  [in|out] [log|log-all] [ PORT[/PROTOCOL] | APPNAME ] [comment COMMENT]

Ennek megfelelően hozzunk létre egy szabályt, amiben engedélyezzük az SSH belépést. Első körben csak simán engedélyezzük az alkalmazás profiljának segítségével:

ufw allow in OpenSSH

Ezután már engedélyezhetjük az egész tűzfalat, mert nem fog kitiltani:

ufw enable

Itt újból felteszi a kérdést:

Command may disrupt existing ssh connections. Proceed with operation (y|n)?

Itt válasszunk "y" opciót.

Végül kérjük le a friss állapotot:

ufw status

UFW tűzfal szabály létrehozása és tűzfal bekapcsolása

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)

Itt tehát láthatjuk, hogy az IPv4 és az IPv6 hálózat számára is bekerül a szabály. Innentől már az SSH kapcsolódás engedélyezve van a 22-es tcp porton, ahogy fentebb láthattuk ennek az alkalmazásnak az infójában is. Továbbá a From oszlopban az "Anywhere" jelzi, hogy nincs IP-cím sem listázva, tehát a kapcsolódás bárhonnan megtörténhet.

A példa kedvéért most állítsuk be kézzel a 22-es TCP portot "limit" beállítással:

ufw limit 22/tcp

UFW tűzfal - Tűzfal szabály létrehozása - Port kézi beállítása limit módban

Persze a kettőnek együtt így nincs értelme, ezért valamelyiket törölni kell.

Szabályok törlése

Tűzfal szabályokat kétféleképpen is törölhetünk. Az egyik módszer, ha kiadjuk az alábbi parancsot amivel - a saját példánknál maradva - töröljük az először beállított szabályt:

ufw delete allow in OpenSSH

UFW tűzfalszabály törlése - Pontos megnevezéssel

Ilyenkor tehát az ufw delete után pontosan ugyanazt a szabályt kell megadnunk, mint amit felvittünk előtte. Ha talál egyező szabályt, akkor törli. Ez macerás lehet, ha több paraméterből álló szabályt hoztunk létre, ami IP-címet és egyebeket is tartalmaz, ezért van egy másik lehetőség is.

Közben újból felvittem a korábbi szabályt, hogy tudjam törölni a másik módszerrel:

ufw allow in OpenSSH

Ezután lekérjük az állapotot:

ufw status

Itt most helyet cseréltek a szabályok, mivel utólag vittem fel az alkalmazás profil alapján.

És most jön a másik módszer lényege, hogy az állapot lekérés parancsát kiegészítjük egy "numbered" szóval:

ufw status numbered

És így már a sorszámok alapján is tudjuk törölni, majd ismét állapot lekérdezés:

ufw delete 4
ufw delete 2
ufw status

UFW tűzfalszabály törlése - Sorszámmal

Ha több szabályt törlünk, akkor arra figyeljünk, hogy a törlés után csúsznak a sorszámok, tehát ilyenkor visszafelé haladjunk, hogy a kisebb sorszámok közben ne változzanak.

 

 

IP-címek kezelése

Lehetőség van IP-címek kezelésére is, ahol IP-címek alapján tiltjuk (fekete lista) vagy engedélyezzük (fehér lista) a forgalmat a különböző alkalmazásokhoz, szolgáltatásokhoz. Erre nézzünk egy példát (korábbi tűzfalszabályok nélkül, tiszta lappal indulva):

ufw allow in from 192.168.1.100 to any app OpenSSH

vagy ha nem alkalmazás profilokkal szeretnénk dolgozni, hanem kimondottan portokkal és protokollokkal, akkor:

ufw allow in from 192.168.1.100 proto tcp to any port 22

UFW tűzfalszabály létrehozása IP-cím alapján

A parancs szintaktikája enged némi rugalmasságot, ezért a paramétereket a akár fel is cserélhetjük. Így tehát például az iménti tűzfalszabály az alábbi módon is létrehozható:

ufw allow in from 192.168.1.100 to any port 22 proto tcp

Ahol előre hozhatjuk a from-to IP-cím kezelő részeket, és hátracsoportosíthatjuk a portot és a protokollt meghatározó paramétereket. Ezek alapján ha esetleg hosszabb, összetettebb tűzfalszabályokkal van dolgunk, akkor logikailag át is rendezhetjük az argumentumokat, hogy áttekinthetőbbek maradjanak a parancsaink, főleg ha script-ekben hajtjuk végre őket. Természetesen ezzel kapcsolatban tájékozódjunk az ufw parancs manual oldalán a részletekért.

 

Itt tehát láthatjuk, hogy üres tűzfalszabály listával indulva létrehozzuk először az OpenSSH alkalmazás profil segítségével a szabályt, majd utána direkt protokoll és port megadásával is.

 

Természetesen ennek a kettőnek együtt itt sincs értelme, hanem elég lenne egy is a kettő közül - mivel mindkét szabály ugyanazt a funkciót látja el -, csak a példa kedvéért mutattam be, hogy akár alkalmazás profilokkal vagy egyedi portokkal is dolgozhatunk, ahogy éppen a helyzet megkívánja. Például ha nem az alapértelmezett 22-es portot használjuk az SSH kapcsolódásokra, hanem átállítottuk egy egyedi portra, akkor lehet ilyenre szükség.
A példában lévő IP-cím a belső hálózatomon lévő Windowsos asztali gépem címe, amiről csatlakozom a másik, Debian 10-es gépemen keresztül a Debian 11-es virtuális gépre. Ennek lejjebb lesz majd jelentősége. Az IP-címek megadhatók CIDR (Classless Inter-Domain Routing) formában is, tehát például:
"192.168.1.0/24" ami megegyezik a 192.168.1.0-192.168.1.255 tartománnyal, amennyiben például hivatkozni szeretnénk az összes belső címünkre.

Ha felvittük az IP-címre korlátozott "allow" szabályt, akkor utána ha másik IP-címről próbálkozunk, akkor:

UFW tűzfal nem enged be az érvényben lévő "deny" irányelv miatt

Nem enged be. A példában a laptopomról próbálkoztam, aminek természetesen másik IP-címe van a belső hálózatomon.

További érdekesség, hogy ahogy már fentebb is említettem: alapból, ha nem rendelkezik másképp egy tűzfalszabály, akkor tiltás van érvényben, és azon belül is a "deny" irányelv működik, ami nem ad semmilyen választ a kliensnek, hanem az egy időután időtúllépés miatt megszakítja a kapcsolatot.

Mindeközben a korábbi ablakomban kilépve és újra belépve látható, hogy a szabályban meghatározott IP-címről továbbra is beengedi a kapcsolódást a 22-es tcp porton:

Az UFW tűzfal beengedi a szabályban meghatározott IP-címről a kérést

Az alternatív "reject" tiltási irányelv eltérő működésének vizsgálata

Ezek után még kipróbáljuk a "reject" irányelvet is, és megnézzük hogyan viselkedik a rendszer, ha nem az alapértelmezett (vagy akár tűzfalszabályban beállított) "deny" tiltó irányelvet használjuk. Hozzuk létre az alábbi egyszerű reject szabályt, ami általánosan visszautasít minden OpenSSH kapcsolatot, majd nézzük meg újra az állapotot:

ufw reject in OpenSSH
ufw status

Reject szabály létrehozása

Ezután ha megpróbálunk ismét belépni a másik IP-címmel működő helyről, akkor már a "Connection refused" hibaüzenetet kapjuk:

A reject direktíva használata a "Connection refused" hibaüzenetet eredményezi

Amit természetesen egyből megkap a kliens, így nem időtúllépés miatt fog megszakadni a kapcsolat, hanem egy konkrét visszautasítási válasz miatt.

Ez lenne tehát a különbség a "deny" és a "reject" irányelvek tiltó hatása között.

Természetesen ez idő alatt továbbra is be lehet lépni a korábbi "allow" szabályban meghatározott IP-cím(ek)ről, mivel az a szabály kivételt képez a tiltás alól.

 

 

Naplózás

Az UFW tűzfal rendelkezik saját naplózási rendszerrel is, így nyomon tudjuk követni a működését, amiről érdemes még néhány mondatot ejteni.

A naplózás aktuális szintjét a status opció verbose módjával tudjuk lekérdezni:

ufw status verbose

ami alapértelmezetten be van kapcsolva, de alacsony szintűre van állítva "Logging: on (low)":

Az UFW tűzfal bőbeszédű (verbose) állapotának lekérdezése a naplózás szintjének megjelenítéséhez

A naplózásnak 5-féle szintje van, ezek az alábbiak:

  1. Off: A naplózás kikapcsolva
  2. On (low): (alapértelmezett) A meghatározott házirendek szerint naplózza az összes blokkolt vagy engedélyezett csomagot
  3. On (medium): Ugyanaz, mint az előző, és ezen felül olyan csomagokat is naplóz, amelyek nem egyeznek a házirendekkel.
  4. On (high): Naplózza az összes korlátozásos és korlátozás nélküli kapcsolódásokat is (rate limiting).
  5. On (full): Minden csomagot naplóz

A naplózás szintje globálisan is beállítható, amit a fentebbi képen is lekérdeztünk, valamint tűzfalszabályonként is megadható.

Globális beállítás

A globális beállítás az alábbi paranccsal működik, ahol például teljes naplózásra állítjuk az UFW tűzfalat:

ufw logging full

UFW tűzfal globális naplózási szintjének beállítása

Ezzel beállítottuk az egész tűzfalra vonatkozóan, hogy minden csomagot naplózzon.

Szabályszintű beállítás

Beállíthatunk szabályhoz kötött naplózási szintet is, amelyet a szabály létrehozásakor kell megadni. Ilyenkor viszont csak a "log" és a "log-all" szinteket választhatjuk. Például:

ufw allow in log from 192.168.1.1/24 to any app OpenSSH
ufw allow in log-all from 192.168.1.1/24 to any app OpenSSH

UFW tűzfal szabályszintű naplózás beállítása

Ilyenkor az első, "log" beállítás annyit csinál, hogy a szabályra illeszkedő új kapcsolódásokat naplózza, a "log-all" beállítás pedig minden kapcsolódást naplóz, ami illeszkedik a tűzfalszabályra, tehát a már esetlegesen korábban kapcsolódott kliensek csomagjait is naplózza.

Naplófájlok értelmezése

Az UFW tűzfal saját naplófájlja a /var/log/ufw.log útvonalon található. Nézzünk bele egy kicsit nagyobbra nyitott ablakkal a végébe:

cat /var/log/ufw.log | tail -30

UFW tűzfal naplófájl megtekintése

[...]
Jun 26 18:02:40 debian11 kernel: [ 6149.284717] [UFW AUDIT] IN= OUT=enp0s3 SRC=192.168.1.140 DST=192.168.1.100 LEN=96 TOS=0x10 PREC=0x00 TTL=64 ID=84 DF PROTO=TCP SPT=22 DPT=52704 WINDOW=501 RES=0x00 ACK PSH URGP=0
Jun 26 18:02:40 debian11 kernel: [ 6149.284986] [UFW AUDIT] IN=enp0s3 OUT= MAC=08:00:27:e3:9c:d6:90:2b:34:a2:db:b0:08:00 SRC=192.168.1.100 DST=192.168.1.140 LEN=52 TOS=0x10 PREC=0x00 TTL=64 ID=9724 DF PROTO=TCP SPT=52704 DPT=22 WINDOW=3441 RES=0x00 ACK URGP=0
Jun 26 18:02:40 debian11 kernel: [ 6149.507876] [UFW AUDIT] IN=enp0s3 OUT= MAC=08:00:27:e3:9c:d6:90:2b:34:a2:db:b0:08:00 SRC=192.168.1.100 DST=192.168.1.140 LEN=96 TOS=0x10 PREC=0x00 TTL=64 ID=9725 DF PROTO=TCP SPT=52704 DPT=22 WINDOW=3441 RES=0x00 ACK PSH URGP=0
Jun 26 18:02:40 debian11 kernel: [ 6149.508359] [UFW AUDIT] IN= OUT=enp0s3 SRC=192.168.1.140 DST=192.168.1.100 LEN=120 TOS=0x10 PREC=0x00 TTL=64 ID=85 DF PROTO=TCP SPT=22 DPT=52704 WINDOW=501 RES=0x00 ACK PSH URGP=0
Jun 26 18:02:40 debian11 kernel: [ 6149.508573] [UFW AUDIT] IN=enp0s3 OUT= MAC=08:00:27:e3:9c:d6:90:2b:34:a2:db:b0:08:00 SRC=192.168.1.100 DST=192.168.1.140 LEN=52 TOS=0x10 PREC=0x00 TTL=64 ID=9726 DF PROTO=TCP SPT=52704 DPT=22 WINDOW=3441 RES=0x00 ACK URGP=0
Jun 26 18:02:46 debian11 kernel: [ 6154.605931] [UFW AUDIT] IN=enp0s3 OUT= MAC=08:00:27:e3:9c:d6:90:2b:34:a2:db:b0:08:00 SRC=192.168.1.100 DST=192.168.1.140 LEN=120 TOS=0x10 PREC=0x00 TTL=64 ID=9727 DF PROTO=TCP SPT=52704 DPT=22 WINDOW=3441 RES=0x00 ACK PSH URGP=0
Jun 26 18:02:46 debian11 kernel: [ 6154.606679] [UFW AUDIT] IN= OUT=enp0s3 SRC=192.168.1.140 DST=192.168.1.100 LEN=200 TOS=0x10 PREC=0x00 TTL=64 ID=86 DF PROTO=TCP SPT=22 DPT=52704 WINDOW=501 RES=0x00 ACK PSH URGP=0
Jun 26 18:02:46 debian11 kernel: [ 6154.606975] [UFW AUDIT] IN=enp0s3 OUT= MAC=08:00:27:e3:9c:d6:90:2b:34:a2:db:b0:08:00 SRC=192.168.1.100 DST=192.168.1.140 LEN=52 TOS=0x10 PREC=0x00 TTL=64 ID=9728 DF PROTO=TCP SPT=52704 DPT=22 WINDOW=3441 RES=0x00 ACK URGP=0
Jun 26 18:02:49 debian11 kernel: [ 6157.778973] [UFW AUDIT] IN=enp0s3 OUT= MAC=08:00:27:e3:9c:d6:90:2b:34:a2:db:b0:08:00 SRC=192.168.1.100 DST=192.168.1.140 LEN=120 TOS=0x10 PREC=0x00 TTL=64 ID=9729 DF PROTO=TCP SPT=52704 DPT=22 WINDOW=3441 RES=0x00 ACK PSH URGP=0
Jun 26 18:02:49 debian11 kernel: [ 6157.779458] [UFW AUDIT] IN= OUT=enp0s3 SRC=192.168.1.140 DST=192.168.1.100 LEN=200 TOS=0x10 PREC=0x00 TTL=64 ID=87 DF PROTO=TCP SPT=22 DPT=52704 WINDOW=501 RES=0x00 ACK PSH URGP=0
Jun 26 18:02:49 debian11 kernel: [ 6157.779714] [UFW AUDIT] IN=enp0s3 OUT= MAC=08:00:27:e3:9c:d6:90:2b:34:a2:db:b0:08:00 SRC=192.168.1.100 DST=192.168.1.140 LEN=52 TOS=0x10 PREC=0x00 TTL=64 ID=9730 DF PROTO=TCP SPT=52704 DPT=22 WINDOW=3441 RES=0x00 ACK URGP=0
Jun 26 18:02:50 debian11 kernel: [ 6158.804283] [UFW AUDIT] IN=enp0s3 OUT= MAC=08:00:27:e3:9c:d6:90:2b:34:a2:db:b0:08:00 SRC=192.168.1.100 DST=192.168.1.140 LEN=88 TOS=0x10 PREC=0x00 TTL=64 ID=9731 DF PROTO=TCP SPT=52704 DPT=22 WINDOW=3441 RES=0x00 ACK PSH URGP=0

Itt a sorokban találhatunk név-érték párokat, amelyeknek a jelentése az alábbi (a teljesség igénye nélkül):

  • IN= Ez a mező a bejövő forgalom hálózati eszközét mutatja (pl. enp0s3)
  • OUT= Ez a mező a kimenő forgalom hálózati eszközét mutatja. Több helyen itt nincs adat, mivel ezek a sorok csak beérkező adatcsomag forgalmat jelenítenek meg.
  • MAC= Ez jeleníti meg az eszköz MAC címét.
  • SRC= A kapcsolat forrásának IP-címe. Bejövő csomag esetén a csatlakozó gép címe, kimenő csomag esetén a saját gép (localhost) IP-címe.
  • DST= Ez pedig a kapcsolat céljának az IP-címe, tehát bejövő forgalom esetén a localhost, kimenő csomag esetén pedig a távoli gép címe.
  • LEN= Az adatcsomag méretét mutatja
  • TOS= (Type of Service) A csomagok osztályozására szolgáló mező, de már elavult.
  • PREC= Ez a mező a szolgáltatás elsőbbségi típusát mutatja.
  • TTL= (Time To Live) Az adatcsomag élethosszának a jelölése. Ha ez eltelik, akkor a csomag eldobódik.
  • ID= TA csomagok egyedi azonosítója.
  • PROTO= A használt protokollt jelzi. Pl. TCP, UDP, stb.
  • SPT= A csomag feladójának a portja (Source Port)
  • DPT= A csomag céljának a portja (Destination Port)

A Linux naplózási rendszereinek köszönhetően az UFW tűzfal napló adatai még megtalálhatók más naplófájlokban is, például:

syslog:

grep -i ufw /var/log/syslog | tail -30

UFW naplóadatok - syslog

messages:

grep -i ufw /var/log/messages | tail -30

UFW naplóadatok - messages

kern.log:

grep -i ufw /var/log/kern.log | tail -30

UFW naplóadatok - kern.log

Naplófájlok forgatása

Korábban már készítettem egy leírást, amiben a naplófájlok forgatását tanulmányoztuk, így itt is érdemes rátérni erre a kérdésre.

Az UFW alapból beállítja a naplófájljának a forgatását a logrotate rendszerben, de azért célszerű ellenőrizni, mert nagy naplófájlokat is generálhat az UFW tűzfal, amennyiben nagyobb hálózati forgalmunk van. Ezt a /etc/logrotate.d/ könyvtárban nézhetjük meg:

cd /etc/logrotate.d/

UFW tűzfal naplófájlja a logrotate rendszerben

Ha itt találunk egy "ufw" nevű fájlt akkor rendben is vagyunk. Tekintsünk bele:

cat ufw

UFW tűzfal naplófájlja a logrotate rendszerben

/var/log/ufw.log
{
        rotate 4
        weekly
        missingok
        notifempty
        compress
        delaycompress
        sharedscripts
        postrotate
                invoke-rc.d rsyslog rotate >/dev/null 2>&1 || true
        endscript
}

Ha ebben ilyesmit találunk, akkor nincs további teendőnk a naplófájl forgatásával kapcsolatban, tehát nyugodtak lehetünk, hogy nem fogja teleszemetelni a merevlemezünket az UFW tűzfal naplózási rendszere.

Ha viszont mégsem találkoznánk ezzel a fájlal, és nagyobb méretű az UFW naplófájlunk, ami napokon át csak hízik, akkor tanulmányozzuk át a fentebbi naplófájlok forgatása című leírást, és készítsük el az alapján a ufw logrotate fájlunkat, vagy akár ennek a tartalmával is létrehozhatjuk.

 

 

Grafikus felület

Az UFW tűzfalhoz létezik egy grafikus frontend is, ami a grafikus asztalkörnyezetet használók számára kínál kényelmesebb beállítófelületet.

Ebben a részben nem célom a teljeskörű bemutatása a grafikus programnak, hanem inkább csak érintőlegesen foglalkozunk vele, amolyan áttekintésként, hogy láthassuk, hogy van egy ilyen is.

Telepítés és indítás

A grafikus program használatához telepíteni kell a gufw csomagot, természetesen itt is root-ként folytassunk mindent:

apt-get install gufw

Ezt a grafikus felületes részt a korábban elkészített Debian 11 (Bullseye) telepítésen fogom elvégezni.

 

Ha feltelepült a csomag, indítsuk el a programot a gufw paranccsal, vagy a már menübe is bekerül parancsikonjával.

A gufw parancs ikonja

Ha a menüből indítjuk sima felhasználóként, még bekéri a jelszót, majd megnyílik a program kis ablaka:

A gufw kezdőablaka

Itt már nem merülünk el a részletekben, csak kicsit körülnézünk a menükben. Előtte érdemes kicsit átméretezni az ablakát, hogy kényelmesen elférjen rajta minden:

A gufw kezdőablaka - átméretezve

A program különböző profilokat is kezel, ami nem összetévesztendő a már korábban említett alkalmazásprofilokkal, hanem ezek amolyan kényelmi szolgáltatást nyújtanak inkább. Segítségükkel készíthetünk otthoni, nyilvános és munkahelyi profilokat. Természetesen hozhatunk létre újabbakat is.

Menük

A felső menüben elérhető pár funkció:

Fájl:

Itt tudjuk az imént említett profilokat importálni vagy exportálni. Így például kényelmesen át tudjuk vinni másik gufw-vel rendelkező Linux rendszerre is a beállításainkat.

Gufw - Profil exportálása

Szerkesztés:

Itt vannak a beállítások, amire kattintva bejön egy újabb kis panel:

A gufw beállításai

Itt a már korábbról ismert funkciókat tudjuk állítgatni, mint például a naplózás, frissítési időköz és a profilok kezelése.

Állapot

A menü alatt az ablak felső részén az állapottal kapcsolatos részek vannak. Itt lehet kiválasztani a profilt, be/kikapcsolni a tűzfalat, beállítani az alapértelmezett bejövő, illetve kimenő házirendeket (engedélyezés / tiltás / elutasítás):

Gufw - bekapcsolva

Középső menü fülek

Az állapot rész alatt találunk még egy menü fül sort, ami 4 elemből áll: kezdőoldal (kis házikó ikon), szabályok, jelentések, napló.

Kezdőoldal

Itt találunk egy rövid súgószerű részt, amit legörgetve elolvashatunk:

Gufw - kezdőoldal súgó

Szabályok

Ezen az oldalon a szabályok listáját találhatjuk. Itt most előbb parancssorban állítottam be egy tűzfalszabályt, ami megjelenik a listában, hasonlóan a parancssorhoz:

Gufw - Szabályok

Itt ha rámegyünk egy tételre, majd rákattintunk a lista alatt lévő kis fogaskerék ikonra, akkor bejön a beállítóablaka:

Gufw - Szabályok - Módosítás

Amint láthatjuk, nem módosíthatunk olyan szabályokat, amiket a parancssorból állítottunk be. Tehát külön kezeli őket a program. Egyébként a parancssorban bekövetkezett változtatások csak a grafikus program újraindítása után frissülnek az ablakban.

Ha pedig ebben a programban akarunk szabályt beállítani, akkor kattintsunk az alsó + jelre. Ekkor előjön egy 3 fülből álló kis ablak, ahol háromféleképpen tudunk szabályokat beállítani:

Előre beállított:

Gufw - Szabályok - Új szabály - Előre beállított fül

Itt a parancssori alkalmazáslistához hasonlóan egy nagy, kategorizált listából tudunk választani előre beállított alkalmazás profilok között, amik között ott vannak a parancssorban is kilistázható tételek is, de azoknál itt sokkal több egyéb is van. Például különböző játékokhoz is vannak benne profilok, stb.

Egyszerű:

Gufw - Szabályok - Új szabály - Egyszerű fül

Itt ahogy látható, egy egyszerű kis űrlappal lehet kézzel beállítani a szabályt. Név, házirend, irány, protokoll, port.

Haladó:

Itt pedig egy részletesebb beállításokat kínáló panelt kapunk, ahol sokkal több dolgot is beállíthatunk:

Gufw - Szabályok - Új szabály - Haladó fül

Jelentések

Itt egy listát láthatunk a szabályok típusairól, és a "+" jel segítségével gyorsan létrehozhatunk ezek alapján újabbakat.

Gufw - Reports

Napló

Itt pedig a naplót láthatjuk:

Gufw - Napló

A halvány szürke sorok a korábbi naplóbejegyzések, míg a tetején lévő sötétebbek pedig a grafikus program megnyitása óta keletkezett bejegyzések.

 

 

Konklúzió

Az UFW egy egyszerűen kezelhető kis tűzfal program, amely a háttérben az iptables tűzfalat állítgatja. Persze az itt bemutatott dolgoknál többet tud, de ebben a leírásban az alapvető beállítások bemutatása volt a cél. Használja mindenki bátran, az egyszerű kezelhetősége mellett megtartva a számítógépünk vagy szerverünk biztonságát is.