Acordarea privilegiilor
In cadrul sistemului MySQL, instructiunea GRANT permite acordarea de privilegii utilizatorilor. Pentru a utiliza aceasta instructiune este necesar privilegiul GRANT OPTION. Prin intermediul instructiunii GRANT, un utilizator poate acorda doar privilegiile pe care le detine.
Pentru instructiunea GRANT poate fi utilizata urmatoarea sintaxa:
GRANT tip_privilegiu [(lista_coloane)] [, tip_privilegiu [(lista_coloane)]] ... ON [tip_obiect] nivel_privilegii TO nume_utilizator [IDENTIFIED BY 'parola'] [, nume_utilizator [IDENTIFIED BY 'parola']] ... [WITH GRANT OPTION]
In mod normal, instructiunea CREATE USER este utilizata pentru a crea un cont pe serverul de baze de date, in timp ce GRANT este utilizata pentru a acorda privilegii. Totusi, pentru versiunile mai vechi ale sistemului de baze de date MySQL instructiunea GRANT permite si crearea contului pentru un utilizator, daca la acordarea privilegiilor contul nu a fost inca creat.
Clauza ON permite introducerea nivelului de privilegii: global, database, table, column, stored routine. Specifica numele unei baze de date, tabele sau obiect stocat pentru care sunt stabilite privilegiile. La nivelul acestei clauze poate fi precizat si un tip al obiectului pentru care sunt stabilite privilegiile; valori posibile: TABLE, FUNCTION sau PROCEDURE.
Daca pentru clauza TO este specificata o valoare, aceasta trebuie sa corespunda unui utilizator definit la nivelul sistemului de gestiune a bazelor de date (user_name@host_name).
Daca este prezenta clauza WITH GRANT OPTION, utilizatorul nou creat are posibilitatea de a delega propriile privilegii unor alti utilizatori. Aceasta clauza poate fi utilizata pentru a delega dreptul de administrare, inclusiv creare de utilizatori.
Nivel privilegii | Sintaxa | Semnificatie |
---|---|---|
global | *.* | se aplica tuturor bazelor de date existente pe server |
database | baza_date.* | se aplica tuturor tabelelor dintr-o baza de date |
table | baza_date.tabel | se aplica tuturor coloanelor dintr-o tabela |
column | baza_date.tabel | se aplica doar coloanelor specificate explicit |
stored routine | baza_date.rutina | se aplica unei rutine (procedura, functie) dintr-o baza de date |
Nivelul de privilegii global poate fi precizat prin *.*, cu semnificatia de toate tabelele de la nivelul tuturor bazelor de date.
mysql> GRANT -> SELECT, INSERT -> ON *.* -> TO 'airman'@'uncoded.ro'; Query OK, 0 rows affected
Nivelul database poate fi specificat prin baza_date.*. si are in vedere toate tabelele dintr-o baza de date.
mysql> GRANT -> SELECT, INSERT -> ON `sakila`.* -> TO 'airman'@'uncoded.ro'; Query OK, 0 rows affected
Nivelul table poate fi specificat prin baza_date.tabel. Daca se specifica doar numele unui tabel, se va interpreta ca fiind un tabel din baza de date activa.
mysql> GRANT -> SELECT, INSERT -> ON `sakila`.`actor` -> TO 'airman'@'uncoded.ro'; Query OK, 0 rows affected
Stabilirea privilegiilor la nivel de coloane are in vedere precizarea pentru fiecare tip de privilegiu a unei liste de coloane de la nivelul unui tabel al unei baze de date.
mysql> GRANT -> SELECT (`actor_id`, `first_name`, `last_name`), -> INSERT (`first_name`, `last_name`) -> ON `sakila`.`actor` -> TO 'airman'@'uncoded.ro'; Query OK, 0 rows affected
Nivelul de privilegii stored routine poate fi specificat prin baza_date.rutina, unde rutina reprezinta o functie sau procedura stocata la nivelul bazei de date.
mysql> GRANT -> EXECUTE -> ON PROCEDURE `sakila`.`film_actors` -> TO 'airman'@'uncoded.ro'; Query OK, 0 rows affected
Verificarea privilegiilor
Pentru a vizualiza privilegiile unui utilizator este necesara instructiunea SHOW GRANTS, cu urmatoarea sintaxa generala:
SHOW GRANTS [FOR nume_utilizator]
mysql> SHOW GRANTS -> FOR 'airman'@'uncoded.ro'; +---------------------------------------------------------------------------------------------------------------------------------------+ | Grants for airman@uncoded.ro | +---------------------------------------------------------------------------------------------------------------------------------------+ | GRANT USAGE ON *.* TO `airman`@`uncoded.ro` | | GRANT SELECT (`actor_id`, `first_name`, `last_name`), INSERT (`first_name`, `last_name`) ON `sakila`.`actor` TO `airman`@`uncoded.ro` | | GRANT EXECUTE ON PROCEDURE `sakila`.`film_actors` TO `airman`@`uncoded.ro` | +---------------------------------------------------------------------------------------------------------------------------------------+ 3 rows in set
Pentru a lista privilegiile detinute de utilizatorul curent poate fi utilizata una din urmatoarele sintaxe:
SHOW GRANTS; SHOW GRANTS FOR CURRENT_USER; SHOW GRANTS FOR CURRENT_USER();
Stabilirea sau modificarea parolei pentru un utilizator poate fi realizata prin intermediul instructiunii SET PASSWORD, care are urmatoarea sintaxa:
SET PASSWORD [FOR nume_utilizator] = {'parola' | PASSWORD('parola')}
mysql> SET PASSWORD -> FOR 'airman'@'uncoded.ro' = 'parola'; Query OK, 0 rows affected
Retragerea privilegiilor
Instructiunea REVOKE permite administratorilor unui sistem de gestiune a bazelor de date sa retraga privilegii de la utilizatori. Pentru a utiliza aceasta instructiune este necesar privilegiul CREATE USER sau privilegiu UPDATE pentru baza de date mysql.
Pentru instructiunea REVOKE pot fi utilizate urmatoarele sintaxe in cadrul sistemelor de tip MySQL:
REVOKE tip_privilegiu [(lista_coloane)] [, tip_privilegiu [(lista_coloane)]] ... ON [tip_obiect] nivel_privilegii FROM nume_utilizator [, nume_utilizator] ...
REVOKE ALL [PRIVILEGES], GRANT OPTION FROM nume_utilizator [, nume_utilizator] ...
Clauzele corespunzatoare instructiunii REVOKE au aceleasi semnificatii ca si in cazul instructiunii GRANT. Cea de-a doua forma a instructiunii REVOKE permite retragerea tuturor privilegiilor de la un utilizator.
mysql> REVOKE -> SELECT (`actor_id`, `first_name`, `last_name`), -> INSERT (`first_name`, `last_name`) -> ON `sakila`.`actor` -> FROM 'airman'@'uncoded.ro'; Query OK, 0 rows affected
mysql> SHOW GRANTS -> FOR 'airman'@'uncoded.ro'; +----------------------------------------------------------------------------+ | Grants for airman@uncoded.ro | +----------------------------------------------------------------------------+ | GRANT USAGE ON *.* TO `airman`@`uncoded.ro` | | GRANT EXECUTE ON PROCEDURE `sakila`.`film_actors` TO `airman`@`uncoded.ro` | +----------------------------------------------------------------------------+ 2 rows in set
mysql> REVOKE -> EXECUTE -> ON PROCEDURE `sakila`.`film_actors` -> FROM 'airman'@'uncoded.ro'; Query OK, 0 rows affected
Instructiunea REVOKE retrage privilegii, dar nu sterge inregistrari din tabelul mysql.user. Pentru a sterge un cont de utilizator este necesara instructiunea DROP USER.
mysql> SHOW GRANTS -> FOR 'airman'@'uncoded.ro'; +---------------------------------------------+ | Grants for airman@uncoded.ro | +---------------------------------------------+ | GRANT USAGE ON *.* TO `airman`@`uncoded.ro` | +---------------------------------------------+ 1 row in set