MySQL: Чому в mysql.db є "тестові" записи?


37

Нещодавно я опублікував відповідь на запитання про 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 EDT

Сьогодні вранці хтось порушив моє запитання, яке я справді не розумію. У світлі цієї події, ось чому я взяв час, щоб зробити спростування:

Цього тижня я встановив 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без зволікань.


8
+1 для висвітлення цього питання. Я ніколи цього не помічав, але я завжди працюю mysql_secure_installationна новій установці, яка видаляє анонімних користувачів.
Дерек Дауні

Відповіді:


30

Зверніть увагу, що посібник з вивчення сертифікації MySQL 5.0

введіть тут опис зображення

сказати у своїх бюлетенях на пункті 498 Параграф 6:

У Unix MySQL поставляється із скриптом mysql_secure_installation, який може виконати кілька корисних операцій, пов’язаних із безпекою у вашій установці. Сценарій має такі можливості:

  • Встановіть пароль для кореневих облікових записів
  • Видаліть усі доступні кореневі облікові записи.
  • Видаліть анонімні облікові записи користувачів. Це покращує безпеку, оскільки запобігає можливості підключення будь-якого користувача до сервера MySQL як корінь від віддаленого хоста. Результати полягають у тому, що кожен, хто хоче підключитися як root, повинен спочатку мати можливість увійти на хості сервера, що забезпечує додатковий бар'єр проти атаки.
  • Видаліть тестову базу даних (Якщо ви видалите анонімні облікові записи, ви також можете видалити тестову базу даних, до якої вони мають доступ).

Щоб позбутися цих поганих записів, запустіть це, будь ласка:

DELETE FROM mysql.db WHERE SUBSTR(db,4) = 'test';
FLUSH PRIVILEGES;

Як @DTest згадував у своєму коментарі до питання, ви також можете запустити mysql_secure_installation для цього.

Якщо анонімний користувач може ввійти в MySQL віддалено, може бути запущена просто диск-атака, щоб пошкодити встановлення mysql. Ось приклад:

USE test
CREATE TABLE rolando_tb (a int);
INSERT INTO rolando_tb VALUES (1);
INSERT INTO rolando_tb SELECT a FROM rolando_tb;
INSERT INTO rolando_tb SELECT a FROM rolando_tb;
INSERT INTO rolando_tb SELECT a FROM rolando_tb;
INSERT INTO rolando_tb SELECT a FROM rolando_tb;

Запустіть вставку 30 разів і отримаєте таблицю 7 Гб

  • Уявіть собі, як створити кілька таких таблиць у тестовій базі даних
  • Уявіть собі, як створити Збережену процедуру в тестовій базі даних
  • Можливості нескінченні, поки існує тест і тест_% mysql.db

Серйозність забезпечення установки mysql не була повністю задокументована MySQL AB, і я не думаю, що Oracle сьогодні не зацікавлений у цьому.

ОНОВЛЕННЯ 2012-02-18 16:45 EDT

У коментарі @ atxdba було запропоновано сказати, що запускається "DROP DATABASE test". повинен бути кращим методом над торканням mysql.db. Якщо testвидалити названу базу даних, просто видаляється база даних, яка відкриває канал до потенційного отвору в захисті.

Будь ласка, врахуйте цей запит:

mysql> select user,host,db from mysql.db;
+------+------+---------+
| user | host | db      |
+------+------+---------+
|      | %    | test    |
|      | %    | test\_% |
+------+------+---------+
2 rows in set (0.09 sec)

Виходячи з цього, анонімні користувачі можуть повністю отримати доступ до таких баз даних :

  • тест
  • test_db
  • test_001
  • тест_1
  • test_data

Хоча анонімні користувачі не можуть повністю отримати доступ до таких баз даних:

  • testdb
  • тест1
  • testdata
  • Тест ( Testвідрізняється від testсистем на базі Linux, але це все ще проблема для MySQL, що працює в Windows)

Вам доведеться запам'ятати це тонке правило, засноване на mysql.dbтаблиці. Якщо ви цього не пам’ятаєте, створивши тестову базу даних з назвою testабо ім’я бази даних, перші 5 символів якої test_будуть відкриті для цього ж отвору в безпеці.

Найбільш безпечний спосіб запам'ятати ці речі - це запустити ці рядки після початкової установки:

DELETE FROM mysql.db WHERE SUBSTR(db,4) = 'test' AND user='';
FLUSH PRIVILEGES;

то будь-яка база даних з будь-яким ім'ям може мати належну настройку аутентифікації. Ви все одно можете запускати ці два рядки в будь-який час.

ОНОВЛЕННЯ 2012-02-24 15:20 EDT

Щоб відкрито продемонструвати небезпеку появи анонімних користувачів mysql.db, я хотів би створити користувача, який має лише привілей на використання.

Я буду використовувати MySQL 5.5.12 на своєму робочому столі

Спочатку подивіться на mysql.db

mysql> select user,host,db from mysql.db;
+------+------+---------+
| user | host | db      |
+------+------+---------+
|      | %    | test    |
|      | %    | test\_% |
+------+------+---------+
2 rows in set (0.05 sec)


mysql>

Відповідно до цього будь-який анонімний Джо може отримати доступ до цих баз даних.

Я створю базу даних test_mysqldb

mysql> create database test_mysqldb;
Query OK, 1 row affected (0.00 sec)

mysql> use test_mysqldb
Database changed
mysql> show tables;
Empty set (0.00 sec)

mysql>

Давайте створимо звичайного користувача ванілі під назвою vanilla @ localhost (без пароля)

mysql> CREATE USER vanilla@localhost;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW GRANTS FOR vanilla@localhost;
+---------------------------------------------+
| Grants for vanilla@localhost                |
+---------------------------------------------+
| GRANT USAGE ON *.* TO 'vanilla'@'localhost' |
+---------------------------------------------+
1 row in set (0.00 sec)

mysql>

Далі з командного рядка DOS підключимося до схеми mysql

C:\>mysql -uvanilla -Dmysql
ERROR 1044 (42000): Access denied for user 'vanilla'@'localhost' to database 'mysql'

C:\>

ОК здорово. Це я очікував.

Далі, з командного рядка DOS, підключимося до схеми test_mysqldb, створимо таблицю та завантажимо її цифрами

C:\>mysql -uvanilla -Dtest_mysqldb
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.5.12-log MySQL Community Server (GPL)

Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> CREATE TABLE rolando_tb (a bigint unsigned);
Query OK, 0 rows affected (0.06 sec)

mysql> INSERT INTO rolando_tb VALUES (1);
Query OK, 1 row affected (0.06 sec)

mysql> INSERT INTO rolando_tb SELECT * FROM rolando_tb;
Query OK, 1 row affected (0.06 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> INSERT INTO rolando_tb SELECT * FROM rolando_tb;
Query OK, 2 rows affected (0.08 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> INSERT INTO rolando_tb SELECT * FROM rolando_tb;
Query OK, 4 rows affected (0.06 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> INSERT INTO rolando_tb SELECT * FROM rolando_tb;
Query OK, 8 rows affected (0.06 sec)
Records: 8  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM rolando_tb;
+------+
| a    |
+------+
|    1 |
|    1 |
|    1 |
|    1 |
|    1 |
|    1 |
|    1 |
|    1 |
|    1 |
|    1 |
|    1 |
|    1 |
|    1 |
|    1 |
|    1 |
|    1 |
+------+
16 rows in set (0.00 sec)

mysql> SELECT database();
+--------------+
| database()   |
+--------------+
| test_mysqldb |
+--------------+
1 row in set (0.00 sec)

mysql>

Ти це бачив? Користувач зUSAGEпривілеєм може створити таблицю в тестовій базі даних і заповнити її даними. Це явна і нинішня небезпека . Ось чому я настійно рекомендую видалити ці тестові записи з mysql.db, щоб відмовити анонімним користувачам дістатись до тестових баз даних або отримати доступ до новостворених тестових баз даних (шляхом створення підпапки за замовчуваннямdatadir).

Як нагадування, це так:

DELETE FROM mysql.db WHERE SUBSTR(db,4) = 'test' AND user='';
FLUSH PRIVILEGES;

ОНОВЛЕННЯ 2013-09-14 20:05 EDT

Щоб продемонструвати, що DELETE FROM mysql.db WHERE SUBSTR(db,4) = 'test' AND user='';насправді працює, я сьогодні запустив це на MySQL 5.6.13:

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.13-log MySQL Community Server (GPL)

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> select db,user,host from mysql.db where LEFT(db,4)='test';
+---------+------+------+
| db      | user | host |
+---------+------+------+
| test    |      | %    |
| test\_% |      | %    |
+---------+------+------+
2 rows in set (0.43 sec)

mysql> delete from mysql.db where LEFT(db,4)='test';
Query OK, 2 rows affected (0.04 sec)

mysql> select db,user,host from mysql.db2 where LEFT(db,4)='test';
Empty set (0.00 sec)

mysql>

Будь ласка, запустіть як оголошення про державну службу

DELETE FROM mysql.db WHERE SUBSTR(db,4) = 'test' AND user='';
FLUSH PRIVILEGES;

або просто запустіть mysql-secure-install і покладіть цю потенційну небезпеку на ліжко.


Не випадає тест бази даних; віддаєте перевагу над прямим набором файлів mysqldb? Видалення запису з таблиці db не видалить фактичну тестову db-каталог. Якщо нічого іншого просто не здається кращим утримання дому
atxdba

1
Мені довелося зробити DELETE from mysql.db WHERE Db LIKE 'test%';Примітку про те, що великі літери мають назву поля. Тож якщо назва вашого поля є, Dbа ні db , запит вище не працюватиме.
Avery
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.