var SectionTitles=new Array( "Ochrana dat v databßzφch a (nejen) bezp" , " Zm∞na nenφ jen tak!" , " Transakce" );
var SectionURLs=new Array( "140" , "140#Title1" , "140#Title2" );
var BrothersNames = new Array("Ochrana dat v datab_25E1z_25EDch a (nejen) bezpe_25E8nostn_25ED probl_25E9my (1.d_25EDl)","Ochrana dat v datab_25E1z_25EDch a (nejen) bezpe_25E8nostn_25ED probl_25E9my (2.d_25EDl)","SQL v praxi aneb bezpeΦnostnφ oddech","");
var BrothersIDs = new Array("140","142","146","");
//=====INFO======
ItemName='Article140';
InIFrame='No';
TableNum=2;
ItemID=140;
ArticleType='1';
Action='articles'
ItemTitle='Ochrana dat v datab_25E1z_25EDch a (nejen) bezpe_25E8nostn_25ED probl_25E9my (1.d_25EDl)';
ItemComment='Ochrana dat v datab_25E1z_25EDch a (nejen) bezpe_25E8nostn_25ED probl_25E9my (1.d_25EDl)';
ArticleHead('Ochrana dat v datab_25E1z_25EDch a (nejen) bezpe_25E8nostn_25ED probl_25E9my (1.d_25EDl)', 'Michal Till', 'Michal.Till_40Seznam.cz', '13.2.2002', '22:09:09', '╚lßnek');
Intro('P°i vyu₧φvßnφ databßzovΘho systΘmu jeho sprßvci a vlastnφcφ Φasto cφtφ, jak jim cena dat s Φasem nar∙stß, tabulky nap°φklad obsahujφ zßznamy o Φφm dßl tφm v∞tÜφ skupin∞ lidφ, pr∙m∞rnΘ hodnoty toho Φi onoho jsou neustßle p°esn∞jÜφ, objevujφ se statistickΘ vztahy, kterΘ p°edtφm ka₧d² pova₧oval za nßhodu. V takovΘto dob∞ si odpov∞dnφ pracovnφci Φasto kladou otßzky typu "Jak pravideln∞ a na co zßlohujeme?", "Co zabrßnφ vynßÜenφ dat z organizace ven?" a podobn∞. Rßd bych, aby m∙j Φlßnek poslou₧il minimßln∞ jako pr∙let ochranou dat v t∞chto systΘmech a jako °ekn∞me sm∞rnice, kam se v bezpeΦnosti databßzφ vydat.');
V databßzovΘm systΘmu jsou vÜechna data soust°ed∞na do jednoho mφsta. K takovΘmuto objektu se p°istupuje jednotn²m zp∙sobem, jednotn²m zp∙sobem se data Φtou, jednotn²m zp∙sobem se autorizuje p°φstup u₧ivatel∙. Databßzovß aplikace spolu s daty tak tvo°φ v rßmci firmy, organizace apod. jednotn² celek, kter² naz²vßme databßzov² systΘm. Pohled na komplexnφ bezpeΦnost takovΘhoto enormn∞ obsßhlΘho objektu nenφ jednoduch² a samotn² sprßvn² popis privilegiφ a jejich spojenφ s konkrΘtnφmi u₧ivateli a skupinami je Φasto ·loha nßroΦnß sama o sob∞. ┌pln² a vyΦerpßvajφcφ popis vÜech aspekt∙ by byl materißl pro celou publikaci a takovΘto zpracovßnφ je nad rßmec tohoto Φlßnku.
</DIV></FONT></b></i>
<FONT Size=2><DIV Align=Justify Class=Paragraph>
Vyjmenuje si nejd°φve postupn∞ mo₧nß bezpeΦnostnφ rizika, kter²m je naÜe databßze vystavena.
</DIV></FONT></b></i>
<FONT Size=2><DIV Align=Justify Class=Paragraph>
P°edn∞ je zde fyzickß integrita databßze, tedy odolnost v∙Φi v²padk∙m napßjenφ, havßrii pevn²ch disk∙ a proti ostatnφm formßm poÜkozenφ. Na dalÜφ stupe≥ je mo₧nΘ polo₧it jakousi strukturßlnφ bezpeΦnost, tφm mßm na mysli zachovßnφ sprßvnΘ sytaxe dat a zachovßnφ vazeb mezi jednotliv²mi objekty databßze.
</DIV></FONT></b></i>
<FONT Size=2><DIV Align=Justify Class=Paragraph>
Pokud jsou takto objekty mezi sebou sprßvn∞ svßzßny, je nutnΘ zajisit datovou integritu. Kup°φkladu nenφ mo₧nΘ, aby ve sloupci s typem datum byl, obsah datum nevyjad°ujφcφ. Nemusφ v₧dy jφt pouze o data p°φmo nesmyslnß, nebo¥ potencionßlnφ nejen bezpeΦnostnφ problΘm m∙₧e p°edstavovat nap°φklad datum 29. 2. 2001, tedy "den navφc" v nep°estupnΘm roce (lze bez problΘm∙ vlo₧it nap°φklad do MySQL). Pokud se t°eba ka₧d² den testuje, zda prßv∞ dnes n∞komu nevyprÜelo to Φi ono (u₧ivatelsk² ·Φet, certifikßt, oprßvn∞nφ apod...), °ßdek s takovouto lh∙tou z∙stane v databßzi neodstran∞n.
</DIV></FONT></b></i>
<FONT Size=2><DIV Align=Justify Class=Paragraph>
Je jasnΘ, ₧e zde klφΦovou ·lohu hraje Φlov∞k, kter² d∞lß (a¥ ji₧ ·mysln∞ nebo ne·mysln∞) chyby. Ty musφ b²t S╪BD (SystΘmem °φzenφ bßze dat) minimßln∞ zachyceny a odmφtnuty. Takovßto kontrola sprßvnosti se naz²vß field checks. I nejjednoduÜφ databßzovΘ systΘmy musφ nap°φklad rozpoznat chybn∞ zadanΘ Φφslo.
</DIV></FONT></b></i>
<FONT Size=2><DIV Align=Justify Class=Paragraph>
Na dalÜφ stupe≥ bych postavil autorizaci jednotliv²ch u₧ivatel∙ v databßzi. Jednß se p°edevÜφm o mechanizmus ov∞°ovßnφ p°φstupovΘho jmΘna, hesla a p°istupujφcφho poΦφtaΦe. Poslednφ jmenovanß hodnota v tabulce u₧ivatel∙ dßvß mo₧nost omezit p°φstup z poΦφtaΦ∙. NejΦast∞ji se striktn∞ povolφ p°φstup pouze poΦφtaΦi na kterΘm databßze b∞₧φ (localhost), nebo pouze poΦφtaΦ∙m urΦitΘ domΘny (%.firma.cz, kde % zde znamenß wildcard, tedy jakΘhosi ₧olφka zastupujφcφho cokoliv).
</DIV></FONT></b></i>
<FONT Size=2><DIV Align=Justify Class=Paragraph>
Nad rßmec autorizace jednotliv²ch u₧ivatel∙ je kontrola vlastnφch p°φstupov²ch prßv. Dobr² databßzov² systΘm by m∞l mφt mechanizmus p°id∞lovßnφ prßv co nejvφce flexibilnφ, aby bylo mo₧no sprßvc∙m co nejvφce vystihnout danou reßlnou situaci a nutnΘ pot°eby p°φstupu. ╚asto je pot°eba jednotliv²m u₧ivatel∙m/skupinßm zakßzat p°φstup do n∞kter²ch tabulek, do ostatnφch by m∞l z∙stat povolen, ka₧dΘmu pochopiteln∞ jinak. N∞kte°φ u₧ivatelΘ by ale nem∞li vid∞t urΦitΘ sloupce n∞kter²ch tabulek. N∞kte°φ jinφ t°eba ano, ale pouze pro Φtenφ. Ti co m∙₧ou v databßzi m∞nit ·daje ale t°eba zase nesmφ mazat nebo p°idßvat jednotlivΘ °ßdy. Jak je vid∞t, Φφm pru₧n∞jÜφ nastavenφ prßv, tφm lΘpe.
</DIV></FONT></b></i>
<FONT Size=2><DIV Align=Justify Class=Paragraph>
Dßle by m∞lo b²t mo₧nΘ v p°φpad∞ zßkazu Φtenφ jednotliv²ch °ßdku povolit Φtenφ souhrnn²ch ·daj∙, co₧ bych oznaΦil jako stupe≥ poslednφ, alespo≥ co se mo₧nosti zneu₧itφ t²Φe. Obecn∞ °eΦeno, pokud jsou n∞kterß data tajnß a jinß nikoliv, tak je nutnΘ dßt obzvlßÜ¥ pozor na dßle zmi≥ovan² tzv. problΘm odvoditelnosti (viz dalÜφ dφly).
Zm∞nit urΦitΘ mno₧stvφ dat ve velkΘ databßzi je Φasto podstatn∞ nßroΦn∞jÜφ proces, ne₧ se mohlo b²t na prvnφ pohled zdßt. Cen∞ databßze je p°edn∞ nutnΘ p°izp∙sobit p°φpadnou nutnost logovßnφ prßce s nφ, je t°eba zajistit tzv. auditabilitu a to p°edevÜφm ze dvou d∙vod∙. Prvnφm je prost² log zm∞n, kdy se v p°φpad∞ kritick²ch polo₧ek uschovßvß p∙vodnφ i novß hodnota. Vedle toho je se ale Φasto sleduje p°φstup do databßze jako podklad pro vyhodnocovßnφ oprßvn∞nosti budoucφch dotaz∙. N∞kterΘ dotazy je nap°φklad nutnΘ d∞lat chronologicky za sebou (nap°. v dob∞ ·Φetnφ uzßv∞rky, inventarizace apod...), poruÜenφ ΦasovΘ souslednosti m∙₧e b²t znßmkou neoprßvn∞nΘho ₧ßdßnφ dat.
</DIV></FONT></b></i>
<FONT Size=2><DIV Align=Justify Class=Paragraph>
Nastavenφ jemnosti logovßnφ (granulity) doporuΦuji v∞novat specißlnφ pozornost, nebo¥ p°i nesprßvnΘ volb∞ m∙₧e b²t v²pis po₧adavk∙ za chvφli gigantick² a v n∞m skuteΦn∞ hodnotnΘ a relevantnφ informace mohou zabφrat pouhß procenta.
</DIV></FONT></b></i>
<FONT Size=2><DIV Align=Justify Class=Paragraph>
Vlastnφ zm∞na hodnot probφhß podstatn∞ jinak ne₧ nap°φklad zm∞na souboru u jednoduchΘho souborovΘho systΘmu. Jde o to, jak vylouΦit zm∞nu jednΘ polo₧ky dv∞ma Φi vφce u₧ivateli najednou, co₧ se v praxi nejΦast∞ji d∞lß pou₧itφm transakcφ.
Transakce je ned∞liteln² logick² celek p°φkaz∙, kterΘ nemohou b²t vykonßny zvlßÜ¥. Takov²m klasick²m a vÜude om²lan²m p°φkladem je baknovnφ p°evod. Snφ₧enφ stavu jednoho ·Φtu a nav²Üenφ druhΘho jsou dva p°φkazy, nicmΘn∞ jejich "nesoudr₧nost" by vyvolalo v bance pohromu. Nenφ zkrßtka mo₧nΘ ud∞lat jen p∙l, databßze by ztratila vnit°nφ konzistenci. To se m∙₧e stßt z r∙zn²ch fyzick²ch p°φΦin, o kter²ch byla °eΦ v ·vodu Φlßnku.
</DIV></FONT></b></i>
<FONT Size=2><DIV Align=Justify Class=Paragraph>
P°i vykonßvßnφ jednotliv²ch p°φkaz∙ transakce se neoperuje se skuteΦn²mi daty ale s jejich kopiφ. JakΘsi stornovßnφ transakce p°edstavuje p°φkaz ROLLBACK, p°i kterΘm je vÜe jakoby pro po°ßdek odrolovßno zp∞t. Teprve po zadßnφ p°φkazu COMMIT novß hodnoty jakoby najednou "p°eplßcnou" ty starΘ. Tφm transakce definitivn∞ skonΦila a m∙₧e zaΦφt novß. N∞kterΘ databßzovΘ systΘmy (nap°. MySQL) ovÜem transakce nemajφ implementovßny, Φasto je uvßd∞n d∙vod nutnosti zachovßnφ souΦasnΘ (Φasto vyhlßÜenΘ) rychlosti zpracovßnφ dotaz∙.
</DIV></FONT></b></i>
<FONT Size=2><DIV Align=Justify Class=Paragraph>
Transakce jsou ideßlnφm °eÜenφm v p°φpad∞, ₧e jeden u₧ivatel z databßze Φte a druh² do nφ (v tu samou dobu) zapisuje. Zßpis se uzav°e do transakce a p°eΦtenΘ informace budou maximßln∞ za pßr sekund neaktußlnφ. Nic ale nebude "nap∙l". Pokud ovÜem vφce u₧ivatel∙ do databßze zapisuje, tak si s nimi nevystaΦφme. Uve∩me si p°φklad fiktivnφ t°φdy v²robk∙, kterΘ stojφ 100 KΦ. ProblΘm nastane, pokud se v jednom okam₧iku n∞kdo rozhodne tyto v²robky o 20 KΦ zlevnit ale n∞kdo jin² mß v ·myslu ploÜn∞ zdra₧it vÜe o 5%. Jak zßle₧φ na po°adφ transakcφ si uka₧me nynφ:
</DIV></FONT></b></i>
<FONT Size=2><DIV Align=Justify Class=Paragraph>
<UL STYLE="margin-right:50px;" Class=LinkItem><LI> Nejprve se danΘ v²robky zlevnφ o 20 KΦ a regulΘrn∞ se ukonΦφ transakce. Nßsleduje ploÜnΘ p∞tiprocentnφ zdra₧enφ, celkovß cena tedy bude (100-20) * 1.05 = 84 KΦ.</UL>
</DIV></FONT></b></i>
<FONT Size=2><DIV Align=Justify Class=Paragraph>
<UL STYLE="margin-right:50px;" Class=LinkItem><LI> Pokud se naopak nejprve zdra₧φ a potΘ se konkrΘtnφ v²robky zlevnφ, bude v²slednß cena (100 * 1.05) - 20 = 85 KΦ (P°i v∞tÜφch Φßstkßch by byl rozdφl pochopiteln∞ daleko markantn∞jÜφ). </UL>
</DIV></FONT></b></i>
<FONT Size=2><DIV Align=Justify Class=Paragraph>
V tomto i p°edeÜlΘm p°φpad∞ se stalo akorßt nßhodou, ₧e dva p°φkazy p°iÜly krßtce po sob∞, nicmΘn∞ jak si ukß₧eme, dalÜφ dv∞ hodnoty dostaneme, pokud se budou alespo≥ chvφli vykonßvat najednou.
</DIV></FONT></b></i>
<FONT Size=2><DIV Align=Justify Class=Paragraph>
<UL STYLE="margin-right:50px;" Class=LinkItem><LI> Prvnφ se zaΦne vykonßvat transakce zlevn∞nφ a z databßze se naΦte pro vÜechny v²robky danΘ t°φdy hodnota 100 KΦ. V pr∙b∞hu odeΦφtßnφ 20 KΦ ale zaΦne transakce ploÜnΘho zdra₧ovßnφ, kterß, stejn∞ jako zlev≥ovßnφ naΦte p∙vodnφ 100 KΦ (nynφ pro vÜechny v²robky, novß hodnota z prvnφ transakce jeÜt∞ nebyla zapsßna). Nßsleduje potvrzenφ slevy a do n∞kter²ch °ßdk∙ se zapφÜe hodnota 80 KΦ. Jen₧e se jeÜt∞ musφ ukonΦit transakce ploÜnΘho zdra₧ovßnφ kterß prßv∞ zmenÜenou hodnotu p°epφÜe, v²slednß cena bude tedy 100 * 1.05 = 105 KΦ.</UL>
</DIV></FONT></b></i>
<FONT Size=2><DIV Align=Justify Class=Paragraph>
<UL STYLE="margin-right:50px;" Class=LinkItem><LI> Pokud se celß situace jako v p°edeÜlΘm p°φpad∞ odehraje v opaΦnΘm po°adφ, na v²sledku se naopak neprojevφ transakce zdra₧enφ, koncovß cena bude 100 - 20 = 80 KΦ. </UL>
</DIV></FONT></b></i>
<FONT Size=2><DIV Align=Justify Class=Paragraph>
Jak je vid∞t, vφcemΘn∞ nßhodnΘ po°adφ transakcφ m∙₧e dßt v nejhorÜφm p°φpad∞ a₧ Φty°i od sebe se liÜφcφ v²sledky. Ideßlnφm °eÜenφm je v urΦitΘ dob∞ privilegovat danou oblast dat pro konkrΘtnφho u₧ivatele a v p°φpad∞ dalÜφho po₧adavku data odmφtnout, pop°. zp°φstupnit pouze pro Φtenφ. Tedy pou₧φt takzvanΘ zßmky a to jak tzv. zßmek aktualizaΦnφ, kter² znamenß brzkou aktualizaci dat a je povolen p°φstup pouze pro Φtenφ, tak zßmek exkluzivnφ, kter² znaΦφ slo₧it∞jÜφ modifikace dat (mazßnφ, opravy, p°idßvßnφ) a v tuto dobu nemajφ ostatnφ u₧ivatelΘ k dat∙m ₧ßdn² p°φstup.
</DIV></FONT></b></i>
<FONT Size=2><DIV Align=Justify Class=Paragraph>
V databßzov²ch systΘmech Φasto mφvajφ transakce pro p°φpad "zastavenφ" nastaveny jakousi Φasovou lh∙tu, po jejφm₧ vyprÜenφ ji systΘm stornuje a odroluje data zp∞t. Poslednφ v∞cφ, kterou bych zmφnil v souvislosti s vnit°nφ integritou datovou databßze je takzvan² pojem deadlock, p°i jeho °eÜenφ se toti₧ tato vlastnost hojn∞ vyu₧φvß. P°i zamykßnφ dat jednotliv²mi transakcemi je toti₧ op∞t mo₧nΘ, ₧e dv∞ transakce zamykajφ najednou. Stane se velmi nep°φjemnß v∞c : dv∞ transakce pot°ebujφ urΦitß data a zaΦnou si je zamykat jaksi "z jinΘho konce". V²sledkem je zablokovßnφ obou, nebo¥ ka₧dß Φekß, a₧ jφ uvolnφ data ta druhß. Ani jedna transakce nem∙₧e pokraΦovat, nastßvß deadlock. ┌Φelnost odrolovßnφ obou transakcφ po vyprÜenφ ΦasovΘho limitu je jasnß.
</SCRIPT><OL Class=None Type=Disc><LI style='margin-left:20px;' class=LinkItem><a href=articles.php@ID=142><SPAN Class=SeeAlso>Ochrana dat v databßzφch a (nejen) bezpeΦnostnφ problΘmy (2.dφl)</SPAN></a></OL><SCRIPT>
nie('<br>');AdditionalTablesBegin();
CommentsBegin('Ochrana dat v datab_25E1z_25EDch a (nejen) bezpe_25E8nostn_25ED probl_25E9my (1.d_25EDl)',3);
Comment('81',' <IMG Src=images/sub.gif valign=top> chybiΦka se vloudila ...','Tom','11');