Címke archívum: iptables
Játék az iptables-szel
Nem is olyan nagyon régen írtam egy cikket arról, hogyan érezhetnénk magunkat kicsit nagyobb biztonságban, ha online tartózkodik számítógépünk. A cikk születésében ötletekkel, lektorálással, teszteléssel segítségemre volt egy kollégám, akinek volt egy megjegyzése, ami szöget ütött a fejembe.
Az írásnak ugyanis része volt a tűzfal beállítása, amit én a saját gépemen az /etc/init.d könyvtárból – még inkább az /etc/rcS.d könyvtárból – indítottam. Ő erre azt mondta, hogy az ötlet jó, ámbátor abszolúte nem init scriptként viselkedik a tűzfal – ami igaz is. Mivel fogalmam sem volt, hogyan kellene legalább hasonlóvá tenni a tűzfal beállításait az init scriptekhez, nekiálltam kicsit tanulmányozni az ufw init-scriptjét. A látottak alapján úgy döntöttem, hogy hasonlóvá teszem a tűzfalam indítását, noha az nyilvánvalóan nem init-script.
Szem előtt tartottam azt is, hogy felmerülhetnek bizonyos egyéb igények az általam elképzelteken kívül, így az indítási paraméterek között felsoroltam néhány egyéb lehetőséget.
#!/bin/sh -e ### BEGIN INIT INFO # Provides: firewall # Required-Start: # Required-Stop: # Default-Start: S # Default-Stop: # Short-Description: start customized firewall ### END INIT INFO PATH="/sbin:/bin:/usr/sbin:/usr/bin" # Az iptables parancs helye, igy nem kell mindig a teljes utvonalat beirni IPTABLES=/sbin/iptables [ -x /etc/init.d/firewall ] || exit 0 # futtathato-e a script, ha nem, kilepunk case "$1" in start) echo "Starting customized firewall...\n" # Toroljuk az eddigi szabalyokat $IPTABLES --flush # Minden meglevo extra lancot torlunk $IPTABLES --delete-chain # A harom alapertelmezett lancot DROP-ra allitjuk $IPTABLES -P INPUT DROP $IPTABLES -P FORWARD DROP $IPTABLES -P OUTPUT DROP # Kihasznaljuk, hogy lehetseges az allapot ellenorzese # es csak olyan bejovo kapcsolatokat engedelyezunk, amelyeket mi inditottunk $IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT $IPTABLES -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT echo "Customized firewall started... [OK].\n" echo "Only user-initiated network connections are available (doesn't harm daily internet usage).\n" ;; stop) echo "Stopping customized firewall, all connections will be default...\n" # Toroljuk az eddigi szabalyokat $IPTABLES --flush # Minden meglevo extra lancot torlunk $IPTABLES --delete-chain # A harom alapertelmezett lancot ACCEPT-ra allitjuk $IPTABLES -P INPUT ACCEPT $IPTABLES -P FORWARD ACCEPT $IPTABLES -P OUTPUT ACCEPT echo "Customized firewall stopped, all connections set to default.\n" ;; close) echo "Stopping customized firewall, all connections will be closed...\n" # Toroljuk az eddigi szabalyokat $IPTABLES --flush # Minden meglevo extra lancot torlunk $IPTABLES --delete-chain # A harom alapertelmezett lancot DROP-ra allitjuk $IPTABLES -P INPUT DROP $IPTABLES -P FORWARD DROP $IPTABLES -P OUTPUT DROP echo "Customized firewall stopped, all connections closed.\n" ;; ssh) echo "Starting customized firewall...\n" # Toroljuk az eddigi szabalyokat $IPTABLES --flush # Minden meglevo extra lancot torlunk $IPTABLES --delete-chain # A harom alapertelmezett lancot DROP-ra allitjuk $IPTABLES -P INPUT DROP $IPTABLES -P FORWARD DROP $IPTABLES -P OUTPUT DROP # Kihasznaljuk, hogy lehetseges az allapot ellenorzese # es csak olyan bejovo kapcsolatokat engedelyezunk, amelyeket mi inditottunk $IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT $IPTABLES -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT # Engedelyezzuk az ssh szerver portjat # termeszetesen igy az egesz vilag hozzaferhet $IPTABLES -A INPUT -p tcp --dport 5353 -j ACCEPT echo "Customized firewall started... [OK].\n" echo "Only user-initiated network connections and ssh on port nr. 5353 are available (doesn't harm daily internet usage).\n" ;; apache) echo "Starting customized firewall...\n" # Toroljuk az eddigi szabalyokat $IPTABLES --flush # Minden meglevo extra lancot torlunk $IPTABLES --delete-chain # A harom alapertelmezett lancot DROP-ra allitjuk $IPTABLES -P INPUT DROP $IPTABLES -P FORWARD DROP $IPTABLES -P OUTPUT DROP # Kihasznaljuk, hogy lehetseges az allapot ellenorzese # es csak olyan bejovo kapcsolatokat engedelyezunk, amelyeket mi inditottunk $IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT $IPTABLES -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT # Engedelyezzuk a webszerver portjat # termeszetesen igy az egesz vilag hozzaferhet $IPTABLES -A INPUT -p tcp --dport 80 -j ACCEPT echo "Customized firewall started... [OK].\n" echo "Only user-initiated network connections and apache on port nr. 80 are available (doesn't harm daily internet usage).\n" ;; ssh_apache) echo "Starting customized firewall...\n" # Toroljuk az eddigi szabalyokat $IPTABLES --flush # Minden meglevo extra lancot torlunk $IPTABLES --delete-chain # A harom alapertelmezett lancot DROP-ra allitjuk $IPTABLES -P INPUT DROP $IPTABLES -P FORWARD DROP $IPTABLES -P OUTPUT DROP # Kihasznaljuk, hogy lehetseges az allapot ellenorzese # es csak olyan bejovo kapcsolatokat engedelyezunk, amelyeket mi inditottunk $IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT $IPTABLES -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT # Engedelyezzuk a webszerver es az ssh portjait # termeszetesen igy az egesz vilag hozzaferhet $IPTABLES -A INPUT -p tcp --dport 80 -j ACCEPT $IPTABLES -A INPUT -p tcp --dport 5353 -j ACCEPT echo "Customized firewall started... [OK].\n" echo "Only user-initiated network connections, ssh on port nr. 5353 and apache on port nr. 80 are available (doesn't harm daily internet usage).\n" ;; *) echo "Usage: /etc/init.d/firewall {start|stop|close|ssh|apache|ssh_apache}" exit 1 ;; esac exit 0 |
Lássuk sorrendben:
- start: elindítjuk a tűzfalat és csak olyan kapcsolatokat engedélyezünk, amiket mi indítottunk.
- stop: visszaállítjuk az alapértelmezett állapotot, azaz minden kapcsolatot engedélyezünk – leginkább tesztelésre ajánlott, ha “útban van” a tűzfal.
- close: teljes rendszerzárlat, semmilyen hálózati kapcsolatot nem engedélyezünk.
- ssh: csak az 5353-as portra konfigurált ssh-t és az általunk kezdeményezett kapcsolatok engedélyezettek.
- apache: elérhető az alapértelmezett beállításokkal működő webszerver (80-as port), valamint működőképesek az általunk kívánt kapcsolatok.
- ssh_apache: kívülről elérhető az ssh, a webszerver és működnek az általunk kezdeményzett műveletek.
Ha bármelyik kulcsszó nélkül indítjuk a scriptet, egy rövid információs sort kapunk a használatról.
Természetesen még egyebekkel is ki lehet egészíteni a scriptet, illetve nyilvánvalóan el is lehet venni az itt tárgyalt lehetőségekből; a fenti példa az én igényeimet tükrözi. Remélem, lesz, akinek hasznos ez a leírás. Jó játékot az iptables-szel!
szerző: sh4d0w
Kicsit nagyobb biztonságban
Sok különböző linwin flame-nek voltam tanúja és részese. Gyakran hangoztatott érv a Linux rendszerek mellett, hogy alapból mennyivel biztonságosabbak, mint a Windowsok. A legújabb trendek azonban mintha lazítanának a Linuxok biztonságán, ezért kicsit ráerősítünk az alapból létező biztonsági megoldásokra. Íme az általam használt eszközcsokor Ubuntun…
Nmap
Okos kis programocska, feltérképezi a hálózatot és felfedi a gyenge pontokat – kiválóan alkalmas saját gépünk feltérképezésére is. Felismeri a futó szolgáltatásokat, nyitott portokat, alkalmas operációs rendszer detektálásra is. Igen gyakran használom otthoni gépem vizsgálatára, főleg, ha hozzányúlok bizonyos beállításokhoz, amik esetleg rést nyithatnak a pajzson. Amikor először használtam, láttam, hogy a cupsysd (nyomtatókezelő alrendszer) ott csücsül egy nyitott porton és hallgatózik. Mivel én nem használok otthon nyomtatót, ezért leállítottam a cupsysd-t, hogy ne is induljon el (előfordulhat, hogy ez lehetetlenné teszi a pdf-be nyomtatást).
Nem teszek kísérletet a program opcióinak bemutatására, az egy külön könyv története (árulnak is ilyet). A program elérhető a http://nmap.org oldalról, vagy a tárolókból.
IPTables
A Linuxok tűzfala. Kezdőknek rémisztő lehet, de én power userként sem vettem rá magam minden csínjának-bínjának elsajátítására, inkább körülnéztem az Interneten kész megoldások után – elvárásaimban nem is csalatkoztam, ami a Hálón nincs, az nem is létezik. Léteznek grafikus front-endek a beállításához, Firestarter és GUFW néven ismeretesek. Én próbálkoztam ezekkel, de szerintem nem elég egyértelmű a kezelésük, így az Interneten talált scriptet faragtam át a saját szükségleteimnek megfelelően. Szintén nem törekszem a teljességre, hiszen itt is nagyon sok dolgot lehet állítani, de az általam használt scriptet megosztom veletek.
sh4d0w@reactor:~$ cat firewall-init.sh #!/bin/bash # Ez egy tuzfal script, ami engedi a forgalmat az ssh szerver fele # Az iptables parancs helye, igy nem kell mindig a teljes utvonalat beirni IPTABLES=/sbin/iptables # Toroljuk az eddigi szabalyokat $IPTABLES --flush # Minden meglevo extra lancot torlunk $IPTABLES --delete-chain # A harom alapertelmezett lancot DROP-ra allitjuk $IPTABLES -P INPUT DROP $IPTABLES -P FORWARD DROP $IPTABLES -P OUTPUT DROP # Kihasznaljuk, hogy lehetseges az allapot ellenorzese # es csak olyan bejovo kapcsolatokat engedelyezunk, amelyeket mi inditottunk $IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT $IPTABLES -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT # Engedelyezzuk az ssh szerver portjat # termeszetesen igy az egesz vilag hozzaferhet $IPTABLES -A INPUT -p tcp --dport 5353 -j ACCEPT # Ezt a kesobbi esetleges befejezesi-ertek vizsgalatokhoz tesszuk ide exit 0 |
A fenti konfiguráció nem akadályozza a mindennapi használatot, ugyanakkor az ssh szerver kivételével minden egyéb kapcsolatot eldob. Apropó…
SSH szerver
Tárolókból telepíthető, segítségével távolról is kapcsolódhatunk gépünkhöz akár konzolon, akár GUI-n keresztül. Az iptables beállításakor azt láthattátok, hogy nem a standard 22-es porton hallgatózik az sshd, hanem az 5353-ason. Elárulom: szándékos a dolog. ![]()
Sok esetben az sshd alapbeállítása megfelelő, néhányban nem. Amikor csak és kizárólag szerverek kommunikálnak egymással, felesleges egyéb opciókkal megbonyolítani a konfigurációt, nekem, mint paranoiás júzernek viszont ez nem tetszik. Nem azért, mert bármi olyan információ lenne a gépemen, amivel világvégét lehetne előidézni, hanem mert nem kívánok botnetek tagja lenni és tudtomon kívül bármilyen (D)DoS vagy egyéb támadásban részt venni. Így vettem a fáradtságot és utánanéztem, mit lehetne kezdeni az ssh szerver alapértelmezett beállításaival – de előrebocsátom, most csak azokról a lehetőségekről írok, amelyeket én megváltoztattam az alapértelmezett beállításokhoz képest.
A file, amit szerkesztenünk kell: /etc/ssh/sshd_config. Csak semmi rémület, egész olvasható a tartalom.
# What ports, IPs and protocols we listen for Port 5353 # Authentication: . PermitRootLogin no . #UseLogin no AllowUsers sh4d0w |
Beszéljük ki! Portot 22-ről 5353-ra állítottam. A script-kiddie-ktől megvéd, aki komolyan kutakodik, azt lelassíthatja picit. A PermitRootLogin alapbeállításánál a fejemhez kaptam, alapból engedélyezve volt, gyorsan átállítottam “no”-ra. Nem tudom, ez hogyan és honnan jött, de néztem én is nagyokat… A Login program használatát kiiktattam az ssh-ból, így most csak RSA-kulcsokkal lehet belépni a gépemre. RSA-kulcsok használatához forduljatok ide: http://www.linuxproblem.org/art_9.html. Utolsó opcióként csak a saját usernevemet engedélyeztem ssh-belépéshez (láttam olyan támadási próbálkozást, amiben valószínűleg szótárból öntötték a userneveket a(z akkor még) 22-es porton hallgatózó sshd-mre).
Természetesen lehetőség van akár fail2ban (http://www.fail2ban.org/wiki/index.php/Main_Page) használatára is, de ezt egy alapvetően semmi titkot nem tartalmazó otthoni gépre azért túlzásnak érzem.
Lépjünk tovább, van még két eszköz, amivel röviden szeretnélek megismertetni Titeket, aztán leülök magamtól is.
rkhunter
Habár Linuxon igen ritkán találkozunk vírusokkal, rootkitek azért vannak szép számmal, nem árt szemmel tartani a rendszerünket. Persze igen valószínűtlen, hogy találkozunk rootkittel, ha csak megbízható forrásból telepítünk programokat. Említettem már, hogy paranoiás vagyok…? Mivel nem lehetek elég nyugodt, ezért a tárolóból telepítettem a programot, ami nem a legfrissebb verzió, de most megfelel. Telepítés után frissítsük az adatbázisát és a file-ok tulajdonságainak adatbázisát, különben hamis riasztásokat kapunk:
sh4d0w@reactor:~$ sudo rkhunter --update --propupd [ Rootkit Hunter version 1.3.2 ] File updated: searched for 154 files, found 127 Checking rkhunter data files... Checking file mirrors.dat [ No update ] Checking file programs_bad.dat [ No update ] Checking file backdoorports.dat [ No update ] Checking file suspscan.dat [ No update ] Checking file i18n/cn [ No update ] Checking file i18n/en [ No update ] Checking file i18n/zh [ No update ] Checking file i18n/zh.utf8 [ No update ] |
Első alkalommal javaslom, hogy a -c opcióval indítsuk az ellenőrzést, hogy lássuk, hogyan is működik. Íme egy kis részlet ebből:
sh4d0w@reactor:~$ sudo rkhunter -c [sudo] password for sh4d0w: [ Rootkit Hunter version 1.3.2 ] Checking system commands... Performing 'strings' command checks Checking 'strings' command [ OK ] Performing 'shared libraries' checks Checking for preloading variables [ None found ] Checking for preload file [ Not found ] Checking LD_LIBRARY_PATH variable [ Not found ] Performing file properties checks Checking for prerequisites [ OK ] . . |
Ez minden alapértelmezett tesztet végigfuttat, az egyes tesztek között pedig Enter-re vár a folytatáshoz. A későbbiek folyamán bőven elég, ha csak a figyelmeztetéseket kapjuk, erre is van lehetőség az indítási paraméterek között. A lehetséges opciókat megkaphatjuk, ha paraméterek nélkül indítjuk az rkhuntert.
Lynis
Ezt a programot az rkhunter (http://www.rootkit.nl/) oldalán találtam. Ez is egy audit eszköz (lásd még nmap), szintén alkalmas a biztonsági beállítások vizsgálatára. Ubuntura megtalálható ugyan a tárolókban, de a projekt oldalán lévő verzió frissebb, kicsomagolás után azonnal indítható, anélkül, hogy telepíteni kellene. Kezdjük frissítéssel:
sh4d0w@reactor:~/lynis/lynis-1.2.6$ sudo ./lynis --check-update == Lynis == Version : 1.2.6 Release date : 5 April 2009 == Databases == Current Latest Status ----------------------------------------------------------------------------- Malware : 2008062700 2008062700 Up-to-date File perms : 2008053000 2008053000 Up-to-date Copyright 2007-2009 - Michael Boelen, http://www.rootkit.nl/ |
Mivel a szerzője ugyanaz, mint az rkhunternek, működése, konzolos színvilága is meglehetősen hajaz rá. Az egyes tesztek között Enter-rel folytatódik a program futása, a munka befejeztével pedig javaslatokat kapunk, amiket vagy megfogadunk, vagy nem:
================================================================================ -[ Lynis 1.2.6 Results ]- Tests performed: 126 Warnings: ---------------------------- - [13:00:30] Warning: No password set on GRUB bootloader [test:BOOT-5121] [impact:M] - [13:02:12] Warning: No running NTP daemon or available client found [test:TIME-3104] [impact:M] Suggestions: ---------------------------- - [13:00:30] Suggestion: Run grub-md5-crypt and create a hashed password. After that, add a line below the line saying timeout=: password --md5 [test:BOOT-5121] - [13:00:40] Suggestion: Install a PAM module for password strength testing like pam_cracklib [test:AUTH-9262] - [13:00:40] Suggestion: When possible set expire dates for all password protected accounts [test:AUTH-9282] - [13:01:15] Suggestion: Enable logging to an external logging host for archiving purposes and additional protection [test:LOGG-2154] - [13:02:11] Suggestion: Enable auditd to collect audit information [test:ACCT-9628] - [13:02:12] Suggestion: Check if any NTP daemon is running or a NTP client gets executed daily, to prevent big time differences and avoid problems with services like kerberos, authentication or logging differences. [test:TIME-3104] - [13:02:17] Suggestion: Confirm that freshclam is properly configured and keeps updating the ClamAV database [test:MALW-3286] - [13:02:26] Suggestion: Harden the system by removing unneeded compilers. This can decrease the chance of customized trojans, backdoors and rootkits to be compiled and installed [test:HRDN-7220] ================================================================================ Files: - Test and debug information : /var/log/lynis.log - Report data : /var/log/lynis-report.dat ================================================================================ Hardening index : [64] [############ ] ================================================================================ Lynis 1.2.6 Copyright 2007-2009 - Michael Boelen, http://www.rootkit.nl/ ================================================================================ |
A program logja sokkal részletesebb, mint amit képernyőre megkapunk, érdemes belenézni. Ha továbbra is aggódunk otthoni gépünk biztonsága miatt, lehet még azt fokozni, viszont elképzelhető, hogy az már komfortérzetünk rovására is megy.
Ez az írás nem azt tárgyalja, hogyan tudunk ultrabiztonságos rendszert üzemeltetni, hanem inkább egészséges távolságtartással fordul a Hálóhoz és az ott elérhető szolgáltatásokhoz. Egészen biztosan sokmindent lehetne másképp és máshogy, más eszközökkel, más beállításokkal (pl. ssh-nál). A cél csak az volt, hogy a parancssorral már megbirkózott felhasználók ne idegenkedjenek ezektől az eszközöktől sem, igen hasznosak lehetnek a mindennapi számítógéphasználatban. Köszönöm a figyelmet.
szerző: sh4d0w
Alap tűzfal otthoni PC-re (iptables I)
Ez egy nagyon nagy téma, én csak az alapokat szeretném megmutatni a teljesség igénye nélkül.
Elsősorban fontosnak tartom leírni, hogy a szabályokat egy fájlban fogjuk elhelyezni amit létrehozhatunk például a /usr/local/sbin/ könyvtárban firewall_start.sh néven (pl).
Iptables
Adminisztrációs eszköz az Ipv4 csomagszűréshez és NAT-oláshoz. (részlet az iptables manualból)
Az iptables a hálózati rétegben működik, vagyis IP csomagokkal dolgozik. Szabályokat (rules) lehet vele felállítani amiket táblákba szervez. Három default (alapértelmezett) lánc (chain) létezik:
- INPUT – a kintről befelé érkező csomagokra match-el
- OUTPUT – a bentről kimenő csomagokra match-el
- FORWARD – az adott gépen átmenő csomagokra match-el
Megjegyzés: van még kettő (PREROUTING és POSTROUTING) de azok nem tartoznak bele ebbe a leírásba. Talán egy későbbiben.
Hozhatunk létre saját láncokat is. Lánc műveletek:
- N – új lánc létrehozása
pl.: iptables -N in_attack – létrehozza az in_attack láncot. - P – lánc policy beállítása
pl.: iptables -P INPUT DROP – ez a parancs beállítja az INPUT lánc policy-ját DROP-ra ami azt jelenti, hogy ha az INPUT láncban szereplő szabályok közül egyikre sem match-el egy csomag, akkor el lesz dobva. - F – töröl minden szabályt
pl.: iptables -F – minden létező szabályt töröl, de nem változtatja meg a láncok policy-jét!! - L – kilistázza a szabályokat, az egészet, vagy csak egy láncét
pl.: iptables -L INPUT – kilistázza az INPUT lánc összes szabályát. - X – törli az üres láncokat
pl.: iptables -X
Ennyi elmélet kezdésnek, a többit gyakorlati példákkal mutatnám be. Először hozzuk létre a fájlt a tűzfal szabályoknak (terminálban) és tegyük futtathatóvá:
Senki ne másolja be az általam írt parancsot, mindenki vegye a fáradtságot és kézzel írja be.
sudo touch /usr/local/sbin/firewall_start.sh sudo chmod +x /usr/local/sbin/firewall_start.sh |
Ezután már az elejét meg tudjuk írni:
sudo mcedit /usr/local/sbin/firewall_start.sh # mcedit helyett bármi lehet (nano, gedit, vi, vim ...) |
A tartalma pedig egyelőre:
1 2 3 4 5 6 | #!/bin/bash iptables -F iptables -X iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP |
A sorokat a magyarázás miatt számoztam be.
1. sor megadja az értelmező shellt
2. sor törli az összes szabályt
3. sor törli az üres láncokat (-F miatt már mind üres)
4. 5.6.sor beállítja a policy-ket DROP-ra
Az INPUT és az OUTPUT láncot is azzal célszerű kezdeni, hogy a lo (localhost) felé és felől engedünk mindent:
iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT |
Az „iptables” a program neve. A „-A INPUT|OUTPUT” mondja meg, hogy melyik láncra érvényes a szabály. A „-i” és „-o” a bejövő és kimenő interfészt jelenti. Vagyis a „-i lo” = bejövő interfész a localhost. „-j ACCEPT” határozza meg a csomagok sorsát amik illeszkednek erre a szabályra. a sorsok lehetnek: ACCEPT; DROP. Amit még fontos betenni minden tűzfal szabályok közé:
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT |
A „-m state –state ESTABLISHED,RELATED” a csomag állapotára utal. Vagyis azokra a csomagokra vonatkozik a szabály amik tőlünk indult csomagokra érkező válaszok. Tehát nem lehet köztük NEW (syn) csomag.
Jó tanács, hogy kifelé sem engedünk minden NEW csomagot, hiszen egy jó tűzfalban szűrni kell az OUTPUT láncot is. Vannak akik ezzel nem értenek egyet.
Tűzfal beállítása
Most mérjük fel az igényeket, mert ettől a ponttól egyedi esetek állnak fent. Most számoljunk azzal, hogy a szkriptet készítő felhasználó a következőket szeretné: internet (HTTP, HTTPS), MSN, IRC, levelezés és FTP.
- Internet:
- 80(HTTP)/tcp
- 443(HTTPS)/tcp
iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT
Ez egy egyszerű szabály ami kiengedi azokat a csomagokat amik TCP csomagok (-p tcp) és a célportjuk 80 és 443 (–dport 80|443). A 443-as port a HTTPS portja. Csakhogy ezzel még nem fok működni a böngészés, hiszen ezt a lépést megelőzi az IP cím felderítés (felodás [resolve]) DNS segítségével.
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
Így most már kiengedjük az 53-as célportú udp csomagokat is, amik a DNS szerverek felé mennek majd. A válasz befogadásáról nem kell külön gondoskodnunk, hiszen már van egy erre a célra írt szabályunk. (iptables -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT, ezt a sort érdemes az OUTPUT lánc legelejére tenni (az lo lánc szabály után) mivel a legtöbb csomag valoszinűleg erre fog matchelni, s így nem kell áthladnia az összes többi láncon)
- MSN:
- 1863/tcp
iptables -A OUTPUT -p tcp --dport 1863 -j ACCEPT
- IRC:
- 6667/tcp
iptables -A OUTPUT -p tcp --dport 6667 -j ACCEPT
- Levelezés:
- 25(SMTP)/tcp
- 465(SMTPS)/tcp
- 143(IMAP)/tcp
- 993(IMAPS)/tcp
- 110(POP3)/tcp
- 995(POP3S)/tcp
iptables -A OUTPUT -p tcp --dport 25 -j ACCEPT iptables -A OUTPUT -p tcp --dport 465 -j ACCEPT iptables -A OUTPUT -p tcp --dport 143 -j ACCEPT iptables -A OUTPUT -p tcp --dport 993 -j ACCEPT iptables -A OUTPUT -p tcp --dport 110 -j ACCEPT iptables -A OUTPUT -p tcp --dport 995 -j ACCEPT
- FTP:
- 20(FTP-DATA)/tcp
- 21(FTP)/tcp
iptables -A OUTPUT -p tcp --dport 20 -j ACCEPT iptables -A OUTPUT -p tcp --dport 21 -j ACCEPT modprobe ip_conntrack_ftp
A 3. sor egy FTP modul betöltése.
Összefoglalva és egyszerűsítve:
#!/bin/bash # modulok betolltese modprobe ip_conntrack_ftp iptables -F iptables -X iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP # INPUT lanc iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -j LOG --log-prefix „INPUT_DROP: ” iptables -A INPUT -j DROP # OUTPUT lanc iptables -A OUTPUT -o lo -j ACCEPT iptables -A OUTPUT -m state –state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -p tcp -m multiport --dport 20,21,25,80,110,143,443,465,993,995,1863,6667 -j ACCEPT iptables -A OUTPUT -p udp --dport 53 -j ACCEPT iptables -A OUTPUT -j LOG --log-prefix „OUTPUT_DROP: ” iptables -A OUTPUT -j DROP |
Lényegében ez egy nagyon egyszerű, de a semminél mégis lényegesen több tűzfal. Mind a két láncban van két utolsó „ismeretlen” szabály. 15. és 24. sor: sorsa LOG. Loggol (naplóz) minden csomagot ami nem illeszkedett egyetlen szabályra sem. 16. és 25. sor Loggolás után eldob minden csomagot ami egyetlen előző szabálya sem illeszkedett.
Tipp: A logot ki lehet kapcsolni, de én ezzel a módszerrel derítettem ki, hogy egyes alkalmazások milyen portokon szeretnének kommunikálni. A módszer:
$ tail -f /var/log/messages |
Hagyni kell had fusson, majd elindítani a kérdéses alkalmazást és figyelni kell, milyen csomagokat dob el. A log-ban benne lesz, hogy milyen cél vagy forrás portot igényel és az tcp vagy udp -e.
Én szeretem bekapcsolva hagyni a logot, de hogy mégsem legyen sok felesleges log, van még pár szabály a tűzfalamban:
iptables -A INPUT -p tcp -m multiport --dport 135,137,139,445,1026,1027,5900,6881 -j DROP iptables -A INPUT -p udp -m multiport --dport 135,137,139,445,1026,1027,5900 -j DROP |
Ezeket a 14. sor után tettem be. Így ezeket a csomagokat log nélkül eldobja.
135/tcp - epmap, # Location Service 137/tcp - netbios-ns, # NETBIOS Name Service 139/tcp - netbios-ssn # NETBIOS session service 445/tcp - microsoft-ds # Microsoft Naked CIFS 1026/tcp - nem szabványos port 1027/tcp - nem szabványos port 135/udp - epmap, 137/udp - netbios-ns, 139/udp - netbios-ssn 445/udp - microsoft-ds 1026/udp - nem szabványos port 1027/udp - nem szabványos port |
Ezzel kész egy egyszerű tűzfal szkript ami a /usr/local/sbin/firewall_start.sh fájlban van. Következő lépések:
sudo touch /etc/init.d/firewall.sh sudo chmod +x /etc/init.d/firewall.sh sudo mcedit /etc/init.d/firewall.sh |
A következőket írjuk bele:
#!/bin/bash case "$1" in start) /usr/local/sbin/firewall_start.sh ;; stop) /usr/local/sbin/firewall_stop.sh ;; esac |
Ez egy kis indítószkript, amit szintén tovább lehet fejleszteni majd. De most a célnak megfelel, csak arra kell, hogy a tűzdal szkriptünk automatikusan lefusson rendszerindításkor.
Még egy dolog maradt hátra.
sudo ln -s /etc/init.d/firewall.sh /etc/rc2.d/S01Firewall |
Rc2.d könyvtárba akkor, ha a futási szint 2. Alapértelmezetten 2, de ellenőrizzük le:
budacsik@budacsik-desktop:~$ runlevel N 2 |
Ki lehet próbálni, de mielőtt restartolunk, még egyszer nézzünk át mindent.
Tipp: Az összes port listáját meg lehet nézni a /etc/services fájlban.
Kiegészítés:
Minden esetben csak simán az „iptables” parancsot használtam. Sokan más formában írják meg, és talán igazuk van. A szkript elején létrehozzák a parancsok változóit. Az iptables parancs helye:
(which iptables) /sbin/iptables
Tehát a szkript eleje így néz ki:
#!/bin/bash # valtozok deklaralasa IPTABLES=”/sbin/iptables” # modulok betolltese modprobe ip_conntrack_ftp $IPTABLES -F $IPTABLES -X $IPTABLES -P INPUT DROP $IPTABLES -P OUTPUT DROP $IPTABLES -P FORWARD DROP |
Jól látszik, hogy most már a $IPTABLES változóval hivatkozok a programra.
További kiegészítés(2008.02.18 12:04):
Elegánsabb megoldás, ha a tűzfal kézi indítása után kiadjuk a következő parancsot:
Kimentéshez
sudo iptables-save > /home/budacsik/firewall.txt |
Visszatöltéshez
sudo iptables-restore < /home/budacsik/firewall.txt |
Hol hasznos ez? Firewall szkriptünk /usr/local/sbin/firewall_start.sh a következő képpen módosul:
#!/bin/bash sudo iptables-restore < /home/budacsik/firewall.txt |
Így nem az iptables kell hívogatni és a kimentett firewall.txt fájlt is lehet szerkeszteni. Sőt a fájlt megnézve hamar hozzá lehet szokni, és lehet eleve így elkészíteni a szkriptet, de én ettől eltekintenék, ugyanis hátránya pl, hogy nehéz kommentezni, könnyen átláthatatlanná válik… Szerintem maradjon meg az eredeti fájl is amit szerkesztünk, majd futtatjuk, lementjük és a továbbiakban azt töltjük vissza rendszerindításkor.
Szerző: Budácsik Attila (budacsik)
Elérhetőségek: budacsik@gmail.com makay.jozsef@gmail.com
Licenc: A dokumentum szabadon másolható, de nem módosítható. A dokumentumot tilos pénzért, vagy bármilyen járandóságért árusítani. Minden jog a szerzőnek van fenntartva.
További információk: Az esetleges hibákért a szerző nem vállal felelősséget. A szövegben felfedezett hibákat és észrevételeket a Makay József email-címére kérjük.
Minden jog fenntartva! © SKL-Projekt






