Зверніть увагу, що посібник з вивчення сертифікації 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 і покладіть цю потенційну небезпеку на ліжко.
mysql_secure_installation
на новій установці, яка видаляє анонімних користувачів.