HOGYAN Port kopogtatás

A Gentoo Linux Wiki wikiből

Tartalomjegyzék

[szerkesztés] Bevezetés

A port kopogtatás egy nagyszerű eljárás a távoli elérés engedélyezésére annélkül, hogy növelnénk a biztonsági kockázatot a host internet felé néző portjainak tartós nyitvatartásával. Ezzel növelhetjük a védelmi szintet de természetesen nem nyújt védelmet a láma jelszavak és hasonlók használata ellen... Port kopogtatás használata esetén a tűzfalazott szerver futtatja a knock-daemon-t. Ez a daemon tcp vagy udp "kopogtatások" meghatározott sorrendjére hallgat melyhez egy műveletet rendel. A knock daemon a TCP/IP verem alsóbb szintjén ül így nem szükséges, hogy portot nyisson a működéshez. Ezáltal a program teljesen észrevétlen a külvilág számára. Ez némiképp növeli a biztonsági szintet mivel a támadó nem láthatja a futó knock daemon-t, maximum véletlenszerű kopogtatásokkal tehet kísérletet a hozzáférés megszerzésére.

A kliens oldalon a knock programmal tudunk "bekopogtatni" a szerverre, hogy kérvényezzük a szükséges parancs végrehajtását, általában egy port megnyitását távoli elérésre.

[szerkesztés] A szerver beállítása

A knock-daemon telepítése rendkívül egyszerű, de szükség van egy működő tűzfalra a knock helyes beállításához. Ja, és természetesen root jogosultság is szükséges:

# emerge knock 

Ezt követően a konfigurációs állomány szerkesztése következik, melynek valahogy így kell kinéznie:

[options]
    logfile = /var/log/knockd.log
[openSSH]
    sequence    = 7000,8000,9000
    seq_timeout = 5
    command     = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
    tcpflags    = syn
[closeSSH]
    sequence    = 9000,8000,7000
    seq_timeout = 5
    command     = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
    tcpflags    = syn

Ezt a formátumot követve könnyűszerrel módosíthatjuk vagy adhatunk hozzá új bejegyzést az állományhoz. A %IP% a kopogtató gép IP címét jelenti. Tehát a port csak annak a gépnek kerül megnyitásra majd bezárásra, amelyik a kopogtatást indítványozta. Természetesen a parancs nincs bekorlátozva az iptables használatára. Bármilyen parancs használható. Például nekem van egy olyan, amely bekapcsol egy gépet a hálózaton így akkor is el tudom azt érni távolról, ha valaki azt korábban kikapcsolta. A port számát :típus is követheti, ahol a tcp és udp csomagok közül választhatunk, valahogy így: 9000:tcp,8000:udp,7000:tcp. Ha nincs típus megadva, akkor az alapértelmezés szerint tcp csomagot jelent. Íme egy másik hasznos példa:

[opencloseSSH]
       sequence    = 7000,8000,9000
       seq_timeout = 5
       tcpflags    = syn
       start_command = /usr/sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
       cmd_timeout   = 10
       stop_command  = /usr/sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT

Ebben a példában amikor a 7000, 8000 és 9000 kopogtatás érkezik akkor lefuttatja a start_command-ban megadott parancsot. Ezt követően vár 10 másodpercet majd a stop_command futtatása következik. Ez tehát azt jelenti, hogy 10 másodpercet ad a kapcsolat felépítésére. Miután a kapcsolat felépült, a legtöbb tűzfal engedélyezi a kapcsolat folytatását, még akkor is ha a kapcsolódásra használt port lezárult. Mindenkinek javaslom ez utóbbi formátum használatát mert gyakran elfelejtjük bezárni a nyitott portot a munka befejeztével ha az első példából indulunk ki. Így ez könnyedén vezethet nyitott portok hosszú listájához az iptables-ben, amelyet később törölnünk kell.

[szerkesztés] Kiegészítés a második példához

Eme második példa tartalmazza a leginkább javasolt beállításokat az előbb említett okok miatt, de úgy találtam, hogy még egy szabályt hozzá kell adni az iptables-höz, hogy a fenti beállítás megfelelően működjön. A saját iptables konfigurációm Oskar Andreasson klasszikussá vált útmutatója alapján készült. Ahhoz, hogy kapcsolat folytatódhasson azt követően, hogy a knockd hozzáadta majd eltávolította az iptables szabályt a láncból, az alábbihoz hasonló szabályt kell létrehoznunk az iptables-ben:

iptables -A tcp_packets -p TCP -s 0/0 --dport ssh -j allowed \
    -m state --state ESTABLISHED

A kulcs a '-m state --state ESTABLISHED' paraméterben keresendő, amely mindig engedélyezi a felépített SSH kapcsolatoknak a folytatást. Mióta ezt hozzáadtam a (tartós) iptables szabályaimhoz, a beállítás tökéletesen működik. Természetesen ahogyan azt az eredeti szerző is jelezte, nagyon sok iptables konfiguráció már alaphelyzetben tartalmazza ezt a beállítást.

[szerkesztés] A knock indítása bekapcsoláskor

A knock hozzáadása egy futási szinthez a szokásos módon történik, majd egyből el is indítjuk azt:

# rc-update add knock default
# /etc/init.d/knock start 

Amennyiben a knocknak egy az eth0-tól eltérő interfészen kell figyelnie az /etc/conf.d/knock állományban ez fölüldefiniálható a -i <interfész> megadásával:

OPTS="-d -i ppp0"

[szerkesztés] További feladatok

Győződj meg róla, hogy minden port zárva van a tűzfalon melyeket a portknock szabályoz, máskülönben az egész portkopogtatás haszontalanná válik.

[szerkesztés] A knock kliens használata

A program másik oldalát knock-nak kívják és daemon-al egy csomagban érkezik. Amennyiben szeretnéd külön letölteni a programot, hogy Win32-n is használhasd, akkor ezt megteheted a project honlapjáról. Amennyiben egy másik linuxos gépről szeretnéd használni, úgy le kell szedned az egész csomagot ott is vagy egyszerűen csak át kell másolnod a /usr/bin/knock-ot. A parancsot a következő módon adhatjuk ki:

# knock hostname portnumber portnumber portnumber 

A csomag típusok egyszerűen cserélhetőek tcp és udp között a korábban említett módon. Nagyon erősen javaslom, shell script-ek gyártását a gyakran használt kopogtatások lekezelésére.

[szerkesztés] Konklúzió

Gratulálok, megcsináltad! Ha mindent megfelelően követtél és egy működő tűzfallal kezdtél, akkor mostanra a port kopogtatás implementálva lett a szervereden. További információért a programmal kapcsolatban látogass el a project honlapjára.

Személyes eszközök