Zadanie 2 - Zarządzanie użytkownikami i uprawnieniami

Cel zadania

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.

Scenariusz / opis zadania

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.

Pomocnik wykonania: Od zera do bezpiecznych kont

Krok 1: Przygotowanie środowiska - Baza danych dla projektu

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');
  

Krok 2: Inspekcja tabeli mysql.user i ustawienie hasła dla roota

Zanim 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;
  
Analiza wyniku:

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.

Krok 3: Tworzenie użytkowników z ograniczonym hostem

Dogłębne wyjaśnienie user@host

Serwer MariaDB/MySQL identyfikuje użytkownika ZAWSZE jako parę nazwa@host. Host określa, skąd przychodzi połączenie.


-- 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';
  

Krok 4: Nadawanie uprawnień – zasada minimum w praktyce

Nowo utworzeni użytkownicy nie mogą nic zrobić poza zalogowaniem się. Teraz nadamy im precyzyjne uprawnienia.

Struktura polecenia GRANT

GRANT [uprawnienie1, uprawnienie2...] ON [poziom_dostepu] TO [uzytkownik];


-- 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;
  

Krok 5: Weryfikacja i odbieranie uprawnień

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;
  
Testowanie uprawnień w praktyce

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
    

Schematy dostępu

Hierarchia uprawnień

+----------------------------------------------------+
| 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')            | | |
|   |   +----------------------------------------+ | |
|   +----------------------------------------------+ |
+----------------------------------------------------+
  

Wizualizacja ról i dostępu

+-----------------+      +--------------------------------+
| Użytkownik      |      | Baza: biblioteka               |
+-----------------+      |                                |
| developer       |----> | +-----------+  +-------------+ |
| @localhost      |      | | ksiazki   |  | czytelnicy  | |
| (ALL PRIVILEGES)|      | | (CRUD)    |  | (CRUD)      | |
+-----------------+      | +-----------+  +-------------+ |
                         +--------------------------------+
+-----------------+                ^
| analyst         |                |
| @192.168.1.%    |----------------+ (tylko SELECT)
| (SELECT only)   |
+-----------------+