U ovom radu je opisan model zatite podataka u sistemima za upravljanje bazama podataka. Model je zasnovan na standardnim algoritmima za ifrovanje i na standardnim dodatnim servisima radi lake primene u realnom okruenju. Detaljno je opisana i implementacija pomou alata otvorenog koda. Kljune rei: baza podataka, ifrovanje, podatak, servis direktorijuma, zatita, sigurnost, otvoren kod.
Data security in database Abstract In this paper contains model for protecting data stored in database management systems. Model is based on standard cryptography algorithms and on standard services all to accommodate easy implementation in real world environment. Detail steps of inmplemetation with open source tools are described in second part of paper. Key words: database, cryptography, information, directory service, protection, security, open source.
Zavrni rad ore Zeevi
2 Sadraj: 1. UVOD ........................................................................................................................................ 3 1.1. BAZE PODATAKA ................................................................................................................. 4 1.2. ZNAAJ ZATITE PODATAKA U BAZAMA ................................................................................ 5 1.3. ZATITA BAZA PODATAKA.................................................................................................... 6 2. PREDHODNA ISTRAIVANJA .............................................................................................. 8 2.1. MICROSOFT ......................................................................................................................... 8 2.2. ORACLE ............................................................................................................................ 10 3. METODOLOKI KONCEPT................................................................................................. 11 3.1. PREDMET ISTRAIVANJ A .................................................................................................... 11 3.2. CILJ I ZADACI ISTRAIVANJ A .............................................................................................. 11 3.3. ISTRAIVAKE HIPOTEZE.................................................................................................... 11 3.3.1. Generalna hipoteza ...................................................................................................... 11 3.3.2. Posebne hipoteze ......................................................................................................... 11 3.4. METODE ISTRAIVANJ A I TOK ISTRIVAKOG PROCESA ....................................................... 12 4. REZULTATI ISTRAIVANJA .............................................................................................. 13 4.1. MODEL ZATITE PODATAKA ............................................................................................... 13 4.1.1. Bezbedno radno okruenje(SOE) .................................................................................. 13 4.1.2. Sigurnosni dnevnik ...................................................................................................... 13 4.1.3. Skraeni nazivi funkciija .............................................................................................. 14 4.2. KONTROLA KORISNIKA ...................................................................................................... 14 4.3. IFROVANJ E I UPRAVLJ ANJE KLJUEVIMA ........................................................................... 14 4.3.1. ifrovanje sa sistemom javnih kljueva ......................................................................... 16 4.3.2. ifrovanje na nivou grupe korisnika ............................................................................. 18 4.4. IFROVANJ E PODATAKA U MYSQL BAZI ............................................................................. 20 4.4.1. Dodatne komponente ................................................................................................... 20 4.4.2. Sigurnosni katalog ....................................................................................................... 20 4.4.3. Sertifikaciono telo ........................................................................................................ 22 4.4.4. Server direktorijuma .................................................................................................... 23 4.4.5. CREATE TABLE upit ................................................................................................... 24 4.4.6. INSERT INTO upit ....................................................................................................... 26 4.4.7. SELECT upit................................................................................................................ 27 4.4.8. ALTER TABLE upit...................................................................................................... 28 4.4.9. DELETE FROM upit ................................................................................................... 30 4.4.10. DROP TABLE upit ..................................................................................................... 30 4.5. KLIJ ENTSKA APLIKACIJ A .................................................................................................... 30 5. ZAKLJUAK I PRIMENLJIVOST REZULTATA .............................................................. 31 5.1. PRIMENLJ IVOST REZULTATA ............................................................................................... 32 6. LITERATURA ........................................................................................................................ 38 7. DODACI .................................................................................................................................. 39 7.1. KORIENI ALATI I SOFTWARE ............................................................................................ 39 7.2. IZVORNI KOD PROGRAMA KOJ I KORISTI PROXY BAZE PODATAKA.......................................... 39
Zavrni rad ore Zeevi
3 1. Uvod
Ovaj Master rad se sastoji iz etiri celine. Prva celina je uvodna, i ona itaoca upoznaje sa osnovnim pojmovima i temom rada. Opisan je pojam baze podataka i data je kratka istorija razvoja baza. Nakon toga je opisan znaaj zatite podataka, kroz karakteristian tok podataka u savremenim aplikacijama, sa posebnim osvrtom na sigurnosne probleme sa skladitenjem podataka. Detaljnije su opisani sigurnosni mehanizmi u savremenim bazama i analizirani problemi koji postoje. U drugom delu rada prikazana su najnovija reenja velikih proizvoaa baza podataka i njihov nain reavanja problema sigurnosti podataka u bazi. Cilj ovog dela rada je da se uoe nedostaci trenutnih sistema zatite i pronau reenja. Kako bi pronali reenja, u treem delu rada je opisan metodoloki koncept istraivanja koje je uraeno. Izneene su hipoteze koje e biti dokazane u nastavku rada, kroz istraivanje. U etvrtom, najvanijem, delu rada izneeni su rezultati istraivanja. Opisan je teorijski model zatite podataka u bazama zasnovan na radu inenjera, J ingmin He i Min Wang, iz IBM-ovog Centra za istraivanje. Model predvia korienje ifrovanja da bi se zatitili podaci u bazama podataka. Kako bi se ifrovanje primenilo, definisan je pojam Sigurnosnog kataloga, koji se upotrebljava za smetanje informacija o ifrovanju podataka. U njemu se belee kolone koje su ifrovane, prava korisnika da ifrovanje ukljue ili iskljue I kljueve kojima se podaci ifruju. Pored Sigurnosnog kataloga, razmotreni su i sluajevi ifrovanja na nivou grupe korisnika, kao i problematika primene ifrovanja nad podacima koji ve postoje (naknadno ukljuivanje ifrovanja). Drugi deo poglavlja o rezultatima istraivanja sadri praktinu primenu teoretskog modela. U ovom delu se nalazi najvei doprinos ovog rada problematici ifrovanja podataka u bazama. Detaljno je objanjena primena teorijskog modela u zatiti MySQL baze podataka. Uveden je koncept Proxy aplikacije kao cetralnog mehanizma za ifrovanje podataka. Proxy je aplikacija koja je podstavljena izmeu klijenta i baze podataka. Ubacivanjem Proxy aplikacije, omoguena je primena nestandardnog SQL jezika, tj. uvoenje novih kljunih rei: encrypt, key, user_list i update. Pomou ovih kljunih rei, korisniku se prua mogunost da upravlja ifrovanjem podataka iz standardne SQL klijentske aplikacije. Centralna uloga Proxy-a je da pregleda upite koje alje klijent, po potrebi ih menja, izvrava izmene u Sigurnosnom katalogu i prosleuje upite bazi podataka. Osim Proxy-ja, za uspean rad modela, potrebni su i dodatni servisi: server diretkorijuma i PKI infrastuktura. U rezultatima istraivanja se opisuje uloga i konfiguracija ovih servisa. Zavrni rad ore Zeevi
4 Proxy aplikacija sama ne menja upite koje alje klijent, ve prua mogunost programiranja. Na kraju ovog rada prikazan je programski kod koji je napisan u svrhu rada sa Sigurnosnim katalogom i manipulisanje sa korisnikim upitima.
1.1. Baze podataka
Baze podataka predstavljaju vii nivo rada sa podacima u odnosu na klasine programske jezike. Re je o tehnologiji koja je nastala sa namerom da se uklone slabosti tradicionalne automatske obrade podataka iz 60-tih i 70-tih godina 20. veka. Ta tehnologija osigurala je veu produktivnost, kvalitet i pouzdanost u razvoju aplikacija koje se svode na memorisanje i pretraivanje podataka u raunaru. Baza podataka je skup meusobno povezanih podataka, snimljenjih u memoriji raunara. Podaci su istovremeno dostupni raznim korisnicima i programima. Ubacivanje, promena, brisanje i itanje podataka obavlja se posredstvom zajednikog programa. Korisnici i aplikacije pritom ne moraju poznavati detalje fizikog prikaza podataka, ve se referenciraju na logiku strukturu baze. Sistem za upravljanje bazom podataka (Database Management System - DBMS) je veza sa bazom podataka. On oblikuje fiziki prikaz baze u skladu sa traenom logikom strukturom. Takoe, on obavlja u ime klijenata sve operacije sa podacima. Dalje, on je u stanju da podri vie baza, od kojih svaka moe imati svoju logiku strukturu, ali u skladu sa istim modelom. Isto tako, brine se za sigurnost podataka, i automatizuje administrativne poslove s bazom. Podaci u bazi su logiki organizovani u skladu s nekim modelom podataka. Model podataka je skup pravila koja odreuju kako moe izgledati logika struktura baze. Model ini osnovu za projektovanje i implementiranje baze. Dosadanji DBMS-i obino su podravali neki od sledeih modela: Relacioni model. Zasnovan na matematikom pojmu relacije. I podaci i veze izmeu podataka prikazuju se tabelama. Mreni model. Baza je opisana usmerenim grafom. vorovi su tipovi zapisa, a lukovi definiu veze izmeu tipova zapisa. Hijerarhijski model. Specijalni sluaj mrenog. Baza je predstavljena jednim stablom ili skupom stabala. vorovi su tipovi zapisa, a hijerarhijski odnos nadreeni- podreeni izraava veze meu tipovima zapisa. Objektni model. Inspirisan je objektno-orijentisanim programskim jezicima. Baza je skup objekata koji se sastoje od svojih internih podataka i metoda (operacija) za rukovanje s tim podacima. Svaki objekat pripada nekoj klasi. Izmeu klasa se uspostavljaju veze nasleivanja, agregacije, odnosno meusobnog korienja operacija. Zavrni rad ore Zeevi
5 Hijerarhijski i mreni modeli bili su u uptrebi u 60-tim i 70-tim godinama 20. veka. Od 80-tih godina pa sve do danas preovladava relacioni model. Oekivani prelaz na objektni model za sada se nije desio, tako da kada danas priamo o bazama podataka ustvari priamo o relacionim bazama. 1.2. Znaaj zatite podataka u bazama
Bezbednosni propusti u raunarskom sistemu mogu uticati na poverljivost, integritet ili dostupnost sistema i podataka. Gubitak poverljivosti servera baze podataka podrazumeva neovlaen pristup podacima, gubitak integriteta podrazumeva neovlaenu izmenu ili brisanje podataka u bazi, a gubitak dostupnosti podrazumeva da servisi baze podataka nisu dostupni. U zavisnosti od namene sistema, gubitak jednog od ovih elemenata moe izazvati veu ili manju tetu. Korienje Interneta je postalo svakodnevnica za dananje drutvo. Internet kupovina je postala veoma popularna, a elektronsko poslovanje je praktino izmenilo poslovanje iz korena. Relacione baze podataka igraju veoma vanu ulogu u elektronskom poslovanju. Ogromne koliine podataka se prikupljaju, skladite i obrauju, to zahteva monu podrku baze podataka. Koliina podataka se stalno poveava, potreba za veom brzinom obrade i pretrage, tj. izvlaenja korisnih informacija se stalno poveava. Ako analiziramo jednu aktivnost kupovine na Internetu, a ovaj model se moe primeniti i na skoro svaku aktivnost u elektronskom poslovanju, a posebno obratimo panju na tok podataka, videemo da se mogui sigurnosni rizici mogu nai na jednom od dva mesta: 1. Sigurni prenos podataka. Kada korisnik poalje svoje poverljive podatke (broj kreditne kartice, PIN broj,...) kroz Internet pretraiva ili drugu vrstu programa, ti podaci bi trebalo da ostanu poverljivi du celog puta, tj. kroz Intenret mreu, aplikacioni server, pa sve do baze podataka gde e biti snimljeni. 2. Sigurno skladietenje i pristup podacima. Kada podaci dou do baze podataka, potrebno ih je zatititi na takav nain da podacima mogu da pristupe samo osobe koje su prole kroz proces provere identiteta i provere prava pristupa. Problem sigurnog prenosa podataka je dosta dobro obraen i podran od veine proizvoaa programa. Standardne zatite pri prenosu, kao to su SSL (Secure Socket Layer) i TLS (Transport Layer Security), su podrani u veini Internet pretraivaa i lako se ugrauju u nove programe. Meutim, kada podaci dou do baze, ne postoji efikasna zatita od neovlaenog pristupa. Iako mehanizam kontrole pristupa postoji skoro isto toliko koliko i same baze podataka, sigurnost baze se uzimala u obzir samo ako se za to pojavi potreba, recimo kada su podaci ve kompromitovani. Ovo je verovatno posledica vie faktora: Zavrni rad ore Zeevi
6 Performanse baze podataka. Koliko god da baza brzo obrauje podatke uvek postoji potreba da se obrada ubrza, tako da uvoenje procedura u baze koje bi usporile obradu, se esto ne razmatraju, ak su i nepoeljne. Pozicija baze podataka u raunarskoj mrei. Standardno, baze podataka nisu dostupne sa Interneta i pristup iz unutranje raunarske mree je ogranien, pa se smatra da je rizik od ugroavanja sigurnosti mali.
1.3. Zatita baza podataka
Osnovna sigurnosna komponenta u bazama podataka je upravljanje korisnicima. Potrebno je napraviti korisnika za svakoga ko eli da pristupi resursima baze podataka. Sam postupak kreiranja korisnika je trivijalan, ali upravljanje korisnicima, posebno u velikim sistemima sa puno promena, je teak posao. Administrator baze podataka (u nastavku teksta DBA 1 ) je osoba koja je zaduena za kreiranje, izmenu i brisanje korisnikih naloga. On kreira korinika, odreuje mu nain provere identiteta, recimo korienjem lozinke. U ovom procesu se javlja prvi sigurnosni problem koji emo pokazati na primeru 2 . DBA kreira korisnika Marko.
Sada tabela sa korisnicima sadri novi red.
Slika 1 Red u tabeli koji sadri loinku za korisnika
Korisnika lozinka je smetena u tabelu u ifrovanom obliku. DBA sada moe da preuzme Markov identitet, bez iijeg znanja, pratei sledee korake:
1 Skraenica u engleskom jeziku za Database Administrator, u prevodu administrator baze podataka 2 Svi primeri u ovomradu su izvedeni u MySQL bazi podataka CREATE USER MARKO I DENTI FI ED BY ' MARKOVALOZI NKA' ; Zavrni rad ore Zeevi
7 1. Izvri upit nad bazom kako bi dobavio ifrovan oblik Markove lozinke, *8DE0D5950A3F06F3A5D537720EC02D81C70B172E.
2. Izmeni Markovu ifru izvravajui sledei upit:
3. Pristupi sistemu kao korisnik Marko. Izvri izmene za koje Marko ima prava. 4. Vrati Markovu lozinku na staru vrednost, izvravajui sledei upit:
Kontrola pristupa predstavlja glavni sigurnosi mehanizam u bazama podataka. On se bazira na pojmu prava. Svaki korisnik moe pristupiti bilo kom objektu baze ako za to poseduje odgovarajua prava. DBA ima prava nad svim objektima u bazi, pa moe u bilo kom trenutku i bez bilo ijeg znanja da ta prava izmeni. Isto tako moe da uzme identitet drugog korisnika i da bez njegovog znanja napravi izmene u sistemu, za ta e snositi posledice korisnik iji je identitet ukraden. Osim korisnika koji su ljudi, esto se u bazama podataka mogu nai razni sistemski i aplikativni korsnici, ije naloge koriste aplikacije koje pristupaju bazi podataka. ifrovanje u bazama podataka je loe podrano. U ogromnoj veini sluajeva podaci se smetaju kao ist tekst. Kao posledica ovog stanja, sigurnost poverljivih podataka korisnika zavisi od operativnog sistema koje je podloga bazi podataka, a on esto moe da bude nedovoljno zatien. Pristup osetljivim podacima moe da kontrolie operativni sistem ili sistem za upravljanje bazom podataka. U oba sluaja, podaci su nedovoljno zatieni. Dva su naina da se ovaj problem prevazie. Prvi je da se podaci ne dre na serveru na kom se nalazi sistem baze podataka, a drugi da se ifruje ceo sadraj tvrdih diskova na kojima se nalaze podaci. I jedan i drugi nain dovode do javljanja novih problema. Ukoliko posmatramo administraciju baze podataka, administrator igra veoma vanu ulogu. On vodi rauna da baza ima odreene performanse, da baza ima rezervne kopije, reava probleme sa pristupom podacima. Ukoliko posmatramo sigurnost baze podataka i privatnost podataka u njoj, administrator je osoba koja ima uvid u svaije podatke, koji mogu biti i line prirode. U odreenim sluajevima (npr. zdravstveni kartoni u bazi podataka), vie nije pitanje poverenja koje se daje administratoru, ve je i stvar principa, pa i krenja zakona o poverljivosti podataka.
UPDATE USER SET PASSWORD=PASSWORD( ' DRUGALOZI NKA' ) WHERE USER = ' MARKO' ;
UPDATE USER SET PASSWORD=' *8DE0D5950A3F06F3A5D537720EC02D81C70B172E' WHERE USER = ' MARKO' ;
Zavrni rad ore Zeevi
8 2. Predhodna istraivanja
U ovom poglavlju emo razmotriti principe koje primenjuju veliki proizvoai baza podataka kao to su Oracle i Microsoft. Takoe, ukazaemo na slabosti koje mogu imati ovakvi sistemi. 2.1. Microsoft Najnoviji proizvod za zatitu baza podataka, firme Microsoft, je Transparent Data Encryption 3 (skraeno TDE). TDE se pojavio sa verzijom SQL servera 2008. Kao to je prikazano na slici, Microsoft prua est razliitih scenarija za zatitu podataka. Svaka od strelica prikazuje jedan od naina za ifrovanje:
Slika 2 ema za zatitu podataka u MS SQL Serveru
3 Transparent data encryption je engleski termin koji se ne moe bukvalno prevesti na srpski jezik. On oznaava zatitu podataka bez dodatnih akcija korisnika. Zavrni rad ore Zeevi
9 Korienje lozinke za direktno ifrovanje podataka. Korienje dva simetrina kljua za ifrovanje podataka, od kojih jedan slui za zatitu drugog, a drugi se titi lozinkom. Sledea dva naina su u sutini ista, a rade tako to se za zatitu podataka koristi simetrini algoritam, klju se titi korisnikim sertifikatom ili asimetrinim algoritmom za ifrovanje, a asmetrini klju, odnosno, sertifikat se titi sa lozinkom. TDE koristi simtrini algoritam za ifrovanje podataka, korisnike sertifikate za zatitu kljua za simetrino ifrovanje, Database Master Key (skraeno DMK) za zatitu sertifikata, i konano DMK se titi lozinkom. Poslenji nain je da se podaci ifruju simetrinim algoritmom, a da se za zatitu kljueva simetrinog algoritma koristi reenje koje nije u samom SQL serveru. Onaj nain ne podrava ifrovanje na nivou kolona. Prvih pet naina ifrovanja se svodi na korienje lozinke, tako da je sigurnost celog sistema loa. Poslednji nain se moe iskoristiti za graenje dobrog sistema zatite ali zahteva dodtne sisteme za upravljanje kljuevima. Dodatni problem je injenica da podaci koji su u upotrebi, nisu zatieni, ak se, ukoliko postoji manjak slobodne memorije, mogu i upisati na tvrdi disk u otvorenom tekstu.
Zavrni rad ore Zeevi
10 2.2. Oracle Oracle, ima proizvod za ifrovanje podataka u bazi koji se, takoe, zove Transparent Data Encryption 4 (skraeno TDE). Ovaj proizvod je uveden prvi put u verziji Oracle Database 10g release 2 (10.2).
Slika 3 Dijagramifrovanja u Oracle bazi Postoje dve opcije pri ukljuenju ifrovanja podataka. Podaci se mogu ifrovati na nivou kolone i na nivou tablespace 5 . Za razliku od Microsoft SQL Servera, Oracle nudi samo jednu opciju za proces iforvanja podataka. Podaci se ifruju simetrinim algoritmom, kljuevi za simetrian algoritam se tite sistemom javnih i tajnih kljueva, dok se ovi kljuevi tite drugim parom javnih i tajnih kljueva koji se nalaze van baze podataka. Ovo je bolji pristup zatiti podataka. Jedina zamerka je to su svi kljuevi za zatitu podataka na kraju zatieni jednim Master 6 kljuem. Ako je Master klju kompromitovan, svi podaci u bazi ostaju nezatieni.
4 Transparent data encryption je engleski termin koji se ne moe bukvalno prevesti na srpski jezik. On oznaava zatitu podataka bez dodatnih akcija korisnika. 5 Tablespace, je mesto gde Oracle baza smeta podatke. Tablespace se sastoji od datoteka, i nezavisan je od lokacije datoteke ili operativnog sistema na kombaza radi. 6 Master klju je est naziv za klju pomou koga se moe otkljuati sve to se titi. Zavrni rad ore Zeevi
11 3. Metodoloki koncept
3.1. Predmet istraivanja Predmet ovog istraivanja je metod zatite podataka u bazama pomou ifrovanja.
3.2. Cil j i zadaci istraivanja Cilj ovog istraivanja je pronalaenje mehanizma za ifrovanje podataka u bazama. Mehanizam za ifrovanje mora biti realizovan tako da: Koristi standardne algoritme za ifrovanje; Koristi alate koji ve postoje, kako bi se smanjila cena implementacije; Prui mogunost ifrovanja na nivou kolone; Prui mogunost ifrovanja na novou grupe korinika; Prui mehanizam za ukljuivanje i iskljuivanje ifrovanja u bilo kom trenutku; Ne trai izmene u postojeim sistemima za upravljanje bazama podataka; Rei probleme postojeih sistema za ifrovanje; Bude lako primenljiv u postojeim okruenjima.
3.3. Istraivake hipoteze
3.3.1. General na hipoteza
Osnovna hipoteza ovog rada je pretpostavka da je mogue napraviti mehanizam za zatitu podataka u sistemima za upravljanje bazama podataka, koji je nezavisan od proizvoaa. 3.3.2. Posebne hipoteze
Mehanizam mora biti, pre svega, primenljiv u realnom okruenju, i mora koristiti proverene standardne algoritme za ifrovanje. Da bi ovaj mehanizam bio primenljiv mora ispuniti dodatne uslove koji su postavljeni u zadacima istraivanja. Zavrni rad ore Zeevi
12 J o jedna od pretpostavki je da se ovakav mehanizam moe napraviti bez ulaganja u skupe programe i pakete programa koje nude svetski proizvoai, to e biti dokazano kroz detaljan opis jednog ovakvog mehanizma.
3.4. Metode istraivanja i tok istrivakog procesa
Sloenost predmeta istraivanja zahteva primenu vie naina istraivanja. Prikupljanje podataka e biti relizovano: Analizom literature; Sekundarnom analizom dobijenih rezultata ranijih istraivanja; Analizom postojeih mehanizama za zatitu podataka; Analizom problema od strane autora. Nakon prikupljanja potrebne koliine podataka, autor e metodama analize, dedukcije i apstrakcije pokuati da dokae da su postavljene hipoteze tane.
Zavrni rad ore Zeevi
13 4. Rezultati istraivanja 4.1. Model zatite podataka Osim ugraenih naina zatite podataka u bazama, postoje sluajevi kada je potrebna dodatna zatita. Model koji e biti predstavljen u ovom poglavlju reava sigurnosne probleme koji su navedeni u predhodnom tekstu. Kako bi predstavili ovaj model potrebno je definisati nekoliko termina. 4.1.1. Bezbedno radno okruenj e(SOE 7 ) Operacije koje ukljuuju rad sa tajnim podacima potrebno je izvravati u okruenju koje nee dovesti do toga da podaci budu ugroeni zbog samog okruenja, tj. koje nee imati sigurnosne propuste. Dobar primer za ovakvo okruenje je smart kartica. Korisniki privatni kljuevi su na kartici i nikada je ne naputaju u toku korienja. Ukoliko je potrebno izvriti neku operaciju nad podacima, operacija se izvrava na kartici a samo rezultat naputa karticu. Iako je baza podataka dosta sloeniji sistem od smart kartice, ipak se jezgro baze moe smatrati prilino bezbednim radnim okruenjem, a sigurnosni propusti nastaju slabim podeavanjem. 4.1.2. Sigurnosni dnevni k Svi podaci, ukljuujui i one o korisnikim nalozima i pravima korisnika (sistemski katalog), nalaze se u tabelama baze podataka. Kao i ostali podaci oni mogu biti promenjeni direktnim izvravanjem upita od strane administratora baze podataka. Sigurnosni dnevnik je slian sistemskom katalogu osim to izmene u sigurnosnom dnevniku moe da izvri samo proces baze podataka (za koji smo rekli da je bezbedno radno okruenje). To praktino znai da se korisniki nalozi mogu menjati samo pozivom sistemskih procedura. Sigurnosni dnevnik se moe kreirati na vie naina. Moe biti unutar baze podataka u vidu sistemskih procedura, ali moe biti kreiran i kao aplikacija koja se nalazi van baze podataka ali u bezbednom radnom okruenju. Manje sloen nain podrazumeva kreiranje dnevnika unutar baze podataka i njega emo upotrebiti u ovom radu.
7 Secure Operating environment(SOE) Zavrni rad ore Zeevi
14 4.1.3. Skraeni nazivi funkciij a
Kako bi u kasnijem tekstu izbegli pojanjavanje osnovnih funkcija ifrovanja, i time se nepotrebno udaljili od sutine problema, sada emo ih definisati: Funkcija E predstavlja operaciju ifrovanja. Funkcija D predstavlja operaciju deifrovanja. Par funkcija (D,E) se moe odnositi na simetrine algoritme za ifrovanje, kao to su 3DES i AES, kao i na asimtrine algoritme za ifrovanje, kao to je RSA. Otvoreni tekst emo obeleavati sa slovom m, ifrovani tekst sa slovom c, a kljueve za ifrovanje sa slovom K. 4.2. Kontrola korisnika
Da bi pristupio podacima, korisnik mora imati nalog u bazi. Administratora baze je zaduen za kontrolu korisnikih naloga. On kreira i brie korisnike, odreuje nain njihove provere identiteta i prava pristupa resursima baze. Postoji vie naina provere identiteta, putem lozinke, putem PKI 8 infrastrukture, Kerberos protokola, itd. Sve metode se svode na tajni podatak koji je poznat samo korisniku. Potrebno je da jedino korisnik ima pravo izmene svog naloga. Na primer, potrebno je da jedino korisnik moe da promeni svoju lozinku, drugi korisnici (ili administrator) bi to mogli da urade samo ako im je dodeljeno odreeno pravo. U dananjim sistemima za upravljanje bazom podataka, administrator moe promeniti lozinku korisniku na njegov zahtev, ali i kada korisnik to nije zahtevao. Administrator, u stvari, moe da promeni lozinku korisniku bez iijeg znanja, to je opasan sigurnosni propust. 4.3. ifrovanje i upravljanje kljuevima
Najvei problem pri korienju ifrovanja je upravljanje kljuevima. Sami algoritmi su dovoljno dobri. Kada priamo o ifrovanju u bazama podataka, dve teme je potrebno obraditi kako bi se ifrovanje ugradilo u bazu podataka: 1. Potrebno je da korisnik ima mogunost da odredi koji e podaci biti ifrovani pre nego to te podatke snimi u bazu. 2. Potrebno je da korisnik ima mogunost (posredno ili neposredno) da odredi klju kojim e se podaci ifrovati.
8 Public Key Infrastructure provera identiteta zasnovana na sertifikatima Zavrni rad ore Zeevi
15 Posmatrajui drugu stavku, ceo problem ifrovanja u bazi se svodi na upravljanje kljuevima. Da bi reili problem iz take jedan potebno je kreirati proceduru za kreiranje tabele koja e omoguiti da korisnik naznai kolone koje eli da ifruje:
Izvravajui ovu proceduru korisnik je naznaio da kolona broj_kartice treba da bude ifrovana (kljuna re ENCRYPT), i server baze podataka e ifrovati podatke pre nego to ih upie u bazu. Da bi server ifrovao podatke potrebno je da zna kojim kljuem e podatke ifrovati a kasnije i deifrovati. Polje UPDATE koje se postavlja na vrednost 1 slui za kontrolu prava nad ifrovanjem kolone. Da bi imali evidenciju o kolonama koje su ifrovane, potrebno je da kreiramo novi sigurnosni katalog. Ovaj katalog bi sadrao polja id_korisnika, ime_tabele, ime_kolone, izmena, izmenu_izvrsio. Na primer: ( mar ko, kupac, br oj _kar t i ce, 1, mar ko)
Pretpostavimo da je korisnik sa korisnikim (i linim) imenom Marko izvrio proceduru kreiranja tabele. Samo postojanje reda u sigurnosnom katalogu znai da e kolona u tabeli biti ifrovana. Polje izmena e oznaiti prava nad ovim zapisom i moe imati vrednosti 0, 1 ili 2. Vrednost 0 znai da niko ne moe da menja ovaj zapis pa ni kreator zapisa, 1 znai da zapis moe da menja samo kreator zapisa, tj. vlasnik tabele koja se nalazi u zapisu i 2 znai da zapis moe da menja bilo ko, ko ima prava nad tabelom koja se nalazi u zapisu. U primeru koji smo naveli, samo Marko moe da menja zapis koji je kreirao. Pre nego to bi neko pokuao da promeni tabelu, baza podataka bi proverila sigurnosni dnevnik. Ukoliko ne postoje prava za promenu, izmena bi bila odbijena i pokuaj bi bio upisan u dnevnik (log) baze podatka. Kako bi ovaj sistem radio potrebno je kreirati i proceduru koja bi bila u mogunosti da iskljui ifrovanje nad odreenom kolonom tabele:
Ovde je potrebno razmotriti jo jedan sluaj. Sluaj kada se promeni kolona u tabeli, bilo da je bila ifrovana pa je ifrovanje ukinuto, bilo da nije bila ifrovana pa je ifrovanje postavljeno. Dva su mogua reenja, podaci koji su u tabeli ostaju neporomenjeni (ifrovani ili neifrovani) i podaci u tabeli se menjaju. U ovom modelu emo primeniti sluaj kada se stari podaci menjaju, jer to smanjuje kompleksnost u voenju sigurnosnog dnevnika.
CREATE TABLE KUPAC ( I D I NTEGER PRI MARY KEY I ME VARCHAR( 30) , BROJ _KARTI CE VARCHAR( 16) ENCRYPT UPDATE 1 ) ; ALTER TABLE KUPAC MODI FY BROJ _KARTI CE DROP ENCRYPT; Zavrni rad ore Zeevi
16 4.3.1. ifrovanje sa sistemom javnih kljueva
Da bi uspeno koristili model ifrovanja koristei sistem javnih kljueva moramo pretpostaviti da ve postoji server koji prua uslugu direktorijuma 9 (na primer LDAP 10
server) kojeg sistem za upravljanje bazom podataka moe kontaktirati po potrebi. U ovom sluaju baza podataka bi kontaktirala server direktorijuma kako bi pribavila sertifikat 11 za odreenog korisnika. Zajedno sa javnim kljuem korisnika u direktorijumu se moe nalaziti i privatni klju korisnika koji je ifrovan lozinkom korinika, ali je bolja praksa da privatni klju korisnika bude na smart kartici i uz korisnika.
APLIKACIONI SERVER KLIJ ENT SERVER DIREKTORIJ UMA Server baze podataka Sigurna veza(SSL,TLS)
Slika 4 Model zatite podataka u bazi - potrebni serveri
9 Prevod od poznatijeg termina na engleskomjeziku - Directory service. Kao to mu samo ime kae prua uslugu centralnog direktorijuma (imenika) sa podacima o korisnicima. Meu podacima se moe nai i korisniki sertifikat. 10 LDAP je skraenica od Lightweight Directory Access Protocol. LDAP je protokol koji koristimo kako bi vrili upite i menjali podatke na serveru za usluge direktorijuma. 11 Sertifikat je uobiajen naziv sa sertifikat o posedovanju i validnosti javnog kljua, kojim telo kojem se veruje, a nezavisno je od uesnika u komunikaciji, potvruje ispravnost javnog kljua. Zavrni rad ore Zeevi
17 Na primer, korisnik Marko poseduje sertifikat CERT A u serveru za direktorijum. Taj sertifikat potvruje verodostojnost javnog kljua PK A , i u isto vreme PK A ima odgovarajui privatni klju SK A . U serveru direktorijuma bi bio upisan ovakav skup podataka: (marko, CERT A ) Kada Marko eli da izvri sledei upit:
Server baze podataka e izvriti upit nad serverom za direktorijum i pribaviti sertifikat CERT A a samim tim i javni klju PK A . PK A e biti upotrebljen kako bi se zatitio radni klju K i time obazbedilo da samo korisnik koji ima privatni klju SK A moe da deifruje radni klju K i samim tim da jedini proita podatke koji su zatieni kljuem K. Radni klju K generie baza podataka i moe se uvati u bazi u ifrovanom obliku ili se moe snimiti u server direktorijuma. Zapis bi izgledao ovako: (marko, kupac, broj_kartice, E(PK A , K)) Kada Marko eli da ifruje novu kolonu, moemo primeniti jedan od dva sluaja. Prvi sluaj je da baza koristi isti klju K koji je korien za ifrovanje prve kolone ili da generie novi klju K 1 , njega ifruje Markovim javnim kljuem i takvog ga snimi u server direktorijuma. Kada Marko eli da pristupi podacima koji su ifrovani potrebno je da izvri sledeu proceduru:
Drugim reima, Marko mora da eksplicitno navede svoj privatni klju kako bi pristupio podacima. Sistem za upravljanje bazom podataka e prvo dohvatiti ifrovani radni klju sa servera za direktorijum. Zatim e iskoristiti privatni klju koji je Marko naveo u upitu kao bi deifrovao radni klju K, onda e iskoristiti radni klju K kako bi deifrovao podatke i vratio Marku rezultat. Slina procedura se primenjuje i kada Marko eli da upie podatak u bazu:
I NSERT I NTO KUPAC VALUES (100,PERA PERI,1112221112) ; SELECT BROJ _KARTI CE FROM KUPAC WHERE I D_KUPCA = 100 PRI VATE_KEY SK A ; I NSERT I NTO KUPAC VALUES ( 200, ZORAN J OVANOVI C, 123456789) PRI VATE_KEY SK A ; Zavrni rad ore Zeevi
18 4.3.2. ifrovanj e na ni vou grupe kori sni ka
Podaci u bazi podataka esto, ako ne i uvek, treba da budu dostupni veem broju korisnika. Do sada smo u radu bili skoncentrisani na zatitu podataka za pojedinane korisnike a u nastavku emo razmotriti model gde grupa korisnika treba da pristupi istim ifrovanim podacima. Recimo, da Marko eli da kreira tabelu i u njoj zatiti odreenu kolonu. Sada je potrebno da i Ana pristupi i proita te podatke. Najlaki nain bi bio da Marko svoju lozinku, ili privatni klju da Ani na korienje, ali se to kosi sa osnovnom sigurnosnom politikom koja zahteva da samo korisnik zna svoju lozinku. Da bi omoguili ifrovanje, i deifrovanje na nivou grupe, moramo generalizovati upotrebu javnih kljueva. Sada, kada Marko kreira tabelu, mora prvo da navede listu korinika kojima e omoguiti da ifruju i deifruju podatke. To e uraditi kroz novu proceduru koja bi izgleda ovako:
USER_LIST je lista korisnika koji mogu da pristupe ifrovanim podacima. Potrebno je da proirimo sigurnosni katalog, tako da on sada sadri informacije o grupi korinika. Novi sigurnosni katalog bi sada sadrao ista polja, samo to bi za svakog korisnika postojao po jedan red. Sigurnosni katalog, za predhodni primer, bi izgledao ovako: (marko, kupac, broj_kartice,1,marko,1) (marko, kupac, broj_kartice,1,ana,1) (marko, kupac, broj_kartice,1,mika,1)
Sada, kada Marko kreira ovu tabelu, radni klju K e biti ifrovan tri puta i to sa Markovim, Aninim i Mikinim javnim kljuevima. U server direktorijuma e biti upisani sledei podaci:
CREATE TABLE KUPAC ( I D I NTEGER PRI MARY KEY I ME VARCHAR( 30) , BROJ _KARTI CE VARCHAR( 16) ENCRYPT USER_LI ST ANA, MI KA UPDATE 1 ) ; Zavrni rad ore Zeevi
19 U delu za definisanje korisnika : (marko, CERT A ) (ana, CERT B ) (mika, CERT C )
U delu za uvanje radnih kljueva: (marko, kupac, broj_kartice, E(PK A , K)) (ana, kupac, broj_kartice, E(PK B , K)) (mika, kupac, broj_kartice, E(PK C , K))
Kada Ana eli da pristupi zatienim podacima izvrie sledei upit:
Baza podataka e proveriti da li se Ana nalazi u sigurnosnom katalogu za tabelu kupac i kolonu broj_kartice, ako jeste baza e izvriti upit nad serverom direktorijuma i dobaviti radni klju K koji je ifrovan sa Aninim javnim kljuem E(PK B ,K). Iskoristie Anin privatni klju koji je ona navela u upitu SK B i deifrovati radni klju K. Sada e radni klju biti upotrebljen kako bi se deifrovali podaci. Podaci e onda biti vraeni Ani. Uestalo itanje sa servera direktorijuma bi verovatno prilino usporilo izvravanje upita nad bazom. Dobra ideja je da se zatieni radni kljuevi dre u privremenoj memoriji (cache memoriji) radi poboljanja performansi.
SELECT BROJ _KARTI CE FROM KUPAC WHERE I D_KUPCA = 100 PRI VATE_KEY SK B ; Zavrni rad ore Zeevi
20 4.4. ifrovanje podataka u MySQL bazi
U ovom poglavlju emo prikazati kako se opisani model primenjuje u realnom okruenju. Svi alati koji su korieni su otvorenog koda i besplatni i ine sloeni sistem kojim se titi baza podataka. Dok budemo detaljno opisivali postupak primene teorijskog modela, koristiemo i praktian primer kako bi rad sistema bio jasniji. Baza podataka koju emo zatititi je MySQL. Osnovni deo mehanizma koji e biti opisan je aplikacija MySQL-Proxy. MySQL-Proxy je pozicioniran izmeu klijenta i baze, tako da presree upite i po potrebi ih menja. Sve promene, u upitima ili u rezultatima upita, se vre preko programa koji je napisan u programskom jeziku Lua.
Slika 5 Uproena ema sistema za zatitu baze podataka 4.4.1. Dodatne komponente Kako bi sistem uspeno podrao opisani teorijski model, u opisano reenje moramo uvesti jo i server direktorijuma, CA telo i sigurnosni katalog.
Slika 6 Model sistema za zatitu podataka u bazama 4.4.2. Sigurnosni katalog Sigurnosni katalog se sastoji iz dve tabele koje se nalaze na posebnoj bazi podataka i ija je izmena mogua samo iz programa Proxy aplikacije.
Klijentska aplikacija Proxy Lua program Baza Proxy Lua program CA telo OpenLDAP Klijentska aplikacija Baza Sigurnosni Katalog Zavrni rad ore Zeevi
21
Slika 7 Tabele u Sigurnosnomkatalogu Tabela ENC_COLUMNS sadri imena kolona koje su ifrovane, kao i imena tabela kojima pripadaju, informaciju o korisniku koji je kreirao tabelu, pravima nad kolonom i informaciju o poslednjoj promeni. Tabela ima sloeni primarmi klju koji se sastoji od kolona table_name i column_name. Sva polja u ovoj tabeli su tekstualna.
Slika 8 Struktura tabele ENC_COLUMNS Tabela ENC_KEYS sadri sesijske kljueve koji su ifrovani sa javnim kljuevima korisnika koji imaju pravo ifrovanjai i deifrovanja nad odreenim tabelama. Tabela ima sloeni primarmi klju koji se sastoji od kolona table_name, column_name i username. Sva polja u ovoj tabeli su tekstualna.
Slika 9 Struktura tabele ENC_KEYS
Zavrni rad ore Zeevi
22 4.4.3. Sertifikaci ono telo Uloga sertifakionog tela u ovom sistemu je jasna i vana. Sertifikaciono telo izdaje sertifikate i garantuje za njihov sadraj. Za sertifikaciono telo koristimo programski paket OpenSSL i to njegovu komponentu CA. OpenSSL je programski paket za kriptografiju, otvorenog koda, koji podrava sve poznate algoritme za simetrino i asimetrino ifrovanje, heing 12 algoritme, rad sa sertifikatima, itd. Radi lakeg rada sa sertifikatima, koristiemo i dodatni program TinyCA. TinyCA je grafiki alat za konfiguraciju CA komponente OpenSSL-a.
Slika 10 Tiny CA grafiko okruenje za CA komponentu OpenSSL-a
12 Haing je re engleskog porekla koja nema pravi prevod na srpski jezik. Radi se o jednosmernoj funkcji koja se koristi za zatitu integriteta podataka. Za svaki ulazni parameter, bilo koje veliine, funkcija daje jedinstveni izlaz fiksne duine. Zavrni rad ore Zeevi
23 4.4.4. Server direktorij uma
Server direktorijuma je OpenLDAP. To je program koji razvija neprofitna firma The OpenLDAP Foundation jo 1998. godine. Njegova uloga u ovom reenju je da korsniki sertifikati, koji su kreirani od strane sertifikacionog tela, budu dostupni u svakom trenutku.
Slika 11 GQ, grafiko okruenje za pristup OpenLDAP serveru
Zavrni rad ore Zeevi
24 4.4.5. CREATE TABLE upi t Pri kreiranju tabele, potrebno je da korisnik moe da navede kolone koje e biti ifrovane kao i listu korisnika koji e imati pravo da itaju i upisuju ifrovane podatke. Ovi podaci se kasnije mogu izmeniti Alter table upitom. Kada klijent poalje upit za kreiranje tabele, Proxy server presree upit. Poto upit ne odgovara standardnoj SQL sintaksi (ima nove kljune rei), proxy e iz upita izvui sledee informacije: koje kolone treba da budu ifrovane; koji korisnici mogu da itaju ili menjaju kolone. Na sledeem primeru emo bolje upoznati proces:
Iz ovog upita Proxy e pronai kljune rei ENCRYPT i UPDATE, i pomou njih zakljuiti da je potrebno ifrovati kolone PIN i PUK, i da su prava 1, odnosno 2. Na osnovu ovih informacija Proxy e izvriti sledei niz operacija: Upit e izmeniti tako da on odgovara SQL sintaksi; CREATE TABLE SI M( I D I NT, I ME VARCHAR( 30) , BROJ VARCHAR( 30) , STANJ E I NT, PI N VARCHAR( 30) , PUK VARCHAR( 30) , ) ;
Za svaku kolonu koja je ifrovana generisae klju za simetrino ifrovanje (sesijski klju);
Za svakog korisnika kome je pravo dodeljeno e dohvatiti sertifikat sa njegovim javnim kljuem;
CREATE TABLE SI M( I D I NT, I ME VARCHAR( 30) , BROJ VARCHAR( 30) , STANJ E I NT, PI N VARCHAR( 30) ENCRYPT USER_LI ST [ MMI KI C PPETROVI C] UPDATE 1, PUK VARCHAR( 30) ENCRYPT UPDATE 2 ) ; Zavrni rad ore Zeevi
25 Sa svakim javnim kjuem e ifrovati sesijski klju i takvog ga smestiti u sigurnosni katalog;
+ Slika 12 ENC_KEYS tabela u sigurnosomkatalogu
Svaku kolonu koja treba da bude ifrovana e oznaiti u sigurnosnom katalogu;
Slika 13 ENC_COLUMNS tabela u sigurnosnomkatalogu Izvrie upit kreiranja tabele u bazi podataka;
Slika 14 Tabela SIM u bazi podataka Nakon izvravanja ove procedure, u bazi podataka e postojati eljena tabela, a u sigurnosnom katalogu e postojati zapisi potRebni za njeno ifrovanje.
Zavrni rad ore Zeevi
26 4.4.6. INSERT INTO upi t
Pri ubacivanju podataka u tabelu, potrebno je da Proxy konsultuje Sigurnosni katalog i da utvrdi koje kolone treba da ifruje i da bazi podataka prosledi izmenjen originalni upit:
Na osnovu dobijenih informacija iz upita Proxy izvrava sledee korake: Konsultuje Sigurnosni katalog i proverava da li korisnik ima pravo da ifruje podatke u koloni, ukoliko nema, akcija se prekida; Konsultuje Sigurnosni katalog i saznaje koje kolone treba ifrovati; Uzima, za kolone koje su ifrovane, iz Sigurnosnog kataloga, kljueve za simetrino ifrovanje; Upit modifikuje tako to umesto imena kolone dodaje funkciju aes_encrypt i kao argumente prosleuje ime kolone i klju za simetrino ifrovanje;
Ovako izmenjen upit se onda prosleuje bazi na izvravanje. Nakon izvravanja tabela u bazi izgleda ovako:
Slika 16 Zatieni podaci u bazi
I NSERT I NTO SI M VALUES( 1, " DJ ORDJ E ZECEVI C", "064- 123- 1234" , 10000, " 2222", "113456789" ) KEY " SK"; I NSERT I NTO KORI SNI K VALUES ( 1, " DJ ORDJ E ZECEVI C" , " 111- 222", AES_ENCRYPT ( " 1111", ' J SUMKMTNJ I ZQ17O/ KA2LBW==' ) ) Zavrni rad ore Zeevi
27 4.4.7. SELECT upit
Procedura izvravanja SELECT upita je slina izvravanju INSERT INTO upita. Proxy prvo pronalazi kolone koje su ifrovane pa ih deifruje sa kljuevima iz Sigurnosnog kataloga. SELECT upit moemo posmatrati iz vie uglova i u svakom pronai razliite sluajeve koje je potrebno obraditi. Ako SELECT upit posmatramo iz ugla prava 13 korisnika nad tabelom, korisniku koji nema prava da ifruje e biti dozvoljeno da podatke proita, ali e podatci koje dobije biti u ifrovanom obliku. Ako posmatramo SELECT upit iz ugla izbora kolona, moemo pronai dva sluaja. Sluaj kada korisnik navodi kolone koje mu trebaju i sluaj kada korisnik navodi specijalni znak * 14 . SELECT I ME, BROJ , STANJ E, PI N, PUK FROM SI M KEY " SK";
Procedura za koju izvrava Proxy sastoji se iz sledeih koraka: Proxy presree upit i ispituje kojem od dva tipa pripada; Ukoliko je upit sa specijalnim znakom, Proxy e znak zameniti sa listom kolona; Iz liste kolona pronalazi one koje su ifrovane; Iz Sigurnosnog kataloga dohvata kljueve za simetrino ifrovanje koji su ifrovani sa korisnikim javnim kljuem; Koristi korisniki privatni klju, koji je naveden u upitu, kako bi deifrovao kljueve za simetrino ifrovanje; Upit menja tako da imena kolona koje su ifrovane, zemenjuje sa funkcijom za deifrovanje, koja za argumente ima ime kolone i klju sa kojim e rezultat biti deifrovan; Ovako izmenjen upit se alje bazi na izvravanje.
13 U ovom sluaju mislimo na prava za ifrovanje podataka, a ne na korisnika prava da izvri SELECT upit. 14 Znak * u standardnomSQL jeziku zamenjuje imena svih kolona u tabli. SELECT * FROM SI M KEY " SK"; Zavrni rad ore Zeevi
28 Na primerima emo pokazati kako Proxy menja upite dok oni putuju od korisnika do baze podataka. Pretpostavimo da korisnik zadaje upit:
On e biti analiziran, izmenjen i takav poslat bazi na izvravanje. Ovako izgleda izmenjen upit:
Drugi primer pokazuje sluaj kada korisnik eli samo odreene kolone:
Nakon analiziranja i izmene upit se prosleuje bazi u sledeem obliku:
4.4.8. ALTER TABLE upit
Da bi se promenila osobina kolone iz ifrovane u neifrovanu ili obrunuto, koristi se specijalni oblik upita ALTER TABLE. ALTER TABLE upit se mora zadati u obliku:
Ako se navodi kljuna re DROP, onda se ifrovanje iskljuuje sa kolone, a ukoliko se ne navodi, ifrovanje se ukljuuje za kolonu. Procedura ukljuivanja i iskljuivanja ifrovanja je slina i sastoji se iz sledeih koraka: Proxy proverava da li korisnik ima pravo da izmeni osobinu ifrovanja za kolonu iz upita. Ukoliko nema, akcija se prekida; Proxy presree upit i analizira koja kolona i iz koje tabele e biti izmenjena; SELECT * FROM SI M KEY " SK"; SELECT I D, I ME, BROJ , STANJ E, AES_DECRYPT( PI N, ' 8TVDRNDYZPR6PJ I AQRH5I A==' ) AS PI N, AES_DECRYPT( PUK, ' ESROJ XC1H91PUALGMR7MLW==' ) AS PUK FROM SI M SELECT I ME, BROJ , STANJ E, PI N, PUK FROM SI M KEY " SK"; SELECT I ME, BROJ , STANJ E, AES_DECRYPT( PI N, ' 8TVDRNDYZPR6PJ I AQRH5I A==' ) AS PI N, AES_DECRYPT( PUK, ' ESROJ XC1H91PUALGMR7MLW==' ) AS PUK FROM SI M ALTER TABLE IME_TABELE SET IME_KOLONE [ DROP] ENCRYPT KEY SK; Zavrni rad ore Zeevi
29 Proxy kreira privremenu tabelu i u nju kopira tabelu iz koje se menja kolona; Brie sve redove iz tabele koja se menja; Ukoliko se ukljuuje ifrovanje za kolonu, u Sigurnosni katalog, Proxy upisuje potrebne podatke (izvrava procedure kao kod kreiranja tabele sa ifrovanim kolonama). Ukoliko se iskljuuje ifrovanje, iz Sigurnosnog kataloga se briu redovi vezani za ovu kolonu; Kopira privremenu tabelu u originalnu tabelu, ali tako da se kolona koja predmet upita se ifruje ili deifruje prilikom kopiranja; Privremena tabela se nakon toga brie. Evo primera gde se sa kolone PUK iz tabele SIM uklanja iforvanje:
Tabela je, pre izvravanja upita, izgledala ovako:
Slika 16 Sadraj tabele pre izvravanja ALTER TABLE upita Nakon izvravanja upita izgleda ovako:
Slika 17 Sadraj tabele nakon izvravanja ALTER TABLE upita
ALTER TABLE SI M SET PUK DROP ENCRYPT KEY " SK"; Zavrni rad ore Zeevi
30 4.4.9. DELETE FROM upit
DELETE FROM upit je jednak standardnom delete upitu, nema specijanih rei i bez izmena se izvrava na serveru baze podataka.
4.4.10. DROP TABLE upit
Brisanje tabele je najjednostavniji upit u ovom praktinom primeru. Pri brisanju tabele proxy e iz upita izvui ime tabele koja se brie, a onda e uraditi sledee korake: Brisanje zapisa iz tabela Sigurnosnog kataloga; Izvravanje samo upita nad bazom, tj. brisanje same tabele u bazi.
4.5. Kli jentska aplikacija
Iako se ovaj rad ne bavi klijentskim delom sistema za zatitu, naveemo preduslove koje treba da ispunjava klijentska aplikacija. Aplikacija mora biti odgovorna za uspostavljanje sigurne veze sa bazom podataka i za siguran pristup korisnikim kljuevima. Za sigurnu vezu se mogu koristiti neki od standardnih naina kao to su IPSEC ili SSL, dok se za uvanje i pristup kljuevima mogu koristiti Smart kartice ili USB Token ureaji.
DELETE FROM SI M ; DROP TABLE SI M ; Zavrni rad ore Zeevi
31 5. Zakljuak i primenljivost rezultata
U ovom radu opisali smo znaaj zatite podataka koji su smeteni u sistemima za upravljanje bazma podataka. Opisali smo trenutne sigurnosne mehanizme, kao i njihove slabe take koje dovode do sigurnosnih rupa. Navedeni su i naini na koje se slabosti baza podataka mogu zloupotrebiti. Takoe istaknuto je koliko se malo vodi rauna o zatiti i koje su opasnosti takve politike. Kako bi prevazili ove propuste, predstavljen je model zatite koji se moe, uz malo napora, primeniti u veini popularnih sistema za upravljanje bazama podataka. Model je zasnovan na primeni ifrovanja, kao proverene i standardne mere zatite podataka. Vodili smo rauna o injenici da su baze podataka ve dugo u upotrebi i da model mora biti takav da se moe primeniti bez veih izmena u postojeim sistemima. Kako bi to postigli, model se oslanja sa standardne servise kao to je server direktorijuma koji se moe lako povezati sa postojeim sistemima za upravljanje bazama podataka. U treem delu rada, opisana je i jedna praktina primena modela koji je opisan u radu. Model je izveden koristei alate otvorenog koda i usmeren je ka zatiti MySQL baze podataka.
Zavrni rad ore Zeevi
32 5.1. Primenljivost rezultata
Primenljivost rezultata opisanog sistema emo proveriti kroz dva testna scenarija, koji u sebi sadre sve operacije koje su definisane. Scenario 1 Scenario jedan se sastoji iz niza sledeih upita:
DROP TABLE KORI SNI K;
CREATE TABLE KORI SNI K ( I D I NT, I ME VARCHAR( 30) , BROJ _KARTI CE VARCHAR( 30) , PI N VARCHAR( 30) ENCRYPT UPDATE 1 ) ;
I NSERT I NTO KORI SNI K VALUES ( 1, " DJ ORDJ E ZECEVI C", " 111- 222" , " 1111") KEY SK;
I NSERT I NTO KORI SNI K VALUES ( 2, " PETAR PETROVI C" , "111- 222", "1234" ) KEY SK;
I NSERT I NTO KORI SNI K VALUES ( 3, " MI KA MI KI C" , "111- 222", "2222" ) KEY SK;
SELECT * FROM KORI SNI K KEY " SK";
SELECT I ME, BROJ _KARTI CE, PI N FROM KORI SNI K KEY "SK" ;
ALTER TABLE KORI SNI K SET BROJ _KARTI CE ENCRYPT KEY "SK" ;
SELECT * FROM KORI SNI K KEY " SK";
DELETE FROM KORI SNI K;
DROP TABLE KORI SNI K; Zavrni rad ore Zeevi
33 Rezultati scenarija 1:
Slika 18 Rezultati scenarija 1 Zavrni rad ore Zeevi
34
Slika 19 Rezultati scenarija 1
Slika 20 Rezultati scenarija 1 Zavrni rad ore Zeevi
35 Scenario 2 Scenario dva se sastoji iz niza sledeih upita:
DROP TABLE SI M;
CREATE TABLE SI M( I D I NT, I ME VARCHAR( 30) , BROJ VARCHAR( 30) , STANJ E I NT, PI N VARCHAR( 30) ENCRYPT USER_LI ST [ MMI KI C PPETROVI C] UPDATE 1, PUK VARCHAR( 30) ENCRYPT UPDATE 2 ) ;
I NSERT I NTO SI M VALUES( 1, "DJ ORDJ E ZECEVI C" , " 064- 123- 1234", 10000, "2222" , " 113456789" ) KEY SK;
I NSERT I NTO SI M VALUES( 2, "PETAR PETROVI C", "064- 123- 1234" , 10000, " 2222", "122456789") KEY SK;
I NSERT I NTO SI M VALUES( 3, "MI KA MI KI C" , " 064- 123- 1234" , 10000, " 2222", "123456799") KEY SK;
SELECT * FROM SI M KEY "SK" ;
SELECT I ME, BROJ , STANJ E, PI N, PUK FROM SI M KEY "SK" ;
ALTER TABLE SI M SET PUK DROP ENCRYPT KEY " SK";
SELECT * FROM SI M;
DELETE FROM SI M;
DROP TABLE SI M; Zavrni rad ore Zeevi
36 Rezultati scenarija 2:
Slika 21 Rezultati scenarija 2
Zavrni rad ore Zeevi
37
Slika 22 Rezultati scenarija 2
Slika 23 - Rezultati scenarija 2
Zavrni rad ore Zeevi
38 6. Literatura
[1] Pleskonji Dragan, Maek Nemanja, orevi Borislav, Cari Marko: Sigurnost u raunarskim mreama, Mikroknjiga, 2007.
[4] Robert Manger: Baze podataka, Sveuilite u Zagrebu, Prirodoslovno matematiki fakultet Matematiki odjel, 2008.
[5] Securing Data at Rest: Developing a Database Encryption Strategy, http://www.rsa.com/products/bsafe/whitepapers/DDES_WP_0702.pdf, poseeno 30.08.2010.
[6] Database Encryption in SQL Server 2008 Enterprise Edition, http://msdn.microsoft.com/en- us/library/cc278098%28v=sql.100%29.aspx#_Toc189384672, poseeno 30.08.2010.
[13] Publishing digital certificates with LDAP, http://tldp.org/HOWTO/archived/LDAP- Implementation-HOWTO/certificates.html, poseeno 30.08.2010. Zavrni rad ore Zeevi
39 7. Dodaci
7.1. Korieni alati i software
[1] Mysql baza podataka verzije 5.0.77. Web adresa na kojoj se moe pronai vie informacija je http://www.mysql.org. [2] OpenLDAP server direktorijuma verzije 2.3.43. Web adresa na kojoj se moe pronai vie informacija je http://www.openldap.org. [3] CA server. OpenSSL PKI server komponenta. Web adresa na kojoj se moe pronai vie informacija je http://www.openssl.org. [4] Apache2 - Server aplikacija (web server). Web adresa na kojoj se moe pronai vie informacija je http://www.apache.org. [5] OpenSSL verzije 0.9.8e. Komponente za rad sa simetrinim i asimetrinim algoritmima za ifrovanje. Web adresa na kojoj se moe pronai vie informacija je http://www.openssl.org. [6] Lua 5.1.4. Programski jezik za izmenu upita. Web adresa na kojoj se moe pronai vee informacija je http://www.lua.org. [7] Mysql-proxy 0.8.1. Aplikacija koja stoji izmeu baze podataka i korisnika. Web adresa na kojoj se moe pronai vie informacija je http://dev.mysql.com/downloads/mysql-proxy. [8] CentOS 5.5. Operativni sistem na kom je instaliran ceo rad. Web adresa na kojoj se moe pronai vie informacija je http://www.centos.org 7.2. Izvorni kod programa koji koristi Proxy baze podataka
Izvorni kod je pisan u programskom jezuku Lua. r equi r e ( "l uasql . mysql ") - - FUNCTI ONS - - Funki ci j a za l oggi ng f unct i on l og( msg) l ocal l og_f i l e = ' / var / l og/ mysql - pr oxy- app. l og' l ocal f h = i o. open( l og_f i l e, " a+") f h: wr i t e( st r i ng. f or mat ( "%s %6d - - %s \ n", os. dat e( ' %Y- %m- %d %H: %M: %S' ) , pr oxy. connect i on. ser ver . t hr ead_i d, t ost r i ng( msg) ) ) f h: f l ush( ) end
- - RSAencr ypt vr aca put anj u do dat ot eke sa si f r ovani mkj ucem - - t ext j e kl j uc koj i j e pot r ebno si f r ovat i f unct i on RSAencr ypt ( t ext , key) l ocal f = i o. popen( " echo ' ". . t ext . . "' | openssl r saut l - encr ypt - i nkey " . . key . . " - cer t i n | openssl enc - A - base64") r et ur n f : r ead( ) end Zavrni rad ore Zeevi
40
- - RSAdecr ypt vr aca kl j uc K za si met r i cno si f r ovanj e - - t ext j e i me dat ot eke u koj oj se nal azi si f r ovani kl j uc f unct i on RSAdecr ypt ( t ext , key) l ocal f = i o. popen( " echo ' ". . t ext . . "' | openssl enc - A - base64 - d | openssl r saut l - decr ypt - i nkey " . . key ) r et ur n f : r ead( ) end
- - dohvat a kor i sni cki ser t i f i kat koj i sadr zi j avni kl j uc. Funkci j a vr aca i me f i l e- a u komse nal azi ser t i f i kat f unct i on get LDAPKey( user ) i f ( user ==ni l ) t hen l og( " Pr osl edj en user ni l u f unkci j u get l dapkey") os. exi t ( 1) end l og( " Ul azi u f unkci j u za dohvat anj e ser t i f i kat a za kor i sni ka " . . user ) l ocal i = 0 l ocal f i l ename = " / usr / l ocal / mast er r ad/ cer t / " . . user . . " / cer t i f i cat e. pem" l og( " Fi l ename: " . . f i l ename) - - i o. popen( "umask u=r wx, g=r wx, o=r wx / t mp/ mysql - cer t / " . . user ) - - i o. popen( "r m- f ". . f i l ename) - - i o. popen( "t ouch " . . f i l ename) i o. popen( "echo ' ' > " . . f i l ename) l ocal f h = i o. open( f i l ename, " w" ) l ocal f = i o. popen( " l dapsear ch - LLL - x - D ' cn=Manager , dc=mast er r ad, dc=or g' - w admi n ' ( ui d=" . . user . . " ) ' user Cer t i f i cat e" ) l ocal r ez = f : r ead( ) l ocal r ez = f : r ead( ) l ocal r ez = st r i ng. gsub( r ez, "user Cer t i f i cat e; bi nar y: : ", "" ) f h: wr i t e( "- - - - - BEGI N CERTI FI CATE- - - - - \ n" ) f h: wr i t e( r ez) r epeat l ocal r ez_komande = f : r ead( ) ; - - l og( " kl j uc r ed po r ed: " . . t ost r i ng( r ez_komande) ) i f ( r ez_komande) t hen r ez = "\ n" . . st r i ng. gsub( r ez_komande, " ", " ") f h: wr i t e( r ez) end i = i + 1 unt i l ( i >25) f h: wr i t e( "- - - - - END CERTI FI CATE- - - - - \ n" ) f h: f l ush( ) l og( " I zl azak i z f unkci j e za dohvat anj e ser t i f i kat a. . . " ) r et ur n f i l ename end
- - gener at e128bi t gener i se kl j uc duzi ne 128 bi t a enkodovan u base64, koj i ce se kor i st i t i za si f r ovanj e u bazi f unct i on gener at e128bi t ( ) l ocal f = i o. popen( " openssl r and - base64 16") - - st or e t he out put i n a " f i l e" l ocal r ez = f : r ead( ) r et ur n r ez end
f unct i on t r i m( s) r et ur n ( st r i ng. gsub( s, " ^%s*( . - ) %s*$", " %1") ) Zavrni rad ore Zeevi
41 end f unct i on pr i nt t abl e( t abel a) l ocal v = "" f or i =1, #t abel a do i f ( t ype( t abel a[ i ] ) =="t abl e") t hen pr i nt ( #t abel a[ i ] ) v = l i st ToSt r i ng( t abel a[ i ] ) el se v = t abel a[ i ] end pr i nt ( i . . " - " . . v) end end - - i z " 1, 2, 3, 4" vr aca ni z {1, 2, 3, 4} f unct i on st r i ngToLi st ( l i st a) l ocal r ezul t at = {} l ocal i = 1 l ocal t emp = " " i f ( st r i ng. f i nd( l i st a, " , " ) ) t hen r epeat t emp = t r i m( st r i ng. sub( l i st a, 1, st r i ng. f i nd( l i st a, " , " ) - 1) ) r ezul t at [ i ] = t emp i = i + 1 l i st a = st r i ng. sub( l i st a, st r i ng. f i nd( l i st a, " , " ) +1, st r i ng. l en( l i st a) ) unt i l ( st r i ng. mat ch( l i st a, ", ") == ni l ) end upi t = t r i m( l i st a) r ezul t at [ i ] = upi t r et ur n r ezul t at end
- - i z {1, 2, 3, 4} vr aca "1, 2, 3, 4" f unct i on l i st ToSt r i ng( l i st a) l ocal r ez = "" j = #l i st a i = 1 i f ( j ==1) t hen r ez = l i st a[ 1] el se r epeat r ez = r ez . . l i st a[ i ] . . " , " i = i +1 unt i l ( j ==i ) r ez = r ez . . l i st a[ i ] end r et ur n r ez end
f unct i on number Of ( r ec, deo) l ocal i =0 whi l e st r i ng. mat ch( r ec, deo) do i = i +1 r ec = st r i ng. gsub( r ec, deo, ' ' ) end r et ur n i end
f unct i on i sSpeci al Quer y( quer y) l ocal r ez = f al se i f st r i ng. mat ch( quer y, " encr ypt " ) or st r i ng. mat ch( quer y, " key" ) t hen Zavrni rad ore Zeevi
42 r ez = t r ue end r et ur n r ez end
- - pr over ava da l i j e upi t t i pa cr eat e t abl e f unct i on i sCr eat eTabl e( quer y) l ocal r ez = f al se i f st r i ng. mat ch( st r i ng. upper ( quer y) , " CREATE TABLE") t hen r ez = t r ue end r et ur n r ez end
- - pr over ava da l i j e upi t t i pa dr op t abl e f unct i on i sDr opTabl e( quer y) l ocal r ez = f al se i f st r i ng. mat ch( st r i ng. upper ( quer y) , " DROP TABLE") t hen r ez = t r ue end r et ur n r ez end - - pr over ava da l i j e I NSERT I NTO upi t f unct i on i sI nser t I nt o( quer y) i f st r i ng. mat ch( st r i ng. l ower ( quer y) , " i nser t i nt o . + key") t hen r et ur n t r ue end r et ur n f al se end
- - pr over ava da l i j e ALTER TABLE upi t f unct i on i sAl t er Tabl e( quer y) i f st r i ng. mat ch( st r i ng. l ower ( quer y) , " al t er t abl e . + set . + encr ypt " ) t hen r et ur n t r ue end r et ur n f al se end
- - pr over ava da l i j e SELECT upi t f unct i on i sSel ect ( quer y) i f st r i ng. mat ch( st r i ng. l ower ( quer y) , " sel ect ") t hen r et ur n t r ue end r et ur n f al se end - - par se Sel ect quer y f unct i on par seSel ect ( quer y) l ocal upi t 1 = "" l ocal i meTabel e = get Tabl eName( quer y) l ocal k1, k2 l ocal kol one_sec={} l ocal kol one = {} l ocal sve_kol one = {} l ocal se = {} l ocal user = USER l ocal schema = pr oxy. connect i on. cl i ent . def aul t _db l ocal new_quer y = "" l ocal kol _si f , kol _nesi f - - dohvat anj e kol ona koj e t r eba da se si f r uj u u pr omenl j i vu kol one_sec Zavrni rad ore Zeevi
43 kol one_sec = get Cr ypt Col s( i meTabel e) - - kr ei r a se novi upi t koj i sadr zi f unkci j u za desi f r ovanj e kol ona l ocal usl ovi = " " uu, usl ovi = st r i ng. f i nd( quer y, ' key. *%" . +%" ' ) usl ovi = st r i ng. sub( quer y, usl ovi +1, st r i ng. l en( quer y) ) usl ovi = t r i m( usl ovi ) kol _nesi f = st r i ng. gsub( quer y, "sel ect " , " ") kol _nesi f = t r i m( kol _nesi f ) l ocal pos = st r i ng. f i nd( kol _nesi f , "f r om" ) kol _nesi f = st r i ng. sub( kol _nesi f , 1, pos- 2) kol _nesi f = t r i m( kol _nesi f ) l og( " kol one nesi f r ovane . . " . . kol _nesi f ) i f ( kol _nesi f == " *" ) t hen kol _nesi f = get Ast er i sk( schema . . ". " . . i meTabel e) el se kol _nesi f = st r i ngToLi st ( kol _nesi f )
end sve_kol one = get Ast er i sk( schema . . " . " . . i meTabel e) l ocal kk = get Col Names( schema . . " . " . . i meTabel e) l ocal num= #kk f or i =1, numdo se[ i ] = {} se[ i ] [ 1] = kk[ i ] se[ i ] [ 3] = sve_kol one[ i ] i f ( t abl e. cont ai ns( kol one_sec, se[ i ] [ 1] ) ) t hen l og( " i =" . . i ) se[ i ] [ 2] = 1 - - r ead key f or mSEC_CAT i nt o k2 upi t 1 = " SELECT enc_key FROM `SEC_CAT`. `ENC_KEYS` wher e t abl e_name = ' " . . i meTabel e . . "' and col umn_name = ' ". . se[ i ] [ 1] . . " ' and user name = ' ". . user . . "' " ; l og( upi t 1) k1 = r eadFr omSEC( upi t 1) i f ( k1) t hen k2 = k1: f et ch( ) el se l og( "GRESKA! kol ona ni j e si f r ovana ! ") os. exi t ( 2) end - - decr ypt wor ki ng key k2 = RSAdecr ypt ( k2, " / usr / l ocal / mast er r ad/ cer t / " . . user . . "/ SK. pem" ) l og( k2) - - encr upt v wi t h wor i ki ng key se[ i ] [ 3] = " AES_DECRYPT( " . . se[ i ] [ 3] . . ", ' " . . k2 . . "' ) as " . . se[ i ] [ 3] el se se[ i ] [ 2] = 0 end i f ( t abl e. cont ai ns( kol _nesi f , sve_kol one[ i ] ) ) t hen t abl e. i nser t ( kol one, se[ i ] [ 3] ) end l og( " kol one ". . i . . " = " . . t ost r i ng( kol one[ i ] ) ) end new_quer y = "sel ect ". . l i st ToSt r i ng( kol one) . . " f r om" . . i meTabel e . . " " . . usl ovi r et ur n new_quer y end
- - PARSE I NSERT I NTO upi t Zavrni rad ore Zeevi
44 f unct i on par seI nser t I nt o( quer y) l ocal i i = {} l ocal kol one = {} l ocal upi t 1 = "" l ocal i meTabel e = get Tabl eName( quer y) l ocal k1, k2 l ocal kol one_sec={} l ocal schema = pr oxy. connect i on. cl i ent . def aul t _db l ocal user = USER l og( " Kor sni cka shema: " . . t ost r i ng( schema) ) l ocal SK = " / usr / l ocal / mast er r ad/ cer t / ". . USER . . " / SK. pem" - - vadj enj e vr ednost i kol ona i z upi t a
upi t = st r i ng. gsub( quer y, " i nser t . *i nt o . * val ues. *%( ", "" ) upi t = st r i ng. gsub( upi t , "%) key. +" , " ") l og( upi t ) upi t = st r i ngToLi st ( upi t ) kol one_sec = get Cr ypt Col s( i meTabel e) l ocal kk = get Col Names( schema . . " . " . . i meTabel e) l ocal num = #kk f or i =1, numdo i i [ i ] = {} i i [ i ] [ 1] = kk[ i ] i i [ i ] [ 3] = upi t [ i ] i f ( t abl e. cont ai ns( kol one_sec, i i [ i ] [ 1] ) ) t hen l og( " i =" . . i ) i i [ i ] [ 2] = 1 - - r ead key f or mSEC_CAT i nt o k2 upi t 1 = " SELECT enc_key FROM `SEC_CAT`. `ENC_KEYS` wher e t abl e_name = ' " . . i meTabel e . . "' and col umn_name = ' ". . i i [ i ] [ 1] . . " ' and user name = ' ". . user . . "' " ; l og( upi t 1) k1 = r eadFr omSEC( upi t 1) i f ( k1) t hen k2 = k1: f et ch( ) end - - decr ypt wor ki ng key k2 = RSAdecr ypt ( k2, SK) - - encr upt v wi t h wor i ki ng key i i [ i ] [ 3] = " AES_ENCRYPT( " . . i i [ i ] [ 3] . . ", ' " . . k2 . . " ' ) " el se i i [ i ] [ 2] = 0 end kol one[ i ] = i i [ i ] [ 3] l og( " kol one ". . i . . " = " . . t ost r i ng( kol one[ i ] ) ) end - - kr ei r a se novi upi t koj i sadr zi si f r ovane kol one new_quer y = "i nser t i nt o " . . i meTabel e . . " val ues ( " . . l i st ToSt r i ng( kol one) . . ") " l og ( "NQ = " . . new_quer y) r et ur n new_quer y end f unct i on get Cr ypt Col s( i meT) l ocal k1, upi t 1 l ocal kol one_sec = {} - - dohvat anj e kol ona koj e t r eba da se si f r uj u u pr omenl j i vu kol one_sec upi t 1 = " sel ect col umn_name f r omSEC_CAT. ENC_COLUMNS wher e t abl e_name = ' " . . i meT . . " ' " k1 = r eadFr omSEC( upi t 1) i f ( k1) t hen Zavrni rad ore Zeevi
45 f or u=1, k1: numr ows( ) do k2 = k1: f et ch( ) k2 = t r i m( k2) t abl e. i nser t ( kol one_sec, k2) - - l og( "k2 - " . . t ost r i ng( k2) ) end el se l og( " Gr eska! Tabel a nema si f r ovane kol one! ") os. exi t ( 1) end r et ur n kol one_sec end
f unct i on get Col Names( I meTabel e) - - dohvat anj e i mena kol ona i z t abl e u koj u se ubacuj e - - i me t abel e u obl i ku shema. i met abel e l ocal upi t 1, k1 upi t 1 = " sel ect * f r om" . . I meTabel e k1 = r eadFr omSEC( upi t 1) i f ( k1==f al se) t hen l og( " Gr eska! Tabel a ne post oj i ! ") os. exi t ( 2) end r et ur n k1: get col names( ) end
f unct i on CTel ement ( t ext ) l og( " CTel ement za - - " . . t ext . . " - - ") l ocal el ement = t ext l ocal el = {} l ocal pr avo = "12" l ocal i me = "" l ocal kor i sni ci = {} - - l og( st r i ng. f i nd( el ement , "updat e 1" ) ) i f ( st r i ng. f i nd( el ement , "updat e 1" ) ) t hen pr avo = " 1" end i f ( st r i ng. f i nd( el ement , "updat e 0" ) ) t hen pr avo = " 0" end i f ( st r i ng. f i nd( el ement , "updat e 2" ) ) t hen pr avo = " 2" end el ement = st r i ng. gsub( el ement , "updat e . " , "" ) el ement = st r i ng. gsub( el ement , "encr ypt ", "" ) i f ( pr avo=="12" ) t hen os. exi t ( 12) end l og( " pr avo=" . . pr avo) l og ( "el - " . . el ement ) i f ( st r i ng. mat ch( el ement , " user _l i st " ) ) t hen l ocal upi t 1 = st r i ng. mat ch( el ement , " user _l i st %[ . +%] ") upi t 1 = st r i ng. gsub( upi t 1, "user _l i st +%[ ", "" ) upi t 1 = st r i ng. gsub( upi t 1, "%] " , " ") - - l og( " St r i ng koj i se pr et var a u l i st u: " . . upi t 1) r epeat l ocal t = st r i ng. sub( upi t 1, 1, st r i ng. f i nd( upi t 1, " " ) ) l og( " T - " . . t ) t = t r i m( t ) t abl e. i nser t ( kor i sni ci , t ) upi t 1 = st r i ng. gsub( upi t 1, t , "" ) upi t 1 = t r i m( upi t 1) unt i l ( st r i ng. f i nd( upi t 1, " ") ==ni l ) Zavrni rad ore Zeevi
46 l og( " T - " . . upi t 1) t abl e. i nser t ( kor i sni ci , upi t 1) - - l og( el ement ) el ement = st r i ng. gsub( el ement , " user _l i st %[ . +%] ", "" ) el ement = t r i m( el ement ) - - l og( " Upi t posl e ski danj a l i st e - " . . el ement ) end el ement = st r i ng. sub( el ement , 1, st r i ng. f i nd( el ement , " " ) ) i me = el ement t abl e. i nser t ( kor i sni ci , USER) l og( " ????" . . el ement . . " " . . t ost r i ng( kor i sni ci ) . . " " . . pr avo) el = {i me, kor i sni ci , pr avo} r et ur n el end - - vr aca ni z kol ona i z cr eat e t abl e koj e u sebi i maj u encr ypt - - i l i st u kor i sni ka koj i ma j e dozvol j en pr i st up f unct i on par seCr eat eTabl e( quer y) l ocal CT = {} l ocal i = 1 l ocal upi t = st r i ng. l ower ( quer y) upi t = t r i m( upi t ) l ocal pocet ak= st r i ng. f i nd( upi t , "%( " ) l og ( "pocet ak = " . . t ost r i ng( pocet ak) ) upi t = st r i ng. sub( upi t , pocet ak+1, st r i ng. l en( upi t ) - 1) l og( upi t ) - - deo upi t a i zmedj u zagr ada i f ( st r i ng. mat ch( quer y, " , " ) ) t hen r epeat l ocal t emp = " " l ocal i me = "" t emp = t r i m( st r i ng. sub( upi t , 1, st r i ng. f i nd( upi t , " , " ) - 1) ) - - l og( "kont r ol a - " . . t emp) i f ( st r i ng. f i nd( t emp, "encr ypt ") ) t hen CT[ i ] = CTel ement ( t emp) i =i +1 end upi t = st r i ng. sub( upi t , st r i ng. f i nd( upi t , " , " ) +1, st r i ng. l en( upi t ) ) - - l og( upi t ) unt i l ( st r i ng. mat ch( upi t , " , " ) == ni l ) end upi t = t r i m( upi t ) l og( " 1kont r ol a: " . . upi t . . i ) i f st r i ng. mat ch( st r i ng. l ower ( upi t ) , " encr ypt " ) t hen i f ( st r i ng. f i nd( upi t , "encr ypt ") ) t hen CT[ i ] = CTel ement ( upi t ) end end r et ur n CT end - - ALTER TABLE Funct i ons f unct i on par seAl t er Tabl e( quer y) l ocal i = 1 l ocal add = {} l ocal dr op = {} quer y = st r i ng. l ower ( quer y) quer y = st r i ng. gsub( quer y, "al t er t abl e . + set " , " ") quer y = st r i ng. gsub( quer y, "encr ypt ", "" ) quer y = st r i ng. gsub( quer y, "key . *" , " ") l ocal upi t = st r i ngToLi st ( quer y) f or j , v i n i pai r s( upi t ) do i f ( st r i ng. f i nd( v, " dr op") ) t hen v = t r i m( st r i ng. gsub( v, " dr op" , " ") ) t abl e. i nser t ( dr op, v) - - pr i nt ( v) Zavrni rad ore Zeevi
47 el se t abl e. i nser t ( add, v) end end r et ur n add, dr op end
- - i zvr sava upi t nad SEC kat al ogom f unct i on wr i t et oSEC( upi t ) l ocal env = l uasql . mysql ( ) l ocal konekci j a = env: connect ( "SEC_CAT", "r oot " , " ", "l ocal host ", 3306) l ocal kur sor = konekci j a: execut e( upi t ) i f ( kur sor ==ni l ) t hen r et ur n "upi s u sec_cat neuspesan" end r et ur n "upi s u sec_cat uspesan" end
f unct i on r eadFr omSEC( upi t ) l ocal env = l uasql . mysql ( ) l ocal konekci j a = env: connect ( "SEC_CAT", "r oot " , " ", "l ocal host ", 3306) l ocal kur sor = konekci j a: execut e( upi t ) i f ( kur sor ==ni l ) t hen r et ur n f al se end r et ur n kur sor end
f unct i on t abl e. cont ai ns( t abl e, el ement ) f or _, val ue i n pai r s( t abl e) do i f val ue == el ement t hen r et ur n t r ue end end r et ur n f al se end
- - vr aca ni z sa i meni ma kol ona f unct i on get Ast er i sk( t abel a) l ocal upi t = " descr i be " . . t abel a l ocal kol ona = {} l ocal i = 1 l ocal r ezul t at = r eadFr omSEC( upi t ) r epeat l ocal t emp = r ezul t at : f et ch( ) i f ( t emp == ni l ) t hen el se kol ona[ i ] = t emp - - pr i nt ( kol ona[ i ] ) end i = i +1 unt i l ( t emp == ni l ) r et ur n kol ona end
- - ski da kl j ucne r eci i z upi t a f unct i on dr opKeyWor ds( t ext ) t ext = st r i ng. gsub( t ext , "updat e 1" , " ") t ext = st r i ng. gsub( t ext , "updat e 0" , " ") Zavrni rad ore Zeevi
48 t ext = st r i ng. gsub( t ext , "updat e 2" , " ") t ext = st r i ng. gsub( t ext , "encr ypt ", "" ) t ext = st r i ng. gsub( t ext , "user _l i st . *%[ . *%] ", "" ) r et ur n t ext end
- - vr aca i me t abel e i z upi t a f unct i on get Tabl eName( quer y) l ocal upi t = st r i ng. upper ( quer y) i f ( st r i ng. mat ch( upi t , "CREATE TABLE %w+_%w+" ) ) t hen upi t = st r i ng. mat ch( upi t , " CREATE TABLE %w+_%w+") upi t = st r i ng. gsub( upi t , "CREATE TABLE" , " ") el sei f ( st r i ng. mat ch( upi t , "CREATE TABLE %w+" ) ) t hen upi t = st r i ng. mat ch( upi t , " CREATE TABLE %w+") upi t = st r i ng. gsub( upi t , "CREATE TABLE" , " ") end i f ( st r i ng. mat ch( upi t , "DROP TABLE %w+_%w+" ) ) t hen upi t = st r i ng. mat ch( upi t , " DROP TABLE %w+_%w+") upi t = st r i ng. gsub( upi t , "DROP TABLE" , " ") el sei f ( st r i ng. mat ch( upi t , "DROP TABLE %w+" ) ) t hen upi t = st r i ng. mat ch( upi t , " DROP TABLE %w+") upi t = st r i ng. gsub( upi t , "DROP TABLE" , " ") end i f ( st r i ng. mat ch( upi t , "I NSERT I NTO %w+_%w+") ) t hen upi t = st r i ng. mat ch( upi t , " I NSERT I NTO %w+_%w+" ) upi t = st r i ng. gsub( upi t , "I NSERT I NTO", "" ) el sei f ( st r i ng. mat ch( upi t , "I NSERT I NTO %w+") ) t hen upi t = st r i ng. mat ch( upi t , " I NSERT I NTO %w+" ) upi t = st r i ng. gsub( upi t , "I NSERT I NTO", "" ) end i f ( st r i ng. mat ch( upi t , "SELECT" ) ) t hen l ocal i = 0 i = st r i ng. f i nd( upi t , " FROM") - - pr i nt ( "u1 - " . . upi t ) upi t = st r i ng. sub( upi t , i +5, st r i ng. l en( upi t ) ) upi t = t r i m( upi t ) upi t = st r i ng. mat ch( upi t , " %a+" ) end i f ( st r i ng. mat ch( upi t , " ALTER TABLE . + SET") ) t hen upi t = st r i ng. gsub( upi t , "ALTER. +TABLE" , " ") upi t = st r i ng. sub( upi t , 1, st r i ng. f i nd( upi t , "SET") - 2) - - pr i nt ( upi t ) end r et ur n st r i ng. l ower ( t r i m( upi t ) ) end f unct i on addCol Enc( i met abel e, i mekol one, sk) l ocal schema = " mast er " l ocal i mekor i sni ka = " dj zecevi c" l ocal upi t 1 = "dr op t abl e I F EXI STS t est . t emp123" l ocal USER = i mekor i sni ka l ocal t empRez = wr i t et oSEC( upi t 1) l og( upi t 1) l og( t empRez) upi t 1=" cr eat e t abl e t est . t emp123 sel ect * FROM " . . schema . . ". " . . i met abel e l ocal t empRez = wr i t et oSEC( upi t 1) l og( upi t 1) l og( t empRez) l ocal col names = get Ast er i sk( schema . . " . " . . i met abel e) col names = l i st ToSt r i ng( col names) l og( col names) Zavrni rad ore Zeevi
49
- - gener at e wor ki ng key l ocal KEY = gener at e128bi t ( )
col names = st r i ng. gsub( col names, i mekol one, "AES_ENCRYPT( " . . i mekol one . . ", ' " . . KEY . . "' ) as " . . i mekol one) upi t 1 = " dr op t abl e " . . schema . . ". " . . i met abel e l ocal t empRez = wr i t et oSEC( upi t 1) l og( upi t 1) l og( t empRez) upi t 1 = " cr eat e t abl e " . . schema . . " . " . . i met abel e . . " sel ect " . . col names . . " f r omt est . t emp123" l ocal t empRez = wr i t et oSEC( upi t 1) l og( upi t 1) l og( t empRez) upi t 1 = " dr op t abl e t est . t emp123" l ocal t empRez = wr i t et oSEC( upi t 1) l og( upi t 1) l og( t empRez) - - kr ei r at i kl j uc za t r enut nog kor i sni ka KEY = RSAencr ypt ( KEY, " / usr / l ocal / mast er r ad/ cer t / " . . USER . . " / cer t i f i cat e. pem" ) upi t 1 = " i nser t i nt o `SEC_CAT`. `ENC_KEYS` VALUES( ' " . . i met abel e . . " ' , ' ". . i mekol one . . " ' , ' " . . USER . . "' , ' " . . KEY . . "' ) " l ocal t empRez = wr i t et oSEC( upi t 1) l og( upi t 1) l og( t empRez) upi t 1 = " i nser t i nt o `SEC_CAT`. `ENC_COLUMNS`VALUES( ' " . . i met abel e . . "' , ' " . . i mekol one . . "' , ' " . . USER . . " ' , 1, ' " . . USER . . "' ) " l ocal t empRez = wr i t et oSEC( upi t 1) l og( upi t 1) l og( t empRez) end
f unct i on r emCol Enc( i met abel e, i mekol one, sk) l ocal schema = pr oxy. connect i on. cl i ent . def aul t _db l ocal i mekor i sni ka = USER l ocal upi t 1 = "dr op t abl e I F EXI STS t est . t emp123" l ocal t empRez = wr i t et oSEC( upi t 1) l og( upi t 1) l og( t empRez) upi t 1=" cr eat e t abl e t est . t emp123 sel ect * FROM " . . schema . . ". " . . i met abel e l ocal t empRez = wr i t et oSEC( upi t 1) l og( upi t 1) l og( t empRez) l ocal col names = get Ast er i sk( schema . . " . " . . i met abel e) col names = l i st ToSt r i ng( col names) l og( col names) - - r ead key f or mSEC_CAT i nt o k2 upi t 1 = " SELECT enc_key FROM `SEC_CAT`. `ENC_KEYS` wher e t abl e_name = ' " . . i met abel e . . " ' and col umn_name = ' " . . i mekol one . . " ' and user name = ' ". . i mekor i sni ka . . " ' " ; l og( upi t 1) l ocal kk1 = r eadFr omSEC( upi t 1) l ocal kk2 i f ( kk1) t hen kk2 = kk1: f et ch( ) l og( kk2) end - - decr ypt wor ki ng key Zavrni rad ore Zeevi
50 kk2 = RSAdecr ypt ( kk2, " / usr / l ocal / mast er r ad/ cer t / dj zecevi c/ SK. pem") l og( " key: " . . kk2) col names = st r i ng. gsub( col names, i mekol one, "AES_DECRYPT( " . . i mekol one . . ", ' " . . kk2 . . " ' ) as " . . i mekol one) upi t 1 = " dr op t abl e " . . schema . . ". " . . i met abel e l ocal t empRez = wr i t et oSEC( upi t 1) l og( upi t 1) l og( t empRez) upi t 1 = " cr eat e t abl e " . . schema . . " . " . . i met abel e . . " sel ect " . . col names . . " f r omt est . t emp123" l ocal t empRez = wr i t et oSEC( upi t 1) l og( upi t 1) l og( t empRez) upi t 1 = " dr op t abl e t est . t emp123" l ocal t empRez = wr i t et oSEC( upi t 1) l og( upi t 1) l og( t empRez) upi t 1 = " del et e f r om `SEC_CAT`. `ENC_KEYS` wher e t abl e_name = ' " . . i met abel e . . " ' and col umn_name = ' " . . i mekol one . . " ' " l ocal t empRez = wr i t et oSEC( upi t 1) l og( upi t 1) l og( t empRez) upi t 1 = " del et e f r om `SEC_CAT`. `ENC_COLUMNS` wher e t abl e_name = ' " . . i met abel e . . "' and col umn_name = ' ". . i mekol one . . "' " l ocal t empRez = wr i t et oSEC( upi t 1) l og( upi t 1) l og( t empRez) end
f unct i on r ead_aut h( ) USER = pr oxy. connect i on. cl i ent . user name end
f unct i on checkPr i vi l eges( user name, t bl name, col name) l ocal r ezul t at = f al se l ocal t emp = {} - - da l i j e kr eat or ? l ocal upi t 1 = "SELECT cr eat or , per mi t i on FROM `ENC_COLUMNS` wher e `t abl e_name` = ' " . . t bl name . . "' and `col umn_name` = ' " . . col name . . "' " - - pr i nt ( upi t 1) l ocal U = r eadFr omSEC( upi t 1) i f ( U) t hen U: f et ch( t emp) l og( t emp[ 1] . . " " . . t emp[ 2] ) l og( user name) i f ( t emp[ 2] ==" 0" ) t hen r et ur n f al se el sei f ( t emp[ 1] ==user name) t hen r et ur n t r ue el sei f ( t emp[ 2] =="2") t hen r et ur n t r ue end end r et ur n r ezul t at end
f unct i on r ead_quer y( packet ) i f ( packet : byt e( ) ~= pr oxy. COM_QUERY) t hen r et ur n end l ocal quer y = st r i ng. sub( packet , 2) Zavrni rad ore Zeevi
51 - - pr over ava da l i j e dr op t abl e upi t i f ( i sDr opTabl e( quer y) ) t hen l ocal i meT = get Tabl eName( quer y) l og( i meT) l og( " DELETE FROM `SEC_CAT`. `ENC_COLUMNS` WHERE t abl e_name = ' " . . i meT . . " ' " ) l og( " DELETE FROM `SEC_CAT`. `ENC_COLUMNS` WHERE t abl e_name = ' " . . i meT . . " ' " ) l og( wr i t et oSEC( " DELETE FROM `SEC_CAT`. `ENC_COLUMNS` WHERE t abl e_name = ' " . . i meT . . " ' " ) ) l og( wr i t et oSEC( " DELETE FROM `SEC_CAT`. `ENC_KEYS` WHERE t abl e_name = ' " . . i meT . . " ' " ) ) pr oxy. quer i es: append( 1, st r i ng. char ( pr oxy. COM_QUERY) . . quer y) r et ur n pr oxy. PROXY_SEND_QUERY end - - pr over ava da l i u upi t u i ma kl j ucni h r eci : encr ypt , key i f ( not i sSpeci al Quer y( quer y) ) t hen r et ur n end l og ( " Speci al quer y; " . . quer y) - - pr over ava vr t u upi t a: cr eat e t abl e, i nset i nt o, dr op t abl e, al t er t abl e - - SELECT upi t i f ( i sSel ect ( quer y) ) t hen quer y = par seSel ect ( quer y) l og( " SELECT quer y: " . . quer y) pr oxy. quer i es: append( 1, st r i ng. char ( pr oxy. COM_QUERY) . . quer y) r et ur n pr oxy. PROXY_SEND_QUERY end - - CREATE TABLE i f ( i sCr eat eTabl e( quer y) ) t hen l og( " ul azak u cr eat e t abl e") l ocal kol one= par seCr eat eTabl e( quer y) - - l og( " Pr avi quer y pr e dr op key wor ds- " . . quer y) quer y = dr opKeyWor ds( quer y) l ocal KEY = "" l ocal i meTabel e = get Tabl eName( quer y) - - l og( " Pr avi quer y posl e dr op key wor ds- " . . quer y) l og( " Duzi na ni za kol one " . . #kol one) f or i =1, #kol one do l og( " Duzi na ni za user i " . . #kol one[ i ] [ 2] ) l og( " I NSERT I NTO `SEC_CAT`. `ENC_COLUMNS` VALUES ( ' " . . i meTabel e . . " ' , ' " . . kol one[ i ] [ 1] . . "' , ' " . . USER . . " ' , ' " . . kol one[ i ] [ 3] . . "' , ' " . . USER . . " ' ) ") t empRez = wr i t et oSEC( " I NSERT I NTO `SEC_CAT`. `ENC_COLUMNS` VALUES ( ' " . . i meTabel e . . " ' , ' " . . kol one[ i ] [ 1] . . "' , ' " . . USER . . " ' , ' " . . kol one[ i ] [ 3] . . " ' , ' " . . USER . . "' ) " ) l og( " Rezul t at ul i t a: " . . t empRez) KEY = gener at e128bi t ( ) f or j =1, #kol one[ i ] [ 2] do l og( "kol ona: " . . kol one[ i ] [ 1] . . " # kor i sni k: " . . kol one[ i ] [ 2] [ j ] ) l og ( " KEY = " . . KEY) l ocal t empRez - - pot r ebno j e si f r ovat i kl j uc sa j avni mkl j ucem kor i sni ka l ocal l dapKEY = get LDAPKey( kol one[ i ] [ 2] [ j ] ) l og( "LDAP KEY: " . . l dapKEY) l ocal KEY = RSAencr ypt ( KEY, l dapKEY, kol one[ i ] [ 2] [ j ] ) l og( "kor i sni k: " . . kol one[ i ] [ 2] [ j ] ) l og ( " Encr ypt ed KEY = " . . t ost r i ng( KEY) ) Zavrni rad ore Zeevi
52 i f ( KEY) t hen l og( "I NSERT I NTO `SEC_CAT`. `ENC_KEYS` VALUES ( ' " . . i meTabel e . . "' , ' " . . kol one[ i ] [ 1] . . " ' , ' " . . kol one[ i ] [ 2] [ j ] . . " ' , ' " . . KEY . . "' ) " ) t empRez = wr i t et oSEC( " I NSERT I NTO `SEC_CAT`. `ENC_KEYS` VALUES ( ' " . . i meTabel e . . "' , ' " . . kol one[ i ] [ 1] . . " ' , ' " . . kol one[ i ] [ 2] [ j ] . . "' , ' " . . KEY . . "' ) " ) l og( t empRez) el se l og( "Gr eska! - Nepr avi l no ci t anj e kor sni ckog ser t i f i kat a, mol i mvas pokusaj t e ponovo" ) os. exi t ( 1) end end end l og( quer y) pr oxy. quer i es: append( 1, st r i ng. char ( pr oxy. COM_QUERY) . . quer y) r et ur n pr oxy. PROXY_SEND_QUERY end - - ALTER TABLE i f ( i sAl t er Tabl e( quer y) ) t hen l og( " al t er t abl e") r ezul t at = " sel ect ' Al t er t abl e OK' " enc, no_enc = par seAl t er Tabl e( quer y) l ocal i meTabl e = get Tabl eName( quer y) SK = "/ usr / l ocal / mast er r ad/ cer t / ". . USER . . " / SK. pem" i f ( #enc>0) t hen l og( " Usao u encr ypt ") f or j , v i n i pai r s( enc) do - - obar adi t i encr ypt addCol Enc( i meTabl e, v, " SK") end end l og ( "- - - - - - - - - - - - - " ) i f ( #no_enc>0) t hen l og( " Usao u no encr ypt " ) f or j , v i n i pai r s( no_enc) do - - pr over i t i pr ava i f ( checkPr i vi l eges( USER, i meTabl e, v) ) t hen l ocal upi t 1 = "" r emCol Enc( i meTabl e, v, " SK") el se r ezul t at = " sel ect ' Access deni ed! ' " end end end pr oxy. quer i es: append( 1, st r i ng. char ( pr oxy. COM_QUERY) . . r ezul t at ) r et ur n pr oxy. PROXY_SEND_QUERY end - - I NSERT I NTO TABLE i f ( i sI nser t I nt o( quer y) ) t hen l og( " I NSERT I NTO FUNKCI J A POCI NJ E" ) quer y = par seI nser t I nt o( quer y) pr oxy. quer i es: append( 1, st r i ng. char ( pr oxy. COM_QUERY) . . quer y) r et ur n pr oxy. PROXY_SEND_QUERY end