Errore di accesso a MySQL negato durante la connessione tramite tunnel SSH


12

Per mesi mi sono connesso all'istanza di MySQL in esecuzione sul nostro server di test locale attraverso un tunnel SSH senza problemi. All'improvviso, però, senza modifiche che mi vengono in mente, il server ha iniziato a rifiutare il tentativo di accesso da Sequel Pro con l'errore:

Impossibile connettersi all'host 127.0.0.1 perché l'accesso è stato negato.

Controlla nuovamente il nome utente e la password e assicurati che l'accesso dalla tua posizione corrente sia consentito.

MySQL ha dichiarato: Accesso negato per l'utente 'root' @ 'localhost' (usando la password: SÌ)

Sono in grado di accedere dal terminale quando connesso direttamente al server tramite SSH, non solo attraverso un tunnel SSH. Il problema non è specifico di Sequel Pro o solo a me stesso, quando si connette tramite MySQL Workbench ottengo lo stesso errore degli altri in ufficio. Ho reimpostato la password mysqladminsolo per ragioni di sanità mentale, questo non è sicuramente il problema.

Quando ho iniziato a esaminarlo di più, ho notato che l'errore stava segnalando il server come "localhost", anziché "127.0.0.1", che ho inserito in Sequel Pro. Un amico ha suggerito che probabilmente è solo una cattiva gestione degli errori, ma sembra strano data la differenza significativa tra localhost e 127.0.0.1 in MySQL.

Nel tentativo di aggirare il problema del tunneling, ho concesso l'accesso a root @%, in modo da poter connettermi direttamente. Questo funziona per la maggior parte, posso visualizzare i dati della tabella, creare nuovi database, ecc. L'unico problema è quando vengo a creare utenti ottengo l'errore:

Accesso negato per l'utente 'root' @ '%' (utilizzando la password: SÌ)

Stranamente l'utente viene effettivamente creato, penso che sia solo un problema con la concessione. Ancora una volta, però, dal terminale posso fare qualsiasi cosa accedendo come root.

Qualcuno può aiutare a far luce sul perché le connessioni del tunnel e (probabilmente) i comandi di concessione ricevono l'errore di accesso negato?

Per riferimento MySQ è la versione 5.6.16 con principalmente le impostazioni predefinite, installata tramite Homebrew su una macchina MAC OS X Server.

Aggiornare

Ecco l'elenco degli host su cui è attualmente concesso l'accesso a root:

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)

A quanto ho capito, la prima riga ("%") dovrebbe davvero rendere le altre ridondanti?

Aggiornamento 2

Risolto il problema di concessione; l'utente root @% non ha ottenuto tutti i privilegi con l'aggiunta with grant optionalla fine, quindi potrebbe fare tutto tranne che concedere. Mi piacerebbe comunque sapere perché i tunnel SSH vengono negati.


quindi, prima di creare l'account "%", hai creato "127.0.0.1" e "localhost" ed entrambi non hanno funzionato, è corretto?
Sverre,

localhost funziona solo se in realtà sei sull'host giusto, quindi in teoria solo 127.0.0.1 (la rete equivalente a localhost) dovrebbe funzionare su un tunnel ssh. almeno in unix come i sistemi operativi.
Sverre,

Risposte:


18

In MySQL, la localhostparola chiave è riservata per la connessione tramite il socket MySQL e si dovrebbe usare l'indirizzo IP 127.0.0.1per le connessioni TCP alla porta di rete MySQL su 127.0.0.1. Ciò significa che sia il server deve concedere privilegi per gli utenti da specifico 127.0.0.1, e il client deve utilizzare -h 127.0.0.1per passare attraverso il tunnel invece di collegare ad una presa locale.

Per consentirti l'accesso utilizzando il port forwarding SSH hai bisogno di qualcosa come:

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

e poi corri

FLUSH PRIVILEGES;

e possibilmente

FLUSH QUERY CACHE;

Se il problema persiste, riavviare il processo del server.

Nei messaggi di errore 127.0.0.1 dopo una ricerca DNS inversa viene tradotto per localhostrendere difficile il debug.

Come descrive il manuale :

Su Unix, i programmi MySQL trattano il nome host localhost in modo speciale, in un modo probabilmente diverso da quello che ti aspetti rispetto ad altri programmi basati su rete. Per le connessioni a localhost, i programmi MySQL tentano di connettersi al server locale utilizzando un file socket Unix. Ciò si verifica anche se viene fornita un'opzione - -porto -Pper specificare un numero di porta. Per assicurarsi che il client stabilisca una connessione TCP / IP al server locale, utilizzare --hosto -hper specificare un valore del nome host 127.0.0.1o l'indirizzo IP o il nome del server locale. È inoltre possibile specificare esplicitamente il protocollo di connessione, anche per localhost, utilizzando l' --protocol=TCPopzione Per esempio:

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

L' --protocolopzione consente di stabilire un particolare tipo di connessione anche quando le altre opzioni normalmente passerebbero a un altro protocollo.


2
Ah! Questo spiega perché vedo localhost nel messaggio di errore quando mi aspettavo di vedere 127.0.0.1. Nondimeno, all'utente root sono stati concessi tutti i privilegi @ 127.0.0.1, ma ottengo ancora l'errore di accesso negato durante la connessione attraverso un tunnel SSH. La dichiarazione esatta che ho eseguito è:grant all on *.* to 'root'@'127.0.0.1' with grant option;
Adam,

Sto riscontrando questo problema ed è chiaro che si tratta in effetti del problema host vs socket. Quando ssh -h 127.0.0.1 -u root -pdigito in remoto sul server, anche la connessione viene rifiutata.
fuzzy:

Ho risolto le -h 127.0.0.1connessioni non
riuscite

Eccoci qui. 1. Il server deve concedere a @ 127.0.0.1. Questo non ha funzionato per me fino a quando non ho riavviato il server. 2. La connessione locale deve essere 127.0.0.1 e non localhost, in modo che venga utilizzato il tunnel anziché un socket locale.
fuzzy:

1

Ho visto in passato con ssh tunel che esiste una differenza tra Concedi tutto a "localhost" e concedi tutto a "127.0.0.1", quindi prova a concedere a "127.0.0.1 invece o in aggiunta alla tua" localhost ".


o al contrario, nel tuo caso sembra
Sverre,

Grazie, ho aggiornato la domanda per includere un elenco di host su cui è concesso root. Ho trovato strano che nonostante abbia inserito "127.0.0.1" come server MySQL in Sequel Pro, l'errore MySQL lo ha segnalato come "localhost". Non penso che questo sia il problema.
Adam,

hai password per tutti i diversi utenti? anche quando ti connetti al mysql attraverso il tunnel, qual è la sintassi reale che usi?
Sverre,

ci sono restrizioni sull'utente root nella configurazione di mysql?
Sverre,

Riesegui le grantistruzioni con identified by ..per assicurarti che tutte le password di root siano uguali, ma senza gioia.
Adam,

0

Invece di usare il sequel per creare il tunnel, cosa crei tu stesso il tunnel?

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

Quindi connettiti con Sequel a 127.0.0.1:3306 Puoi connetterti? Sul tuo terminale (o sui registri client ssh) appare qualcosa?

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.