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