BEZPECNOST DATABAZOVYCH HESIEL

06.02.2003 13:55

Vsetci dobre vieme, ze vacsina naozaj nebezpecnych hackov prichadza zvnutra, od ludi, ktori maju na nasom serveri konto. Pokial ide o bezpecnost databazovych hesiel, tie sa stavaju zranitelne pri pouzivani databaz v PHP, najma ked ziskanym heslom mozete mazat/menit zaznamy v tabulkach (pripadne aj samotnu strukturu tabuliek).

V com je problem? Problem je v tom, ze web-server zvacsa bezi pod specialnym uzivatelom a specialnou grupou, preto aby mohol precitat Vase stranky/skripty. Kvoli tomu musia byt tieto citatelne pre vsetkych uzivatelov (ak sa nerozumiete problematike pristupovych prav, otvorte hocijaku prirucku o UNIXe/Linuxe, najlepsie LDP [http://www.guides.sk/LDP/linux_1.pdf]).

Tym padom ale moze hociktory user, ktory ma konto na vasom serveri, citat skripty (teda ich zdrojove kody), nuz a ked moze citat zdrojaky, moze citat aj heslo do databazy.. urcite to poznate:<? //... MySQL_Connect('localhost', 'meno', 'heslo'); //... ?>Potom mu uz staci iba:
bash> mysql -u meno -pheslo dbaza
mysql> DELETE FROM table;

Existuju tri sposoby ako zabranit sikovnym userom, aby realizovali vyssie uvedeny postup:
1) Mat vlastny server a nikoho nan nepustit :

2) Kedze moznost (1) je pre vacsinu z nas nerealna, existuje dalsi sposob:
Ak je na vasom systeme malo userov, resp. ak su iba v jednej grupe, staci ak prava pre dany skript zmenime na 604 (rw----r--). Kedze plati, ze prava pre skupinu su nad pravami pre ostatnych, uzivatelia z danej grupy subor nebudu moct citat. Pochopitelnou podmienkou je, aby mal subor rovnaku grupu ako ostatni uzivatelia a aby web-server mal *INU* grupu ako uzivatelia (lebo potom by ani on nemohol tento skript citat, IMHO

3) Samozrejme, ani tieto podmienky sa nedaju vzdy splnit a preto existuje este treti sposob: na ten vsak potrebujete zasah sysadmina (v pripade, ze nim ste, mate o problem menej :). Poziadajte ho, aby vam vytvoril skupinu, v ktorej budete iba vy a web-server (treba do /etc/group pridat napr.takyto riadok:
winetou: xloop, apache
Este vam musi zmenit groupu vasho skriptu na xloop:winetou, no a potom uz staci nastavit iba prava na 640 (rw-r-----) a je to! Teraz mozete tento subor citat vy a web-server, nikto iny.

Problemom moze byt este dohovor s adminom, ktory vam musi zakazdym ked vytvorite novy skript pracujuci s databazou zmenit grupu. Preto odporucam (a nielen z tychto dovodov), odseparovat hesla do zvlastneho suboru, napr. pass.php:<? $db_user = 'meno'; $db_pass = 'heslo'; ?>Tomuto suboru potom zmenite prava niektorym z vyssie uvedenych sposobov a budeme ho includovat do kazdeho skriptu pracujuceho s databazou, napr. takto:<? include 'pass.php'; //... MySQL_Connect('localhost', $db_user, $db_pass); //... ?> Zaverom by som chcel este upozornit na to, aby ste si skontrolovali, ci PHPcko bezi v Safe mode [http://php.cz/manual/en/features.safe-mode.php], pretoze ak nie, potom su vsetky nase opatrenia marne, lebo ktokolvek si moze napisat skript, ktory precita a vypise nas programik aj s heslami. Safe mode tomuto zabrani, pretoze okrem ineho nedovoluje otvarat subory, ktorych vlastnik sa nezhoduje s vlastnikom skriptu. Ale to uz je z ineho sudka, takze mozno nabududcexloop