................... ...::: phearless zine #1 :::... ......................>---[ Samba: Lin & Win dance ]---<...................... ..........................>---[ by EArthquake ]---<........................... Ovaj tekst sam zamislio na foru pitanja i odgovori na pitanja. Nadam se da ce da odgovara. Za demonstraciju koristicu dva racunara pod imenima gondolin, koji ce imati ulogu linux servera, i comp1,koji ce imati ulogu klijenta. Oba ce biti u earth.ea domenu. Imace adrese 10.0.0.1 za server i 10.0.0.2 za klijent. ---< 1. Sta je uopste Samba? Da bi omogucili Windows masini da vidi Linux masinu putem npr. Network Neighbourhood-a ili Windows Explorer-a mora da postoji server koji ce omoguciti integraciju Linux sistema u Windows okruzenje i zavarati isti da je rec o istom operativnom sistemu. Upravo to Samba i radi. ---< 2. Zasto je to tako? Jednostavno Windows koristi drugaciji nacin komuniciranja izmedju umrezenih racunara od drugih operativnih sistema. Windows za komunikaciju koristi SMB (Server Message Block) protokol. ---< 3. Sta mi treba? Pa naravno Samba.Ja u ovom slucaju koristim paket koji se dobija uz Slackware 10.0, a to je samba-3.0.4. Za sve one koji instaliraju sambu iz source-a postupak je sledeci: 1.ekstraktovanje arhive sa source-om 2.pokretanje ./configure skripte iz dir-a u kome je ekstraktovan source 3.pokretanje komande 'make' (bez navodnika) za kompajliranje source-a 4.pokretanje komande 'make install' (bez navodnika) sa root privilegijama. 5.To bi trebalo da je to osim ako niste dobili neku gresku pri primenjivanju rethodnih postupaka. U tom slucaju bacite se na otklanjanje gresaka (./configure skripta bi trebalo da ispise u cemu su greske, verovatno nedostatak nekih datoteka). Kada se kompajlira samba, ona se smesta u /usr/local/samba folder (da, da, Windows cini svoje). Salu na stanu, ali dok god se ovade instalira, ona nije dostupna Linuxu. Lek za to je ili da se rucno iskopiraju fajlovi u odgovarajuce foldere (npr. iz /usr/local/samba/bin u /bin itd.), ili da se preko ./configure komande naznaci gde da se instalira (npr. ./configure --bindir=/bin itd.). ---< 4. Dobro, instlirao sam Sambu, sta dalje ? Sledi naravno konfiguracija. Glavni fajl celog Samba sistema je konfiguracioni fajl smb.conf. On ima veoma prostu sintaksu. Naime na levoj strani se nalazi parametar a na desnoj (iza znaka = odvojeno space-om) vrednost npr. os level = 60 U samom smb.conf fajlu postoji vise delova od kojih je jedan glavni i to [global] deo.On se odnosi na sve ostao. Ostali delovi smb.conf fajla su zasebni npr. [homes] deo u kom se nalaze definicije za taj share. Dakle ostale sekcije predstavljaju definicije za share-ove. Dakle smb.conf fajl moze da sadrzi npr. earthquake share koji bi bio definisan na sledeci nacin : [earthquake] comment = EArthquake`s Share path = /home/earthquake/shared/ writable = no Moze sadrzati i jos niz definicija koje dalje odredjuju pojedini share. Komplikovaniji deo konfiguracije jeste konfigurisanje samog [global] dela da odgovara vasim potrebama. Ukratko cu opisati vaznije parametre smb.conf fajla: Base options: dos charset - Oznacava kojim charsetom samba treba da komunicira sa DOS klijentima (Moja preporuka CP850 ali koji god da stavite Samba ce se vratiti na ASCII ako nije dostupan) unix charset - Oznacava koji charset koristi samba server (Moja preporuka UTF-8(default) display charset - Oznacava koji charset samba koristi za ispisivanje poruka (Moja preporuka ASCII) workgroup - Oznacava workgroup vaseg racunara koji ce se javljati kada klijent izvrsi upit za to. (Ja sam uvek koristio vrednost workgroup) netbios name - Oznacava NetBIOS ime po kom se naziva samba on takodje treba da bude isti kao i ime tog kompjutera u domenu (dakle ako vam je ime u domenu server onda i netbios name server) netbios aliases - Omogucava da se server pojavljuje sa vise imena (Ja licno nisam nasao neku primenu ovoga) server string - Komentar servera koji se pojavljuje uz ime racunara pri logovanju na isti (Npr. EArthquake`s Samba Server ) bind interfaces only - Ako je vrednost yes na nmbd utice tako sto on proverava odakle stizu paketi i propusta ih ili odbija u skladu s parametrom interfaces, a na smbd da se vezuje na one zahteve koji odgovaraju na parametar interfaces(Ako zelite da izbegnete probleme stavite vrednost no ovde) Security options: security - Odredjuje nivo obezbedjenja.Moguci parametri su share user server (Preporucujem user jer ce zadovoljiti sve potrebe korisnika) auth methods - Oznacava metode kojima Samba identifikuje korisnika koji pokusava da se uloguje. To radi redom po parametrima. Npr. ako je podeseno 'guest sam winbind' prvo ce pokusati da se identifikuje kao guset a zatim kao sam i konacno winbind.U praksi ce samo jedna metoda biti uspesna u identifikaciji. (Defauld podesavanja ce biti dovoljna u vecini slucajeva,znaci 'guest sam winbind' ) encrypt passwords - Samo ime kaze. Kontrola enkripcije sifara. NT platforme zahtevaju enkriptovane sifre. passdb backend - Oznacava gde i kako Samba zapisuje sifre. Najcesce opcije su smbpasswd, tdbsam i ldapsam. Sve koriste razlicite nacine ali ce obicnom korisniku biti dovoljan samo smbpasswd. allow trusted domains - Oznacava da li samba moze svoe resurse da deli van svog domena. hosts equiv - Odredjuje fajl u kom se nalaze adrese racunara i korisnika kojima samba nece traziti sifru pri login-u. min passwd length - Minimalna duzina sifre. null passwords - Omogucava ili sprecava koriscenje praznih (null) sifara. password server - Omogucava proveru sifara na udaljenom serveru. smb passwd file - Odredjuje putanju do fajla u kom se nalaze sifre. private dir - Putanja private direktorijuma. root directory - Putanja do root direktorijuma. Postavite vrednost razlicitu od / da bi zabranili pristup visim direktorijumima. unix password sync - Sinhronizacija samba sifara sa UNIX siframa. restrict anonymous - Dozvola ili zabrana anonymous konekcija. Ima tri vrednosti (0,1,2). Vrednost 2 zabranjuje bilo kakve anonymous konekcije sa serverom, a vrednost 1 je beskorisna. Vrednost 0 omogucava anonymous konekcije definisane u Windows registru. guest account - Oznacava ime guest naloga koji ima dozvole za one delove koji imaju parametar guest ok invalid users - Oznacava korisnike kojima je zabranjen pristup. valid users - Oznacava korisnike koji mogu da se uloguju.Ako je parametar prazan onda svi korisnici mogu da se uloguju. admin users - Oznacava korisnike koji imaju root prava. read list - Lista korisnika koji imaju samo dozvolu citanja. write list - Lista korisnika koji imaju potpune dozvole za pisanje iako je read only parametar podesen. printer admin - Lista korisnika koji mogu da rade bilo sta sa stampacem. hosts allow - Lista adresa racunara kojima je dozvoljen pristup. Dakle samo ce racunari u ovoj listi moci da pristupaju resursima. Ako je lista prazna sve adrese imaju pristup. hosts deny - Lista adresa racunara koji nemaju dozvolu za pristup. preload modules - U slucaju da koristite dodatne module (za MySQL bazu sa siframa npr.) bilo bi pametno da ih ovde navedete radi brzeg rada servera. Logging Options: log file - Fajl u kome se loguju podaci Samba servera. max log size - Maksimalna velicina loga. Protocol Options: smb ports - Portovi koje otvara Samba server.(Nepotrebno menjati) name resolve order - Oznacava po kom pricipu i kojim redosledom Samba treba da pretvara imena racunara u IP adrese. Tuning Options: socket options - Oznacava socket opcije koje server koristi u komunikaciji sa kijentom. (Moja preporuka su opcije SO_KEEPALIVE,IPTOS_LOWDELAY i TCP_NODELAY) max smbd processes - Oznacava koliko konekcija u jednom trenutku server moze da ostvari. Potrebano za ogranicavanje broja konekcija ako server ne moze da obezbei dovoljno resursa za procesiranje zahteva klijenata. paranoid server security - Neke NT platforme dozvojavaju lose sifre za korisnike. Ako je opcija ukljucena Samba ce samo logovati ovakve pokusaje. (Preporucujem koriscenje ove opcije) hostname lookups - Oznacava da li ce server koristiti same adrese racunara ili ce koristiti po imenima(zauzima vise resursa). Korisno ako se koristi opcija hosts deny i hosts allow. Printing Options: load printers - Oznacava da li ce se uopste stampac(i) koristiti pri prijavljivanju korisnika. printcap name - Oznacava koji interfejs ce server koristiti za stampanje. cups options - Dodatne opcije ako koristite cups interfejs. print command - Komanda (UNIX komanda) koja ce se koristiti za stampanje. Filename Handling: case sensitive - Oznacava da li server treba da obraca paznju na velika i mala slova. Jedna od razlika izmedju Windows-a i UNIX-a je to sto prvi nije osetljiv na mala i velika slova a drugi jeste. preserve case - Da li da server prikazuje slova u menima fajlova onakvima kakva jesu ili da ih menja. hide dot files - Da li da server skriva fajlovae koji pocinju sa taskom (skriveni fajlovi u UNIX-u) hide unreadable - Skrivanje fajlova koji ne mogu da se citaju. hide unwritable - Skrivanje fajlova po kojima ne moze da se pise. veto files - Fajlovi koji se ne vide niti ima je moguce pristupiti. Fajlovi u listi su odvojeni '/' znakom , takodje je dozvoljeno koriscenje i wilcardova (* npr.) za dodatno definisanje veceg broja fajlova. Ne sme biti upotrebljen znak za putanju do fajla u UNIX sistemima kao ni DOS oznake staza vec samo definisanje fajlova(npr /*poverljivo*/*.pov*/ ce staviti sve fajlove koji imaju rec poverljivo i/ili ekstenziju .pov na veto files listu) delete veto files - Opcija koja odredjuje da li ce se ,u slucaju da Samba pokusa da obrise direktorijum koji sadrzi veto fajlove i direktorijume, uspeti u tome ili ne. no je parametar koji bi uglavnom bio potreban. hide files - Oznacava koji fajlovi imaju DOS atribut hidden(njima se idalje moze pristupati). Sintaksa za oznacavanje je ista kao i za veto fajlove. Domain settings: machine password timeout - Oznacava vreme posle kojeg Samba obnavlja sectret.db bazu u kojoj se nalaze sifre ako se koristi tdbsam nacin. Parametar oznacava vreme u sekundama.(Default vrednost je nedelju dana) Logon options: add user script - Skripta koju server koristi pri dodavanju korisnika. (Npr /usr/sbin/useradd %u ) delete user script - Skripta koju server koristi pri uklanjanju korisnika. (Npr. /usr/sbin/userdel %u ) add group script - Skripta koju server koristi za dodavanje grupa. (Npr. /usr/sbin/groupadd %g ) delete group script - Skripta koju server koristi pri uklanjanju grupe. (Npr. /usr/sbin/groupdel %g ) logon path - Odredjuje stazu u kojoj se cuvaju korisnicki dokumenti korisnika. (Npr. \\%L\Profiles\%U ) domain logons - Ako je postavljen omogucava prijavljivanje sa iste workgrupe ostalih masina. Za domenske mreze koristiti yes parametar. Browse Options: os level - Oznacava nivo operativnog sistema servera. On uvek treba da bude veci od nivoa klijenta. preferred master - Preporuka je da se koristi ova opcija ako se koristi opcija domain master kako bi se osigurala ista. domain master - Oznacava da li je sam server ustvari domen master. local master - Omogucava da nmbd bude local master browser za lokalni subnet (Moja preporuka je koristiti ovu opciju). WINS Options: wins server - Oznacava IP adresu ili ime racunara na kome se nalazi WINS server koji bi nmbd trebalo da koristi. wins support - Oznacava da li nmbd server terba da bude WINS server. Nijedna druga masina u mrezi nebi trebalo da ima podrsku za WINS osim te. Iz licnog iskustva savetujem koriscenje SWAT-a za konfigurisanje smb.conf fajla. ---< 5. Kako se koristi SWAT? Prvo proverite da li je pokrenut.Skenirajte otvorene portove na svom racunaru komandom 'nmap localhost'.SWAT je na portu 901 i ako je on otvoren onda je i SWAT pokrenut.Ako ne onda kao root skinite koment (#) ispred linije u koja pocinje sa swat u /etc/inetd.conf fajlu i promenite mod /rc.d/rc.inetd fajla u izvrsni kako bi se pokretao pi startovanju racunara. To mozete uraditi na sledeci nacin: kao root izvrsiti komandu 'chmod 777 /rc.d/rc.inetd' Ako kojim slucajem u /etc/inetd.conf fajlu uopste nema linije za pokretanje SWAT-a onda dodajte sledece u /etc/inetd.conf: swat stream tcp nowait.400 root /usr/sbin/swat swat Ovo govori da inetd (inace BSD super internet daemon) pokrece swat pri startovanju. Ne zaboravite da promenite premisije /rc.d/rc.inetd fajla! Sad kad ste sve ovo zavrsili restartujte racunar i ponovo skenirajte portove. Ako i dalje nema 901 porta na listi nesto ste pogresili. ---< Napokon SWAT je pokrenut,kako da ga koristim? SWAT se koristi preko bilo kog web browsera (Konqueror,Opera,Mozzila...) kucajuci u adresse bar vasu IP adresu zatim : i port 901.Bice da konfigurisete Sambu na svom racunaru tako da za IP adresu koristite 127.0.0.1 ili localohst. Dakle u adress bar ukucate 'localhost:901' (bez navodnika naravno). Ako je sve u redu tebalo bi da dobijete prozor koji zahteva username i password. Tu koristite username i password vaseg root naloga. Voilla evo nas u SWAT-u. SWAT ima nekoliko odeljaka i to: Home, Globals, Shares, Printers, Wizards, Status, View i Passwords. U delu Globals se postavljaju podesavanja smaog smb.conf fajla. Postoje dve vrste pogleda. Basic i Advanced.Iako Advanced pocetniku moze da izgleda zastrasujuce usustini je bolje koristiti ga za konfigurisanje jer ima dosta korisnih opcija mada i onih koji bas nisu mnogo vazni. Vazniji parametri su vec objasnjeni. U Shares delu se podesavaju postojeci share-ovi i dodaju novi. U Printers dodatna podesavanja za stampace i opcija za dodavanje novih.U Wizard delu postoje podesavanja za sam server. Tu se bira ti servera i uloga WINS servera.Status i view deo mislim da nije potrebno objasnjavati. Password deo sluzi za dodavanje i menjanje korisnika i sifara korisnika koje server koristi. Kada ste podesili smb.conf fajl tako da odgovara vasim potrebama nije lose proveriti parametre komandom 'testparm'. root@gondolin:/home/earthquake# testparm Load smb config files from /etc/samba/smb.conf Processing section "[homes]" Processing section "[printers]" Loaded services file OK. Server role: ROLE_DOProcessing section "[homes]" Processing section "[printers]" Loaded services file OK. Server role: ROLE_DOMAIN_PDC Press enter to see a dump of your service definitions Ako testparm nije prijavio nijednu gresku znaci da je sa smb.onf fajlom sve u redu.mozete komandom 'smbd restart' da restartujete samba server. Naravno to nije sve. ---< Sta oznacavaju znaci tipa %U ili %i ? Samba podrzava upotrebu varijabli u smb.conf fajlu koje se oznacavaju upravo tako. Oznake za varijable su sledece: %U - ime korisnika koji pristupa serveru %D - ime domena koji trenutni korisnika koristi %T - trenutno vreme %I - IP adresa %m - netbios ime masine %h - ime masine na kojoj se nalazi server %G - grupa u kojoj se nalazi korisnik %U %H - home direktorijum korisnika %U To bi bile vaznije varijable koje mogu da se koriste u smb.conf fajlu. ---< Postoji li jos neki fajl koji je potrebno konfigurisati? Tu su jos dva fajla koja su potrebna i ona su veoma prosta. Oba se nalaze u /etc/samba/. Prvi je lmhosts koji sluzi kao baza za NetBIOS imena na mrezi. On treba da sadrzi sledece: gondolin comp1 Drugi je smbusers. On sadrzi UNIX imena korisnika koji su pandan Windows imenima. Sluzi uglavnom kako bi se Administrator sa Windows-a ponasao kao root sa UNIX-a i stoga sadrzi : root = Administrator ---< 6. Samba radi , sta mi jos treba ? Za postavljanje domenske mreze sa linux domen kontrolerom potreban je i neki DNS i DHCP server. Ja koristim BIND kao DNS server. Za rad DHCP servera potrebno je podesiti /etc/dhcpd.conf fajl da odgovara vasim potrebama. Najosnovinja podesavanja izgledaju otprilike ovako : ddns-update-style ad-hoc ; default-lease-time 600; max-lease-time 7200; option subnet-mask 255.255.255.0; option broadcast-address 10.0.0.1; option routers 10.0.0.1; option domain-name-servers 10.0.0.1; option domain-name "earth.ea"; subnet 10.0.0.0 netmask 255.255.255.0 { range 10.0.0.1 10.0.0.20 ; } Mislim da nije potrebno objasnjavati detaljno sta je sta jer je to jasno iz samih imena opcija. Takodje je potrebno napraviti i leases fajl u /var/state/dhcp/ spod imenom dhcpd.leases (komanda " touch /var/state/dhcp/dhcpd.leases "). ---< Kako osigurati da se DHCP daemon pokrece svaki put? Da bi se DHCP daemon pokretao pri startovanju sistema mora se dodati /etc/rc.d/rc.local linija koja ce ga pokretati a to je "/usr/sbin/dhcpd eth0" (bez navodnika naravno). eth0 ako je to mrezna karta na kojoj bi trebao da radi. ---< 7. A kako se konfigurise BIND ? Kod razresavanja imena masina preko adresa i obratno ima nekoliko kljucnih fajlova.Jedan od njih je /etc/host.conf koji oznacava kojom metodom ce se razresavanje vrsiti. Sto se njega tice ima nekoliko opcija: order - oznacava koje ce servise da koristi server pri razresavanju imena. Opcije mogu biti bind (gde razresavanje ide preko bind servera) hosts (gde razresavanje ide preko /etc/hosts fajla ) i nis (gde razresavanje ide preko nis servera).Ovaj parametar moze da sadrzi jednu ili sve opcije i izvrasava ih redom. Dakle ako se nalazi order bind, hosts, nis onda ce se ici prvo preko bind-a pa zatim redom... multi - moze biti on ili off i oznacava da li moze postojati vise adresa u /etc/hosts fajlu Drugi bitan fajl je /etc/resolve.conf. On je veoma prost fajl i trebalo bi da sadrzi samo sledece : search earth.ea nameserver 127.0.0.1 Search parametar oznacava ime domena koji se pretrazuje, a nameserver oznacava na kojoj se masini nalazi DNS server. Sadrzina ovog fajla nije mnogo velika ali je veoma vazna i obezbedjuje prisutnost na mrezi. Sledeci bitan fajl(jedan od najbitnijih) je naravno /etc/named.conf u kome podesavamo parametre samog programa. Veoma je bitno pravilno namestanje ovog fajla.On sadrzi dva dela. Prvi u kom su opcije i drugi u kom su naznacene baze zona: options { directory "/var/named"; zone "earth.ea" { type master; file "earth.ea.hosts"; }; zone "0.0.10.in-addr.arpa" { type master; file "earth.ea.reverse"; }; Opcija directory oznacava u kom se direktorijumu nalaze zone. Opcija zone oznacava ime domena i dalje opcije za njega. Ovde je tip master jer je to glavni server. Dalje podesavanja za zone se sastoje iz imena baza sa zonama koje se u ovom slucaju nalaze u /var/named. Zone mogu imati bilo koje ime. Sledeci fajl je /etc/hosts koji sluzi kao podrska ako DNS ne radi. On treba da sadrzi imena racunara u mrezi i njihove adrese. Dakle vrlo prosto: 127.0.0.1 localhost 10.0.0.1 gondolin.earth.ea 10.0.0.2 comp1.earth.ea Prelazimo na fajlove u /var/named. Prvo je potreban fajl za forward lookup bazu za nasu zonu. Dakle /var/named/earth.ea.hosts treba da sadrzi sledece: earth.ea IN SOA gondolin.earth.ea root@gondolin.earth.ea ( 42 3H 15M 1M 1D ) IN NS gondolin.earth.ea gondolin.earth.ea IN A 10.0.0.1 comp1.earth.ea IN A 10.0.0.2 Dalje je potreban reverse lookup fajl koji je reverse lookup baza za nasu zonu. Recimo da je to /var/named/earth.ea.reverse koji treba da sadrzi: earth.ea IN SOA gondolin.earth.ea root@gondolin.earth.ea( 42 3H 15M 1M 1D ) IN NS gondolin.earth.ea 1 IN PTR gondolin.earth.ea 2 IN PTR comp1.earth.ea Sto se tice BIND-a to je to. Ostaje samo da se pokrene. Za startovanje BIND Daemona pri podizanju sistema koristi se skripta rc.bind koja se nalazi u /etc/rc.d/ direktorijumu. ---< 8. Nadam se da je to sve. A sta je sa korisnicima, kako dodajem korisnike? Da bi se dodali korisnici u Samba server oni moraju da postoje i na lokalnoj masini. Dakle da bi imali korisnika servera npr. earthquake prvo bi morali da ga dodamo na lokalnu masinu komandom "adduser earthquake". Prativsi uputstva dodali smo korisnika na masinu. Sada je potrebno dodati ga i na samba server. Za dodavanje korisnika koristi se komanda smbpasswd. ---< 9. A podesavanje klijenta? Sto se tice podesavanja klijenta tu nema mnogo price. Sve se svodi na dodavanje Windows klijenta u domen. Sto se tice Windows-a moguznost rada u domenskoj mrezi nemaju Win95 Win98 i WinXP Home Edition. Windows XP Profesional pristupa domenu na sledeci nacin. Otvori se sistem menadzer (precica je win-taster + pause ) i na kartici Computer name na dugle Change. U novootvorenom prozoru Computer name changes kliknuti na radio dugme Member Of Domain i upisati ime domena (u nasem slucaju earth.ea). Zatim dugme ok. Ako mreza radi trebalo bi da se pojavi prozor za identifikaciju u koji se upisuju ime korisnika i sifra (za ime korisnika pri ovome koristiti Administrator). Ako je sve lepo podeseno (a sledeci uputstva tesko da nesto moze da podje naopako) sada bi trebalo da imamo comp1 u domenu earth.ea. Naravno ranije bi morali da namestimo ime windows racunara da bude comp1. Time smo zavrsili podesavanje i pustanje u rad nase male domenske mreze. ---< 10. Rupe i zastita Postoji jedna krajnje , po meni , glupa rupa u KDE Konqueror-u i sambi. Naime ako bi korisinik pokusao da napravi simbolicki link ka nekom od share-ova na samba serveru dobio bi fajl koji bi pored imena share-a imao i ime korisnika i njegovu sifru. Znaci ime precice ka share-u bi bilo sledece : smb://korisnik:sifra@server/staza/share Sifra bi "naravno" bila u cistom tekstu citljiva za svakoga. Ova ranjivost nije od strane sambe vec od strane KDE-a. Ranjive verzije su sve starije od 3.2.1. Iako na 3.3.0 verziji nije bilo uspesno eksploitanje ove rupe razvojni tim kaze kako i u tom izdanju postoji ista greska kao i da je moguce da postoji i u 3.4. U verziji Sambe koju ja koristim ima integer overflow greska u kodu koja omogucava izvrsavanje komandi sa distance. Kako je uglavnom korisnik koji pokrece sambu root korisnik (ili uglavnom ima visoka prava) ovo moze biti opasno. Naime korisnik samba servera koji ima pristup bar jednom share-u moze poslati niz specijalnih zahteva serveru. Kada se salje poruka serveru ona pored zahteva za otvaranje nekog dokumenta sadrzi i sigurnosne deskriptore koji sadrze podatke o kontroli pristupa koje treba server da prosledi fajlu. Ranjivost se javlja u delu koda koji cuva opise za deskriptor.server.home.net  /*    * Even if the num_aces is zero, allocate memory as there's a difference    * between a non-present DACL (allow all access) and a DACL with no ACE's    * (allow no access).    */    if((psa->ace = (SEC_ACE *)prs_alloc_mem(ps,sizeof(psa->ace[0]) * (psa->num_aces+1))) == NULL)           return False; Kada se posalje zahtev sa vise od 38347922 deskriptora dolazi do integer overflow-a koji dovodi do alociranja manje memorije nego sto je zahtevano. Descriptor ima velicinu od 112 ( sizeof(psa->ace[0]) ), ili 0x70 u hex. Pa kada se to pomnozi sa vise od 38347922 dobija se npr. 0x70x(38347922+1)=4294967376, ili 0x100000050 u hex. Posto je za memoriju odredjen 32-bitni integer ,a 0x100000050 definitivno ne moze da stane svi brojevi koji ne mogu da stanu se izuzimaju. To bi bilo 0x50 jer 0x1000000 moze da se smesti.0x50 je 80 u decimalnom zapisu. Doci ce dakle do overflow-a od najmanje 32 bajta, znajuci da je velicina deskriptora 112 bajta. Uspesno izveden ovakav napad bi doveo do izvrsavanja zeljenog koda i do dobijanja povlastica na serveru. Ipak neuspeli napad ce dovesti do rusenja zahteva i do belezenja pokusaja napada. Druga ranjivost postoji TRANSACT2_QFILEPATHINFO zahtevu koji izdaje korisnik servera. Tacnije korinik moze da oznaci kolika ce biti velicina rezultata zahteva sto omogucuje da korisnik oznaci da velicina bude 0 sto dovodi do unicode overflow-a. Moze se doci do potpune kontrole malloc()/free() strukture i time do mogucnosti izvrsavanja koda (na daljinu) ako se u imenima datoteka koriste unicode karakteri. Takodje postoji DoS (Denial Of Service) radnjivost pri koriscenju wildcard-ova u komandama.DoS se satoji iz toga da akos e smbd-u prosledi komanda sa wildcard-om (* na primer) sam smbd koristi sve vise i vise procesorske snage za svoj rad da bi resio problem.Jednostavno iskoriscavanje od strane napadaca moze se sastojati samo u nekoliko puta ponovljenom zahtevu dir******************z moze dovesti do zagusenja serera i uposlenja procesora do 100 procenata. Sama ranjivost se nalazi u ms_fnmatch() direktivi koja dovodi do sve veceg i veceg ponavljanja pri izdavanju zahteva sa wildcard-om : case '*':     for (; *n; n++) {         if (ms_fnmatch(p, n) == 0) return 0;         }         break; Resenje za sve ove ranjivosti je prelazak na najnoviju verziju sambe koja je u vreme kada ja ovo pisem cini mi se 3.0.9 . Dodatak: Neke manje skripte: {C U T H E R E} #! /bin/sh # # Kill and restart Samba # echo -n "Shutting down Samba: " killproc -TERM /usr/sbin/nmbd killproc -TERM /usr/sbin/smbd echo echo -n "Hit XMIT to delete logs and restart" read rm /var/log/samba/log.* echo -n "Restarting Samba " /usr/sbin/nmbd -D /usr/sbin/smbd -D echo " done" {C U T H E R E} Druga skripta koja geberise windows bat fajlove : Napomena:Ova skripta je ripovana. [Autor skripte: Francois-Xavier Le Bail. mailto:fx.LeBail@free.fr] 1) "/usr/local/samba/lib/netlogon/scripts" direktorijum mora da postoji 2) U smb.conf fajlu mora biti : # Global parameters [global] logon script = scripts\%m.bat time server = yes [netlogon] comment = netlogon share path = /usr/local/samba/lib/netlogon guest ok = no writable = no write list = admin locking = no root preexec = /usr/local/samba/bin/make_logon_script '%m' '%U' '%a' '%g' '%L' 3) Skripta koja se nalazi u /usr/local/samba/bin/make_logon_script : {C U T H E R E} #!/bin/sh # # parameters : # %m (machine netbios name) %U (user) %a (architecture) %g (group) %L (server) # $1 $2 $3 $4 $5 umask 022 SAMBA_DIR=/usr/local/samba # if you need the errors messages exec 2>>"$SAMBA_DIR/var/logon_script.err" # if you prefer the errors messages by machine name, comment the preceding line # and uncomment : #exec 2>>"$SAMBA_DIR/var/logon_script.$1.err" # if you need SHELL DEBUG, in the errors messages file, uncomment : #set -x #--------------------------- FUNCTIONS ---------------------------------------- # end of line in windows world : CR+NL # echo -n "WINDOWS_COMMAND"; echo -e '\r' # do the trick. # use "write" to write in the logon script write () { echo -n "$@"; echo -e '\r'; } #--------------------------- VARIABLES ---------------------------------------- CLIENT_MACHINE="$1" USER="$2" SYSTEM_TYPE="$3" GROUP="$4" SERVER_NAME="$5" SUFFIX=bat #--------------------------- HEADER ------------------------------------------- SCRIPT="$SAMBA_DIR/lib/netlogon/scripts/$CLIENT_MACHINE.$SUFFIX" # this redirection mean all the standard output go in the logon script exec 1>"$SCRIPT" # to hidden the script, (need "map hidden = yes", see in "man smb.conf") chmod o+x "$SCRIPT" #--------------------------- BODY --------------------------------------------- write "@ECHO off" write "ECHO." write "ECHO Type : $SYSTEM_TYPE." write "ECHO." write "ECHO Computer : $CLIENT_MACHINE - User : $USER - Group : $GROUP." write "ECHO." # perhaps some tools used in the logon script are on the server write "PATH %path%;\\\\$SERVER_NAME\parameters\bin" # set the workstation time at the server time write "NET TIME \\\\$SERVER_NAME /set /yes" # perhaps you need non persistent connexion write "NET USE /persistent:no" # mount the home share write "NET USE f: \\\\$SERVER_NAME\homes /yes" # command depend on client machine case "$CLIENT_MACHINE" in pc1) write "....." write "....." ;; pc2) write "....." ;; *) # other PCs write "....." esac # mount depend on user if [ "$USER" = u1 ]; then write "NET USE l: \\\\$SERVER_NAME\share1 /yes" elif [ "$USER" = u2 ]; then ..... else # other users write "....." fi # mount depend on group write "NET USE x: \\\\$SERVER_NAME\\$GROUP /yes" # command depend on system type if [ "$SYSTEM_TYPE" = Win95 ]; then ..... fi if [ "$SYSTEM_TYPE" = WinNT ]; then ..... fi #--------------------------- IN OUR CLASSROOMS -------------------------------- # example : clients are named xxYYcZZ and printers xxYYpZZ # xx: building prefix, YY: classroom number, ZZ: identifier numbers # xxYY est the classroom CLASSROOM=`expr "$CLIENT_MACHINE" : '\(....\)'` # common share by classroom write "NET USE f: \\\\$SERVER_NAME\\${CLASSROOM}common /yes" # 2 networked laser printers in some classrom ? I need : # computer 1 to half : printer_1, half+1 to max : printer_2 MACHINE_NUMBER=`expr "$CLIENT_MACHINE" : '.....\(..\)'` PRINTER_PREFIX="${CLASSROOM}p" # for the room with only one printer LIMIT=99 case "$CLASSROOM" in ka27) # 14 computers LIMIT=7;; ka28) # 12 computers LIMIT=6;; esac if [ "$MACHINE_NUMBER" -le "$LIMIT" ]; then PRINTER_NUMBER=01 else PRINTER_NUMBER=02 fi PRINTER="$PRINTER_PREFIX$PRINTER_NUMBER" write "NET USE lpt1: \\\\$SERVER_NAME\\$PRINTER /yes" write "ECHO The printer number $PRINTER_NUMBER is connected." write "ECHO." # perhaps you need to apply some registry keys write "REGEDIT /s \\\\$SERVER_NAME\parameters\registry\my_entries.registry" # admin has special commands if [ "$USER" = admin ]; then ..... # perhaps you want to change the password the next time, uncomment : #if [ "$SYSTEM_TYPE" = WinNT ]; then #write "NET USER admin my_new_passwd" #fi ..... fi {C U T H E R E} Odjava: Eh ,nema boljeg osecaja kada se za nesto mnogo pomucis i onda steceno znanje o tome podelis sa svetom. Ponavljam, nadam se da ce bar neko imati korist od ovog teksta. Zelim da se zahvalim mom kolegi Vladi koji mi je nesebicno pomagao u postavljanju mreze (ili sam ja njemu nesebicno pomagao:) posebno za deo o BIND-u. Greetz to all the riders on the net outhere.