A leggyakrabban előforduló szolgáltatása egy tűzfalnak, hogy a mögötte található gépeket megvédje a külvilág kíváncsi szemeitől, viszont tegye lehetővé a belső gépek számára a világháló elérhetőségét az igényeknek és lehetőségeknek megfelelően.

Gyakori feladat, hogy sok-sok gépet kell egyetlen Internet kapcsolatra kötni, amelyet sokféle módon meg lehet tenni, de kevés ezek közül az igazán biztonságos megoldás. Abszolút biztonság természetesen nem létezik, mint azt két résszel ezelőtt említettem is, csak megfelelő biztonság. A most leírásra kerülő megoldás kisebb cégek néhány gépből álló kellően olcsó és megfelelően biztonságos tűzfalazását mutatom be.

Általánosságban elmondható, hogy a bal oldali ábrán látható szerkezet kialakítása a cél, ahol a cég által megvásárolt egyetlen Internet kapcsolatra fizikailag egy gép van felfűzve, amelyet elnevezünk firewall néven. Ez a gép sok feladatot fog ellátni, amelyek többsége nem a tűzfalak feladata, de sajnos nem mindenki engedhet meg minden feladatra külön gépet, noha áldozatot kellene hozni biztonságosság oltárán, de a költségek oldaláról is engedményeket kell tenni. A költségek és a biztonságosság szintje meghatároz egy kompromisszumot, amely általában megfelelő.

A firewall gép önmagában nem igényel erős hardvert, tökéletesen elég erre a feladatra egy elavultnak nevezett i80486 processzorú gép, amelynek teljesen megfelelőek a korabeli hardverei is (16 MBájt memória, 420 MBájt merevlemez). Ezzel a géppel már semmi gond nem lesz, a teljesítménye megfelelő a tűzfal funkciók ellátására. Egy hatalmas gondunk lesz: két hálózati kártyát szerezni bele, amelyekből az egyik lehetőleg 100 Mbites jószág a belső hálózat megfelelő sebessége érdekében. A másik kártya lehet egy öregebb 10 Mbites is, mivel ahol 10 Mbit sebességet meghaladja a világháló felé menő forgalom, ott valószínűleg egy néhány milliós szervergép fogja kiszolgálni a munkaállomásokat... :)

Kezdjük el a beállításokat, első feladatunk a tűzfal gép kiválasztása után a telepítés. Egy ilyen gépre szinte semmit nem kell rakni az alap Linux rendszeren kívül. Minden felesleges program és szolgáltatás csökkenti a rendszerünk biztonságát. Mivel a Linux operációs rendszer telepítése csomagorientált, a SuSE disztribúció készítői által összeállított DMZ (DeMilitarized Zone) konfigurációt használhatjuk. Ez a csomag összeállítás egy minimális telepítést eredményez, amely tartalmazza az alapvető Linux programokat, a hálózati védelmi programok nagy részét és a szükséges biztonsági programok is felkerülnek. Ezen túl még kiválaszthatjuk a rendszermag forrást (jelen esetben 2.2.x az ipchains miatt, a következő részek egyikében áttérünk az iptables programra, amelyhez már 2.4.x rendszermag kell) és feltelepíthetjük a rendszermag lefordításához szükséges C++ fordító környezetet is.

Telepítés befejezése után be kell állítani a két hálózati eszközt, hasonlóan, mint azt a VI. részben tettük, viszont itt kettő eszközt kell beállítani. A kártyákhoz rendelt név (eth0, eth1) függ a kártyák elhelyezkedéstől a gépben, ha lehet, akkor az eth0 legyen a világhálóhoz kapcsolandó kártya, az eth1 pedig a belső hálózathoz rendelt eszköz. Ehhez Murphy törvényei szerint meg kell cserélni fizikailag a két kártyát, mert a sorrend az alaplapon való elhelyezkedéstől függ nagyobb részben. Javaslom továbbá, hogy jelöljük meg egy kis papírcímkével a kártyákat, mert néhány hónap múlva egy esetleges átkábelezés esetén megkíméljük magunkat egy apró bosszúságtól: nem cseréljük össze az eszközöket.

A telepítés után következhet a rendszermag konfigurációja, amelyre a hatékony működés miatt van szükség, tulajdonképpen rá kell fordítani a rendszermagot az adott gép hardverelemeire. Javasolnám a megszokástól eltérően a modulok mellőzését, mivel egy modult könnyen ki lehet cserélni a gép újraindulása nélkül. Ha mindent belefordítunk a rendszermagba, akkor az esetleges kémkedést megakadályozzuk. Könnyen kivitelezhető ugyanis, hogy egy rendszermag-modult a betörő módosít a saját igényei szerint, majd ezzel lecseréli a megtámadott gépen futó modult. Ezek után már szinte mindent megtehet a géppel a tudtunk nélkül, mivel a tevékenységének nem lesz nyoma a gépen, erről a módosított modul gondoskodik.

Elsődleges feladat a gépen az IP címek hozzárendelése a megfelelő hálózati eszközökhöz:
 
 

firewall:~ # ifconfig eth0 192.168.2.238 netmask 255.255.255.0 up
firewall:~ # ifconfig eth1 192.168.1.254 netmask 255.255.255.0 up
firewall:~ # _

Nos, aki kicsit is ért a hálózatokhoz, az érezhet egy furcsa érzést a fenti IP címek esetén... az általam meghatározott külső IP cím valójában C osztályú privát cím, viszont cserébe nem adok meg egy tetszőleges IP címet, reklámozva ezáltal egy tetszőleges szolgáltatót. Mindenki adja meg ez helyett a saját IP címét és hálózati maszkot.

A kis kitérő után a hálózati adapterek működését kell ellenőrizni, mégpedig a következő parancs kiadásával:
 

firewall:~ # ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:00:21:12:84:7D 
inet addr:192.168.2.238 Bcast:192.168.2.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:23 errors:0 dropped:0 overruns:0 frame:0
TX packets:1 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100 
Interrupt:9 Base address:0xd000 
firewall:~ # _

Ha működik a hálózati kártya és a csatlakozások is jók, akkor a fenti sorok tárulhatnak elénk. Itt láthatjuk több sorra bontva a használt eszköz jellemzőit: a típusát (Ethernet) és a kártya hardver-címét (MAC address); a beállított IP címeket (IP address, broadcast address, netmask); majd az eszközhöz rendelt flagek láthatóak; aztán a fogadott csomagok jellemzői; majd a küldött csomagok jellemzői; a hálózat jellemzői; és végül a hardver jellemzői. A másik kártyára kiadott parancsnak is hasonló eredményt kell adnia, természetesen az adatok a különbségeknek megfelelően mások lesznek.

Ezek után a két oldalról már elérhetőek a gépek, de a két hálózati oldal még nem látja egymást. A külső oldalról nem is fontos engedélyezni az elérést, a belső oldalról pedig a jogosultsági rendszernek megfelelően csak néhány gépnek szabad engedni a világháló elérését. Ahhoz, hogy a belső hálózatról a TCP/IP csomagok kijuthassanak, be kell állítani az útvonalválasztást. Ehhez először is meg kell nézni, hogy milyenek a jelenlegi beállítások:
 
 

firewall:~ # route -n
Kernel IP routing table
Destination   Gateway         Genmask   Flags Metric Ref Use Iface
192.168.2.0   0.0.0.0   255.255.255.0       U      0   0   0 eth0
192.168.1.0   0.0.0.0   255.255.255.0       U      0   0   0 eth1
firewall:~ # _

Láthatjuk mind a két hálózati kártyához rendelt hálózati címeket (192.168.2.0 és 192.168.1.0). Ezen tartományok felé induló csomagok az alapértelmezett átjáró felé indulnának (0.0.0.0). Ennek hiányában (jelen esetben) azt tapasztaljuk, hogy a gépről nem jutnak ki a TCP/IP csomagok, mivel nem tudják merre is induljanak. Ezt ki is próbálhatjuk a ping parancs kiadásával:
 

firewall:~ # ping szolgaltato.hu
PING 192.168.3.1 (192.168.3.1): 56 data bytes
--- 192.168.3.1 ping statistics ---
6 packets transmitted, 0 packets received, 100% packet loss
firewall:~ # _

Láthatjuk, hogy a kiküldött csomagok nem érkeznek vissza, illetve el sem tudnak indulni. A probléma csak annyi, hogy nincs megadva alapértelmezett átjáró, ezért meg kell adni azt:

firewall:~ # route add default gw 192.168.2.254

A parancs kiadása után már módosul a rendszermag útválasztó táblázata, és a következőképpen fog kinézni:
 

firewall:~ # route -n
Kernel IP routing table
Destination        Gateway        Genmask Flags Metric Ref Use Iface
192.168.2.0        0.0.0.0  255.255.255.0     U      0   0   0 eth0
192.168.1.0        0.0.0.0  255.255.255.0     U      0   0   0 eth1
0.0.0.0      192.168.2.254        0.0.0.0     U      0   0   0 eth0
firewall:~ # _

Ezek után már menni fog a TCP/IP forgalom, láthatjuk is a ping parancs kiadása után:
 

firewall:~ # ping 192.168.3.1
PING 192.168.3.1 (192.168.3.1): 56 data bytes
64 bytes from 192.168.3.1: icmp_seq=0 ttl=253 time=146.237 ms
64 bytes from 192.168.3.1: icmp_seq=1 ttl=253 time=140.103 ms
64 bytes from 192.168.3.1: icmp_seq=2 ttl=253 time=130.012 ms
64 bytes from 192.168.3.1: icmp_seq=3 ttl=253 time=139.323 ms
64 bytes from 192.168.3.1: icmp_seq=4 ttl=253 time=125.746 ms
--- 192.168.3.1 ping statistics ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max = 125.746/136.284/146.237 ms
firewall:~ # _

Tökéletes a hálózat, azonban ez még kevés a teljes megoldáshoz, ugyanis a belső gépek közül néhányat ki kell engedni a világhálóra. Ehhez az IP masqurade (a továbbiakban IP MASQ) szolgáltatást kell megvalósítani, amely az ipchains programmal történik, amellyel a rendszermag csomagszűrő táblázatát kezelhetjük. Ehhez (ha még nincs belefordítva a rendszermagba, akkor) be kell kapcsolni a rendszermag egyik funkcióját, amelyet IP forward néven találhatunk meg:

firewall:~ # echo 1 >/proc/sys/net/ipv4/ip_forward

Ezek után a rendszermag már képes az IP MASQ szolgáltatásra, de a pontos konfigurációt az ipchains programmal el kell végezni:
 

firewall:~ # ipchains -L
Chain input (policy ACCEPT):
Chain forward (policy ACCEPT):
Chain output (policy ACCEPT):
firewall:~ # _

Megnéztük a beállításokat és azt láthatjuk hogy a rendszermag csomagszűrő táblázata még üres. Az IP MASQ beállításához a forward láncba kell beszúrni egy szabályt, amely szerint a belső tartományból induló TCP és UDP csomagokat engedélyezzük:

firewall:~ # ipchains -A forward -s 192.168.1.0/255.255.255.0 -d ! 192.168.1.0/255.255.255.0 -l -p tcp -i eth0 -j MASQ
firewall:~ # ipchains -A forward -s 192.168.1.0/255.255.255.0 -d ! 192.168.1.0/255.255.255.0 -l -p udp -i eth0 -j MASQ

Ezzel a kettő utasítássorral engedélyezzük a belső gépek felől induló TCP és UDP csomagok továbbítását a világháló felé. Tulajdonképpen elkészítettük a tűzfalunkat, amellyel kellően megvédtük a kis hálózatunkat. Érdemes az előző részhez hasonlóan letiltani a szükségtelen nyitott portokat is.

Ha növelni szeretnénk a biztonságot, akkor munkába állíthatunk egy naplózásért felelős gépet is, amelyet a tűzfal géphez hasonlóan állítunk be, de ennek feladata a naplóbejegyzések tárolása. Ha valamelyik gépre valamilyen módon sikerül betörni és ott rendszergazdai jogokhoz jutni, akkor a gépen található naplóállományok már nem tekinthetők autentikus naplóknak, mivel azt a betörők megváltoztathatták. Ha ezeket a bejegyzéseket egy másik gépre is továbbítjuk, akkor több nagyságrenddel nehezebb a betörőnek a naplóbejegyzéseket egyszerre két gépen megváltoztatni. Ezen a gépen (a tűzfalhoz hasonlóan) nagyon kicsit támadási felületet szabad csak hagyni, amennyi a távoli adminisztrációhoz feltétlenül szükséges.

Mivel az összes gépről ide fut be az összes naplóállomány, a gépen a syslogd démont megfelelő módon be kell állítani, hogy a naplókat könnyedén át lehessen nézni napi rendszerességgel. Ehhez megfelelően szét kell válogatni a beérkező naplóbejegyzéseket, amelyet a /etc/syslog.conf állományban tehetünk meg:

auth.*; authpriv.*; mark.* /var/log/auth
cron.*; mark.* /var/log/cron
daemon.*; mark.* /var/log/daemon
kern.*; mark.* /var/log/kern
lpr.*; mark.* /var/log/lpr
mail.*; mark.* /var/log/mail
news.*; mark.* /var/log/news
security.*; mark.* /var/log/security
syslog.*; mark.* /var/log/syslog
user.*; mark.* /var/log/user
uucp.*; mark.* /var/log/uucp
*.*;\
auth.none; authpriv.none;\
cron.none; daemon.none;\
kern.none; lpr.none;\
mail.none; news.none;\
security.none; syslog.none;\
user.none; uucp.none /var/log/messages
kern.warn;*.err;*.alert /dev/tty10
*.emerg *
*.warn; mark.* /var/log/warn
*.crit; mark.* /var/log/crit

Nem szokás ennyire tagolni a naplóállományokat, de mivel ez a gép csak és kizárólag ezt a célt szolgálja, ezért ez a tagolás célszerű.

A log gépen a tűzfalhoz hasonlóan elvégezzük a szolgáltatások letiltását, egészen addig, amíg csak az SSH protokoll segítségével tudunk már csak a géphez férni. A syslogd démonnál engedélyeztük a naplóbejegyzések fogadását, ezért a nyitott portok listájában megjelenik egy 514/udp bejegyzés is, ugyanis ezen a porton fogadja majd a démon a bejegyzéseket:
 

firewall:~ # nmap -sU localhost
Starting nmap V. 2.53 by fyodor@insecure.org ( www.insecure.org/nmap/ )
Interesting ports on localhost (127.0.0.1):
(The 1439 ports scanned but not shown below are in state: closed)
Port State Service
514/udp open syslog 
Nmap run completed -- 1 IP address (1 host up) scanned in 8 seconds

Megoldandó probléma még a gyorsan növekvő naplóállományok archiválása. Ezt a logrotate nevű programmal valósítható meg, amelyet beállítunk naponta való napló-archiválásra. Ekkor naponta képződik a /var/log könyvtárban egy <állománynév>-<dátum>.gz formátumú archív állomány, amelyet lehetőleg naponta le kell menteni a gépről. Ezt a műveletet nem érdemes automatizálni, mivel ha betörnek a hálózatra, könnyen kihasználható egy automatikus állományátvitel a naplók módosítására. Legegyszerűbb módszer ezen napló-archívumok átvitelére az scp parancs, amely egy kódolt csatornán végzi az átvitelt. A lementett naplókat pedig érdemes CD-re vagy valami más egyszer írható médiára kiírni és biztonságos helyet tárolni.

A következő részben kiegészítjük a működő rendszerünket néhány proxy programmal, amelyek a támadhatóságot csökkentik, illetve a rendszer hatékonyságát és sebességét növelik.