Недавно я опубликовал ответ на вопрос о mysql.db .
Затем я подумал, что должен задать всем этот вопрос:
В течение многих лет я замечал, что после установки MySQL 5.0+ mysql.db
заполняются две записи, которые позволяют анонимным пользователям получать доступ к тестовым базам данных.
Вы можете увидеть это, запустив этот запрос:
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)
Являются ли эти записи mysql.db
угрозой безопасности, и если да, то почему они по умолчанию добавляются в новую установку?
ОБНОВЛЕНИЕ 2013-06-14 10:13 ПО ВОСТОЧНОМУ ВРЕМЕНИ
Этим утром кто-то отклонил мой вопрос, который я действительно не понимаю. В свете этого события вот почему я нашел время, чтобы сделать опровержение:
Я установил MySQL 5.6.12 для клиента на этой неделе в его промежуточном кластере. Я решил проверить, было ли это все еще продолжающейся проблемой:
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>
Угадай, что? Это все еще проблема даже по сей день !!!
МОРАЛЬ ИСТОРИИ: Пожалуйста, проверьте ваш mysql.db
сразу после установки и удалите анонимные логины и удалите эти тестовые записи mysql.db
без задержки.
mysql_secure_installation
новую установку, которая удаляет анонимных пользователей.Ответы:
Обратите внимание, что руководство по сертификации MySQL 5.0
в пунктах 6 на стр. 498 сказать:
Чтобы избавиться от этих плохих записей, запустите это:
Как отметил @DTest в своем комментарии к вопросу, вы также можете запустить mysql_secure_installation для этого.
Если анонимный пользователь может войти в MySQL удаленно, можно запустить простую атаку диска, чтобы повредить установку mysql. Вот пример:
Запустите insert 30 раз, и вы получите таблицу 7 ГБ
mysql.db
Серьезность обеспечения установки MySQL не была полностью задокументирована MySQL AB, и я не думаю, что Oracle заинтересована в этом сегодня.
ОБНОВЛЕНИЕ 2012-02-18 16:45 ПО ВОСТОЧНОМУ ВРЕМЕНИ
В комментарии @ atxdba было сказано, что просто запускается тест DROP DATABASE; должен быть предпочтительным методом по сравнению с прикосновением mysql.db. Удаление указанной базы данных
test
просто удаляет базу данных, которая открывает канал к потенциальной дыре в безопасности.Пожалуйста, обратите внимание на этот запрос:
Исходя из этого, следующие базы данных могут быть полностью доступны анонимным пользователям :
Хотя следующие базы данных не могут быть полностью доступны анонимным пользователям:
Test
отличается отtest
систем на базе Linux, но все еще остается проблемой для MySQL, работающего в Windows)Вам нужно будет запомнить это тонкое правило, основанное на
mysql.db
таблице. Если вы этого не помните, при создании тестовой базы данных с именемtest
или именем базы данных, первые 5 символов которогоtest_
будут открыты, дыра в безопасности того же типа.Самый безопасный способ запомнить эти вещи - запустить эти строки после первоначальной установки:
тогда любая база данных с любым именем может иметь правильную настройку аутентификации. Вы все еще можете запустить эти две строки в любое время.
ОБНОВЛЕНИЕ 2012-02-24 15:20 ПО ВОСТОЧНОМУ ВРЕМЕНИ
Чтобы открыто продемонстрировать опасность наличия анонимных пользователей в
mysql.db
, я хотел бы создать пользователя, который имеет только привилегию использования.Я буду использовать MySQL 5.5.12 на своем рабочем столе
Во-первых, посмотрите на mysql.db
Согласно этому, любой анонимный Джо может получить доступ к этим базам данных.
Я создам базу данных test_mysqldb
Давайте создадим простого пользователя vanilla с именем vanilla @ localhost (без пароля)
Далее, из командной строки DOS, давайте подключимся к схеме mysql
Ок, отлично. Это то, что я ожидал.
Далее, из командной строки DOS, давайте соединимся со схемой test_mysqldb, создадим таблицу и загрузим ее с числами
Ты это видел? Пользователь с
USAGE
привилегией может создать таблицу в тестовой базе данных и заполнить ее данными. Это явная и настоящая опасность . Вот почему я настоятельно рекомендую удалить эти тестовые записи из mysql.db, чтобы анонимные пользователи не могли получить доступ к тестовым базам данных или получить доступ к вновь созданным тестовым базам данных (путем создания подпапки по умолчаниюdatadir
).Как напоминание, вот как вы это делаете:
ОБНОВЛЕНИЕ 2013-09-14 20:05 ПО ВОСТОЧНОМУ ВРЕМЕНИ
Чтобы продемонстрировать, что это
DELETE FROM mysql.db WHERE SUBSTR(db,4) = 'test' AND user='';
действительно работает, я запустил это на MySQL 5.6.13 сегодня:Пожалуйста, запустите
или просто запустите mysql-secure-installation и положите эту потенциальную опасность в постель.
источник
DELETE from mysql.db WHERE Db LIKE 'test%';
примечание, что заглавная буква названия поля имеет значение. Так что если ваше имя поляDb
и нетdb
, запрос выше не будет работать.