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.
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:
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.
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.
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:
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';