MySQL w pigułce #2

logo-mysql

Tworzenie bazy danych

Tworzenie bazy danych jest też prostą sprawą:

mysql> create database moja_baza_danych;

Użytkownicy i przywileje

MySQL pozwala na stworzenie bardzo dużej ilości użytkowników. Na początku administracji serwerem bazodanwym należy pamiętać o tym, że root jest administratorem całej bazy. Warto nadać mu trudne hasło do złamania, które będzie inne od tych co mają inni użytkownicy. Superużytkownika należy wykorzystywać TYLKO do administracji serwerem.

MySQL pozwala na zdefiniowanie przywilejów, jakie będzie posiadał użytkownik. Przywilej to tak jakby prawo dostępu do danego zasobu. Przykład: “osobom po ukończeniu 18 roku życia wolno kupić alkohol”. Przywilejem jest tutaj zakup alkoholu (dostęp do niego).

Minimum przywileju do wykonania zadania!

Warto pamiętać o tej zasadzie w informatyce (nie tylko w bazach danych). Przywileje należy zmniejszać do minimum, ale tak żeby dana operacja została wykonana.

Przywileje

Przywileje nadaje się poleceniem GRANT, a odbiera REVOKE. Istnieją 4 rodzaje/poziomy przywilejów: kolumna, tabela, baza danych oraz poziom globalny.

Składnia:

GRANT przywileje [kolumny] ON obiekt TO uzytkownik [IDENTIFIED BY ‘haslo’] [REQUIRE opcje_ssl’a][WITH [GRANT OPTION | ograniczenia] ]

Pewnie nie wielu osobom coś to mówi, więc wyjaśniam 😉

Wszystko co w nawiasach kwadratowych jest opcjonalne (można użyć, ale nie ma przymusu). Zamiast słowa przywileje używamy któregoś z poniższych, dostępnych w tabeli.

GRANT SELECT ON baza_danych TO uzytkownik IDENTIFIED BY ‘haslo’;

Obiekt to tabel bądź baza danych. Jeżeli chcemy nadać uprawnienia dla wszystkich baz danych w systemie wpisujemy (są to przywileje na poziomie globalnym):

GRANT SELECT ON *.* TO uzytkownik IDENTIFIED BY ‘haslo’;

Jeżeli chcemy działania użytkownika ograniczyć do konkretnej bazy i tabeli to postepujemy następująco:

GRANT SELECT ON baza_danych.tabela TO uzytkownik IDENTIFIED BY ‘haslo’;

Czasami wykorzystuje się stworzonego użytkownika do administrowania innymi użytkownikami. Chodzi tutaj, że jeżeli mamy użytkownika o nazwie “user”, które posiada pełne uprawnienia do bazy “baza_danych” i nadamy mu uprawnienia do tworzenia innych użytkowników, to mamy możliwość zarządzania nimi, ale tylko w obrębie praw nadanych przez użytkownika “user”.

GRANT SELECT ON baza_danych.tabela TO uzytkownik IDENTIFIED BY ‘haslo’ WITH GRANT OPTION;

Przy tworzeniu serwera na hosting przydatną rzeczą jest stworzenie użytkownika, który będzie miał określony zasoby (ilość zapytań, uaktualnień czy połączeń na godzinę).

GRANT SELECT ON baza_danych.tabela TO uzytkownik IDENTIFIED BY ‘haslo’ WITH MAX_QUERIES_PER_HOUR 100;

GRANT SELECT ON baza_danych.tabela TO uzytkownik IDENTIFIED BY ‘haslo’ WITH MAX_UPDATES_PER_HOUR 100;

GRANT SELECT ON baza_danych.tabela TO uzytkownik IDENTIFIED BY ‘haslo’ WITH MAX_CONNECTIONS_PER_HOUR 100;

Ograniczenie ilości połączeń czy zapytań do konkretnej liczby (to już trzeba przetestować jaki wartości najlepiej używać, bo zależy od systemu oraz wielu innych czynników) to bardzo dobra technika na przyspieszenie działania serwera.

Mniej więcej to wygląda w tej sam sposób jak mamy sieć 5 użytkowników na jakimś łączy ADSL i jeden odpali torrenta, emula i Bóg go wie co tam jeszcze (gdzie nie ma QoS). Wówczas reszcie net muli się lub nie działa. W tej akurat sytuacji to procesor i pamięć zapychają się ilościami zapytań i połączeń. Warto pamiętać, że ilość połączeń i zapytań przy projektowaniu systemów bazodanowych należy redukować do minimum i stosować cachowanie zapytań w celu odciążenia bazy danych. Oczywiście nie w każdym wypadku można zredukować ilość zapytań, ale gdzie to możliwe powinniśmy to robić.

Tworzenie użytkownika bez przywilejów

GRANT usage on baza_danych.* TO uzytkownik IDENTIFIED BY ‘haslo’;

Tworzenie użytkownika z kilkoma przywilejami:

GRANT select, insert on baza_danych.* TO uzytkownik IDENTIFIED BY ‘haslo’;

PRZYWILEJ ADMINISTRATORA

Warto pamiętać, że administrator ma pełne możliwości zarządzania użytkownikami i bazami danych. Co za tym idzie ma możliwość podglądania bazy danych “mysql” z listą użytkowników, hasłami itp. Hasła są oczywiście szyfrowane, ale nie zmienia to faktu, że mając przypadkiem hasło root’a mamy dostęp do całej bazy i możemy sobie inwigilować ją bez wiedzy użytkownika lub zmieniać hasła wg własnego uznania.

Ochrona przed tym jest taka, że tworzymy użytkownika o nazwie “admin”, który będzie miał pełny dostęp do wszystkich baz poza mysql. Od tej pory baza staje się bardziej bezpieczna pod warunkiem korzystania z konta root’a, tylko tam gdzie jest to niezbędne.

TABELA PRZYWILEJI DLA UŻYTKOWNIKÓW

Przywilej Możliwości zastosowania Wynik zastosowania
SELECT kolumny, tabele wyszukiwanie rekordów z tabel
INSERT kolumny, tabele dodawanie nowych rekordów do tabeli
DELETE tabele usuwanie rekordów z tabeli
UPDATE kolumny, tabele zmiana rekordu (używać z SELECT)
INDEX tabele dodawanie i usuwanie indeksów w tabelach
ALTER tabele zmiany w strukturze tabeli
CREATE tabele, bazy danych tworzenie nowych tabel, baz danych
DROP tabele, bazy danych usuwanie tabel lub baz danych

Przywileje dla administratorów

Przywileje z poniższej tabeli należy przypisywać wyłącznie administratorom. Przypisywanie ich do zwykłych użytkowników grozi dziurami od strony bezpieczeństwa danych.

Przywilej Możliwości
FILE Wczytanie danych z pliku do tabeli i vice versa (należy ten przywilej z rozwagą nadawać)
CREATE TEMPORARY TABLES Pozwala na używanie słowa kluczowego TEMPORARY w instrukcjach CREATE TABLE
LOCK TABLES Jawne używanie instrukcji LOCK TABLES
PROCESS Śledzenie procesów i przerywanie procesów serwera
RELOAD Przeładowanie tabel dostępowych
REPLICATION CLIENT Używanie instrukcji Show Status na odbiorcach i nadawcach replikacji.
REPLICATION SLAVE Serwery, które są odbiorcami replikacji
SHOW DATABASES Wyświetlanie baz danych
SHUTDOWN Wyłączenie serwera MySQL
SUPER Zabijanie wątków użytkownika
ALL Nadaje wszystkiego przywileje użytkownikowi
USAGE Nie nadaje żadnych przywilejów.

REVOKE

Polecenie REVOKE usuwa przywileje użytkownika. Usunięcie przywilejów jest bardzo proste:

REVOKE ALL PRIVILEGS, GRANT FROM uzytkownik;

Usuwanie użytkownikowi prawa do wpisywania do bazy:

REVOKE insert on baza_danych.* FROM uzytkownik;

UŻYTKOWNICY ZE WZGLĘDU NA ŁĄCZENIE DO BAZY

W celu zabezpieczenia bazy danych przed niepowołanym dostępem można użyć uprawnień, dzięki którym ograniczamy możliwości łączenia się z bazą do określonych hostów czy adresów IP.

Pozostaje więc pytanie czy zapytanie:

GRANT SELECT ON baza_danych.tabela TO uzytkownik IDENTIFIED BY ‘haslo’ WITH MAX_QUERIES_PER_HOUR 100;

jest bezpieczne? Analizować długo nie trzeba 🙂 Wystarczy je wywołać i zajrzeć do tabeli user w bazie mysql. W kolumnie host pojawia się znaczek ‘%’, co oznacza, że do serwera na użytkownika można zalogować się z każdego miejsca na świecie. Jak zabezpieczyć w/w zapytanie? Wystarczy zmienić je:

GRANT SELECT ON baza_danych.tabela TO uzytkownik@localhost IDENTIFIED BY ‘haslo’ WITH MAX_QUERIES_PER_HOUR 100;

Pozwoli to na zablokowanie dostępu tylko dla lokalnego serwera.

Leave a Comment

Your email address will not be published. Required fields are marked *