Packet filter firewall megoldások Linuxra

Kadlecsik József, kadlec@sunserv.kfki.hu

MTA KFKI RMKI

Abstract

At least two pulblic domain packet filter firewall modules are available for the Linux operating system. The first one is the original firewall module of the Linux kernel, which can be manilupated by the ipfwadm utility. The second one is the sf firewall module, which was made publicly available by SWITCH.

The two firewall modules, their design and capabilities are compared in detail. Sample firewall configurations are analyzed with attention to the special requirements of the protocols ARP and FTP.

1. Miért van szükség »tűzfalakra«?

A TCP/IP protokoll tervezésekor (noha fejlesztése az USA védelmi minisztériumának a támogatásával történt) a biztonsági kérdések nem játszottak különösebben fontos szerepet - a működőképesség volt az elsődleges cél! Az Internet óriási sikerét látva a TCP/IP-t - ebből a szempontból - nagyon jól tervezték meg!

Azonban amióta az Internet nem csupán egy szűk kör által elérhető tudományos, kutatási jellegű kísérleti hálózat, hanem tömegek »szörfölhetnek« rajta és megjelent az üzleti élet is, a biztonsági kérdések elsőrendű fontosságúvá váltak. A biztonsági problémák eredendően a következőkben foglalhatók össze:

Egy ún. packet filter firewall (csomagszűrő tűzfal) többek között lehetőséget nyújt arra, hogy:

A fentebb fölsorolt összes problémára önmagában egy packet filter firewall sem nyújt teljes megoldást!

A következőkben a Linux kernelhez írt két packet filter firewall modult vizsgálunk meg és hasonlítunk össze. A példákban a következő IP címeket használjuk:

188.8.8.1 az első szomszédos router
199.9.9.1 a firewall belső IP címe
199.9.9.n a belső, védendő hálózat
199.9.9.2 belső (mail, stb.) szerver
188.8.8.8 a firewall külső IP címe

2. A Linux kernel firewall modul és az ipfwadm program

A Linux kernel az 1.3.x sorozattól kezdődően tartalmaz egy packet filter firewall modult. Ehhez Jos Vos írta meg az interface programot (ipfwadm), amellyel a firewall modul konfigurálható, tesztelhető, adatai kiírathatók.

A firewall modul működése négy szabály-listán keresztül kontrollálható:

A tűzfal-funkciókat az input, output és forward szabály-listákon keresztül érhetjük el. Ezen listák minden szabályához tartozik egy policy, amely meghatározza, hogy a rendszer mit tegyen a szabály által lefedett IP csomagokkal:

A három listához tartozik egy-egy default policy is (accept), amely megszabja, hogy mi történjék az egyetlen szabály által sem lefedett IP csomagokkal.

Az IP csomagok meghatározásához a következő adatokat használhatjuk fel:

Opcionálisan lehetőség van még az egyes szabályoknál:

Példák:

Tegyük fel, hogy a firewall-t a következő alap-szabályokkal indítottuk el

# Default: nem engedünk át forgalmat
ipfwadm -F -p deny
# Az egyszerűség végett bármely csomag érkezhet/távozhat: ez a default
# ipfwadm -I -p accept
# ipfwadm -O -p accept
# Akadályozzuk meg a kívülről jövő IP cím hamisítást és naplózzuk ezeket
ipfwadm -F -a deny -P all -S 199.9.9.0/24 -V 188.8.8.8 -o
# Akadályozzuk meg a kifelé menő IP cím hamisítást.
# Ehhez két szabály szükséges a szabály-lista végén:
# visszautasítunk minden nem engedélyezett, egyébként szabályos forgalmat
ipfwadm -F -a reject -P all -S 199.9.9.0/24 -V 199.9.9.1
# tiltunk és naplózunk minden IP cím hamisítást
ipfwadm -F -a deny -P all -S 0.0.0.0/0 -V 199.9.9.1 -o

Engedjük be az SMTP (mail) forgalmat a mail-szerverre:

ipfwadm -F -i accept -b -P tcp -S 0.0.0.0/0 1024:65535 -D 199.9.9.2 25

Ha a belső hálózatról szeretnénk megengedni E-mail küldését kifelé, írhatnánk a következő szabályt, az előző analógiájára:

ipfwadm -F -i accept -b -P tcp -S 199.9.9.0/24 1024:65535 -D 0.0.0.0/0 25

Azonban ezzel a szabállyal (mivel mindkét irányra vonatkozik és azok közül egyik sem kitüntetett) bármely belső 1024 és 65535 portok közt futó TCP szerverhez (például X Window) való hozzáférést megengedtük - igaz, a kliensnek a 25-ös portról kell indulnia.

Korrigáljuk ezért a szabályt a SYN/ACK bitek figyelésével és egészítsük ki naplózással:

# SMTP TCP kapcsolatot kezdeményező csomagok, ezeket naplózzuk is

ipfwadm -F -i accept -P tcp -S 199.9.9.0/24 1024:65535 -D 0.0.0.0/0 25 -y -o

# A már felépült kapcsolat csomagjai; ezeket nem kívánjuk naplózni

ipfwadm -F -i accept -b -P tcp -S 199.9.9.0/24 1024:65535 -D 0.0.0.0/0 25 -k

A Linux kernel firewall modul előnyei a következőkben foglalhatók össze:

A modulnak azonban vannak hátrányai is:

3. Az sf firewall csomag

Az sf firewall csomagot a svájci Szövetségi Műszaki Intézetben (Swiss Federal Institute of Technology, Zürich) Robert Muchsel és Roland Scmid írták Dr. Hannes Lubich vezetésével és a SWITCH (Swiss Academic and Research Network) támogatásával. A csomagot jelen cikk szerzője néhány szempontból módosította/kibővítette - ezeket módosítás szóval jelezni fogom.

Az sf csomag kernel modulból, firewall daemon-ból és interface programból áll. A kernel modul végzi a tűzfal funkcióit az egyetlen szabály-lista alapján. A kernel modult a firewall daemon-on keresztül lehet konfigurálni; a daemon végzi a naplózást, hajt végre egy-egy adott szabálytól függően különböző akciókat (E-mail küldés, beépített "felderítés", külső program meghívása, stb.). Az interface programmal lehet elindítani/megállítani/(át)konfigurálni a firewall modult (közvetve, a daemonon keresztül) és kilistáztatni a szabályokat és akciókat.

Az sf konfigurációs file-ja három részre tagolódik, amelyeket részleteikben tekintünk át.

3.1 setup

Az első az általános konfigurációs rész, amelyben megadhatjuk a belső (védett) hálózat meghatározását és azt az E-mail címet, amelyre az E-mail üzenetek küldhetők:

setup

internalnets 199.9.9.0 mask 255.255.255.0;

mail_default root@199.9.9.2, admin@199.9.9.2;

3.2 rules

A második szakaszban adjuk meg a szabály-listát, ahol egy-egy szabály lehet accept, block vagy reject.

Mint emlékezünk rá, a Linux kernel modulnál egy reject szabály ICMP host unreachable üzenetet küld vissza az IP csomag feladójának. Ha az adott szabály block lenne, akkor a küldő fél az adott protokoll timeout mechanizmusa által meghatározott ideig újra és újra küldené a hálózaton "elveszett" csomagot. Ezen segít az ICMP host unreachable üzenet, amely tudatja a feladóval, hogy a célgép nem elérhető, így az általában nem küldi újra az elveszettnek hitt csomagjait.

Azonban vannak olyan alkalmazások (például néhány DNS implementáció), amelyek figyelmen kívül hagyják az ICMP üzenetet; ekkor feleslegesen küldünk hibaüzenetet. Másrészt a TCP kapcsolatok az ICMP üzenet ellenére újraküldik az elveszett csomagot, mert az üzenet utalhat ideiglenes hálózati hibára; TCP kapcsolatokat reset csomaggal kellene visszautasítani. Más programok esetén előfordulhat, hogy egy ICMP port unreachable üzenet hatására az egész hostot elérhetetlennek fogja tekinteni.

A reject szabályoknál ezért pontosan megadhatjuk, hogy hogyan akarjuk visszautasítani az adott kapcsolatot (ICMP net/host/protocol/port unreachable, TCP reset, echo reply vagy best, amely TCP csomagoknál TCP reset, UDP csomagoknál ICMP port unreachable, egyébként pedig ICMP host unreachable üzenet).

A default szabály egy egyszerű block.

Az IP csomagok meghatározásánál a következő adatokat használhatjuk fel:

A TCP kapcsolatokat az sf firewall egységként kezeli (azaz nincs szükség a kétirányú IP csomagok külön-külön való engedélyezésére), továbbá nincs szükség az interface megadására sem: azt a firewall a belső hálózat definíciója és a csomag feladói IP címe alapján automatikusan meghatározza.

A modul "érti" a RIP protokollt és meg tudjuk adni, hogy milyen routing információt fogadunk el!

# A szomszédos router-től csak külső IP címekre vonatkozó (outside) routing információt

# fogadunk el:

accept rip outside from 188.8.8.1 to 188.8.8.8;

A sf firewall a RIP protokollon kívül a normál FTP protokollt (továbbá a passzív FTP és TALK protokollokat - módosítás) is "érti". Az FTP ugyanis nem szokványos protokoll - két portot használ, ahol a szerver oldali portok ismertek: a 21-es az ún. parancs port, míg a 20-as az adat port, míg a kliens portjai véletlenszerűek. Egy normál FTP kapcsolat a következő lépések során épül föl:

  1. A kliens egy véletlenszerűen lefoglalt portról (pl. 2345) rákapcsolódik a szerver 21-es portjára.
  2. "PORT 2346" alakban megmondja a szervernek, hogy melyik portot fogja használni az adat-csatornához.
  3. A szerver (mint kliens) a 20-as portról kapcsolódik a kliens (szerver üzemmódú) 2346-os portjára.
  4. A kialakult adat-csatornán folyik az adat-forgalom (file-transzfer)

Ahhoz, hogy egy kifelé irányuló normál FTP kapcsolatot engedélyezzünk, a következő ipfwadm parancsokat kellene használnunk:

# Kifelé irányuló normál FTP parancs portja:

ipfwadm -F -i accept -P tcp -S 199.9.9.0/24 1024:65535 -D 0.0.0.0/0 21 -y -o

ipfwadm -F -i accept -b -P tcp -S 199.9.9.0/24 1024:65535 -D 0.0.0.0/0 21 -k

# Kifelé irányuló normál FTP parancs adat portja:

ipfwadm -F -i accept -P tcp -S 0.0.0.0/0 1024:65535 -D 199.9.9.0/24 1024:65535 -y -o

ipfwadm -F -i accept -b -P tcp -S 0.0.0.0/0 1024:65535 -D 199.9.9.0/24 1024:65535 -k

azaz az utolsó két szabállyal kívülről bármely kliens elérhetné bármelyik 1024 port fölött működő szerverünket - és ezt nem akarjuk.

Az sf firewall modul (az FTP parancs port figyelésével és a kliens "PORT nnnn" parancsának értelmezésével) automatikusan engedélyezi a szükséges - és csak a szükséges - TCP kapcsolatot.

TCP és UDP protokollok esetén lehetőség van a kapcsolat lokális portra való átirányítására (transzparens proxy - módosítás).

Egy-egy sf firewall szabály utolsó részeként megadhatjuk, hogy egy, a mintával egyező IP csomag esetén milyen akciót hajtson végre a firewall daemon:

# Belső szerverünkre irányuló FTP:

accept tcp to 199.9.9.2 port 21 notification_level 10;

3.3 notification

A notification-részben definiálhatunk komplex akciókat, amelyeket a következő elemekből állíthatunk össze:

Példa:

accept icmp icmp_echo to inside notification_level 11;

notification

level 11:

# Ha egy host tíz perc alatt több mint ezerszer pingel minket,

# akkor ez valószínűleg egy "denial of service attack".

# Tudjunk meg mindent a hostról, naplózzuk, küldjünk E-mailt és

# tíz percig blokkoljunk minden forgalmat erről a hostról.

let pingcount:sourcehost := pingcount:sourcehost + 1 timeout 600;

if pingcount:sourcehost > 1000 then

spy;

report;

mail;

block all from sourcehost notification_level 0 timeout 600;

endif;

Foglaljuk össze, melyek az előnyei és hátrányai az sf firewall modulnak.

Előnyök:

Hátrányok:

Összefoglalás

Áttekintettük a Linux kernel és az sf packet filter firewall modulok legfontosabb tulajdonságait. Példákkal illusztráltuk használatukat és képességeiket. Mindkét firewall-nál párhuzamba állítva felsoroltuk a legfontosabb elönyös és hátrányos tulajdonságaikat, lehetőséget teremtve ezzel összevetésükre.

Források

Linux firewall modul: Linux kernel 1.3.x fölött

ipfwadm: http://www.xos.nl/linux/ipfwadm/

sf firewall modul: ftp://ftp.switch.ch/software/sources/network/sf/

módosított sf csomag: mailto:kadlec@sunserv.kfki.hu

Ajánlott irodalom

Chapman, D.B & Zwicky E.:
Building Internet Firewalls
O'Reilly & Associates Inc.
Chapman, D.B. 1992:
Network (In)Security Through IP Packet Filtering.
Great Circle Associates, Mountain View, California
Elérhető ftp-vel az ftp.greatcircle.com címről