Acceso de MySQL denegado error al conectarse a través del túnel SSH

12

Durante meses, me he conectado a la instancia de MySQL que se ejecuta en nuestro servidor de prueba local a través de un túnel SSH sin ningún problema. Sin embargo, de repente, sin cambios en los que pueda pensar, el servidor ha comenzado a rechazar el intento de inicio de sesión de Sequel Pro con el error:

No se puede conectar al host 127.0.0.1 porque se denegó el acceso.

Vuelva a verificar su nombre de usuario y contraseña y asegúrese de permitir el acceso desde su ubicación actual.

MySQL dijo: Acceso denegado para el usuario 'root' @ 'localhost' (usando la contraseña: YES)

Puedo iniciar sesión desde la terminal cuando estoy conectado directamente al servidor a través de SSH, pero no a través de un túnel SSH. El problema no es específico para Sequel Pro o solo para mí, obtengo el mismo error al conectarme a través de MySQL Workbench que otros en la oficina. He restablecido la contraseña mysqladminsolo por el bien de la cordura, definitivamente ese no es el problema.

Cuando comencé a buscarlo más, noté que el error informaba que el servidor era "localhost", en lugar de "127.0.0.1", que ingresé en Sequel Pro. Un amigo sugirió que probablemente solo sea un mal manejo de errores, pero parece extraño dada la diferencia significativa entre localhost y 127.0.0.1 en MySQL.

En un intento por solucionar el problema de la tunelización, concedí acceso a root @%, para poder conectarme directamente. Esto funciona en su mayor parte, puedo ver los datos de la tabla, crear nuevas bases de datos, etc. El único problema es cuando vengo a crear usuarios y aparece el error:

Acceso denegado para el usuario 'root' @ '%' (utilizando contraseña: SÍ)

Curiosamente, el usuario está realmente creado, creo que es solo un problema con la concesión. Sin embargo, de nuevo desde el terminal puedo hacer cualquier cosa cuando inicie sesión como root.

¿Alguien puede ayudar a arrojar algo de luz sobre por qué las conexiones de túnel y (probablemente) los comandos de concesión reciben el error de acceso denegado?

Como referencia, MySQ es la versión 5.6.16 con la mayoría de las configuraciones predeterminadas, instaladas a través de Homebrew en un equipo con MAC OS X Server.

Actualizar

Aquí está la lista de hosts a los que actualmente se le otorga acceso 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)

Según tengo entendido, ¿la primera fila ("%") realmente debería hacer que las otras sean redundantes?

Actualización 2

Se corrigió el problema de la subvención; Al usuario root @% no se le han otorgado todos los privilegios con el extra with grant optional final, por lo que podría hacer todo menos otorgar. Sin embargo, aún me encantaría saber por qué se niegan los túneles SSH.

Adán
fuente
entonces, antes de crear la cuenta "%", creó "127.0.0.1" y "localhost" y ambos no funcionaron, ¿es correcto?
Sverre
localhost solo funciona si realmente está en el host correcto, por lo que en teoría solo 127.0.0.1 (la red equivalente a localhost) debería funcionar sobre un túnel ssh. en unix como OS al menos.
Sverre

Respuestas:

18

En MySQL, la localhostpalabra clave está reservada para la conexión mediante el socket MySQL y debe utilizar la dirección IP 127.0.0.1para las conexiones TCP al puerto de red MySQL en 127.0.0.1. Esto significa que tanto el servidor debe otorgar privilegios a los usuarios específicamente 127.0.0.1, como el cliente debe utilizarlo -h 127.0.0.1para atravesar el túnel en lugar de conectarse a un socket local.

Para permitirle el acceso mediante el reenvío de puertos SSH, necesita algo como:

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

y luego correr

FLUSH PRIVILEGES;

y posiblemente

FLUSH QUERY CACHE;

Si aún no funciona, reinicie el proceso del servidor.

En los mensajes de error 127.0.0.1 después de una búsqueda inversa de DNS se traduce para localhostdificultar la depuración.

Como el describe manual :

En Unix, los programas MySQL tratan el nombre de host localhost especialmente, de una manera que probablemente sea diferente de lo que espera en comparación con otros programas basados ​​en la red. Para las conexiones a localhost, los programas MySQL intentan conectarse al servidor local utilizando un archivo de socket Unix. Esto ocurre incluso si se da una opción - -portu -Ppara especificar un número de puerto. Para garantizar que el cliente realice una conexión TCP / IP al servidor local, use --hosto -hpara especificar un valor de nombre de host 127.0.0.1o la dirección IP o el nombre del servidor local. También puede especificar el protocolo de conexión explícitamente, incluso para localhost, utilizando la --protocol=TCPopción Por ejemplo:

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

La --protocolopción le permite establecer un tipo particular de conexión, incluso cuando las otras opciones normalmente serían predeterminadas a otro protocolo.

HBruijn
fuente
2
Ah! Eso explica por qué veo localhost en el mensaje de error cuando esperaba ver 127.0.0.1. Sin embargo, al usuario root se le han otorgado todos los privilegios @ 127.0.0.1, pero todavía obtengo el error de acceso denegado cuando me conecto a través de un túnel SSH. La declaración exacta que ejecuté es:grant all on *.* to 'root'@'127.0.0.1' with grant option;
Adam
Estoy teniendo este problema, y ​​está claro que de hecho es el problema de host vs socket. Cuando ssh -h 127.0.0.1 -u root -pescribo de forma remota en el servidor, la conexión también se rechaza.
fuzzyTew
Resolví las -h 127.0.0.1conexiones que fallaban en el servidor reiniciando mysql, pero el zócalo ssh aún no funciona
fuzzyTew
Aquí vamos. 1. El servidor debe otorgar a @ 127.0.0.1. Esto no me llevó hasta que reinicié el servidor. 2. La conexión local debe ser 127.0.0.1, no localhost, para que el túnel se use en lugar de un socket local.
fuzzyTew
1

He visto en el pasado con ssh tunels, que hay una diferencia entre Otorgar todo a "localhost" y otorgar todo a "127.0.0.1", así que intente otorgar a "127.0.0.1 en su lugar o además de su concesión" localhost ".

Sverre
fuente
o al contrario, en su caso parece
Sverre
Gracias, he actualizado la pregunta para incluir una lista de hosts en los que se otorga la raíz. Me pareció extraño que a pesar de ingresar "127.0.0.1" como el servidor MySQL en Sequel Pro, el error de MySQL lo informaba como "localhost". Sin embargo, no creo que este sea el problema.
Adam
¿tienes contraseñas en todos los diferentes usuarios? también cuando te conectas a mysql a través del túnel, ¿cuál es la sintaxis real que usas?
Sverre
¿Hay alguna restricción para el usuario Root en su configuración de MySQL?
Sverre
Simplemente vuelva a ejecutar las grantdeclaraciones con identified by ..para asegurarse de que todas las contraseñas raíz sean iguales, pero no es un placer.
Adam
0

En lugar de usar la Sequel para crear el túnel, ¿qué es lo que creas tú mismo?

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

Luego conéctate con Sequel a 127.0.0.1:3306 ¿Puedes conectarte? ¿Aparece algo en su terminal (o en los registros del cliente ssh)?

Florian Bidabe
fuente