Erreur d'accès MySQL refusée lors de la connexion via le tunnel SSH

12

Depuis des mois, je me connecte à l'instance MySQL exécutée sur notre serveur de test local via un tunnel SSH sans aucun problème. Tout à coup, cependant, sans aucun changement auquel je peux penser, le serveur a commencé à rejeter la tentative de connexion de Sequel Pro avec l'erreur:

Impossible de se connecter à l'hôte 127.0.0.1 car l'accès a été refusé.

Vérifiez votre nom d'utilisateur et votre mot de passe et assurez-vous que l'accès à partir de votre emplacement actuel est autorisé.

MySQL a dit: Accès refusé pour l'utilisateur 'root' @ 'localhost' (en utilisant le mot de passe: OUI)

Je peux me connecter depuis le terminal lorsqu'il est connecté directement au serveur via SSH, mais pas via un tunnel SSH. Le problème n'est pas spécifique à Sequel Pro ou à moi-même non plus, j'obtiens la même erreur lors de la connexion via MySQL Workbench que les autres au bureau. J'ai réinitialisé le mot de passe avec mysqladminjuste pour la raison, ce n'est certainement pas le problème.

Quand j'ai commencé à approfondir mes recherches, j'ai remarqué que l'erreur signalait le serveur comme "localhost", au lieu de "127.0.0.1" que j'ai entré dans Sequel Pro. Un ami a suggéré que c'était probablement une mauvaise gestion des erreurs, mais cela semble étrange étant donné la différence significative entre localhost et 127.0.0.1 dans MySQL.

Pour contourner le problème de tunneling, j'ai accordé l'accès à root @%, afin de pouvoir me connecter directement. Cela fonctionne pour la plupart, je peux afficher les données de table, créer de nouvelles bases de données, etc. Le seul problème est que lorsque je viens de créer des utilisateurs, j'obtiens l'erreur:

Accès refusé pour l'utilisateur 'root' @ '%' (en utilisant le mot de passe: OUI)

Curieusement, l'utilisateur est réellement créé, je pense que c'est juste un problème de subvention. Encore une fois, depuis le terminal, je peux tout faire lorsque je suis connecté en tant que root.

Quelqu'un peut-il nous aider à comprendre pourquoi les connexions de tunnel et (probablement) les commandes d'accord reçoivent l'erreur d'accès refusé?

Pour référence, MySQ est la version 5.6.16 avec principalement les paramètres par défaut, installés via Homebrew sur une machine MAC OS X Server.

Mise à jour

Voici la liste des hôtes sur lesquels root est actuellement autorisé à accéder:

mysql> select host,user from mysql.user where user='root';
+----------------+------+
| host           | user |
+----------------+------+
| %              | root |
| 127.0.0.1      | root |
| ::1            | root |
| localhost      | root |
+----------------+------+
4 rows in set (0.00 sec)

Si je comprends bien, la première ligne ("%") devrait vraiment rendre les autres redondantes?

Update 2

Correction du problème de subvention; l'utilisateur root @% n'a pas reçu tous les privilèges avec le supplément with grant optionà la fin, il pourrait donc tout faire sauf accorder. J'aimerais toujours savoir pourquoi les tunnels SSH sont refusés.

Adam
la source
donc, avant de créer le compte "%", vous avez créé le "127.0.0.1" et le "localhost" et les deux n'ont pas fonctionné, est-ce exact?
Sverre
localhost ne fonctionne que si vous êtes réellement sur le bon hôte, donc en théorie, seul 127.0.0.1 (le réseau équivalent à localhost) devrait fonctionner sur un tunnel ssh. sous unix comme les OS au moins.
Sverre

Réponses:

18

Dans MySQL, le localhostmot-clé est réservé pour la connexion à l'aide du socket MySQL et vous devez utiliser l'adresse IP 127.0.0.1pour les connexions TCP au port réseau MySQL sur 127.0.0.1. Cela signifie que le serveur doit accorder des privilèges aux utilisateurs de particulier 127.0.0.1, et le client doit utiliser -h 127.0.0.1pour passer par le tunnel au lieu de se connecter à une prise locale.

Pour vous permettre d'accéder en utilisant la redirection de port SSH, vous avez besoin de quelque chose comme:

GRANT SELECT ON *.* TO user@`127.0.0.1`

puis exécutez

FLUSH PRIVILEGES;

et peut-être

FLUSH QUERY CACHE;

Si cela ne fonctionne toujours pas, redémarrez le processus serveur.

Dans les messages d'erreur 127.0.0.1 après une recherche DNS inversée, le localhostdébogage est difficile.

Comme le manuel le décrit:

Sous Unix, les programmes MySQL traitent spécialement le nom d'hôte localhost, d'une manière qui est probablement différente de ce que vous attendez par rapport aux autres programmes basés sur le réseau. Pour les connexions à localhost, les programmes MySQL tentent de se connecter au serveur local en utilisant un fichier socket Unix. Cela se produit même si une option - -portou -Pest donnée pour spécifier un numéro de port. Pour vous assurer que le client établit une connexion TCP / IP avec le serveur local, utilisez --hostou -hpour spécifier une valeur de nom d'hôte 127.0.0.1ou l'adresse IP ou le nom du serveur local. Vous pouvez également spécifier explicitement le protocole de connexion, même pour localhost, en utilisant l' --protocol=TCPoption. Par exemple:

shell> mysql --host=127.0.0.1
shell> mysql --protocol=TCP

L' --protocoloption vous permet d'établir un type particulier de connexion même lorsque les autres options seraient normalement par défaut sur un autre protocole.

HBruijn
la source
2
Ah! Cela explique ensuite pourquoi je vois localhost dans le message d'erreur alors que je m'attendais à voir 127.0.0.1. Néanmoins, l'utilisateur root a obtenu tous les privilèges @ 127.0.0.1, mais j'obtiens toujours l'erreur d'accès refusé lors de la connexion via un tunnel SSH. La déclaration exacte que j'ai courue est:grant all on *.* to 'root'@'127.0.0.1' with grant option;
Adam
J'ai ce problème, et il est clair que c'est bien le problème hôte vs socket. Lorsque je tape à ssh -h 127.0.0.1 -u root -pdistance sur le serveur, la connexion est également rejetée.
fuzzyTew
J'ai résolu les -h 127.0.0.1connexions défaillantes sur le serveur en redémarrant mysql, mais la socket ssh ne fonctionnera toujours pas
fuzzyTew
Et c'est parti. 1. Le serveur doit accorder à @ 127.0.0.1. Cela ne m'a pris que lorsque j'ai redémarré le serveur. 2. La connexion locale doit être à 127.0.0.1 et non à localhost, afin que le tunnel soit utilisé à la place d'un socket local.
fuzzyTew
1

J'ai vu dans le passé avec les tunnels ssh, qu'il y a une différence entre Grant all à "localhost" et grant all à "127.0.0.1" alors essayez d'accorder à "127.0.0.1 à la place ou en plus de votre" localhost ".

Sverre
la source
ou en face, dans votre cas, cela ressemble à
Sverre
Merci, j'ai mis à jour la question pour inclure une liste d'hôtes sur laquelle la racine est accordée. J'ai trouvé étrange qu'en dépit de la saisie de "127.0.0.1" comme serveur MySQL dans Sequel Pro, l'erreur MySQL le signalait comme "localhost". Je ne pense pas que ce soit le problème.
Adam
avez-vous des mots de passe sur tous les différents utilisateurs? également lorsque vous vous connectez à mysql via le tunnel, quelle est la syntaxe réelle que vous utilisez?
Sverre
y a-t-il des restrictions sur l'utilisateur root dans votre configuration mysql?
Sverre
Réexécutez simplement les grantinstructions avec identified by ..pour vous assurer que tous les mots de passe root sont les mêmes, mais pas de joie.
Adam
0

Au lieu d'utiliser la suite pour créer le tunnel, qu'est-ce que vous créez vous-même?

ssh -Cc blowfish -Nf -vv -L3306: localhost: 3306 sshuser @ domain

Connectez-vous ensuite avec Sequel au 127.0.0.1:3306 Pouvez-vous vous connecter? Quelque chose apparaît-il sur votre terminal (ou les journaux du client ssh)?

Florian Bidabe
la source