Priprava Solarisa za požarni zid


Oboroževanje Solaris-a


Lance Spitzner
Zadnjič spremenjeno: 10.05.2000


Požarni zid je eno najbolj hitro razvijajočih se orodij na področju informacijske varnosti. Vendar pa je požarni zid le toliko varen, kot je varen operacijski sistem, na katerem stoji. Ta članek postopoma opisuje, kako najbolje oborožiti Solaris strežnik; za Sparc in x86 procesorski strukturi. Postopek ustreza vsaki situaciji, sam pa bom uporabljal Check Point FireWall-1 na Solaris 2.6 operacijskem sistemu kot primer. Na koncu tega članka se nahaja skript, ki avtomatizira večino oborožitvenih procesov, vključno z implementacijo TCP Wrappers.


Namestitev


Najboljši začetek zaščite sistema je na začetku - pri namestitvi. Ker je to požarni zid, ne moremo zaupati nobeni predhodni namestitvi. Potrebno je začeti s "čisto" (clean) namestitvijo, saj le tako lahko zagotovimo neoporečnost sistema.

Postavite sistem na izolirano omrežje. Sistema ne smete postaviti na aktivno omrežje ali celo na Internet, saj tvegate vdor, ker sistem ni primerno zaščiten. Sam sem bil priča vdoru script kiddie-a po 15 minutah povezave nekega strežnika v Internet. Za pridobitev pomembnih datotek ter popravkov potrebujete še en računalnik z dostopom do Interneta iz katerega boste prenašali te datoteke ter popravke na strežnik preko omrežja.

Ko ste postavili bodoči Solaris požarni zid na izolirano omrežje, ste pripravljeni. Prvi korak je izbira operacijskega sistema, ki ga hočete naložiti. Naložiti hočemo minimalno namestitev in s tem omogočiti maksimalno učinkovitost. Manj nepotrebne programske opreme je na strežniku, manj je potencialne možnosti, da kdo izrabi kakšno varnostno luknjo. Priporočam "Core" namestitev. Najboljša se mi zdi zato, ker je to absolutno najmanjša namestitev in zagotavlja bolj varen sistem. Za paranoične sem pripravil kontrolni seznam, kako prirediti Core namestitev. Če potrebujtete GUI (grafično okolje), dodatno funkcionalnost in če ste novi na Solaris-u, predlagam opcijo "End User". Vse kar je nad paketom "End User", kot je recimo "Developer", je dodajanje neuporabne in hkrati za varnost škodljive programske opreme. Nujno dodajte "On-Line Manual Pages" paket med namestitvenim procesom. Ti priročniki so zelo uporabni in praktično ne pomenijo nobene nevarnosti za sistem. Za več informacij, kako narediti minimalno instalacijo, si oglejte Solaris Minimization for Security (ang).

Med namestitvenim procesom boste vprašani po razdelitvi diskovnega prostora. Nikoli nisem razumel Sun-ove ljubezni do ustvarjanja različnih particij, kot sta /opt in /usr. Na ta način vedno narediš particije premajhne in ti čez nekaj časa zmanjka prostora na njih. Jaz vedno rad naredim koreninsko particijo veliko kolikor se da in vržem vse tja, tako da mi ne zmanjka prostora. Da bi zavarovali root particijo, vseeno potrebujemo še kakšno particijo, kjer bomo imeli podatke kot so e-mail-i, dnevniki ipd. Če bi ti podatki napolnili root particijo, bi verjetno prišlo do sesutja sistema.

Zaradi tega priporočam, da naredite posebno particijo za /var direktorij, kjer se bo shranjevala vsa pošta ter vsi dnevniki. Z izolacijo /var particije boste root particijo obvarovali pred zapolnitvijo. Navadno je 400 MB več kot dovolj za /var. Lahko se tudi odločite za posebno particijo za dnevnike.Pri Checkpoint Firewall 1, se vsi dnevniki pišejo v /etc/fw/log. (/var/opt/CKPfw/log for ver4.0). Veliko Solaris sistemov ima 2 ali več pogona, recimo Ultra 10 ali 2 IDE pogona za x86 strukturo. Če ne zrcalite drugega diska, naredite na njem particijo za vse dnevnike od požarnega zida. Še enkrat: tako zaščitite vse ostale particije v primeru "poplave" dnevnikov. S tako organizacijo bi particije izgledale nekako tako:


/ - everything else
/var - 400 MB
swap - 256 MB (or normally 2x amount of RAM)
/etc/fw/log - 2nd drive (for CP FW-1 ver 3.0x)
/var/opt/CKPfw/log - 2nd drive (for CP FW-1 ver 4.0x)
/var/opt/CPfw1-41/log - 2nd drive (for CP FW-1 ver 4.1x)


Ko ste računalnik po namestitvi ponovno zagnali, morate namestiti vrsto popravkov od Sun-a. Popravke si iz Interneta presnemite s pomočjo drugega računalnika, ki je priklopljen na Internet in ne iz požarnega zidu, ki ga ravnokar pripravljate. Popravki so ZELO POMEMBNI za varen požarni zid in morajo biti posodobljeni vsaj enkrat tedensko. BUGTRAQ je izvrsten vir najnovejših hroščev in ranljivosti.


Odstranjevanje servisov


Ko ste namestili operacijski sistem, popravke ter ponovno zagnali računalnik ste pripravljeni na "oborožitev" sistema. Oborožitev sestavljajo: izklopitev nepotrebnih servisov, uvedba dnevnikov, prireditev nekaterih datotek in TCP Wrappers. Najprej bomo začeli z izklapljanjem nepotrebnih servisov.

Privzeto je Solaris močan operacijski sistem, ki izvaja veliko število uporabnih servisov. Vendar je veliko teh servisov nepotrebnih in predstavljajo le možno varnostno tveganje za požarni zid. Najprej začnimo z datoteko /etc/inetd.conf. Ta datoteka določa, za katere servise bo /usr/bin/inetd daemon poslušal. Privzeto je /etc/inetd.conf konfiguriran za 35 servisov, vi pa verjetno potrebujete dva: ftp in telnet. Odstranite ostale nepotrebne servise tako, da jih komentirate (primer). To je zelo pomembno, saj veliko servisov pod inetd-jem predstavlja lahko težave z varnostjo, kot so rexd ipd. Poglejte katere servise ste pustili odprte z ukazom:


#grep -v "^#" /etc/inetd.conf


Naslednja stvar, ki jo je treba pregledati sta direktorija /etc/rc2.d in /etc/rc3.d. Tukaj boste našli zagonske skripte, ki se zaženejo ob inicializaciji (init) sistema. Skript onemogočite tako, da zamenjate veliko črko S v imenu datoteke z malo črko s. To omogoča enostavno vrnitev skripta v prejšnje (delujoče) stanje.


/etc/rc2.d
S73nfs.client
- Uporabljano za NFS mounting system (vpenjanje NFS datotečnih sistemov). Požarni zid ne sme vpenjati drugih datotečnih sistemov.
S74autofs - Uporabljano za avtomatično vpenjanje. Še enkrat: požarni zid ne sme vpenjati drugih datotečnih sistemov.
S80lp - Uporabljano za tiskanje. Vaš požarni zid ne bi smel nikoli imeti potrebe po tiskanju.
S88sendmail - Posluša za prihajajočo pošto. Sistem lahko še vedno pošilja pošto (opozorila), tudi če je to onemogočeno.
S71rpc - Portmapper daemon, zelo nezanesljiv servis (potrebujtete ga če poganjate CDE).
S99dtlogin - CDE daemon, zažene CDE po privzetih nastavitvah.

/etc/rc3.d
S15nfs.server
- Uporabljano za večuporabniškost datotečnih sistemov. Slaba ideja za požarni zid.
S76snmpdx - SNMP daemon.


Poganjanje kateregakoli grafičnega okolja (CDE ali OpenWindows) ni priporočljivo. Grafično okolje imejte le, če nujno potrebno. Lahko onemogočite CDE, privzeto grafično okolje za Solaris 2.6 s S99dtlogin zagonskim skriptom (zamenjajte velik S z malim s). Če želite videti, koliko vrat in servisov CDE potrebuje, natipkajte naslednji ukaz, ko je CDE pognan:


ps -aef | wc - l


Ko ste končali z namestitvijo in ste izklopili S99dtlogin in S71rpc (ki ga potrebuje CDE za delovanje), ponovno natipkajte prejšnji ukaz in primerjajte števili odprtih servisov. Čim manj servisov je pognanih, tem bolje. Tistim, ki ste izvedli Core namestitev ni potrebno posebej poudarjati, da grafično okolje ni nameščeno.


Devniki in razni triki


Ko ste izklopili vse nepotrebne servise, lahko nastavite logiranje (pisanje dnevnikov). Večina sistemskih dnevnikov se zapisje v /var/adm. Dodati moramo dva dodatna dnevnika: sulog in loginlog. /var/adm/sulog logira vse "su" poskuse; uspešne in neuspešne. To omogoča, da opazujete, kdo poskuša dobiti koreninski dostop. /var/adm/loginlog pa logira zaporedne neuspešne prijave. Ko se uporabnik poskuša petkrat prijaviti in je pri vseh petih prijavah neuspešen, se to zapiše v dnevnik. Da bi omogočili ta dnevnika, naredite datoteki /var/adm/loginlog (touch ukaz), in /var/adm/sulog. Obe datoteki morata imeti pravice -rw-r----- (chmod 640), ker vsebujeta občutljive informacije.

Sledijo razni triki (tweaking). To vključuje administracijo različnih datotek. Prva stvar je, da naredimo datoteko /etc/issue. To je ASCII datoteka, katere vsebina se izpiše na začetku vsake telnet seje (primer A).

Naredimo tudi datoteko /etc/ftpusers (primer B). Nobeno od uporabniških imen, ki so napisana v tej datoteki, ne more uporabljati FTP servisa. To omejuje uporabniška imena kot so "root" ali "bin" pred uporabo FTP servisa. Najlažji način, kako narediti to datoteko:


cat /etc/passwd | cut -f1 -d: > /etc/ftpusers


Zagotovite, da vsa uporabniška imena, ki potrebujejo FTP dostop ne bodo napisana v /etc/ftpusers.

Prav tako onemogočite koreninskemu uporabniku uporabo telnet servisa. To prisili uporabnike, da se najprej prijavijo in šele na to pridobijo pravice korninskega uporabnika. Take so privzete nastavitve, vendar vseeno poglejte, da v /etc/default/login konzola ni komentirana (primer C).

Jaz osebno rad odstranim telnet sporočilo (banner) o operacijskem sistemu in naredim posebno prijavno sporočilo za FTP. Pri telnetu to hitro napravimo tako, da naredimo datoteko /etc/default/telnetd in dodamo stavek:


BANNER="" # Eliminates the "SunOS 5.6" banner for Telnet


Za FTP, pa naredimo datoteko /etc/default/ftpd in dodamo stavek:


BANNER="WARNING:Authorized use only" # Warning banner for ftp.


Povezovanje na požarni zid


Je pomembno je, da nastavite varen ter kontroliran način povezovanja na požarni zid. Pogosto potrebujete dostop do strežnika na daljavo za administracijo ali nalaganje datotek na strežnik. Te povezave morajo biti varne. Tukaj bom opisal dve opciji: SSH in TCP Wrappers.

Raje imam SSH, ker kriptira vso komunikacijo med nami ter požarnim zidom. TCP Wrappers ne bo obvaroval mrežnega prometa pred snifanjem (vohljanjem). Uporabniki lahko še vedno vidijo vse kar natipkate (tudi gesla). Če vas skrbi, da bo kdo od uporabnikov omrežja prestregal informacije v omrežju, svetujem, da nadomestite telnet/ftp s SSH-jem (Secure SHell). SSH kriptira vse komunikacije do strežnika, hkrati pa omogoča upload (nalaganje) datotek na strežnik in administracijo le-tega na varen način. SSH in TCP Wrappers sta si podobna v tem, da imajta svoj način (layer) logiranja in lahko določata kateri računalniki se lahko povezujejo nanju. SSH lahko dobite tukaj, kjer je tudi izvorna koda klienta in sshd strežnika. Priporočam uporabo SSH verzije 1.2.*, saj ima 2.* omejeno licenco. Ena izmed SSH opcij je tudi OpenSSH. Za Windows95/NT uporabnike, priporočam SecureCRT za SSH klienta.

TCP Wrappers ne kriptira komunikacij, a vseeno logira ter kontrolira, kdo lahko dostopa do sistema. To je program, ki se namesti poleg inetd servisov kot sta telnet in FTP. Če je TCW Wrappers nameščen, takrat ko sistem požene inetd povezave, TCP Wrappers logira vse poskuse povezav in primerja poskus z kontrolno listo dostopov. Če je povezava odobrena, TCP Wrappers izroči povezavo ustreznemu programu, kot je recimo telnet. Če v kontrolna lista dostopov zavrže povezavo, TCP Wrapper povezavo nemudoma prekine.

Marsikdo bi se spraševal, zakaj bi požarni zid potreboval TCP Wrappers. Odgovor je preprost. V primeru, da v požarni zid kdo vdre, ali da se sesuje, TCP Wrappers ponuja drug način obrambe. Druga stvar je, da TCP Wrappers ščiti pred napačnimi konfiguracijami požarnega zidu. Velikokrat vidim požarne zidove napačno konfigurirane, še posebno v VPN situacijah, saj dopuščajo nepooblaščenim uporabnikom dostop do požarnega zidu. Tretjič pa, TCP Wrappers dodajo drug način logiranja - preverjanje drugih sistemskih dnevnikov.

TCP Wrappers lahko dobite iz Coast at Purdue. Še enkrat: uporabljajte drug računalnik z dostopom do Interneta za pobiranje in prevajanje TCP Wrappers. Nočemo nobenih prevajalnikov (compilers) na požarnem zidu in hočemo najprej zaščititi požarni zid v izoliranem omrežju. Ko ga presnamete iz Interneta, si najprej preberite README datoteko, ker je izvrsten uvod v TCP Wrappers. Priporočam dve opciji, pri prevajanju TCP Wrappers. Najprej, uporabite "paranoid", ker to naredi reverzne preslikave vseh povezav. Drugič, uporabite zahtevno (advance) konfiguracijo, ki je v bistvu zelo preprosta. Ta konfiguracija pusti vse programe na originalnih lokacijah, saj je to pomembno za prihodnje popravke.

Preurejanje TCP Wrappers vključuje spreminjanje nekaterih datotek (naslednji primeri temeljijo na "advance" konfiguraciji). Najprej, ko je TCP Wrappers preveden, bo tcpd program nameščenv direktorij /usr/local/bin. Drugič, datoteka /etc/inetd.conf mora biti konfigurirana, na katere servise mora TCP Wrappers vplivati (primer D). Tretjič, datoteka /etc/syslog.conf mora biti prirejena logiranju tcpd (primer E); naredite tudi datoteko /var/adm/tcpdlog. Nazadnje še naredite kontrolno listo dostopov; /etc/hosts.allow in /etc/hosts.deny (primer F).

Ko so vse datoteke urejene in na svojih mestih, ponovno zaženite /usr/bin/inetd "kill -HUP". Tako boste ponovno zagnali inetd daemon z TCP Wrapperji vred. Preverite tudi ACL-je ter logiranje, preden končate.


Za resnično paranoične


Našteta merila smatram za bistvena. Če ste sledili navodilom, ste precej izboljšali varnost sistema, čestitam! Na žalost vaš sistem ni 100% zavarovan in tudi nikoli ne bo. Zato sem za resnično paranoične dodal še nekaj dodatnih korakov pri zavarovanju sistema.

Najprej bomo naredili skupino uporabnikov "wheel". Skupina "wheel" je skupina, v kateri so samo izbrani posamezniki, ki lahko izvajajo "močne" ukaze, kot je recimo /usr/bin/su. S tem, ko omejimo število uporabnikov, ki lahko poganjajo te ukaze, povečamo varnost sistema. Skupino naredimo tako, da v datoteko /etc/group vpišemo novo skupino "wheel" in dodamo sistemske administratorje v to skupino. Potem poiščite pomembne programe, kot je /bin/su. Dodelite tem datotekam skupinsko lastništvo skupini "wheel" in jih napravite izvedne samo za lastnika le-teh ter za ljudi, ki so v "wheel" skupini (spremenite SUID in GUID bit za posamezen program). Za /bin/su bi ukazi izgledali nekako takole:


/usr/bin/chgrp wheel /usr/bin/su
/usr/bin/chmod 4750 /usr/bin/su


* Opomba: Ne pozabite, da je "su" program tudi v direktoriju /sbin. Pri Solaris 2.6 operacijskih sistemih je imenovan /sbin/su.static. To je enako kot /usr/bin/su, samo da so knjižnice tukaj statično povezane (linked), od tod tudi večja dolžina datoteke. Ne pozabite spremeniti dovoljenj tudi za to datoteko.

Naslednja stvar, ki jo bomo storili je, da bomo zaklenili datoteke .rhosts, .netrc in /etc/hosts.equiv. "r" programi uporabljajo te datoteke za dostop do sistemov. Zaklenemo jih tako, da jih naredimo (touch) in jim spremenimo dovoljenja (permissions) na vrednost 0. Tako jih zaklenemo. Tako ne more nihče narediti ali spremeniti datotek. Na primer:


/usr/bin/touch /.rhosts /.netrc /etc/hosts.equiv
/usr/bin/chmod 0 /.rhosts /.netrc /etc/hosts.equiv


Nastavimo tudi parametre za generacijo začetnih TCP sekvenčnih števil. Če inicializacijska sekvenčna števila vseh TCP povezav naključna, zavarujemo sistem pred prestrezanjem sej in lažnimi IP naslovi. To naredimo z nastavitvijo "TCP_STRONG_ISS=2" v datoteki /etc/default/inetinit (primer G). Privzeta vrednost je 1, ki ni tako varna.

Da bi zaščitili sistem pred možnimi "buffer overflow" (ali stack smashing) napadi, moramo dodati sledeče vrstice v /etc/system.


set noexec_user_stack=1
set noexec_user_stack_log=1


Nazadnje spremenimo še nekaj stvari v IP modulu. Dodajte te ukaze v eno od zagonskih skriptov. Za natančnejše informacije o "ndd" in "tuneing ip modules" za večjo varnost, si oglejte Network Settings for Security.


### Set kernel parameters for /dev/ip
ndd -set /dev/ip ip_respond_to_echo_broadcast 0
ndd -set /dev/ip ip_forward_directed_broadcasts 0
ndd -set /dev/ip ip_respond_to_timestamp 0
ndd -set /dev/ip ip_respond_to_timestamp_broadcast 0
ndd -set /dev/ip ip_forward_src_routed 0
ndd -set /dev/ip ip_ignore_redirect 1


Povzetek


Opisali smo nekaj najosnovnejših korakov pri "oboroževanju Solaris-a". Ključ do varnega sistema je v čim manj nameščene programske opreme, z zaščito po stopnjah, kot TCP Wrappers. Seveda obstaja še veliko dodatnih korakov, kot je recimo sudo (omogoča administratorju dodeljevanje omejenih koreninskih privilegijev drugim uporabnikom ter kontrolo le-teh), tripwire (kontrola sprememb v sistemskih programih) in swatch (automatična kontrola dnevnikov in opozorila). Zapomnite si: noben sistem ni 100% varen. Lahko pa, z omenjenimi koraki, zelo povečate varnost sistema.

Za več informacij o oboroževanju Solaris sistema, si oglejte Sun Microsystems strani, natančneje Solaris Security.

Za resnično varen sistem, ZELO priporočam, da si ogledate Titan od Powell Brad-a. To profesionalno orodje je veliko bolj močno, kot postopki, ki sem jih jaz omenil ter nudi veliko več detailov o posameznih korakih.


Različni pripomočki


Da bi prihranil vaš čas ter živce, sem naredil poseben skript, ki naredi vse, kar sem opisal v tem članku za vas. Skript bo šel skozi celoten Solaris sistem in naredil potrebne spremembe, najprej pa naredil rezervno kopijo vseh datotek, ki jih namerava spremeniti. Skript tudi izboljša TCP Wrappers za vas. Samodejno ugotovi, kateri procesor uporabljate (Sparc ali x86) in katero verzijo Solaris-a (2.5.1, 2.6 in 2.7) ter naredi potrebne spremembe. Skript priporočam novincem, delovati pa bi moral tudi na že delujočih sistemih. Prosim, da pošljete vse komentarje ter priporočila na lance@spitzner.net.

Presnemi armor-1.1.tar.Z

Uporabil sem "compress" namesto "gzip", ker "uncompress" pride zraven Solaris distribucije.
MD5 checksum za armor-1.1.tar.Z = 1309af0d0a92f53a6bbc275bdee4308f