Forum_EduPlus

Pełna wersja: Nadawanie i odbieranie uprawnień GRANT i REVOKE
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Nadawanie uprawnień i ich odbieranie

System uprawnień w MySQL-u pozwala na dokładne zdefiniowanie praw dostępu do określonej bazy, tabeli czy kolumny.

JAK TO DZIAŁA

System uprawnień MySQL-a opiera się na pięciu tabelach znajdujących się w bazie mysql. Poniższy przykład prezentuje ich nazwy:

mysql> use mysql
Database changed
mysql> show tables;

+-----------------+
| Tables_in_mysql |
+-----------------+
| columns_priv |
| db |
| host |
| tables_priv |
| user |
+-----------------+

5 rows in set (0.05 sec)


mysql>

Każda z tych tabel określa uprawnienia użytkownika na innym poziomie dostępu. Tablela db określa dostęp do bazy danych, host definiuje dostęp danych dostów do baz danych, user określa użytkowników całego serwera bazy danych, a tabele tables_priv i columns_priv określają uprawnienia odpowiednio do tabel i do ich kolumn.

TABELA USER

Przyjrzyjmy się teraz bliżej tabeli user, która definiuje użytkowników i ich uprawnienia w naszym systemie. Najpierw spójrzmy na strukturę tej tabeli:

mysql> describe user;

Jak widać ta tabela zawiera pola dla nazwy hosta i użytkownika, hasła oraz listę pól z wartościami N lub Y dla określonych praw.

Jak widać, tabela user zawiera cztery wpisy:
* użytkownik root może zalogować się z localhost, nie podaje hasła, ma uprawnienia do każdej operacji. To właśnie jako ten użytkownik cały czas pracujemy, logując się komendą mysql -u root,
* użytkownik bez zdefiniowanej nazwy, z dowolnego hosta (znak '%' oznacza dowolny adres hosta), nie ma żadnych uprawnień, nie podaje hasła,
* użytkownik bez zdefiniowanej nazwy, z localhost, ma podobnie jak root wszelkie uprawnienia, nie podaje hasła,
* użytkownik root może zalogować się z dowolnego hosta, nie podaje hasła, ma uprawnienia do każdej operacji.

TABELA DB

Przyjrzyjmy się teraz bliżej tabeli db, która określa dostęp do bazy danych. Najpierw spójrzmy na strukturę tej tabeli:

mysql> describe db;

Jak widać, tabela db zawiera jeden wpis:
* użytkownik bez nazwy, ma dostęp z każdego hosta do tabeli test.

TABELA HOST

Przyjrzyjmy się teraz bliżej tabeli host, która dokładniej definiuje przywileje zawarte w tabeli db. Najpierw spójrzmy na strukturę tej tabeli:

mysql> describe host;
Jak widać, tabela host nie zawiera żadnych wpisów, ponieważ nie były jeszcze potrzebne tak dokładnie określone uprawnienia dostępu.

TABELA TABLES_PRIV

Przyjrzyjmy się teraz bliżej tabeli tables_priv, która definiuje przywileje dostępu do określonych tabel, podobnie jak tabela db do baz danych. Najpierw spójrzmy na jej strukturę:

mysql> describe tables_priv;
Jak widać, tabela host nie zawiera żadnych wpisów, ponieważ nie były potrzebne tak dokładnie określone uprawnienia dostępu.

TABELA COLUMNS_PRIV

Przyjrzyjmy się teraz bliżej tabeli columns_priv, która definiuje przywileje dostępu do określonych kolumn w tabelach. Najpierw spójrzmy na strukturę tej tabeli:

mysql> describe columns_priv;

Jak widać, tabela columns_priv nie zawiera żadnych wpisów, ponieważ nie były jeszcze potrzebne tak dokładnie określone uprawnienia dostępu.

Nadawanie uprawnień GRANT

Wszelkie zmiany dotyczące tabel w bazie mysql możesz przeprowadzać za pomocą znanych ci z poprzedniej części kursy poleceń, takich jak select, insert, update czy delete. Możesz również w łatwy sposób zarządzać uprawnieniami za pomocą poleceń GRANT (dodawanie uprawnień) i REVOKE (odbieranie uprawnień).

Na początku ustawmy hasło dla użytkownika root, aby nikt niepowołany nie mógł w łatwy sposób dostać się do serwera baz danych:

mysql> UPDATE user SET Password=PASSWORD('pass') WHERE user='root';
Query OK, 2 rows affected (0.05 sec)
Rows matched: 2 Changed: 2 Warnings: 0

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

mysql>

Za pomocą polecenia UPDATE zmieniliśmy wartość pola Password na nowe hasło, tam gdzie użytkownik jest zdefiniowany jako root (dwa rekordy). Hasła w MySQL kodowane są za pomocą funkcji PASSWORD(), dlatego musisz jej użyć, aby zapisać hasło w tabeli.

Ostatnie polecenie FLUSH PRIVILEGES; przeładowuje uprawnienia. Gdybyśmy tego nie zrobili, zmiany nie byłyby widoczne, root dalej logowałby się bez hasła. Nie musisz odświeżać uprawnień, jeżeli używasz wbudowanych funkcji do obsługi przywilejów:

mysql> SET PASSWORD FOR root=PASSWORD('mypass');
Query OK, 0 rows affected (0.05 sec)

mysql>

Spróbujmy teraz zalogować się do mysql-a z hasłem 'pass':

C:\apache\mysql\bin> mysql -u root -p
Enter password: ****
ERROR 1045: Access denied for user: 'root@localhost' (using password: YES)

C:\apache\mysql\bin>

Jak widać hasło 'pass' nie jest już aktualne, ponieważ zmieniliśmy je na 'mypass' za pomocą funkcji SET PASSWORD...

Spróbujmy zatem jeszcze raz, tym razem podając hasło 'mypass':

C:\apache\mysql\bin> mysql -u root -p
Enter password: ******
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 40 to server version: 3.23.33

Type 'help' for help

mysql>

I spróbujmy jeszcze zalogować się bez hasła, jak dawniej:

C:\apache\mysql\bin> mysql -u root
ERROR 1045: Access denied for user 'root@localhost' (Using password: NO)

C:\apache\mysql\bin>

Jak widać, nasz MySQL jest zabezpieczony hasłem.



Polecenie GRANT

Za pomocą tego polecenia dodajesz uprawnienia dostępu do baz danych, tabel czy kolumn.

Spróbujmy teraz utworzyć nowego użytkownika admin z dostępem do bazy danych nasza_baza i tabeli ksiazka_adresowa:

mysql> GRANT SELECT ON nasza_baza.ksiazka_adresowa TO admin@localhost;
Query OK, 0 rows affected (0.00 sec)

mysql>

Mamy już w tej chwili dostępnego użytkownika admin, który ma prawo wybierać dane z tabeli ksiazka_adresowa z naszej bazy. Ten użytkownik nie ma ustawionego hasła, ale musi logować się z localhost:

c:\apache\mysql\bin> mysql -u admin
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 52 to server version: 3.23.33

Type 'help' for help.

mysql>

Jak widać, nowy użytkownik może się już zalogować. Przetestujmy teraz jego uprawnienia, najpierw na bazie mysql, potem na nasza_baza:

mysql> use mysql
ERROR 1044: Access denied for user: admin@localhost' to database 'mysql'

mysql> use nasza_baza
Database changed

mysql>INSERT INTO ksiazka_adresowa VALUES(0,'Imie','adres','telefon',
'adres@email.pl');
ERROR 1142: insert command denied to user 'admin@localhost' for table 'ksiazka_adresowa'

mysql> select * from ksiazka_adresowa;
Empty set (0.00 sec)

mysql>

Jak wynika z powyższego przykładu, nasz nowy użytkownik nie ma dostępu do bazy mysql. Nie może również dodawać rekordów do tabeli ksiazka_adresowa w naszej bazie. Jedynie polecenie SELECT zostało zakończone sukcesem, bo tylko do tego ma uprawnienia użytkownik admin.

Spróbujmy utworzyć teraz użytkownika admin2 z uprawnieniami do wybierania, dodawania, edycji i usuwania rekordów:

mysql> GRANT SELECT,INSERT,UPDATE,DELETE ON nasza_baza.* TO admin2@localhost;
Query OK, 0 rows affected (0.00 sec)

mysql>

Ten użytkownik ma prawo do wykonywania instrukcji SELECT, INSERT, UPDATE i DELETE na wszystkich tabelach w bazie nasza_baza. Znak * użyty zamiast nazwy tabeli oznacza dostęp do wszystkich tabel.
Oto admin3 z prawem dodawania rekordów we wszystkich bazach danych systemu:

mysql> GRANT INSERT ON *.* TO admin3@localhost;
Query OK, 0 rows affected (0.00 sec)

mysql>

Jak widać, aby zaznaczyć wszystkie bazy danych wraz z towarzyszącymi im tabelami, użyliśmy konstrukcji *.*, co oznacza <dowolna_baza>.<dowolna_tabela>:.

Spróbujmy teraz utworzyć użytkownika admin4 przychodzącego z dowolnego hosta z prawem wybierania rekordów z bazy nasza_baza i dowolnej tabeli:

mysql> GRANT SELECT ON nasza baza.* TO admin4@'%';
Query OK, 0 rows affected (0.00 sec)

mysql>

Jak widać, aby oznaczyć dowolny host, użyliśmy znaku % umieszczonego w cudzysłowach.

Spróbujmy teraz utworzyć użytkownika admin5 ze wszystkimi prawami w bazie nasza_baza i dowolnej tabeli przychodzącego z localhost:

mysql> GRANT ALL PRIVILEGES ON nasza_baza.* TO admin5@localhost;
Query OK, 0 rows affected (0.00 sec)

mysql>

Jak widać, aby zaznaczyć, że chcemy nadać użytkownikowi wszystkie prawa, użyliśmy polecenia ALL PRIVILEGES.

Spróbujmy jeszcze utworzyć takiego użytkownika jak poprzedni, ale z prawem nadawania uprawnień (grantów):

mysql> GRANT ALL PRIVILEGES ON nasza_baza.* TO admin6@localhost WITH GRANT OPTION;
Query OK, 0 rows affected (0.00 sec)

mysql>

Jak widać, aby zaznaczyć, że chcemy nadać wszystkie prawa razem z grantami, użyliśmy polecenia WITH GRANT OPTION.

Spróbujmy teraz utworzyć użytkownika admin7 z dostępem do wszystkich baz danych i tabel, ale z wymaganym hasłem 'haslo':

mysql> GRANT ALL PRIVILEGES ON *.* TO admin7@localhost IDENTIFIED BY 'haslo';
Query OK, 0 rows affected (0.00 sec)

mysql>

Spróbujmy teraz zalogować się na użytkownika admin7, raz bez podania hasła, a następnie z hasłem:

C:\apache\mysql\bin> mysql -u admin7
ERROR 1045: Access denied for user: 'admin7@localhost' (Using password: NO)

C:\apache\mysq\bin> mysql -u admin7 -p
Enter password: *****
Welcome to the MySQl monitor. Commands with ; or \g.
Your MySQL connection id is 78 to server version: 3.23.33

Type 'help' for help.

mysql>

Jak widać hasło dla tego użytkownika jest wymagane.

Spróbujmy jeszcze utworzyć użytkownika admin8 z prawem wybierania pola imie oraz edycji pól adres i email z tabeli ksiazka_adresowa w naszej bazie testowej:

mysql> GRANT SELECT(imie),UPDATE(adres,email) ON nasza_baza.ksiazka_adresowa TO admin8@localhost;
Query OK, 0 rows affected (0.22 sec)

mysql>

Jak widać, aby określić kolumny, na jakich mają działać uprawnienia, wystarczy zapisać je w nawiasach okrągłych występujących po uprawnieniu.



Polecenie REVOKE

Za pomocą tego polecenia usuwasz uprawnienia dostępu do baz danych, tabel czy kolumn.

Spróbujmy teraz usunąć uprawnienia nadane użytkownikowi admin z dostępem do bazy danych nasza_baza i tabeli ksiazka_adresowa:

mysql> REVOKE SELECT ON nasza_baza.ksiazka_adresowa FROM admin@localhost;
Query OK, 0 rows affected (0.05 sec)

mysql>

Jak widać z powyższego przykładu, aby usunąć uprawnienia nadane użytkownikowi, posługujemy się podobną składnią jak przy dodawaniu uprawnień. Różnice są dwie: zamiast słowa GRANT występuje REVOKE, a zamiast TO - FROM.

Spróbujmy sprawdzić, czy rzeczywiście nie mamy dostępu do bazy danych nasza_baza:

C:\apache\mysql\bin> mysql -u admin
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 83 to server version: 3.23.33

Type 'help' for help.

mysql> use nasza_baza
ERROR 1044: Access denied for user: 'admin@localhost' to database 'nasza_baza'

mysql>


Na koniec spróbujmy jeszcze odebrać uprawnienia użytkownikowi admin8:

mysql> REVOKE SELECT(imie),UPDATE(adres,imie) ON nasza_baza.ksiazka_adresowa FROM admin8@localhost;
Query OK, 0 rows affected (0.00 sec)

mysql>

==================KONIEC=====================
Opracowanie: np. strony Bartosz Maciaszek
Przekierowanie