Kilka podstawowych informacji, zanim zaczniemy:
Źródło:Centrum bezpieczeństwa internetowego (CIS) Oracle MySQL Community Server 5.7
System operacyjny: Windows 10
Gdzie wykonać: wiersz poleceń
mysql -u USERNAME -p
Aplikacja docelowa: Oracle MySQL Community Server 5.7
Audyt i rejestrowanie systemów informatycznych
Logi odgrywają kluczową rolę w bezpieczeństwie, gdy istnieje podejrzenie cyberataku. Ręczny przegląd dzienników jest żmudny dla pracowników ochrony i muszą oni używać narzędzi do przeglądania dzienników, aby wyodrębnić informacje i je przeanalizować. Dzienniki powinny używać technologii przechowywania i szyfrowania WORM (zapisz raz, przeczytaj wiele), aby uniknąć uszkodzenia i utraty danych dziennika. Ponadto logi powinny mieć ustandaryzowany format, aby ułatwić konserwację, dostęp i porównywanie.
Upewnij się, że „log_error” nie jest pusty
polecenie:
SHOW variables LIKE ‘log_error’;
Dzienniki błędów zawierają dane o zdarzeniach podczas uruchamiania lub zatrzymywania mysqld. Pokazuje również, kiedy stół wymaga oceny lub naprawy. Musi generować „wartość”. Powodem włączenia rejestrowania błędów jest to, że pomaga to zwiększyć zdolność wykrywania złośliwych prób przeciwko MySQL i innym ważnym wiadomościom.
Upewnij się, że pliki dziennika są przechowywane na partycji niesystemowej
polecenie:
SELECT @@global.log_bin_basename;
Pliki dziennika MySQL mogą być przechowywane w dowolnym miejscu w systemie plików i ustawiane za pomocą konfiguracji MySQL. Ponadto najlepszą praktyką jest upewnienie się, że dzienniki w systemie plików nie są zaśmiecone innymi dziennikami, takimi jak dzienniki aplikacji. Musisz upewnić się, że zwracana wartość nie wskazuje, że znajduje się w kodzie głównym „('/')”, „/var” lub „/usr”. Powodem tego jest to, że partycjonowanie zmniejszy prawdopodobieństwo odmowy usługi, jeśli miejsce na dysku dostępne dla systemu operacyjnego zostanie wyczerpane.
Upewnij się, że „log_error_verbosity” nie jest ustawione na „1”
polecenie:
SHOW GLOBAL VARIABLES LIKE ‘log_error_verbosity’;
To sprawdzenie dostarcza dodatkowych informacji o tym, jakie funkcje dziennik MySQL ma lub włączył w przypadku komunikatów o błędach. Wartość 1 umożliwia rejestrowanie komunikatów o błędach. Wartość 2 umożliwia zarówno rejestrowanie komunikatów o błędach, jak i ostrzeżeń. Wartość 3 umożliwia rejestrowanie komunikatów o błędach, ostrzeżeniach i uwagach. Pomaga to wykryć złośliwe zachowanie poprzez rejestrowanie błędów komunikacji i przerwanych połączeń.
Upewnij się, że rejestrowanie kontrolne jest włączone
Włączenie rejestrowania inspekcji ma kluczowe znaczenie dla środowiska produkcyjnego dla interaktywnych sesji użytkowników i sesji aplikacji. Dzięki rejestrowaniu audytu pomaga określić, kto co zmienił i kiedy. Może również pomóc w określeniu, co zrobił napastnik, a nawet może być wykorzystany jako dowód w dochodzeniu.
polecenie:
SELECT NAME FROM performance_schema.setup_instruments WHERE NAME LIKE ‘%/alog/%’;
polecenie:
SET GLOBAL general_log = ‘ON’ ;
polecenie: UTWÓRZ UŻYTKOWNIKA „user1”@„localhost” IDENTYFIKOWANEGO HASŁEM „nie tak tajny”;
Ścieżkę dziennika w systemie Windows 10 można znaleźć za pomocą aplikacji Usługi, sprawdzając, czy MySQL działa, i klikając prawym przyciskiem myszy właściwości.
Log w systemie autora znajdował się w:C:\ProgramData\MySQL\MySQL Server 5.7\Data\DJ-JASON-CLARK.log
Uwierzytelnianie systemu informacyjnego
Uwierzytelnianie zapewnia zgodność poświadczeń podanych przez użytkownika lub komputer z bazą danych autoryzowanych użytkowników w lokalnym systemie operacyjnym lub na serwerze uwierzytelniania. Po uwierzytelnieniu następuje autoryzacja, która jest przyznawana przez administratora użytkownikom lub maszynom. Uwierzytelnianiem powszechnie używanym zarówno w sieciach prywatnych, jak i publicznych jest uwierzytelnianie oparte na hasłach.
Upewnij się, że hasła nie są przechowywane w konfiguracji globalnej
Sekcja [client] pliku konfiguracyjnego MySQL umożliwia utworzenie użytkownika i hasła. Sprawdzenie jest ważne, ponieważ zezwolenie użytkownikowi i hasło w pliku konfiguracyjnym negatywnie wpływa na poufność hasła użytkownika.
Aby przeprowadzić audyt, otwórz plik konfiguracyjny MySQL i sprawdź sekcję [client] — nie może być w niej zapisane żadne hasło. W systemie autora nie ustawiono hasła (patrz rysunek poniżej). Jeśli hasło zostało ustawione w pliku konfiguracyjnym, użyj mysql_config_editor do przechowywania haseł w postaci zaszyfrowanej w .mylogin.cnf.
Upewnij się, że „sql_mode” zawiera „NO_AUTO_CREATE_USER”
„no_auto_create_user” to opcja zapobiegająca automatycznemu tworzeniu użytkownika, gdy nie podano informacji uwierzytelniających.
polecenie:
SELECT @@global.sql_mode;
polecenie:
SELECT @@session.sql_mode;
Upewnij się, że hasła są ustawione dla wszystkich kont MySQL
Użytkownik może utworzyć puste hasło. Posiadanie pustego hasła jest ryzykowne, ponieważ każdy może po prostu przyjąć tożsamość użytkownika, wprowadzić login ID użytkownika i połączyć się z serwerem. To omija uwierzytelnianie, co jest złe.
polecenie:
SELECT User,host FROM mysql.user WHERE authentication_string=’’;
Upewnij się, że „default_password_lifetime” jest mniejsze lub równe „90”
Zmiana okresu istnienia hasła do 90 dni skraca czas, w którym atakujący może złamać hasło, a tym samym zmniejsza prawdopodobieństwo, że zostanie zaatakowany.
polecenie:
SHOW VARIABLES LIKE ‘default_password_lifetime’;
polecenie:
SET GLOBAL default_password_lifetime=90;
Upewnij się, że złożoność hasła jest na miejscu
Złożoność hasła zwiększa bezpieczeństwo uwierzytelniania i obejmuje dodawanie lub zwiększanie długości, wielkości liter, cyfr i znaków specjalnych. Im bardziej złożone hasło, tym trudniej atakującym użyć brutalnej siły w celu uzyskania hasła. Słabe hasła można łatwo znaleźć w słowniku haseł.
polecenie:
SHOW VARIABLES LIKE ‘validate_password%’;
Upewnij się, że żaden użytkownik nie ma wieloznacznych nazw hostów
Użytkownicy z nazwami hostów z symbolami wieloznacznymi (%) otrzymują uprawnienia do dowolnej lokalizacji. Najlepiej unikać tworzenia nazw hostów z symbolami wieloznacznymi. Zamiast tego utwórz użytkowników i nadaj im określone lokalizacje, z których dany użytkownik może łączyć się i wchodzić w interakcje z bazą danych.
polecenie:
SELECT user, host FROM mysql.user WHERE host = ‘%’;
Upewnij się, że nie istnieją anonimowe konta
Użytkownicy mogą mieć anonimową (pustą lub pustą) nazwę użytkownika. Te anonimowe nazwy użytkownika nie mają haseł i każdy inny użytkownik może używać tej anonimowej nazwy użytkownika do łączenia się z serwerem MySQL. Usunięcie tych anonimowych kont zapewnia, że tylko zidentyfikowani i zaufani użytkownicy mogą uzyskać dostęp do serwera MySQL.
polecenie:
SELECT user,host FROM mysql.user WHERE user = ‘’;
Połączenie sieciowe z serwerem MySQL
Połączenie sieciowe odgrywa ważną rolę w komunikacji między użytkownikiem a serwerem MySQL. Niezabezpieczone połączenia sieciowe są bardzo podatne na ataki. Poniżej przedstawiono kontrole bezpieczeństwa połączenia sieciowego.
Upewnij się, że „have_ssl” jest ustawione na „TAK”
Aby uniknąć złośliwych napastników zaglądających do twojego systemu, najlepiej używać SLL/TLS dla całego ruchu sieciowego podczas korzystania z niezaufanych sieci.
polecenie:
WHERE variable_name = ‘have_ssl’;
Upewnij się, że „ssl_type” jest ustawiony na „ANY”, „X509”, lub „OKREŚLONY” dla wszystkich zdalnych użytkowników
SSL/TLS należy skonfigurować dla każdego użytkownika. To dodatkowo zapobiega podsłuchiwaniu złośliwych napastników.
polecenie:
SELECT user, host, ssl_type FROM mysql.user WHERE NOT HOST IN (‘::1’, ‘127.0.0.1’, ‘localhost’);
Replikacja
Sprawdzanie stanu replikacji pozwala monitorować wydajność i luki w zabezpieczeniach. Microsoft SQL Server Management Studio posiada następujące narzędzia do monitorowania replikacji:
- wyświetl stan agenta migawki,
- wyświetl stan agenta czytnika dziennika i
- wyświetl stan synchronizacji.
Upewnij się, że ruch replikacji jest zabezpieczony
Replikacja ruch między serwerami musi być zabezpieczony. Podczas transferów replikacji hasła mogą wyciekać.
Aby przeprowadzić audyt, sprawdź, czy używają:sieci prywatnej, VPN, SSL/TLS lub tunelu SSH. Mam nadzieję, że system autora korzysta z sieci prywatnej. Popraw, jeśli nie, i zabezpiecz, korzystając z sieci prywatnej, VPN, SSL/TLS lub tunelu SSH.
Upewnij się, że „MASTER_SSL_VERIFY_SERVER_CERT” jest ustawiony na „YES” lub „1”
„MASTER_SSL_VERIFY_SERVER_CERT” sprawdza, czy replika powinna weryfikować certyfikat podstawowy, czy nie. Replika powinna zweryfikować certyfikat podstawowy, aby uwierzytelnić podstawowy przed kontynuowaniem połączenia.
polecenie:
SELECT ssl_verify_server_cert FROM mysql.slave_master_info;
Upewnij się, że „master_info_repository” jest ustawione na „TABLE”
„master_info_repository” określa, gdzie replika rejestruje stan podstawowy i informacje o połączeniu. Hasło jest przechowywane w głównym repozytorium informacji, które jest zwykłym plikiem tekstowym. Przechowywanie hasła w TABLE master_info jest bezpieczniejsze.
polecenie:
SHOW GLOBAL VARIABLES LIKE ‘master_info_repository’;
Upewnij się, że „super_priv” nie jest ustawione na „Y” dla użytkowników replikacji
Uprawnienie „SUPER” ('super_priv') znajdujące się w tabeli „mysql.user” ma funkcje takie jak „CHANGE”, „MASTER TO”, „KILL”, „mysqladmin kill”, „PURGE BINARY LOGS”, „SET GLOBAL”, „debug mysqladmin” i inne kontrolki rejestrowania. Nadanie użytkownikowi uprawnienia „SUPER” umożliwia mu przeglądanie i kończenie aktualnie wykonywanych instrukcji SQL, nawet w przypadku zarządzania hasłami. Jeśli atakujący wykorzysta i uzyska przywilej „SUPER”, może wyłączyć, zmienić lub zniszczyć dane logowania.
polecenie:
SELECT user, host FROM mysql.user WHERE user=’repl’ and Super_priv = ‘Y’;
Upewnij się, że użytkownicy replikacji nie mają wieloznacznych nazw hostów
MySQL umożliwia nadawanie uprawnień do nazw hostów z symbolami wieloznacznymi. Należy unikać nazw hostów z symbolami wieloznacznymi i należy tworzyć lub modyfikować użytkowników i podawać im określone lokalizacje, z których dany użytkownik może łączyć się i wchodzić w interakcje z bazą danych.
Wniosek
Poniższe kontrole są przeprowadzane dla pojedynczego środowiska pracy używającego MySQL jako systemu informacyjnego zarówno po stronie aplikacji, jak i po stronie użytkownika.
Ocena jest niezbędna do sprawdzenia standardowego rejestrowania MySQL i włączenia dodatkowych funkcji rejestrowania (umożliwia również sprawdzenie pod kątem luk w uwierzytelnianiu). Kontrole sieci są ważne, aby uniemożliwić innym użytkownikom o złych zamiarach zaglądanie do Twojej sieci. Zawsze wdrażaj SSL/TLS do szyfrowania. Konieczne jest zabezpieczenie transferu w jedną stronę. Zabezpieczenie ruchu związanego z replikacją dodaje warstwę ochronną.
Wynik oceny może poinformować Cię, czy system jest w stanie działać na poziomie zaufania.
Dziękuję za przeczytanie mojego bloga! Rozpocząłeś teraz drogę do zabezpieczenia bazy danych MySQL.=)