Fehler beim Ablehnen des MySQL-Zugriffs beim Herstellen einer Verbindung über einen SSH-Tunnel

12

Seit Monaten verbinde ich mich ohne Probleme über einen SSH-Tunnel mit der MySQL-Instanz, die auf unserem lokalen Testserver ausgeführt wird. Auf einmal hat der Server den Anmeldeversuch von Sequel Pro mit dem folgenden Fehler abgelehnt:

Verbindung zum Host 127.0.0.1 konnte nicht hergestellt werden, da der Zugriff verweigert wurde.

Überprüfen Sie Ihren Benutzernamen und Ihr Passwort und stellen Sie sicher, dass der Zugriff von Ihrem aktuellen Standort aus gestattet ist.

MySQL sagte: Zugriff verweigert für Benutzer 'root' @ 'localhost' (mit Passwort: JA)

Ich kann mich vom Terminal aus anmelden, wenn ich über SSH direkt mit dem Server verbunden bin, nur nicht über einen SSH-Tunnel. Das Problem ist nicht spezifisch für Sequel Pro oder nur für mich selbst. Beim Herstellen einer Verbindung über MySQL Workbench tritt derselbe Fehler auf wie bei anderen Benutzern im Büro. Ich habe das Passwort mysqladminnur aus Gründen der Vernunft zurückgesetzt, das ist definitiv nicht das Problem.

Als ich mich genauer damit beschäftigte, bemerkte ich, dass der Fehler den Server als "localhost" statt als "127.0.0.1" meldete, den ich in Sequel Pro eingegeben hatte. Ein Freund schlug vor, dass dies wahrscheinlich nur eine schlechte Fehlerbehandlung ist, aber es erscheint seltsam angesichts des signifikanten Unterschieds zwischen localhost und 127.0.0.1 in MySQL.

In einem Versuch, das Tunneling-Problem zu umgehen, habe ich den Zugriff auf root @% gewährt, damit ich eine direkte Verbindung herstellen kann. Dies funktioniert größtenteils, ich kann Tabellendaten anzeigen, neue Datenbanken erstellen usw. Das einzige Problem ist, wenn ich Benutzer erstelle, bekomme ich den Fehler:

Zugriff für Benutzer 'root' @ '%' verweigert (mit Passwort: JA)

Seltsamerweise wird der Benutzer tatsächlich erstellt, ich denke, es ist nur ein Problem mit der Gewährung. Auch hier kann ich vom Terminal aus alles tun, wenn ich als root angemeldet bin.

Kann jemand Aufschluss darüber geben, warum Tunnelverbindungen und (wahrscheinlich) Gewährungsbefehle den Fehler "Zugriff verweigert" erhalten?

Als Referenz dient MySQ Version 5.6.16 mit den meisten Standardeinstellungen, die über Homebrew auf einem MAC OS X Server-Computer installiert werden.

Aktualisieren

Hier ist die Liste der Hosts, auf die root derzeit Zugriff hat:

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)

Wie ich es verstehe, sollte die erste Zeile ("%") die anderen wirklich überflüssig machen?

Update 2

Das Grant-Problem wurde behoben. Dem Benutzer "root @%" wurden with grant optionam Ende nicht alle Berechtigungen mit dem Zusatz "extra" erteilt . Würde trotzdem gerne wissen, warum SSH-Tunnel verweigert werden.

Adam
quelle
Also, bevor Sie das Konto "%" erstellt haben, haben Sie "127.0.0.1" und "localhost" erstellt, und beide haben nicht funktioniert. Ist das richtig?
Sverre
localhost funktioniert nur, wenn Sie sich tatsächlich auf dem richtigen Host befinden. Theoretisch sollte also nur 127.0.0.1 (das Netzwerk, das localhost entspricht) über einen SSH-Tunnel funktionieren. zumindest in Unix-ähnlichen Betriebssystemen.
Sverre

Antworten:

18

In MySQL ist das localhostSchlüsselwort für die Verbindung über den MySQL-Socket reserviert und Sie sollten die IP-Adresse 127.0.0.1für TCP-Verbindungen zum MySQL-Netzwerkport auf 127.0.0.1 verwenden. Dies bedeutet , dass sowohl der Server Berechtigungen für Benutzer von speziell gewähren muß 127.0.0.1, und der Kunde muss verwenden -h 127.0.0.1durch den Tunnel zu gehen , anstatt zu einer lokalen Steckdose zu verbinden.

Um den Zugriff über die SSH-Portweiterleitung zu ermöglichen, benötigen Sie Folgendes:

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

und dann rennen

FLUSH PRIVILEGES;

und möglicherweise

FLUSH QUERY CACHE;

Wenn es immer noch nicht funktioniert, starten Sie den Serverprozess neu.

In Fehlermeldungen 127.0.0.1 wird nach einem Reverse-DNS-Lookup localhostdas Debuggen erschwert.

Wie im Handbuch beschrieben:

Unter Unix behandeln MySQL-Programme den Hostnamen localhost speziell, und zwar auf eine Weise, die sich wahrscheinlich von den Erwartungen anderer netzwerkbasierter Programme unterscheidet. Bei Verbindungen zu localhost versuchen MySQL-Programme, über eine Unix-Socket-Datei eine Verbindung zum lokalen Server herzustellen. Dies tritt auch dann auf, wenn die Option - -portoder -Pzum Angeben einer Portnummer angegeben wird. Verwenden Sie --hostoder -h, um sicherzustellen, dass der Client eine TCP / IP-Verbindung zum lokalen Server herstellt, und geben Sie den Hostnamen 127.0.0.1oder die IP-Adresse oder den Namen des lokalen Servers an. Sie können das Verbindungsprotokoll auch für localhost mithilfe der --protocol=TCPOption explizit angeben . Beispielsweise:

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

Mit dieser --protocolOption können Sie einen bestimmten Verbindungstyp herstellen, auch wenn für die anderen Optionen normalerweise ein anderes Protokoll als Standard verwendet wird.

HBruijn
quelle
2
Ah! Das erklärt dann, warum ich localhost in der Fehlermeldung sehe, wenn ich 127.0.0.1 erwartet habe. Nichtsdestotrotz wurden dem Root-Benutzer alle Berechtigungen @ 127.0.0.1 gewährt, aber ich erhalte immer noch den Fehler "Zugriff verweigert", wenn ich eine Verbindung über einen SSH-Tunnel herstelle. Genaue Aussage, die ich lief, ist:grant all on *.* to 'root'@'127.0.0.1' with grant option;
Adam
Ich habe dieses Problem, und es ist klar, dass es sich in der Tat um das Host-gegen-Socket-Problem handelt. Wenn ich ssh -h 127.0.0.1 -u root -premote auf dem Server eingebe, wird die Verbindung ebenfalls abgelehnt.
FuzzyTew
Ich habe die -h 127.0.0.1fehlgeschlagenen Verbindungen auf dem Server durch einen Neustart von mysql behoben, aber der ssh-Socket funktioniert immer noch nicht
fuzzyTew
Auf geht's. 1. Server muss @ 127.0.0.1 gewähren. Dies dauerte nicht lange, bis ich den Server neu startete. 2. Die lokale Verbindung muss zu 127.0.0.1 und nicht zu localhost bestehen, damit der Tunnel anstelle eines lokalen Sockets verwendet wird.
FuzzyTew
1

Ich habe in der Vergangenheit mit ssh tunels gesehen, dass es einen Unterschied gibt zwischen Grant all to "localhost" und grant all to "127.0.0.1". Versuchen Sie also, Grant to "127.0.0.1" stattdessen oder zusätzlich zu Ihrem "localhost" -Stipendium zu erteilen.

Sverre
quelle
oder umgekehrt, in Ihrem Fall sieht es aus wie
Sverre
Danke, ich habe die Frage so aktualisiert, dass sie eine Liste der Hosts enthält, auf denen root berechtigt ist. Ich fand es seltsam, dass der MySQL-Fehler trotz der Eingabe von "127.0.0.1" als MySQL-Server in Sequel Pro "localhost" meldete. Ich denke jedoch nicht, dass dies das Problem ist.
Adam
Haben Sie Passwörter für die verschiedenen Benutzer? Welche Syntax verwenden Sie eigentlich, wenn Sie sich über den Tunnel mit MySQL verbinden?
Sverre
Gibt es Einschränkungen für den Root-Benutzer in Ihrem MySQL-Setup?
Sverre
Führen Sie einfach die grantAnweisungen mit erneut aus, identified by ..um sicherzustellen, dass alle Root-Passwörter gleich sind, aber keine Freude bereitet.
Adam
0

Anstatt die Fortsetzung zum Erstellen des Tunnels zu verwenden, was erstellen Sie den Tunnel selbst?

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

Stellen Sie dann eine Verbindung mit Sequel zu 127.0.0.1:3306 her. Können Sie eine Verbindung herstellen? Erscheint etwas auf Ihrem Terminal (oder in den ssh-Client-Protokollen)?

Florian Bidabe
quelle