среда, 13. фебруар 2008.

Neprijatelj nikad ne miruje – MySQL privilegije

Iako naslov u najmanju ruku zvuči kao uvodni čas predmeta koji se u davna vremena zvao „ONO“ a kasinije je dodat „i DSZ“, unutrašnji i spoljni neprijatelji nikada ne miruju. Zna to MySQL pa otuda i stalno budan podsistem koji se bine o pravima (privilegijama). Od trenutka kad pokušate da se konektujete, a onda i za svaku dalju akciju, MySQL proverava sledeće:

  • Odakle vršite pristup (host – računar sa kog radite)
  • Za šta se predstavljate (ime korisnika i lozinku)
  • Šta vam je dozvoljeno da uradite (komandna prava)

Sve ove informacije smeštene su u bazu sa imenom mysql, koja se automatski kreira kada instalirate MySQL. Ceo podsistem podržan je sa nekoliko tabela u mysql bazi:

  • columns_priv — Definiše prava korisnika nad poljima u tabeli.
  • db — Sadrži definiciju prava za sve baze na serveru.
  • func — Sadrži funkcije koje su korisnici kreirali.
  • host — Sadrži hostove sa kojih je dozvoljeno konektovanje na odredjenu bazu.
  • tables_priv — Sadrži definicije korisničkih prava nad tabelama u bazi.
  • user — Sadrži komandna prava za korisnike.

Struktura tabela može se pogledati MySQL konsolom koristeći komandu DESCRIBE ime-tabele pošto pristupite mysql bazi. Na primer, iz komand prompa otukcate:

mysql –u root –p mysql

Nakon što unesete lozinku (ukoliko ste je postavili) sistem daje prompt: mysql>. Otkucate na primer:

mysql> DESCRIBE user;

Autentifikacioni proces u dva koraka

Kao što smo napomenuli, MySQL proverava host, ime korisnika i lozinku i prava nad komandom u toku autentifikacionog procesa. Ta provera sprovodi se u dva koraka:
  1. MySQL proverava host sa koga se vrši konekcija i ime i lozinku koju koristimo. Ako je sa hosta dozvoljena konekcija i lozinka je odgovarajuća za ime korisnika, i ime odgovara onom dodeljenom hostu, MySQL prelazi na drugi korak.
  2. U zavisnosti koju SQL komandu pokušavamo da izvršimo, MySQL verifikuje da za to imamo dozvolu za tu bazu, tabelu i polje.

Ukoliko korak 1 ne prodje, prikazuje se greška i nema mogućnosti prelaska na korak dva. Na primer, pretpostavimo da se konektujemo na MySQL bazu sa imenom mile i lozinkom qwe123 i da želimo da pristupimo bazi koja se zove mojDB. Dobićemo poruku o grešci ako je bilo koja od konekcionih promenljivih neispravna iz sledećih razloga:

  • Lozinka nije tačna
  • Korisnik mile ne postoji.
  • Korisnik mile se ne može konektovati sa localhost (ako je komandu izdao sa istog).
  • Korisik mile se može konektovati sa localhost ali ne može koristiti mojDB bazu.

Moguće je videti grešku kao što je:

#> /usr/local/bin/mysql/bin/mysql -h localhost -u mile –pqwe123 mojDB
Error 1045: Access denied for user: 'mile@localhost' (Using password: YES)

Ako je korisniku mile sa lozinkom qwe123 dozvoljen da se konektuje sa localhost-a na mojDB bazu, MySQL će proveriti akcije koje mile može izvršiti u koraku 2 procesa. Zarad naše svrhe, pretpostavimo da je mile čovek od delimičnog poverenja i da može selektovati podatke iz tabele imenik ali da mu nije dozvoljeno da ih u nju insertuje. Na osnovu sekvenca komandi grešake će izgledati:

D:\xampp\mysql\bin>mysql.exe -h localhost -u mile -pqwe123 mojDB

Welcome to the MySQL monitor. Commands end with ; or \g.

Your MySQL connection id is 83

Server version: 5.0.51 Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> select * from imenik;

+----+------+

| id | ime |

+----+------+

| 1 | Mile |

| 2 | Pera |

+----+------+

2 rows in set (0.01 sec)

mysql> insert into imenik (ime) value ('Joca');

ERROR 1142 (42000): INSERT command denied to user 'mile'@'localhost' for table '

imenik'

mysql>

Prava na neku akciju su česta u aplikacijama sa nekoliko nivoa administracije. Na primer, ako se kreira aplikacija koja sadrži finansijske podatke, može se dodeliti samo SELECT pravo običnim zaposlenima, a INSERT i DELETE pravo rukovodećoj strukturi.

Rad sa privilegijama (pravima) korisnika

U većini slučajeva kada se pristupa MySQL-u kod Internet provajdera dobija se jedan korisnik i na raspolaganju je jedna baza. Po defaultu, taj će korisnik imati pravo pristupa svim tabelama u bazi i biće mu dozvoljeno da izvršava sve komande.

U tom slučaju, odgovornost je na programeru da realizuje zaštitu u aplikaciji programski.

Ako ste pak administrator sopstvenog servera ili imate mogućnost da dodate koliko želite baza i korisnika, kao i da modifikujete prava pristupa svojim korisnicima, evo kako izgleda taj proces.

Dodavanje korisnika

Administracija koristeći dodatne alate (npr: phpMyAdmin) može obezbediti jednostavan metod za dodavanje korisnika, koristeći wizarde ili grafički interfejs. Medjutim, dodavanje korisnika kroz MySQL monitor nije teško, posebno kada se shvata provera sigurnosti koja se koristi kod MySQL-a a koju smo upravo prošli (ako ste preskakali nazad na početak).

Najednostavniji metod za dodavanje korisnika je GRANT komanda. Konektovanjem na MySQL kao root korisnik, jednom komandom možete postaviti novog korisnika. Drugi metod je izdati INSERT naredbe u sve relevantne tabele u mysql bazi, što zahteva da se znaju sva polja u tabelama koja se koriste za smeštanje prava. Ovaj metod radi ali je značajno komplikovaniji od izdavanje jednostavne GRANT komande. Složeniji metod opisan je na http://dev.mysql.com/doc/refman/5.0/en/adding-users.html adresi.

Najednostavnija sintaksa GRANT komande je

GRANT privileges
ON databasename.tablename
TO username@host
IDENTIFIED BY "password";

Privilegije koje se mogu dodeliti su

  • ALL— Daje korisniku sva moguća prava (privilegije)
  • ALTER— Korisnik može menjati tabele, kolone i indekse
  • CREATE— Korisnik može kreirati baze i tabele
  • DELETE— Korisnik može brisati zapise iz tabela
  • DROP— Korisnik može brisati (dropovati) tabele i baze
  • FILE— Korisnik može čitati i pisati fajlove, koristi se kod importa ili dampa podataka
  • INDEX— Korisnik može dodavati indekse ili ih brisati
  • INSERT— Korisnik može dodavati zapise u tabele
  • PROCESS— Korisnik može videti i stopirati sistemske procese, samo korisnici kojima se veruje treba da imaju tu mogućnost
  • REFERENCES— Trenutno se ne koristi od MySQL, ali kolona za REFERENCES privilegije postoji u user tabeli
  • RELOAD— Korisnik može izdati FLUSH naredbe; samo od poverenja korisnici
  • SELECT— Korisnici mogu selektovati zapise iz tabela
  • SHUTDOWN— Korisnik može oboriti (shut down) MySQL servera; samo za poverljive
  • UPDATE— Korisnik može ažurirati zapise u tabelama
  • USAGE— Korisnik se može konektovati na MySQL ali nema drugih privilegija

Ako se, na primer, želi kreirati korisnik koji se zove misko sa lozinkom asd321, sa SELECT i INSERT privilegijama na svim tabelama u bazi mojDB, i želite da korisik može pristupiti sa bilo kog hosta, koristi se

GRANT SELECT, INSERT
ON mojDB.*
TO misko@"%"
IDENTIFIED BY "asd321";

Primetimo da se koriste dva wildcard-a (Simbol koji menja jedan ili više ne navedenih karaktera, najčešće se koriste pri pretraživanju teksta ili pri izdvajanju jednog ili više fajlova i/ili foldefa.): * i %. Ovi wildcard-ovi se koriste da zamene vrednosti. U primeru: * menja listu tabela i % menja listu hostova koji postoje u svetu—što je prilično velika lista.

Drugi primer je dodavanje korisnika koristeći GRANT komandu, tako da se novi korisnik zove pera sa lozinkom qay212, sa ALL privilegijama na tabeli zaposleni u bazi mojHR. Ovaj se korisnik može konektovati samo sa specificiranog hosta:

GRANT ALL
ON mojHR.zaposleni
TO pera@b2b.rs
IDENTIFIED BY "qay212";

Ako se zna da b2b.rs ima IP adresu 195.104.41.10, moguće je zameniti adresu u hostname delu komandom:

GRANT ALL
ON mojHR.zaposleni
TO pera@'195.104.41.10'
IDENTIFIED BY "qay212";

Sva imena i ip adrese su izmisljena i nadam se moderna pa je HR od human resource (vrlo popularno ovih dana, mobing i još ponešto iz te oblasti pominjaću vremenom).

Jedna napomena kod dodavanja korisnika: Uvek koristite lozinku i trudite se da ona bude dobra (šta god da znači, a to sam već pominjao)! MySQL omogućava da se kreira korisnik bez lozinke, time se vrata ostavljaju širom otvorena za nekoga sa lošim namerama – a kao sto znamo: Neprijetalj nikad ne miruje.

Ako se izda GRANT komanda za dodavanje korisnika, promene će se odmah primeniti. Neverne Tome mogu izdati FLUSH PRIVILEGES komandu u MySQL monitoru, što dovodi do sigurnog ponovnog učitavanja tabela sa privilegijama.

Skidanje privilegija

Skidanje privilegija je jednostavno kao i dodavanje; umesto GRANT komande, koristi se REVOKE. Sintaksa REVOKE komande je

REVOKE privileges
ON databasename.tablename
FROM username@hostname;

Na isti način kako se može dati pravo izdavanjem INSERT komande ono se može opozvati izdavanjem DELETE komande da bi se izbrisali zapisi iz tabela u mysql bazi. Kao i kod dodavanja potrebne su iste veštine vezane za polja i tabele u mzsql bazi. Budimo iskreni, mnogo je jednostavnije i sigurnije koristiti REVOKE.

Da bi se uskratila mogućnost korisniku mile da INSERT-uje zapise u mojHR bazu, izdaje se sledeća REVOKE naredba:

REVOKE INSERT
ON mojHR.*
FROM mile@"%";
Promene koje se načine nad podacima u tabelama za prava reflektuju se odmah, te da ako niste sigurni u tu tvrdnju FLUSH PRIVILEGES komandu u MySQL monitoru ne može da šteti a kad nešto ne šteti onda sigurno koristi.

Нема коментара:

Постави коментар