MySQL permet d'authentifier les utilisateurs de différentes manières. Ces méthodes sont appelées "plugins d'authentification" et chaque utilisateur peut spécifier son propre plugin. Pour savoir quel plugin est attribué à un utilisateur, vous pouvez utiliser la commande plugin
dans le mysql.user
table. Sur les systèmes Ubuntu (et éventuellement d'autres systèmes Linux), les paramètres par défaut d'une nouvelle installation de MySQL donnent à la table MySQL root
utilisent un plugin différent de celui des utilisateurs standard, ce qui explique l'écart que vous avez remarqué.
Plus précisément, le logiciel MySQL root
l'utilisateur est affecté auth_socket
par défaut, tandis que les utilisateurs standard se voient attribuer l'une ou l'autre des options suivantes mysql_native_password
(avant MySQL 8) ou caching_sha2_password
(MySQL 8+). En d'autres termes, vous verriez quelque chose comme
# Prior to MySQL 8
mysql> USE mysql;
mysql> SELECT plugin FROM mysql.user WHERE user='root';
+-------------+
| plugin |
+-------------+
| auth_socket |
+-------------+
mysql> SELECT plugin FROM mysql.user WHERE user='basic_db_user';
+-----------------------+
| plugin |
+-----------------------+
| mysql_native_password |
+-----------------------+
ou
# MySQL 8 and above
mysql> USE mysql;
mysql> SELECT plugin FROM mysql.user WHERE user='root';
+-------------+
| plugin |
+-------------+
| auth_socket |
+-------------+
mysql> SELECT plugin FROM mysql.user WHERE user='basic_db_user';
+-----------------------+
| plugin |
+-----------------------+
| caching_sha2_password |
+-----------------------+
auth_socket
es authentification des sockets qui fonctionne en faisant correspondre l'utilisateur Unix qui se connecte à l'utilisateur MySQL du même nom, s'il y en a un. Cette méthode seulement fonctionne lors d'une connexion locale, ce qui est l'une des raisons pour lesquelles il convient aux utilisateurs privilégiés de MySQL root
l'utilisateur ; dans le cadre de la auth_socket
il n'est pas possible pour quelqu'un d'accéder à votre base de données en tant que son root
à distance (à moins qu'il ne dispose également d'un système d'exploitation de niveau root
Dans ce cas, ils possèdent déjà votre machine de toute façon).
Les deux mysql_native_password
y caching_sha2_password
sont des formes de authentification par mot de passe . Pour comprendre la différence entre l'accès à MySQL en tant que son root
et en tant qu'utilisateur standard, nous comparerons le processus de connexion entre l'authentification par mot de passe et l'authentification par socket.
Authentification par mot de passe
Supposons que vous essayiez d'accéder à un serveur MySQL local à l'aide de la commande généralement recommandée. L'utilisateur de votre système d'exploitation Unix/Linux est joeuser
et vous voulez vous connecter au serveur MySQL en tant qu'utilisateur MySQL joesql
. Vous tapez
joeuser@localhost:~$ mysql -u joesql -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
...
La connexion est réussie. Ce qui s'est passé ici, c'est que le mysql
(utiliser $ which mysql
pour le trouver sur votre système) est invoqué avec les arguments de la ligne de commande -u, joesql, -p
. MySQL comprend alors que vous essayez de vous connecter en tant qu'utilisateur MySQL joesql
. Il vérifie les plugin
valeur de mysql.user
pour joesql
et trouve, disons, caching_sha2_password
. Il sait donc que vous avez besoin d'un mot de passe pour vous connecter. À partir de l'écran -p
il sait que vous voulez qu'il vous demande de saisir votre mot de passe, et il le fait. Vous entrez votre mot de passe, MySQL l'analyse et le compare à ce qu'il a stocké comme mot de passe pour joesql
. Il correspond, vous êtes donc autorisé à vous connecter en tant qu'utilisateur MySQL joesql
.
Authentification des sockets
Vous souhaitez maintenant accéder au serveur MySQL local en tant que serveur MySQL root
l'utilisateur. Si vous tentez naïvement d'utiliser la même commande que pour l'utilisateur standard joesql
Vous vous heurtez alors au problème que vous avez signalé :
joeuser@localhost:~$ mysql -u root -p
Enter password:
ERROR 1698 (28000): Access denied for user 'root'@'localhost'
Cela se produit même si vous avez défini un mot de passe pour le serveur MySQL root
et le saisir lorsqu'on vous le demande. Que s'est-il passé ? Comme précédemment, vous avez invoqué la fonction mysql
avec des arguments de ligne de commande -u, root, -p
qui indique à MySQL que vous souhaitez vous connecter en tant que MySQL root
l'utilisateur. Cependant, lorsqu'il vérifie le plugin
valeur de mysql.user
pour root
Il constate que auth_socket
au lieu d'une des valeurs d'authentification par mot de passe.
Ainsi, au lieu de demander un mot de passe, il vérifie un fichier de socket spécifié que votre système Unix/Linux a écrit expressément à cette fin, et qui comprend le nom de l'utilisateur du système d'exploitation que vous représentez. Au lieu de faire correspondre les mots de passe, auth_socket
correspond aux noms d'utilisateur. Ainsi, en notant que le nom d'utilisateur du système d'exploitation que vous utilisez, joeuser
n'est pas égal au nom d'utilisateur MySQL auquel vous essayez de vous connecter, root
il interdit la connexion en affichant un message d'erreur tout à fait inutile Access denied for user 'root'@'localhost'
.
Alors, irrité, vous faites le geste standard de Linux en ajoutant 'sudo' pour faire ce que vous voulez :
joeuser@localhost:~$ sudo mysql -u root -p
[sudo] password for joeuser:
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
...
Cela fonctionne. Pourquoi cela a-t-il fonctionné ? Lorsque le shell interprète votre commande, la première chose qu'il constate est que vous utilisez la commande sudo
pour jouer le rôle de l'interface Unix root
utilisateur, il vous demande donc votre sudo
mot de passe. Une fois le mot de passe donné, le reste de la commande est exécuté en tant qu'utilisateur. Ainsi, le fichier socket créé lors de la connexion au serveur MySQL est identifié par le mot de passe Unix root
, pas joeuser
et l'authentification par socket de MySQL correspond à l'utilisateur MySQL du même nom. L'authentification est transmise à ce stade, mais vous avez expressément demandé à ce que votre mot de passe vous soit demandé dans le cadre de l'enquête. -p
MySQL s'exécute donc consciencieusement en demandant l'option MySQL root
le mot de passe de l'utilisateur. Après l'avoir saisi, vous êtes connecté avec succès au serveur MySQL local.
Une fois que l'on a compris cela, une question s'impose : si l'authentification de la socket est basée sur la correspondance des noms d'utilisateur (nom d'utilisateur Unix à nom d'utilisateur MySQL), le mot de passe est-il même nécessaire ? Ce n'est pas le cas ! Vous pouvez omettre le mot de passe -p
et faites ceci :
joeuser@localhost:~$ sudo mysql -u root
[sudo] password for joeuser:
Welcome to the MySQL monitor. Commands end with ; or \g.
...
et ne saisissez pas votre code MySQL root
mot de passe. Cela fonctionne seulement pour le serveur MySQL root
et seulement si cet utilisateur est configuré pour utiliser la fonction auth_socket
comme plugin d'authentification.
Résumé
Dans les versions récentes d'Ubuntu (au moins 16.04-20.04, probablement d'autres), voici les commandes qui permettent de se connecter facilement au serveur MySQL. mysql
coquille :
-
MySQL root
l'utilisateur : $ sudo mysql -u root
(entrez votre mot de passe sudo)
-
Autre utilisateur de MySQL : $ mysql -u <username> -p
(entrez le mot de passe MySQL de <nom d'utilisateur>)
Bien sûr, vous avez posé une question sur Debian Linux, pas sur Ubuntu. Ubuntu est directement dérivé de Debian, et je suppose qu'il est similaire à ce que j'ai dit ici. Les commentaires sur la façon dont l'explication ci-dessus varie selon les différentes distributions et versions de Linux sont les bienvenus.