Как отключить root-вход в MySQL, если пароль не указан?

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

Итак, мне нужно остановить доступ к учетной записи root, если пароль не указан. Что я пробовал до сих пор, так это сбросить пароль root с помощью:

mysqladmin -u root password TopSecretPassword

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

mysql> flush privileges;  exit;

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

%> mysql -u  {enter}

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

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

%> mysql -u  {enter}

mysql>SELECT USER(), CURRENT_USER();
> root@localhost, root@localhost

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


person a coder    schedule 24.08.2011    source источник
comment
Возможно, у вас есть пользователь и пароль, указанные в файле my.cnf, и клиент MySQL автоматически предоставляет пароль из файла, если пароль не указан. У пользователя действительно есть пароль, и поэтому вы не можете найти его в таблице пользователей.   -  person Maxim Krizhanovsky    schedule 24.08.2011
comment
Выведите этот запрос: SELECT user,host,password FROM mysql.user; и поместите его в свой ответ. Не беспокойтесь о пароле. Он должен быть зашифрован MD5.   -  person RolandoMySQLDBA    schedule 24.08.2011
comment
@a coder: пока SO не разрешит _ 1_, вы можете пометить образцы экрана с помощью <blockquote><pre>. Отредактируйте свой вопрос и попробуйте. Код (если он у вас есть) можно пометить, сделав для каждой строки отступ с четырьмя пробелами.   -  person outis    schedule 24.08.2011
comment
Думаю, сейчас немного лучше. Любой вклад в содержание сообщения?   -  person a coder    schedule 24.08.2011
comment
@Rolando: MD5 не предлагает шифрование, это функция хеширования. Более того, MySQL никогда не использовал MD5 для хеширования своих паролей. Публикация даже хешированных паролей в открытом доступе никогда не является безопасной. Схема хеширования паролей MySQL уязвима для радужных таблиц, но даже если бы это было не так, можно было бы применить грубую силу.   -  person outis    schedule 26.08.2011
comment
@coder: какую версию сервера mysql (SELECT @@version;) и клиента (mysql -V) вы используете? mysql -u должен привести к ошибке, если вы не укажете имя пользователя. Можете ли вы войти в систему, если предоставите имя пользователя, но не пароль (mysql -u root)?   -  person outis    schedule 26.08.2011


Ответы (4)


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

В моем случае это было связано с наличием пользовательского файла конфигурации, расположенного в ~ / .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 
person coffeefiend    schedule 12.03.2012
comment
В конце концов я решил проблему, изменив пароль root на другой. Теперь, когда вы ответили, я проверил и нашел файл .my.cnf в домашней папке моего пользователя, и он действительно содержал пользователя root / pass. Это была проблема с самого начала. Отметив свой как ответ - спасибо! - person a coder; 13.03.2012
comment
Если вам нужен пароль в файле, лучше использовать mysql_config_editor для создания ~ / .mylogin.cnf, содержащего записи пользователь-пароль-хост с зашифрованным паролем. когда запись может быть выбрана с помощью параметра --login-path из командной строки. См. Более подробное обсуждение в stackoverflow.com/questions/20751352/ - person anthony; 02.09.2016
comment
Я также установил сервер mysql 8 и не смог отключить вход без пароля root. Обычно вы можете использовать скрипт mysql_secure_installation. Но сценарий мне не подходит. Я выяснил, что по умолчанию в ubuntu 20.04 плагин auth_socket используется для идентификации пользователя. - person perber; 14.03.2021

Пользователи, которые сталкиваются с таким поведением в новых версиях 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

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

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

Источник: https://stackoverflow.com/a/44301734/3363571 Большое спасибо @SakuraKinomoto (пожалуйста, проголосуйте за его ответьте, если вы сочтете это полезным).

person Jeremy Davis    schedule 22.02.2018
comment
Я пытался и плакал несколько дней, и я увидел, что ваш ответ исправил это Спасибо - person Vikas Kandari; 02.08.2018
comment
В mysql 5.7.25 мне пришлось установить «plugin» на «mysql_native_password», иначе я не смог бы войти в систему. - person marioivangf; 22.04.2019

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

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

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

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

SELECT USER(),CURRENT_USER();

<сильный > Это покажет, как вы пытались войти и как mysql позволил вам войти.

Выполните эти два запроса:

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

Это должно сработать !!!

ПЕЩЕРА №1

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

skip-grant-tables

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

ПЕЩЕРА № 2

Еще нужно остерегаться наличия нескольких пользователей root. Пожалуйста, запустите это:

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

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

mysql может разрешить аутентификацию от любого пользователя root, если у пользователя 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;
person RolandoMySQLDBA    schedule 24.08.2011
comment
Затронуто 0 строк. В mysql.user нет анонимных пользователей. - person a coder; 24.08.2011
comment
Выведите на экран этот запрос: ВЫБРАТЬ пользователя, хост, пароль ОТ mysql.user; и поместите этот дисплей в свой ответ. Не беспокойтесь о пароле. Он должен быть зашифрован MD5. - person RolandoMySQLDBA; 24.08.2011
comment
Я добавил подробности к своему исходному вопросу. - person a coder; 24.08.2011
comment
skip-grant-tables отсутствует в my.cnf. - person a coder; 24.08.2011
comment
У вас должна быть таблица с названием mysql.user NOT mysql.users. Пожалуйста, запустите эти запросы, используя mysql.user - person RolandoMySQLDBA; 24.08.2011
comment
это был тип-о. Мои извинения. Я запрашивал mysql.user. Вывод этих двух функций одинаков: root @ localhost (у которого есть пароль, а в таблице пользователей есть только одна учетная запись root). - person a coder; 24.08.2011
comment
Пожалуйста, НЕ размещайте MD5-хеш ваших паролей в Интернете. Вы не должны делиться какими-либо хэшами, но MD5, в частности, очень слаб (некоторые сказали бы, что он сломан), и злоумышленники могут определить исходный пароль. - person Eli; 24.08.2011
comment
Я бы никогда не публиковал хеши MD5, реальные имена пользователей, настоящие имена скриптов, фактические IP-адреса или реальные имена переменных (кроме того, что я сделал с root) в Интернете. Несмотря на то, что моя система находится за защищенным брандмауэром, я должен предположить, что брандмауэр не существует, и что кто-то получил доступ к моей машине. - person a coder; 24.08.2011
comment
Поймите, что в этом ответе есть пара голосов и полезная информация, однако он не касается моей ситуации. На указанные клиентом пароли, определенные в файлах my.cnf, решение, представленное в этом ответе, не влияет. См. Выбранный ответ для получения дополнительной информации. - person a coder; 04.10.2014
comment
После нескольких часов борьбы это помогает! Спасибо друг! - person Maduka Jayalath; 22.12.2015
comment
Это ответ, который я искал (используя MariaDB 10.4.15 на Alpine 3.12). Спасибо! - person Krizalys; 09.01.2021

Если кто-нибудь наткнется на этот пост во время поиска того, как изменить пароль root и остановить вход в систему без пароля, Percona снова спасла мою задницу:

https://www.percona.com/blog/2016/03/16/change-user-password-in-mysql-5-7-with-plugin-auth_socket/

в основном команда, которая сработала для меня:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'test';

person SomeOne_1    schedule 28.03.2020
comment
это дает синтаксическую ошибку, если пароль длиннее определенного значения. - person Paschalis; 23.04.2020