Niedawno opublikowałem odpowiedź na pytanie dotyczące mysql.db .
Potem pomyślałem, że powinienem zadać wszystkim to pytanie:
Od lat zauważyłem, że po instalacji MySQL 5.0+ mysql.db
zapełniają go dwa wpisy, które umożliwiają dostęp do testowych baz danych przez anonimowych użytkowników.
Możesz to zobaczyć uruchamiając to zapytanie:
mysql> select * from mysql.db where SUBSTR(db,1,4) = 'test'\G
*************************** 1. row ***************************
Host: %
Db: test
User:
Select_priv: Y
Insert_priv: Y
Update_priv: Y
Delete_priv: Y
Create_priv: Y
Drop_priv: Y
Grant_priv: N
References_priv: Y
Index_priv: Y
Alter_priv: Y
Create_tmp_table_priv: Y
Lock_tables_priv: Y
Create_view_priv: Y
Show_view_priv: Y
Create_routine_priv: Y
Alter_routine_priv: N
Execute_priv: N
*************************** 2. row ***************************
Host: %
Db: test\_%
User:
Select_priv: Y
Insert_priv: Y
Update_priv: Y
Delete_priv: Y
Create_priv: Y
Drop_priv: Y
Grant_priv: N
References_priv: Y
Index_priv: Y
Alter_priv: Y
Create_tmp_table_priv: Y
Lock_tables_priv: Y
Create_view_priv: Y
Show_view_priv: Y
Create_routine_priv: Y
Alter_routine_priv: N
Execute_priv: N
2 rows in set (0.00 sec)
Czy te wpisy mysql.db
stanowią zagrożenie bezpieczeństwa, a jeśli tak, to dlaczego są dodawane domyślnie do nowej instalacji?
AKTUALIZACJA 14.06.2013, 10:13 EDT
Dziś rano ktoś przegłosował moje pytanie, którego naprawdę nie rozumiem. W świetle tego wydarzenia, oto dlaczego poświęciłem czas na obalenie:
W tym tygodniu zainstalowałem MySQL 5.6.12 dla klienta w klastrze pomostowym. Postanowiłem sprawdzić, czy nadal występuje problem:
mysql> select version();
+------------+
| version() |
+------------+
| 5.6.12-log |
+------------+
1 row in set (0.00 sec)
mysql> select db,user,host from mysql.db where LEFT(db,4)='test';
+---------+------+------+
| db | user | host |
+---------+------+------+
| test | | % |
| test\_% | | % |
+---------+------+------+
2 rows in set (0.10 sec)
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2013-06-14 10:10:13 |
+---------------------+
1 row in set (0.00 sec)
mysql>
Zgadnij co? To wciąż problem do dziś !!!
MORAL OF THE STORY: Sprawdź mysql.db
natychmiast po instalacji i usuń anonimowe dane logowania i usuń mysql.db
niezwłocznie te wpisy testowe .
mysql_secure_installation
nową instalację, która usuwa anonimowych użytkowników.Odpowiedzi:
Proszę zwrócić uwagę na Przewodnik po certyfikacji MySQL 5.0
powiedzieć w punktach na str. 6:
Aby pozbyć się złych wpisów, uruchom to:
Jak wspomniano w komentarzu do pytania @DTest, możesz również uruchomić dla niego mysql_secure_installation .
Jeśli anonimowy użytkownik może zdalnie zalogować się do MySQL, można po prostu przeprowadzić atak dysku, aby zaszkodzić instalacji mysql. Oto przykład:
Uruchom wkładkę 30 razy, a otrzymasz stół o pojemności 7 GB
mysql.db
Powaga zabezpieczenia instalacji mysql nie została w pełni udokumentowana przez MySQL AB i nie sądzę, aby Oracle była zainteresowana tym dzisiaj.
AKTUALIZACJA 2012-02-18 16:45 EDT
Sugeruje to komentarz @ atxdba, że właśnie „test DROP DATABASE”; powinna być preferowaną metodą zamiast dotykania mysql.db. Usunięcie bazy danych o nazwie
test
po prostu usuwa bazę danych, która otwiera kanał do potencjalnej luki bezpieczeństwa.Proszę zwrócić uwagę na to zapytanie:
Na tej podstawie anonimowi użytkownicy mogą uzyskać pełny dostęp do następujących baz danych :
Chociaż anonimowi użytkownicy nie mogą uzyskać pełnego dostępu do następujących baz danych:
Test
różni się odtest
systemów opartych na Linuksie, ale nadal stanowi problem dla MySQL działającego w systemie Windows)Musisz pamiętać tę subtelną zasadę opartą na
mysql.db
stole. Jeśli nie pamiętasz tego, utworzenie testowej bazy danych o nazwietest
lub nazwy bazy danych, której pierwszych 5 znakówtest_
spowoduje ponowne otwarcie tego samego typu dziury w zabezpieczeniach.Najbezpieczniejszym sposobem na zapamiętanie tych rzeczy jest uruchomienie tych linii po pierwszej instalacji:
wtedy każda baza danych o dowolnej nazwie może mieć prawidłową konfigurację uwierzytelniania. Nadal możesz uruchomić te dwie linie w dowolnym momencie.
AKTUALIZACJA 2012-02-24 15:20 EDT
Aby otwarcie zademonstrować niebezpieczeństwo posiadania anonimowych użytkowników
mysql.db
, chciałbym utworzyć użytkownika, który ma tylko uprawnienia do używania.Będę używać MySQL 5.5.12 na moim pulpicie
Najpierw spójrz na mysql.db
Zgodnie z tym każdy anonimowy Joe może dotrzeć do tych baz danych.
Stworzę bazę danych test_mysqldb
Utwórzmy zwykłego użytkownika wanilii o nazwie vanilla @ localhost (bez hasła)
Następnie, z wiersza poleceń DOS, połączmy się ze schematem mysql
Ok świetnie. Tego się spodziewałem.
Następnie z wiersza poleceń systemu DOS połączmy się ze schematem test_mysqldb, utwórz tabelę i załaduj ją liczbami
Widziałeś to? Użytkownik z
USAGE
uprawnieniami może utworzyć tabelę w testowej bazie danych i wypełnić ją danymi. To jasne i aktualne niebezpieczeństwo . Dlatego zdecydowanie zalecam usunięcie tych wpisów testowych z mysql.db, aby zniechęcić anonimowych użytkowników do dostępu do testowych baz danych lub dostępu do nowo utworzonych testowych baz danych (poprzez utworzenie podfolderu domyślniedatadir
).Przypominamy, że tak to robisz:
AKTUALIZACJA 14.09.2013 20:05 EDT
Aby pokazać, że
DELETE FROM mysql.db WHERE SUBSTR(db,4) = 'test' AND user='';
faktycznie działa, uruchomiłem to dzisiaj na MySQL 5.6.13:Podobnie jak ogłoszenie usługi publicznej, proszę uruchomić
lub po prostu uruchom bezpieczną instalację mysql i połóż to potencjalne zagrożenie.
źródło
DELETE from mysql.db WHERE Db LIKE 'test%';
notatkę, że wielkie litery nazwy pola mają znaczenie. Jeśli więc masz nazwę polaDb
i niedb
, powyższe zapytanie nie będzie działać.