U ovom trenutku, proučavanje bezbednosti MySQL-a vam verovatno ne zvuči preterano bitno. Još uvek znamo jako malo o ovom serveru i zašto bismo se onda bavili komponentom koja je vezana za finalni produkcioni stadijum - bezbednost. Ovo je istina i u ovom trenutku mi stvarno ne znamo dovoljno da pokrijemo sve bezbednosne aspekte našeg servera, ali, sa druge strane, onog trenutka kada smo instalirali MySQL server, mi smo ga (ukoliko smo na Internetu) izložili javnosti i samim tim bezbednosno ugrozili.

  

Port

Već smo rekli da MySQL radi na TCP/IP portu 3306. Ovaj port je podrazumevani port za MySQL, ali ne i obavezan. Ako je MySQL deo nekog vašeg sistema, koji ne zahteva standardne parametre, ovaj port možete i promeniti. Na taj način, podići ćete bezbednost samog servera, jer potencijalni napadači neće naći server tamo gde se obično nalazi (na portu 3306).

Takođe, filtrirajte Firewall-om korisnike kojima će biti dopušten prolaz kroz ovaj port. U prethodnim lekcijama govorili smo o slojevima sistema. Tada smo rekli da se baza podataka nalazi na jednom sloju, dok je sama logika na nekom drugom sloju. Kada krajnji korisnik pristupi našem sistemu, njegov maksimum može biti rukovanje poslovnom logikom kroz posredničku aplikaciju. Ali nema nikakvog razloga da on tom poslovnom logikom rukuje direktno, bez posrednika. Još je manje razloga da rukuje direktno podacima, zbog čega i nema nikakve potrebe da oni budu direktno izloženi spoljnom svetu. U svakom slučaju, ono što nikada ne smemo, to je - dozvoliti neproverenom hostu direktan pristup našem serveru (portu).

Samu kontrolu portova vršite u zavisnosti od sistema na kome se MySQL server nalazi (uz pomoć Firewall-a najčešće), dok port na kome će MySQL raditi, možete podesiti iz MySQL administratora. Sekcija Startup Variables, podsekcija General Parameters:

 


 
Ovaj podatak možete promeniti i ručno, editovanjem fajla my.ini (koji se nalazi u instalacionom folderu MySQL servera. Podešavanje porta se nalazi u sledećem odeljku:

[mysqld]

# The TCP/IP Port the MySQL Server will listen on
port=3306

 

Da bi promenili port u programu MySql Workbench, prvo otvorite instancu servera aktivacijom opcije Server Administration:


 

Zatim, odaberite opciju Options File, nakon čega će biti otvoren panel sa podešavanjima među kojima se nalazi i broj porta:

 

Korisnici

Do sada, mi smo koristili samo jednog korisnika na našem serveru. Taj korisnik je bio Root. Ali, ozbiljna administracija nekog servera podrazumeva više od jednog korisnika. U slučaju baza podataka, najčešće je to mnogo više. Zato je i ovo deo u kome moramo biti oprezni. Prvo pravilo je da treba ograničiti korisničke naloge samo na proverene korisnike. To znači da, ukoliko napravimo neki dinamički sistem za dodelu korisničkih naloga, on u svakom trenutku mora imati dobru proveru zahteva za te naloge (ovo možda deluje zbunjujuće, ali, dosta kontrolnih panela za web sajtove ima baš ovakve opcije). Ukoliko dodeljujemo neki nalog ručno, onda i samu proveru možemo izvršiti ručno.

Vodite računa o tome koja prava dajete kojim korisnicima. Ako opet pomenemo jedinog korisnika koga smo do sada uspeli da upoznamo - „Root”, videćemo da on ima sva prava na serveru - tolika prava, da može obrisati sve baze sa našeg servera. To nisu prava koja želimo da damo svakom korisniku. Zato, na sistemu pravimo različite korisnike sa različitim pravima (o čemu ćemo govoriti u sledećoj lekciji).

Pored toga, nikada ne dozvoljavamo korisniku Root da pristupi serveru sa udaljenog računara. Ovo „nikada” nije fiksni pojam, jer je opciono (moguće je omogućiti pristup sa Root-u sa udaljenog računara), ali ga treba shvatiti veoma ozbiljno i pridržavati ga se, osim u krajnjim slučajevima kada nam je ovakav pristup neophodan.

Prilikom konfiguracije MySQL servera, mi smo onemogućili konektovanje Root korisnika sa udaljenog računara, pa ne moramo da brinemo.

Na kraju, treba znati da je bezbednosni metod MySQL servera baziran ACL (Access Control List) metodu. To znači da za svakog korisnika postoje određena prava koja ima u odnosu na neki objekat. Kada menjamo privilegije korisnicima, mi, zapravo, samo menjamo odnos koji korisnici imaju prema određenim objektima.

  

Aplikacija

Sa MySQL serverom ćete rukovati putem neke aplikacije. Verovatno na taj način što će ta aplikacija slati upite ka serveru i preuzimati odgovore sa njega. Slanje upita serveru je kritičan proces, naročito ako je rezultat nekog korisnički definisanog upita.

Na primer, korisnik unosi svoje ime i šifru. Aplikacija zatim smešta korisničko ime i šifru u upit i prosleđuje taj upit bazi podataka. Ovo će dobro funkcionisati sve dok korisnik bude pokušavao stvarno da unese svoje korisničko ime i šifru, ali, korisnik može pokušati da, uz tražene podatke, „prokrijumčari” i neku dodatnu sql naredbu, koja može uticati na rad servera (takozvani SQL Injection). Zato, podaci koji dolaze do servera moraju biti adekvatno filtrirani u samoj aplikaciji.

  • Nikada nemojte dozvoliti korisnicima da kroz aplikaciju pošalju jednostruke navodnike (‘) na server.
  • Ne dozvolite aplikaciji da pokuša da u polje unese vrednost neodgovarajućeg tipa.
  • Ne dozvolite aplikaciji da pokuša da u polje unese vrednost koja premašuje veličinu ciljnog tipa.
  • Nemojte nikada dodeljivati visoke korisničke privilegije aplikaciji ili joj dodeliti Root nalog. Aplikacija mora imati svoj zaseban nalog sa privilegijama koje omogućavaju samo ono što je toj aplikaciji neophodno za rad.
  • Kada jednom napravite aplikaciju i dodelite joj korisnika u bazi, ograničite polje delovanja tog korisnika samo na adresu te aplikacije.

  

Podaci

Gde god je to moguće, nemojte dozvoliti aplikaciji direktnu manipulaciju podacima kroz upite, već je ograničite na korišćenje funkcionalnosti baze (Stored Procedure, pogledi...), a same upite najnižeg nivoa, izvršavajte u kontekstu same baze, na serveru, pre nego na aplikaciji.

Ovo je dobra praksa:

 

 


Dok ovakvu strukturu treba izbegavati:

 

 


Kada čuvate podatke kritičnog sadržaja (npr šifre). Prethodno ih, ukoliko imate mogućnosti, čuvajte kriptovane (uz pomoć neke jednosmerne enkripcije (npr. md5 ili sha)).

Pored toga, preporučivo je, ukoliko se aplikacija i baza nalaze na Internetom razdvojenim računarima, odnosno, ukoliko povezujete više servera putem Interneta, koristiti SSL enkripciju.

 

Najvažnije iz lekcije:

  1. MySQL server koristi ASL (Access Control List) metod pristupa podacima.
  2. MySQL server podrazumevano radi na portu 3306.
  3. Uvek dozvoljavajte pristup serveru samo sa poznatih adresa.
  4. Nikada ne omogućavajte pristup Root korisniku sa udaljenog računara.
  5. Za jednosmerne podatke, koristite jednosmernu enkripciju (md5, sha).
  6. Ne dozvoljavajte aplikacijama direktno izvršavanje upita, već putem posredničke serverske funkcionalnosti.
  7. Ne dozvolite da aplikacija na server pošalje neodgovarajuće podatke (vrednosti koje ne odgovaraju ciljnim tipovima, određene specijalne karaktere i sl).
  8. Ukoliko vršite transport podataka sa servera na drugi server ili sa servera na aplikaciju putem Interneta, koristite enkripciju (SSL).
     

Vežba 1

Problem:

Na računaru je instanca MySQL servera. Takođe, na istom serveru je i veb aplikacija.

Potrebno je izmeniti strukturu sistema, tako da baza podataka i veb aplikacija budu na različitim računarima. Potrebno je obezbediti dodatne elemente, koji bi povećali bezbednost servera.


Rešenje:

U my.ini fajlu, poželjno je promeniti port sa podrazumevanog na nestandaradan:

[mysqld]
port=3306

(Na primer 1434)


Korisniku root treba oduzeti prava na rad sa udaljenog računara, ukoliko ih eventualno poseduje

DROP USER 'root'@'%';

ili

DROP USER 'root'@'ip adresa udaljenog računara';


Kreirati korisnika za bazu:

create user 'peter'@'web server ip address' identified by '123';


Kreirati minimalne privilegije korisniku za ciljnu bazu:

grant select, update, delete on application_03.* to 'peter'@'web server ip address';

Dodaj komentar Sviđa mi se - (1) Ne sviđa mi se - (0)    

  • Bezbednost MySQL-a 1
  • Bezbednost MySQL-a 2
  • Bezbednost MySQL-a 3