Не может войти как пользователь root mysql из учетной записи обычного пользователя в Ubuntu 16.04

Я только что установил Ubuntu 16.04 LTS вместе с пакетами php, mariadb а также nginx, Я побежал mysql_secure_installation и изменил пароль root.

Теперь, когда я пытаюсь войти в mysql используя учетную запись root при входе в Ubuntu как обычную учетную запись пользователя, доступ запрещен.

Когда я захожу, используя sudo mysqlMySQL даже не спрашивает меня пароль. Если я бегу mysql_secure_installtion Я вижу, что старые настройки никогда не устанавливались постоянно.

Что я делаю неправильно?

11 ответов

Я недавно обновил свой Ubuntu 15.04 до 16.04, и это сработало для меня:

  1. Сначала подключитесь в sudo mysql

    sudo mysql -u root
    
  2. Проверьте ваши счета в вашей базе данных

    SELECT User,Host FROM mysql.user;
    +------------------+-----------+
    | User             | Host      |
    +------------------+-----------+
    | admin            | localhost |
    | debian-sys-maint | localhost |
    | magento_user     | localhost |
    | mysql.sys        | localhost |
    | root             | localhost |
    
  3. Удалить текущий аккаунт root@localhost

    mysql> DROP USER 'root'@'localhost';
    Query OK, 0 rows affected (0,00 sec)
    
  4. Создайте заново своего пользователя

    mysql> CREATE USER 'root'@'%' IDENTIFIED BY '';
    Query OK, 0 rows affected (0,00 sec)
    
  5. Дайте разрешения своему пользователю (не забудьте сбросить привилегии)

    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)
    
  6. Выйдите из MySQL и попытайтесь восстановить соединение без sudo.

Надеюсь, это кому-нибудь поможет:)

Если вы устанавливаете 5.7 и не предоставляете пароль для root пользователь, он будет использовать auth_socket плагин. Этот плагин не волнует и не нуждается в пароле. Он просто проверяет, подключен ли пользователь с помощью сокета UNIX, а затем сравнивает имя пользователя.

Взято из изменения пароля пользователя в MySQL 5.7 с помощью "plugin: auth_socket"

Таким образом, чтобы изменить plugin вернуться к mysql_native_password:

  1. Войти с помощью sudo:

    sudo mysql -u root
    
  2. Изменить 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)

  1. Войдите в корневую оболочку MySQL:

    $ sudo mysql -u root -p
    
  2. Выполните следующие запросы:

    use mysql;
    update user set plugin='mysql_native_password' where user='root';
    flush privileges; 
    quit;
    
  3. Откройте новую оболочку, затем:

    $ mysql -u root -p
    

Источник

Попробуйте создать новую учетную запись mysql, для меня это сработало (mysql 5.7.12):

  1. Войти как sudo:

    sudo mysql -uroot
    
  2. Создайте нового пользователя и предоставьте ему привилегии (без пароля):

    CREATE USER 'admin'@'localhost' IDENTIFIED BY '';
    GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost';
    
  3. Войти как новый пользователь:

    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
Другие вопросы по тегам