Не может войти как пользователь root mysql из учетной записи обычного пользователя в Ubuntu 16.04
Я только что установил Ubuntu 16.04 LTS вместе с пакетами php
, mariadb
а также nginx
, Я побежал mysql_secure_installation
и изменил пароль root.
Теперь, когда я пытаюсь войти в mysql
используя учетную запись root при входе в Ubuntu как обычную учетную запись пользователя, доступ запрещен.
Когда я захожу, используя sudo mysql
MySQL даже не спрашивает меня пароль. Если я бегу mysql_secure_installtion
Я вижу, что старые настройки никогда не устанавливались постоянно.
Что я делаю неправильно?
11 ответов
Я недавно обновил свой Ubuntu 15.04 до 16.04, и это сработало для меня:
Сначала подключитесь в sudo mysql
sudo mysql -u root
Проверьте ваши счета в вашей базе данных
SELECT User,Host FROM mysql.user; +------------------+-----------+ | User | Host | +------------------+-----------+ | admin | localhost | | debian-sys-maint | localhost | | magento_user | localhost | | mysql.sys | localhost | | root | localhost |
Удалить текущий аккаунт root@localhost
mysql> DROP USER 'root'@'localhost'; Query OK, 0 rows affected (0,00 sec)
Создайте заново своего пользователя
mysql> CREATE USER 'root'@'%' IDENTIFIED BY ''; Query OK, 0 rows affected (0,00 sec)
Дайте разрешения своему пользователю (не забудьте сбросить привилегии)
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; Query OK, 0 rows affected (0,00 sec) mysql> FLUSH PRIVILEGES; Query OK, 0 rows affected (0,01 sec)
Выйдите из MySQL и попытайтесь восстановить соединение без sudo.
Надеюсь, это кому-нибудь поможет:)
Если вы устанавливаете 5.7 и не предоставляете пароль для
root
пользователь, он будет использоватьauth_socket
плагин. Этот плагин не волнует и не нуждается в пароле. Он просто проверяет, подключен ли пользователь с помощью сокета UNIX, а затем сравнивает имя пользователя.
Взято из изменения пароля пользователя в MySQL 5.7 с помощью "plugin: auth_socket"
Таким образом, чтобы изменить plugin
вернуться к mysql_native_password
:
Войти с помощью sudo:
sudo mysql -u root
Изменить
plugin
и установить пароль с помощью одной команды:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'test';
Конечно, вы также можете использовать команду выше, чтобы установить пустой пароль.
Просто для записи, (и MariaDB < 10.2
пользователи) есть и другой способ изменить plugin
без предоставления пароля (оставив его пустым):
update mysql.user set plugin = 'mysql_native_password' where User='root';
// to change the password too (credits goes to Pothi Kalimuthu)
// UPDATE mysql.user SET plugin = 'mysql_native_password', Password = PASSWORD('secret') WHERE User = 'root';
FLUSH PRIVILEGES;
Короче, на MariaDB
UPDATE mysql.user SET plugin = 'mysql_native_password',
Password = PASSWORD('NEWPASSWORD') WHERE User = 'root';
где вы заменяете NEWPASSWORD на нужный вам пароль, а все остальное дословно.
Проблема здесь в том, что когда MariaDB или MySQL установлены / обновлены (особенно, если в какой-то момент root установлен без пароля), тогда в таблице Users пароль фактически пуст (или игнорируется), и вход в систему зависит от пользователя системы, соответствующего пользователю MySQL. Вы можете проверить это следующим образом, перейдя в корневой каталог системы, а затем введите:
mysql -uroot -p
Затем введите либо пароль, либо неверный пароль. Вы, вероятно, будете впущены. (Вы можете даже войти в систему из корня Unix, просто # mysql
так как пароль не имеет значения и пользователь определен).
Так что же происходит? Хорошо, если вы войдете в систему как root и сделаете следующее:
select User,host,plugin from mysql.user;
+----------------+-----------+-----------------------+
| User | host | plugin |
+----------------+-----------+-----------------------+
| root | localhost | auth_socket |
+----------------+-----------+-----------------------+
вы заметите auth_socket
(который может читать unix_socket
на MariaDB). Эти сокеты игнорируют пароли и позволяют соответствующему пользователю Unix войти без проверки пароля. Вот почему вы можете войти в систему как root, но не с другим пользователем.
Таким образом, решение состоит в том, чтобы обновить пользователей, чтобы не использовать auth_socket/unix_socket
и правильно установить пароль.
На MariaDB (<10.2, см. Комментарии ниже), который на Ubuntu версии 16 на 2017 год, этого должно быть достаточно. NEWPASSWORD - это ваш пароль. mysql_native_password
вы вводите дословно.
UPDATE mysql.user SET plugin = 'mysql_native_password', Password = PASSWORD('NEWPASSWORD') WHERE User = 'root';
(Возможно, что установка плагина на пустой будет работать. YMMV. Я не пробовал это. Так что это альтернатива.)
UPDATE mysql.user SET plugin = '', Password = PASSWORD('NEWPASSWORD') WHERE User = 'root';
Иначе:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'NEWPASSWORD';
затем
FLUSH PRIVILEGES;
Напомним, что решение, включающее удаление пользователя и воссоздание его с помощью "%", полностью заблокировало меня из базы данных и может вызвать другие проблемы, если вы не получите grant
Заявление совершенно верно - проще просто обновить рут у вас уже есть.
По моему опыту, проблема возникает только с пользователем root, так как другие пользователи будут добавлены вручную, а не частью первоначальной установки / обновления.
Если вы установили MySQL/MariaDB из базового репозитория, пользователи не могут войти в MySQL как root-пользователь MySQL из своих учетных записей Unix (не применимо, если у них есть доступ sudo)
Войдите в корневую оболочку MySQL:
$ sudo mysql -u root -p
Выполните следующие запросы:
use mysql; update user set plugin='mysql_native_password' where user='root'; flush privileges; quit;
Откройте новую оболочку, затем:
$ mysql -u root -p
Попробуйте создать новую учетную запись mysql, для меня это сработало (mysql 5.7.12):
Войти как sudo:
sudo mysql -uroot
Создайте нового пользователя и предоставьте ему привилегии (без пароля):
CREATE USER 'admin'@'localhost' IDENTIFIED BY ''; GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost';
Войти как новый пользователь:
mysql -uadmin
Если вы просто запустите команду mysql под пользователем root, вам будет предоставлен доступ без запроса пароля, потому что аутентификация сокета включена для root@localhost.,
Единственный способ установить пароль - переключиться на собственную аутентификацию, например:
$ sudo mysql
mysql> ALTER USER 'root' @ 'localhost' ИДЕНТИФИЦИРОВАНО С mysql_native_password BY 'test';
Мне пришлось сделать две вещи (благодаря @Todor и @Loremhipsum):
update mysql.user set plugin = 'mysql_native_password' where User='root';
grant all privileges on *.* to 'root'@'localhost';
а потом:
FLUSH PRIVILEGES;
Я бы не рекомендовал сбрасывать пользователя root
,
Я адаптировал некоторые сценарии инициализации, которые я создал, чтобы использовать MariaDB, и столкнулся с этой проблемой. Собирая воедино много информации , ответ Газзера в этом вопросе действительно обнуляется; все сводится к auth_socket
/ unix_socket
установка.
Поэтому при использовании MariaDB 5.5 (под Ubuntu 14.04) и MariaDB 10 под (Ubuntu 16.04) вход в MySQL и выполнение этой команды сразу все проясняло:
UPDATE mysql.user SET plugin='' WHERE User='root';
FLUSH PRIVILEGES;
Другие ответы, включая самый высокий голос за этот пост от Loremhipsum, действительно поощряют плохие практики, рекомендуя удалить пользователя, а затем воссоздать его. Для меня это довольно радикальное решение. Лучшее / простое решение для обнуления plugin
цените, очищайте привилегии и продолжайте жить.
Попробуйте сначала этот код,
echo "CREATE USER 'root'@'localhost' IDENTIFIED BY 'root';" > your_init_file.sql
echo "GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;" >> your_init_file.sql
echo "FLUSH PRIVILEGES;" >> your_init_file.sql
а потом,
killall mysqld
mysqld_safe --init-file=$PWD/your_init_file.sql
затем нажмите Ctrl+Z
и введите: bg
чтобы запустить процесс с переднего плана на задний план, а затем проверьте свой доступ с помощью:
mysql -u root -proot
mysql> show grants;
Максимальная безопасность
Поскольку аутентификация unix является наиболее безопасной аутентификацией, лучше всего оставить учетную запись root по умолчанию как есть (т. е. продолжать использовать аутентификацию сокета unix без пароля), а если учетная запись root не используется, используйте ее через
sudo
. Если у злоумышленника есть доступ root/sudo; то они уже имеют полный контроль над вашим сервером...
Если вам нужно получить доступ к MySQL/MariaDB с помощью альтернативного метода (т.е. не CLI), создайте нового пользователя MySQL/MariaDB с паролем и только необходимыми разрешениями.
У меня была та же проблема, и я запустил следующие исправления:
mysql_upgrade --force