Za każdym razem, gdy wspomina się o bezpieczeństwie aplikacji, ludzie myślą o zabezpieczeniu aplikacji przed niektórymi z najczęstszych ataków, takich jak wstrzyknięcie, zepsute uwierzytelnianie, ujawnienie poufnych danych i tym podobne. Jednak chociaż te ataki są powszechne, wiedza o tym, jak chronić swoją aplikację przed samymi nimi, nie wystarczy – zwłaszcza, gdy korzystasz z MySQL. Dzisiaj przyjrzymy się innej stronie bezpieczeństwa - przyjrzymy się, jak właściwie zabezpieczyć MySQL.
Ponieważ bezpieczeństwo MySQL to dość duża rzecz, potraktuj ten post jako początek serii postów dotyczących środków bezpieczeństwa MySQL. Nie omówimy wszystkiego, ale ten post powinien stanowić podstawę niektórych środków bezpieczeństwa MySQL.
Dlaczego musisz zabezpieczyć MySQL?
Przede wszystkim musimy odpowiedzieć na pytanie, dlaczego chcielibyśmy zabezpieczyć MySQL. W końcu, jeśli zabezpieczymy naszą aplikację przed najbardziej rozpowszechnionymi zagrożeniami, powinniśmy być bezpieczni, prawda? Cóż, tak i nie.
Widzisz, gdy zabezpieczasz swoją aplikację przed niektórymi atakami, upewniasz się, że atakującym trudniej przebić się przez zabezpieczenia Twojej aplikacji - w celu zabezpieczenia bazy danych ochrona przed takimi atakami nie wystarczy. Zabezpieczenie bazy danych może być ostatnią kroplą, która może uratować Twoją aplikację (i bazę danych!) przed zniszczeniem.
Jak zabezpieczyć MySQL?
Teraz przejdźmy do palącego pytania. Jak właściwie zabezpieczasz MySQL?
Myśląc o bezpieczeństwie instancji MySQL, powinieneś rozważyć szeroki zakres możliwych opcji. Na szczęście niektóre z tych opcji nie ograniczają się nawet do MySQL, co oznacza, że będą miały zastosowanie również w innych scenariuszach! Zaczniemy od spraw ogólnych.
Bezpieczeństwo MySQL - Ogólne
Podczas zabezpieczania MySQL należy pamiętać, że używa on opartych na zabezpieczeniach list kontroli dostępu (ACL) dla operacji wykonywanych przez użytkowników (listy kontroli dostępu to lista uprawnień związanych z obiektem). Oto jak rozwiązać kilka podstawowych problemów związanych z bezpieczeństwem:
- Zabezpiecz początkowe konto MySQL - jest to bardzo oczywiste, ale powinieneś upewnić się, że konto root ma hasło. Konto root może, ale nie musi mieć hasła podczas pierwszej instalacji MySQL - możesz dowiedzieć się, jakie jest hasło, sprawdzając dziennik błędów, a następnie zmień je na silniejsze, jeśli chcesz. Wszystkie inne konta również powinny mieć hasła.
- Nigdy nie przechowuj haseł w żadnej bazie danych MySQL w postaci zwykłego tekstu — używaj jednokierunkowej funkcji mieszającej, takiej jak BCrypt.
- Nie udzielaj żadnym użytkownikom dostępu do tabeli użytkowników w bazie danych mysql (użytkownik root jest wyjątkiem).
Zapoznaj się również z kontrolą dostępu i zarządzaniem kontem w MySQL. Ten temat sam w sobie zasługuje na całą książkę, ale podstawowe rzeczy, które powinieneś wiedzieć, to:
- Kontrolowanie dostępu w MySQL;
- Tworzenie, zmienianie i usuwanie użytkowników;
- Przyznawanie i odbieranie uprawnień użytkownikom i użytkownikom;
- Wiedza, jak sprawdzić, jakie uprawnienia są przypisane;
- Jakie są kategorie kont;
- Co to są konta zastrzeżone;
- Jakie są role;
- Jak działa zarządzanie hasłami;
- Jak działa blokowanie konta;
- Rzut oka na wtyczki bezpieczeństwa oferowane przez MySQL;
- Wiedza, jak zabezpieczyć kopie zapasowe MySQL.
Jeśli chodzi o bezpieczeństwo MySQL, należy uwzględnić również kopie zapasowe.
Teraz przyjrzymy się bliżej każdej z tych opcji.
Kontrola dostępu w MySQL
- Jak już wspomniano powyżej, nigdy nie udzielaj żadnemu kontu, z wyjątkiem konta root, dostępu do tabeli użytkowników w bazie danych mysql;
- Upewnij się, że wszystkie istniejące konta MySQL używają tylko tych uprawnień, których bezwzględnie potrzebują do wykonywania swoich działań.
Tworzenie, zmienianie i usuwanie użytkowników w MySQL
W MySQL użytkowników można tworzyć, uruchamiając zapytanie CREATE USER:
CREATE USER ‘demouser’@’localhost’ IDENTIFIED BY ‘password’;
Użytkowników można zmieniać, uruchamiając zapytanie ALTER USER - zapytanie pozwala na wiele różnych rzeczy, w tym blokowanie i odblokowywanie kont, wymaganie połączenia konta za pomocą SSL, ustanawianie maksymalnej liczby połączeń na godzinę, odrzucanie starych haseł itp. Oto przykładowe zapytanie, które może zmienić Twoje hasło:
ALTER USER USER() IDENTIFIED BY ‘password’;
Użytkowników można usunąć, uruchamiając zapytanie DROP USER:
DROP USER ‘demouser’@’localhost’;
Przyznawanie i odbieranie uprawnień użytkownikom i użytkownikom w MySQL
Instrukcja GRANT musi przyznawać uprawnienia lub role. Oświadczenie ON może powiedzieć, czy uprawnienia lub role zostaną przyznane. Następujące zapytanie nadaje uprawnienia:
GRANT ALL ON demo_db.* TO ‘demouser’@’localhost’;
Następujące zapytanie przydziela role:
GRANT ‘demo_role’ TO ‘demouser’@’localhost’;
GRANT powinien odpowiedzieć zapytaniem OK, dotyczy to 0 wierszy.
Aby odebrać użytkownikom określone uprawnienia, użyj instrukcji REVOKE (część nazwy hosta w nazwie konta to domyślnie „%”):
REVOKE SELECT ON *.* FROM ‘demouser’@’localhost’;
Aby cofnąć wszystkie uprawnienia, można użyć REVOKE ALL:
REVOKE ALL PRIVILEGES ON *.* FROM ‘demouser’@’localhost’;
Możesz chcieć wystawić PRZYWILEJE FLUSH; oświadczenie po wykonaniu powyższych kroków.
Sprawdzanie, jakie uprawnienia są przypisane w MySQL
- Aby sprawdzić, jakie uprawnienia są przypisane, wydaj POKAŻ GRANTY; oświadczenie.
- Dla każdego wystawionego żądania serwer określa operację, którą chcesz wykonać, a następnie sprawdza, czy Twoje uprawnienia są wystarczające do wykonania danej operacji.
- Serwer używa tabel użytkownika i db w bazie danych mysql, aby zapewnić kontrolę dostępu.
- Tabele user i global_grants zapewniają globalne uprawnienia.
Reszta opcji zostanie omówiona w nadchodzących postach.
Podsumowanie
Jeśli chodzi o bezpieczeństwo MySQL, masz do wyboru bardzo szeroki wachlarz opcji. Opcje obejmują podstawowe środki bezpieczeństwa, które można zastosować do prawie wszystkich aplikacji, ale niektóre opcje są dość specyficzne dla MySQL. Należy pamiętać, że nie wszystkie dostępne opcje zostały jeszcze omówione – będą również omawiane w nadchodzących wydaniach serii zabezpieczeń MySQL.