Lekcja 13. Uprawnienia i bezpieczeństwo — kontrola dostępu w SQL
ŚredniPo co się tego uczymy?
Nie każdy, kto korzysta z bazy danych, powinien móc usuwać tabele albo zmieniać cudze rekordy. System uprawnień pozwala precyzyjnie określić, kto co może robić — to podstawa bezpieczeństwa każdej prawdziwej aplikacji.
Teoria
Uprawnienia (ang. grants) to zestaw reguł określających, kto ma dostęp do bazy danych i co dokładnie może w niej zrobić. Każdy użytkownik ma własne konto w SZBD, a administrator przyznaje mu konkretne prawa.
Najważniejsze uprawnienia w MySQL/MariaDB:
SELECT — pozwala odczytywać dane.
INSERT — pozwala dodawać nowe rekordy.
UPDATE — pozwala zmieniać dane.
DELETE — pozwala usuwać rekordy.
CREATE — pozwala tworzyć tabele lub bazy.
DROP — pozwala usuwać tabele lub bazy.
ALTER — pozwala modyfikować strukturę tabel.
ALL PRIVILEGES — przyznaje wszystkie uprawnienia naraz.
Domyślnie w XAMPP działa konto root z pełnymi prawami — dobre do nauki, ale w prawdziwym projekcie tworzy się osobne, ograniczone konta dla każdej aplikacji czy pracownika. Do zarządzania uprawnieniami służą polecenia CREATE USER, GRANT (nadaje uprawnienie) i REVOKE (odbiera uprawnienie).
Przykład z życia
W firmowej bazie danych księgowa ma prawo tylko odczytywać i dodawać faktury, ale nie może usuwać całych tabel — o to dba administrator bazy danych, nadając jej precyzyjnie dobrane uprawnienia zamiast pełnego dostępu roota.
Kod (SQL)
-- tworzymy nowego użytkownika bazy danych z hasłem
CREATE USER 'marek'@'localhost' IDENTIFIED BY 'haslo123';
-- dajemy mu prawo tylko do odczytu danych z konkretnej bazy
GRANT SELECT ON sklep.* TO 'marek'@'localhost';
-- dajemy innemu użytkownikowi pełne prawa do jednej bazy
CREATE USER 'ania'@'localhost' IDENTIFIED BY 'inneHaslo456';
GRANT ALL PRIVILEGES ON sklep.* TO 'ania'@'localhost';
-- odbieramy uprawnienie do usuwania danych
REVOKE DELETE ON sklep.* FROM 'ania'@'localhost';
-- zapisujemy zmiany uprawnień
FLUSH PRIVILEGES;
Komentarz i wyjaśnienie kodu
Użytkownik marek dostaje wyłącznie SELECT — może przeglądać dane, ale nie zmieni ani nie usunie niczego. Użytkownik ania najpierw dostaje ALL PRIVILEGES, a potem REVOKE odbiera jej konkretnie prawo do DELETE — to pokazuje, że uprawnienia można precyzyjnie dostrajać, dodając i odbierając pojedyncze prawa niezależnie od siebie. FLUSH PRIVILEGES na końcu każe serwerowi bazy danych ponownie wczytać tabele uprawnień, żeby zmiany od razu zaczęły obowiązywać.
Ćwiczenie samodzielne
Utwórz w swoim środowisku (phpMyAdmin/XAMPP) nowego użytkownika z prawem tylko do odczytu jednej wybranej bazy danych i sprawdź (logując się jako ten użytkownik), że rzeczywiście nie może niczego zmienić.
Zadania do pracy własnej
Zadanie 1. Konta użytkowników w sklepie
Uwaga przed importem: plik z bazą jest spakowany jako
.gz. phpMyAdmin w XAMPP przyjmuje takie pliki bez rozpakowywania. Jeżeli po pobraniu nazwa wygląda np.sklep_muzyczny.sql_.gzi import nie przejdzie, zmień nazwę pliku nasklep_muzyczny.sql.gz, a potem wybierz go w zakładce Importuj.Baza do pracy: Sklep muzyczny (.sql.gz). Zaimportuj spakowany plik SQL w XAMPP/phpMyAdmin, a następnie wykonaj zapytania.
- Utwórz użytkownika czytelnik z hasłem testowym.
- Nadaj czytelnikowi tylko SELECT do całej bazy.
- Utwórz użytkownika sprzedawca.
- Nadaj sprzedawcy SELECT i INSERT do tabeli Zamowienia.
- Nadaj sprzedawcy SELECT do tabeli Produkty.
- Odbierz sprzedawcy prawo INSERT.
- Pokaż uprawnienia użytkownika poleceniem SHOW GRANTS.
- Utwórz użytkownika raporty z dostępem tylko do odczytu.
- Wyjaśnij, dlaczego nie nadajemy wszystkim uprawnień ALL PRIVILEGES.
- Usuń konto testowe po zakończeniu ćwiczenia.
Zadanie 2. Role w aptece
Uwaga przed importem: plik z bazą jest spakowany jako
.gz. phpMyAdmin w XAMPP przyjmuje takie pliki bez rozpakowywania. Jeżeli po pobraniu nazwa wygląda np.sklep_muzyczny.sql_.gzi import nie przejdzie, zmień nazwę pliku nasklep_muzyczny.sql.gz, a potem wybierz go w zakładce Importuj.Baza do pracy: Apteka Zdrowie (.sql.gz). Zaimportuj spakowany plik SQL w XAMPP/phpMyAdmin, a następnie wykonaj zapytania.
- Utwórz użytkownika czytelnik z hasłem testowym.
- Nadaj czytelnikowi tylko SELECT do całej bazy.
- Utwórz użytkownika sprzedawca.
- Nadaj sprzedawcy SELECT i INSERT do tabeli Zamowienia.
- Nadaj sprzedawcy SELECT do tabeli Produkty.
- Odbierz sprzedawcy prawo INSERT.
- Pokaż uprawnienia użytkownika poleceniem SHOW GRANTS.
- Utwórz użytkownika raporty z dostępem tylko do odczytu.
- Wyjaśnij, dlaczego nie nadajemy wszystkim uprawnień ALL PRIVILEGES.
- Usuń konto testowe po zakończeniu ćwiczenia.
Zadanie 3. Role w siłowni
Uwaga przed importem: plik z bazą jest spakowany jako
.gz. phpMyAdmin w XAMPP przyjmuje takie pliki bez rozpakowywania. Jeżeli po pobraniu nazwa wygląda np.sklep_muzyczny.sql_.gzi import nie przejdzie, zmień nazwę pliku nasklep_muzyczny.sql.gz, a potem wybierz go w zakładce Importuj.Baza do pracy: Siłownia FitZone (.sql.gz). Zaimportuj spakowany plik SQL w XAMPP/phpMyAdmin, a następnie wykonaj zapytania.
- Utwórz użytkownika czytelnik z hasłem testowym.
- Nadaj czytelnikowi tylko SELECT do całej bazy.
- Utwórz użytkownika sprzedawca.
- Nadaj sprzedawcy SELECT i INSERT do tabeli Zamowienia.
- Nadaj sprzedawcy SELECT do tabeli Produkty.
- Odbierz sprzedawcy prawo INSERT.
- Pokaż uprawnienia użytkownika poleceniem SHOW GRANTS.
- Utwórz użytkownika raporty z dostępem tylko do odczytu.
- Wyjaśnij, dlaczego nie nadajemy wszystkim uprawnień ALL PRIVILEGES.
- Usuń konto testowe po zakończeniu ćwiczenia.
Typowe błędy
Częsty błąd to praca na koncie root na co dzień, nawet przy zwykłym tworzeniu aplikacji — jeśli aplikacja ma błąd (np. podatność SQL injection), osoba atakująca dostaje pełne prawa do całej bazy. Drugi błąd: zapominanie o FLUSH PRIVILEGES po ręcznej zmianie uprawnień w niektórych scenariuszach. Trzeci: nadawanie ALL PRIVILEGES "na wszelki wypadek" zamiast przemyślenia, jakie uprawnienia są faktycznie potrzebne.
Nawiązanie do egzaminu zawodowego
To bezpośrednio efekt INF.03.4.8 ("zarządza systemem bazy danych") — "tworzy użytkowników bazy danych" i "określa uprawnienia dla użytkowników" to jego jawnie wymienione kryteria weryfikacji.