Celem tego zaawansowanego ćwiczenia jest dogłębne zrozumienie systemu zarządzania użytkownikami i kontroli dostępu w MariaDB/MySQL. Nauczysz się nie tylko tworzyć użytkowników i nadawać im uprawnienia, ale także zrozumiesz, jak działa system uprawnień na różnych poziomach (globalnym, bazy danych, tabeli), co oznaczają poszczególne przywileje oraz jak stosować zasadę minimalnych uprawnień w praktyce. Zgłębisz koncepcję user@host i jej implikacje dla bezpieczeństwa serwera.
Po udanej instalacji serwera, Twoim zadaniem jest teraz profesjonalne przygotowanie go do pracy w zespole deweloperskim. Domyślna konfiguracja z użytkownikiem root bez hasła jest niedopuszczalna nawet w środowisku lokalnym. Musisz nie tylko ustawić silne hasło dla administratora, ale także stworzyć dedykowane konta dla różnych ról w projekcie. Utworzysz konto dla dewelopera, który będzie miał pełne prawa do bazy projektowej, oraz konto analityka, który będzie mógł jedynie odczytywać dane z konkretnych tabel. Krok po kroku przeanalizujesz, jakie uprawnienia są niezbędne dla każdej z tych ról, unikając przyznawania nadmiarowych przywilejów. Zrozumiesz, jak serwer przechowuje informacje o użytkownikach w systemowej bazie mysql i jak polecenia GRANT i REVOKE modyfikują te dane. To zadanie nauczy Cię myśleć o bezpieczeństwie i zarządzaniu dostępem w sposób, który jest fundamentem stabilnych i bezpiecznych systemów bazodanowych.
Zanim zaczniemy tworzyć użytkowników, stwórzmy bazę danych, na której będą pracować. Zaloguj się jako root i wykonaj poniższe polecenia.
-- Tworzymy bazę danych o nazwie 'biblioteka' z odpowiednim kodowaniem znaków
CREATE DATABASE biblioteka CHARACTER SET utf8mb4 COLLATE utf8mb4_polish_ci;
-- Przełączamy się na nową bazę
USE biblioteka;
-- Tworzymy przykładowe tabele
CREATE TABLE ksiazki (id INT PRIMARY KEY AUTO_INCREMENT, tytul VARCHAR(255), autor VARCHAR(255));
CREATE TABLE czytelnicy (id INT PRIMARY KEY AUTO_INCREMENT, imie VARCHAR(100), nazwisko VARCHAR(150));
-- Wstawiamy dane
INSERT INTO ksiazki (tytul, autor) VALUES ('Lalka', 'Bolesław Prus'), ('Pan Tadeusz', 'Adam Mickiewicz');
INSERT INTO czytelnicy (imie, nazwisko) VALUES ('Jan', 'Kowalski'), ('Anna', 'Nowak');
  
  mysql.user i ustawienie hasła dla rootaZanim cokolwiek zmienisz, zobaczmy, jak serwer przechowuje informacje o użytkownikach.
-- Wyświetl kluczowe kolumny z tabeli, gdzie przechowywani są użytkownicy
SELECT User, Host, Password, plugin FROM mysql.user;
  
  root@localhost to nie to samo co root@127.0.0.1!mysql_native_password to standardowy mechanizm hashowania. W systemach Linux często domyślnie dla roota jest unix_socket, co pozwala logować się bez hasła z poziomu systemowego użytkownika root.Teraz ustawmy hasło dla root. Użyj silnego, unikalnego hasła.
-- Zmień 'TwojeSuperSilneHaslo123!' na własne
ALTER USER 'root'@'localhost' IDENTIFIED BY 'TwojeSuperSilneHaslo123!';
FLUSH PRIVILEGES;
  
  Wyloguj się (exit;) i zaloguj ponownie, używając mysql -u root -p. System poprosi o podanie hasła.
user@hostSerwer MariaDB/MySQL identyfikuje użytkownika ZAWSZE jako parę nazwa@host. Host określa, skąd przychodzi połączenie.
'user'@'localhost': Zezwala na połączenie tylko przez gniazdo (socket) Unixa lub nazwaną potokę Windows. Jest to najbezpieczniejsza i najszybsza metoda dla aplikacji działających na tej samej maszynie co serwer.'user'@'127.0.0.1': Zezwala na połączenie tylko przez interfejs pętli zwrotnej (loopback) TCP/IP. Aplikacja łączy się z adresem IP, nawet jeśli jest na tej samej maszynie.'user'@'192.168.1.100': Zezwala na połączenie tylko z konkretnego adresu IP w sieci lokalnej.'user'@'192.168.1.%': Znak % działa jak symbol wieloznaczny. To ustawienie zezwala na połączenie z dowolnego hosta w podsieci 192.168.1.x.'user'@'%': NAJNIEBEZPIECZNIEJSZE. Zezwala na połączenie z DOWOLNEGO miejsca. Używaj tylko, jeśli jest to absolutnie konieczne i ruch jest filtrowany przez firewall.
-- Konto dla dewelopera, dostęp tylko z lokalnej maszyny
CREATE USER 'developer'@'localhost' IDENTIFIED BY 'DevPass!456';
-- Konto dla analityka, dostęp z dowolnego komputera w sieci lokalnej 192.168.1.x
CREATE USER 'analyst'@'192.168.1.%' IDENTIFIED BY 'AnalystSecure789';
  
  Nowo utworzeni użytkownicy nie mogą nic zrobić poza zalogowaniem się. Teraz nadamy im precyzyjne uprawnienia.
GRANTGRANT [uprawnienie1, uprawnienie2...] ON [poziom_dostepu] TO [uzytkownik];
SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER, DROP, ALL PRIVILEGES (wszystkie).*.* - Globalnie, na wszystkie bazy danych (bardzo niebezpieczne).nazwa_bazy.* - Na wszystkie tabele w konkretnej bazie.nazwa_bazy.nazwa_tabeli - Tylko na jedną, konkretną tabelę.
-- Deweloper dostaje pełne prawa, ale TYLKO do bazy 'biblioteka'
GRANT ALL PRIVILEGES ON biblioteka.* TO 'developer'@'localhost';
-- Analityk dostaje prawo TYLKO do odczytu (SELECT) i TYLKO z tabel 'czytelnicy' i 'ksiazki'
GRANT SELECT ON biblioteka.czytelnicy TO 'analyst'@'192.168.1.%';
GRANT SELECT ON biblioteka.ksiazki TO 'analyst'@'192.168.1.%';
-- Zawsze na końcu odświeżamy uprawnienia, aby serwer je "zauważył"
FLUSH PRIVILEGES;
  
  Sprawdźmy, czy uprawnienia zostały nadane poprawnie.
-- Pokaż uprawnienia dla dewelopera
SHOW GRANTS FOR 'developer'@'localhost';
-- Wynik: GRANT ALL PRIVILEGES ON `biblioteka`.* TO `developer`@`localhost`
-- Pokaż uprawnienia dla analityka
SHOW GRANTS FOR 'analyst'@'192.168.1.%';
-- Wynik: GRANT SELECT ON `biblioteka`.`czytelnicy` TO ...
-- Wynik: GRANT SELECT ON `biblioteka`.`ksiazki` TO ...
  
  Załóżmy, że analityk nie powinien już mieć dostępu do tabeli czytelnicy. Odbieramy mu to uprawnienie.
REVOKE SELECT ON biblioteka.czytelnicy FROM 'analyst'@'192.168.1.%';
FLUSH PRIVILEGES;
  
  Najlepszym sposobem na weryfikację jest zalogowanie się jako dany użytkownik i próba wykonania dozwolonych i niedozwolonych operacji.
# Zaloguj się jako analityk (z komputera o IP w puli 192.168.1.x)
mysql -u analyst -p -h 192.168.1.100
> USE biblioteka;
> SELECT * FROM ksiazki;    -- POWINNO ZADZIAŁAĆ
> SELECT * FROM czytelnicy; -- BŁĄD: Access denied
> DELETE FROM ksiazki;      -- BŁĄD: Access denied
    
  +----------------------------------------------------+ | Poziom GLOBALNY (*.*) - np. `GRANT SUPER...` | | (Tylko dla `root` i kont administracyjnych) | | | | +----------------------------------------------+ | | | Poziom BAZY DANYCH (`biblioteka`.*) | | | | (Uprawnienia dla 'developer') | | | | | | | | +----------------------------------------+ | | | | | Poziom TABELI (`biblioteka.ksiazki`) | | | | | | (Uprawnienia dla 'analyst') | | | | | +----------------------------------------+ | | | +----------------------------------------------+ | +----------------------------------------------------+
+-----------------+      +--------------------------------+
| Użytkownik      |      | Baza: biblioteka               |
+-----------------+      |                                |
| developer       |----> | +-----------+  +-------------+ |
| @localhost      |      | | ksiazki   |  | czytelnicy  | |
| (ALL PRIVILEGES)|      | | (CRUD)    |  | (CRUD)      | |
+-----------------+      | +-----------+  +-------------+ |
                         +--------------------------------+
+-----------------+                ^
| analyst         |                |
| @192.168.1.%    |----------------+ (tylko SELECT)
| (SELECT only)   |
+-----------------+