Zadanie 2: Pierwsze logowanie i zarządzanie użytkownikami

Cel zadania

Głównym celem tego zadania jest dogłębne zapoznanie studenta z fundamentalnymi mechanizmami kontroli dostępu i zarządzania tożsamością w serwerze MySQL/MariaDB. Poza samym procesem pierwszego logowania, zadanie koncentruje się na kluczowym aspekcie bezpieczeństwa, jakim jest prawidłowa konfiguracja konta `root` – najważniejszego użytkownika administracyjnego. Student nauczy się nie tylko, jak ustawić dla niego silne hasło, ale również zrozumie, dlaczego jest to jedna z pierwszych i najważniejszych czynności po instalacji serwera. Co więcej, zadanie to wprowadza niezwykle istotną koncepcję specyfikacji uprawnień w formacie `uzytkownik@host`, wyjaśniając, jak serwer decyduje, czy dany użytkownik może połączyć się z określonego miejsca w sieci. Zrozumienie tej koncepcji jest kluczowe do budowania bezpiecznych i skalowalnych aplikacji, ponieważ pozwala na precyzyjne definiowanie, kto i skąd ma dostęp do cennych danych.

Scenariusz

Kontynuując pracę nad systemem rezerwacji dla hotelu, student zdaje sobie sprawę, że pozostawienie serwera bazy danych w domyślnej, niezabezpieczonej konfiguracji jest niedopuszczalne. Wie, że konto `root` bez hasła stanowi otwarte zaproszenie dla potencjalnych atakujących. Jego pierwszym zadaniem jest więc natychmiastowe "utwardzenie" serwera. Pracując na środowisku Windows z pakietem XAMPP, uruchamia panel kontrolny i wchodzi do konsoli "Shell". Wpisuje polecenie `mysql -u root` i bez problemu loguje się do serwera, co jest dla niego praktycznym dowodem na istnienie luki w zabezpieczeniach. Niezwłocznie przystępuje do działania. Używając polecenia `ALTER USER`, ustawia skomplikowane i unikalne hasło dla użytkownika `root`, ale tylko dla połączeń lokalnych (`'root'@'localhost'`). To jego pierwsza świadoma decyzja dotycząca bezpieczeństwa – ograniczenie dostępu do superużytkownika tylko z tej samej maszyny, na której działa serwer. Po zmianie hasła i przeładowaniu uprawnień za pomocą `FLUSH PRIVILEGES`, wylogowuje się i próbuje zalogować ponownie. Tym razem serwer prosi go o hasło, co potwierdza, że zmiana została pomyślnie zastosowana. Chcąc głębiej zrozumieć mechanizm `uzytkownik@host`, student postanawia przeprowadzić eksperyment. Tworzy nowego użytkownika o nazwie `recepcja`. Najpierw tworzy konto `recepcja@localhost`, które będzie używane przez aplikację działającą na tym samym serwerze. Następnie, na potrzeby przyszłego zdalnego dostępu administracyjnego z jego laptopa w sieci lokalnej, tworzy drugie konto: `recepcja@192.168.1.100`, podając konkretny adres IP. Na koniec, dla celów testowych, tworzy trzecie, bardzo ryzykowne konto `recepcja@'%'`, które pozwala na logowanie z dowolnego miejsca w sieci. Wykonując zapytanie `SELECT User, Host FROM mysql.user;`, widzi teraz trzy różne wpisy dla tego samego użytkownika, ale z różnymi hostami. Aby w pełni zrozumieć, jak działają uprawnienia, nadaje użytkownikowi `recepcja@localhost` bardzo ograniczone prawa, pozwalające jedynie na odczyt i zapis danych w bazie hotelowej (`GRANT SELECT, INSERT, UPDATE ON test_hotel.*`). Natomiast użytkownikowi `recepcja@192.168.1.100` nadaje szersze uprawnienia, włączając w to możliwość modyfikacji struktury tabel. Po zakończeniu eksperymentu, świadomy zagrożeń, usuwa konto `recepcja@'%'`, pozostawiając jedynie te, które są niezbędne i skonfigurowane zgodnie z zasadą najmniejszych uprawnień.

Wykonanie krok po kroku

  1. Pierwsze logowanie (bez hasła)

    W środowisku XAMPP, domyślnie konto `root` nie ma ustawionego hasła. Otwórz konsolę "Shell" z panelu XAMPP i zaloguj się do serwera. Zauważ, że serwer nie poprosi o hasło.

    # Wejście do katalogu z plikami wykonywalnymi MySQL
    cd C:\xampp\mysql\bin
    
    # Logowanie jako użytkownik root
    mysql -u root
    Wyjaśnienie: `cd` to polecenie systemowe do zmiany katalogu. `mysql -u root` uruchamia klienta i loguje się na konto `root`. Brak hasła w domyślnej konfiguracji jest częstą praktyką w środowiskach deweloperskich, ale stanowi poważną lukę bezpieczeństwa.
  2. Ustawienie hasła dla konta `root`

    Będąc zalogowanym w konsoli MySQL, wykonaj poniższe polecenie, aby ustawić bezpieczne hasło. Pamiętaj, aby zastąpić `'TwojeSuperBezpieczneHaslo123!'` własnym, skomplikowanym hasłem.

    -- Modyfikacja użytkownika 'root' dla połączeń z 'localhost'
    ALTER USER 'root'@'localhost' IDENTIFIED BY 'TwojeSuperBezpieczneHaslo123!';
    
    -- Przeładowanie tabel z uprawnieniami, aby zmiany weszły w życie natychmiast
    FLUSH PRIVILEGES;
    Wyjaśnienie: `ALTER USER` to polecenie służące do modyfikacji istniejących kont. `'root'@'localhost'` precyzyjnie wskazuje, którego użytkownika modyfikujemy. `FLUSH PRIVILEGES` jest niezwykle ważne, ponieważ informuje serwer, że musi odświeżyć swoją wewnętrzną pamięć podręczną z uprawnieniami. Bez tego polecenia, serwer mógłby nadal pozwalać na logowanie bez hasła aż do swojego restartu.
  3. Wylogowanie i ponowne logowanie (z hasłem)

    Teraz przetestuj, czy zmiana hasła działa. Najpierw wyloguj się z konsoli, a następnie spróbuj zalogować się ponownie, używając nowego parametru `-p`, który poinformuje klienta, że chcesz podać hasło.

    -- Wylogowanie z konsoli MySQL
    exit;
    
    # Ponowne logowanie, tym razem z prośbą o hasło
    mysql -u root -p
    Wyjaśnienie: `exit` kończy sesję w monitorze MySQL. Parametr `-p` w poleceniu `mysql` powoduje, że klient po nawiązaniu połączenia z serwerem poprosi o interaktywne wprowadzenie hasła. Jest to bezpieczniejsza metoda niż podawanie hasła bezpośrednio w poleceniu.
  4. Analiza istniejących użytkowników

    Po zalogowaniu, warto sprawdzić, jakie konta użytkowników są domyślnie skonfigurowane na serwerze. Można to zrobić, wykonując zapytanie do systemowej tabeli `user` w bazie `mysql`.

    -- Wyświetlenie nazwy użytkownika i hosta dla wszystkich kont w systemie
    SELECT User, Host FROM mysql.user;
    Wyjaśnienie: Wszystkie informacje o użytkownikach, ich hasłach (w postaci zaszyfrowanej) i globalnych uprawnieniach przechowywane są w tabeli `user` w bazie `mysql`. To zapytanie pozwala na szybki audyt, kto i skąd może próbować połączyć się z serwerem.
  5. Tworzenie nowego użytkownika i nadawanie uprawnień

    Zgodnie z zasadą najmniejszych uprawnień, do pracy z aplikacją nie powinno się używać konta `root`. Stwórzmy dedykowane konto `recepcja` i nadajmy mu uprawnienia tylko do bazy `test_hotel`.

    -- Utworzenie nowego użytkownika 'recepcja' dla połączeń lokalnych
    CREATE USER 'recepcja'@'localhost' IDENTIFIED BY 'HasloDlaRecepcji!';
    
    -- Nadanie uprawnień (SELECT, INSERT, UPDATE, DELETE) do wszystkich tabel (*) w bazie 'test_hotel'
    GRANT SELECT, INSERT, UPDATE, DELETE ON test_hotel.* TO 'recepcja'@'localhost';
    
    -- Ponowne przeładowanie uprawnień
    FLUSH PRIVILEGES;
    Wyjaśnienie: `CREATE USER` tworzy nowe konto. `GRANT` jest potężnym poleceniem do zarządzania uprawnieniami. W tym przypadku nadajemy tylko podstawowe uprawnienia CRUD (Create-Read-Update-Delete) do konkretnej bazy danych. Użytkownik `recepcja` nie będzie mógł modyfikować struktury tabel ani uzyskać dostępu do innych baz danych.
  6. Usuwanie użytkownika

    Jeśli konto nie jest już potrzebne, należy je usunąć, aby nie stanowiło potencjalnej luki w bezpieczeństwie.

    -- Usunięcie użytkownika 'recepcja' z hostem 'localhost'
    DROP USER 'recepcja'@'localhost';
    Wyjaśnienie: `DROP USER` trwale usuwa konto użytkownika oraz wszystkie jego uprawnienia z systemowych tabel bazy `mysql`.

Podsumowanie i wnioski

Zarządzanie użytkownikami i ich uprawnieniami jest absolutnym filarem bezpieczeństwa każdej bazy danych. To zadanie w sposób praktyczny pokazało, że domyślna konfiguracja serwera, szczególnie w środowiskach deweloperskich takich jak XAMPP, jest często niezabezpieczona i wymaga natychmiastowej interwencji. Ustawienie silnego hasła dla konta `root` jest pierwszym i najważniejszym krokiem. Jednak prawdziwe bezpieczeństwo zaczyna się od zrozumienia i świadomego stosowania mechanizmu `uzytkownik@host` oraz zasady najmniejszych uprawnień. Kluczowym wnioskiem płynącym z tego ćwiczenia jest to, że nigdy nie należy używać konta `root` do codziennej pracy aplikacji. Zamiast tego, należy tworzyć dedykowane konta dla każdej aplikacji lub użytkownika, nadając im tylko te uprawnienia, które są absolutnie niezbędne do wykonywania ich zadań. Takie podejście, znane jako "defense in depth" (obrona w głąb), znacząco minimalizuje potencjalne szkody w przypadku, gdyby hasło do jednego z kont wpadło w niepowołane ręce. Umiejętność swobodnego posługiwania się poleceniami `CREATE USER`, `ALTER USER`, `GRANT` i `DROP USER` jest fundamentalną kompetencją każdego administratora i dewelopera baz danych.