Rozdział 3: Użytkownicy i uprawnienia

Dotychczas logowaliśmy się do bazy danych MySQL jako root. Czyli mieliśmy nieograniczone uprawnienia.

Oznacza to, że mogliśmy tworzyć bazy danych, usuwać, tworzyć w nich tabele. Jednym słowem, wszystko.

Czy w tym momencie zaświeciła się u Ciebie lampka, że jest to niebezpieczne?

Jeśli tak, to bardzo dobrze… Ty na jako root możesz sobie pracować i dodawać do bazy co chcesz, jednak pamiętaj, aby Twój skrypt na tym użytkowniku nie łączył się z bazą.

W tym rozdziale napiszę, jak stworzyć nowych użytkowników, oraz nadać im uprawnienia.

Zalogowaliśmy się już do bazy danych (jak to zrobić przeczytasz pod koniec rozdziału 2).

Tworzenie nowego użytkownika

CREATE USER '{nazwa}'@'{ip}' IDENTIFIED BY '{hasło}';

Wiadomo, że nazwa może być dowolna, ale ip oznacza skąd możemy się logować. Jeśli nasza aplikacja działa na serwerze domowym a baza danych na serwerze zewnętrznym, należy tam wpisać nasze domowe ip.

W ramach nauki sugeruje bazę danych MySQL zainstalować na swoim domowym komputerze i też z tego komputera się logować, wtedy jako ip wystarczy wpisać „localhost”.

Możliwe jest również stworzenie użytkownika w sposób następujący:

CREATE USER '{nazwa}' IDENTIFIED BY '{hasło}';

Jak widzisz powyżej, nie podaliśmy adresu ip, a to oznacza że użytkownik będzie mógł się logować do bazy danych z każdego miejsca/komputera.

Walidacja hasła

Hasło najlepiej jest wygenerować, powinno ono zawierać cyfry, duże oraz małe litery jak również znaki specjalne.

Jeśli jednak denerwuje was to restrykcyjne podejście do „mocy” podawanego hasła, możecie oczywiście to zmienić

Logując się do bazy danych jako root, daj polecenie:

SHOW VARIABLES LIKE 'validate_password%';
+--------------------------------------+--------+
| Variable_name                        | Value  |
+--------------------------------------+--------+
| validate_password_check_user_name    | OFF    |
| validate_password_dictionary_file    |        |
| validate_password_length             | 8      |
| validate_password_mixed_case_count   | 1      |
| validate_password_number_count       | 1      |
| validate_password_policy             | MEDIUM |
| validate_password_special_char_count | 1      |
+--------------------------------------+--------+

Powyższa tabelka to wynik naszego polecenia, możemy się od niej dowiedzieć kilku ciekawych rzeczy, mianowicie dowiemy się, że hasło powinno mieć min 8 znaków. Jeden znak specjalny, jedną cyfrę, jedną dużą literę oraz polityka walidacji mocy hasła jest ustawiona na średnią.

Jeśli męczy Ciebie wymyślanie silnych haseł możesz zmienić powyższe wartości (pamiętaj jednak, aby nie używać prostych haseł na serwerze produkcyjnym, zmniejszamy powyższe wartości tylko na localhost w celach ćwiczeń)

Powyższe wartości możemy zmienić według poniższego wzoru:

SET GLOBAL {nazwa}={wartość};

Przykład który zmieni nam „validate_password_policy” na nową wartość „LOW

SET GLOBAL validate_password_policy=LOW;

Nadawanie uprawnień

Potrafisz już dodawać nowych użytkowników, ale warto było by nadać im jakieś prawa. Być może chciał byś aby użytkownik o pseudonimie „kamil” mógł odczytywać dane z bazy o nazwie „nauka”.

Musimy jako root, stworzyć bazę o nazwie „nauka„. Do tematu tworzenia tabel i baz przejdziemy później, lecz teraz musisz stworzyć bazę oraz tabelę, aby zrozumieć sposób nadawania uprawnień. A więc wpisz kilka poniższych poleceń:

create databases nauka

Użyjmy teraz nowej bazy „nauka”:

use nauka

Stwórzmy wewnątrz bazy „nauka” nową tabelkę.

CREATE TABLE kursy( ID INT NOT NULL, `NAME` VARCHAR (20), PRIMARY KEY (ID));

Na razie z tworzenia nowych baz i tabel to wystarczy. Przejdźmy do najważniejszego, czyli chcemy aby „kamil” po zalogowaniu się widział bazę „nauka” i mógł odczytać z jej wnętrza dane zawarte w tabelce „kursy”.

GRANT SELECT ON nauka.kursy TO 'kamil'@'localhost';

Powyższe polecenie przydziela prawo do odczytu z bazy „nauka” w niej z tabelki „kursy” dla użytkownika „kamil„.

Dlaczego przydziela prawo do odczytu, a nie np do zapisu? Ponieważ w poleceniu napisaliśmy „SELECT” to oznacza odczyt, poniższa tabelka zawiera wszystkie inne prawa jakie możemy nadać użytkownikom

SELECT – odczyt danych
INSERT – wstawianie nowych danych
UPDATE – modyfikacja istniejących rekordów
DELETE – usuwanie danych
REFERENCE – odwoływanie się do innych tabel
CREATE – tworzenie nowych tabel oraz baz danych
DROP – usuwanie istniejących tabel oraz baz danych
ALL PRIVILEGES – przydziela wszystkie uprawnienia

Możemy jednym poleceniem nadać użytkownikowi więcej niż jedno uprawnienie, przykładowo do odczytu zapisu oraz modyfikowania rekordów:

GRANT SELECT, INSERT, UPDATE ON nauka.kursy TO 'kamil'@'localhost';

Cofanie uprawnień użytkownikom

Jeśli przypadkowo nadaliśmy użytkownikowi uprawnienia do tworzenia nowych tabel oraz baz danych. Teraz chcielibyśmy to uprawnienie cofnąć. Wydajemy polecenie analogiczne do nadawania uprawnień, z małą różnicą.

REVOKE CREATE ON nauka.* FROM 'kamil'@'localhost';

Powyżej zmieniłem „nauka.kursy” na „nauka.*” śpieszę wyjaśnić dlaczego.

Gwiazdka znajdująca się w poleceniu powyżej oznacza wszystkie tabelki zawarte w bazie „nauka„. Nie da się przydzielić lub cofnąć uprawnień do tworzenia nowych tabel wpisując „nauka.kursy„, w takim przypadku musimy użyć gwiazdki. Więc, jeśli wpiszemy:

REVOKE SELECT, INSERT ON nauka.* FROM'kamil'@'localhost';

Oznacza to, że „kamil” nie będzie mógł odczytywać danych z żadnej tabelki w bazie „nauka” oraz dodawać nowych rekordów.

Logowanie do bazy

W rozdziale drugim napisałem, jak logować się do bazy, natomiast logowaliśmy się zawsze jako root, jeśli więc chcemy zalogować się jako zwykły użytkownik wpisujemy:

mysql -u {nazwa_uzytkownika} -p

Parametr „p” daje informację do bazy, że chcemy w trakcie logowania wpisać hasło dla użytkownika.

Po wpisaniu powyższego polecenia, zostaniemy poproszeni jeszcze o podanie hasła, to wszystko 🙂