Невозможно удалить анонимного пользователя из mysql.user

15

Я пытаюсь удалить анонимных пользователей из моей базы данных mysql.users. Тем не менее, я получаю странное поведение. Когда я ввожу команду:

DROP User ''@'WOPR';

Я получаю общее сообщение об ошибке. Итак, я перезагрузил свою машину и попробовал снова. На этот раз я получил ответ

Query OK, 0 rows affected.

Но когда я положил в

SELECT User, Host, Password FROM mysql.user WHERE User='';

Возврат:

+------+------+----------+
| User | Host | Password |
+------+------+----------+
|      | WOPR |          |
+------+------+----------+

(WOPR - это мое имя хоста)

Я запускаю команду

DROP User ''@'WOPR';

и получить тот же результат.

Я запускаю свежую установку MySQL 5.5 на Arch Linux, версия ядра 2.6.33.

Кто-нибудь знает, что может вызвать такое поведение?

SirTasty
источник
Пожалуйста, получите слово, чтобы отправить вопросы такого рода в DBA StackExchange !!!
RolandoMySQLDBA

Ответы:

15
DELETE FROM mysql.user WHERE user='' AND host='WOPR';
FLUSH PRIVILEGES;

Это должно сделать это для вас.

Попробуйте!

ПРЕДОСТЕРЕЖЕНИЕ

В MySQL определенные пользователи предустановлены в mysql.user. Кроме того, mysql.db поставляется с двумя пользователями, которые имеют анонимный доступ и полные права для тестирования баз данных.

Просто сделай это

SELECT * FROM mysql.db \G

и вы увидите, что любой, кто подключается к тесту или к любой базе данных, начинающейся с test_, может делать все в тестовой базе данных. Это плохо, так как человек с полным доступом к любой тестовой базе данных может съесть диск за считанные минуты.

Пример:

use test
CREATE TABLE junk (INT a) ENGINE=MyISAM;
INSERT INTO junk VALUES (1);

ОК, большое дело. Это составляет таблицу с 4 байтами.

Теперь попробуем запустить этот оператор SQL 30 раз:

INSERT INTO junk SELECT * FROM junk;

Эй, мгновенная таблица с 1 073 741 824 строками (4 ГБ + файл) !!! Imaging, обладающий полными правами на тестовую базу данных, где вы можете нанести такой ущерб на диск.

Я советую вам запустить это, чтобы очистить доступ тестового пользователя:

DELETE FROM mysql.db WHERE db LIKE 'tes%' AND user='';
FLUSH PRIVILEGES;

Для дальнейшего разъяснения, смотрите мой пост MySQL: почему в mysql.db есть «тестовые» записи?

Ура !!!

RolandoMySQLDBA
источник
Привет, Роландо, Это сработало, спасибо! Я сейчас исправляю свой тестовый доступ к базе данных.
SirTasty
Разве нет способа использовать drop userсинтаксис вместо mysql.userнепосредственного изменения базовой таблицы?
Pacerier
1
@Pacerier Пожалуйста, посмотрите на оригинальный вопрос. Реальная проблема заключается в том, что DROP USERсинтаксис не работает, когда поле пользователя пустое (пустая строка). Вы должны сделать это так, как указано в ответе.
RolandoMySQLDBA
@RolandoMySQLDBA, есть ли другие решения помимо взлома mysql.userтаблицы?
Pacerier
@Pacerier Если вы прочитаете мою последнюю ссылку, вы поймете, что MySQL (теперь Oracle) размещает две строки непосредственно mysql.dbпри установке, что позволит анонимным пользователям получить доступ к тестовой базе данных. Интересно, что мне сказали, что при установке Percona Server эти строки удаляются до завершения его установки ( dba.stackexchange.com/questions/66584/… ). Поскольку вы используете MySQL, либо запустите mysql_secure_installation, либо удалите эти две строки самостоятельно.
RolandoMySQLDBA