Príklad skriptu CGI na blokovanie prístupu

linux_server.jpg V pred­chád­za­jú­cej čas­ti sme spo­me­nu­li zá­sa­dy tvor­by skrip­tov GCI, ná­zor­ne sme uká­za­li, ako sa skrip­ty CGI vy­tvá­ra­jú, tes­tu­jú a ako fun­gu­jú. Na­ko­niec sme skript pre­vied­li do po­do­by HTML. Tie­to ukáž­ko­vé skrip­ty sí­ce fun­go­va­li, ale ich prak­tic­ké vy­uži­tie bo­lo mi­ni­mál­ne. Ten­to­raz vy­tvo­rí­me ap­li­ká­ciu, kto­rej vy­uži­tie je nao­zaj reál­ne.

Mo­de­lo­vá si­tuácia
V ne­me­no­va­nej stred­nej ško­le je ce­lá po­čí­ta­čo­vá sieť (všet­ky učeb­ne) pri­po­je­ná k inter­ne­tu cez li­nuxový server. Po­čas vy­učo­va­nia in­for­ma­ti­ky sa veľ­mi čas­to stá­va, že štu­den­ti pra­cu­jú­ci s po­čí­ta­čom veľ­mi ra­di „od­bie­ha­jú“ od pl­ne­nia kon­krét­nej úlo­hy k preh­lia­da­niu inter­ne­tu. Sa­moz­rej­me, efekt vy­učo­va­nia sa veľ­mi zni­žu­je. Pre­to by bo­lo dob­ré, ke­by exis­to­va­la mož­nosť, aby štu­den­ti ne­moh­li v kon­krét­nom ča­se sur­fo­vať na inter­ne­te, ale ma­li mož­nosť pra­co­vať na po­čí­ta­či (nap­rík­lad prog­ra­mo­vať). Od­po­je­nie káb­la od server­a nie je naj­vhod­nej­šie rie­še­nie, pre­to­že v inej učeb­ni prá­ve v tom is­tom ča­se ma­jú štu­den­ti po­vo­le­ný prís­tup na inter­net, prí­pad­ne pe­da­gó­go­via v ka­bi­ne­toch prís­tup po­tre­bu­jú. Od­pá­jať fy­zic­ky jed­not­li­vé po­čí­ta­če tiež nie je veľ­mi správ­ne, naj­mä ak po­tre­bu­jú zá­ro­veň prís­tup k lo­kál­ne­mu server­u ale­bo k zdie­ľa­ným pros­tried­kom.

Naj­efek­tív­nej­šie sa zdá sof­tvé­ro­vé od­po­je­nie kon­krét­ne­ho po­čí­ta­ča od inter­ne­tu. Na iden­ti­fi­ká­ciu po­čí­ta­ča je naj­vhod­nej­šie po­užiť je­ho ad­re­su IP. Nech te­da má­me na ško­le učeb­ňu, kde po­čí­ta­če ma­jú ad­re­sy IP v roz­sa­hu od 192.168.1.31 do 192.168.1.39. Nech škol­ský server má dve roz­hra­nia, jed­no (eth0) s pri­po­je­ním do inter­ne­tu a dru­hé (eth1) s pri­po­je­ním do lo­kál­nej škol­skej sie­te. Ten­to škol­ský server spros­tred­kú­va ko­mu­ni­ká­ciu do inter­ne­tu cez proxy server (už sme ho spo­mí­na­li), kto­rý na­čú­va na po­rte 3128.

Za­bez­pe­če­nie
Naj­jed­no­duc­hší spô­sob, ako us­ku­toč­niť sof­tvé­ro­vé „od­po­je­nie“ od prís­tu­pu na inter­net, je rie­še­nie pria­mo na škol­skom server­i. Vy­uži­je­me mož­nosť za­had­zo­va­nia všet­kých pa­ke­tov TCP, kto­ré prí­du na server na je­ho vnú­tor­né roz­hra­nie eth1 a kto­ré sme­ru­jú na proxy server, te­da na po­rt 3128 a ich zdro­jom je po­čí­tač, kto­rý chce­me blo­ko­vať (ad­re­sa IP). Tak­to ne­zab­rá­ni­me škol­ským po­čí­ta­čom v prís­tu­pe na server, k je­ho zdie­ľa­ným sú­bo­rom a pros­tried­kom, ale do inter­ne­tu cez proxy už nep­rej­dú.

Vý­bor­ný nas­troj, kto­rý sme tu už párkrát po­uži­li, je net­fil­ter a je­ho prí­kaz ip­tab­les.

Od­po­je­nie
Syn­tak­tic­ký zá­pis prí­ka­zu ip­tab­les, pl­nia­ce­ho opí­sa­nú úlo­hu, je:

ip­tab­les -I IN­PUT -i vnú­tor­né_roz­hra­nie -p TCP -s ad­re­sa_PC --dport 3128 -j DROP

kde pa­ra­me­ter –I zna­čí, že sa to­to pra­vid­lo pri­dá na za­čia­tok re­ťa­ze IN­PUT, pa­ra­me­ter –i zna­čí, že pa­ke­ty bu­dú pric­hád­zať z vnú­tor­né­ho_roz­hra­nia server­a, (te­da z lo­kál­nej sie­te), pa­ra­me­ter –p ur­ču­je typ pro­to­ko­lu, tom­to prí­pa­de TCP, pa­ra­me­ter –s ur­ču­je ad­re­su zdro­ja pa­ke­tov, pa­ra­me­ter –dport 3128 ur­ču­je, kam pa­ke­ty sme­ro­va­li, a na­ko­niec pa­ra­me­ter –j DROP ho­vo­rí, že prá­ve tie­to pa­ke­ty tre­ba za­ho­diť. Tak­že prí­kaz na za­blo­ko­va­nie prís­tu­pu po­čí­ta­ča s ad­re­sou IP 192.168.1.31 bu­de ta­ký­to:

ip­tab­les -I IN­PUT -i eth1 -p TCP -s 192.168.1.31 --dport 3128 -j DROP

Pri­po­je­nie
Nes­mie­me za­bud­núť, že ak po­čí­tač od­po­jí­me, bu­de­me ho chcieť nie­ke­dy zno­va pri­po­jiť. To do­siah­ne­me tým, že uve­de­né pra­vid­lo vy­ma­že­me z re­ťa­ze IN­TUP. Na to slú­ži opäť prí­kaz ip­tab­les, ale na­mies­to pa­ra­met­ra –I za­dá­me pa­ra­me­ter –D (ako de­le­te):

ip­tab­les -D IN­PUT -i eth1 -p TCP -s 192.168.1.31 --dport 3128 -j DROP

Shello­vé skrip­ty
Keď­že chce­me blo­ko­vať viac po­čí­ta­čov a blo­ko­va­nie aj opä­tov­né po­vo­le­nie chce­me ro­biť „auto­ma­ti­zo­va­ne“, vy­tvo­rí­me si shello­vé skrip­ty, kde uve­die­me prí­ka­zy ip­tab­les pre jed­not­li­vé po­čí­ta­če. Na blo­ko­va­nie vy­tvo­rí­me sú­bor s náz­vom vyp, na po­vo­le­nie vy­tvo­rí­me sú­bor zap. Tie­to sú­bo­ry sú ulo­že­né v ad­re­sá­ri /etc/vy­pzap/.

Ob­sah sú­bo­ru vyp bu­de ta­ký­to:

#!/bin/sh
ip­tab­les -I IN­PUT -i eth1 -p TCP -s 192.168.1.31 --dport 3128 -j DROP
ip­tab­les -I IN­PUT -i eth1 -p TCP -s 192.168.1.32 --dport 3128 -j DROP
ip­tab­les -I IN­PUT -i eth1 -p TCP -s 192.168.1.33 --dport 3128 -j DROP
ip­tab­les -I IN­PUT -i eth1 -p TCP -s 192.168.1.34 --dport 3128 -j DROP
ip­tab­les -I IN­PUT -i eth1 -p TCP -s 192.168.1.35 --dport 3128 -j DROP
ip­tab­les -I IN­PUT -i eth1 -p TCP -s 192.168.1.36 --dport 3128 -j DROP
ip­tab­les -I IN­PUT -i eth1 -p TCP -s 192.168.1.37 --dport 3128 -j DROP
ip­tab­les -I IN­PUT -i eth1 -p TCP -s 192.168.1.38 --dport 3128 -j DROP
ip­tab­les -I IN­PUT -i eth1 -p TCP -s 192.168.1.39 --dport 3128 -j DROP

Ob­sah sú­bo­ru zap bu­de ta­ký­to:

#!/bin/sh
ip­tab­les -D IN­PUT -i eth1 -p TCP -s 192.168.1.31 --dport 3128 -j DROP
ip­tab­les -D IN­PUT -i eth1 -p TCP -s 192.168.1.32 --dport 3128 -j DROP
ip­tab­les -D IN­PUT -i eth1 -p TCP -s 192.168.1.33 --dport 3128 -j DROP
ip­tab­les -D IN­PUT -i eth1 -p TCP -s 192.168.1.34 --dport 3128 -j DROP
ip­tab­les -D IN­PUT -i eth1 -p TCP -s 192.168.1.35 --dport 3128 -j DROP
ip­tab­les -D IN­PUT -i eth1 -p TCP -s 192.168.1.36 --dport 3128 -j DROP
ip­tab­les -D IN­PUT -i eth1 -p TCP -s 192.168.1.37 --dport 3128 -j DROP
ip­tab­les -D IN­PUT -i eth1 -p TCP -s 192.168.1.38 --dport 3128 -j DROP
ip­tab­les -D IN­PUT -i eth1 -p TCP -s 192.168.1.39 --dport 3128 -j DROP

Aby to bo­li skrip­ty spus­ti­teľ­né, mu­sia ob­sa­ho­vať pr­vý ria­dok v tva­re #!/bin/sh a mu­sí­me im nas­ta­viť at­ri­bút spus­ti­teľ­nos­ti, nap­rík­lad prí­kaz­mi

	[root@ru­bin vy­pzap]# chmod 755 vyp    
	[root@ru­bin vy­pzap]# chmod 755 zap    

Od­skú­ša­nie a ove­re­nie
Tak­to vy­tvo­re­né skrip­ty po­stup­ne od­skú­ša­me. Naj­prv spus­tí­me sú­bor vyp prí­ka­zom

 [root@ru­bin vy­pzap]# ./vyp   

Či nao­zaj doš­lo k blo­ko­va­niu prís­tu­pu, to si ove­rí­me prí­ka­zom

 [root@ru­bin vy­pzap]# ip­tab­les –L IN­PUT   

Ak na ob­ra­zov­ke server­a uvi­dí­me vý­pis, kto­rý sa za­čí­na tak­to:

Chain IN­PUT (po­li­cy DROP)
tar­get     prot opt sour­ce               des­ti­na­tion         
DROP       tcp  --  192.168.1.37         anywhe­re            tcp dpt:squid 
DROP       tcp  --  192.168.1.36         anywhe­re            tcp dpt:squid 
DROP       tcp  --  192.168.1.35         anywhe­re            tcp dpt:squid 
DROP       tcp  --  192.168.1.34         anywhe­re            tcp dpt:squid 
DROP       tcp  --  192.168.1.33         anywhe­re            tcp dpt:squid 
DROP       tcp  --  192.168.1.32         anywhe­re            tcp dpt:squid 
DROP       tcp  --  192.168.1.31         anywhe­re            tcp dpt:squid 
AC­CEPT     all  --  anywhe­re             anywhe­re            sta­te 
.
.
.

vie­me, že skript vyp fun­gu­je správ­ne.

Zá­ro­veň pria­mo na klient­skych po­čí­ta­čoch vo vhod­nom inter­ne­to­vom preh­lia­da­či vy­skú­ša­me, či mož­no zob­ra­ziť niek­to­rú strán­ku. Ak sme všet­ko uro­bi­li správ­ne, preh­lia­dač by ne­mal strán­ku na­čí­tať! Po­tom spus­tí­me sú­bor zap. Po opä­tov­nej kon­tro­le prí­ka­zom ip­tab­les –L IN­PUT by sme už ne­ma­li na za­čiat­ku vý­pi­su vi­dieť uve­de­ný text. To zna­čí, že blo­ko­va­cie pra­vid­lá bo­li z re­ťa­ze od­strá­ne­né. Zno­va pria­mo na klient­skych po­čí­ta­čoch vo vhod­nom inter­ne­to­vom preh­lia­da­či vy­skú­ša­me, či mož­no zob­ra­ziť niek­to­rú strán­ku. Ten­to­raz by preh­lia­dač mal strán­ku na­čí­tať.

Skrip­ty CGI
Ako sme si spo­mí­na­ným spô­so­bom vy­skú­ša­li, do­ká­že­me ov­lá­dať prís­tup k inter­ne­tu po­mo­cou skrip­tov vyp a zap pria­mo z kon­zo­ly li­nuxové­ho server­a. Te­raz po­tre­bu­je­me vy­tvo­riť skrip­ty, kto­ré bu­dú spo­jov­ní­kom med­zi kon­zo­lo­vý­mi skrip­ta­mi vyp a zap a pro­to­ko­lom HTTP. Prá­ve na to slú­žia skrip­ty CGI. Naj­prv vy­tvo­rí­me skript CGI s náz­vom vyp.cgi a ulo­ží­me ho do ad­re­sá­ra, kto­rý je de­fi­no­va­ný pre skrit­py CGI, te­da naj­čas­tej­šie /var/www/cgi-bin/.

Ob­sah skrip­tu vyp.cgi je ta­ký­to:

#!/bin/sh
# Net­fil­ter CGI script VY­PNI
#
# Po­sla­nie hla­vic­ky HTTP 
ec­ho Con­tent-ty­pe: text/html;char­set=ISO-8859
ec­ho
# Ov­la­daj - vy­pni
cd ..
/etc/vy­pzap/vyp
# web da­ta
ec­ho "<html><head></head><bo­dy>"
ec­ho "Inter­net vy­pnu­ty<br>"
ec­ho "<a href=\"/vy­pzap/vy­pzap.htm\">Chod na­zad na hlav­nu stran­ku</a>"
ec­ho "</bo­dy></html>"
#

Po­tom vy­tvo­rí­me skript s náz­vom zap.cgi. Je­ho ob­sah je ta­ký­to:

#!/bin/sh
# Net­fil­ter CGI script ZA­PNI
#
# Po­sla­nie hla­vic­ky HTTP
ec­ho Con­tent-ty­pe: text/html;char­set=ISO-8859
ec­ho
# Ov­la­daj – za­pni
cd ..
/etc/vy­pzap/zap
# web da­ta
ec­ho "<html> <head> </head> <bo­dy>"
ec­ho "Inter­net za­pnu­ty<br>"
ec­ho "<a href=\"/vy­pzap/vy­pzap.htm\">Chod na­zad na hlav­nu stran­ku</a>"
ec­ho "</bo­dy> </html>"
#

(Ak sa po­zrie­me bliž­šie, oba skrip­ty sú veľ­mi po­dob­né, roz­li­šu­jú sa iba na je­di­nom vý­kon­nom riad­ku). Oba skrip­ty ob­sa­hu­jú prí­ka­zy prí­ka­zo­vé­ho riad­ka (shel­lu), pre­to sa za­čí­na­jú riad­kom #!/bin/sh. Prí­kaz ec­ho je po­dob­ný ako prí­kaz print ja­zy­ka Perl (po­zri prík­la­dy v pre­doš­lej čas­ti). Prí­kaz cd.. prej­de do ko­re­ňa ad­re­sá­ro­vé­ho stro­mu. Vý­kon­ným prí­ka­zom /etc/vy­pzap/vyp sa spus­tí na­mi vy­tvo­re­ný skript vyp. Ob­dob­ne vý­kon­ným prí­ka­zom /etc/vy­pzap/zap sa spus­tí skript zap. Sek­cia ozna­če­ná web da­ta vy­tvo­rí webo­vú strán­ku, kto­rá in­for­mu­je o tom, či bol prís­tup k inter­ne­tu vy­pnu­tý (za­pnu­tý), a pres­me­ru­je po­uží­va­te­ľa na hlav­nú strán­ku.

Na­bu­dú­ce dopl­ní­me ten­to prík­lad o webo­vé roz­hra­nie a troc­hu ho eš­te zlep­ší­me.

Ďal­šie čas­ti >>

Zdroj: Infoware 4/2008



Ohodnoťte článok:
   
 

24 hodín

týždeň

mesiac

Najnovšie články

Li­nux prak­tic­ky ako server úvod
Linux ako server je pomerne zložitá technológia. Jej výhodou je určitá modularita, keď sa nemusí nastaviť celý server naraz, ale postupne. čítať »
 
Syn­chro­ni­zá­cia ča­su v Li­nuxe
V predchádzajúcich dvoch častiach sme si ukázali, že Linux a všeobecne open source softvér sa nenachádza iba v serveroch a počítačových sieťach, ale aj v iných zariadeniach bežnej domácej potreby a v oblasti hobby. čítať »
 
Za­ria­de­nia za­lo­že­né na Li­nuxe
V predchádzajúcej časti sme si spomenuli definície nie - ktorých pojmov z oblasti nášho záujmu, teda Linuxu. Vysvetlili sme si, čo je to Open Source, Public Domain, proprietárny softvér a GNU GPL. Tentoraz ukážeme, ako sa tieto pojmy využívajú v praxi. čítať »
 
Po­jmy z ob­las­ti
Tentoraz na chvíľu trochu odbočíme od bezpečnosti Linuxu a jeho siete. V tejto neštandardnej časti seriálu sa mu budeme venovať len okrajovo. čítať »
 
Bez­peč­nosť bez­drô­to­vých sie­tí II.
V predchádzajúcej časti sme sa začali zaoberať bezpečnosťou bezdrôtových sietí. Poukázali sme na rôzne faktory zneužitia siete, podstatu rizika a vysvetlili sme základné prvky bezpečnosti. čítať »
 
Bez­peč­nosť bez­drô­to­vých sie­tí I.
V predchádzajúcich častiach sme sa venovali bezpečnosti linuxového servera. Riešili sme firewall, bezpečnosť prístupu na internet, zaoberali sme sa demilitarizovanou zónou a podobne. čítať »
 
Údr­žba lo­gov – kon­fi­gu­rá­cia log­ro­ta­te
V predchádzajúcej časti sme sa venovali rotácii logov. Vysvetlili sme princíp ukladania logov, spôsob, ako sa rotujú, a uviedli sme niečo o tom, čo a ako treba nastaviť čítať »
 
Údr­žba lo­gov – ro­tá­cia
V predošlej časti sme sa zaoberali spôsobom logovania informácií na iný alebo vzdialený počítač a ukázali sme, ako riešiť problém s logovaním uzavretých procesov pomocou chroot. čítať »
 
 
 
  Zdieľaj cez Facebook Zdieľaj cez Google+ Zdieľaj cez Twitter Zdieľaj cez LinkedIn Správy z RSS Správy na smartfóne Správy cez newsletter