web-dev-qa-db-fra.com

L'accès MySQL a refusé une erreur lors de la connexion via SSH Tunnel

Pendant des mois, je me connecte à l'instance MySQL en cours d'exécution sur notre serveur de test local via un tunnel SSH sans aucun problème. Tout à coup, sans changement, sans changement, 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 de votre emplacement actuel est autorisé.

MySQL a déclaré: Accès refusé pour l'utilisateur 'root' @ 'localhost' (Utilisation du mot de passe: Oui)

Je suis capable de vous connecter du terminal lorsqu'il est connecté directement au serveur via SSH, mais pas via un tunnel SSH. Le problème n'est pas spécifique à la suite de SEQUEL PRO ou Juste moi-même, je reçois la même erreur lors de la connexion via MySQL Workbench, tout comme les autres au bureau. J'ai réinitialisé le mot de passe avec mysqladmin juste pour l'amour de la santé mentale, ce n'est certainement pas le problème.

Lorsque j'ai commencé à examiner, j'ai remarqué que l'erreur rapportait le serveur comme "localhost", au lieu de "127.0.0.1" que j'ai entré dans Suite Pro. Un ami a suggéré que ce soit probablement juste une mauvaise manipulation des erreurs, mais il semble étrange compte tenu de la différence significative entre Localhost et 127.0.0.1 dans MySQL.

Pour tenter de contourner le problème de tunneling, j'ai accédé à racine @%, de sorte que je puisse me connecter directement. Cela fonctionne pour la plupart, je peux voir les données de la table, créer de nouvelles bases de données, etc. Le seul problème est lorsque je viendrai créer des utilisateurs, je reçois l'erreur:

Accès refusé pour l'utilisateur 'root' @ '%' (Utilisation du mot de passe: Oui)

Curieusement, l'utilisateur est en fait créé, je pense que c'est juste un problème avec la subvention. Encore une fois, du terminal, je peux faire n'importe quoi lorsqu'il est connecté en tant que root.

Quelqu'un peut-il aider à éclairer pourquoi les connexions de tunnel et les commandes de subvention (probablement) reçoivent l'erreur refusée?

Pour référence, MySQ est la version 5.6.16 avec la plupart des paramètres par défaut, installés via Homebrew sur une machine de serveur Mac OS X.

Mise à jour

Voici la liste des hôtes que racine est actuellement accordée sur:

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 rangée ("%") devrait vraiment rendre les autres redondants?

Mise à jour 2

Correction de la question de subvention; L'utilisateur root @% n'a pas été accordé à tous les privilèges avec l'extra with grant option À la fin, cela pourrait donc tout faire, mais accorder. J'aimerais toujours savoir pourquoi les tunnels SSH sont refusés cependant.

12
Adam

Dans MySQL, le mot-clé localhost est réservé à la connexion à l'aide de la prise MySQL et vous devez utiliser l'adresse IP 127.0.0.1 pour TCP Connexions au port réseau MySQL sur 127.0.0.1. Cela signifie que le serveur doit accorder des privilèges aux utilisateurs de manière spécifique 127.0.0.1, et le client doit utiliser -h 127.0.0.1 Pour traverser le tunnel au lieu de vous connecter à une prise locale.

Pour vous permettre d'accéder à l'aide du transfert de port SSH dont vous avez besoin de quelque chose comme:

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

puis courir

FLUSH PRIVILEGES;

et éventuellement

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 inverse se traduit par localhost Faire du débogage difficile.

Comme le manuel le décrit:

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

Shell> mysql --Host=127.0.0.1
Shell> mysql --protocol=TCP

Les --protocol Option vous permet d'établir un type de connexion particulier même lorsque les autres options seraient normalement par défaut à un autre protocole.

18
HBruijn

J'ai vu dans le passé avec des tunels SSH, qu'il existe une différence entre accorder tout à "localhost" et accorder à tous "127.0.0.1" alors essayez de subvention à "127.0.0.1 à la place ou en plus de votre subvention" locale ".

1
Sverre

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

sSH -CC Blowfish -NF -VV -L3306: localhost: 3306 Sshuser @ Domaine

Puis connectez-vous avec une suite à 127.0.0.1:3306 Pouvez-vous vous connecter? Quelque chose apparaît-il sur votre terminal (ou des journaux client SSH)?

0
Florian Bidabe