suns
system network data news bugtraq
sexy unix security project
system > FreeBSD hardenings (2) 17.07.2002 21:08

Manupraat, pats galvenais administreejot datorsisteemas ir pietureeties pie kautkaadiem principiem. Mans princips ir aizliegt visu, kas nav vajadziigs, un pacensties nosleept peec iespeejas vairaak informaacijas par sisteemu no potenciaalajiem hax0riem (manupraat labs raksts (anglju valodaa) par taadiem principiem ir teiten). Taadu meerkji es arii meegjinaashu sasniegt shinii rakstaa.


Kernelis

Pats galvenais opereetaajsisteemaa ir kernelis, taapeec arii saakshu ar kernelja konfigureeshanu. Ir paredzeets, ka tev jau ir kautkaads priekshstats/pieredze kernelja konfigureeshanaa, ja nav, griezies peec paliidziibas FreeBSD handbookaa. Pats pirmais, ko vajag izdariit, ir:

hostname# chmod 600 /usr/src/sys/i386/conf/KERNELCONF

Un tagad ar k-kaada nebuut teksta redaktora paliidziibu, bez jebkaadaam runaam, jaaiebaazh failaa shaadas rindas:

options TCP_DROP_SYNFIN
options RANDOM_IP_ID
options ICMP_BANDLIM

Tagad peec kaartas: TCP_DROP_SYNFIN noziimee to, ka kernelis ignorees TCP paketes, kuras saturees SYN (saakums) un FIN (beigas). Taadas paketes sisteema var sanjemt gadiijumaa, kad tai tiek skaneeti porti, kas kaa zinaams nav labi :) Peec taadas proceduuras, nmap's (populaarais portskaneris, dikti iesaku) vairs nekaadiigi nevarees identificeet TCP/IP steku (OS versiju), tikai tas bikuc sajaaj rfc1644 papildinaajumus un nav ieteicams webserveriem. Taalaak naak RANDOM_IP_ID - tas liek randomizeeties (njemt skaitli haotiski) IP paketes ID laukam taa vietaa, lai palielinaatu to par 1 ar katru jaunu paketi. taada opcija padara neiespeejamu datu zaudeeshanu, kuru var meegjinaat panaakt kaads attaalinaats hosts. ICMP_BANDLIM limitee ICMP kljuudu pazinjojumu skaitu sekundee (peec nokluseejuma tas ir 300), tas bikuc paliidzees pasargaat hostu no DoS uzbrukumiem.

Taalaak naak 2 rindas, kuras bikuc palielina lokaalo droshiibu (bet nu..):

options SC_DISABLE_DDBKEY
options SC_DISABLE_REBOOT

Abas shiis komandas mazina iespeeju chakareet kompi cilveekiem, kam ir fiziska piekljuve sisteemai (piem, WinNT [ne]cilveekus, kuri, lai ielogotos, spiezh Alt-Ctrl-Del :>), SC_DISABLE_DDBKEY atsleedz debug taustinjus, SC_DISABLE_REBOOT - Alt-Ctrl-Del.

Veel ir noderiiga shaada rinda:

options PANIC_REBOOT_WAIT_TIME=2

Deelj taas, sisteemas panikas gadiijumaa, sisteema gaidiis tikai 2as sekundes un tad restarteesies nevis 15 (imo, 15 bija defaltais)

Naakamaas rindas ieliek kernelii ugunsmuuri (ipfw):

options IPFIREWALL
options IPFIREWALL_VERBOSE
options IPFIREWALL_VERBOSE_LIMIT=200

Pirmaa rinda ir pats ugunsmuuris, pateicoties otrajai, paraadaas iespeeja logot visaadas lietas no ugunsmuura, pateicoties treshajai - limitee logoshanas apjomus.. IPFIREWALL vietaa var izmantot arii IPFILTER. tie abi diezgan ieveerojami atshkjiraas un katram ir savi plusi un miinusi, bet FreeBSD defaltais skaitaas IPFIREWALL.

Veel var ielikt citas lietas, kuras es pashlaik siiki neaprakstiishu, bet kuras var naakotnee nodereet:

options IPSEC
options QUOTA
options DUMMYNET

Kernelja konfigureeshanaa tas apmeeram ir viss. Ljoti iesaku izvaakt visu nevajadziigo un optimizeet to savai sisteemai.


sysctl

sysctl ir viena varenjauka BSD fiicha. Ar taas paliidziibu var uzzinaat un mainiit daudzus kernelja uzstaadiijumus sisteemai darbojoties. Piemeeram, ar komandas "sysctl -a" paliidziibu var apskatiit visus mainiigos, kas ir pieejami. Ar komandas "sysctl net.inet.ip.ttl=128" paliidziibu mees nomainam IP paketes TTL (time to live) veertiibu uz 128. Tiesa, peec katras paarstarteeshanaas sisteema aizmirsiis muusu veiktaas izmainjas, taapeec jaaieraksta tas failaa /etc/sysctl.conf, bet vispirms protams:

hostname# chmod 600 /etc/sysctl.conf

Shaadas rindas iesaku ielikt failaa:

net.inet.tcp.blackhole=2
net.inet.udp.blackhole=1
net.inet.ip.ttl=128
net.inet.icmp.icmplim=10
kern.ps_showallprocs=0

Pateicoties pirmajiem diviem (blackhole), paketes kuras tiks suutiitas uz portiem, kuros neviens process neklausaas, tiks noliegtas (deny) un uz taam netiks dota atbilde, ka tanii portaa nekaa nav (reject). Pateicoties tam, portu skaneeshana paliek sarezhgjiitaaka un tas paliidzees sleept vairaak informaacijas par sisteemu. net.inet.ip.ttl=128, kaa jau mineeju ieprieksh, maina IP paketes TTL uz 128 (defaltais 64). To es iesaku taapeec, lai buutu gruutaak detekteet (fingerprintot) OS peec taas IP steka (piem, netcraft). Par net.inet.icmp.icmplim=10, patiesiibaa, es jau teicu, kad aprakstiiju kernelja konfigureeshanu. Shii rinda uzliek limitu 10 ICMP kljuudu pazinjojumus sekundee, taatad paliidz situaacijaas, kad kaads veic ICMP floodu. Peedeejaa rinda (kern.ps_showallprocs=0), manupraat, ir ljoti noderiiga, pateicoties tai lietotaajiem (protams iznjemot root'u) ir iespeeja redzeet tikai tos procesus, kuri pieder vinjiem, nevis visus sisteemas procesus. tas noder arii tad, kad uz sisteemas nav sveshu lietotaaju, piem, kad hax0rs tiks klaat lietotaajam nobody, vinjam buus sarezhgjiitaak noteikt, kaadi servisi ir uz sisteemas.


rc.conf

Kaa zinaams, ieksh FreeBSD noziimiigaakais konfiguraacijas fails ir /etc/rc.conf. Tanii ljoti eerti var sakonfigureet lielaako dalju sisteemas. Protams, vispirms:

hostname# chmod 600 /etc/rc.conf

Un daudz neiedziljinoties, saakshu ar pashu svariigaako:

kern_securelevel="1"
kern_securelevel_enable="YES"

Taa ir viena no taam jaukajaam lietaam, kuras nav liinuksaa (vismaz nav naacies ar to saskarties). Ir 5 kernelja droshiibas liimenji, bet muus interesee tikai peedeejie triis, t.i. pirmais liidz treshais. 1. (secure mode) aizliedz aiztikt failus, kuriem ir uzligts speciaals tags (piemeeram, taads tags ir uzlikts kernelja failam, parasti: /kernel), aizliedz monteet failsisteemas, aizliedz rakstiit uz /dev/mem un /dev/kmem (vairs nevarees palaist Xus, bet kaa zinaams normaali cilveeki neliek Xus uz serveriem), nevarees vairs ielaadeet vai izlaadeet moduljus. 2. (highly secure mode), papildus visam ieprieksheejam, disku devaisos nevar rakstiit (vieniigi komanda 'mount' var) un mainiit sisteemas laiku vairaak kaa par 1nu sekundi :) Preteejaa gadiijumaa log failos paraadiisies rinda "Time adjustment clamped to +1 second". Un 3. (network secure mode) ir viss ieprieksheejais plus vairs nevar mainiit ugunsmuura (gadiijumaa, ja tiek izmantots ipfw) un trafika sheipera (dummynet) konfiguraaciju. Galvenais - secure leveli nevar pazeminaat (var tikai paaugstinaat), sisteemai darbojoties. Lai to atakal pazeminaatu, buus nepiecieshams restarteet sisteemu. Un ja hax0rs restartees, to to jau ir diezgan gruuti nepamaniit :) Iesaku shitaas 2 rindas likt konfiguraacijas failaa tikai tad, kad visa paareejaa sisteema jau buus sakonfigureeta, jo var rasties neertiibas.

Tagad bikuc tiikla konfiguraacijas:

tcp_drop_synfin="YES"
icmp_drop_redirect="YES"

Pirmaa rinda aktivizees opciju, kuru mees jau ieprieksh iebaazaam kernelii, kas liks ignoreet TCP paketes ar SYN+FIN. Otraa rinda ignorees ICMP redirekta paketes, kuraam normaalos apstaakljos vispaar tiiklaa nebuutu jaaparaadaas.

Te nu ir pienaacis laiks pakonfigureet veel dazhus siikumus un deemonus, kas grieziisies uz sisteemas:

firewall_enable="YES"
firewall_script="/etc/firewall.script"
clear_tmp_enable="YES"
accounting_enable="YES"
fsck_y_enable="YES"
inetd_enable="NO"
portmap_enable="NO"
syslogd_flags="-ss -m 0"
sendmail_enable="NO"
sendmail_flags="-q1m"
sshd_enable="YES"
sshd_flags="-4"

firewall rindas aktivizee ugunsmuuri un noraada skriptu, kursh tiek palaists, lai sakonfigureetu ugunsmuuri. Veel var noraadiit ugunsmuura tipu, nemaz nenoraadot skriptu, bet shajaa shtellee mees neiedziljinaasimies (siikaak var palasiit rc.conf manuaalii). clear_tmp_enable liek sisteemai katru reizi, kad taa bootojas, iztiiriit /tmp direktoriju. accounting_enable paver iespeeju logot to, kaadas komandas izpilda lietotaaji u.c. siikumus. Buus nepiecieshams arii uztaisiit failu, kuraa glabaasies shii informaacija ("touch /var/account/acct"). fsck_y_enable palielinaas iespeeju ielaadeeties, ja ar failsisteemu nebuus kautkas kaartiibaa, pie reizes palielinot iespeeju pazaudeet datus :) Taapeec pasham jaaizlemj - lietot vai nee. inetd_enable & portmap_enable atsleedz divus druumi nevajadziigus servisus, kuros laika gaitaa ir bijushi stipri daudzi caurumi un kurus mums patieshaam nevaidzees. starpcitu, iesaku katram gadiijumam aizkomenteet visas rindas ieksh /etc/inetd.conf, tagad pat ja inetd palaidiisies, nekas ljauns nenotiks. syslogd_flags noraada, ar kaadaam opcijaam jaalaadee syslogd, "-ss" noraada, ka syslogd nemeegjinaas sanjemt paketes no citiem datoriem, kas noveersiis iespeeju uzlauzt syslogd attaalinaati, gadiijumaa, ja tur buus kaads droshiibas bags. "-m 0" atsleedz syslogd pazinjojumus (parasti ik peec 20 minuuteem), ka ar to viss ir ok, parasti tie nav nepiecieshami un tikai piedzen log failus ar lieku informaaciju. sendmail_enable & sendmail_flags aizliedz sendmailam klausiities 25o portu un sanjemt veestules no citiem kompiem. sshd_enable piesleedz sshd. gadiijumaa, ja tas nau nepiecieshams, veertiibu jaanomaina uz "NO". Diemzheel peedeejaa laikaa ar sshd droshiibu ir bijushas diezgan lielas probleemas. Vieniigais nopietnais, ko var ieteikt ir patstaaviigi apdeitoties, bet to var (vajag) attiecinaat arii uz visu paareejo. sshd_flags noraada to, ka peec nokluseeshanas tiks izmantotas IPv4 adreses, pashlaik veel nav iisti pienaakushi IPv6 laiki..


Lietotaaji & grupas

Saaksim ar to, ka straadaat pastaaviigi sisteemaa ar r00t tiesiibaam ir stipri muljkjiigi. Par rootu jaapaliek tikai tad, kad tas ir patieshaam nepiecieshams (piem, make installworld). Lai straadaatu uz sisteemas, jaauztaisa sev kautkaads lietotaajs un jaapievieno grupai wheel. Tikai daudzi cilveeki dara nesmuki: vinji uztaisa lietotaaju, kura grupa ir wheel, bet tas nebuut nav pareizi (liinuks tradiicijas). Parasti gan no taa nekas slikts nenotiek, tomeer labaak ir taisiit lietotaaju ar savu grupu un jaapievieno tas grupaa wheel atsevishkji. Lai to izdariitu, jaamodificee faila /etc/group pirmaa rinda shaadi:

wheel:*:0:root,username

Grupa wheel mums ir nepiecieshama, lai vareetu izpildiit komandu su, ar kuras paliidziibu ieguust super-juzera tiesiibas. Taalaak ir svariigi, vairaak nekaa svariigi, lai lietotaajiem, kuriem nevajag shellu (csh, bash..), taa arii nebuutu. _Ljoti_ daudzi sisadmini neieveero shito lietu. Ja lietotaajiem nevaig shellu, vinjam jaauzliek '/bin/nonexistent' (vai kaadu citu neeksisteejoshu failu). Savukaart tagad lietotaaji nevarees piekljuut arii ftp (lai arii taa jebkuraa gadiijumaa nav laba ideja - lietot ftp, labaak sftp/scp). Lai tie tomeer vareetu piekljuut, jaaieliek '/bin/nonexistent' ieksh faila /etc/shells:

hostname# echo /bin/nonexistent >> /etc/shells

Lietotaajus, kuriem vaidzees piekljuvi sisteemai, mees veelaak ieliksim arii sshd konfiguraacijas failaa, lai tikai tie vareetu ielogoties. Lai atljautu lietotaajiem 'username' un 'username2' logoties iekshaa sisteemaa, vajag izdariit sekojoshi:

hostname# echo "AllowUsers username username2" > /etc/ssh/sshd_config

(to pashu var dariit arii ar grupaam, bet par to lasi sshd_config manuaalii)

Veel varu ieteikt uzreiz nomainiit lietotaaju home direktorijas permissijas (defaltaas ljauj jebkuram skatiities sveshas home direktorijas saturu). Taapeec:

hostname# chmod 700 /root
hostname# chmod 700 /home/myhomedir

Syslog

Syslogs ir ljoti svariiga sastaavdalja. Tieshi peec log failiem mees veelaak vareesim noteikt, kur ir radushaas probleemas, un, vai viss norit taa kaa vaig. Sysloga konfiguraacijas fails atrodas ieksh /etc/syslog.conf, saaksim ar permissijaam:

chmod 600 /etc/syslog.conf

Manupraat defaltaa sysloga konfiguraacija ir diezgan neeerta, man ljoti nepatiik, kad uz konsoli naak visaadi pazinjojumi, taapeec saakumam nokomenteesim shiis rindas:

#*.err;kern.debug;auth.notice;mail.crit /dev/console
#*.err root
#*.notice;news.err root
#*.alert root

Tagad ieliksim rindu, lai visus pazinjojumus syslogs laizh uz otro virtuaalo konsoli, ko varees apskatiit nospiezhot Alt+F12, imho, tas ir briesmiigi eerti :) taatad:

*.* /dev/ttyvb

tagad rindu, kur ir 'security.*' mainam uz:

security.*;auth.info /var/log/security

Tagad mums ieksh security loga buus arii autentifikaacijas informaacija. Veel es iesaku rakstiit autentifikaacijas informaaciju atsevishkjaa failaa, prieksh tam jaapievieno shaada rinda:

auth.info /var/log/auth

Veel mums vaig, lai logotos ugunsmuuris, liekam iekshaa shaadas rindas:

!ipfw
*.* /var/log/ipfw.log

Tas nu buutu viss ar syslog.conf failu. Neaizmirstam uztaisiit failu, kur glabaasies autentifikaacijas un ugunsmuura logi, savaadaak buus probleemas:

hostname# touch /var/log/auth
hostname# touch /var/log/ipfw.log

Veram valjaa /etc/newsyslog.conf un tur mainam, kam vajag, permissijas uz 600 ('mode' stabinjaa) un faila beigaas pievienojam rindas:

/var/log/auth 600 10 100 * Z
/var/log/ipfw.log 600 10 100 * Z

Arii syslogu mees veiksmiigi sakonfigureejaam, ja nepiecieshams, var paarstarteet syslogu un paskatiities rezultaatus.


SSH

Kjersimies klaat arii sshd: /etc/ssh/sshd_config. jaaatrod un jaanomaina divas rindas uz shito:

Protocol 2
X11Forwarding no

Pirmaa rinda atljauj lietot tikai 2. SSH protokola versiju, kura ir droshaaka. Otraa rinda aizliedz forwardeet X11 paketes.

Un veel man buutu stipri nepatiikami, ja tu nenomainiitu sshd versijas banneri, jo peec taa varees visnotalj vienkaarshi noteikt, kaadu FreeBSD versiju tu izmanto. Atrodam ieksh sshd_config attieciigo rindu un nomainam uz kautko esteetisku:

VersionAddendum DRST

Tagad kjersimies pie /etc/ssh/ssh_config. Te ir jaanomaina tikai viena rinda, lai ssh klients izmantotu tikai 2 SSH protokola versiju:

Protocol 2

Man droshivien vairs nav nemaz jaapiebilst, ka jaaizdara arii shaadi:

hostname# chmod 600 /etc/ssh/sshd_config

Ieksh /etc

Tagad paaardiisimies pa paareejiem failinjiem, kas ir ieksh /etc. Saaksim ar visvienkaarshaako - redigjeesim /etc/csh.logout. Patiesiibaa, tur nau daudz ko redigjeet, faila beigaas 1kaarshi iemetam 'clear', lai katru reizi, kad lietotaajs izlogojas, konsole tiek notiiriita (ar noteikumu, ka vinjsh lieto csh, protams, bet kursh normaals cilveeks zinot csh (tcsh) fiichas lietos ko citu?)

Naakamais, jau diezgan noziimiigais, solis ir paredigjeet failinju /etc/ttys. Ljoti svariigi ir nomainiit rindaa, kura saakas ar vaardu 'console', 'secure' uz 'insecure'. Tagad, kad sisteema tiks ielaadeeta single-user rezhiimaa rezhiimaa, taa prasiis roota paroli. Preteejaa gadiijumaa bez jebkaadas autentifikaacijas pa sisteemu var aardiities ar root tiesiibaam, kas nebuut nav jauki. Taalaak mainam arii visas konsoles saakot ar ttyv0 liidz ttyv8 uz insecure. Tas aizliegs konsolees logoties pa taisno kaa rootam. Tagad par rootu varees palikt tikai ar komandas su paliidziibu. Shis fails nu buutu kaartiibaa.

Naakamais fails, kuru vaidzeetu pachikaat ir /etc/mail/aliases. Te mees stipri neiedziljinaasimies, tikai ieliksim failaa shaadu rindu:

root: username@super-duper.domain.lv

Pateicoties tam, visi meili, kas tiks suutiiti rootam (piemeeram ikdienas atskaites), tiks aizsuutiiti arii uz username@super-duper.domain.lv. Ja nepiecieshams vienkaarshi aizsuutiit meilus citam lietotaajam uz taas pashas sisteemas, var ievadiit arii vienkaarshaak:

root: username

Neaizmirstam palaist komandu 'newaliases', lai tiktu apdeitota nepiecieshamaa datubaaze.

Nu ir pienaakusi /etc/fstab kaarta. Sho failu vaig konfigureet atkariibaa no prasiibaam, teiksim, ja sisteema kalpo par routeri un ja taa netiek biezhi lietota, daudzas failsisteemas var monteet tikai lasiishanai (read-only), baigi feini. To gan es atstaashu tavaa zinjaa, ko dariit un kaa monteet - izveeleeshos ne pashu sekjuraako veidu. Ceru, ka neviens neiebildiis, ja es pateikshu, ka nesadaliit disku leibelos (partriicijaas) installeejot jebkaadu *nixu var tikai gariigi atpalicis cilveeks :) Taatad, shaadi vaidzeetu buut ieksh /etc/fstab defaltajaa variantaa:

/ ufs rw 1 1
/tmp ufs rw 2 2
/home ufs rw 2 2
/usr ufs rw 2 2
/var ufs rw 2 2

Droshivien tur buus veel paaris rindas, bet taas muus neinteresee. shitais viss ir jaamaina uz:

/ ufs rw,nosuid 1 1
/tmp ufs rw,noexec,nosuid 2 2
/home ufs rw,noexec,nosuid 2 2
/usr ufs rw 2 2
/var ufs rw,noexec,nosuid 2 2

Katram gadiijienam iesaku atstaat vecaa fstaba kopiju.. Ja nu kaadreiz gribeesies kaartiigaak paaardiities pa sisteemu. Tas pagaidaam viss..

Nee, tomeer nav veel viss :> tagad buus viss:

hostname# chmod 600 /etc/fstab

Pats galvenais jau taa vai taa paliek speekaa - stay updated. Un tas ir vissvariigaakais. Jo, ja neapdeitosi savu sisteemu, tas ir tikai laika jautaajiens, kad to kaads no0wnees.

Veel varu shajaa sakaraa ieteikt palasiit shos dochus:
 multi-layered security (Mike Hoskins)
 site security handbook (RFC 2196)
 securing freebsd 4.x-stable (Marc Silver)

/ petruha - http://petruha.bsd.lv/ /
comments
valdiic:
Hohohoho!! ShitAss ir labs. Šo to zināju, šo to nezināju. Labi uzrakstīts. Ok, varēja nebūt visi šitie tavi vipendroni: "nau", "laps", "ne1", translits kā tāds. Bet tas jau ir gaumes jautājums. Saņka beri mjač par labu info :)
Tomy <ir(at)bija.lv>:
Baigi labs raksts! Man patika! Interesanti palasīt šitādas pamācības :)
add comment*
author:
email:
piecpadsmit:
comment:


* ja iztiksi bez spama, offtopika un muljkjiibaam, iespeejams, ka tavs koments netiks izdzeests.
« back

valid xhtmlvalid css