CGI Security
Emeric
írta vala a biztonságos CGI futtatásról a cikket, ehhez lenne
egypár hozzászolásom. Ugye a CGI alapjába véve egy gépfüggetlen,
programozási nyelv független dolgot takar, az az ha valaki CGI-t
akar írni azt elég sokféle módon megteheti, egy dolgot azért szem
előtt kell tartania, a CGI-jét olyan nyelven kell megírnia, amely
futni fog azon a szerveren, amelyre fel fog kerülni a CGI.
Ez
áltlánosságban ugye egy Unix-os dolgot takar ( jobb esetben Linux-ot..:)
). Itt merül fel az első biztonsági probléma, mert ugye az Apache
webszervernek van windows-os portja is, namármost ezt felpakoljuk
egy win9x-re, és elkezdünk rajta CGI-t futtatni (pl. dos binárisokat).
Ebben az esetben a biztonságról egyedül az Apache fog tudni gondoskodni,
már amenyire meg tudja ezt tenni. (gondolom nem kell most azt
részleteznem hogy milyen hatásfogú lesz ez a védelem)
Tehát
első lépésben, próbáljunk egy olyan operációs rendszert keresni
a web szerverünknek, amely rendszerszinten támogatja a több felhasználót,
valamint a több felhasználó között az adatok védelmét. Ez alap,
ettől semmiféleképpen ne térjünk el, mert akkor előfordulhat,
hogy farkaskönnyeket ejtve siratjuk a szerverünket.... Ilyen operációs
rendszer valamelyik Unix variáns (Linux, Solaris, Irix, FreeBSD
stb...), vagy VMS, ha már minden part szakad akkor lehetséges
egy winNT-t használni web szerverként, de ezt lehetőleg csak akkor
válasszuk, ha mondjuk pl. egy intranet-nek szolgáltatunk http-t,
mert ha internetten is rajta van a szerverünk, akkor a farkaskönyhullatás
itt is fennáll.
Egy
fontos dolgot érdemes itt megjegyezni, mindenképpen úgy áljunk
neki a dolognak, hogy lehetőleg próbáljuk felmérni, hogy ki fogja
használni a webszervert. Például ha egy intranettes webszervert
kreálunk, akkor ugye elég kicsi a valószinűsége annak, hogy mondjuk
a Joli, a titkárnő, craker-é avenzsál , hogy feltörje a szerverünket.
Ha azt a gondolatot forgatjuk a fejünkben, hogy egy olyan szervert
készítünk, amely 24 órában fent fog lógni az internetten, akkor
készüljünk fel arra, hogy a biztonság az egyik fő szempont legyen,
mert hát bizony előfordulhat, hogy egy Argentin craker azt tekinti
élete céljának, hogy a mi szerverünket feltörje, és ha nem tarjuk
szem előtt a biztonságot, sikerülhet is neki!
Az
általam jónak tartott párosítások, bár itt meg kell jegyeznem,
hogy ez a lista igen szubjektív :
Intel - Debian GNU/Linux
Amiga
- Debian GNU/Linux
Macintosh
- Debian GNU/Linux
SGI - Irix
Sparc Solaris
Alpha Digital Unix, vagy Linux
VAX - VMS
(lehetőleg
próbáljuk meg az adott operációs rendszer utolsó stabil verziója
előtti stabil verziót felinstallálni, ez igen kiemelten igaz a
Linux-okra, kisebb mérékben a többi op. rendszere, pl. VMS-re
egyáltalán nem. Miért is van ez? Új rendszer - új hibák, viszont
az se jó ha túl régi, mert akkor valószinűleg minden craker palánta
ismeri már a rendszer expolit-jait, biztonsági hibáit.)
Tehát
megvan a operációs rendszer. Ha ezt jól választjuk ki, akkor már
egy jelentős lépést tettünk a biztonság felé, a következő lépés
a megfelelő webszerver kiválasztása, ennek kapcsán igazándiból
az Apache-ot tudom meleg szível ajánlani, mivel egyéb szerverekkel
nem igazán van tapasztalatom.
Az
ezután az általam követendőnek tartott irányelvek :
-
A rendszeren lévő felhasználók számát próbáljuk szükséges szinten
tartani, mert biztonsági szempontból minden egyes felhasználó
+1 hibalehetőség. Egy szervert általában könnyebb megtörni belűről,
mint kivülről.
-
Ha lehetséges akkor egy gépen, csak egy szervert futtasunk. Ez
a legkeményebb dió, mert igen ritkán fordul elő, hogy az embernek
van 5-6 Ip címe, és minden Ip cím mögé külön gépet tud állítani.
- Ha több szerver fut a gépen akkor azoknak próbáljuk a lehető
legbiztonságosabb verzióját futtatni. Mire is gondolok itt tulajdonképpen?
Például próbáljuk a felhasználókat rábírni a Telent helyett az
SSH használatára. Az ftp szerverünk lehetőleg ne a operációs rendszer
alap ftp szervere legyen (in.ftpd helyett pl. ProFTPd, Wu-FTPD).
- Semmiképpen ne futtasunk IMAP, rlogin, rexec, boot, X, DNS,
TimeSync szervereket hacsak nincs rájuk kifejezetten szükség.
- Sürün olvasgassuk a www.roootshell.com-t.....:)
Nagyjából
ezek lennének az operációs rendszer részéről igénylet dologok,
perszer a lista korántsem teljes, csak egy körülbelüli irányt
ad.
Ha
megvan a biztonságosnak tartott web szerver, akkor essünk neki
a CGI-nek. Ez egy igen macerás, és az estek nagy többségében igen
időigényes feladat, valószinűleg sokkal több időnket fogja felemészteni,
mint a szerver elindítása.
-
Első és igen fontos aranyszabály, hogy egy CGI csak egy dolgot
csináljon, mert egy többszálú, sok funkciós programban sokkal
könyebb hibát véteni, mint egy 50 soros programban
-
Ehhez kapcsolódik egy probléma, hogy miben is írjuk meg a CGI-t,
szerintem 2 igazán jó programozási nyelv van erre a célra. Első
a Perl, amiben elsősorban egyszerübb feladatokat lehet jól megoldani
(szem előtt tartva a hatékonyság elvét). A második a C, ebben
a nyelvben lehetőleg ne akarjunk egyszerű feladatokat megoldani,
mert előfordulham hogy egy hetünk rámegy arra, mire tudnuk írne
egy olyan rutint, ami Perl-ben egy utasítás. A C-t tartalékoljuk
a nagyobb feladatokra.
-
Az adott CGI-ben próbáljunk lehetőleg mined bevitt adatot többször
is ellenőrizni, több szempotból (pl. nem-e esteleg egy parancsot
próbál megetetni a CGI-vel, nem fog-e kiakadni a program, egy
esetleg érdekes adat kapcsán, nem fog-e kilógni a beviteli buffer-ból
bevitt adat)
A
Konkrét hibák elemzését, és elhárítását inkább Emeric-re hagynám.
(na majd kapsz-Emeric SH)
Achos (achos@abakusz.matav.hu)