Как отключить логин 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;