Как отключить root-входы MySQL, если пароль не указан? - PullRequest
12 голосов
/ 24 августа 2011

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

Ответы [ 3 ]

11 голосов
/ 22 февраля 2018

Пользователи, сталкивающиеся с таким поведением в более новых версиях MySQL / MariaDB (например, Debian Stretch и т. Д.), Должны знать, что в таблице mysql.user есть столбец, называемый «плагин».Если плагин '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 (пожалуйста, поднимите свой голос, если вы найдете это полезным).

5 голосов
/ 13 марта 2012

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

В моем случае это было связано с наличием пользовательского файла конфигурации, расположенного в ~ / .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 
5 голосов
/ 24 августа 2011

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

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

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

  • root @ localhost
  • root@127.0.0.1
  • root @ 'hostnameofserver'

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;
...