Zadanie 3 — Zabezpieczanie serwera baz danych (podstawowa konfiguracja)

Cel zadania

Celem tego ćwiczenia jest nauczenie Cię podstawowych, ale kluczowych kroków w zabezpieczaniu serwera MariaDB/MySQL. Dowiesz się, dlaczego domyślna konfiguracja, zwłaszcza w pakietach takich jak XAMPP, jest niebezpieczna i jakie kroki należy podjąć, aby ją wzmocnić. Nauczysz się usuwać anonimowych użytkowników, ograniczać zdalny dostęp dla konta root oraz pozbywać się testowych baz danych, które mogą stanowić potencjalne zagrożenie.

Scenariusz / opis zadania

Jako administrator nowo zainstalowanego serwera baz danych, Twoim kolejnym zadaniem jest jego "utwardzenie" (ang. hardening). Domyślna instalacja, choć wygodna do nauki, pozostawia otwarte drzwi dla potencjalnych atakujących. Istnieją anonimowe konta użytkowników, które pozwalają na logowanie bez hasła, a konto root może być dostępne z dowolnego miejsca w sieci, co jest ogromnym ryzykiem. Dodatkowo, instalator tworzy testową bazę danych o nazwie test, do której każdy ma dostęp. Twoim zadaniem jest przeprowadzenie audytu bezpieczeństwa i systematyczne eliminowanie tych słabości. W systemach Linux proces ten jest często zautomatyzowany przez skrypt mysql_secure_installation. Na Windows w XAMPP musisz wykonać te kroki manualnie, co da Ci lepsze zrozumienie, co dzieje się "pod maską". Prześledzisz listę użytkowników, zidentyfikujesz i usuniesz niepotrzebne konta, a następnie sprawdzisz, czy zdalne logowanie dla root jest wyłączone. Na koniec usuniesz zbędną bazę testową. Zmodyfikujesz również plik konfiguracyjny my.ini, aby na stałe zablokować niektóre niebezpieczne opcje, takie jak możliwość ładowania plików z dowolnej lokalizacji.

Pomocnik wykonania

  1. Zaloguj się jako root: Otwórz konsolę cmd.exe, przejdź do katalogu C:\xampp\mysql\bin i zaloguj się na konto roota: mysql -u root -p.
  2. Wyświetl listę użytkowników: Zanim zaczniesz, zobacz, jakie konta istnieją w systemie. Wykonaj zapytanie:
    SELECT User, Host FROM mysql.user;
    Zwróć uwagę na użytkowników z pustą nazwą (anonimowych) lub z hostem %.
  3. Identyfikacja anonimowych użytkowników: W niektórych starszych instalacjach MySQL/MariaDB tworzeni byli anonimowi użytkownicy. Są to konta z pustą nazwą użytkownika (''@'localhost'). W nowszych wersjach XAMPP zazwyczaj ich nie ma, ale zawsze warto to sprawdzić.
  4. Usuwanie anonimowych użytkowników: Jeśli zidentyfikowałeś takie konta, usuń je poleceniem DROP USER.
    DROP USER ''@'localhost';
  5. Sprawdzenie zdalnego dostępu dla roota: Upewnij się, że użytkownik root nie może logować się z żadnego innego hosta niż localhost lub 127.0.0.1. Jeśli na liście użytkowników widzisz wpis 'root'@'%', jest to bardzo niebezpieczne.
  6. Ograniczenie dostępu dla roota: Jeśli istnieje zdalny dostęp dla roota, usuń to konto:
    DROP USER 'root'@'%';
    Prawidłowo skonfigurowany serwer powinien pozwalać na logowanie roota tylko z lokalnej maszyny.
  7. Weryfikacja hasła dla roota: Upewnij się, że konto 'root'@'localhost' ma ustawione hasło. Zrobiliśmy to w poprzednim zadaniu, ale zawsze warto to sprawdzić. Możesz to zweryfikować, próbując zalogować się bez hasła.
  8. Lokalizacja testowej bazy danych: Domyślnie, serwer tworzy bazę danych o nazwie test, która jest dostępna dla każdego. Wyświetl listę baz, aby ją zlokalizować:
    SHOW DATABASES;
  9. Usuwanie testowej bazy danych: Jeśli baza test istnieje na liście, usuń ją:
    DROP DATABASE test;
  10. Usuwanie uprawnień do bazy testowej: Czasem oprócz bazy test istnieją też uprawnienia do niej przypisane. Można je usunąć.
    DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%';
  11. Przeładowanie uprawnień: Po wszystkich zmianach, koniecznie odśwież uprawnienia:
    FLUSH PRIVILEGES;
  12. Edycja pliku konfiguracyjnego my.ini: Otwórz Panel Kontrolny XAMPP, kliknij przycisk Config przy module MySQL i wybierz my.ini. Plik otworzy się w Notatniku.
  13. Znajdź sekcję [mysqld]: W pliku my.ini odszukaj sekcję oznaczoną jako [mysqld].
  14. Dodaj dyrektywę bind-address: Aby mieć pewność, że serwer nasłuchuje tylko na lokalnym adresie, dodaj lub odkomentuj (usuń # na początku linii) i ustaw następującą linię. To uniemożliwi połączenia z innych komputerów w sieci.
    bind-address = 127.0.0.1
  15. Restart serwera MySQL: Zapisz zmiany w pliku my.ini. Aby zmiany weszły w życie, musisz zrestartować serwer MySQL. W Panelu Kontrolnym XAMPP kliknij Stop, a następnie Start.
  16. Skrypt mysql_secure_installation (Linux): W systemach Linux, wszystkie powyższe kroki (i kilka dodatkowych) można wykonać za pomocą interaktywnego skryptu. Uruchamia się go poleceniem sudo mysql_secure_installation. Skrypt zadaje serię pytań, m.in. o ustawienie hasła roota, usunięcie anonimowych użytkowników, wyłączenie zdalnego logowania roota i usunięcie bazy testowej.

Przykłady kodu i poleceń

Poniżej znajdziesz polecenia SQL do wykonania w monitorze MySQL w celu zabezpieczenia serwera.

-- Krok 1: Sprawdzenie listy uzytkownikow
SELECT User, Host FROM mysql.user;

-- Krok 2: Usuniecie anonimowych uzytkownikow (jesli istnieja)
-- To polecenie moze zwrocic blad, jesli uzytkownik nie istnieje.
DROP USER IF EXISTS ''@'localhost';

-- Krok 3: Usuniecie zdalnego dostepu dla roota (jesli istnieje)
DROP USER IF EXISTS 'root'@'%';

-- Krok 4: Usuniecie testowej bazy danych (jesli istnieje)
DROP DATABASE IF EXISTS test;

-- Krok 5: Usuniecie uprawnien do bazy testowej
DELETE FROM mysql.db WHERE Db IN ('test', 'test\\_%');

-- Krok 6: Przeladowanie uprawnien
FLUSH PRIVILEGES;
    

Ilustracja konsoli

+---------------------------------------------------+
|                                                   |
|   MariaDB [(none)]> SHOW DATABASES;               |
|   +--------------------+                          |
|   | Database           |                          |
|   +--------------------+                          |
|   | information_schema |                          |
|   | mysql              |                          |
|   | performance_schema |                          |
|   | phpmyadmin         |                          |
|   | test               |                          |
|   +--------------------+                          |
|   5 rows in set (0.001 sec)                       |
|                                                   |
|   MariaDB [(none)]> DROP DATABASE test;           |
|   Query OK, 0 rows affected (0.002 sec)           |
|                                                   |
+---------------------------------------------------+
    

Informacje dodatkowe / uwagi