ne peut pas se connecter en tant qu'utilisateur mysql root à partir d'un compte d'utilisateur normal dans Ubuntu 16.04

203

Je viens d’installer Ubuntu 16.04 LTS avec les paquets php, mariadbet nginx. J'ai couru mysql_secure_installationet changé le mot de passe root.

Maintenant, lorsque j'essaie de me connecter à l' mysqlaide du compte root en étant connecté à Ubuntu en tant que compte d'utilisateur normal, l'accès est refusé.

Lorsque je me connecte avec sudo mysql, mysql ne me demande même pas de mot de passe. Si je cours, mysql_secure_installtionje constate que les anciens paramètres ne sont jamais définis de manière permanente.

Qu'est-ce que je fais mal?

codescope
la source

Réponses:

359

J'ai récemment mis à jour mon Ubuntu 15.04 à 16.04 et cela a fonctionné pour moi:

  1. Tout d'abord, connectez-vous dans sudo mysql

    sudo mysql -u root
    
  2. Vérifiez vos comptes présents dans votre base de données

    SELECT User,Host FROM mysql.user;
    +------------------+-----------+
    | User             | Host      |
    +------------------+-----------+
    | admin            | localhost |
    | debian-sys-maint | localhost |
    | magento_user     | localhost |
    | mysql.sys        | localhost |
    | root             | localhost |
    
  3. Supprimer le compte root @ localhost actuel

    mysql> DROP USER 'root'@'localhost';
    Query OK, 0 rows affected (0,00 sec)
    
  4. Recréez votre utilisateur

    mysql> CREATE USER 'root'@'%' IDENTIFIED BY '';
    Query OK, 0 rows affected (0,00 sec)
    
  5. Donnez des autorisations à votre utilisateur (n'oubliez pas de supprimer les privilèges)

    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. Quittez MySQL et essayez de vous reconnecter sans sudo.

J'espère que cela aidera quelqu'un :)

Loremhipsum
la source
16
C’est la seule chose qui a fonctionné pour moi. Quelqu'un sait-il exactement ce qui s’est passé avec l’utilisateur root lorsque vous avez installé mysql-server le 16.04?
Ruggi
32
Tenez-le, ne %signifie pas que vous pouvez vous connecter de n'importe où ... à distance?
Stevie G
9
Vous pouvez modifier la ligne en: CREATE USER 'root' @ 'localhost' IDENTIFIED BY '';
vladnev
11
Pour les personnes concernées par la sécurité: le modèle de connexion racine @ localhost mysql non sécurisé est un élément essentiel du développement local, mais ne doit absolument apparaître nulle part ailleurs.
Charney Kaye
5
La déclaration de subvention pour le nouvel utilisateur root ne donne pas ici "avec subvention" à la racine. Par conséquent, la racine ne peut pas accorder sans exécuter cette opération ultérieurement: dba.stackexchange.com/a/62046/115679 Veuillez modifier la déclaration de subvention engrant all privileges on *.* to 'root'@'localhost' with grant option;
Loren
132

Si vous installez 5.7 sans fournir de mot de passe à l' rootutilisateur, celui-ci utilisera le auth_socketplug - in. Ce plugin ne s'en soucie pas et n'a pas besoin d'un mot de passe. Il vérifie simplement si l'utilisateur se connecte à l'aide d'un socket UNIX, puis compare le nom d'utilisateur.

Extrait de Change User Password dans MySQL 5.7 avec "plugin: auth_socket"

Donc, afin de changer le plugindos à mysql_native_password:

  1. Connectez-vous avec sudo:

    sudo mysql -u root
    
  2. Changez le pluginet définissez un mot de passe avec une seule commande:

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

Bien sûr, vous pouvez également utiliser la commande ci-dessus pour définir un mot de passe vide.

Pour mémoire, (et les MariaDB < 10.2utilisateurs), il existe également un autre moyen de modifier le pluginsans fournir de mot de passe (en le laissant vide):

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;
Todor
la source
2
Merci, pour une raison quelconque, cela a été réglé automatiquement après une mise à niveau d'apt-get, je pense ...
Tominator
4
En outre, j'aime plus cette réponse - elle est beaucoup moins destructive ;-)
benzkji
3
Pour MariaDB <10.2, pour modifier le plug-in avec le mot de passe, UPDATE mysql.user SET plugin = 'mysql_native_password', Password = PASSWORD('secret') WHERE User = 'root'; FLUSH PRIVILEGES;
procédez comme suit
5
Cela devrait être la réponse acceptée
Geo C.
3
J'aimerais pouvoir voter à deux reprises.
James Smith
21

En bref, sur MariaDB

UPDATE mysql.user SET plugin = 'mysql_native_password', 
      Password = PASSWORD('NEWPASSWORD') WHERE User = 'root';

où vous remplacez NEWPASSWORD par le mot de passe que vous voulez et tout le reste.

Le problème ici est que, lorsque MariaDB ou MySQL sont installés / mis à jour (en particulier si, à un moment donné, root est défini sans mot de passe), dans le tableau Utilisateurs, le mot de passe est réellement vide (ou ignoré), et la connexion dépend de l'utilisateur système correspondant. à un utilisateur MySQL. Vous pouvez le tester comme suit en basculant sur la racine du système, puis en tapant:

mysql -uroot -p

Ensuite, entrez soit pas de mot de passe, soit un mot de passe incorrect . Vous serez probablement laissé entrer (vous pourrez même vous connecter à partir de la racine unix simplement # mysqlparce que le mot de passe n'a pas d'importance et que l'utilisateur est défini).

Alors que se passe-t-il? Eh bien, si vous vous connectez en tant que root et procédez comme suit:

select User,host,plugin from mysql.user; 
+----------------+-----------+-----------------------+
| User           | host      | plugin                |
+----------------+-----------+-----------------------+
| root           | localhost | auth_socket           |
+----------------+-----------+-----------------------+

vous noterez auth_socket(qui peut lire unix_socketsur MariaDB). Ces sockets ignorent les mots de passe et permettent à l'utilisateur Unix correspondant d'entrer sans vérification de mot de passe. C'est pourquoi vous pouvez vous connecter avec root mais pas avec un autre utilisateur.

La solution consiste donc à mettre à jour les utilisateurs pour qu'ils n'utilisent pas le auth_socket/unix_socketet définissent correctement un mot de passe.

Sur MariaDB (<10.2, voir les commentaires ci-dessous) qui est sur la version 16 d'Ubuntu à partir de 2017, cela devrait suffire. NEWPASSWORD est votre mot de passe. mysql_native_passwordvous tapez textuellement.

UPDATE mysql.user SET plugin = 'mysql_native_password', Password = PASSWORD('NEWPASSWORD') WHERE User = 'root';

(Il est possible que régler le plug-in sur vide fonctionne. YMMV. Je n'ai pas essayé cela. C'est donc une alternative.)

UPDATE mysql.user SET plugin = '', Password = PASSWORD('NEWPASSWORD') WHERE User = 'root';

Autrement:

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

ensuite

FLUSH PRIVILEGES;

Pour mémoire, la solution consistant à supprimer l'utilisateur et à le recréer avec '%' m'a totalement bloquée en dehors de la base de données, et peut entraîner d'autres problèmes à moins que vous n'obteniez la grantdéclaration exacte - il est plus facile de mettre à jour la racine que vous avez déjà.

D'après mon expérience, le problème ne concerne que l'utilisateur root, car d'autres utilisateurs seront ajoutés manuellement, mais ne feront pas partie d'une installation / mise à jour initiale.

Gazzer
la source
2
J'ai trouvé que cela fonctionnait parfaitement. Je me demande cependant pourquoi la modification du mot de passe root avec mysql_secure_installationn'a pas eu le même effet. Où stocke-t-il le nouveau mot de passe?
Mausy5043
Pouvez-vous modifier votre réponse et en dire plus sur chacune des commandes au fur et à mesure? Je ne suis pas sûr de ce qui est applicable. Est-ce que ce sont les deux UPDATEqui s'appliquent à MariaDB <10.2 et les ALTERautres versions? Et le second est-il UPDATEune alternative au premier ou devons-nous taper les deux? Enfin, est-ce que 'mysql_native_password' est quelque chose à taper mot pour mot, ou devrions-nous le remplacer par notre mot de passe root prévu pour MySQL?
Michael Scheper
1
@MichaelScheper Il y a quelque temps, je ne veux pas trop éditer, mais voici ce dont je me souviens. (1) Effectuez uniquement la première mise à jour (<10.2 peut ne pas être une exigence). (2) Oui, tapez 'mysql_native_password' mot à mot. En gros, vous dites à mariadb: "N'utilisez pas de privilèges Unix, utilisez les privilèges de base de données". Le mysql_native_passwordest cette option.
Gazzer
Bon sang, j'ai mal orthographié «privilège»!
Gazzer
1
On dirait que vous n'avez raté la limite de temps d'édition que par une minute et demie! Cela me frustre parfois aussi. Quoi qu'il en soit, merci!
Michael Scheper
8

Si vous avez installé MySQL / MariaDB à partir du référentiel de base, les utilisateurs ne peuvent pas se connecter à MySQL en tant qu'utilisateur root MySQL à partir de leurs connexions Unix (non applicable s'ils ont un accès sudo ).

  1. Connectez-vous à MySQL root shell:

    $ sudo mysql -u root -p
    
  2. Exécuter les requêtes ci-dessous:

    use mysql;
    update user set plugin='mysql_native_password' where user='root';
    flush privileges; 
    quit;
    
  3. Ouvrez un nouveau shell, puis:

    $ mysql -u root -p
    

La source

Gayan Weerakutti
la source
Quand j'ai fait cela, je ne pouvais plus utiliser sudo mysql en tant que root. Je devais d'abord su et ensuite me connecter à mysql en tant que root. Alors je l'ai changé pour revenir à auth_socket.
Jusqu'au
Commande unique:mysql -u root -p -e "use mysql;update user set plugin='mysql_native_password' where user='root';flush privileges;"
Chris Stryczynski
Si vous voulez perdre l’accès à votre instance MySQL, cette réponse est simple.
Danila Vershinin
2

Essayez de créer un nouveau compte mysql, cela a fonctionné pour moi (mysql 5.7.12):

  1. Connectez-vous en tant que sudo:

    sudo mysql -uroot
    
  2. Créez un nouvel utilisateur et accordez-lui des privilèges (pas de mot de passe):

    CREATE USER 'admin'@'localhost' IDENTIFIED BY '';
    GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost';
    
  3. Se connecter en tant que nouvel utilisateur:

    mysql -uadmin
    
Alex Yakovlev
la source
2

Je devais faire deux choses (grâce à @Todor et @Loremhipsum):

update mysql.user set plugin = 'mysql_native_password' where User='root';
grant all privileges on *.* to 'root'@'localhost';

puis:

FLUSH PRIVILEGES;

Je ne recommanderais pas d'abandonner l'utilisateur root.

Franc Drobnič
la source
1

Essayez d'abord ce code,

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

puis,

killall mysqld
mysqld_safe --init-file=$PWD/your_init_file.sql

puis appuyez sur Ctrl+Zet tapez: bgpour exécuter le processus du premier plan à l'arrière-plan, puis vérifiez votre accès par:

mysql -u root -proot
mysql> show grants;
ADHITHYA SRINIVASAN
la source
1

Si vous n'exécutez que la commande mysql sous l'utilisateur root, l'accès vous sera accordé sans mot de passe, car l'authentification de socket est activée pour root @ localhost. .

Le seul moyen de définir un mot de passe consiste à basculer vers une authentification native, comme suit:

$ sudo mysql

mysql> ALTER USER 'racine' @ 'localhost' IDENTIFIÉ AVEC mysql_native_password BY 'test';

Vadiaz
la source
0

J'ai adapté certains scripts de provisionnement que j'ai créés pour utiliser MariaDB et j'ai rencontré ce problème précis. Rassembler beaucoup d’informations ici une réponse de Gazzer est vraiment nulle dans le numéro; tout se résume au paramètre auth_socket/ unix_socket.

Ainsi, lorsque vous utilisez MariaDB 5.5 (sous Ubuntu 14.04) et MariaDB 10 sous (Ubuntu 16.04), vous connecter à MySQL et exécuter cette commande a tout effacé:

UPDATE mysql.user SET plugin='' WHERE User='root';
FLUSH PRIVILEGES;

Les autres réponses, y compris la réponse la plus votée à ce poste par Loremhipsum, encouragent réellement les mauvaises pratiques en recommandant de supprimer un utilisateur, puis de le recréer. Pour moi, c'est une solution assez radicale. La solution la meilleure / la plus simple consiste à annuler la pluginvaleur, à supprimer les privilèges et à poursuivre la vie.

JakeGould
la source
-1

J'ai eu le même problème et le fonctionnement suivant l'a résolu:

mysql_upgrade --force
klob
la source
Malheureusement, cela n'a pas fonctionné. Je réinstalle Ubuntu.
codescope
1
Je viens de faire une nouvelle installation d'ubuntu 16.04 et d'installer mariad-server. Après l'installation, j'ai lancé mysql_secure_installation et défini un mot de passe. Après avoir parcouru les étapes restantes de mysql_secure_installation, je l'ai réexécuté et il semble que les modifications ne sont pas enregistrées. Je n'arrive toujours pas à me connecter à partir de mon compte d'utilisateur normal. Serait-ce un bug?
codescope
Cela ne va jamais aider. Le problème n’a rien à voir avec l’installation réelle du binaire MariaDB mais plutôt avec l’utilisateur qui rootest défini avec des pluginparamètres non standard. Le seul cas où une mise à niveau de la base de données pourrait être utile dans un cas comme celui-ci est si le mysql_upgradeprocessus lui-même tient compte du pluginparamètre dont je doute.
JakeGould