Sigurnost sustava za upravljanje bazom podataka - MySQL

Izvor: SIS Wiki
Skoči na: orijentacija, traži

(Temu rezervirala - Aleksandra Polak)


Sadržaj

Baza podataka i sustav za upravljanje bazom podataka (SUBP)

Baza podataka je skup podataka koji su pohranjeni i organizirani tako da mogu zadovoljiti zahtjeve korisnika. (prema M. Vetter)

Podaci su pohranjeni na način neovisan o programima koji ih koriste. Prilikom dodavanja novih podataka, mijenjanja i pretraživanja postojećih podataka primjenjuje se zajednički kontrolirani pristup. Podaci su strukturirani tako da služe kao osnova za razvoj budućih primjena. (J. Martin)

SUBP je programski sustav koji omogućava upravljanje podacima u bazi podataka, može istovremeno upravljati s više baza podataka. Upravlja istovremenim pristupom bazi podataka od strane više korisnika/aplikacija uz osiguravanje sigurnosti i integriteta baze podataka. Temelji se na odabranom modelu podataka (hijerarhijski, mrežni, relacijski, objektno-relacijski, objektno-orijentirani).

Sigurnost baze podataka

Sigurnost baze podataka se osigurava zaštitom na nekoliko razina:

Defense-in-depth strategija



1. na razini SUBP

2. na razini operacijskog sustava

3. na razini računalne mreže

4. fizička zaštita

5. na razini korisnika




"Defense-in-depth strategija" - označava zaštitu u više slojeva. Ne postoji savršeni zaštitni sloj, metoda ili proizvod. Također proboj jednog sloja ne mora značiti i narušavanje sigurnosti podataka iz baze podataka. No, valja naglasiti da je nužna zaštita unutar baze podataka, čak i ako je implementiran poseban sustav zaštitee baze podataka izvan same baze.

Zadaće SUBP-a

1. trajna pohrana podataka (persistent storage)

2. osigurava programsko sučelje (programming interface)

3. optimiziranje metoda pristupa podacima (query optimization)

4. zaštita podataka



Što je MySQL

MySQL je besplatan, open source sustav za upravljanje bazom podataka. Čest je izbor baze za projekte otvorenog koda i distribuira se kao sastavni dio serverskih Linux distribucija, također, mogu se pronaći i inačice za ostale operacijske sustave, kao što su Mac OS, Windows i dr.

MySQL baza je optimizirana kako bi bila brza na štetu funkcionalnosti. Unatoč tome, vrlo je stabilna i ima dobro modulirane module i ekstenzije te samu podršku mnogih programskih jezika: PHP, Java, Python...

MySQL i PHP su osvojili velik dio tržišta, samim time što su besplatni za korištenje. Također, važno je napomenuti za one koji nisu upoznati sa time, MySQL baze su baze relacijskog tipa. Taj tip baza se pokazao kao najbolji naćin skladištenja i pretraživanja ogromnih količina podataka te u svemu predstavljaju osnovu svakog informacijskog sustava. Drugim riječima, temelj su svakog poslovnog subjekta koji svoje poslovanje bazira na dostupnosti kvalitetnih i brzih informacija.


SQL Injection (SQLI)

SQL Injection je tehnika kojom zlonamjerni korisnici mogu naljepiti SQL text u već postojeće SQL upite putem ulaza na web stranicama. Ova vrsta napada omogućava napadaćima da koriste lažan indentitet, mijenjaju postojeće podatke, uzrokuju probleme poput poništavanja transakcija ili mijenjanja stanja. Također im omogućava objavu svih podataka sustava, uništenje podataka ili da na neki drugi naćin učine podatke nedostupnima.


Pogledajmo primjer lošeg koda na kojem zlonamjerni korisnik može napraviti velik broj SQLI napada.

  textKorID = getRequestString("korID");
  textSQL = "SELECT * FROM Korisnik WHERE korID = " + textKorID;

Pogledajmo primjere SQLI napada, te potom, kako možemo izbjeći SQL Injection.


SQL Injection baziran na "1=1 je uvijek istina"

Ako na web stranici u polje za unos šifre korisnika sljedeći tekst: "100 or 1=1".

Dobili smo sljedeću konstrukciju upita koji je nadasve valjan i prolazi. Dobit ćemo sve podatke iz tablice Korisnik. A ako tablica sadrži imena i lozinke, imamo veliki problem.

 "SELECT * FROM Korisnik WHERE korID = 100 or 1=1";


SQL Injection baziran na "=" je uvijek istina

Pogledajmo sljedeći primjer:

 ImeKor = getRequestString("ImeKorisnika"); 
 LozKor = getRequestString("LozinkaKorisnika");
 sql = 'SELECT * FROM Korisnik WHERE Ime = " ' + ImeKor + ' "AND Lozinka = " + LozKor + ' " '

Ako korisnik upiše umjesto pravog imena ili lozinke: "or""=".

Dobivamo sljedeći upit:

 SELECT * FROM Korisnik WHERE Ime = " "or ""="" AND Lozinka = " "or""=""

... i on naravno prolazi jer je ""="" uvijek istina.

SQL Injection baziran na "Batched SQL statements"

Znamo da mnoge baze podataka podržavaju povezivanje SQL naredbi korištenjem točke-zareza (;). Npr.:

 SELECT * FROM Korisnik; DROP TABLE Dobavljači"

Vidimo da ovaj upit dohvaća sve podatke iz tablice Korisnik i briše tablicu Dobavljači. Pogledajmo prvi primjer, upisom bilo kakvog izraza u prvi dio koda: Ne znam što ovdje ide; DROP TABLE Dobavljači.

Ovaj će kod naravno proći i obrisati tablicu dobavljača.

Kako spriječititi SQLI napade??

Prema člancima koje nalazimo, vidimo da pojedini developeri koriste "crnu listu" riječi ili znakova koje taže u SQL upitu, kako bi sprijećili SQLI napade. Naime, kada pogledamo, to nije dobra ideja. Razlog vidimo u tome što se mnoge od tih riječi sa "crne liste" upotrebljavaju u mnogim upitima. Jedini dokazani način zaštite web stranice od SQLI napada je korištenje SQL parametara. SQL parametri su vrijednosti koje su dodane na sam SQL upit u vrijeme izvršavanja, na kontrolirani način.


ASP.NET Razor (primjer 1)

textKorID = getRequestString("korID");
textSQL = "SELECT * FROM Korisnici WHERE korID = @0"
db.Execute(textSQL, textKorID);

Primjetimo da su parametri prezentirani pomoću @ markera u SQL upitu. SQL sustav provjerava svaki parametar zasebno da bi se osigurao da su točni a ne kao dio SQL upita koji se treba izvršiti.

(primjer 2)

textIme = getRequestString("Ime");
textAdd = getRequestString("Adresa");
textGrad = getRequestString("Grad");
textSQL = "INSERT INTO Korisnici(Ime, Adresa, Grad) Values (@0, @1, @2)";
db.Execute(textSQL, textIme, textAdd, textCity);

INSERT INTO upit u PHP-u, primjer 3

$sql = $dbh -> prepare("INSERT INTO Klijenti (Ime, Adresa, Grad) VALUES (:ime, :add, :grad)");
$sql -> bindParam(':ime', $textIme);
$sql -> bindParam(':add', $textAdd);
$sql -> bindParam(':grad', $textGrad);
$stmt -> execute();


Sigurnosne kopije

Sigurnosne kopije (engl. backup) primjenjuju se kako bi korisnici osigurali nemogućnost gubitka podataka, koje kasnije ne bi mogli vratiti.


RAID - redundant array of independent disks

RAID sustav pohrane podataka koristi više diskova kako bi se osigurala tolerancija kvarova, poboljšala ukupna učinkovitost i povećao kapacitet memorije u sustavu. Omogućava spremanje istih podataka (u više koraka) na uravnotežen način za poboljšanje sveukupnih performansi..

RAID diskovi se često koriste na serverima, ali nisu općenito potrebni za osobna računala.

RAID 0- sastoji se minimalno od 2 diska. Pruža striping podataka (jednu datoteku sprema na više diskova). Nema ponavljanja podataka, što poboljšava performanse, ali ne tolerira kvarove. Ako padne jedna disk, svi su podaci izgubljeni.

RAID 1 - služi za sigurnost podataka bolje rečeno backup. Za ovo polje treba najmanje dva diska. Kad se podaci zapisuju,zapisuju se na oba diska istovremeno. Tako u slučaju kvara jednog od diskova podaci će ostati na drugom. Ovo bi se najbolje upotrijebilo za uredska računala. Glavni nedostatak je ukupni kapacitet RAID 1 polja.

RAID 5 - za ovo je potrebno najmanje 3 čvrsta diska,pri čemu se na njih zapisuje i tzv. paritet. Riječ je o podatku o kojeg se dolazi takozvanom XOR kalkulacijom. XOR služi za rekonstrukciju podataka u slučaju otkazivanja nekog diska. Paritet se svaki put zapisuje na drugi disk, što dodatno povećava sigurnost podataka.

RAID 10 - Kombinacija brzine RAID 0 polja i sigurnosnog RAID 1 po mnogima RAID 10 čine najkvalitetnijim rješenjem,barem za korisnike koji traže visoke performanse.Za uspostavu ovog polja potrebna su najmanje 4 tvrda diska jer ne može funkcijonirati sa neparnim brojem diskova.Dva para diskova se kod potonjeg prvo stavljaju u stripu,a tada se ta dva polja prebacuju u mirror.


Brisanje podataka

Brisanje podataka je metoda prilikom koje je izvršeno uništavaju svih podataka na tvrdom disku ili nekom digitalnom mediju kako ne bi došlo do otkrivanja podataka nakon što uređaj nije upotrebljiv.


Strukturni integritet i sigurnost podataka

Integritet baze podataka predstavlja ispravne operacije nad podacima koje korisnici obavljaju. Šro znaći, "podaci se štite od ovlaštenih korisnika".

Sigurnost baze podataka podrazumijeva da su korisnici koji obavljaju operacije nad podacima ovlašteni za obavljanje tih operacija, pri čemu se "podaci štite od neovlaštenih korisnika".

U oba navedena slučaja moramo definirati pravila koja korisnici ne smiju narušiti, pravila koja se pohranjuju u riječnik podataka i nezaobilazna su za sve korisnike, te ne opterećuju programe, pri čemu SUBP nadgleda rad korisnika i osigurava poštivanje pravila.


Dizajniranje baza

Dizajniranje relacijske baze podataka podrazumijeva:

Projektiranje podataka

Održavanje podataka

Prilikom izrade konceptualnog modela, kreće se od entiteta. Entitete predstavlja bilo koja stvar, apstraktna ili stvarna, u poslovnom sustavu o kojoj možemo zapisivati podatke. Npr. kupci, dobavljači, narudžbe, zaposlenici...

Iz konceptualnog modela slijedi model entiteti - veze, koji definira sve entitete i veze među njima. Takav način prikaza, naziva se dijagram ili model entiteti - veze (ERD - Entity-Relationship Diagram).


Razlikujemo tri vrste veza:

  1. "one-to-many" (veza jedan-prema-više)
  2. "one-to-one" (veza jedan-prema-jedan)
  3. "many-to-many" (veza više-prema-više)

2 i 3 vezu nastojimo izbjei, pa kažemo da želimo relacijski model u kojem postoji samo one-to-many tipovi veza.


Normalizacija

Normalizacija je postupak organiziranja podataka s ciljem kreiranja učinkovite, pouzdane (sačuvan je integritet podataka) i fleksibilne baze podataka.

1 NF
2 NF
3 NF

Prava i kontrola pristupa

Kontrola pristupa pokriva niz postupaka kojima se evidentiraju pokušaji pristupa i odobravaju/odbijaju pristupi temeljem unaprijed utvrđenih pravila. Tako razlikujemo sigurnosnu politiku, sigurnosni model, sigurnosni mehanizam. Sigurnosna politika odnosi se na pravila pristupa na visokoj razini. Temelji se na načelu "need-to-know", kompetentnosti, nadležnosti, sukobu interesa i td. Sigurnosna politika je dinamična jer se mijenja u skladu s promjenama poslovnih faktora, regulativa i uvjeta u okruženju. Sigurnosni model je formalni prikaz sigurnosne politike koji se dijeli na diskrecijsku, mandatnu kontrolu pristupa i kontrolu pristupa temeljenu na ulogama. Sigurnosni mehanizam predstavljaju funkcije kojima je implementirana sama kontrola pristupa.

U mehanizme kontrole pristupa ubraja se referentni monitor. Pouzdana komponenta koja kontrolira svaki pristup objekta sustavu i utvrđuje je li taj pristup u skladu sa sigurnosnom politikom utjelovljenom u bazi podataka kontrole pristupa. Referentni monitor uspoređuje sigurnosne atribute korisnika sa onima koje imaju resursi. Preduvjet je uspješna indentifikacija i autentikacija korisnika.


- primjet preuzet sa: https://dev.mysql.com/doc/refman/5.6/en/grant.html

GRANT
    priv_type [(column_list)] 
      [, priv_type [(column_list)]] ... 
    ON [object_type] priv_level 
    TO user [auth_option] [, user [auth_option]] ... 
    [REQUIRE {NONE | tls_option [[AND] tls_option] ...}] 
    [WITH {GRANT OPTION | resource_option} ...] 
GRANT PROXY ON user 
    TO user [, user] ... 
    [WITH GRANT OPTION] 
object_type: { 
    TABLE 
  | FUNCTION 
  | PROCEDURE 
} 
priv_level: { 
    * 
  | *.* 
  | db_name.* 
  | db_name.tbl_name 
  | tbl_name 
  | db_name.routine_name 
} 
user:
    (see Section 6.2.3, “Specifying Account Names”)
auth_option: {
    IDENTIFIED BY 'auth_string'
  | IDENTIFIED BY PASSWORD 'hash_string'
  | IDENTIFIED WITH auth_plugin
  | IDENTIFIED WITH auth_plugin AS 'hash_string'
}
tls_option: {
    SSL
  | X509
  | CIPHER 'cipher'
  | ISSUER 'issuer'
  | SUBJECT 'subject'
}
resource_option: {
  | MAX_QUERIES_PER_HOUR count
  | MAX_UPDATES_PER_HOUR count
  | MAX_CONNECTIONS_PER_HOUR count
  | MAX_USER_CONNECTIONS count
} 


Prednosti i nedostatci MySQL servera

Kada pogledamo primjenu MySql-a, isti je kao i drugi sustavi za upravljanje relacijskim bazama podataka, iz čega slijedi da je njegova glavna primjena ista kao i primjena SQL-a, s jednom razlikom. MySQL je još više neovisan o platformi sustava u koji je instaliran, te ima mnogo veću brzinu obrade podataka, što ga čini jednim od boljih, ako ne i najboljih sustava za kontrolu i korištenje baza podataka na web-u. Razlog tome je što se na web-u očekuje brza i sigurna obrada podataka.

S druge strane, MySQL, može biti i nesigurna baza podataka. Ako mu pristupa računalo koje je u unternoj mreži automatski se postavljaju administratorska dopuštenja i zbog toga interni napadi mogu biti puno opasniji od udaljenih. MySQL sadrži brojne skripte koje u radu koriste privremene datoteke. Ponekad se te datoteke stvaraju na nesigurnim lokacijama i sa predvidljivim imenima, te se mogu zamijeniti simboličkim vezama prema kritičnim sistemskim datotekama. Također, moramo napomenuti da MySQL skripta koristi ovlasti MySQL procesa koji ju je pokrenuo prilikom prepisivanja sistemske datoteke.

Za razliku od drugih SUBP-a, kao što su Oracle ili Sybase, MySQL izvorno sadrži vrlo slabu mrežnu podršku. Iz tog razloga, nakon proboja u MySQL poslužitelj, nema puno mogućnosti za proširenje napada na ostatak računalne mreže.

Obično se MySQL bazom koristi preko PHP skripti koje se nalaze unutar web stranica, umetnute između HTML koda. Na MySQL serveru se na disku fizički nalaze baze podataka i korisnički računi osoba koje imaju također i određene stupnjeve ovlasti za izvršavanje određenih operacija na samoj bazi i unutar nje. Prihvat zahtjeva sa korisničkih računala se prima na serveru i server provjerava da li prijavljeni korisnik ima autorizaciju za tražene operacije. Ako je odgovor potvrdan server izvršava tražene operacije i rezultat obrade šalje natrag na korisničko računalo.

Također jedna od pozitivnih karakteristika MySQL sustava je što MySQL server može prihvatiti više zahtjeva za obradu od više korisnika u isto vrijeme potpuno paralelno, bez zastoja.

Na temelju gore navedenih karakteristika, te neovisnosti o platformi sustava u kojem se koristi MySQL je vrlo popularan kod web aplikacija i radi kao komponenta baze podataka na platformama kao što su Linux, BSD, Mac, Windows-Apache-MySQL-PHP. Perl, Python i drugima.


ACID test

Uspoređivanje programa za baze podataka, obavlja se putem ACID testa. ACID test opisuje baze na temelju četiri svojstva koja bi trebala imati svaka robusna baza podataka:

  1. atomicity - atomarnost
  2. consistency - konzistencija
  3. isolation - izolacija
  4. durability – izdržljivost

Transakcija kao osnovna jedinica rada koju korisnik baze može definirati je osnovna provjera ova četiri svojstva. Ako definiramo transakciju koja će u sebi sadržavati naredbe INSERT, UPDATE, DELETE, sve tri naredbe promatramo kao cjelinu. Što to znaći? Izvršit će se ili sve ili nijedna. To svojstvo je vrlo bitno prilikom novčanih transkacija. Dogodi se da se usred transakcije sruši server, te ne bi bilo dobro da se tom prilikom odradi DELETE, a INSERT koji dolazi nakon njega ne izvrši. Prema ACID svojstvima, PostgreSQL je bolji od MySQL-a. PostgreSQL je kompatibilan i njegovo korištenje osigurava napredne opcije i sigurnost podataka, no s druge strane, istovremeno upotreba puno naprednih opcija usporava izvedbu aplikacije.

MySQL po defaultu od ACID svojstava podržava samo atomarnost pomoću opcije table locks, dok je ostala svojstva moguće postiči upotrebom različitih paketa za upravljanje tabilcama poput BerklyDB ili InnoDB.

Nadalje, osim ACID testa, postoji još osobina koje su bitne kod ovih baza. Dok MySQL ne podržava storne procedure niti ugnježdene upite, PostgreSQL podržava, te mu to daje znatnu prednost prilikom izrade velikih aplikacijama u kojima se traži brzina. Storne procedure također ubrzavaju rad aplikacija pisanih u Javi. S obzirom da je Java poznata po svojem sporijem izvođenju, pomoću stornih procedura moguće je određene funkcije postaviti direktno na bazu.

Na temelju navedenog još jednom potvrđujemo da je PostgreSQL bolje koristiti za razvoj kompleksnih aplikacija ili onima koji prelaze sa ORACLE, Sysbase ili Microsoft SQL Server-a na drugu bazu podataka. A MySQL za manje zahtjevne potrebe, kao što je integracija sa webom. Bez obzira na to da postoji mogućnost od gubitaka podataka prilikom obavljanja transakcija, veća i jednostavnija upotreba daju mu prednost kod manjih i jednostavnijih baza podataka.

Literatura:

  1. https://hr.wikipedia.org/wiki/MySQL
  2. Sigurnost sustava za upravljanje bazama podataka (http://www.cert.hr/sites/default/files/CCERT-PUBDOC-2006-10-171.pdf )
  3. http://www.w3schools.com/sql/sql_injection.asp
  4. http://www.srce.unizg.hr/files/srce/docs/edu/osnovni-tecajevi/d350_polaznik.pdf
  5. http://www.baze-podataka.net/2008/05/17/prava-pristupa-podacima-prvi-deo/
  6. http://www.unizd.hr/portals/1/primjena_rac/poseban_program/predavanja/baze_podataka.pdf
  7. https://www.fer.unizg.hr/_download/repository/06_sigurnost_baza_podataka_-_1._dio.pdf
  8. http://www.atlasindia.com/sql.htm
  9. http://www.thegeekstuff.com/2010/08/raid-levels-tutorial
  10. http://www.webopedia.com/TERM/R/RAID.html
Osobni alati
Imenski prostori
Inačice
Radnje
Orijentacija
Traka s alatima