Как отключить логин MySQL, если пароль не указан?

MySQL установлен на моем ноутбуке, и он работает нормально, за исключением того, что мне разрешено входить в систему, не поставляя пароль root. Я также могу войти в систему, указав пароль root. Если входящий пароль не совпадает, он запрещает доступ. Пароль root был изменен на мой выбор, когда я изначально установил MySQL. Я только что заметил логины без пароля сегодня.

Итак, мне нужно остановить доступ к учетной записи root, если пароль не указан. Я пробовал до сих пор reset пароль root:

mysqladmin -u root password TopSecretPassword

Затем я вошел в консоль и выписал:

mysql> flush privileges;  exit;

Я все еще могу войти в MySQL с помощью:

%> mysql -u  {enter}

Как остановить это поведение?

ДОПОЛНИТЕЛЬНЫЕ ДЕТАЛИ:

%> mysql -u  {enter}

mysql>SELECT USER(), CURRENT_USER();
> [email protected], [email protected]

mysql>SELECT COUNT(*) FROM mysql.users WHERE user='root' AND password='';
> COUNT(*)
> 0

mysql>SELECT COUNT(*) FROM mysql.users WHERE user='';
> COUNT(*)
> 0

mysql>SELECT COUNT(*) FROM mysql.users WHERE user='root';
> COUNT(*)
> 1

%> vi /etc/my.cnf
/skip-grant-tables
> E486: Pattern not found: skip-grant-tables

Ответ 1

Я знаю, что этому вопросу несколько месяцев, но у меня была такая же проблема.

В моем случае это было связано с наличием пользовательского файла конфигурации, расположенного в ~/.my.cnf, который содержал пользователя и пароль. В моем случае cPanel создал этот файл конфигурации.

[client]
pass="ROOT_PASSWORD_WAS_HERE!"
user=root

Пользовательские файлы конфигурации являются функцией MySQl, а расположение всех прочитанных файлов конфигурации подробно описано в документации: http://dev.mysql.com/doc/refman/5.1/en/option-files.html.

Если вы запускаете mysql в * nix dist, выполните следующую команду, чтобы проверить, есть ли у вас пользовательский конфигурационный файл:

cat ~/.my.cnf 

Ответ 2

Пользователи, сталкивающиеся с таким поведением в более новых версиях MySQL/MariaDB (например, Debian Stretch и т.д.), Должны знать, что в таблице mysql.user есть столбец с именем 'plugin'. Если плагин 'unix_socket' включен, то root сможет войти в систему через командную строку без пароля. Другие механизмы входа в систему будут отключены.

Чтобы проверить, если это так:

SELECT host, user, password, plugin FROM mysql.user;

который должен возвращать что-то вроде этого (с включенным unix_socket):

+-----------+------+--------------------------+-------------+
| host      | user | password                 | plugin      |
+-----------+------+--------------------------+-------------+
| localhost | root | <redacted_password_hash> | unix_socket |
+-----------+------+--------------------------+-------------+

Чтобы отключить это и требовать, чтобы root использовал пароль:

UPDATE mysql.user SET plugin = '' WHERE user = 'root' AND host = 'localhost';
FLUSH PRIVILEGES;

Примечание. Как отмечает @marioivangf (в комментарии) в более новых версиях MySQL (например, 5.7.x), вам может потребоваться установить для плагина значение "mysql_native_password" (а не пустое).

Затем перезапустите:

service mysql restart

Проблема исправлена!

[email protected] ~# mysql
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

Источник: fooobar.com/questions/895782/... Большое спасибо @SakuraKinomoto (пожалуйста, поднимите свой голос, если найдете это полезным).

Ответ 3

Похоже, у вас может быть один или несколько анонимных пользователей.

Чтобы увидеть, как они запускают этот запрос:

SELECT user,host,password FROM mysql.user WHERE user='';

Чтобы убедиться, что вы аутентифицированы как таковой, запустите это:

SELECT USER(),CURRENT_USER();

Это покажет, как вы пытались войти в систему и как mysql разрешил вам войти в систему.

Запустите эти два запроса:

DELETE FROM mysql.user WHERE user='';
FLUSH PRIVILEGES;

Это должно сделать это!!!

CAVEAT # 1

Если это не сработает, проверьте /etc/my.cnf для этой опции:

skip-grant-tables

Если это в my.cnf, удалите его и перезапустите mysql.

CAVEAT # 2

Что-то еще, на что нужно обратить внимание, - это несколько пользователей root. Запустите это:

SELECT user,host,password FROM mysql.user WHERE user='root';

Если вы определили root, чтобы иметь пароль и все еще попадаете под root, это указывает на наличие нескольких пользователей root. Могут быть эти записи в mysql.user

mysql может разрешать аутентификацию от любого из корневых пользователей, если у пользователя root нет пароля. Это должно проявляться при запуске SELECT USER(),CURRENT_USER();, потому что вывод каждой функции будет отображаться как другой.

Если у одного пользователя root есть пароль MD5, а у всех остальных пользователей root нет, вы можете распространять этот пароль MD5 другим пользователям root следующим образом:

UPDATE mysql.user
SET password = 
(
    SELECT password FROM mysql.user
    WHERE user='root' AND password <> ''
)
WHERE user='root' AND password = '';
FLUSH PRIVILEGES;